Re: [PATCH v2 12/18] isimodem: SS_GSM_BARRING_INFO added

2011-03-03 Thread Aki Niemi
Hi,

2011/2/23 Andreas Westin andreas.wes...@stericsson.com:
 From: Jessica Nilsson jessica.j.nils...@stericsson.com

 SS_GSM_BSC_INFO added.
 ---
  drivers/isimodem/call-barring.c |   99 ++
  1 files changed, 88 insertions(+), 11 deletions(-)

Patch was applied, with some refactoring done afterwards.

Cheers,
Aki
___
ofono mailing list
ofono@ofono.org
http://lists.ofono.org/listinfo/ofono


[PATCH v2 12/18] isimodem: SS_GSM_BARRING_INFO added

2011-02-23 Thread Andreas Westin
From: Jessica Nilsson jessica.j.nils...@stericsson.com

SS_GSM_BSC_INFO added.
---
 drivers/isimodem/call-barring.c |   99 ++
 1 files changed, 88 insertions(+), 11 deletions(-)

diff --git a/drivers/isimodem/call-barring.c b/drivers/isimodem/call-barring.c
index a78b762..a1d9a13 100644
--- a/drivers/isimodem/call-barring.c
+++ b/drivers/isimodem/call-barring.c
@@ -190,6 +190,40 @@ static void update_status_mask(unsigned int *mask, int bsc)
}
 }
 
+static gboolean decode_gsm_barring_info(const void *restrict data, size_t len,
+   guint32 *mask)
+{
+   GIsiSubBlockIter iter;
+
+   for (g_isi_sb_iter_init(iter, data, 0);
+   g_isi_sb_iter_is_valid(iter);
+   g_isi_sb_iter_next(iter)) {
+   switch (g_isi_sb_iter_get_id(iter)) {
+   case SS_GSM_BARRING_FEATURE: {
+   uint8_t status;
+   uint8_t bsc;
+
+   if (!g_isi_sb_iter_get_byte(iter, bsc, 2) ||
+   !g_isi_sb_iter_get_byte(iter, status,
+   3))
+   return FALSE;
+
+   if (status  SS_GSM_ACTIVE)
+   update_status_mask(mask, bsc);
+
+   break;
+   }
+   default:
+   DBG(Skipping sub-block: %s (%zd bytes),
+   ss_subblock_name(g_isi_sb_iter_get_id(iter)),
+   g_isi_sb_iter_get_len(iter));
+   break;
+   }
+   }
+
+   return TRUE;
+}
+
 static void query_resp_cb(const GIsiMessage *msg, void *data)
 {
struct isi_cb_data *cbd = data;
@@ -197,9 +231,6 @@ static void query_resp_cb(const GIsiMessage *msg, void 
*data)
GIsiSubBlockIter iter;
uint32_t mask = 0;
uint8_t type;
-   uint8_t count = 0;
-   uint8_t bsc = 0;
-   uint8_t i;
 
if (!check_response_status(msg, SS_SERVICE_COMPLETED_RESP))
goto error;
@@ -214,18 +245,65 @@ static void query_resp_cb(const GIsiMessage *msg, void 
*data)
g_isi_sb_iter_is_valid(iter);
g_isi_sb_iter_next(iter)) {
 
-   if (g_isi_sb_iter_get_id(iter) != SS_GSM_BSC_INFO)
-   continue;
+   switch (g_isi_sb_iter_get_id(iter)) {
 
-   if (!g_isi_sb_iter_get_byte(iter, count, 2))
-   goto error;
+   case SS_STATUS_RESULT: {
+   guint8 ss_status;
 
-   for (i = 0; i  count; i++) {
+   if (!g_isi_sb_iter_get_byte(iter, ss_status, 2))
+   goto error;
+
+   DBG(SS_STATUS_RESULT=%d, ss_status);
 
-   if (!g_isi_sb_iter_get_byte(iter, bsc, 3 + i))
+   if (ss_status  SS_GSM_ACTIVE)
+   mask = 1;
+
+   break;
+   }
+
+   case SS_GSM_BARRING_INFO: {
+   void *info = NULL;
+   size_t infolen;
+
+   if (!g_isi_sb_iter_get_data(iter, info, 4))
+   goto error;
+
+   infolen = g_isi_sb_iter_get_len(iter) - 4;
+
+   if (!decode_gsm_barring_info(info, infolen, mask))
+   goto error;
+
+   break;
+   }
+
+   case SS_GSM_BSC_INFO: {
+
+   guint8 count = 0;
+   guint8 i;
+
+   if (!g_isi_sb_iter_get_byte(iter, count, 2))
goto error;
 
-   update_status_mask(mask, bsc);
+   for (i = 0; i  count; i++) {
+
+   guint8 bsc = 0;
+
+   if (!g_isi_sb_iter_get_byte(iter, bsc, 3 + i))
+   goto error;
+
+   update_status_mask(mask, bsc);
+   }
+   break;
+   }
+
+   case SS_GSM_ADDITIONAL_INFO:
+   break;
+
+   default:
+   DBG(Skipping sub-block: %s (%zd bytes),
+   ss_subblock_name(g_isi_sb_iter_get_id(iter)),
+   g_isi_sb_iter_get_len(iter));
+   break;
}
}
 
@@ -342,7 +420,6 @@ static void reachable_cb(const GIsiMessage *msg, void *data)
ofono_call_barring_register(barr);
 }
 
-
 static int isi_call_barring_probe(struct ofono_call_barring *barr,
unsigned int vendor, void *user)
 {
-- 
1.7.3.5