[PATCH 1/2 v1] ms-firmware-id: add support for the Microsoft Firmware ID service

Ben Chan benchan at chromium.org
Wed Feb 26 21:36:55 PST 2014


---
 data/Makefile.am                            |  3 +-
 data/mbim-service-ms-firmware-id.json       | 13 ++++++++
 src/libmbim-glib/generated/Makefile.am      | 18 ++++++++--
 src/libmbim-glib/libmbim-glib.h             |  1 +
 src/libmbim-glib/mbim-cid.c                 | 22 +++++++++---
 src/libmbim-glib/mbim-cid.h                 | 12 +++++++
 src/libmbim-glib/mbim-message.c             |  2 +-
 src/libmbim-glib/mbim-uuid.c                | 15 ++++++++-
 src/libmbim-glib/mbim-uuid.h                | 11 ++++++
 src/libmbim-glib/test/test-cid.c            | 23 +++++++++----
 src/libmbim-glib/test/test-message-parser.c | 52 +++++++++++++++++++++++++++++
 src/libmbim-glib/test/test-uuid.c           | 21 ++++++++----
 12 files changed, 169 insertions(+), 24 deletions(-)
 create mode 100644 data/mbim-service-ms-firmware-id.json

diff --git a/data/Makefile.am b/data/Makefile.am
index 091c2e2..0637465 100644
--- a/data/Makefile.am
+++ b/data/Makefile.am
@@ -7,4 +7,5 @@ EXTRA_DIST = \
 	mbim-service-auth.json \
 	mbim-service-phonebook.json \
 	mbim-service-stk.json \
-	mbim-service-dss.json
+	mbim-service-dss.json \
+	mbim-service-ms-firmware-id.json
diff --git a/data/mbim-service-ms-firmware-id.json b/data/mbim-service-ms-firmware-id.json
new file mode 100644
index 0000000..aae7475
--- /dev/null
+++ b/data/mbim-service-ms-firmware-id.json
@@ -0,0 +1,13 @@
+[
+  // *********************************************************************************
+  { "type" : "Service",
+    "name" : "MS Firmware ID" },
+
+  // *********************************************************************************
+  { "name"     : "Get",
+    "service"  : "MS Firmware ID",
+    "type"     : "Command",
+    "query"    : [],
+    "response" : [ { "name"   : "FirmwareId",
+                     "format" : "uuid" } ] }
+]
diff --git a/src/libmbim-glib/generated/Makefile.am b/src/libmbim-glib/generated/Makefile.am
index 9db1c3e..c351043 100644
--- a/src/libmbim-glib/generated/Makefile.am
+++ b/src/libmbim-glib/generated/Makefile.am
@@ -9,7 +9,8 @@ GENERATED_H = \
 	mbim-auth.h \
 	mbim-phonebook.h \
 	mbim-stk.h \
-	mbim-dss.h
+	mbim-dss.h \
+	mbim-ms-firmware-id.h
 
 GENERATED_C = \
 	mbim-error-types.c \
@@ -21,7 +22,8 @@ GENERATED_C = \
 	mbim-auth.c \
 	mbim-phonebook.c \
 	mbim-stk.c \
-	mbim-dss.c
+	mbim-dss.c \
+	mbim-ms-firmware-id.c
 
 GENERATED_SECTIONS = \
 	mbim-basic-connect.sections \
@@ -30,7 +32,8 @@ GENERATED_SECTIONS = \
 	mbim-auth.sections \
 	mbim-phonebook.sections \
 	mbim-stk.sections \
-	mbim-dss.sections
+	mbim-dss.sections \
+	mbim-ms-firmware-id.sections
 
 # Error types
 mbim-error-types.h: $(top_srcdir)/src/libmbim-glib/mbim-errors.h $(top_srcdir)/build-aux/templates/mbim-error-types-template.h
@@ -134,6 +137,15 @@ mbim-dss.h mbim-dss.c mbim-dss.sections: $(top_srcdir)/data/mbim-service-dss.jso
 			--input $(top_srcdir)/data/mbim-service-dss.json \
 			--output mbim-dss
 
