dbusclient.cpp
1 /*
2  This file is part of KDE.
3 
4  Copyright (c) 2006 Cornelius Schumacher <schumacher@kde.org>
5 
6  This program is free software; you can redistribute it and/or modify
7  it under the terms of the GNU General Public License as published by
8  the Free Software Foundation; either version 2 of the License, or
9  (at your option) any later version.
10 
11  This program is distributed in the hope that it will be useful,
12  but WITHOUT ANY WARRANTY; without even the implied warranty of
13  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14  GNU General Public License for more details.
15 
16  You should have received a copy of the GNU General Public License
17  along with this program; if not, write to the Free Software
18  Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
19  USA.
20 */
21 
22 #include "dbusclient.h"
23 
24 #include <libqopensync/environment.h>
25 #include <libqopensync/group.h>
26 
27 #include <dbus/qdbuserror.h>
28 #include <dbus/qdbusconnection.h>
29 #include <dbus/qdbusmessage.h>
30 #include <dbus/qdbusproxy.h>
31 
32 #include <tqapplication.h>
33 #include <tqtimer.h>
34 
35 #include <iostream>
36 
37 OpenSyncService::OpenSyncService()
38  : mConnection( 0 )
39 {
40 }
41 
42 void OpenSyncService::setConnection( TQDBusConnection *connection )
43 {
44  mConnection = connection;
45  mConnection->registerObject( "/ABC", this );
46 }
47 
48 bool OpenSyncService::handleMethodCall( const TQDBusMessage &message )
49 {
50  tqDebug( "OpenSyncService::handleMethodCall()" );
51 
52  tqDebug( " Interface: %s", message.interface().latin1() );
53  tqDebug( " Path: %s", message.path().latin1() );
54  tqDebug( " Member: %s", message.member().latin1() );
55  tqDebug( " Sender: %s", message.sender().latin1() );
56 
57  if ( message.interface() != "org.opensync.SyncEngine" ) return false;
58 
59  TQDBusMessage reply;
60 
61  TQString function = message.member();
62  if ( function == "hello" ) {
63  reply = hello( message );
64  } else if ( function == "randomNumber" ) {
65  reply = randomNumber( message );
66  } else if ( function == "listGroups" ) {
67  reply = listGroups( message );
68  } else if ( function == "listPlugins" ) {
69  reply = listPlugins( message );
70  } else if ( function == "showGroup" ) {
71  reply = showGroup( message );
72  } else if ( function == "showMember" ) {
73  reply = showMember( message );
74  } else {
75  return false;
76  }
77 
78  mConnection->send( reply );
79 
80  return true;
81 }
82 
83 TQDBusMessage OpenSyncService::showMember( const TQDBusMessage &message )
84 {
85  if ( message.count() != 2 ) {
86  return error( message, "arg_count",
87  TQString("Wrong number of arguments. Expected 2, got %1.")
88  .arg( message.count() ) );
89  }
90 
91  TQString groupName = message[ 0 ].toString();
92  if ( groupName.isEmpty() ) {
93  return error( message, "missing_arg", "Missing argument: group name." );
94  }
95 
96  bool ok;
97  int memberId = message[ 1 ].toInt( &ok );
98  if ( !ok ) {
99  return error( message, "missing_arg", "Missing argument: member id." );
100  }
101 
102  TQDBusMessage reply;
103 
104  QSync::Environment env;
105  QSync::Result result = env.initialize();
106  if ( result.isError() ) {
107  return error( message, result.name(), result.message() );
108  } else {
109  reply = TQDBusMessage::methodReply( message );
110 
111  QSync::Group group = env.groupByName( groupName );
112  if ( !group.isValid() ) {
113  return error( message, "group_name", TQString("Unknown group '%1'.")
114  .arg( groupName ) );
115  }
116 
117  QSync::Member member = group.memberById( memberId );
118  if ( !member.isValid() ) {
119  return error( message, "member_id",
120  TQString("Unknown member id '%1' in group '%2'.").arg( groupName )
121  .arg( memberId ) );
122  }
123 
124  reply.append( memberId );
125  reply.append( member.pluginName() );
126 
127  env.finalize();
128  }
129 
130  return reply;
131 }
132 
133 
134 TQDBusMessage OpenSyncService::showGroup( const TQDBusMessage &message )
135 {
136  if ( message.count() != 1 ) {
137  return error( message, "arg_count",
138  TQString("Wrong number of arguments. Expected 1, got %1")
139  .arg( message.count() ) );
140  }
141 
142  TQString groupName = message[ 0 ].toString();
143  if ( groupName.isEmpty() ) {
144  return error( message, "missing_arg", "Missing argument group name." );
145  }
146 
147  TQDBusMessage reply;
148 
149  QSync::Environment env;
150  QSync::Result result = env.initialize();
151  if ( result.isError() ) {
152  return error( message, result.name(), result.message() );
153  } else {
154  reply = TQDBusMessage::methodReply( message );
155 
156  QSync::Group group = env.groupByName( groupName );
157  if ( !group.isValid() ) {
158  return error( message, "group_name", TQString("Unknown group '%1'")
159  .arg( groupName ) );
160  }
161 
162  QSync::Group::Iterator it( &group );
163  for( it = group.begin(); it != group.end(); ++it ) {
164  QSync::Member member = *it;
165  reply.append( TQVariant( member.id() ) );
166  }
167 
168  env.finalize();
169  }
170 
171  return reply;
172 }
173 
174 TQDBusMessage OpenSyncService::error( const TQDBusMessage &message,
175  const TQString &errorCode,
176  const TQString &errorMessage )
177 {
178  TQDBusError error( "org.opensync." + errorCode, errorMessage );
179  return TQDBusMessage::methodError( message, error );
180 }
181 
182 TQDBusMessage OpenSyncService::listPlugins( const TQDBusMessage &message )
183 {
184  TQDBusMessage reply;
185 
186  QSync::Environment env;
187  QSync::Result result = env.initialize();
188  if ( result.isError() ) {
189  TQDBusError error( result.name(), result.message() );
190  reply = TQDBusMessage::methodError( message, error );
191  } else {
192  reply = TQDBusMessage::methodReply( message );
193 
194  QSync::Environment::PluginIterator it( env.pluginBegin() );
195  for ( ; it != env.pluginEnd(); ++it ) {
196  reply.append( TQVariant( (*it).name() ) );
197  }
198 
199  env.finalize();
200  }
201 
202  return reply;
203 }
204 
205 TQDBusMessage OpenSyncService::listGroups( const TQDBusMessage &message )
206 {
207  TQDBusMessage reply;
208 
209  QSync::Environment env;
210  QSync::Result result = env.initialize();
211  if ( result.isError() ) {
212  TQDBusError error( result.name(), result.message() );
213  reply = TQDBusMessage::methodError( message, error );
214  } else {
215  reply = TQDBusMessage::methodReply( message );
216 
217  QSync::Environment::GroupIterator it( env.groupBegin() );
218  for ( ; it != env.groupEnd(); ++it ) {
219  reply.append( TQVariant( (*it).name() ) );
220  }
221 
222  env.finalize();
223  }
224 
225  return reply;
226 }
227 
228 TQDBusMessage OpenSyncService::hello( const TQDBusMessage &message )
229 {
230  TQDBusMessage reply = TQDBusMessage::methodReply( message );
231 
232 // TQDBusError error;
233 // reply = TQDBusMessage::methodError( message, error );
234 
235  reply.append( TQVariant( TQString( "Hello!" ) ) );
236 
237  return reply;
238 }
239 
240 TQDBusMessage OpenSyncService::randomNumber( const TQDBusMessage &message )
241 {
242  TQDBusMessage reply = TQDBusMessage::methodReply( message );
243 
244  int number = rand();
245 
246  reply.append( TQVariant( number ) );
247 
248  return reply;
249 }
250 
251 int main( int argc, char *argv[] )
252 {
253  TQApplication app(argc, argv);
254 
255  std::cout << "Hello" << std::endl;
256 
257  TQDBusConnection connection = TQDBusConnection::addConnection(
258  TQDBusConnection::SessionBus );
259 
260  if ( !connection.isConnected() ) {
261  tqFatal("Cannot connect to session bus");
262  }
263 
264  connection.requestName( "org.opensync.SyncEngine",
265  TQDBusConnection::NoReplace );
266 
267  OpenSyncService service;
268  service.setConnection( &connection );
269 
270  return app.exec();
271 }
272 
273 //#include "dbusclient.moc"