def unmarshal( compoundSignature, data, offset = 0, lendian = True ):
    """
    Unmarshals DBus encoded data.

    @type compoundSignature: C{string}
    @param compoundSignature: DBus signature specifying the encoded value types

    @type data: C{string}
    @param data: Binary data

    @type offset: C{int}
    @param offset: Offset within data at which data for compoundSignature
                   starts (used during recursion)

    @type lendian: C{bool}
    @param lendian: True if data is encoded in little-endian format
    
    @returns: (number_of_bytes_decoded, list_of_values)
    """
    values       = list()
    start_offset = offset

    for ct in genCompleteTypes( compoundSignature ):
        tcode   = ct[0]
        offset += len(pad[tcode]( offset ))
                
        nbytes, value = unmarshallers[ tcode ]( ct, data, offset, lendian )

        offset += nbytes
        values.append( value )


    return offset - start_offset, values