From: Enlightenment S. <no-...@en...> - 2011-11-04 12:12:56
|
Log: Initial DBUS support implementation. Test Drive. Signed-off-by: Sanjeev BA <as2...@sa...> Author: sanjeev Date: 2011-11-04 05:12:49 -0700 (Fri, 04 Nov 2011) New Revision: 64730 Trac: http://trac.enlightenment.org/e/changeset/64730 Modified: trunk/PROTO/elev8/data/javascript/dbus_test.js trunk/PROTO/elev8/src/bin/dbus_library.cc trunk/PROTO/elev8/src/bin/dbus_library.h Modified: trunk/PROTO/elev8/data/javascript/dbus_test.js =================================================================== --- trunk/PROTO/elev8/data/javascript/dbus_test.js 2011-11-04 12:12:44 UTC (rev 64729) +++ trunk/PROTO/elev8/data/javascript/dbus_test.js 2011-11-04 12:12:49 UTC (rev 64730) @@ -5,7 +5,7 @@ var my_window = new elm.window({ type : "main", - label : "Menu Demo", + label : "D-Feet Demo", width : 320, height : 480, align : FILL_BOTH, @@ -21,13 +21,34 @@ weight : EXPAND_BOTH, resize : true, elements : { - icon_button : { + the_entry : { + type : "entry", + weight : EXPAND_BOTH, + align : FILL_BOTH, + line_wrap : 3, + editable : false, + }, + the_bus : { + type : "entry", + text : "org.freedesktop.DBus", + weight : EXPAND_BOTH, + align : FILL_BOTH, + line_wrap : 3, + singleline : 1, + editable : true, + }, + the_button : { type : "button", - label : "Icon sized to button", + label : "Get ConnMan State", weight : { x : -1.0, y : -1.0 }, on_clicked : function() { print("Button Clicked"); - var test = new dbus("Session"); + var test = new dbus("System"); + test.introspect("net.connman", + "/org/freedesktop/NetworkManager", + "org.freedesktop.NetworkManager", + "state"); + }, }, } Modified: trunk/PROTO/elev8/src/bin/dbus_library.cc =================================================================== --- trunk/PROTO/elev8/src/bin/dbus_library.cc 2011-11-04 12:12:44 UTC (rev 64729) +++ trunk/PROTO/elev8/src/bin/dbus_library.cc 2011-11-04 12:12:49 UTC (rev 64730) @@ -4,6 +4,80 @@ Handle<ObjectTemplate> dbusObj; + +Handle<Value> dbus_msg_introspect(const Arguments &args) +{ + HandleScope scope; + + fprintf(stderr,"Calling Introspect API\n"); + Local<Object> self = args.Holder(); + Local<External> wrap = Local<External>::Cast(self->GetInternalField(0)); + void* ptr = wrap->Value(); + DBus *dbus = (DBus *)ptr; + + if (args[0]->IsString() && args[1]->IsString() && + args[2]->IsString() && args[3]->IsString() ) + { + String::Utf8Value service(args[0]->ToString()); + String::Utf8Value path(args[1]->ToString()); + String::Utf8Value interface(args[2]->ToString()); + String::Utf8Value method(args[3]->ToString()); + fprintf(stderr, "%s-%s-%s-%s\n", *service, *path, *interface, *method); + + DBusConnection *conn = e_dbus_conn_object_get(dbus->conn); + DBusError error; + DBusMessage *message; + DBusMessage *reply; + int reply_timeout; + int value; + + dbus_error_init (&error); + + /* Construct the message */ + message = dbus_message_new_method_call( + *service,*path,*interface,*method); + + /* Call ListServices method */ + reply_timeout = -1; /*don't timeout*/ + reply = dbus_connection_send_with_reply_and_block (conn, + message, reply_timeout, + &error); + if (dbus_error_is_set (&error)) + { + fprintf (stderr, "Error: %s\n", error.message); + return Undefined(); + } + + /* Extract the data from the reply */ + if (!dbus_message_get_args (reply, &error, + DBUS_TYPE_UINT32, &value, + DBUS_TYPE_INVALID)) + { + fprintf (stderr, "Failed to complete %s call: %s\n", *method, error.message); + return Undefined(); + } + dbus_message_unref (reply); + dbus_message_unref (message); + + /* Print the results */ + fprintf (stderr, "Retrieved Value is %u\n", value); + } +} + +void introspect_result(Local<String> property, + Local<Value> value, + const AccessorInfo& info) +{ + Local<Object> self = info.Holder(); + Local<External> wrap = Local<External>::Cast(self->GetInternalField(0)); + void *ptr = wrap->Value(); + DBus *dbus = (DBus *)ptr; + + String::Utf8Value prop_name(property); + dbus->introspectResult.Dispose(); + dbus->introspectResult = Persistent<Value>::New(value); +} + Handle<Value> createDBusInstance(const Arguments& args) { HandleScope scope; @@ -11,7 +85,8 @@ if (args[0]->IsString()) { String::Utf8Value method(args[0]->ToString()); - if (!(strstr(*method, "System") || (strstr(*method, "Session")))) + if (!(strstr(*method, "System") || strstr(*method, "Session") + || strstr(*method, "Starter"))) { fprintf(stderr,"Undefined Session type\n"); return Undefined(); @@ -27,11 +102,29 @@ DBus *dbus = new DBus(); String::Utf8Value method(args[0]->ToString()); + /* After this step, dbus is integrated to main loop */ if (strstr(*method, "System")) dbus->conn = e_dbus_bus_get(DBUS_BUS_SYSTEM); if (strstr(*method, "Session")) dbus->conn = e_dbus_bus_get(DBUS_BUS_SESSION); + if (strstr(*method, "Starter")) + dbus->conn = e_dbus_bus_get(DBUS_BUS_STARTER); + if (dbus->conn==NULL) + { + fprintf(stderr, "Cannot create DBus\n"); + delete dbus; + return Undefined(); + } + + Local<FunctionTemplate> introspect = FunctionTemplate::New(); + introspect->SetCallHandler(dbus_msg_introspect); + dbusObj->Set(String::New("introspect"), introspect); + + dbusObj->SetAccessor(String::New("onIntrospectResult"),NULL, + introspect_result, + Null() + ); dbus->obj.Dispose(); dbus->obj = Persistent<Object>::New(dbusObj->NewInstance()); dbus->obj->SetInternalField(0, External::New(dbus)); Modified: trunk/PROTO/elev8/src/bin/dbus_library.h =================================================================== --- trunk/PROTO/elev8/src/bin/dbus_library.h 2011-11-04 12:12:44 UTC (rev 64729) +++ trunk/PROTO/elev8/src/bin/dbus_library.h 2011-11-04 12:12:49 UTC (rev 64730) @@ -15,6 +15,8 @@ public: E_DBus_Connection *conn; v8::Persistent<v8::Object> obj; + v8::Persistent<v8::Value> introspectResult; + }; #endif |