Ejemplo n.º 1
0
/**
 * Launch applications over dbus that need to be synchronized
 */
int usb_moded_dbus_app_launch(const char *launch)
{
  int ret = -1; // assume failure

  if( dbus_connection_ses == 0 )
  {
    log_err("could not start '%s': no session bus connection", launch);
  }
  else
  {
#if 0
    if( startservicebyname(launch) )
    {
      // started request, actual results from startservicebyname_cb()
      ret = 0;
    }
#else
    DBusError error = DBUS_ERROR_INIT;
    if( !dbus_bus_start_service_by_name(dbus_connection_ses, launch, 0, NULL, &error) )
    {
      log_err("could not start '%s': %s: %s", launch, error.name, error.message);
      dbus_error_free(&error);
    }
    else
    {
      ret = 0; // success
    }
#endif
  }
  return ret;
}
bool Connection::start_service( const char* name, u32 flags )
{
	Error e;

	bool b = dbus_bus_start_service_by_name(_connection,name,flags,NULL,e);

	if(e) throw e;
	return b;
}
Ejemplo n.º 3
0
void call_name(DBusConnection* conn, char* service_name ){
   DBusError error;
   DBusMessage* msg;
   DBusMessageIter args;
   DBusPendingCall* pending;
   dbus_uint32_t result;

   dbus_error_init(&error);
   char* param = "calling you with something in the param";

   char* target = service_name ; // target for the method call;
   //char* object =  "/org/gnome/Tomboy/RemoteControl";
   char* object =  "/"; // started with root .... 
   // we need to some how create a dynamic linked list of object -> method mapping table to displace for call 
   char* interface = DBUS_INTERFACE_INTROSPECTABLE ; 
   //char* interface = "org.freedesktop.DBus.Introspectable";
   //char* name = "RemoteName"; // name of the method
   char* method = "Introspect";

   if( !dbus_bus_start_service_by_name( conn, service_name, 0, &result, &error)){
      fprintf(stderr, "Can't start service %s\n", error.message);
      exit(1);
   } else { 
	// we can start looping all the methods and interface in the object tree
        msg = dbus_message_new_method_call( target, object, interface, method );
        if( NULL == msg ) {
           fprintf(stderr, "Reply Null\n");
           exit(1);
        } else { 
            // send message and get a handle for a reply
            if (!dbus_connection_send_with_reply (conn, msg, &pending, -1)) { // -1 is default timeout
                fprintf(stderr, "Out Of Memory!\n");
                exit(1);
            }
            if (NULL == pending) {
                fprintf(stderr, "Pending Call Null\n");
                exit(1);
            } else {
                dbus_connection_flush(conn);
                // free message
                dbus_message_unref(msg);
                method_callback(pending);
            }
        }
   }
}
Ejemplo n.º 4
0
static DBusGProxy *dbus_connect (MoonshotError **error)
{
    DBusConnection  *dbconnection;
    DBusError        dbus_error;
    DBusGConnection *connection;
    DBusGProxy      *g_proxy;
    GError          *g_error = NULL;
    dbus_bool_t      name_has_owner;

    g_return_val_if_fail (*error == NULL, NULL);

    dbus_error_init (&dbus_error);

    /* Check for moonshot server and start the service if possible. We use
     * libdbus here because dbus-glib doesn't handle autostarting the service.
     * If/when we move to GDBus this code can become a one-liner.
     */

    if (is_setid()) {
        *error = moonshot_error_new (MOONSHOT_ERROR_IPC_ERROR,
	                             "Cannot use IPC while setid");
        return NULL;
    }
#ifdef IPC_DBUS_GLIB
    if (getenv("DISPLAY")==NULL) {
        connection = dbus_launch_moonshot();
        if (connection == NULL) {
            *error = moonshot_error_new (MOONSHOT_ERROR_IPC_ERROR,
                                         "Headless dbus launch failed");
            return NULL;
        }
    } else
#endif
    {
        connection = dbus_g_bus_get (DBUS_BUS_SESSION, &g_error);

        if (g_error_matches(g_error, DBUS_GERROR, DBUS_GERROR_NOT_SUPPORTED)) {
            /*Generally this means autolaunch failed because probably DISPLAY is unset*/
            connection = dbus_launch_moonshot();
            if (connection != NULL) {
                g_error_free(g_error);
                g_error = NULL;
            }
        }
        if (g_error != NULL) {
            *error = moonshot_error_new (MOONSHOT_ERROR_IPC_ERROR,
                                         "DBus error: %s",
                                         g_error->message);
            g_error_free (g_error);
            return NULL;
        }
    }


    dbconnection = dbus_g_connection_get_connection(connection);
    name_has_owner  = dbus_bus_name_has_owner (dbconnection,
                                               MOONSHOT_DBUS_NAME,
                                               &dbus_error);

    if (dbus_error_is_set (&dbus_error)) {
        *error = moonshot_error_new (MOONSHOT_ERROR_IPC_ERROR,
                                     "DBus error: %s",
                                     dbus_error.message);
        dbus_error_free (&dbus_error);
        return NULL;
    }

    if (! name_has_owner) {
        dbus_bus_start_service_by_name (dbconnection,
                                        MOONSHOT_DBUS_NAME,
                                        0,
                                        NULL,
                                        &dbus_error);

        if (dbus_error_is_set (&dbus_error)) {
            if (strcmp (dbus_error.name + 27, "ServiceUnknown") == 0) {
                /* Missing .service file; the moonshot-ui install is broken */
                *error = moonshot_error_new (MOONSHOT_ERROR_UNABLE_TO_START_SERVICE,
                                             "The Moonshot service was not found. "
                                             "Please make sure that moonshot-ui is "
                                             "correctly installed.");
            } else {
                *error = moonshot_error_new (MOONSHOT_ERROR_IPC_ERROR,
                                             "DBus error: %s",
                                             dbus_error.message);
            }
            dbus_error_free (&dbus_error);
            return NULL;
        }
    }

    /* Now the service should be running */
    g_error = NULL;

    g_proxy = dbus_g_proxy_new_for_name_owner (connection,
                                               MOONSHOT_DBUS_NAME,
                                               MOONSHOT_DBUS_PATH,
                                               MOONSHOT_DBUS_NAME,
                                               &g_error);

    if (g_error != NULL) {
        *error = moonshot_error_new (MOONSHOT_ERROR_IPC_ERROR,
                                     "DBus error: %s",
                                     g_error->message);
        g_error_free (g_error);
        return NULL;
    }

    return g_proxy; 
}
Ejemplo n.º 5
0
static void
mojito_client_view_constructed (GObject *object)
{
  MojitoClientViewPrivate *priv = GET_PRIVATE (object);
  GError *error = NULL;
  DBusConnection *conn;
  DBusError derror;

  priv->connection = dbus_g_bus_get (DBUS_BUS_STARTER, &error);

  if (!priv->connection)
  {
    g_critical (G_STRLOC ": Error getting DBUS connection: %s",
                error->message);
    g_clear_error (&error);
    return;
  }

  conn = dbus_g_connection_get_connection (priv->connection);
  dbus_error_init (&derror);
  if (!dbus_bus_start_service_by_name (conn,
                                       MOJITO_SERVICE_NAME,
                                       0, 
                                       NULL, 
                                       &derror))
  {
    g_critical (G_STRLOC ": Error starting mojito service: %s",
                derror.message);
    dbus_error_free (&derror);
    return;
  }

  priv->proxy = dbus_g_proxy_new_for_name_owner (priv->connection,
                                                 MOJITO_SERVICE_NAME,
                                                 priv->object_path,
                                                 MOJITO_SERVICE_VIEW_INTERFACE,
                                                 &error);

  if (!priv->proxy)
  {
    g_critical (G_STRLOC ": Error setting up proxy for remote object: %s",
                error->message);
    g_clear_error (&error);
    return;
  }

  dbus_g_proxy_add_signal (priv->proxy,
                           "ItemsAdded",
                           _mojito_items_get_container_type (),
                           NULL);
  dbus_g_proxy_connect_signal (priv->proxy,
                               "ItemsAdded",
                               (GCallback)_proxy_items_added_cb,
                               object,
                               NULL);

  dbus_g_proxy_add_signal (priv->proxy,
                           "ItemsChanged",
                           _mojito_items_get_container_type (),
                           NULL);
  dbus_g_proxy_connect_signal (priv->proxy,
                               "ItemsChanged",
                               (GCallback)_proxy_items_changed_cb,
                               object,
                               NULL);

  dbus_g_proxy_add_signal (priv->proxy,
                           "ItemsRemoved",
                           _mojito_items_removed_get_container_type (),
                           NULL);
  dbus_g_proxy_connect_signal (priv->proxy,
                               "ItemsRemoved",
                               (GCallback)_proxy_items_removed_cb,
                               object,
                               NULL);
}
void call_name(DBusConnection* conn, char* service_name ){
   DBusError error;
   DBusMessage* msg;
   DBusMessageIter args;
   DBusMessageIter contain_args;
   DBusMessageIter dict_args;
   DBusMessageIter var_args;
   DBusPendingCall* pending;
   dbus_uint32_t result;

   dbus_error_init(&error);
   char* param = "calling you with something in the param";
   char* param_list[2] = { "stuff 1", "stuff 2" };
   dbus_uint16_t number = 16;
   char array_type[2]; 
   char ele_type[5]; 

   char* target = service_name ; // target for the method call;
   char* object =  "/com/avengergear/PushServer/Proxy/TypeTest"; // started with root .... 
   // we need to some how create a dynamic linked list of object -> method mapping table to displace for call 
   //char* interface = DBUS_INTERFACE_INTROSPECTABLE ; 
   //char* interface = "org.freedesktop.DBus.Introspectable";
   char* interface = "com.avengergear.PushServer.Proxy.Interface";

   //char* name = "RemoteName"; // name of the method
   char* method = "TypeTest";

   if( !dbus_bus_start_service_by_name( conn, service_name, 0, &result, &error)){
      fprintf(stderr, "Can't start service %s\n", error.message);
      exit(1);
   } else { 
	// we can start looping all the methods and interface in the object tree
        msg = dbus_message_new_method_call( target, object, interface, method );
        if( NULL == msg ) {
           fprintf(stderr, "Reply Null\n");
           exit(1);
        } else { 
            // send message and get a handle for a reply
	    // append arguments
	    dbus_message_iter_init_append(msg, &args);
	    if (!dbus_message_iter_append_basic(&args, DBUS_TYPE_STRING, &param)) {
		fprintf(stderr, "String Out Of Memory!\n");
		exit(1);
	    }
	    fprintf(stderr, "Send string\n");
	    if (!dbus_message_iter_append_basic(&args, DBUS_TYPE_UINT16, &number)) {
		fprintf(stderr, "UINT16 Out Of Memory!\n");
		exit(1);
	    }
	    fprintf(stderr, "Send uint16\n");
	    array_type[0]='s';
	    array_type[1]='\0';
	    if (!dbus_message_iter_open_container(&args, DBUS_TYPE_ARRAY, array_type, &contain_args)) {
		fprintf(stderr, "OpenContainer Out Of Memory!\n");
		exit(1);
	    }
	    fprintf(stderr, "OpenContainer \n");
	    if (!dbus_message_iter_append_basic(&contain_args, DBUS_TYPE_STRING, &param_list[0])) {
		fprintf(stderr, "Arrary String is Out Of Memory!\n");
		exit(1);
	    }
	    fprintf(stderr, "Sending a string\n");
	    if (!dbus_message_iter_append_basic(&contain_args, DBUS_TYPE_STRING, &param_list[1])) {
		fprintf(stderr, "Arrary String is Out Of Memory!\n");
		exit(1);
	    }
	    fprintf(stderr, "Sending a string\n");
	    if (!dbus_message_iter_close_container(&args, &contain_args)) {
		fprintf(stderr, "CloseContainer Out Of Memory!\n");
		exit(1);
	    }
	    fprintf(stderr, "CloseContainer\n");

	    ele_type[0]=DBUS_DICT_ENTRY_BEGIN_CHAR;
	    ele_type[1]='s';
	    ele_type[2]='v';
	    ele_type[3]=DBUS_DICT_ENTRY_END_CHAR;
	    ele_type[4]='\0';

	    if (!dbus_message_iter_open_container(&args, DBUS_TYPE_ARRAY, ele_type, &contain_args)) {
		fprintf(stderr, "OpenContainer Out Of Memory!\n");
		exit(1);
	    }
	    fprintf(stderr, "OpenContainer Array\n");
	    if (!dbus_message_iter_open_container(&contain_args, DBUS_TYPE_DICT_ENTRY, NULL, &dict_args)) {
		fprintf(stderr, "OpenContainer Out Of Memory!\n");
		exit(1);
	    }
	    fprintf(stderr, "OpenContainer Array Dict\n");

	    if (!dbus_message_iter_append_basic(&dict_args, DBUS_TYPE_STRING, &param)) {
		fprintf(stderr, "Arrary Dict String is Out Of Memory!\n");
		exit(1);
	    }

	    array_type[0]='q';
	    array_type[1]='\0';
	    if (!dbus_message_iter_open_container(&dict_args, DBUS_TYPE_VARIANT, array_type , &var_args)) {
		fprintf(stderr, "OpenContainer Out Of Memory!\n");
		exit(1);
	    }
	    fprintf(stderr, "OpenContainer Array Dict Var\n");

	    if (!dbus_message_iter_append_basic(&var_args, DBUS_TYPE_UINT16, &number)) {
		fprintf(stderr, "Array Dict UNIT16 String is Out Of Memory!\n");
		exit(1);
	    }

	    if (!dbus_message_iter_close_container(&dict_args, &var_args)) {
		fprintf(stderr, "CloseContainer Out Of Memory!\n");
		exit(1);
	    }
	    fprintf(stderr, "CloseContainer Array Dict\n");
	    if (!dbus_message_iter_close_container(&contain_args, &dict_args)) {
		fprintf(stderr, "CloseContainer Out Of Memory!\n");
		exit(1);
	    }
	    fprintf(stderr, "CloseContainer Array\n");
	    if (!dbus_message_iter_close_container(&args, &contain_args)) {
		fprintf(stderr, "CloseContainer Out Of Memory!\n");
		exit(1);
	    }
	    fprintf(stderr, "CloseContainer\n");



            if (!dbus_connection_send_with_reply (conn, msg, &pending, -1)) { // -1 is default timeout
                fprintf(stderr, "Out Of Memory!\n");
                exit(1);
            }
            if (NULL == pending) {
                fprintf(stderr, "Pending Call Null\n");
                exit(1);
            } else {
                dbus_connection_flush(conn);
                // free message
                dbus_message_unref(msg);
                method_callback(pending);
            }
        }
   }
}