---
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
[email protected]
http://lists.sourceforge.net/lists/listinfo/openobex-users