?? main.c
字號:
struct cups_device *device = (struct cups_device *) l->data; if (strcmp(device->bdaddr, bdaddr) == 0) { g_free(device->name); g_free(device->bdaddr); g_free(device); device_list = g_slist_delete_link(device_list, l); return; } }}static gboolean list_known_printers(const char *adapter){ DBusMessageIter reply_iter, iter_array; DBusError error; DBusMessage *message, *reply; message = dbus_message_new_method_call ("org.bluez", adapter, "org.bluez.Adapter", "ListRemoteDevices"); if (message == NULL) return FALSE; dbus_error_init(&error); reply = dbus_connection_send_with_reply_and_block(conn, message, -1, &error); dbus_message_unref(message); if (&error != NULL && dbus_error_is_set(&error)) return FALSE; dbus_message_iter_init(reply, &reply_iter); if (dbus_message_iter_get_arg_type(&reply_iter) != DBUS_TYPE_ARRAY) { dbus_message_unref(reply); return FALSE; } dbus_message_iter_recurse(&reply_iter, &iter_array); while (dbus_message_iter_get_arg_type(&iter_array) == DBUS_TYPE_STRING) { char *bdaddr; dbus_message_iter_get_basic(&iter_array, &bdaddr); if (device_is_printer(adapter, bdaddr)) { char *name, *id; name = device_get_name(adapter, bdaddr); id = device_get_ieee1284_id(adapter, bdaddr); add_device_to_list(name, bdaddr, id); g_free(name); g_free(id); } dbus_message_iter_next(&iter_array); } dbus_message_unref(reply); return FALSE;}static DBusHandlerResult filter_func(DBusConnection *connection, DBusMessage *message, void *user_data){ const char *adapter; if (dbus_message_is_signal(message, "org.bluez.Adapter", "RemoteDeviceFound")) { char *bdaddr; guint class; int rssi; dbus_message_get_args(message, NULL, DBUS_TYPE_STRING, &bdaddr, DBUS_TYPE_UINT32, &class, DBUS_TYPE_INT32, &rssi, DBUS_TYPE_INVALID); adapter = dbus_message_get_path(message); remote_device_found(adapter, bdaddr, class, rssi); } else if (dbus_message_is_signal(message, "org.bluez.Adapter", "RemoteNameUpdated")) { char *bdaddr, *name; dbus_message_get_args(message, NULL, DBUS_TYPE_STRING, &bdaddr, DBUS_TYPE_STRING, &name, DBUS_TYPE_INVALID); remote_name_updated(bdaddr, name); } else if (dbus_message_is_signal(message, "org.bluez.Adapter", "RemoteDeviceDisappeared")) { char *bdaddr; dbus_message_get_args(message, NULL, DBUS_TYPE_STRING, &bdaddr, DBUS_TYPE_INVALID); remote_device_disappeared(bdaddr); } else if (dbus_message_is_signal(message, "org.bluez.Adapter", "DiscoveryCompleted")) { discovery_completed(); } return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;}static void list_printers(void){ /* 1. Connect to the bus * 2. Get the manager * 3. Get the default adapter * 4. Get a list of devices * 5. Get the class of each device * 6. Print the details from each printer device */ DBusError error; dbus_bool_t hcid_exists; DBusMessage *reply, *message; DBusMessageIter reply_iter; char *adapter, *match; guint len; conn = init_dbus(NULL, NULL, NULL); if (conn == NULL) return; dbus_error_init(&error); hcid_exists = dbus_bus_name_has_owner(conn, "org.bluez", &error); if (&error != NULL && dbus_error_is_set(&error)) return; if (!hcid_exists) return; /* Get the default adapter */ message = dbus_message_new_method_call("org.bluez", "/org/bluez", "org.bluez.Manager", "DefaultAdapter"); if (message == NULL) { dbus_connection_unref(conn); return; } reply = dbus_connection_send_with_reply_and_block(conn, message, -1, &error); dbus_message_unref(message); if (&error != NULL && dbus_error_is_set(&error)) { dbus_connection_unref(conn); return; } dbus_message_iter_init(reply, &reply_iter); if (dbus_message_iter_get_arg_type(&reply_iter) != DBUS_TYPE_STRING) { dbus_message_unref(reply); dbus_connection_unref(conn); return; } dbus_message_iter_get_basic(&reply_iter, &adapter); adapter = g_strdup(adapter); dbus_message_unref(reply); if (!dbus_connection_add_filter(conn, filter_func, adapter, g_free)) { g_free(adapter); dbus_connection_unref(conn); return; }#define MATCH_FORMAT \ "type='signal'," \ "interface='org.bluez.Adapter'," \ "sender='org.bluez'," \ "path='%s'" len = strlen(MATCH_FORMAT) - 2 + strlen(adapter) + 1; match = g_malloc(len); snprintf(match, len, "type='signal'," "interface='org.bluez.Adapter'," "sender='org.bluez'," "path='%s'", adapter); dbus_bus_add_match(conn, match, &error); g_free(match); message = dbus_message_new_method_call("org.bluez", adapter, "org.bluez.Adapter", "DiscoverDevicesWithoutNameResolving"); if (!dbus_connection_send_with_reply(conn, message, NULL, -1)) { dbus_message_unref(message); dbus_connection_unref(conn); g_free(adapter); return; } dbus_message_unref(message); /* Also add the the recent devices */ g_timeout_add(0, (GSourceFunc) list_known_printers, adapter); loop = g_main_loop_new(NULL, TRUE); g_main_loop_run(loop); dbus_connection_unref(conn);}/* * Usage: printer-uri job-id user title copies options [file] * */int main(int argc, char *argv[]){ sdp_session_t *sdp; bdaddr_t bdaddr; unsigned short ctrl_psm, data_psm; uint8_t channel, b[6]; char *ptr, str[3], device[18], service[12]; int i, err, fd, copies, proto; /* Make sure status messages are not buffered */ setbuf(stderr, NULL); /* Ignore SIGPIPE signals */#ifdef HAVE_SIGSET sigset(SIGPIPE, SIG_IGN);#elif defined(HAVE_SIGACTION) memset(&action, 0, sizeof(action)); action.sa_handler = SIG_IGN; sigaction(SIGPIPE, &action, NULL);#else signal(SIGPIPE, SIG_IGN);#endif /* HAVE_SIGSET */ if (argc == 1) { list_printers(); return 0; } if (argc < 6 || argc > 7) { fprintf(stderr, "Usage: bluetooth job-id user title copies options [file]\n"); return 1; } if (argc == 6) { fd = 0; copies = 1; } else { if ((fd = open(argv[6], O_RDONLY)) < 0) { perror("ERROR: Unable to open print file"); return 1; } copies = atoi(argv[4]); } if (strncasecmp(argv[0], "bluetooth://", 12)) { fprintf(stderr, "ERROR: No device URI found\n"); return 1; } ptr = argv[0] + 12; for (i = 0; i < 6; i++) { strncpy(str, ptr, 2); b[i] = (uint8_t) strtol(str, NULL, 16); ptr += 2; } sprintf(device, "%2.2X:%2.2X:%2.2X:%2.2X:%2.2X:%2.2X", b[0], b[1], b[2], b[3], b[4], b[5]); str2ba(device, &bdaddr); ptr = strchr(ptr, '/'); if (ptr) { strncpy(service, ptr + 1, 12); if (!strncasecmp(ptr + 1, "spp", 3)) proto = 1; else if (!strncasecmp(ptr + 1, "hcrp", 4)) proto = 2; else proto = 0; } else { strcpy(service, "auto"); proto = 0; } fprintf(stderr, "DEBUG: %s device %s service %s fd %d copies %d\n", argv[0], device, service, fd, copies); sdp = sdp_connect(BDADDR_ANY, &bdaddr, SDP_RETRY_IF_BUSY); if (!sdp) { fprintf(stderr, "ERROR: Can't open Bluetooth connection\n"); return 1; } switch (proto) { case 1: err = sdp_search_spp(sdp, &channel); break; case 2: err = sdp_search_hcrp(sdp, &ctrl_psm, &data_psm); break; default: proto = 2; err = sdp_search_hcrp(sdp, &ctrl_psm, &data_psm); if (err) { proto = 1; err = sdp_search_spp(sdp, &channel); } break; } sdp_close(sdp); if (err) { fprintf(stderr, "ERROR: Can't get service information\n"); return 1; } switch (proto) { case 1: err = spp_print(BDADDR_ANY, &bdaddr, channel, fd, copies); break; case 2: err = hcrp_print(BDADDR_ANY, &bdaddr, ctrl_psm, data_psm, fd, copies); break; default: err = 1; fprintf(stderr, "ERROR: Unsupported protocol\n"); break; } if (fd != 0) close(fd); if (!err) fprintf(stderr, "INFO: Ready to print\n"); return err;}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -