Exemplo n.º 1
0
		/* static */
		Message * Message::Demarshal(pGina::Memory::Buffer *buffer)
		{
			if(buffer == 0)
				return 0;

			return Demarshal(*buffer);
		}
Exemplo n.º 2
0
int
main( int argc, char *argv[] )
{
  tUint8         value[4]  = { 0x42, 0X43, 0X44, 0X45 };
  tUint8         result[4] = { 0x11, 0x12, 0x13, 0x14 };
  unsigned char  buffer[256];

  unsigned int s1 = Marshal( &UserDefinedType, value, buffer );

  if ( s1 != 3 )
       return 1;

  unsigned int s2 = Demarshal( MarshalByteOrder(),
                               &UserDefinedType, result, buffer );

  if ( s2 != 3 )
       return 1;

  if ( value[0] != result[0] )
       return 1;

  if ( value[1] != result[1] )
       return 1;

  if ( value[2] != result[2] )
       return 1;

  if ( result[3] != 0x14 )
       return 1;

  return 0;
}
Exemplo n.º 3
0
int
HpiDemarshalReply( int byte_order, cHpiMarshal *m, const void *buffer, void **params )
{
  // the first value is the error code
  int rv = Demarshal( byte_order, &SaErrorType, params[0], buffer );

  if ( rv < 0 )
       return -1;

  SaErrorT err = *(SaErrorT *)params[0];

  if ( err == SA_OK )
       return DemarshalArray( byte_order, m->m_reply, params, buffer );

  return rv;
}
Exemplo n.º 4
0
int
main( int argc, char *argv[] )
{
  tUint8 value = 0x42;
  tUint8 result;

  unsigned int s = Demarshal( MarshalByteOrder() ? 0 : 1,
                              &Uint8Type, &result, &value );

  if ( s != sizeof( tUint8 ) )
       return 1;

  if ( value != result )
       return 1;

  return 0;
}
Exemplo n.º 5
0
int
main( int argc, char *argv[] )
{
  tInt16 value = 0x42aa;
  tInt16 swap = bswap_16( value );
  tInt16  result;

  unsigned int s = Demarshal( MarshalByteOrder() ? 0 : 1,
                              &Marshal_Int16Type, &result, &swap );

  if ( s != sizeof( tInt16 ) )
       return 1;

  if ( value != result )
       return 1;

  return 0;
}
Exemplo n.º 6
0
int
main( int argc, char *argv[] )
{
  tUint16 value = 0x42aa;
  tUint16 swap  = GUINT16_SWAP_LE_BE( value );
  tUint16 result;

  unsigned int s = Demarshal( MarshalByteOrder() ? 0 : 1,
                              &Marshal_Uint16Type, &result, &swap );

  if ( s != sizeof( tUint16 ) )
       return 1;

  if ( value != result )
       return 1;

  return 0;
}
Exemplo n.º 7
0
int
main( int argc, char *argv[] )
{
  tUint64 value = 0xfedc12345678abcdLL;
  tUint64 swap =  bswap_64( value );
  tUint64 result;

  unsigned int s = Demarshal( MarshalByteOrder() ? 0 : 1, 
                              &Uint64Type, &result, &swap );

  if ( s != sizeof( tUint64 ) )
       return 1;

  if ( value != result )
       return 1;

  return 0;
}
Exemplo n.º 8
0
int
main( int argc, char *argv[] )
{
  tInt32 value = 0x42aa1234;
  tInt32 swap = bswap_32( value );
  tInt32 result;

  unsigned int s = Demarshal( MarshalByteOrder() ? 0 : 1,
                              &Int32Type, &result, &swap );

  if ( s != sizeof( tInt32 ) )
       return 1;

  if ( value != result )
       return 1;

  return 0;
}
Exemplo n.º 9
0
int
DemarshalArray( int byte_order, const cMarshalType **types,
                void **data, const void *b )
{
  int i;
  int size = 0;
  const unsigned char *buffer = b;

  for( i = 0; types[i]; i++ )
     {
       int s = Demarshal( byte_order, types[i], data[i], buffer );

       if ( s < 0 )
	    return -1;

       size   += s;
       buffer += s;
     }

  return size;
}
Exemplo n.º 10
0
int
main( int argc, char *argv[] )
{
  tInt8         value = 0xfa;
  tInt8         result;
  unsigned char buffer[256];

  unsigned int s1 = Marshal( &Marshal_Int8Type, &value, buffer );

  if ( s1 != sizeof( tInt8 ) )
       return 1;

  unsigned int s2 = Demarshal( G_BYTE_ORDER, &Marshal_Int8Type, &result, buffer );

  if ( s2 != sizeof( tInt8 ) )
       return 1;

  if ( value != result )
       return 1;

  return 0;
}
Exemplo n.º 11
0
int
main( int argc, char *argv[] )
{
  tInt32         value = 0x42aa1234;
  tInt32         result;
  unsigned char  buffer[256];

  unsigned int s1 = Marshal( &Marshal_Int32Type, &value, buffer );

  if ( s1 != sizeof( tInt32 ) )
       return 1;

  unsigned int s2 = Demarshal( MarshalByteOrder(), &Marshal_Int32Type, &result, buffer );

  if ( s2 != sizeof( tInt32 ) )
       return 1;

  if ( value != result )
       return 1;

  return 0;
}
Exemplo n.º 12
0
int
main( int argc, char *argv[] )
{
  tUint64       value = 0xfedc12345678abcdLL;
  tUint64       result;
  unsigned char buffer[256];

  unsigned int s1 = Marshal( &Marshal_Uint64Type, &value, buffer );

  if ( s1 != sizeof( tUint64 ) )
       return 1;

  unsigned int s2 = Demarshal( MarshalByteOrder(), &Marshal_Uint64Type, &result, buffer );

  if ( s2 != sizeof( tUint64 ) )
       return 1;

  if ( value != result )
       return 1;

  return 0;
}
Exemplo n.º 13
0
int
main( int argc, char *argv[] )
{
    tInt64        value = 0x1234567890abcdefLL;
    tInt64        result;
    unsigned char buffer[256];

    unsigned int s1 = Marshal( &Marshal_Int64Type, &value, buffer );

    if ( s1 != sizeof( tInt64 ) )
        return 1;

    unsigned int s2 = Demarshal( G_BYTE_ORDER, &Marshal_Int64Type, &result, buffer );

    if ( s2 != sizeof( tInt64 ) )
        return 1;

    if ( value != result )
        return 1;

    return 0;
}
Exemplo n.º 14
0
int
main( int argc, char *argv[] )
{
  tFloat64      value = -47.345566;
  tFloat64      result;
  unsigned char buffer[256];

  unsigned int s1 = Marshal( &Marshal_Float64Type, &value, buffer );

  if ( s1 != sizeof( tFloat64 ) )
       return 1;

  unsigned int s2 = Demarshal( MarshalByteOrder(), &Marshal_Float64Type, &result, buffer );

  if ( s2 != sizeof( tFloat64 ) )
       return 1;

  if ( value != result )
       return 1;

  return 0;
}
Exemplo n.º 15
0
static int
CheckValue( cTest *v, cTest *r )
{
  unsigned char buffer[256];
  unsigned int s1 = Marshal( &TestType, v, buffer );
  unsigned int s2 = Demarshal( MarshalByteOrder(), &TestType, r, buffer );

  if ( s1 != s2 )
       return 1;

  if ( v->m_pad1 != r->m_pad1 )
       return 1;

  if ( v->m_mod != r->m_mod )
       return 1;

  if ( v->m_pad2 != r->m_pad2 )
       return 1;

  if ( v->m_pad3 != r->m_pad3 )
       return 1;

  return 0;
}
Exemplo n.º 16
0
int
Demarshal( int byte_order, const cMarshalType *type, 
           void *d, const void *b )
{
  if ( IsSimpleType( type->m_type ) )
       return DemarshalSimpleTypes( byte_order, type->m_type, d, b );

  int                  size = 0;
  unsigned char       *data  = d;
  const unsigned char *buffer = b;

  switch( type->m_type )
     {
       case eMtArray:
            {
              int i;

              for( i = 0; i < type->m_u.m_array.m_size; i++ )
                 {
                   int s = Demarshal( byte_order, type->m_u.m_array.m_type,
				      data, buffer );

		   if ( s < 0 )
			return -1;

                   data   += s;
                   buffer += s;
                   size   += s;
                 }
            }
            break;

       case eMtStruct:
	    {
	      int i;
 
	      for( i = 0; type->m_u.m_struct.m_elements[i].m_type == eMtStructElement; i++ )
		 {
		   cMarshalType *struct_element = &type->m_u.m_struct.m_elements[i];
                   assert( struct_element->m_type == eMtStructElement );

                   cMarshalType *st_type = struct_element->m_u.m_struct_element.m_type;
		   int s = 0;

		   if ( st_type->m_type == eMtUnion )
		      {
                        // the mod must be before this entry.
                        // this is a limitation of demarshaling of unions
                        assert( st_type->m_u.m_union.m_offset < i );
			const cMarshalType *mod = FindUnionModifierType( type, st_type, data );

			if ( mod )
			   {
			     s = Demarshal( byte_order, mod, data + struct_element->m_u.m_struct_element.m_offset, buffer );

			     if ( s < 0 )
				  return -1;
			   }
			else
			     return -1;
		      }
		   else if ( st_type->m_type == eMtVarArray )
		      {
                        // the array size must be before this entry.
                        // this is a limitation of demarshaling of var arrays
                        assert( st_type->m_u.m_var_array.m_size < i );

			tUint32 array_size = FindArraySize( type, st_type, data );

                        // only simple types can be array elements
                        assert( IsSimpleType( st_type->m_u.m_var_array.m_type->m_type ) );

                        const unsigned char *bb = buffer;
                        unsigned char       *dd = data + struct_element->m_u.m_struct_element.m_offset;
                        tUint32 j;

                        for( j = 0; j < array_size; j++ )
                           {
                             int si = Demarshal( byte_order, st_type->m_u.m_var_array.m_type,
						 dd, bb );

			     if ( si < 0 )
				  return -1;

                             bb += si;
                             dd += si;
                             s  += si;
                           }
                      }
                   else
		      {
			s = Demarshal( byte_order, st_type,
				       data + struct_element->m_u.m_struct_element.m_offset,
				       buffer );

			if ( s < 0 )
			     return -1;
		      }

		   buffer += s;
                   size   += s;
		 }
	    }

	    break;

       case eMtUnion:
	    // unions must me encapsulate in structs
            assert( 0 );
	    return -1;

       case eMtStructElement:
       case eMtUnionElement:
	    assert( 0 );
	    return -1;

       case eMtUserDefined:
	    assert( type->m_u.m_user_defined.m_demarshal );
	    size = type->m_u.m_user_defined.m_demarshal( byte_order, type, d, b,
							 type->m_u.m_user_defined. m_user_data );

	    if ( size < 0 )
		 return -1;

	    break;

       default:
            assert( 0 );
            return -1;
     }

  return size;
}
Exemplo n.º 17
0
    .m_v1.Oem              = 0,
    .m_pad2                = 48,
    .m_v2.IdrId            = 2,
    .m_v2.Persistent       = FALSE,
    .m_v2.Oem              = 3,
    .m_v3.IdrId            = 3,
    .m_v3.Persistent       = TRUE,
    .m_v3.Oem              = 2,
    .m_pad3                = 49
  };

  unsigned char *buffer = (unsigned char *)malloc(sizeof(value));
  cTest          result;

  unsigned int s1 = Marshal( &TestType, &value, buffer );
  unsigned int s2 = Demarshal( G_BYTE_ORDER, &TestType, &result, buffer );

  if ( s1 != s2 )
       return 1;

  if ( value.m_pad1 != result.m_pad1 )
       return 1;

  if ( !cmp_inventoryrec( &value.m_v1, &result.m_v1 ) )
       return 1;

  if ( value.m_pad2 != result.m_pad2 )
       return 1;

  if ( !cmp_inventoryrec( &value.m_v2, &result.m_v2 ) )
       return 1;
Exemplo n.º 18
0
    .m_v3.ResourceCapabilities                   = 1,
    .m_v3.HotSwapCapabilities                    = 1,
    .m_v3.ResourceSeverity                       = 1,
    .m_v3.ResourceFailed                         = FALSE,
    .m_v3.ResourceTag.DataType                   = SAHPI_TL_TYPE_ASCII6,
    .m_v3.ResourceTag.Language                   = SAHPI_LANG_TAJIK,
    .m_v3.ResourceTag.DataLength                 = 0,
    .m_v3.ResourceTag.Data                       = "",
    .m_pad3                                      = 49
  };

  unsigned char *buffer = (char *)malloc(sizeof(value));
  cTest          result;

  unsigned int s1 = Marshal( &TestType, &value, buffer );
  unsigned int s2 = Demarshal( MarshalByteOrder(), &TestType, &result, buffer );

  if ( s1 != s2 )
       return 1;

  if ( value.m_pad1 != result.m_pad1 )
       return 1;

  if ( !cmp_rptentry( &value.m_v1, &result.m_v1 ) )
       return 1;
  if ( !cmp_entities( &value.m_v1.ResourceEntity.Entry[0], &result.m_v1.ResourceEntity.Entry[0] ) )
       return 1;
  if ( !cmp_entities( &value.m_v1.ResourceEntity.Entry[1], &result.m_v1.ResourceEntity.Entry[1] ) )
       return 1;

  if ( value.m_pad2 != result.m_pad2 )
Exemplo n.º 19
0
int
Demarshal( int byte_order, const cMarshalType *type, void *d, const void *b )
{
  if ( IsSimpleType( type->m_type ) )
     {
       return DemarshalSimpleTypes( byte_order, type->m_type, d, b );
     }

  int                  size = 0;
  unsigned char       *data  = d;
  const unsigned char *buffer = b;

  switch( type->m_type )
     {
       case eMtArray:
	    {
	      const size_t nelems = type->u.m_array.m_nelements;

	      size_t i;
	      for( i = 0; i < nelems; i++ )
		 {
	           const cMarshalType *elem = type->u.m_array.m_element;
	           const size_t elem_sizeof = type->u.m_array.m_element_sizeof;

		   int cc = Demarshal( byte_order, elem, data, buffer );
		   if ( cc < 0 )
		      {
			   CRIT( "Demarshal: %s[%d]: failure, cc = %d!", type->m_name, i, cc );
			   return cc;
		      }

		   data   += elem_sizeof;
		   buffer += cc;
		   size   += cc;
		 }
	    }
	    break;

       case eMtStruct:
	    {
	      const cMarshalType *elems = &type->u.m_struct.m_elements[0];
	      size_t i;
	      for( i = 0; elems[i].m_type == eMtStructElement; i++ )
		 {
		   const cMarshalType *elem = elems[i].u.m_struct_element.m_element;
		   const size_t offset      = elems[i].u.m_struct_element.m_offset;
		   int cc = 0;

		   if ( elem->m_type == eMtUnion )
		      {
			const size_t mod2_idx = elem->u.m_union.m_mod_idx;
			if ( mod2_idx >= i ) {
			    // NB: this is a limitation of demarshaling of unions
 	                    CRIT( "Demarshal: %s:%s: mod field must be before union!",
			          type->m_name, elems[i].m_name );
			    return -EINVAL;
			}
			const size_t mod2 = GetStructElementIntegerValue( type, mod2_idx, data );
			const cMarshalType *elem2 = GetUnionElement( elem, mod2 );
			if ( !elem2 ) {
 	                    CRIT( "Demarshal: %s:%s: invalid mod value %u!",
			          type->m_name, elems[i].m_name, (unsigned int)mod2 );
			    return -EINVAL;
			}

			cc = Demarshal( byte_order, elem2, data + offset, buffer );
			if ( cc < 0 )
			   {
			     CRIT( "Demarshal: %s:%s, mod %u: failure, cc = %d!",
			           type->m_name, elems[i].m_name, (unsigned int)mod2, cc );
			     return cc;
			   }
		      }
		   else if ( elem->m_type == eMtVarArray )
		      {
			const size_t nelems2_idx   = elem->u.m_var_array.m_nelements_idx;
			const cMarshalType *elem2  = elem->u.m_var_array.m_element;
			const size_t elem2_sizeof  = elem->u.m_var_array.m_element_sizeof;

			if ( nelems2_idx >= i ) {
			    // NB: this is a limitation of demarshaling of var arrays
 	                    CRIT( "Demarshal: %s:%s: nelements field must be before vararray!",
			          type->m_name, elems[i].m_name );
			    return -EINVAL;
			}
			const size_t nelems2 = GetStructElementIntegerValue( type, nelems2_idx, data );

			// allocate storage for var array content
			unsigned char *data2 = g_new0(unsigned char, nelems2 * elem2_sizeof );
			// (data + offset ) points to pointer to var array content
			memcpy(data + offset, &data2, sizeof(void *));

			const unsigned char *buffer2 = buffer;
			size_t i2;
			for( i2 = 0; i2 < nelems2; i2++ )
			   {
			     int cc2 = Demarshal( byte_order, elem2, data2, buffer2 );
			     if ( cc2 < 0 )
				{
			          CRIT( "Demarshal: %s:%s[%d]: failure, cc = %d!",
			                 type->m_name, elems[i].m_name, i2, cc2 );
				  return cc2;
				}

			     data2   += elem2_sizeof;
			     buffer2 += cc2;
			     cc      += cc2;
			   }
		      }
		   else
		      {
			cc = Demarshal( byte_order, elem, data + offset, buffer );
			if ( cc < 0 )
			   {
			     CRIT( "Demarshal: %s:%s: failure, cc = %d!",
			           type->m_name, elems[i].m_name, cc );
			     return cc;
			   }
		      }

		   buffer += cc;
		   size   += cc;
		 }
	    }

	    break;

       case eMtUserDefined:
	    {
	      tDemarshalFunction demarshaller = type->u.m_user_defined.m_demarshaller;
	      void * user_data = type->u.m_user_defined.m_user_data;
	      size = demarshaller ? demarshaller( byte_order, type, d, b, user_data ) : 0;
            }
	    break;

       default:
	    return -ENOSYS;
     }
Exemplo n.º 20
0
int
Demarshal( int byte_order, const cMarshalType *type, 
           void *d, const void *b )
{
  if ( IsSimpleType( type->m_type ) )
       return DemarshalSimpleTypes( byte_order, type->m_type, d, b );

  int                  size = 0;
  unsigned char       *data  = d;
  const unsigned char *buffer = b;

  switch( type->m_type )
     {
       case eMtArray:
            {
              int i;

              for( i = 0; i < type->m_u.m_array.m_size; i++ )
                 {
                   int s = Demarshal( byte_order, type->m_u.m_array.m_type,
				      data, buffer );

		   if ( s < 0 ) {
                           assert( 0 );
                           return -1;
                   }

                   data   += s;
                   buffer += s;
                   size   += s;
                 }
            }
            break;

       case eMtStruct:
	    {
	      int i;
 
	      for( i = 0; type->m_u.m_struct.m_elements[i].m_type == eMtStructElement; i++ )
		 {
		   cMarshalType *struct_element = &type->m_u.m_struct.m_elements[i];
                   assert( struct_element->m_type == eMtStructElement );

                   cMarshalType *st_type = struct_element->m_u.m_struct_element.m_type;
		   int s = 0;

		   if ( st_type->m_type == eMtUnion )
		      {
                        // the mod must be before this entry.
                        // this is a limitation of demarshaling of unions
                        assert( st_type->m_u.m_union.m_offset < i );
			const cMarshalType *mod = FindUnionModifierType( type, st_type, data );

			if ( mod )
			   {
			     s = Demarshal( byte_order, mod, data + struct_element->m_u.m_struct_element.m_offset, buffer );

			     if ( s < 0 ) {
                                     assert( 0 );
                                     return -1;
                             }
			   }
                        else {
                                assert( 0 );
                                return -1;
                        }
		      }
		   else if ( st_type->m_type == eMtVarArray )
		      {
                        // the array size must be before this entry.
                        // this is a limitation of demarshaling of var arrays
                        assert( st_type->m_u.m_var_array.m_size < i );

			tUint32 array_size = FindArraySize( type, st_type, data );

                        // only simple types can be array elements
                        //assert( IsSimpleType( st_type->m_u.m_var_array.m_type->m_type ) );			
			
                        const unsigned char *bb = buffer;
                        const cMarshalType *va_type = st_type->m_u.m_var_array.m_type;
                        // FIXME: This is a hack! I'm assuming the elements in
                        // the variable array are structs. That's because this
                        // is the only instance for which we use var arrays.
                        unsigned char *dd =
                        	(unsigned char *)malloc(va_type->m_u.m_struct.m_size*array_size);
			memset(dd, 0, va_type->m_u.m_struct.m_size*array_size);
                        unsigned char *vardata = data + struct_element->m_u.m_struct_element.m_offset;
                        tUint32 j;
                        memcpy(vardata, &dd, sizeof(void *));

                        for( j = 0; j < array_size; j++ )
                           {
                             int si = Demarshal( byte_order, st_type->m_u.m_var_array.m_type,
						 dd, bb );

			     if ( si < 0 ) {
                                     assert( 0 );
                                     return -1;
                             }

                             bb += si;
                             dd += si;
                             s  += si;
                           }
                      }
                   else
		      {
			s = Demarshal( byte_order, st_type,
				       data + struct_element->m_u.m_struct_element.m_offset,
				       buffer );

			if ( s < 0 ) {
                                assert( 0 );
                                return -1;
                        }
		      }

		   buffer += s;
                   size   += s;
		 }
	    }

	    break;

       case eMtUnion:
	    // unions must me encapsulate in structs
            assert( 0 );
	    return -1;

       case eMtStructElement:
       case eMtUnionElement:
	    assert( 0 );
	    return -1;

       case eMtUserDefined:
	    assert( type->m_u.m_user_defined.m_demarshal );
	    size = type->m_u.m_user_defined.m_demarshal( byte_order, type, d, b,
							 type->m_u.m_user_defined. m_user_data );

	    if ( size < 0 ) {
                    assert( 0 );
                    return -1;
            }

	    break;

       default:
            assert( 0 );
            return -1;
     }

  return size;
}