diff options
author | Aki Niemi <aki.niemi@nokia.com> | 2010-11-23 16:09:37 +0200 |
---|---|---|
committer | Aki Niemi <aki.niemi@nokia.com> | 2010-12-22 17:13:47 +0200 |
commit | ca3f646f8f143dc1219b9457eed67fff927f8392 (patch) | |
tree | e5abf341953e171eb7074bc3a97db4136012b14d /gisi/iter.c | |
parent | 188bbc5d3bfd2abc2c1036a49f308b0174b25605 (diff) | |
download | ofono-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/iter.c')
-rw-r--r-- | gisi/iter.c | 31 |
1 files changed, 31 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) |