44static void dbusappsync_release_name (
void);
45static gboolean dbusappsync_obtain_name (
void);
46static DBusHandlerResult dbusappsync_msg_handler (DBusConnection *
const connection, DBusMessage *
const msg, gpointer
const user_data);
47static DBusHandlerResult dbusappsync_handle_disconnect (DBusConnection *conn, DBusMessage *msg,
void *user_data);
48static void dbusappsync_cleanup_connection(
void);
58static DBusConnection *dbus_connection_ses = NULL;
59static gboolean dbus_connection_name = FALSE;
60static gboolean dbus_connection_disc = FALSE;
66static void dbusappsync_release_name(
void)
71 if( dbus_connection_ses && dbus_connection_name )
73 DBusError error = DBUS_ERROR_INIT;
74 int ret = dbus_bus_release_name(dbus_connection_ses, USB_MODE_SERVICE, &error);
78 case DBUS_RELEASE_NAME_REPLY_RELEASED:
80 log_debug(
"released name: %s", USB_MODE_SERVICE);
82 case DBUS_RELEASE_NAME_REPLY_NON_EXISTENT:
84 log_debug(
"nonexisting name: %s", USB_MODE_SERVICE);
86 case DBUS_RELEASE_NAME_REPLY_NOT_OWNER:
87 log_warning(
"somebody else owns: %s", USB_MODE_SERVICE);
90 if( dbus_error_is_set(&error) )
92 log_debug(
"DBUS ERROR: %s, %s", error.name, error.message);
93 dbus_error_free(&error);
97 dbus_connection_name = FALSE;
100static gboolean dbusappsync_obtain_name(
void)
102 LOG_REGISTER_CONTEXT;
104 DBusError error = DBUS_ERROR_INIT;
108 if( dbus_connection_name )
113 if( dbus_connection_ses == 0 )
119 ret = dbus_bus_request_name(dbus_connection_ses, USB_MODE_SERVICE, DBUS_NAME_FLAG_DO_NOT_QUEUE , &error);
123 case DBUS_REQUEST_NAME_REPLY_PRIMARY_OWNER:
125 log_debug(
"primary owner of: %s", USB_MODE_SERVICE);
128 case DBUS_REQUEST_NAME_REPLY_ALREADY_OWNER:
130 log_warning(
"already owner of: %s", USB_MODE_SERVICE);
135 log_err(
"failed to claim: %s", USB_MODE_SERVICE);
139 dbus_connection_name = TRUE;
143 if( dbus_error_is_set(&error) )
145 log_debug(
"DBUS ERROR: %s, %s", error.name, error.message);
146 dbus_error_free(&error);
149 return dbus_connection_name;
156static DBusHandlerResult dbusappsync_msg_handler(DBusConnection *
const connection, DBusMessage *
const msg, gpointer
const user_data)
158 LOG_REGISTER_CONTEXT;
160 DBusHandlerResult status = DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
161 int type = dbus_message_get_type(msg);
162 const char *
interface = dbus_message_get_interface(msg);
163 const char *member = dbus_message_get_member(msg);
164 const char *
object = dbus_message_get_path(msg);
166 if(!interface || !member || !
object)
goto IGNORE;
168 if( type == DBUS_MESSAGE_TYPE_METHOD_CALL &&
169 !strcmp(interface, USB_MODE_INTERFACE) &&
170 !strcmp(
object, USB_MODE_OBJECT) )
173 DBusMessage *reply = 0;
175 status = DBUS_HANDLER_RESULT_HANDLED;
177 if(!strcmp(member, USB_MODE_APP_STATE))
180 DBusError err = DBUS_ERROR_INIT;
182 if(!dbus_message_get_args(msg, &err, DBUS_TYPE_STRING, &use, DBUS_TYPE_INVALID))
185 reply = dbus_message_new_error(msg, DBUS_ERROR_INVALID_ARGS, member);
190 reply = dbus_message_new_error(msg, DBUS_ERROR_INVALID_ARGS, member);
192 else if((reply = dbus_message_new_method_return(msg)))
195 dbus_message_append_args (reply, DBUS_TYPE_STRING, &use, DBUS_TYPE_INVALID);
197 dbus_error_free(&err);
202 reply = dbus_message_new_error(msg, DBUS_ERROR_UNKNOWN_METHOD, member);
205 if( !dbus_message_get_no_reply(msg) )
210 reply = dbus_message_new_error(msg, DBUS_ERROR_FAILED, member);
212 if( !reply || !dbus_connection_send(connection, reply, 0) )
214 log_debug(
"Failed sending reply. Out Of Memory!\n");
218 if( reply ) dbus_message_unref(reply);
229static DBusHandlerResult dbusappsync_handle_disconnect(DBusConnection *conn, DBusMessage *msg,
void *user_data)
231 LOG_REGISTER_CONTEXT;
233 if( dbus_message_is_signal(msg, DBUS_INTERFACE_LOCAL,
"Disconnected") )
235 log_warning(
"disconnected from session bus - expecting restart/stop soon\n");
236 dbus_connection_disc = TRUE;
237 dbusappsync_cleanup_connection();
239 return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
245static void dbusappsync_cleanup_connection(
void)
247 LOG_REGISTER_CONTEXT;
249 if( dbus_connection_ses != 0 )
252 dbus_connection_remove_filter(dbus_connection_ses, dbusappsync_msg_handler, 0);
253 dbus_connection_remove_filter(dbus_connection_ses, dbusappsync_handle_disconnect, 0);
256 if( !dbus_connection_disc )
258 dbusappsync_release_name();
261 dbus_connection_unref(dbus_connection_ses);
262 dbus_connection_ses = NULL;
265 log_debug(
"succesfully cleaned up appsync dbus\n");
273 LOG_REGISTER_CONTEXT;
275 gboolean result = FALSE;
276 DBusError error = DBUS_ERROR_INIT;
278 if( dbus_connection_ses != 0 )
284 if( dbus_connection_disc )
291 if ((dbus_connection_ses = dbus_bus_get(DBUS_BUS_SESSION, &error)) == NULL)
293 log_err(
"Failed to open connection to session message bus; %s\n", error.message);
298 dbus_connection_add_filter(dbus_connection_ses, dbusappsync_handle_disconnect, 0, 0);
301 dbus_connection_add_filter(dbus_connection_ses, dbusappsync_msg_handler, 0, 0);
304 dbus_connection_set_exit_on_disconnect(dbus_connection_ses, FALSE);
312 if( !dbusappsync_obtain_name() )
321 dbus_error_free(&error);
332 LOG_REGISTER_CONTEXT;
334 gboolean status = FALSE;
354 LOG_REGISTER_CONTEXT;
356 dbusappsync_cleanup_connection();
365 LOG_REGISTER_CONTEXT;
369 if( dbus_connection_ses == 0 )
371 log_err(
"could not start '%s': no session bus connection", launch);
375 DBusError error = DBUS_ERROR_INIT;
376 if( !dbus_bus_start_service_by_name(dbus_connection_ses, launch, 0, NULL, &error) )
378 log_err(
"could not start '%s': %s: %s", launch, error.name, error.message);
379 dbus_error_free(&error);
gboolean dbusappsync_init_connection(void)
void dbusappsync_cleanup(void)
gboolean dbusappsync_init(void)
int dbusappsync_launch_app(char *launch)
int appsync_mark_active(const char *name, int post)