Coverage report for dbus/dbus-signature.c.gcov

        -:    0:Source:dbus-signature.c
        -:    0:Graph:.libs/dbus-signature.gcno
        -:    0:Data:.libs/dbus-signature.gcda
        -:    0:Runs:11820
        -:    0:Programs:5
        -:    1:/* -*- mode: C; c-file-style: "gnu" -*- */
        -:    2:/* dbus-signature.c  Routines for reading recursive type signatures
        -:    3: *
        -:    4: * Copyright (C) 2005 Red Hat, Inc.
        -:    5: *
        -:    6: * Licensed under the Academic Free License version 2.1
        -:    7: *
        -:    8: * This program is free software; you can redistribute it and/or modify
        -:    9: * it under the terms of the GNU General Public License as published by
        -:   10: * the Free Software Foundation; either version 2 of the License, or
        -:   11: * (at your option) any later version.
        -:   12: *
        -:   13: * This program is distributed in the hope that it will be useful,
        -:   14: * but WITHOUT ANY WARRANTY; without even the implied warranty of
        -:   15: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
        -:   16: * GNU General Public License for more details.
        -:   17: *
        -:   18: * You should have received a copy of the GNU General Public License
        -:   19: * along with this program; if not, write to the Free Software
        -:   20: * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
        -:   21: *
        -:   22: */
        -:   23:
        -:   24:#include "dbus-signature.h"
        -:   25:#include "dbus-marshal-recursive.h"
        -:   26:#include "dbus-marshal-basic.h"
        -:   27:#include "dbus-internals.h"
        -:   28:#include "dbus-test.h"
        -:   29:
        -:   30:typedef struct
        -:   31:{ 
        -:   32:  const char *pos;
        -:   33:  unsigned int finished : 1;
        -:   34:  unsigned int in_array : 1;
        -:   35:} DBusSignatureRealIter;
        -:   36:
        -:   37:/**
        -:   38: * @defgroup DBusSignature Type signature parsing
        -:   39: * @ingroup  DBus
        -:   40: * @brief Parsing D-BUS type signatures
        -:   41: * @{
        -:   42: */
        -:   43:
        -:   44:/**
        -:   45: * Initializes a #DBusSignatureIter for reading a type signature.  This
        -:   46: * function is not safe to use on invalid signatures; be sure to
        -:   47: * validate potentially invalid signatures with dbus_signature_validate
        -:   48: * before using this function.
        -:   49: *
        -:   50: * @param iter pointer to an iterator to initialize
        -:   51: * @param signature the type signature
        -:   52: */
        -:   53:void
        -:   54:dbus_signature_iter_init (DBusSignatureIter *iter,
        -:   55:			  const char        *signature)
function dbus_signature_iter_init called 542 returned 100% blocks executed 100%
      542:   56:{
      542:   57:  DBusSignatureRealIter *real_iter = (DBusSignatureRealIter *) iter;
        -:   58:
      542:   59:  real_iter->pos = signature;
      542:   60:  real_iter->finished = FALSE;
      542:   61:  real_iter->in_array = FALSE;
      542:   62:}
        -:   63:
        -:   64:/**
        -:   65: * Returns the current type pointed to by the iterator.
        -:   66: * If the iterator is pointing at a type code such as 's', then
        -:   67: * it will be returned directly.
        -:   68: *
        -:   69: * However, when the parser encounters a container type start
        -:   70: * character such as '(' for a structure, the corresponding type for
        -:   71: * the container will be returned, e.g.  DBUS_TYPE_STRUCT, not '('.
        -:   72: * In this case, you should initialize a sub-iterator with
        -:   73: * dbus_signature_iter_recurse to parse the container type.
        -:   74: *
        -:   75: * @param iter pointer to an iterator 
        -:   76: * @returns current type (e.g. DBUS_TYPE_STRING, DBUS_TYPE_ARRAY)
        -:   77: */
        -:   78:int
        -:   79:dbus_signature_iter_get_current_type (const DBusSignatureIter *iter)