+# Microsoft Firmware ID service
+mbim-ms-firmware-id.h mbim-ms-firmware-id.c mbim-ms-firmware-id.sections: $(top_srcdir)/data/mbim-service-ms-firmware-id.json $(top_srcdir)/build-aux/mbim-codegen/*.py $(top_srcdir)/build-aux/mbim-codegen/mbim-codegen
+	$(AM_V_GEN)  \
+		rm -f mbim-ms-firmware-id.h && \
+		rm -f mbim-ms-firmware-id.c && \
+		$(top_srcdir)/build-aux/mbim-codegen/mbim-codegen \
+			--input $(top_srcdir)/data/mbim-service-ms-firmware-id.json \
+			--output mbim-ms-firmware-id
+
 BUILT_SOURCES = $(GENERATED_H) $(GENERATED_C)
 
 nodist_libmbim_glib_generated_la_SOURCES = \
diff --git a/src/libmbim-glib/libmbim-glib.h b/src/libmbim-glib/libmbim-glib.h
index 05cd71c..12089b2 100644
--- a/src/libmbim-glib/libmbim-glib.h
+++ b/src/libmbim-glib/libmbim-glib.h
@@ -45,5 +45,6 @@
 #include "mbim-phonebook.h"
 #include "mbim-stk.h"
 #include "mbim-dss.h"
+#include "mbim-ms-firmware-id.h"
 
 #endif /* _LIBMBIM_GLIB_H_ */
diff --git a/src/libmbim-glib/mbim-cid.c b/src/libmbim-glib/mbim-cid.c
index de86c93..fb79310 100644
--- a/src/libmbim-glib/mbim-cid.c
+++ b/src/libmbim-glib/mbim-cid.c
@@ -113,6 +113,12 @@ static const CidConfig cid_dss_config [MBIM_CID_DSS_LAST] = {
     { TRUE,  FALSE, FALSE }, /* MBIM_CID_DSS_CONNECT */
 };
 
+/* Note: index of the array is CID-1 */
+#define MBIM_CID_MS_FIRMWARE_ID_LAST MBIM_CID_MS_FIRMWARE_ID_GET
+static const CidConfig cid_ms_firmware_id_config [MBIM_CID_MS_FIRMWARE_ID_LAST] = {
+    { FALSE, TRUE,  FALSE }, /* MBIM_CID_MS_FIRMWARE_ID_GET */
+};
+
 /**
  * mbim_cid_can_set:
  * @service: a #MbimService.
@@ -130,7 +136,7 @@ mbim_cid_can_set (MbimService service,
     g_return_val_if_fail (cid > 0, FALSE);
     /* Known service required */
     g_return_val_if_fail (service > MBIM_SERVICE_INVALID, FALSE);
