aboutsummaryrefslogtreecommitdiff
path: root/src/mm-qcdm-serial-port.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/mm-qcdm-serial-port.c')
-rw-r--r--src/mm-qcdm-serial-port.c32
1 files changed, 25 insertions, 7 deletions
diff --git a/src/mm-qcdm-serial-port.c b/src/mm-qcdm-serial-port.c
index 14ccf561..e79dbea2 100644
--- a/src/mm-qcdm-serial-port.c
+++ b/src/mm-qcdm-serial-port.c
@@ -53,7 +53,7 @@ parse_response (MMSerialPort *port, GByteArray *response, GError **error)
return FALSE;
}
-static void
+static gsize
handle_response (MMSerialPort *port,
GByteArray *response,
GError *error,
@@ -62,18 +62,34 @@ handle_response (MMSerialPort *port,
{
MMQcdmSerialResponseFn response_callback = (MMQcdmSerialResponseFn) callback;
GByteArray *unescaped = NULL;
- gboolean escaping = FALSE;
GError *dm_error = NULL;
+ gsize used = 0;
+
+ /* Ignore empty frames */
+ if (!response->len > 0 && response->data[0] == 0x7E)
+ return 1;
if (!error) {
- unescaped = g_byte_array_sized_new (response->len);
- unescaped->len = dm_unescape ((const char *) response->data, response->len,
- (char *) unescaped->data, unescaped->len,
- &escaping);
- if (unescaped->len == 0) {
+ gboolean more = FALSE, success;
+
+ /* FIXME: don't munge around with byte array internals */
+ unescaped = g_byte_array_sized_new (1024);
+ success = dm_decapsulate_buffer ((const char *) response->data,
+ response->len,
+ (char *) unescaped->data,
+ sizeof (1024),
+ &unescaped->len,
+ &used,
+ &more);
+ if (!success) {
g_set_error_literal (&dm_error, 0, 0, "Failed to unescape QCDM packet.");
g_byte_array_free (unescaped, TRUE);
unescaped = NULL;
+ } else if (more) {
+ /* Need more data; we shouldn't have gotten here since the parse
+ * function checks for the end-of-frame marker, but whatever.
+ */
+ return 0;
}
}
@@ -84,6 +100,8 @@ handle_response (MMSerialPort *port,
if (unescaped)
g_byte_array_free (unescaped, TRUE);
+
+ return used;
}
/*****************************************************************************/