function dbus_signature_iter_get_current_type called 1507 returned 100% blocks executed 100%
     1507:   80:{
     1507:   81:  DBusSignatureRealIter *real_iter = (DBusSignatureRealIter *) iter;
        -:   82:
     1507:   83:  return _dbus_first_type_in_signature_c_str (real_iter->pos, 0);
call    0 returned 100%
        -:   84:}
        -:   85:
        -:   86:/**
        -:   87: * Returns the full type signature represented by the current
        -:   88: * iterator as a C string.
        -:   89: *
        -:   90: * @param iter pointer to an iterator 
        -:   91: * @returns current signature; or NULL on OOM.  Should be freed with #dbus_free
        -:   92: */
        -:   93:char *
        -:   94:dbus_signature_iter_get_signature (const DBusSignatureIter *iter)
function dbus_signature_iter_get_signature called 0 returned 0% blocks executed 0%
    #####:   95:{
    #####:   96:  DBusSignatureRealIter *real_iter = (DBusSignatureRealIter *) iter;
        -:   97:  DBusString str;
        -:   98:  char *ret;
        -:   99:  int pos;
        -:  100:  
    #####:  101:  if (!_dbus_string_init (&str))
call    0 never executed
branch  1 never executed
branch  2 never executed
    #####:  102:    return NULL;
        -:  103:
    #####:  104:  pos = 0;
    #####:  105:  _dbus_type_signature_next (real_iter->pos, &pos);
call    0 never executed
        -:  106:
    #####:  107:  if (!_dbus_string_append_len (&str, real_iter->pos, pos))
call    0 never executed
branch  1 never executed
branch  2 never executed
    #####:  108:    return NULL;
    #####:  109:  if (!_dbus_string_steal_data (&str, &ret))
call    0 never executed
branch  1 never executed
branch  2 never executed
    #####:  110:    ret = NULL;
    #####:  111:  _dbus_string_free (&str);
call    0 never executed
        -:  112:
    #####:  113:  return ret; 
        -:  114:}
        -:  115:
        -:  116:/**
        -:  117: * Convenience function for returning the element type of an array;
        -:  118: * This function allows you to avoid initializing a sub-iterator and
        -:  119: * getting its current type.
        -:  120: *
        -:  121: * It is an error to invoke this function if the current type of the
        -:  122: * iterator is not DBUS_TYPE_ARRAY.
        -:  123: *
        -:  124: * @param iter pointer to an iterator 
        -:  125: * @returns current array element type
        -:  126: */
        -:  127:int
        -:  128:dbus_signature_iter_get_element_type (const DBusSignatureIter *iter)
function dbus_signature_iter_get_element_type called 3 returned 100% blocks executed 67%
        3:  129:{
        3:  130:  DBusSignatureRealIter *real_iter = (DBusSignatureRealIter *) iter;
        -:  131:
        3:  132:  _dbus_return_val_if_fail (dbus_signature_iter_get_current_type (iter) == DBUS_TYPE_ARRAY, DBUS_TYPE_INVALID);
call    0 returned 100%
call    1 returned 100%
branch  2 taken 0% (fallthrough)
branch  3 taken 100%
call    4 never executed
call    5 never executed
        -:  133:
        3:  134:  return _dbus_first_type_in_signature_c_str (real_iter->pos, 1);
call    0 returned 100%
        -:  135:}
        -:  136:
        -:  137:/**
        -:  138: * Skip to the next value on this "level". e.g. the next field in a
        -:  139: * struct, the next value in an array. Returns FALSE at the end of the
        -:  140: * current container.
        -:  141: *
        -:  142: * @param iter the iterator
        -:  143: * @returns FALSE if nothing more to read at or below this level
        -:  144: */
        -:  145:dbus_bool_t
        -:  146:dbus_signature_iter_next (DBusSignatureIter *iter)
