64
64
static void element_start(GMarkupParseContext *context,
65
const gchar *element_name, const gchar **attribute_names,
66
const gchar **attribute_values, gpointer user_data, GError **err)
65
const gchar *element_name,
66
const gchar **attribute_names,
67
const gchar **attribute_values,
68
gpointer user_data, GError **err)
68
70
struct context_data *ctx_data = user_data;
73
75
if (!strcmp(element_name, "attribute")) {
75
77
for (i = 0; attribute_names[i]; i++) {
76
if (!strcmp(attribute_names[i], "id")) {
77
if (strtol(attribute_values[i], 0, 0) == ATTRID_1284ID)
78
ctx_data->found = TRUE;
78
if (strcmp(attribute_names[i], "id") != 0)
80
if (strtol(attribute_values[i], 0, 0) == ATTRID_1284ID)
81
ctx_data->found = TRUE;
153
155
dbus_message_iter_recurse(&reply_iter, &reply_iter_entry);
155
157
/* Hopefully we only get one handle, or take a punt */
156
while (dbus_message_iter_get_arg_type(&reply_iter_entry) == DBUS_TYPE_DICT_ENTRY) {
158
while (dbus_message_iter_get_arg_type(&reply_iter_entry) ==
159
DBUS_TYPE_DICT_ENTRY) {
158
161
DBusMessageIter dict_entry;
188
static void add_device_to_list(const char *name, const char *bdaddr, const char *id)
191
static void print_printer_details(const char *name, const char *bdaddr,
196
escaped = g_strdelimit(g_strdup(name), "\"", '\'');
197
uri = g_strdup_printf("bluetooth://%c%c%c%c%c%c%c%c%c%c%c%c",
198
bdaddr[0], bdaddr[1],
199
bdaddr[3], bdaddr[4],
200
bdaddr[6], bdaddr[7],
201
bdaddr[9], bdaddr[10],
202
bdaddr[12], bdaddr[13],
203
bdaddr[15], bdaddr[16]);
204
printf("direct %s \"%s\" \"%s (Bluetooth)\"", uri, escaped, escaped);
206
printf(" \"%s\"\n", id);
213
static void add_device_to_list(const char *name, const char *bdaddr,
190
216
struct cups_device *device;
212
238
device->id = g_strdup(id);
214
240
device_list = g_slist_prepend(device_list, device);
217
static void print_printer_details(const char *name, const char *bdaddr, const char *id)
221
escaped = g_strdelimit(g_strdup(name), "\"", '\'');
222
uri = g_strdup_printf("bluetooth://%c%c%c%c%c%c%c%c%c%c%c%c",
223
bdaddr[0], bdaddr[1],
224
bdaddr[3], bdaddr[4],
225
bdaddr[6], bdaddr[7],
226
bdaddr[9], bdaddr[10],
227
bdaddr[12], bdaddr[13],
228
bdaddr[15], bdaddr[16]);
229
printf("network %s \"Unknown\" \"%s (Bluetooth)\"", uri, escaped);
231
printf(" \"%s\"\n", id);
238
static gboolean parse_device_properties(DBusMessageIter *reply_iter, char **name, char **bdaddr)
241
print_printer_details(device->name, device->bdaddr, device->id);
244
static gboolean parse_device_properties(DBusMessageIter *reply_iter,
245
char **name, char **bdaddr)
240
247
guint32 class = 0;
241
248
DBusMessageIter reply_iter_entry;
246
253
dbus_message_iter_recurse(reply_iter, &reply_iter_entry);
248
while (dbus_message_iter_get_arg_type(&reply_iter_entry) == DBUS_TYPE_DICT_ENTRY) {
255
while (dbus_message_iter_get_arg_type(&reply_iter_entry) ==
256
DBUS_TYPE_DICT_ENTRY) {
250
258
DBusMessageIter dict_entry, iter_dict_val;
323
static void remote_device_found(const char *adapter, const char *bdaddr, const char *name)
331
static void remote_device_found(const char *adapter, const char *bdaddr,
325
334
DBusMessage *message, *reply, *adapter_reply;
326
335
DBusMessageIter iter;
332
341
if (adapter == NULL) {
333
342
message = dbus_message_new_method_call("org.bluez", "/",
337
346
adapter_reply = dbus_connection_send_with_reply_and_block(conn,
340
349
dbus_message_unref(message);
342
if (dbus_message_get_args(adapter_reply, NULL, DBUS_TYPE_OBJECT_PATH, &adapter, DBUS_TYPE_INVALID) == FALSE)
351
if (dbus_message_get_args(adapter_reply, NULL,
352
DBUS_TYPE_OBJECT_PATH, &adapter,
353
DBUS_TYPE_INVALID) == FALSE)
346
357
message = dbus_message_new_method_call("org.bluez", adapter,
349
360
dbus_message_iter_init_append(message, &iter);
350
361
dbus_message_iter_append_basic(&iter, DBUS_TYPE_STRING, &bdaddr);
361
372
message = dbus_message_new_method_call("org.bluez", adapter,
364
375
dbus_message_iter_init_append(message, &iter);
365
376
dbus_message_iter_append_basic(&iter, DBUS_TYPE_STRING, &bdaddr);
367
378
reply = dbus_connection_send_with_reply_and_block(conn,
370
381
dbus_message_unref(message);
375
if (dbus_message_get_args(reply, NULL, DBUS_TYPE_OBJECT_PATH, &object_path, DBUS_TYPE_INVALID) == FALSE)
387
if (dbus_message_get_args(reply, NULL,
388
DBUS_TYPE_OBJECT_PATH, &object_path,
389
DBUS_TYPE_INVALID) == FALSE)
379
392
id = device_get_ieee1284_id(adapter, object_path);
380
393
add_device_to_list(name, bdaddr, id);
384
397
static void discovery_completed(void)
388
for (l = device_list; l != NULL; l = l->next) {
389
struct cups_device *device = (struct cups_device *) l->data;
391
if (device->name == NULL)
392
device->name = g_strdelimit(g_strdup(device->bdaddr), ":", '-');
393
/* Give another try to getting an ID for the device */
394
if (device->id == NULL)
395
remote_device_found(NULL, device->bdaddr, device->name);
396
print_printer_details(device->name, device->bdaddr, device->id);
397
g_free(device->name);
398
g_free(device->bdaddr);
403
399
g_slist_free(device_list);
404
400
device_list = NULL;
430
426
DBusMessage *message, *reply;
432
message = dbus_message_new_method_call ("org.bluez", adapter,
428
message = dbus_message_new_method_call("org.bluez", adapter,
433
429
"org.bluez.Adapter",
435
431
if (message == NULL)
438
434
dbus_error_init(&error);
439
reply = dbus_connection_send_with_reply_and_block(conn,
440
message, -1, &error);
435
reply = dbus_connection_send_with_reply_and_block(conn, message,
442
438
dbus_message_unref(message);
444
if (&error != NULL && dbus_error_is_set(&error))
440
if (dbus_error_is_set(&error))
447
443
dbus_message_iter_init(reply, &reply_iter);
477
static DBusHandlerResult filter_func(DBusConnection *connection, DBusMessage *message, void *user_data)
474
static DBusHandlerResult filter_func(DBusConnection *connection,
475
DBusMessage *message, void *user_data)
479
477
if (dbus_message_is_signal(message, "org.bluez.Adapter",
480
478
"DeviceFound")) {
493
491
} else if (dbus_message_is_signal(message, "org.bluez.Adapter",
494
492
"DeviceDisappeared")) {
497
495
dbus_message_get_args(message, NULL,
498
496
DBUS_TYPE_STRING, &bdaddr,
507
505
dbus_message_iter_init(message, &iter);
508
506
dbus_message_iter_get_basic(&iter, &name);
507
if (name == NULL || strcmp(name, "Discovering") != 0)
508
return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
509
509
dbus_message_iter_next(&iter);
510
510
dbus_message_iter_recurse(&iter, &value_iter);
511
511
dbus_message_iter_get_basic(&value_iter, &discovering);
537
537
conn = g_dbus_setup_bus(DBUS_BUS_SYSTEM, NULL, NULL);
538
538
if (conn == NULL)
541
541
dbus_error_init(&error);
542
542
hcid_exists = dbus_bus_name_has_owner(conn, "org.bluez", &error);
543
if (&error != NULL && dbus_error_is_set(&error))
543
if (dbus_error_is_set(&error))
546
546
if (!hcid_exists)
549
549
/* Get the default adapter */
550
550
message = dbus_message_new_method_call("org.bluez", "/",
561
561
dbus_message_unref(message);
563
if (&error != NULL && dbus_error_is_set(&error)) {
563
if (dbus_error_is_set(&error)) {
564
564
dbus_connection_unref(conn);
568
569
dbus_message_iter_init(reply, &reply_iter);
569
if (dbus_message_iter_get_arg_type(&reply_iter) != DBUS_TYPE_OBJECT_PATH) {
570
if (dbus_message_iter_get_arg_type(&reply_iter) !=
571
DBUS_TYPE_OBJECT_PATH) {
570
572
dbus_message_unref(reply);
571
573
dbus_connection_unref(conn);
611
613
loop = g_main_loop_new(NULL, TRUE);
612
614
g_main_loop_run(loop);
614
617
dbus_connection_unref(conn);
622
static gboolean print_ieee1284(const char *bdaddr)
624
DBusMessage *message, *reply, *adapter_reply;
625
DBusMessageIter iter;
626
char *object_path = NULL;
630
adapter_reply = NULL;
632
conn = g_dbus_setup_bus(DBUS_BUS_SYSTEM, NULL, NULL);
636
message = dbus_message_new_method_call("org.bluez", "/",
640
adapter_reply = dbus_connection_send_with_reply_and_block(conn,
643
dbus_message_unref(message);
645
if (dbus_message_get_args(adapter_reply, NULL,
646
DBUS_TYPE_OBJECT_PATH, &adapter,
647
DBUS_TYPE_INVALID) == FALSE)
650
message = dbus_message_new_method_call("org.bluez", adapter,
653
dbus_message_iter_init_append(message, &iter);
654
dbus_message_iter_append_basic(&iter, DBUS_TYPE_STRING, &bdaddr);
656
if (adapter_reply != NULL)
657
dbus_message_unref(adapter_reply);
659
reply = dbus_connection_send_with_reply_and_block(conn,
662
dbus_message_unref(message);
665
message = dbus_message_new_method_call("org.bluez", adapter,
668
dbus_message_iter_init_append(message, &iter);
669
dbus_message_iter_append_basic(&iter,
670
DBUS_TYPE_STRING, &bdaddr);
672
reply = dbus_connection_send_with_reply_and_block(conn,
675
dbus_message_unref(message);
681
if (dbus_message_get_args(reply, NULL,
682
DBUS_TYPE_OBJECT_PATH, &object_path,
683
DBUS_TYPE_INVALID) == FALSE)
686
id = device_get_ieee1284_id(adapter, object_path);
620
696
* Usage: printer-uri job-id user title copies options [file]
650
729
return CUPS_BACKEND_OK;
652
731
return CUPS_BACKEND_FAILED;
732
} else if (argc == 3 && strcmp(argv[1], "--get-deviceid") == 0) {
733
if (bachk(argv[2]) < 0) {
734
fprintf(stderr, "Invalid Bluetooth address '%s'\n",
736
return CUPS_BACKEND_FAILED;
738
if (print_ieee1284(argv[2]) == FALSE)
739
return CUPS_BACKEND_FAILED;
740
return CUPS_BACKEND_OK;
655
743
if (argc < 6 || argc > 7) {
656
fprintf(stderr, "Usage: bluetooth job-id user title copies options [file]\n");
744
fprintf(stderr, "Usage: bluetooth job-id user title copies"
745
" options [file]\n");
746
fprintf(stderr, " bluetooth --get-deviceid [bdaddr]\n");
657
747
return CUPS_BACKEND_FAILED;
686
776
sprintf(device, "%2.2X:%2.2X:%2.2X:%2.2X:%2.2X:%2.2X",
687
b[0], b[1], b[2], b[3], b[4], b[5]);
777
b[0], b[1], b[2], b[3], b[4], b[5]);
689
779
str2ba(device, &bdaddr);
706
796
cups_class = getenv("CLASS");
708
fprintf(stderr, "DEBUG: %s device %s service %s fd %d copies %d class %s\n",
799
"DEBUG: %s device %s service %s fd %d copies %d class %s\n",
709
800
argv[0], device, service, fd, copies,
710
cups_class ? cups_class : "(none)");
801
cups_class ? cups_class : "(none)");
712
803
fputs("STATE: +connecting-to-device\n", stderr);