summaryrefslogtreecommitdiffstats
path: root/gisi
diff options
context:
space:
mode:
authorAki Niemi <aki.niemi@nokia.com>2010-11-23 16:09:37 +0200
committerAki Niemi <aki.niemi@nokia.com>2010-12-22 17:13:47 +0200
commitca3f646f8f143dc1219b9457eed67fff927f8392 (patch)
treee5abf341953e171eb7074bc3a97db4136012b14d /gisi
parent188bbc5d3bfd2abc2c1036a49f308b0174b25605 (diff)
downloadofono-ca3f646f8f143dc1219b9457eed67fff927f8392.tar.bz2
gisi: Add constructor for sub-iterators
This is needed for decoding messages that include sub-blocks within sub-blocks.
Diffstat (limited to 'gisi')
-rw-r--r--gisi/iter.c31
-rw-r--r--gisi/iter.h5
2 files changed, 36 insertions, 0 deletions
diff --git a/gisi/iter.c b/gisi/iter.c
index d0e534b3..53e4c3b3 100644
--- a/gisi/iter.c
+++ b/gisi/iter.c
@@ -76,6 +76,37 @@ void g_isi_sb_iter_init(GIsiSubBlockIter *iter, const GIsiMessage *msg,
iter->sub_blocks = len > used ? iter->start[-1] : 0;
}
+void g_isi_sb_subiter_init(GIsiSubBlockIter *outer, GIsiSubBlockIter *inner,
+ size_t used)
+{
+ size_t len = g_isi_sb_iter_get_len(outer);
+
+ if (outer->start + len > outer->end ||
+ outer->start + used > outer->end)
+ len = used = 0;
+
+ inner->start = outer->start + used;
+ inner->end = inner->start + len;
+ inner->longhdr = FALSE;
+ inner->sub_blocks = len > used ? inner->start[-1] : 0;
+}
+
+void g_isi_sb_subiter_init_full(GIsiSubBlockIter *outer, GIsiSubBlockIter *inner,
+ size_t used, gboolean longhdr,
+ uint16_t sub_blocks)
+{
+ size_t len = g_isi_sb_iter_get_len(outer);
+
+ if (outer->start + len > outer->end ||
+ outer->start + used > outer->end)
+ len = used = 0;
+
+ inner->start = outer->start + used;
+ inner->end = inner->start + len;
+ inner->longhdr = longhdr;
+ inner->sub_blocks = len > used ? sub_blocks : 0;
+}
+
gboolean g_isi_sb_iter_is_valid(const GIsiSubBlockIter *iter)
{
if (iter == NULL)
diff --git a/gisi/iter.h b/gisi/iter.h
index 43814a0b..b6de8cff 100644
--- a/gisi/iter.h
+++ b/gisi/iter.h
@@ -43,6 +43,11 @@ void g_isi_sb_iter_init(GIsiSubBlockIter *iter, const GIsiMessage *msg,
void g_isi_sb_iter_init_full(GIsiSubBlockIter *iter, const GIsiMessage *msg,
size_t used, gboolean longhdr,
uint16_t sub_blocks);
+void g_isi_sb_subiter_init(GIsiSubBlockIter *outer, GIsiSubBlockIter *inner,
+ size_t used);
+void g_isi_sb_subiter_init_full(GIsiSubBlockIter *outer, GIsiSubBlockIter *inner,
+ size_t used, gboolean longhdr,
+ uint16_t sub_blocks);
gboolean g_isi_sb_iter_is_valid(const GIsiSubBlockIter *iter);
gboolean g_isi_sb_iter_next(GIsiSubBlockIter *iter);