function dbus_signature_iter_next called 118 returned 100% blocks executed 80%
      118:  147:{
      118:  148:  DBusSignatureRealIter *real_iter = (DBusSignatureRealIter *) iter;
        -:  149:
      118:  150:  if (real_iter->finished)
branch  0 taken 0% (fallthrough)
branch  1 taken 100%
    #####:  151:    return FALSE;
        -:  152:  else
        -:  153:    {
        -:  154:      int pos;
        -:  155:
      118:  156:      if (real_iter->in_array)
branch  0 taken 0% (fallthrough)
branch  1 taken 100%
        -:  157:	{
    #####:  158:	  real_iter->finished = TRUE;
    #####:  159:	  return FALSE;
        -:  160:	}
        -:  161:
      118:  162:      pos = 0;
      118:  163:      _dbus_type_signature_next (real_iter->pos, &pos);
call    0 returned 100%
      118:  164:      real_iter->pos += pos;
        -:  165:
      118:  166:      if (*real_iter->pos == DBUS_STRUCT_END_CHAR
branch  0 taken 86% (fallthrough)
branch  1 taken 14%
branch  2 taken 1% (fallthrough)
branch  3 taken 99%
        -:  167:	  || *real_iter->pos == DBUS_DICT_ENTRY_END_CHAR)
        -:  168:	{
       18:  169:	  real_iter->finished = TRUE;
       18:  170:	  return FALSE;
        -:  171:	}
        -:  172:
      100:  173:      return *real_iter->pos != DBUS_TYPE_INVALID;
        -:  174:    }
        -:  175:}
        -:  176:
        -:  177:/**
        -:  178: * Initialize a new iterator pointing to the first type current
        -:  179: * container. It's an error to call this if the current type is a
        -:  180: * non-container (i.e. if dbus_type_is_container returns FALSE).
        -:  181: *
        -:  182: * @param iter the current interator
        -:  183: * @param subiter an iterator to initialize pointing to the first child
        -:  184: */
        -:  185:void
        -:  186:dbus_signature_iter_recurse (const DBusSignatureIter *iter,
        -:  187:			     DBusSignatureIter       *subiter)
function dbus_signature_iter_recurse called 238 returned 100% blocks executed 80%
      238:  188:{
      238:  189:  DBusSignatureRealIter *real_iter = (DBusSignatureRealIter *) iter;
      238:  190:  DBusSignatureRealIter *real_sub_iter = (DBusSignatureRealIter *) subiter;
        -:  191:
      238:  192:  _dbus_return_if_fail (dbus_type_is_container (dbus_signature_iter_get_current_type (iter)));
call    0 returned 100%
call    1 returned 100%
call    2 returned 100%
branch  3 taken 0% (fallthrough)
branch  4 taken 100%
call    5 never executed
call    6 never executed
        -:  193:
      238:  194:  *real_sub_iter = *real_iter;
      238:  195:  real_sub_iter->in_array = FALSE;
      238:  196:  real_sub_iter->pos++;
        -:  197:
      238:  198:  if (dbus_signature_iter_get_current_type (iter) == DBUS_TYPE_ARRAY)
call    0 returned 100%
branch  1 taken 65% (fallthrough)
branch  2 taken 35%
      155:  199:    real_sub_iter->in_array = TRUE;
        -:  200:}
        -:  201:
        -:  202:/**
        -:  203: * Check a type signature for validity.
        -:  204: *
        -:  205: * @param signature a potentially invalid type signature
        -:  206: * @param error error return
        -:  207: * @returns TRUE iif signature is valid
        -:  208: */
        -:  209:dbus_bool_t
        -:  210:dbus_signature_validate (const char       *signature,
        -:  211:			 DBusError        *error)
        -:  212:			 
function dbus_signature_validate called 158 returned 100% blocks executed 100%
      158:  213:{
        -:  214:  DBusString str;
        -:  215:
      158:  216:  _dbus_string_init_const (&str, signature);
call    0 returned 100%
      158:  217:  if (_dbus_validate_signature (&str, 0, _dbus_string_get_length (&str)))
call    0 returned 100%
call    1 returned 100%
branch  2 taken 94% (fallthrough)
branch  3 taken 6%
      148:  218:    return TRUE;
       10:  219:  dbus_set_error (error, DBUS_ERROR_INVALID_SIGNATURE, "Corrupt type signature");
call    0 returned 100%
       10:  220:  return FALSE;
        -:  221:}
        -:  222:
        -:  223:/**
        -:  224: * Check that a type signature is both valid and contains exactly
        -:  225: * one complete type.
        -:  226: *
        -:  227: * @param signature a potentially invalid type signature
        -:  228: * @param error error return
        -:  229: * @returns TRUE iif signature is valid and has exactly one complete type
        -:  230: */
        -:  231:dbus_bool_t
        -:  232:dbus_signature_validate_single (const char       *signature,
        -:  233:				DBusError        *error)
