mirror of
https://github.com/php/php-src.git
synced 2024-12-01 22:03:36 +08:00
311 lines
8.1 KiB
C
311 lines
8.1 KiB
C
/*
|
|
+----------------------------------------------------------------------+
|
|
| PHP version 4.0 |
|
|
+----------------------------------------------------------------------+
|
|
| Copyright (c) 1997, 1998, 1999, 2000 The PHP Group |
|
|
+----------------------------------------------------------------------+
|
|
| This source file is subject to version 2.02 of the PHP license, |
|
|
| that is bundled with this package in the file LICENSE, and is |
|
|
| available at through the world-wide-web at |
|
|
| http://www.php.net/license/2_02.txt. |
|
|
| If you did not receive a copy of the PHP license and are unable to |
|
|
| obtain it through the world-wide-web, please send a note to |
|
|
| license@php.net so we can mail you a copy immediately. |
|
|
+----------------------------------------------------------------------+
|
|
| Author: David Eriksson <david@2good.com> |
|
|
+----------------------------------------------------------------------+
|
|
*/
|
|
|
|
/*
|
|
* $Id$
|
|
* vim: syntax=c tabstop=2 shiftwidth=2
|
|
*/
|
|
|
|
/* -----------------------------------------------------------------------
|
|
*
|
|
* Functions to convert a CORBA_NamedValue to a zval
|
|
*
|
|
* -----------------------------------------------------------------------
|
|
*/
|
|
#include <zend_API.h>
|
|
#include "namedvalue_to_zval.h"
|
|
#include "common.h"
|
|
#include "object.h"
|
|
#include "struct.h"
|
|
#include "corba.h"
|
|
|
|
#include <ORBitutil/util.h> /* for ALIGN_ADDRESS() */
|
|
|
|
static zend_bool satellite_any_to_zval_boolean(
|
|
const CORBA_any * pSource, zval * pDestination)
|
|
{
|
|
CORBA_boolean * p_value = (CORBA_boolean *)pSource->_value;
|
|
ZVAL_BOOL(pDestination, *p_value != 0);
|
|
return TRUE;
|
|
}
|
|
|
|
static zend_bool satellite_any_to_zval_double(
|
|
const CORBA_any * pSource, zval * pDestination)
|
|
{
|
|
CORBA_double * p_value = (CORBA_double *)pSource->_value;
|
|
ZVAL_DOUBLE(pDestination, *p_value);
|
|
return TRUE;
|
|
}
|
|
|
|
static zend_bool satellite_any_to_zval_long(
|
|
const CORBA_any * pSource, zval * pDestination)
|
|
{
|
|
CORBA_long * p_value = (CORBA_long *)pSource->_value;
|
|
ZVAL_LONG(pDestination, *p_value);
|
|
return TRUE;
|
|
}
|
|
|
|
static zend_bool satellite_any_to_zval_short(
|
|
const CORBA_any * pSource, zval * pDestination)
|
|
{
|
|
CORBA_short * p_value = (CORBA_short *)pSource->_value;
|
|
ZVAL_LONG(pDestination, *p_value);
|
|
return TRUE;
|
|
}
|
|
|
|
|
|
static zend_bool satellite_any_to_zval_objref(
|
|
const CORBA_any * pSource, zval * pDestination)
|
|
{
|
|
CORBA_Object * p_value = (CORBA_Object *)pSource->_value;
|
|
CORBA_Object dup =
|
|
CORBA_Object_duplicate(*p_value, orbit_get_environment());
|
|
|
|
return OrbitObject_Create(dup, pDestination);
|
|
}
|
|
|
|
static zend_bool satellite_any_to_zval_sequence(
|
|
const CORBA_any * pSource, zval * pDestination)
|
|
{
|
|
int i;
|
|
int length = 0;
|
|
void ** pp_members = NULL;
|
|
zend_bool success = FALSE;
|
|
CORBA_NamedValue source_item;
|
|
zval * p_destination_item = NULL;
|
|
CORBA_TypeCode content_type = NULL;
|
|
CORBA_sequence_octet * p_value =
|
|
(CORBA_sequence_octet *)pSource->_value;
|
|
|
|
/* get array to items */
|
|
pp_members = (void **)p_value->_buffer;
|
|
|
|
/* get number of members */
|
|
length = p_value->_length;
|
|
|
|
/* get type of items */
|
|
content_type = CORBA_TypeCode_content_type(
|
|
pSource->_type, orbit_get_environment());
|
|
if (content_type == NULL)
|
|
goto error;
|
|
|
|
/* set zval members */
|
|
#if 0
|
|
pDestination->type = IS_ARRAY;
|
|
pDestination->refcount = 1;
|
|
|
|
pDestination->value.ht = orbit_new(HashTable);
|
|
|
|
zend_hash_init(
|
|
pDestination->value.ht, /* hash table */
|
|
0, /* size */
|
|
NULL, /* hash function */
|
|
ZVAL_PTR_DTOR, /* destructor */
|
|
0); /* persistent */
|
|
#else
|
|
array_init(pDestination);
|
|
#endif
|
|
|
|
for (i = 0; i < length; i++)
|
|
{
|
|
p_destination_item = NULL;
|
|
memset(&source_item, 0, sizeof(CORBA_NamedValue));
|
|
|
|
source_item.argument._type = content_type;
|
|
source_item.argument._value = &pp_members[i];
|
|
|
|
ALLOC_ZVAL(p_destination_item);
|
|
|
|
/* convert item */
|
|
success = orbit_namedvalue_to_zval(
|
|
&source_item,
|
|
p_destination_item);
|
|
|
|
if (!success)
|
|
goto error;
|
|
|
|
/* add to hashtable */
|
|
INIT_PZVAL(p_destination_item); /* testing! */
|
|
zend_hash_next_index_insert(
|
|
pDestination->value.ht,
|
|
&p_destination_item,
|
|
sizeof(zval *),
|
|
NULL);
|
|
|
|
/* FREE_ZVAL(p_destination_item);*/
|
|
}
|
|
|
|
return TRUE;
|
|
|
|
error:
|
|
return FALSE;
|
|
}
|
|
|
|
static zend_bool satellite_any_to_zval_string(
|
|
const CORBA_any * pSource, zval * pDestination)
|
|
{
|
|
char ** pp_value = (char **)pSource->_value;
|
|
ZVAL_STRING(pDestination, (*pp_value), TRUE);
|
|
return TRUE;
|
|
}
|
|
|
|
static zend_bool satellite_any_to_zval_struct(
|
|
const CORBA_any * pSource, zval * pDestination)
|
|
{
|
|
int member_count = 0;
|
|
CORBA_TypeCode type = NULL;
|
|
char * p_repository_id = NULL;
|
|
OrbitStruct * p_struct = NULL;
|
|
|
|
/* make type a shortcut to the typecode */
|
|
type = pSource->_type;
|
|
|
|
/* find out the repository id */
|
|
p_repository_id = CORBA_TypeCode_id(type, orbit_get_environment());
|
|
/* do not check for exception because we may be converting one! */
|
|
if (p_repository_id == NULL)
|
|
goto error;
|
|
|
|
if (!OrbitStruct_Create(p_repository_id, pDestination))
|
|
goto error;
|
|
|
|
p_struct = OrbitStruct_RetrieveData(pDestination);
|
|
if (p_struct == NULL)
|
|
goto error;
|
|
|
|
/* now we know the source and destination matches! */
|
|
member_count = CORBA_TypeCode_member_count(type, orbit_get_environment());
|
|
/* do not check for exception because we may be converting one! */
|
|
|
|
if (member_count > 0)
|
|
{
|
|
int i;
|
|
zend_bool success;
|
|
zval destination_item;
|
|
CORBA_NamedValue source_item;
|
|
char * p_buffer = (char *)pSource->_value;
|
|
|
|
for (i = 0; i < member_count; i++)
|
|
{
|
|
int alignment;
|
|
char * p_name =
|
|
CORBA_TypeCode_member_name(type, i, orbit_get_environment());
|
|
if (p_name == NULL)
|
|
goto error;
|
|
|
|
/* prepare destination item */
|
|
ZVAL_NULL(&destination_item);
|
|
|
|
/* prepare source item */
|
|
memset(&source_item, 0, sizeof(CORBA_NamedValue));
|
|
source_item.argument._type =
|
|
CORBA_TypeCode_member_type(type, i, orbit_get_environment());
|
|
if (source_item.argument._type == NULL)
|
|
goto error;
|
|
|
|
/* align pointer and set value */
|
|
alignment = ORBit_find_alignment(source_item.argument._type);
|
|
p_buffer = ALIGN_ADDRESS(p_buffer, alignment);
|
|
source_item.argument._value = p_buffer;
|
|
|
|
/* convert item */
|
|
if (!orbit_namedvalue_to_zval(&source_item, &destination_item))
|
|
goto error;
|
|
|
|
/* set attribute */
|
|
success = OrbitStruct_PutProperty(p_struct, p_name, &destination_item);
|
|
if (!success) goto error;
|
|
|
|
/* advance buffer */
|
|
p_buffer += ORBit_gather_alloc_info(source_item.argument._type);
|
|
}
|
|
}
|
|
|
|
|
|
error:
|
|
return FALSE;
|
|
}
|
|
|
|
zend_bool satellite_any_to_zval(
|
|
const CORBA_any * pSource, zval * pDestination)
|
|
{
|
|
zend_bool success = FALSE;
|
|
CORBA_TCKind kind;
|
|
|
|
if (pSource->_type == NULL || pDestination == NULL)
|
|
return FALSE;
|
|
|
|
kind = CORBA_TypeCode_kind(
|
|
pSource->_type,
|
|
orbit_get_environment()); /* does not throw exceptions */
|
|
|
|
switch (kind)
|
|
{
|
|
case CORBA_tk_boolean:
|
|
success = satellite_any_to_zval_boolean(pSource, pDestination);
|
|
break;
|
|
|
|
case CORBA_tk_double:
|
|
success = satellite_any_to_zval_double(pSource, pDestination);
|
|
break;
|
|
|
|
case CORBA_tk_enum:
|
|
case CORBA_tk_long:
|
|
success = satellite_any_to_zval_long(pSource, pDestination);
|
|
break;
|
|
|
|
case CORBA_tk_objref:
|
|
success = satellite_any_to_zval_objref(pSource, pDestination);
|
|
break;
|
|
|
|
case CORBA_tk_sequence:
|
|
success = satellite_any_to_zval_sequence(pSource, pDestination);
|
|
break;
|
|
|
|
case CORBA_tk_short:
|
|
success = satellite_any_to_zval_short(pSource, pDestination);
|
|
break;
|
|
|
|
case CORBA_tk_string:
|
|
success = satellite_any_to_zval_string(pSource, pDestination);
|
|
break;
|
|
|
|
case CORBA_tk_struct: /* 15 */
|
|
case CORBA_tk_except: /* 22 */
|
|
success = satellite_any_to_zval_struct(pSource, pDestination);
|
|
break;
|
|
|
|
default:
|
|
/* printf("unsupported corba TCKind %i\n", kind);*/
|
|
/* php_error(E_WARNING, "unsupported corba TCKind %i", kind);*/
|
|
}
|
|
|
|
return success;
|
|
}
|
|
|
|
zend_bool orbit_namedvalue_to_zval(
|
|
const CORBA_NamedValue * pSource, zval * pDestination)
|
|
{
|
|
if (pSource == NULL)
|
|
return FALSE;
|
|
|
|
return satellite_any_to_zval(&pSource->argument, pDestination);
|
|
}
|
|
|
|
|