2006/6/13 火曜日

Skype Linux D-BUS sample code

カテゴリー: Skype — ryu @ 23:22:06

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.

むぅ

カテゴリー: おぼえ書き — ryu @ 22:44:06

私的メモ
・インストーラ何とかする
・とりあえず↓追加
 GradientFill = GradientFill_ @ 1763
・起動はする
・画面描画まわり何とかしないとなー。
 半分ぐらいAYGSHELLなんだよなー。
 またホーミンさんに相談してみよー。<他力本願…

今日は

カテゴリー: 未分類 — ryu @ 0:39:50

一体どれほどのわーるどかっぷネタがBlogにポストされてることやら

2006/6/9 金曜日

解んないことは聞くのが一番

カテゴリー: 未分類 — ryu @ 0:04:55

またも中島さんのBlogネタ。

ミネラルウォーターの謎

写真を見て分かる通り、私はボトルの中にあるものをまぜて飲んでいる。さて、私は何のためにまぜものをしているのだろう?

えーと、写真を見てなにが混ざってるのかわかりません…。
というような場合、答えは聞いちゃうのが一番簡単な方法じゃ無いかと。

「なぜですか?」

まー、何でもかんでも聞けばOKというわけじゃないけど、
論理的に考えて答えの出る問題と回答を特定個人しか知らないような問題では、
おのずと回答を導くアプローチも違ってくるんじゃないかなーと。

2006/6/2 金曜日

えーと、コメントが…ごめんなさい、ごめんなさい。

カテゴリー: 未分類 — ryu @ 20:09:41

5月半ばぐらいにコメントスパム対策したんですが、
その後ついでに既に打ち込まれてたコメントを消した時に、
ファイルのパーミッションしくじってて、
*コメントできない状態*に成ってたみたいです。

コメントいただいてた方には…
「ごめんなさい、こめんなさい」
と、言うしかなく。

とりあえず6月に成って別ファイル出来た辺りでコメントスパム受け付けてた辺りで気が付いて、もう大丈夫なはず。

それでもコメント出来ねーぞという方はメールでも下さい。

2006/6/1 木曜日

Windows Mobile 5.0 MSFP EmulatorでSkype

カテゴリー: Skype — ryu @ 1:59:16

これもネタ。

ふと思い立ってkzouさんのところで紹介されていたMicrosoft Device Emulator 1.0を試してみる。このエミュレータの凄いところはARMのバイナリが動くということ。今まではエミュレータ用にビルドしたバイナリしか動かなかったのでMSがDeviceEmulatorと呼んでいるのもうなづける。一般に流通してるソフトはほぼそのまま動く。

Skypeも例外なく動いた。

ま、OSが英語版なのも取りようによっては日本語版でしか発生しないバグを再現されるためのプラットフォームを手に入れた…とも言えなくも無い。
が、何よりの収穫はQVGAで動いてるSkypeを初めてみたことだったり(汗

しかし重い。Sig3のminimo以上に重い。
まー、ULVのPentiumMなノートが開発機って言うのが間違ってるとは思うけど。
CoreDuoで1Kg以下のノート無いしなぁ…。

NetFront V3.3 for Pocket PC

カテゴリー: 未分類 — ryu @ 0:31:31

掲題のものが正式版が発売されています。

NetFront V3.3 for Pocket PC

Vectorでサクっと購入。
いつもの方法で動きました。

ベータの頃試せていなかったJVLite2ですが一応動いてるみたいです。まともなJavaの実効環境が手に入るのは喜ばしいことなのですが、NetFront内でApplet表示だとNGで、別途AppletViewerからならOKだったり、もう少し様子を見る必要が有りそう。

ちなみにデモの入ってるフォルダを移動する場合、起動用のショートカットのプロパティを良く見て修正する必要が有りマス。(ちょっと悩んだ…)

« 前ページへ

31 queries. HTML convert time: 0.397 sec. Powered by WordPress 2.8