function dbus_signature_validate_single called 3 returned 100% blocks executed 92%
        3:  234:{
        -:  235:  DBusSignatureIter iter;
        -:  236:
        3:  237:  if (!dbus_signature_validate (signature, error))
call    0 returned 100%
branch  1 taken 0% (fallthrough)
branch  2 taken 100%
    #####:  238:    return FALSE;
        -:  239:
        3:  240:  dbus_signature_iter_init (&iter, signature);
call    0 returned 100%
        3:  241:  if (dbus_signature_iter_get_current_type (&iter) == DBUS_TYPE_INVALID)
call    0 returned 100%
branch  1 taken 67% (fallthrough)
branch  2 taken 33%
        1:  242:    goto lose;
        2:  243:  if (!dbus_signature_iter_next (&iter))
call    0 returned 100%
branch  1 taken 50% (fallthrough)
branch  2 taken 50%
        1:  244:    return TRUE;
        2:  245: lose:
        2:  246:  dbus_set_error (error, DBUS_ERROR_INVALID_SIGNATURE, "Exactly one complete type required in signature");
call    0 returned 100%
        2:  247:  return FALSE;
        -:  248:}
        -:  249:
        -:  250:/** macro that checks whether a typecode is a container type */
        -:  251:#define TYPE_IS_CONTAINER(typecode)             \
        -:  252:    ((typecode) == DBUS_TYPE_STRUCT ||          \
        -:  253:     (typecode) == DBUS_TYPE_DICT_ENTRY ||      \
        -:  254:     (typecode) == DBUS_TYPE_VARIANT ||         \
        -:  255:     (typecode) == DBUS_TYPE_ARRAY)
        -:  256:
        -:  257:/**
        -:  258: * A "container type" can contain basic types, or nested
        -:  259: * container types. #DBUS_TYPE_INVALID is not a container type.
        -:  260: * This function will crash if passed a typecode that isn't
        -:  261: * in dbus-protocol.h
        -:  262: *
        -:  263: * @returns #TRUE if type is a container
        -:  264: */
        -:  265:dbus_bool_t
        -:  266:dbus_type_is_container (int typecode)
function dbus_type_is_container called 1315741 returned 100% blocks executed 73%
  1315741:  267:{
        -:  268:  /* only reasonable (non-line-noise) typecodes are allowed */
  1315741:  269:  _dbus_return_val_if_fail (_dbus_type_is_valid (typecode) || typecode == DBUS_TYPE_INVALID,
call    0 returned 100%
call    1 returned 100%
branch  2 taken 0% (fallthrough)
branch  3 taken 100%
branch  4 never executed
branch  5 never executed
call    6 never executed
call    7 never executed
        -:  270:			    FALSE);
  1315741:  271:  return TYPE_IS_CONTAINER (typecode);
branch  0 taken 76% (fallthrough)
branch  1 taken 24%
branch  2 taken 99% (fallthrough)
branch  3 taken 1%
branch  4 taken 69% (fallthrough)
branch  5 taken 31%
branch  6 taken 9% (fallthrough)
branch  7 taken 91%
        -:  272:}
        -:  273:
        -:  274:/**
        -:  275: * A "basic type" is a somewhat arbitrary concept, but the intent
        -:  276: * is to include those types that are fully-specified by a single
        -:  277: * typecode, with no additional type information or nested
        -:  278: * values. So all numbers and strings are basic types and
        -:  279: * structs, arrays, and variants are not basic types.
        -:  280: * #DBUS_TYPE_INVALID is not a basic type.
        -:  281: *
        -:  282: * This function will crash if passed a typecode that isn't
        -:  283: * in dbus-protocol.h
        -:  284: *
        -:  285: * @returns #TRUE if type is basic
        -:  286: */
        -:  287:dbus_bool_t
        -:  288:dbus_type_is_basic (int typecode)
function dbus_type_is_basic called 11529477 returned 100% blocks executed 75%
 11529477:  289:{
        -:  290:  /* only reasonable (non-line-noise) typecodes are allowed */
 11529477:  291:  _dbus_return_val_if_fail (_dbus_type_is_valid (typecode) || typecode == DBUS_TYPE_INVALID,
call    0 returned 100%
call    1 returned 100%
branch  2 taken 0% (fallthrough)
branch  3 taken 100%
branch  4 never executed
branch  5 never executed
call    6 never executed
call    7 never executed
        -:  292:			    FALSE);
        -:  293:
        -:  294:  /* everything that isn't invalid or a container */
 11529477:  295:  return !(typecode == DBUS_TYPE_INVALID || TYPE_IS_CONTAINER (typecode));
branch  0 taken 100% (fallthrough)
branch  1 taken 0%
branch  2 taken 99% (fallthrough)
branch  3 taken 1%
branch  4 taken 99% (fallthrough)
branch  5 taken 1%
branch  6 taken 99% (fallthrough)
branch  7 taken 1%
branch  8 taken 99% (fallthrough)
branch  9 taken 1%
        -:  296:}
        -:  297:
        -:  298:/**
        -:  299: * Tells you whether values of this type can change length if you set
        -:  300: * them to some other value. For this purpose, you assume that the
        -:  301: * first byte of the old and new value would be in the same location,
        -:  302: * so alignment padding is not a factor.
        -:  303: *
        -:  304: * This function is useful to determine whether #dbus_message_iter_get_fixed_array
        -:  305: * may be used.
        -:  306: *
        -:  307: * @returns #FALSE if the type can occupy different lengths
        -:  308: */
        -:  309:dbus_bool_t
        -:  310:dbus_type_is_fixed (int typecode)
