void rpc_ss_ndr_u_param_cs_shadow ( idl_ulong_int type_index, /* [in] Index of start of definitions of parameter list */ IDL_cs_shadow_elt_t *cs_shadow, /* [in] Address of cs-shadow */ IDL_msp_t IDL_msp ) { idl_byte *type_vec_ptr; idl_byte type_byte; idl_ulong_int param_index; /* Loop over parameters. Exit when DT_RLSE_SHADOW found */ type_vec_ptr = (IDL_msp->IDL_type_vec) + type_index; for ( ; ; ) { IDL_GET_LONG_FROM_VECTOR(param_index,type_vec_ptr); do { type_byte = *type_vec_ptr; type_vec_ptr++; switch(type_byte) { case IDL_DT_CS_ATTRIBUTE: /* The local value of the attribute variable is taken from the shadow */ rpc_ss_put_typed_integer( cs_shadow[param_index-1].IDL_data.IDL_value, *type_vec_ptr, IDL_msp->IDL_param_vec[param_index]); type_vec_ptr++; /* attribute type */ break; /* For any other parameters we just need to move over them */ case IDL_DT_BYTE: case IDL_DT_CHAR: case IDL_DT_BOOLEAN: case IDL_DT_DOUBLE: case IDL_DT_ENUM: case IDL_DT_FLOAT: case IDL_DT_SMALL: case IDL_DT_SHORT: case IDL_DT_LONG: case IDL_DT_HYPER: case IDL_DT_USMALL: case IDL_DT_USHORT: case IDL_DT_ULONG: case IDL_DT_UHYPER: case IDL_DT_IGNORE: case IDL_DT_V1_ENUM: case IDL_DT_ERROR_STATUS: case IDL_DT_IN_CONTEXT: case IDL_DT_IN_OUT_CONTEXT: case IDL_DT_OUT_CONTEXT: break; case IDL_DT_FIXED_ARRAY: case IDL_DT_VARYING_ARRAY: case IDL_DT_CONF_ARRAY: case IDL_DT_OPEN_ARRAY: /* Properties byte */ type_vec_ptr++; IDL_DISCARD_LONG_FROM_VECTOR(type_vec_ptr); /* Full array definition */ IDL_DISCARD_LONG_FROM_VECTOR(type_vec_ptr); /* Flattened array definition */ break; case IDL_DT_FIXED_STRUCT: case IDL_DT_CONF_STRUCT: case IDL_DT_V1_CONF_STRUCT: case IDL_DT_ENC_UNION: case IDL_DT_N_E_UNION: case IDL_DT_FULL_PTR: case IDL_DT_UNIQUE_PTR: case IDL_DT_REF_PTR: case IDL_DT_TRANSMIT_AS: case IDL_DT_REPRESENT_AS: case IDL_DT_PIPE: case IDL_DT_CS_TYPE: /* Properties byte */ type_vec_ptr++; IDL_DISCARD_LONG_FROM_VECTOR(type_vec_ptr); break; case IDL_DT_ALLOCATE_REF: rpc_ss_discard_allocate_ref(&type_vec_ptr); break; case IDL_DT_CS_SHADOW: case IDL_DT_FREE_REP: IDL_DISCARD_LONG_FROM_VECTOR(type_vec_ptr); break; case IDL_DT_PASSED_BY_REF: case IDL_DT_STRING: case IDL_DT_ALLOCATE: case IDL_DT_V1_ARRAY: case IDL_DT_V1_STRING: case IDL_DT_DELETED_NODES: case IDL_DT_CS_ARRAY: break; case IDL_DT_CS_RLSE_SHADOW: rpc_ss_mem_item_free(&IDL_msp->IDL_mem_handle, (byte_p_t)cs_shadow); return; case IDL_DT_RANGE: IDL_DISCARD_LONG_FROM_VECTOR(type_vec_ptr); IDL_DISCARD_LONG_FROM_VECTOR(type_vec_ptr); break; case IDL_DT_EOL: break; default: #ifdef DEBUG_INTERP printf("rpc_ss_ndr_u_param_cs_shadow:unrecognized type %d\n", type_byte); exit(0); #endif DCETHREAD_RAISE(rpc_x_coding_error); } } while (type_byte != IDL_DT_EOL); } }
void rpc_ss_ndr_m_param_cs_shadow ( idl_byte *type_vec_ptr, /* [in] After shadow length */ idl_ulong_int param_index, /* [in] Index for first parameter */ /* Later used for index of current parameter */ idl_ulong_int shadow_length, /* [in] Size of cs-shadow */ IDL_cs_shadow_elt_t **p_cs_shadow, /* [out] Address of cs-shadow */ IDL_msp_t IDL_msp ) { idl_byte type_byte; IDL_cs_shadow_elt_t *cs_shadow; unsigned32 i; /* Allocate the cs-shadow */ cs_shadow = (IDL_cs_shadow_elt_t *)rpc_ss_mem_alloc (&IDL_msp->IDL_mem_handle, shadow_length * sizeof(IDL_cs_shadow_elt_t)); /* Initialize its "release" fields */ for (i=0; i<shadow_length; i++) cs_shadow[i].IDL_release = idl_false; /* Loop over parameters. Exit when DT_RLSE_SHADOW encountered */ for (i = 0; ; i++) { if (i != 0) { /* On entry we already have the parameter index the DT_CS_SHADOW was attached to */ IDL_GET_LONG_FROM_VECTOR(param_index,type_vec_ptr); } do { type_byte = *type_vec_ptr; type_vec_ptr++; switch(type_byte) { case IDL_DT_CS_ARRAY: rpc_ss_ndr_m_array_shadow(NULL, NULL, NULL, cs_shadow, param_index - 1, &type_vec_ptr, IDL_msp); break; /* For parameters that are not array of [cs_char], advance the definition pointer. And note they have no translation storage */ case IDL_DT_BYTE: case IDL_DT_CHAR: case IDL_DT_BOOLEAN: case IDL_DT_DOUBLE: case IDL_DT_ENUM: case IDL_DT_FLOAT: case IDL_DT_SMALL: case IDL_DT_SHORT: case IDL_DT_LONG: case IDL_DT_HYPER: case IDL_DT_USMALL: case IDL_DT_USHORT: case IDL_DT_ULONG: case IDL_DT_UHYPER: case IDL_DT_IGNORE: case IDL_DT_V1_ENUM: case IDL_DT_ERROR_STATUS: case IDL_DT_IN_CONTEXT: case IDL_DT_IN_OUT_CONTEXT: case IDL_DT_OUT_CONTEXT: break; case IDL_DT_FIXED_ARRAY: case IDL_DT_VARYING_ARRAY: case IDL_DT_CONF_ARRAY: case IDL_DT_OPEN_ARRAY: /* Properties byte */ type_vec_ptr++; IDL_DISCARD_LONG_FROM_VECTOR(type_vec_ptr); /* Full array definition */ IDL_DISCARD_LONG_FROM_VECTOR(type_vec_ptr); /* Flattened array definition */ break; case IDL_DT_FIXED_STRUCT: case IDL_DT_CONF_STRUCT: case IDL_DT_V1_CONF_STRUCT: case IDL_DT_ENC_UNION: case IDL_DT_N_E_UNION: case IDL_DT_FULL_PTR: case IDL_DT_UNIQUE_PTR: case IDL_DT_REF_PTR: case IDL_DT_TRANSMIT_AS: case IDL_DT_REPRESENT_AS: case IDL_DT_PIPE: case IDL_DT_CS_TYPE: /* Properties byte */ type_vec_ptr++; IDL_DISCARD_LONG_FROM_VECTOR(type_vec_ptr); break; case IDL_DT_ALLOCATE_REF: rpc_ss_discard_allocate_ref(&type_vec_ptr); break; case IDL_DT_FREE_REP: IDL_DISCARD_LONG_FROM_VECTOR(type_vec_ptr); break; case IDL_DT_PASSED_BY_REF: case IDL_DT_STRING: case IDL_DT_ALLOCATE: case IDL_DT_V1_ARRAY: case IDL_DT_V1_STRING: case IDL_DT_DELETED_NODES: case IDL_DT_CS_ATTRIBUTE: case IDL_DT_EOL: break; case IDL_DT_RANGE: IDL_DISCARD_LONG_FROM_VECTOR(type_vec_ptr); IDL_DISCARD_LONG_FROM_VECTOR(type_vec_ptr); break; case IDL_DT_CS_RLSE_SHADOW: *p_cs_shadow = cs_shadow; return; default: #ifdef DEBUG_INTERP printf("rpc_ss_ndr_m_param_cs_shadow:unrecognized type %d\n", type_byte); exit(0); #endif DCETHREAD_RAISE(rpc_x_coding_error); } } while (type_byte != IDL_DT_EOL); } }