--- include/openobex/obex_const.h | 18 +++++++++++++ lib/Makefile.am | 2 +- lib/usbobex.c | 54 +++++++++++++++++++++++++++++++++++++++++ lib/usbobex.h | 9 +++++++ 4 files changed, 82 insertions(+), 1 deletions(-)
diff --git a/include/openobex/obex_const.h b/include/openobex/obex_const.h index ea29195..df03a98 100644 --- a/include/openobex/obex_const.h +++ b/include/openobex/obex_const.h @@ -51,6 +51,22 @@ typedef struct { void * customdata; } obex_ctrans_t; +/** USB-specific OBEX service information + * provided by optional Service Identification Functional Descriptor + * (CDC WMC specification section 6.5.2.5) + */ +typedef struct { + /** Role bit mask: bit 0 is set if client, unset if server */ + uint8_t role; + /** Service UUID */ + uint8_t uuid[16]; + /** Service version */ + uint16_t version; + /** Set if the service provides/expects + * an OBEX Default Server (spec section 6.5.2.5.2) */ + int is_default_uuid; +} obex_usb_intf_service_t; + /** USB-specific OBEX interface information */ typedef struct { /** Manufacturer, e.g. Nokia */ @@ -67,6 +83,8 @@ typedef struct { char *data_interface_idle; /** Active data interface description, typically empty */ char *data_interface_active; + /** Service information descriptor, may be NULL if absent */ + obex_usb_intf_service_t *service; /** Internal information for the transport layer in the library */ struct obex_usb_intf_transport_t *intf; } obex_usb_intf_t; diff --git a/lib/Makefile.am b/lib/Makefile.am index c8f2309..f45e7da 100644 --- a/lib/Makefile.am +++ b/lib/Makefile.am @@ -22,7 +22,7 @@ libopenobex_la_CFLAGS = @CFLAG_VISIBILITY@ libopenobex_la_LDFLAGS = \ -no-undefined \ - -version-info 5:1:4 \ + -version-info 6:0:0 \ -export-symbols $(top_srcdir)/lib/obex.sym libopenobex_la_LIBADD = @USB_LIBS@ @EXTRA_LIBS@ diff --git a/lib/usbobex.c b/lib/usbobex.c index b067bac..b12131b 100644 --- a/lib/usbobex.c +++ b/lib/usbobex.c @@ -124,6 +124,7 @@ static int find_obex_data_interface(unsigned char *buffer, int buflen, struct us union_header = (struct cdc_union_desc *)buffer; break; case CDC_OBEX_TYPE: /* maybe check version */ + case CDC_OBEX_SERVICE_ID_TYPE: /* This one is handled later */ case CDC_HEADER_TYPE: break; /* for now we ignore it */ default: @@ -202,6 +203,8 @@ static struct obex_usb_intf_transport_t *check_intf(struct usb_device *dev, next->control_interface = dev->config[c].interface[i].altsetting[a].bInterfaceNumber; next->control_interface_description = dev->config[c].interface[i].altsetting[a].iInterface; next->control_setting = dev->config[c].interface[i].altsetting[a].bAlternateSetting; + next->extra_descriptors = buffer; + next->extra_descriptors_len = buflen; err = find_obex_data_interface(buffer, buflen, dev->config[c], next); if (err) @@ -219,6 +222,53 @@ static struct obex_usb_intf_transport_t *check_intf(struct usb_device *dev, } /* + * Helper function to usbobex_find_interfaces + */ +static void find_obex_service_descriptor(unsigned char *buffer, int buflen, obex_usb_intf_service_t **service) +{ + if (!buffer) { + DEBUG(2, "Weird descriptor references"); + return ; + } + while (buflen > 0) { + if (buffer[1] != USB_DT_CS_INTERFACE) { + DEBUG(2, "skipping garbage"); + goto next_desc; + } + switch (buffer[2]) { + case CDC_OBEX_SERVICE_ID_TYPE: /* we've found it */ + if (buflen < 22) /* Check descriptor size */ + DEBUG(2, "Invalid service id descriptor"); + else if (*service == NULL) { + *service = malloc(sizeof(obex_usb_intf_service_t)); + if (*service != NULL) { + const uint8_t default_uuid[16] = WMC_DEFAULT_OBEX_SERVER_UUID; + (*service)->role = buffer[3]; + memcpy((*service)->uuid, buffer+4, 16); + (*service)->version = (buffer[20]<<8)|(buffer[21]); + if (memcmp((*service)->uuid, default_uuid, 16) == 0 ) + (*service)->is_default_uuid = 1; + else + (*service)->is_default_uuid = 0; + } + } + break; + case CDC_OBEX_TYPE: /* maybe check version */ + case CDC_UNION_TYPE: + case CDC_HEADER_TYPE: + break; + default: + DEBUG(2, "Ignoring extra header, type %d, length %d", buffer[2], buffer[0]); + break; + } +next_desc: + buflen -= buffer[0]; + buffer += buffer[0]; + } +} + + +/* * Function usbobex_find_interfaces () * * Find available USBOBEX interfaces on the system @@ -285,6 +335,9 @@ int usbobex_find_interfaces(obex_interface_t **interfaces) current->data_interface_idle_description); get_intf_string(usb_handle, &intf_array[num].usb.data_interface_active, current->data_interface_active_description); + find_obex_service_descriptor(current->extra_descriptors, + current->extra_descriptors_len, + &intf_array[num].usb.service); usb_close(usb_handle); current = current->next; num++; } @@ -320,6 +373,7 @@ void usbobex_free_interfaces(int num, obex_interface_t *intf) free(intf[i].usb.control_interface); free(intf[i].usb.data_interface_idle); free(intf[i].usb.data_interface_active); + free(intf[i].usb.service); free(intf[i].usb.intf); } diff --git a/lib/usbobex.h b/lib/usbobex.h index d0e1dfe..efd7a38 100644 --- a/lib/usbobex.h +++ b/lib/usbobex.h @@ -37,6 +37,8 @@ struct obex_usb_intf_transport_t { * If non-zero, use usb_get_string_simple() from * libusb to retrieve human-readable description */ + unsigned char *extra_descriptors; /* Extra master interface descriptors */ + int extra_descriptors_len; /* Length of extra descriptors */ int data_interface; /* OBEX data/slave interface */ int data_idle_setting; /* OBEX data/slave idle setting */ int data_interface_idle_description; /* OBEX data/slave interface string descriptor number @@ -74,11 +76,18 @@ struct cdc_union_desc { #define CDC_UNION_TYPE 0x06 #define CDC_COUNTRY_TYPE 0x07 #define CDC_OBEX_TYPE 0x15 +#define CDC_OBEX_SERVICE_ID_TYPE 0x19 /* Interface descriptor */ #define USB_DT_CS_INTERFACE 0x24 #define CDC_DATA_INTERFACE_TYPE 0x0a +#define WMC_DEFAULT_OBEX_SERVER_UUID \ +{ 0x02, 0xae, 0xb3, 0x20, \ +0xf6, 0x49, 0x11, 0xda, \ +0x97, 0x4d, 0x08, 0x00, \ +0x20, 0x0c, 0x9a, 0x66 } + #define USB_MAX_STRING_SIZE 256 #define USB_OBEX_TIMEOUT 10000 /* 10 seconds */ -- 1.6.0.6 ------------------------------------------------------------------------------ Crystal Reports - New Free Runtime and 30 Day Trial Check out the new simplified licensing option that enables unlimited royalty-free distribution of the report engine for externally facing server and web deployment. http://p.sf.net/sfu/businessobjects _______________________________________________ Openobex-users mailing list Openobex-users@lists.sourceforge.net http://lists.sourceforge.net/lists/listinfo/openobex-users