function dbus_type_is_fixed called 67112 returned 100% blocks executed 100%
    67112:  311:{
    67112:  312:  switch (typecode)
branch  0 taken 5%
branch  1 taken 95%
        -:  313:    {
        -:  314:    case DBUS_TYPE_BYTE:
        -:  315:    case DBUS_TYPE_BOOLEAN:
        -:  316:    case DBUS_TYPE_INT16:
        -:  317:    case DBUS_TYPE_UINT16:
        -:  318:    case DBUS_TYPE_INT32:
        -:  319:    case DBUS_TYPE_UINT32:
        -:  320:    case DBUS_TYPE_INT64:
        -:  321:    case DBUS_TYPE_UINT64:
        -:  322:    case DBUS_TYPE_DOUBLE:
     3589:  323:      return TRUE;
        -:  324:    default:
    63523:  325:      return FALSE;
        -:  326:    }
        -:  327:}
        -:  328:
        -:  329:#ifdef DBUS_BUILD_TESTS
        -:  330:
        -:  331:/**
        -:  332: * @ingroup DBusSignatureInternals
        -:  333: * Unit test for DBusSignature.
        -:  334: *
        -:  335: * @returns #TRUE on success.
        -:  336: */
        -:  337:dbus_bool_t
        -:  338:_dbus_signature_test (void)
function _dbus_signature_test called 1 returned 100% blocks executed 100%
        1:  339:{
        -:  340:  DBusSignatureIter iter;
        -:  341:  DBusSignatureIter subiter;
        -:  342:  DBusSignatureIter subsubiter;
        -:  343:  DBusSignatureIter subsubsubiter;
        -:  344:  const char *sig;
        -:  345:
        1:  346:  _dbus_assert (sizeof (DBusSignatureIter) >= sizeof (DBusSignatureRealIter));
call    0 returned 100%
        -:  347:
        1:  348:  sig = "";
        1:  349:  _dbus_assert (dbus_signature_validate (sig, NULL));
call    0 returned 100%
call    1 returned 100%
        1:  350:  _dbus_assert (!dbus_signature_validate_single (sig, NULL));
call    0 returned 100%
call    1 returned 100%
        1:  351:  dbus_signature_iter_init (&iter, sig);
call    0 returned 100%
        1:  352:  _dbus_assert (dbus_signature_iter_get_current_type (&iter) == DBUS_TYPE_INVALID);
call    0 returned 100%
call    1 returned 100%
        -:  353:
        1:  354:  sig = DBUS_TYPE_STRING_AS_STRING;
        1:  355:  _dbus_assert (dbus_signature_validate (sig, NULL));
call    0 returned 100%
call    1 returned 100%
        1:  356:  _dbus_assert (dbus_signature_validate_single (sig, NULL));
call    0 returned 100%
call    1 returned 100%
        1:  357:  dbus_signature_iter_init (&iter, sig);
call    0 returned 100%
        1:  358:  _dbus_assert (dbus_signature_iter_get_current_type (&iter) == DBUS_TYPE_STRING);
call    0 returned 100%
call    1 returned 100%
        -:  359:
        1:  360:  sig = DBUS_TYPE_STRING_AS_STRING DBUS_TYPE_BYTE_AS_STRING;
        1:  361:  _dbus_assert (dbus_signature_validate (sig, NULL));
call    0 returned 100%
call    1 returned 100%
        1:  362:  dbus_signature_iter_init (&iter, sig);
call    0 returned 100%
        1:  363:  _dbus_assert (dbus_signature_iter_get_current_type (&iter) == DBUS_TYPE_STRING);
call    0 returned 100%
call    1 returned 100%
        1:  364:  _dbus_assert (dbus_signature_iter_next (&iter));
call    0 returned 100%
call    1 returned 100%
        1:  365:  _dbus_assert (dbus_signature_iter_get_current_type (&iter) == DBUS_TYPE_BYTE);
call    0 returned 100%
call    1 returned 100%
        -:  366:
        1:  367:  sig = DBUS_TYPE_UINT16_AS_STRING
        -:  368:    DBUS_STRUCT_BEGIN_CHAR_AS_STRING
        -:  369:    DBUS_TYPE_STRING_AS_STRING
        -:  370:    DBUS_TYPE_UINT32_AS_STRING
        -:  371:    DBUS_TYPE_VARIANT_AS_STRING
        -:  372:    DBUS_TYPE_DOUBLE_AS_STRING
        -:  373:    DBUS_STRUCT_END_CHAR_AS_STRING;
        1:  374:  _dbus_assert (dbus_signature_validate (sig, NULL));
call    0 returned 100%
call    1 returned 100%
        1:  375:  dbus_signature_iter_init (&iter, sig);
call    0 returned 100%
        1:  376:  _dbus_assert (dbus_signature_iter_get_current_type (&iter) == DBUS_TYPE_UINT16);
call    0 returned 100%
call    1 returned 100%
        1:  377:  _dbus_assert (dbus_signature_iter_next (&iter));
call    0 returned 100%
call    1 returned 100%
        1:  378:  _dbus_assert (dbus_signature_iter_get_current_type (&iter) == DBUS_TYPE_STRUCT);
call    0 returned 100%
call    1 returned 100%
        1:  379:  dbus_signature_iter_recurse (&iter, &subiter);
call    0 returned 100%
        1:  380:  _dbus_assert (dbus_signature_iter_get_current_type (&subiter) == DBUS_TYPE_STRING);
call    0 returned 100%
call    1 returned 100%
        1:  381:  _dbus_assert (dbus_signature_iter_next (&subiter));
call    0 returned 100%
call    1 returned 100%
        1:  382:  _dbus_assert (dbus_signature_iter_get_current_type (&subiter) == DBUS_TYPE_UINT32);
call    0 returned 100%
call    1 returned 100%
        1:  383:  _dbus_assert (dbus_signature_iter_next (&subiter));
call    0 returned 100%
call    1 returned 100%
        1:  384:  _dbus_assert (dbus_signature_iter_get_current_type (&subiter) == DBUS_TYPE_VARIANT);
call    0 returned 100%
call    1 returned 100%
        1:  385:  _dbus_assert (dbus_signature_iter_next (&subiter));
call    0 returned 100%
call    1 returned 100%
        1:  386:  _dbus_assert (dbus_signature_iter_get_current_type (&subiter) == DBUS_TYPE_DOUBLE);
call    0 returned 100%
call    1 returned 100%
        -:  387:
        1:  388:  sig = DBUS_TYPE_UINT16_AS_STRING
        -:  389:    DBUS_STRUCT_BEGIN_CHAR_AS_STRING
        -:  390:    DBUS_TYPE_UINT32_AS_STRING
        -:  391:    DBUS_TYPE_BYTE_AS_STRING
        -:  392:    DBUS_TYPE_ARRAY_AS_STRING
        -:  393:    DBUS_TYPE_ARRAY_AS_STRING
        -:  394:    DBUS_TYPE_DOUBLE_AS_STRING
        -:  395:    DBUS_STRUCT_BEGIN_CHAR_AS_STRING
        -:  396:    DBUS_TYPE_BYTE_AS_STRING
        -:  397:    DBUS_STRUCT_END_CHAR_AS_STRING
        -:  398:    DBUS_STRUCT_END_CHAR_AS_STRING;
        1:  399:  _dbus_assert (dbus_signature_validate (sig, NULL));
call    0 returned 100%
call    1 returned 100%
        1:  400:  dbus_signature_iter_init (&iter, sig);
call    0 returned 100%
        1:  401:  _dbus_assert (dbus_signature_iter_get_current_type (&iter) == DBUS_TYPE_UINT16);
call    0 returned 100%
call    1 returned 100%
        1:  402:  _dbus_assert (dbus_signature_iter_next (&iter));
call    0 returned 100%
call    1 returned 100%
        1:  403:  _dbus_assert (dbus_signature_iter_get_current_type (&iter) == DBUS_TYPE_STRUCT);
call    0 returned 100%
call    1 returned 100%
        1:  404:  dbus_signature_iter_recurse (&iter, &subiter);
call    0 returned 100%
        1:  405:  _dbus_assert (dbus_signature_iter_get_current_type (&subiter) == DBUS_TYPE_UINT32);
call    0 returned 100%
call    1 returned 100%
        1:  406:  _dbus_assert (dbus_signature_iter_next (&subiter));
call    0 returned 100%
call    1 returned 100%
        1:  407:  _dbus_assert (dbus_signature_iter_get_current_type (&subiter) == DBUS_TYPE_BYTE);
call    0 returned 100%
call    1 returned 100%
        1:  408:  _dbus_assert (dbus_signature_iter_next (&subiter));
call    0 returned 100%
call    1 returned 100%
        1:  409:  _dbus_assert (dbus_signature_iter_get_current_type (&subiter) == DBUS_TYPE_ARRAY);
call    0 returned 100%
call    1 returned 100%
        1:  410:  _dbus_assert (dbus_signature_iter_get_element_type (&subiter) == DBUS_TYPE_ARRAY);
call    0 returned 100%
call    1 returned 100%
        -:  411:
        1:  412:  dbus_signature_iter_recurse (&subiter, &subsubiter);
call    0 returned 100%
        1:  413:  _dbus_assert (dbus_signature_iter_get_current_type (&subsubiter) == DBUS_TYPE_ARRAY);
call    0 returned 100%
call    1 returned 100%
        1:  414:  _dbus_assert (dbus_signature_iter_get_element_type (&subsubiter) == DBUS_TYPE_DOUBLE);
call    0 returned 100%
call    1 returned 100%
        -:  415:
        1:  416:  dbus_signature_iter_recurse (&subsubiter, &subsubsubiter);
call    0 returned 100%
        1:  417:  _dbus_assert (dbus_signature_iter_get_current_type (&subsubsubiter) == DBUS_TYPE_DOUBLE);
call    0 returned 100%
call    1 returned 100%
        1:  418:  _dbus_assert (dbus_signature_iter_next (&subiter));
call    0 returned 100%
call    1 returned 100%
        1:  419:  _dbus_assert (dbus_signature_iter_get_current_type (&subiter) == DBUS_TYPE_STRUCT);
call    0 returned 100%
call    1 returned 100%
        1:  420:  dbus_signature_iter_recurse (&subiter, &subsubiter);
call    0 returned 100%
        1:  421:  _dbus_assert (dbus_signature_iter_get_current_type (&subsubiter) == DBUS_TYPE_BYTE);
call    0 returned 100%
call    1 returned 100%
        -:  422:
        1:  423:  sig = DBUS_TYPE_ARRAY_AS_STRING
        -:  424:    DBUS_DICT_ENTRY_BEGIN_CHAR_AS_STRING
        -:  425:    DBUS_TYPE_INT16_AS_STRING
        -:  426:    DBUS_TYPE_STRING_AS_STRING
        -:  427:    DBUS_DICT_ENTRY_END_CHAR_AS_STRING
        -:  428:    DBUS_TYPE_VARIANT_AS_STRING;
        1:  429:  _dbus_assert (dbus_signature_validate (sig, NULL));
call    0 returned 100%
call    1 returned 100%
        1:  430:  _dbus_assert (!dbus_signature_validate_single (sig, NULL));
call    0 returned 100%
call    1 returned 100%
        1:  431:  dbus_signature_iter_init (&iter, sig);
call    0 returned 100%
        1:  432:  _dbus_assert (dbus_signature_iter_get_current_type (&iter) == DBUS_TYPE_ARRAY);
call    0 returned 100%
call    1 returned 100%
        1:  433:  _dbus_assert (dbus_signature_iter_get_element_type (&iter) == DBUS_TYPE_DICT_ENTRY);
call    0 returned 100%
call    1 returned 100%
        -:  434:
        1:  435:  dbus_signature_iter_recurse (&iter, &subiter);
call    0 returned 100%
        1:  436:  dbus_signature_iter_recurse (&subiter, &subsubiter);
call    0 returned 100%
        1:  437:  _dbus_assert (dbus_signature_iter_get_current_type (&subsubiter) == DBUS_TYPE_INT16);
call    0 returned 100%
call    1 returned 100%
        1:  438:  _dbus_assert (dbus_signature_iter_next (&subsubiter));
call    0 returned 100%
call    1 returned 100%
        1:  439:  _dbus_assert (dbus_signature_iter_get_current_type (&subsubiter) == DBUS_TYPE_STRING);
call    0 returned 100%
call    1 returned 100%
        1:  440:  _dbus_assert (!dbus_signature_iter_next (&subsubiter));
call    0 returned 100%
call    1 returned 100%
        -:  441:
        1:  442:  _dbus_assert (dbus_signature_iter_next (&iter));
call    0 returned 100%
call    1 returned 100%
        1:  443:  _dbus_assert (dbus_signature_iter_get_current_type (&iter) == DBUS_TYPE_VARIANT);
call    0 returned 100%
call    1 returned 100%
        1:  444:  _dbus_assert (!dbus_signature_iter_next (&iter));
call    0 returned 100%
call    1 returned 100%
        -:  445:
        1:  446:  sig = DBUS_TYPE_DICT_ENTRY_AS_STRING;
        1:  447:  _dbus_assert (!dbus_signature_validate (sig, NULL));
call    0 returned 100%
call    1 returned 100%
        -:  448:
        1:  449:  sig = DBUS_TYPE_ARRAY_AS_STRING;
        1:  450:  _dbus_assert (!dbus_signature_validate (sig, NULL));
call    0 returned 100%
call    1 returned 100%
        -:  451:
        1:  452:  sig = DBUS_TYPE_UINT32_AS_STRING
        -:  453:    DBUS_TYPE_ARRAY_AS_STRING;
        1:  454:  _dbus_assert (!dbus_signature_validate (sig, NULL));
call    0 returned 100%
call    1 returned 100%
        -:  455:
        1:  456:  sig = DBUS_TYPE_ARRAY_AS_STRING
        -:  457:    DBUS_TYPE_DICT_ENTRY_AS_STRING;
        1:  458:  _dbus_assert (!dbus_signature_validate (sig, NULL));
call    0 returned 100%
call    1 returned 100%
        -:  459:
        1:  460:  sig = DBUS_DICT_ENTRY_BEGIN_CHAR_AS_STRING;
        1:  461:  _dbus_assert (!dbus_signature_validate (sig, NULL));
call    0 returned 100%
call    1 returned 100%
        -:  462:
        1:  463:  sig = DBUS_DICT_ENTRY_END_CHAR_AS_STRING;
        1:  464:  _dbus_assert (!dbus_signature_validate (sig, NULL));
call    0 returned 100%
call    1 returned 100%
        -:  465:
        1:  466:  sig = DBUS_DICT_ENTRY_BEGIN_CHAR_AS_STRING
        -:  467:    DBUS_TYPE_INT32_AS_STRING;
        1:  468:  _dbus_assert (!dbus_signature_validate (sig, NULL));
call    0 returned 100%
call    1 returned 100%
        -:  469:
        1:  470:  sig = DBUS_DICT_ENTRY_BEGIN_CHAR_AS_STRING
        -:  471:    DBUS_TYPE_INT32_AS_STRING
        -:  472:    DBUS_TYPE_STRING_AS_STRING;
        1:  473:  _dbus_assert (!dbus_signature_validate (sig, NULL));
call    0 returned 100%
call    1 returned 100%
        -:  474:
        1:  475:  sig = DBUS_STRUCT_END_CHAR_AS_STRING
        -:  476:    DBUS_STRUCT_BEGIN_CHAR_AS_STRING;
        1:  477:  _dbus_assert (!dbus_signature_validate (sig, NULL));
call    0 returned 100%
call    1 returned 100%
        -:  478:
        1:  479:  sig = DBUS_STRUCT_BEGIN_CHAR_AS_STRING
        -:  480:    DBUS_TYPE_BOOLEAN_AS_STRING;
        1:  481:  _dbus_assert (!dbus_signature_validate (sig, NULL));
call    0 returned 100%
call    1 returned 100%
        1:  482:  return TRUE;
        -:  483:#if 0
        -:  484: oom:
        -:  485:  _dbus_assert_not_reached ("out of memory");
        -:  486:  return FALSE;
        -:  487:#endif
        -:  488:}
        -:  489:
        -:  490:#endif
        -:  491:
        -:  492:/** @} */ /* end of DBusSignature group */
        -:  493: