2 * vim:ts=8:sw=3:sts=8:noexpandtab:cino=>5n-3f0^-2{2
5 #include "ecore_private.h"
6 #include "Ecore_DBus.h"
7 #include "ecore_dbus_private.h"
13 static void _ecore_dbus_address_list_free_cb(void *data
);
15 static int _ecore_dbus_address_value_char_optional_encode(char c
);
16 static char * _ecore_dbus_address_value_decode(const char *value
);
17 static char * _ecore_dbus_address_value_encode(const char *value
);
20 _ecore_dbus_address_list_free_cb(void *data
)
26 ecore_dbus_address_new()
28 Ecore_DBus_Address
*a
;
29 a
= calloc(1, sizeof(Ecore_DBus_Address
));
32 a
->keys
= ecore_list_new();
33 ecore_list_free_cb_set(a
->keys
, _ecore_dbus_address_list_free_cb
);
34 a
->vals
= ecore_list_new();
35 ecore_list_free_cb_set(a
->vals
, _ecore_dbus_address_list_free_cb
);
41 ecore_dbus_address_free(Ecore_DBus_Address
*address
)
44 ecore_list_destroy(address
->keys
);
45 ecore_list_destroy(address
->vals
);
46 if (address
->transport
) free(address
->transport
);
52 * Parse an address into an array of Ecore_DBus_Address structs
55 ecore_dbus_address_parse(const char *address
)
57 Ecore_List
*alist
= NULL
;
59 Ecore_DBus_Address
*a
= NULL
;
63 addcpy
= strdup(address
);
71 alist
= ecore_list_new();
72 ecore_list_free_cb_set(alist
, ECORE_FREE_CB(ecore_dbus_address_free
));
79 a
= ecore_dbus_address_new();
80 if (!a
) { error
= 1; break; }
83 if (!*p
|| *p
== ';' || *p
== ',')
90 if (p
!= start
) error
= 1;
94 ecore_list_append(a
->vals
, _ecore_dbus_address_value_decode(val
));
103 /* append address to list */
104 ecore_list_append(alist
, a
);
106 if (!sep
) break; /* end of string */
113 if (!key
) { error
= 1; break; }
115 ecore_list_append(a
->keys
, strdup(key
));
121 /* append transport */
122 if (!transport
) { error
= 1; break; }
124 a
->transport
= strdup(transport
);
133 ecore_list_destroy(alist
);
141 ecore_dbus_address_value_get(Ecore_DBus_Address
*address
, const char *key
)
145 if (!key
) return NULL
;
147 ecore_list_first_goto(address
->keys
);
149 while((s
= ecore_list_next(address
->keys
)))
153 return ecore_list_index_goto(address
->vals
, i
);
161 ecore_dbus_address_string(Ecore_DBus_Address
*address
)
165 int left
= PATH_MAX
- 1; /* space left in the buffer, leaving room for a final null */
167 if (!address
) return NULL
;
169 snprintf(buf
, PATH_MAX
, "%s:", address
->transport
);
170 left
-= strlen(address
->transport
) + 1;
171 ecore_list_first_goto(address
->keys
);
172 ecore_list_first_goto(address
->vals
);
173 while ((key
= ecore_list_next(address
->keys
)) && (val
= ecore_list_next(address
->vals
)))
176 strncat(buf
, key
, left
);
178 strncat(buf
, "=", left
);
180 encval
= _ecore_dbus_address_value_encode(val
);
181 strncat(buf
, encval
, left
);
182 left
-= strlen(encval
);
189 * Connect to the first successful server in a list of addresses.
191 EAPI Ecore_DBus_Server
*
192 ecore_dbus_address_list_connect(Ecore_List
*addrs
, const void *data
)
194 Ecore_DBus_Address
*addr
;
195 ecore_list_first_goto(addrs
);
196 /* try each listed address in turn */
197 while ((addr
= ecore_list_next(addrs
)))
199 Ecore_DBus_Server
*svr
;
200 svr
= ecore_dbus_address_connect(addr
, data
);
207 * Connect to a server by its Ecore_DBus_Address
209 EAPI Ecore_DBus_Server
*
210 ecore_dbus_address_connect(Ecore_DBus_Address
*addr
, const void *data
)
217 addr_string
= ecore_dbus_address_string(addr
);
218 printf("[ecore_dbus] connecting to address: %s\n", addr_string
);
221 if (!strcmp(addr
->transport
, "unix"))
223 type
= ECORE_CON_LOCAL_SYSTEM
;
224 name
= ecore_dbus_address_value_get(addr
, "path");
228 name
= ecore_dbus_address_value_get(addr
, "abstract");
229 type
= ECORE_CON_LOCAL_ABSTRACT
;
232 if (!name
) return NULL
;
235 else if (!strcmp(addr
->transport
, "tcp"))
237 /* XXX implement (and verify transport name is actually 'tcp') */
244 return ecore_dbus_server_connect(type
, name
, port
, data
);
248 ecore_dbus_print_address_list(Ecore_List
*addresses
)
250 Ecore_DBus_Address
*a
;
252 ecore_list_first_goto(addresses
);
253 while((a
= ecore_list_next(addresses
)))
256 printf("Transport: %s\n", a
->transport
);
258 ecore_list_first_goto(a
->keys
);
259 ecore_list_first_goto(a
->vals
);
260 k
= ecore_list_next(a
->keys
);
261 v
= ecore_list_next(a
->vals
);
264 printf(" %s => %s\n", k
, v
);
265 k
= ecore_list_next(a
->keys
);
266 v
= ecore_list_next(a
->vals
);
272 _ecore_dbus_address_value_char_optional_encode(char c
)
274 /* addl optional chars (other than 0-9A-Za-z) */
275 static const char OPTIONAL_CHARS
[] = {'_', '-', '/', '.', '\\'};
278 if (isascii(c
) && (isalpha(c
) || isdigit(c
))) return 1;
279 for (i
= 0; i
< sizeof(OPTIONAL_CHARS
); i
++)
280 if (c
== OPTIONAL_CHARS
[i
]) return 1;
288 _ecore_dbus_address_value_encode(const char *value
)
294 static const char hexdigits
[16] = {
295 '0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
296 'a', 'b', 'c', 'd', 'e', 'f'
300 if (!value
) return NULL
;
301 buf
= malloc(3 * strlen(value
) + 1);
307 if (_ecore_dbus_address_value_char_optional_encode(*p
))
312 buf
[i
++] = hexdigits
[(*p
>> 4)];
313 buf
[i
++] = hexdigits
[(*p
& 0xf)];
323 _ecore_dbus_address_value_decode(const char *value
)
329 buf
= malloc(strlen(value
) + 1);
340 for (j
= 0; j
< 2; j
++)
344 if ('0' <= *p
&& *p
<= '9')
346 else if ('A' <= *p
&& *p
<= 'F')
348 else if ('a' <= *p
&& *p
<= 'f') /* a-f */