-    g_return_val_if_fail (service <= MBIM_SERVICE_DSS, FALSE);
+    g_return_val_if_fail (service <= MBIM_SERVICE_MS_FIRMWARE_ID, FALSE);
 
     switch (service) {
     case MBIM_SERVICE_BASIC_CONNECT:
@@ -147,6 +153,8 @@ mbim_cid_can_set (MbimService service,
         return cid_auth_config[cid - 1].set;
     case MBIM_SERVICE_DSS:
         return cid_dss_config[cid - 1].set;
+    case MBIM_SERVICE_MS_FIRMWARE_ID:
+        return cid_ms_firmware_id_config[cid - 1].set;
     default:
         g_assert_not_reached ();
         return FALSE;
@@ -170,7 +178,7 @@ mbim_cid_can_query (MbimService service,
     g_return_val_if_fail (cid > 0, FALSE);
     /* Known service required */
     g_return_val_if_fail (service > MBIM_SERVICE_INVALID, FALSE);
-    g_return_val_if_fail (service <= MBIM_SERVICE_DSS, FALSE);
+    g_return_val_if_fail (service <= MBIM_SERVICE_MS_FIRMWARE_ID, FALSE);
 
     switch (service) {
     case MBIM_SERVICE_BASIC_CONNECT:
@@ -187,6 +195,8 @@ mbim_cid_can_query (MbimService service,
         return cid_auth_config[cid - 1].query;
     case MBIM_SERVICE_DSS:
         return cid_dss_config[cid - 1].query;
+    case MBIM_SERVICE_MS_FIRMWARE_ID:
+        return cid_ms_firmware_id_config[cid - 1].query;
     default:
         g_assert_not_reached ();
         return FALSE;
@@ -210,7 +220,7 @@ mbim_cid_can_notify (MbimService service,
     g_return_val_if_fail (cid > 0, FALSE);
     /* Known service required */
     g_return_val_if_fail (service > MBIM_SERVICE_INVALID, FALSE);
-    g_return_val_if_fail (service <= MBIM_SERVICE_DSS, FALSE);
+    g_return_val_if_fail (service <= MBIM_SERVICE_MS_FIRMWARE_ID, FALSE);
 
     switch (service) {
     case MBIM_SERVICE_BASIC_CONNECT:
@@ -227,6 +237,8 @@ mbim_cid_can_notify (MbimService service,
         return cid_auth_config[cid - 1].notify;
     case MBIM_SERVICE_DSS:
         return cid_dss_config[cid - 1].notify;
+    case MBIM_SERVICE_MS_FIRMWARE_ID:
+        return cid_ms_firmware_id_config[cid - 1].notify;
     default:
         g_assert_not_reached ();
         return FALSE;
@@ -251,7 +263,7 @@ mbim_cid_get_printable (MbimService service,
     g_return_val_if_fail (cid > 0, NULL);
     /* Known service required */
     g_return_val_if_fail (service > MBIM_SERVICE_INVALID, NULL);
-    g_return_val_if_fail (service <= MBIM_SERVICE_DSS, NULL);
+    g_return_val_if_fail (service <= MBIM_SERVICE_MS_FIRMWARE_ID, NULL);
 
     switch (service) {
     case MBIM_SERVICE_BASIC_CONNECT:
@@ -268,6 +280,8 @@ mbim_cid_get_printable (MbimService service,
         return mbim_cid_auth_get_string (cid);
     case MBIM_SERVICE_DSS:
         return mbim_cid_dss_get_string (cid);
+    case MBIM_SERVICE_MS_FIRMWARE_ID:
+        return mbim_cid_ms_firmware_id_get_string (cid);
     default:
         g_assert_not_reached ();
         return FALSE;
diff --git a/src/libmbim-glib/mbim-cid.h b/src/libmbim-glib/mbim-cid.h
index 031baa0..d3d2ee9 100644
--- a/src/libmbim-glib/mbim-cid.h
+++ b/src/libmbim-glib/mbim-cid.h
@@ -183,6 +183,18 @@ typedef enum {
     MBIM_CID_DSS_CONNECT = 1
 } MbimCidDss;
 
+/**
+ * MbimCidMsFirmwareId:
+ * @MBIM_CID_MS_FIRMWARE_ID_UNKNOWN: Unknown command.
+ * @MBIM_CID_MS_FIRMWARE_ID_GET: Get Firmware ID.
+ *
+ * MBIM commands in the %MBIM_SERVICE_MS_FIRMWARE_ID service.
+ */
+typedef enum {
+    MBIM_CID_MS_FIRMWARE_ID_UNKNOWN = 0,
+    MBIM_CID_MS_FIRMWARE_ID_GET     = 1
+} MbimCidMsFirmwareId;
+
 /* Command helpers */
 
 gboolean     mbim_cid_can_set       (MbimService service,
diff --git a/src/libmbim-glib/mbim-message.c b/src/libmbim-glib/mbim-message.c
index deb2c52..3089ed1 100644
--- a/src/libmbim-glib/mbim-message.c
+++ b/src/libmbim-glib/mbim-message.c
@@ -1738,7 +1738,7 @@ mbim_message_command_new (guint32                transaction_id,
 
     /* Known service required */
     g_return_val_if_fail (service > MBIM_SERVICE_INVALID, FALSE);
-    g_return_val_if_fail (service <= MBIM_SERVICE_DSS, FALSE);
+    g_return_val_if_fail (service <= MBIM_SERVICE_MS_FIRMWARE_ID, FALSE);
     service_id = mbim_uuid_from_service (service);
 
     self = _mbim_message_allocate (MBIM_MESSAGE_TYPE_COMMAND,
diff --git a/src/libmbim-glib/mbim-uuid.c b/src/libmbim-glib/mbim-uuid.c
index f25cf2f..82ad609 100644
--- a/src/libmbim-glib/mbim-uuid.c
+++ b/src/libmbim-glib/mbim-uuid.c
@@ -143,6 +143,14 @@ static const MbimUuid uuid_dss = {
     .e = { 0x6e, 0x0d, 0x58, 0x3c, 0x4d, 0x0e }
 };
 
+static const MbimUuid uuid_ms_firmware_id = {
+    .a = { 0xe9, 0xf7, 0xde, 0xa2 },
+    .b = { 0xfe, 0xaf },
+    .c = { 0x40, 0x09 },
+    .d = { 0x93, 0xce },
+    .e = { 0x90, 0xa3, 0x69, 0x41, 0x03, 0xb6 }
+};
+
 /**
  * mbim_uuid_from_service:
  * @service: a #MbimService.
@@ -154,7 +162,7 @@ static const MbimUuid uuid_dss = {
 const MbimUuid *
 mbim_uuid_from_service (MbimService service)
 {
-    g_return_val_if_fail (service >= MBIM_SERVICE_INVALID && service <= MBIM_SERVICE_DSS,
+    g_return_val_if_fail (service >= MBIM_SERVICE_INVALID && service <= MBIM_SERVICE_MS_FIRMWARE_ID,
                           &uuid_invalid);
 
     switch (service) {
@@ -174,6 +182,8 @@ mbim_uuid_from_service (MbimService service)
         return &uuid_auth;
     case MBIM_SERVICE_DSS:
         return &uuid_dss;
+    case MBIM_SERVICE_MS_FIRMWARE_ID:
+        return &uuid_ms_firmware_id;
     default:
         g_assert_not_reached ();
     }
@@ -211,6 +221,9 @@ mbim_uuid_to_service (const MbimUuid *uuid)
     if (mbim_uuid_cmp (uuid, &uuid_dss))
         return MBIM_SERVICE_DSS;
 
+    if (mbim_uuid_cmp (uuid, &uuid_ms_firmware_id))
+        return MBIM_SERVICE_MS_FIRMWARE_ID;
+
     return MBIM_SERVICE_INVALID;
 }
 
diff --git a/src/libmbim-glib/mbim-uuid.h b/src/libmbim-glib/mbim-uuid.h
index 0676861..9befdf0 100644
--- a/src/libmbim-glib/mbim-uuid.h
+++ b/src/libmbim-glib/mbim-uuid.h
@@ -66,6 +66,7 @@ gchar    *mbim_uuid_get_printable (const MbimUuid *uuid);
  * @MBIM_SERVICE_STK: SIM toolkit service.
  * @MBIM_SERVICE_AUTH: Authentication service.
  * @MBIM_SERVICE_DSS: Device Service Stream service.
+ * @MBIM_SERVICE_MS_FIRMWARE_ID: Microsoft Firmware ID service.
  *
  * Enumeration of the generic MBIM services.
  */
@@ -78,6 +79,7 @@ typedef enum {
     MBIM_SERVICE_STK           = 5,
     MBIM_SERVICE_AUTH          = 6,
     MBIM_SERVICE_DSS           = 7,
+    MBIM_SERVICE_MS_FIRMWARE_ID       = 8,
 } MbimService;
 
 /**
@@ -152,6 +154,15 @@ typedef enum {
  */
 #define MBIM_UUID_DSS mbim_uuid_from_service (MBIM_SERVICE_DSS)
 
+/**
+ * MBIM_UUID_MS_FIRMWARE_ID:
+ *
+ * Get the UUID of the %MBIM_SERVICE_MS_FIRMWARE_ID service.
+ *
+ * Returns: (transfer none): a #MbimUuid.
+ */
+#define MBIM_UUID_MS_FIRMWARE_ID mbim_uuid_from_service (MBIM_SERVICE_MS_FIRMWARE_ID)
+
 /* To/From service */
 const MbimUuid *mbim_uuid_from_service  (MbimService     service);
 MbimService     mbim_uuid_to_service    (const MbimUuid *uuid);
diff --git a/src/libmbim-glib/test/test-cid.c b/src/libmbim-glib/test/test-cid.c
index ffb6837..f78a5be 100644
--- a/src/libmbim-glib/test/test-cid.c
+++ b/src/libmbim-glib/test/test-cid.c
@@ -105,17 +105,26 @@ test_cid_dss (void)
                  TRUE, FALSE, FALSE);
 }
 
+static void
+test_cid_ms_firmware_id (void)
+{
+    test_common (MBIM_SERVICE_MS_FIRMWARE_ID,
+                 MBIM_CID_MS_FIRMWARE_ID_GET,
+                 FALSE, TRUE, FALSE);
+}
+
 int main (int argc, char **argv)
 {
     g_test_init (&argc, &argv, NULL);
 
-    g_test_add_func ("/libmbim-glib/cid/basic-connect", test_cid_basic_connect);
-    g_test_add_func ("/libmbim-glib/cid/sms",           test_cid_sms);
-    g_test_add_func ("/libmbim-glib/cid/ussd",          test_cid_ussd);
-    g_test_add_func ("/libmbim-glib/cid/phonebook",     test_cid_phonebook);
-    g_test_add_func ("/libmbim-glib/cid/stk",           test_cid_stk);
-    g_test_add_func ("/libmbim-glib/cid/auth",          test_cid_auth);
-    g_test_add_func ("/libmbim-glib/cid/dss",           test_cid_dss);
+    g_test_add_func ("/libmbim-glib/cid/basic-connect",  test_cid_basic_connect);
+    g_test_add_func ("/libmbim-glib/cid/sms",            test_cid_sms);
+    g_test_add_func ("/libmbim-glib/cid/ussd",           test_cid_ussd);
+    g_test_add_func ("/libmbim-glib/cid/phonebook",      test_cid_phonebook);
+    g_test_add_func ("/libmbim-glib/cid/stk",            test_cid_stk);
+    g_test_add_func ("/libmbim-glib/cid/auth",           test_cid_auth);
+    g_test_add_func ("/libmbim-glib/cid/dss",            test_cid_dss);
+    g_test_add_func ("/libmbim-glib/cid/ms-firmware-id", test_cid_ms_firmware_id);
 
     return g_test_run ();
 }
diff --git a/src/libmbim-glib/test/test-message-parser.c b/src/libmbim-glib/test/test-message-parser.c
index 1f33805..8df8105 100644
--- a/src/libmbim-glib/test/test-message-parser.c
+++ b/src/libmbim-glib/test/test-message-parser.c
@@ -21,6 +21,7 @@
 #include "mbim-ussd.h"
 #include "mbim-auth.h"
 #include "mbim-stk.h"
+#include "mbim-ms-firmware-id.h"
 #include "mbim-message.h"
 #include "mbim-cid.h"
 #include "mbim-utils.h"
@@ -1561,6 +1562,56 @@ test_message_parser_basic_connect_ip_packet_filters_two (void)
     mbim_message_unref (response);
 }
 
+static void
+test_message_parser_ms_firmware_id_get (void)
+{
+    const MbimUuid *firmware_id;
+    MbimMessage *response;
+    GError *error = NULL;
+    const guint8 buffer [] = {
+        /* header */
+        0x03, 0x00, 0x00, 0x80, /* type */
+        0x40, 0x00, 0x00, 0x00, /* length */
+        0x02, 0x00, 0x00, 0x00, /* transaction id */
+        /* fragment header */
+        0x01, 0x00, 0x00, 0x00, /* total */
+        0x00, 0x00, 0x00, 0x00, /* current */
+        /* command_done_message */
+        0xE9, 0xF7, 0xDE, 0xA2, /* service id */
+        0xFE, 0xAF, 0x40, 0x09,
+        0x93, 0xCE, 0x90, 0xA3,
+        0x69, 0x41, 0x03, 0xB6,
+        0x01, 0x00, 0x00, 0x00, /* command id */
+        0x00, 0x00, 0x00, 0x00, /* status code */
+        0x10, 0x00, 0x00, 0x00, /* buffer length */
+        /* information buffer */
+        0x00, 0x11, 0x22, 0x33, /* firmware id */
+        0x44, 0x55, 0x66, 0x77,
+        0x88, 0x99, 0xAA, 0xBB,
+        0xCC, 0xDD, 0xEE, 0xFF  };
+
+    const MbimUuid expected_firmware_id = {
+        .a = { 0x00, 0x11, 0x22, 0x33 },
+        .b = { 0x44, 0x55 },
+        .c = { 0x66, 0x77 },
+        .d = { 0x88, 0x99 },
+        .e = { 0xAA, 0xBB, 0xCC, 0xDD, 0xEE, 0xFF }
+    };
+
+    response = mbim_message_new (buffer, sizeof (buffer));
+
+    g_assert (mbim_message_ms_firmware_id_get_response_parse (
+                  response,
+                  &firmware_id,
+                  &error));
+
+    g_assert_no_error (error);
+
+    g_assert (mbim_uuid_cmp (firmware_id, &expected_firmware_id));
+
+    mbim_message_unref (response);
+}
+
 int main (int argc, char **argv)
 {
     g_test_init (&argc, &argv, NULL);
@@ -1582,6 +1633,7 @@ int main (int argc, char **argv)
     g_test_add_func ("/libmbim-glib/message/parser/basic-connect/ip-packet-filters/none", test_message_parser_basic_connect_ip_packet_filters_none);
     g_test_add_func ("/libmbim-glib/message/parser/basic-connect/ip-packet-filters/one", test_message_parser_basic_connect_ip_packet_filters_one);
     g_test_add_func ("/libmbim-glib/message/parser/basic-connect/ip-packet-filters/two", test_message_parser_basic_connect_ip_packet_filters_two);
+    g_test_add_func ("/libmbim-glib/message/parser/ms-firmware-id/get", test_message_parser_ms_firmware_id_get);
 
     return g_test_run ();
 }
diff --git a/src/libmbim-glib/test/test-uuid.c b/src/libmbim-glib/test/test-uuid.c
index 010b0e9..8b0667c 100644
--- a/src/libmbim-glib/test/test-uuid.c
+++ b/src/libmbim-glib/test/test-uuid.c
@@ -77,17 +77,24 @@ test_uuid_dss (void)
                           "c08a26dd-7718-4382-8482-6e0d583c4d0e");
 }
 
+static void
+test_uuid_ms_firmware_id (void)
+{
+    compare_uuid_strings (MBIM_UUID_MS_FIRMWARE_ID,
+                          "e9f7dea2-feaf-4009-93ce-90a3694103b6");
+}
 int main (int argc, char **argv)
 {
     g_test_init (&argc, &argv, NULL);
 
-    g_test_add_func ("/libmbim-glib/uuid/basic-connect", test_uuid_basic_connect);
-    g_test_add_func ("/libmbim-glib/uuid/sms",           test_uuid_sms);
-    g_test_add_func ("/libmbim-glib/uuid/ussd",          test_uuid_ussd);
-    g_test_add_func ("/libmbim-glib/uuid/phonebook",     test_uuid_phonebook);
-    g_test_add_func ("/libmbim-glib/uuid/stk",           test_uuid_stk);
-    g_test_add_func ("/libmbim-glib/uuid/auth",          test_uuid_auth);
-    g_test_add_func ("/libmbim-glib/uuid/dss",           test_uuid_dss);
+    g_test_add_func ("/libmbim-glib/uuid/basic-connect",  test_uuid_basic_connect);
+    g_test_add_func ("/libmbim-glib/uuid/sms",            test_uuid_sms);
+    g_test_add_func ("/libmbim-glib/uuid/ussd",           test_uuid_ussd);
+    g_test_add_func ("/libmbim-glib/uuid/phonebook",      test_uuid_phonebook);
+    g_test_add_func ("/libmbim-glib/uuid/stk",            test_uuid_stk);
+    g_test_add_func ("/libmbim-glib/uuid/auth",           test_uuid_auth);
+    g_test_add_func ("/libmbim-glib/uuid/dss",            test_uuid_dss);
+    g_test_add_func ("/libmbim-glib/uuid/ms-firmware-id", test_uuid_ms_firmware_id);
 
     return g_test_run ();
 }
-- 
1.9.0.rc1.175.g0b1dcb5



More information about the libmbim-devel mailing list