Skype Linux D-BUS sample code
Hi, below is Skype Linux D-BUS API receiving event without Qt/Glib.
This is a sample, so it poll event and not use select and wait.
enjoy!
-- #define DBUS_API_SUBJECT_TO_CHANGE #include <stdio.h> #include <string.h> #include <dbus/dbus.h> #include "mgw.h" #define DISPATCH_STATUS_NAME(s) \ ((s) == DBUS_DISPATCH_COMPLETE ? "complete" : \ (s) == DBUS_DISPATCH_DATA_REMAINS ? "data remains" : \ (s) == DBUS_DISPATCH_NEED_MEMORY ? "need memory" : \ "???") char *sendToSkype( DBusConnection *conn, char *msg); DBusWatch *g_watch = NULL; dbus_bool_t dbusAddWatchFunction( DBusWatch *watch, void *data ){ puts( "dbusAddWatchFunction" ); g_watch = watch; return TRUE; } void dbusRemoveWatchFunction( DBusWatch *watch, void *data ){ puts( "dbusRemoveWatchFunction" ); } void dbusWatchToggleFunction( DBusWatch *watch, void *data ){ puts( "dbusWatchToggleFunction" ); } void dbusFreeFunction( void *memory ){ puts("dbusFreeFunction!!"); } static void nm_unregister_handler( DBusConnection * connection, void *user_data ){ puts( "nm_unregister_handler" ); } static DBusHandlerResult nm_message_handler( DBusConnection * connection, DBusMessage * message, void *user_data ) { DBusMessage *tmpmsg; DBusMessageIter iter, array; int reply_timeout, array_type; char *apim; tmpmsg = dbus_message_ref( message ); dbus_message_iter_init( tmpmsg, &iter ); if( dbus_message_iter_get_arg_type( &iter ) != DBUS_TYPE_STRING ){ fprintf (stderr, "Error: reply is not except format 1\n"); return FALSE; } for( ; ; dbus_message_iter_next( &iter ) ){ apim = dbus_message_iter_get_string( &iter ); printf( "message_handler::[%s]\n", apim ); if( !dbus_message_iter_has_next(&iter) ) break; } if( dbus_message_get_no_reply( tmpmsg ) != TRUE ){ DBusMessage *reply = dbus_message_new_method_return( tmpmsg ); dbus_connection_send(connection, reply, NULL ); dbus_message_unref( reply ); } dbus_message_unref( message ); return DBUS_HANDLER_RESULT_HANDLED; } // // // ////////////////////////////////////////////////////////////////// int main (int argc, char **argv){ char *tmp; DBusConnection *connection = NULL; DBusError error; dbus_error_init (&error); DBusObjectPathVTable vtable = { &nm_unregister_handler, &nm_message_handler, NULL, NULL, NULL, NULL }; connection = dbus_bus_get (DBUS_BUS_SYSTEM, &error); if (connection == NULL){ fprintf(stderr, "Failed to open connection to bus: %s\n", error.message); dbus_error_free (&error); exit (1); } printf( "D-BUS connection OK!\n" ); tmp = sendToSkype( connection, "NAME hogehoge"); puts( tmp ); printf( "Sent My name!\n" ); usleep( 200 ); tmp = sendToSkype( connection, "PROTOCOL 5"); puts( tmp ); printf( "PROTOCOL 5!\n" ); usleep( 200 ); dbus_connection_set_watch_functions( connection, dbusAddWatchFunction, dbusRemoveWatchFunction, dbusWatchToggleFunction, NULL, dbusFreeFunction ); dbus_connection_register_object_path( connection, "/com/Skype/Client", &vtable, NULL); printf( "Added watch functions!\n" ); DBusDispatchStatus status; while (1){ printf( "main-loop in\n" ); if( g_watch != NULL ) dbus_watch_handle ( g_watch, DBUS_WATCH_READABLE ); dbus_connection_ref( connection ); status = dbus_connection_dispatch( connection ); dbus_connection_unref( connection ); dbus_connection_flush (connection); if( DBUS_DISPATCH_DATA_REMAINS != status ){ usleep( 200 ); } printf( "main-loop out\n" ); } dbus_error_free (&error); sleep( 300 ); } char *sendToSkype( DBusConnection * connection, char *msg){ DBusMessage *message; DBusMessage *reply; DBusError error; static char returnbuf[64*1024]; char *tmp; int reply_timeout = -1; /*don't timeout*/ dbus_error_init (&error); /* Construct the message */ message = dbus_message_new_method_call ( "com.Skype.API", /*service*/ "/com/Skype", /*path*/ "com.Skype.API", /*interface*/ "Invoke"); dbus_message_set_auto_activation( message, TRUE ); if( !dbus_message_append_args( message, DBUS_TYPE_STRING, msg, DBUS_TYPE_INVALID ) ){ fprintf (stderr, "Error: reply is not except format\n"); dbus_error_free (&error); exit (1); } reply_timeout = -1; /*don't timeout*/ reply = dbus_connection_send_with_reply_and_block (connection, message, reply_timeout, &error); if (dbus_error_is_set (&error)){ fprintf (stderr, "Error in send_with_reply_and_block: %s\n", error.message); dbus_error_free (&error); exit (1); } dbus_message_get_args( reply, &error, DBUS_TYPE_STRING, &tmp, DBUS_TYPE_INVALID); if (dbus_error_is_set (&error)){ fprintf (stderr, "Error in dbus_message_get_args: %s\n", error.message); dbus_error_free (&error); exit (1); } strcpy( returnbuf, tmp ); dbus_message_unref( message ); dbus_message_unref( reply ); dbus_error_free (&error); return returnbuf; } --
working with Skype 1.2 and D-BUS 0.23.3.
トラックバック URL : http://nyanyan.to/archives/226/trackback
コメント (0)