connection_internal
[Internal functions of Easydbus Library]

Collaboration diagram for connection_internal:

Detailed Description

Module with internal functions for manage connection to DBus bus.

Connection Meta Information

Contact:
Daniele Rondina aka Ge@@ru <geaaru@gmail.com>
Status:
EasyDbus Core Library
License:
GPL
Contributor(s):


Functions

void close_dbus_connection (EasyDbus_conn *data)
 Close DBus connection.
int easydbus_acquire_name (struct EasyDbus_core *core, char *serviceName, int flags, DBusError *err)
 Acquire service name.
int easydbus_connect_to_bus (struct EasyDbus_core *core, DBusError *err, DBusBusType type_bus)
 Connect to dbus bus.
char * easydbus_found_new_name (struct EasyDbus_core *core, char *oldName, int flags, DBusError *err)
 Found a new service name.
int easydbus_get_address_onsession (struct EasyDbus_conn *data, char *serviceName)
 Acquire source address on session bus.
int easydbus_get_address_onsystem (struct EasyDbus_conn *data, char *serviceName)
 Acquire source address for system dbus bus.
int easydbus_get_address_serverSession (struct EasyDbus_conn *data, char *serviceName)
 Acquire source addres for server on session bus.
int easydbus_set_request_flags (int easydbus_flags)
 Convert easydbus_connection_flags to dbus_flags.
int easydbus_set_unique_nameID (struct EasyDbus_core *core, char *nameId)
 Set unique name ID.


Function Documentation

void close_dbus_connection ( EasyDbus_conn data  ) 

Close DBus connection.

Note:
Only for non shared connections
Todo:
verify this function.

For internal use only.

Parameters:
data EasyDbus_conn object pointer

Definition at line 340 of file acquire_internal.c.

References EasyDbus_core::conn.

00341 {
00342    struct EasyDbus_core *core = (struct EasyDbus_core *) data;
00343 
00344    dbus_connection_close (core->conn);
00345 }

int easydbus_acquire_name ( struct EasyDbus_core core,
char *  serviceName,
int  flags,
DBusError *  err 
) [inline]

Acquire service name.

For internal use only.

Parameters:
core pointer to EasyDbus_core object
serviceName name used for acquire service name
flags easydbus flags for connection
err pointer to DBusError object.
Returns:
-1 on error

EASYDBUS_CONN_NAME_SERVICE_EXISTS name service exists.

EASYDBUS_CONN_NAME_SERVICE_IN_QUEUE name service in queue.

EASYDBUS_CONN_NAME_SERVICE_PRIMARY name service is primary name.

Todo:
rename this function

Definition at line 90 of file acquire_name.c.

References EasyDbus_core::conn, EASYDBUS_CONN_NAME_SERVICE_EXISTS, EASYDBUS_CONN_NAME_SERVICE_IN_QUEUE, EASYDBUS_CONN_NAME_SERVICE_PRIMARY, easydbus_set_request_flags(), and EasyDbusDebug.

Referenced by easydbus_conn_reconnect(), easydbus_found_new_name(), easydbus_get_address_onsession(), easydbus_get_address_onsystem(), and easydbus_get_address_serverSession().

00093 {
00094    int result = -1;
00095    int dbus_flags = 0;
00096 
00097    EasyDbusDebug ("Request name");
00098 
00099    dbus_flags = easydbus_set_request_flags (flags);
00100 
00101    /* TODO: manage return values correctly */
00102    /* request for set service name */
00103    result = dbus_bus_request_name
00104       (core->conn, serviceName, dbus_flags, err);
00105 
00106    if (dbus_error_is_set (err)) {
00107       EasyDbusDebug ("Error %s from "
00108                      "dbus_bus_request_name: %s",
00109                      err->name, err->message);
00110       return -1;
00111    }
00112 
00113    switch (result) {
00114       case DBUS_REQUEST_NAME_REPLY_EXISTS:
00115          EasyDbusDebug ("Owner already exist");
00116          result = EASYDBUS_CONN_NAME_SERVICE_EXISTS;
00117          break;
00118       case DBUS_REQUEST_NAME_REPLY_PRIMARY_OWNER:
00119          EasyDbusDebug ("Service is primary onwner");
00120          result = EASYDBUS_CONN_NAME_SERVICE_PRIMARY;
00121          break;
00122       case DBUS_REQUEST_NAME_REPLY_IN_QUEUE:
00123          EasyDbusDebug ("Service in queue");
00124          result = EASYDBUS_CONN_NAME_SERVICE_IN_QUEUE;
00125          break;
00126       case DBUS_REQUEST_NAME_REPLY_ALREADY_OWNER:
00127          EasyDbusDebug ("Service already owner");
00128          result = EASYDBUS_CONN_NAME_SERVICE_PRIMARY;
00129          break;
00130       default:
00131          EasyDbusDebug ("Error! Returned value not managed");
00132          return -1;
00133          break;
00134    }
00135 
00136    return result;
00137 }

Here is the call graph for this function:

int easydbus_connect_to_bus ( struct EasyDbus_core core,
DBusError *  err,
DBusBusType  type_bus 
)

Connect to dbus bus.

For internal use only.

Parameters:
core pointer to struct EasyDbus_core object.
err DBusError object pointer.
type_bus DBusBusType value with dbus bus type.
Returns:
-1 error

0 ok

Definition at line 237 of file acquire_internal.c.

References EasyDbus_core::conn, and EasyDbusDebug.

Referenced by easydbus_conn_reconnect(), easydbus_get_address_onsession(), easydbus_get_address_onsystem(), and easydbus_get_address_serverSession().

00240 {
00241    /* connect to system bus */
00242    core->conn = dbus_bus_get (type_bus, err);
00243    if (!core->conn) {
00244       EasyDbusDebug ("Error %s from dbus_bus_get: %s",
00245                      err->name, err->message);
00246       return -1;
00247    }
00248 
00249    EasyDbusDebug ("Connected and registered to bus daemon");
00250    /* do not allw libdbus to exit on connection failure ( This
00251     * may around random exit () on SIGPIPE errors) */
00252    dbus_connection_set_exit_on_disconnect (core->conn, FALSE);
00253    return 0;
00254 }

char* easydbus_found_new_name ( struct EasyDbus_core core,
char *  oldName,
int  flags,
DBusError *  err 
)

Found a new service name.

For internal use only.

Parameters:
core pointer to EasyDbus_core object
oldName old name used as prefix for new name
flags easydbus flags for connection
err pointer to DBusError object.
Returns:
NULL error

pointer to new service name string. Must be free.

Todo:
rename this function

Definition at line 152 of file acquire_name.c.

References EasyDbus_core::conn, easydbus_acquire_name(), EASYDBUS_RENAMED_MAX_TEST, EasyDbusDebug, and EasyDbus_core::service_name.

Referenced by easydbus_conn_reconnect(), easydbus_get_address_onsession(), easydbus_get_address_onsystem(), and easydbus_get_address_serverSession().

00155 {
00156    char *service_name = NULL;
00157    int string_length = 0, string_length_max = 0;
00158    int i, result = -1;
00159    char buffer[5];
00160 
00161    // 1 --> for \0 and 3 --> for 3 char number.
00162    string_length_max = strlen (oldName) + 1 + 3;
00163    string_length = strlen (oldName) + 1;
00164    service_name = (char *) malloc (string_length_max);
00165    if (!service_name)
00166       return NULL;
00167    memset (service_name, 0, string_length_max);
00168    memcpy (service_name, oldName, string_length);
00169 
00170    EasyDbusDebug ("Check %s service name", oldName);
00171    for (i = 1; i < EASYDBUS_RENAMED_MAX_TEST; i++) {
00172       memset (buffer, 0, 5);
00173       snprintf (buffer, 5, "%d", i);
00174       memcpy (&service_name[string_length - 1],
00175               buffer, strlen (buffer) + 1);
00176       EasyDbusDebug ("Check %s service name", service_name);
00177       if (!dbus_bus_name_has_owner (core->conn, service_name, err)) {
00178          result = easydbus_acquire_name (core, service_name, 
00179                                          flags, err);
00180          if (result == -1)
00181             goto error;
00182          return service_name;
00183       }
00184    }
00185 
00186  error:
00187 
00188    if (service_name != NULL)
00189       free (service_name);
00190 
00191    return NULL;
00192 }

Here is the call graph for this function:

int easydbus_get_address_onsession ( struct EasyDbus_conn data,
char *  serviceName 
) [inline]

Acquire source address on session bus.

For internal use only.

Parameters:
data pointer to EasyDbus_conn object
serviceName name of service that must be acquired
See also:
enum easydbus_connection_flags.
Returns:
-1 error

EASYDBUS_CONN_NAME_SERVICE_EXISTS name service exists.

EASYDBUS_CONN_NAME_SERVICE_IN_QUEUE name service in queue.

EASYDBUS_CONN_NAME_SERVICE_PRIMARY name service is primary name.

EASYDBUS_CONN_NAME_SERVICE_RENAMED name service is been renamed.

Definition at line 162 of file acquire_internal.c.

References EasyDbus_core::conn, easydbus_acquire_name(), EASYDBUS_CONN_DO_NOT_QUEUE, EASYDBUS_CONN_NAME_SERVICE_EXISTS, EASYDBUS_CONN_NAME_SERVICE_RENAMED, EASYDBUS_CONN_NAME_UNIQUE, easydbus_connect_to_bus(), easydbus_found_new_name(), easydbus_save_serviceName(), easydbus_set_unique_nameID(), EasyDbusDebug, EasyDbus_conn::flags, EasyDbus_conn::registered_ondbus, and EasyDbus_core::service_name.

Referenced by easydbus_conn_get_address().

00164 {
00165    struct EasyDbus_core *core = (struct EasyDbus_core *) data;
00166    DBusError err;
00167    int result = -1;
00168    char *new_service_name = NULL;
00169 
00170    dbus_error_init (&err);
00171 
00172    /* connect to system bus */
00173    if (easydbus_connect_to_bus (core, &err, DBUS_BUS_SESSION))
00174       goto error_acquire;
00175 
00176    result = easydbus_acquire_name (core, serviceName, 
00177                                    data->flags, &err);
00178    if (result == -1)
00179       goto error_acquire;
00180 
00181    if (result == EASYDBUS_CONN_NAME_SERVICE_EXISTS &&
00182        // probably this isn't needed because without this flags
00183        // return value is EASYDBUS_CONN_NAME_SERVICE_IN_QUEUE
00184        (data->flags & EASYDBUS_CONN_DO_NOT_QUEUE)) {
00185       if (data->flags & EASYDBUS_CONN_NAME_SERVICE_RENAMED) {
00186          new_service_name = easydbus_found_new_name
00187             (core, serviceName, data->flags, &err);
00188          if (new_service_name == NULL)
00189             goto error_acquire;
00190          result = EASYDBUS_CONN_NAME_SERVICE_RENAMED;
00191       }
00192       else
00193          goto error_acquire;
00194    }
00195 
00196    data->registered_ondbus = 1;
00197 
00198    if (new_service_name != NULL)
00199       core->service_name = new_service_name;
00200    else if (easydbus_save_serviceName (core, serviceName)) {
00201       EasyDbusDebug ("Error on save service name");
00202       goto error_acquire;
00203    }
00204    
00205    if (data->flags & EASYDBUS_CONN_NAME_UNIQUE)
00206       if (easydbus_set_unique_nameID (core, core->service_name))
00207          goto error_acquire;
00208 
00209    EasyDbusDebug ("Acquire operation terminated");
00210 
00211    dbus_error_free (&err);
00212    return result;
00213 
00214  error_acquire:
00215    if (data->registered_ondbus)
00216       dbus_bus_release_name (core->conn, 
00217                              core->service_name, &err);
00218 
00219    if (core->conn != NULL)
00220       dbus_connection_unref (core->conn);
00221 
00222    dbus_error_free (&err);
00223 
00224    return result;
00225 }

Here is the call graph for this function:

int easydbus_get_address_onsystem ( struct EasyDbus_conn data,
char *  serviceName 
) [inline]

Acquire source address for system dbus bus.

For internal use only.

Parameters:
data pointer to EasyDbus_conn object
serviceName name of service that must be acquired
See also:
enum easydbus_connection_flags.
Returns:
-1 error

EASYDBUS_CONN_NAME_SERVICE_EXISTS name service exists.

EASYDBUS_CONN_NAME_SERVICE_IN_QUEUE name service in queue.

EASYDBUS_CONN_NAME_SERVICE_PRIMARY name service is primary name.

EASYDBUS_CONN_NAME_SERVICE_RENAMED name service is been renamed.

Definition at line 269 of file acquire_internal.c.

References EasyDbus_core::conn, easydbus_acquire_name(), EASYDBUS_CONN_DO_NOT_QUEUE, EASYDBUS_CONN_NAME_SERVICE_EXISTS, EASYDBUS_CONN_NAME_SERVICE_RENAMED, EASYDBUS_CONN_NAME_UNIQUE, easydbus_connect_to_bus(), easydbus_found_new_name(), easydbus_save_serviceName(), easydbus_set_unique_nameID(), EasyDbusDebug, EasyDbus_conn::flags, EasyDbus_conn::registered_ondbus, and EasyDbus_core::service_name.

Referenced by easydbus_conn_get_address().

00271 {
00272    struct EasyDbus_core *core = (struct EasyDbus_core *) data;
00273    DBusError err;
00274    int result = -1;
00275    char *new_service_name = NULL;
00276 
00277    dbus_error_init (&err);
00278 
00279    if (easydbus_connect_to_bus (core, &err, DBUS_BUS_SYSTEM))
00280       goto error_acquire;
00281 
00282    result = easydbus_acquire_name (core, serviceName, data->flags, 
00283                                    &err);
00284    if (result == -1)
00285       goto error_acquire;
00286    if (result == EASYDBUS_CONN_NAME_SERVICE_EXISTS &&
00287        // probably this isn't needed because without this flags
00288        // return value is EASYDBUS_CONN_NAME_SERVICE_IN_QUEUE
00289        (data->flags & EASYDBUS_CONN_DO_NOT_QUEUE)) {
00290       if (data->flags & EASYDBUS_CONN_NAME_SERVICE_RENAMED) {
00291          new_service_name = easydbus_found_new_name
00292             (core, serviceName, data->flags, &err);
00293          if (new_service_name == NULL)
00294             goto error_acquire;
00295          result = EASYDBUS_CONN_NAME_SERVICE_RENAMED;
00296       }
00297       else
00298          goto error_acquire;
00299    }
00300 
00301    data->registered_ondbus = 1;
00302 
00303    if (new_service_name != NULL)
00304       core->service_name = new_service_name;
00305    else if (easydbus_save_serviceName (core, serviceName)) {
00306       EasyDbusDebug ("Error on save service name");
00307       goto error_acquire;
00308    }
00309 
00310    if (data->flags & EASYDBUS_CONN_NAME_UNIQUE)
00311       if (easydbus_set_unique_nameID (core, core->service_name))
00312          goto error_acquire;
00313 
00314    dbus_error_free (&err);
00315    return result;
00316 
00317  error_acquire:
00318    if (data->registered_ondbus)
00319       dbus_bus_release_name (core->conn, 
00320                              core->service_name, &err);
00321 
00322    if (core->conn != NULL)
00323       dbus_connection_unref (core->conn);
00324 
00325    dbus_error_free (&err);
00326 
00327    return -1;
00328 }

Here is the call graph for this function:

int easydbus_get_address_serverSession ( struct EasyDbus_conn data,
char *  serviceName 
) [inline]

Acquire source addres for server on session bus.

For internal use only.

Parameters:
data pointer to EasyDbus_conn object
serviceName name of service that must be acquired
See also:
enum easydbus_connection_flags.
Returns:
-1 error

EASYDBUS_CONN_NAME_SERVICE_EXISTS name service exists.

EASYDBUS_CONN_NAME_SERVICE_IN_QUEUE name service in queue.

EASYDBUS_CONN_NAME_SERVICE_PRIMARY name service is primary name.

EASYDBUS_CONN_NAME_SERVICE_RENAMED name service is been renamed.

Definition at line 57 of file acquire_internal.c.

References EasyDbus_core::conn, easydbus_acquire_name(), EASYDBUS_CONN_DO_NOT_QUEUE, EASYDBUS_CONN_NAME_SERVICE_EXISTS, EASYDBUS_CONN_NAME_SERVICE_RENAMED, EASYDBUS_CONN_NAME_UNIQUE, easydbus_connect_to_bus(), easydbus_found_new_name(), easydbus_save_serviceName(), easydbus_set_unique_nameID(), EasyDbusDebug, EasyDbus_conn::flags, EasyDbus_conn::registered_ondbus, and EasyDbus_core::service_name.

Referenced by easydbus_conn_get_address().

00059 {
00060    DBusError err;
00061    struct EasyDbus_core *core = (struct EasyDbus_core *) data;
00062    int result = -1;
00063    char *new_service_name = NULL;
00064 
00065    dbus_error_init (&err);
00066 
00067    if (easydbus_connect_to_bus (core, &err, DBUS_BUS_SESSION))
00068       goto error_acquire;
00069 
00070 // if (dbus_bus_register (core->conn, &err) == FALSE) {
00071 //    EasyDbusDebug ("Error %s from dbus_bus_register: %s",
00072 //          err.name,
00073 //          err.message);
00074 //    goto error_acquire;
00075 // }
00076 
00077    result = easydbus_acquire_name (core, serviceName,
00078                                    data->flags | EASYDBUS_CONN_DO_NOT_QUEUE,
00079                                    &err);
00080    if (result == -1)
00081       goto error_acquire;
00082    if (result == EASYDBUS_CONN_NAME_SERVICE_EXISTS) {
00083       // probably this isn't needed because without this flags
00084       // return value is EASYDBUS_CONN_NAME_SERVICE_IN_QUEUE
00085       if (data->flags & EASYDBUS_CONN_NAME_SERVICE_RENAMED) {
00086          new_service_name = easydbus_found_new_name
00087             (core, serviceName, data->flags, &err);
00088          if (new_service_name == NULL)
00089             goto error_acquire;
00090          result = EASYDBUS_CONN_NAME_SERVICE_RENAMED;
00091       }
00092       else
00093          goto error_acquire;
00094    }
00095 
00096    data->registered_ondbus = 1;
00097 
00098    if (new_service_name != NULL)
00099       core->service_name = new_service_name;
00100    else if (easydbus_save_serviceName (core, serviceName)) {
00101       EasyDbusDebug ("Error on save service name");
00102       goto error_acquire;
00103    }
00104 
00105    if (data->flags & EASYDBUS_CONN_NAME_UNIQUE)
00106       if (easydbus_set_unique_nameID (core, core->service_name))
00107          goto error_acquire;
00108 
00109    dbus_error_free (&err);
00110    return result;
00111 
00112  error_acquire:
00113    if (data->registered_ondbus)
00114       dbus_bus_release_name (core->conn, 
00115                              core->service_name, &err);
00116 
00117    if (core->conn != NULL)
00118       dbus_connection_unref (core->conn);
00119 
00120    dbus_error_free (&err);
00121 
00122    return -1;
00123 }

Here is the call graph for this function:

int easydbus_set_request_flags ( int  easydbus_flags  )  [inline]

Convert easydbus_connection_flags to dbus_flags.

For internal use only.

Parameters:
easydbus_flags integer with easydbus connection flags.
Returns:
dbus_flags binding
Todo:
rename this function

Definition at line 55 of file acquire_name.c.

References EASYDBUS_CONN_ALLOW_REPLACEMENT, EASYDBUS_CONN_DO_NOT_QUEUE, EASYDBUS_CONN_REPLACE_EXISTING, and EasyDbusDebug.

Referenced by easydbus_acquire_name().

00056 {
00057    int dbus_flags = 0;
00058 
00059    if (easydbus_flags & EASYDBUS_CONN_ALLOW_REPLACEMENT) {
00060       EasyDbusDebug ("Set ALLOW_REPLACEMENT flag");
00061       dbus_flags |= DBUS_NAME_FLAG_ALLOW_REPLACEMENT;
00062    }
00063    if (easydbus_flags & EASYDBUS_CONN_REPLACE_EXISTING) {
00064       EasyDbusDebug ("Set REPLACE_EXISTING flag");
00065       dbus_flags |= DBUS_NAME_FLAG_REPLACE_EXISTING;
00066    }
00067    if (easydbus_flags & EASYDBUS_CONN_DO_NOT_QUEUE) {
00068       EasyDbusDebug ("Set DO_NOT_QUEUE flag");
00069       dbus_flags |= DBUS_NAME_FLAG_DO_NOT_QUEUE;
00070    }
00071 
00072    return dbus_flags;
00073 }

int easydbus_set_unique_nameID ( struct EasyDbus_core core,
char *  nameId 
) [inline]

Set unique name ID.

For internal use only.

Parameters:
core pointer to struct EasyDbus_core object.
nameId new unique name id to set.
Returns:
-1 error

0 ok

Definition at line 134 of file acquire_internal.c.

References EasyDbus_core::conn, and EasyDbusDebug.

Referenced by easydbus_get_address_onsession(), easydbus_get_address_onsystem(), and easydbus_get_address_serverSession().

00136 {
00137    EasyDbusDebug ("DBUS unique name = %s",
00138                   dbus_bus_get_unique_name (core->conn));
00139 
00140    if (!dbus_bus_set_unique_name (core->conn, nameId))
00141       return -1;
00142 
00143    EasyDbusDebug ("DBUS unique name = %s",
00144                   dbus_bus_get_unique_name (core->conn));
00145 
00146    return 0;
00147 }


Generated on Thu Apr 10 10:01:50 2008 for EasyDbus-0.2 by  doxygen 1.5.4