#include <commonp.h>
#include <ns.h>
#include <com.h>
#include <nsp.h>
#include <dce/idlbase.h>
#include <dce/rpcsts.h>
#include <codesets.h>
#include <dce/codesets_stub.h>
#include <stdio.h>
#include <stdlib.h>
#include <langinfo.h>
#include <codesets.h>
#include <cs_s.h>
PUBLIC void cs_byte_to_netcs
(
rpc_binding_handle_t h,
unsigned32 tag,
idl_byte *ldata,
unsigned32 l_data_len,
idl_byte *wdata,
unsigned32 *p_w_data_len,
error_status_t *status
)
{
char *current_codeset;
unsigned32 current_rgy_codeset;
int i;
idl_byte *wdata_temp, *ldata_temp;
rpc_cs_method_eval_p_t method_p;
rpc_cs_tags_eval_p_t tags_p;
rpc_binding_rep_p_t bind_p;
bind_p = (rpc_binding_rep_p_t)h;
if (!RPC_BINDING_IS_SERVER (bind_p))
{
switch (bind_p->cs_eval.key)
{
case RPC_CS_EVAL_METHOD:
method_p = &bind_p->cs_eval.tagged_union.method_key;
switch (method_p->method)
{
case RPC_EVAL_NO_CONVERSION:
case RPC_EVAL_RMIR_MODEL:
case RPC_EVAL_SMIR_MODEL:
wdata_temp = wdata;
ldata_temp = ldata;
for (i=0; i<= l_data_len; i++)
*wdata_temp++ = *ldata_temp++;
if (p_w_data_len != NULL)
{
*p_w_data_len = strlen((char *)wdata) + 1;
}
*status = rpc_s_ok;
break;
case RPC_EVAL_CMIR_MODEL:
case RPC_EVAL_INTERMEDIATE_MODEL:
case RPC_EVAL_UNIVERSAL_MODEL:
stub_conversion (
h,
RPC_BINDING_IS_SERVER (bind_p),
method_p->tags.client_tag,
tag,
ldata,
l_data_len,
wdata,
p_w_data_len,
status );
if (p_w_data_len != NULL)
{
*p_w_data_len = strlen((char *)wdata) + 1;
}
break;
default:
*status = rpc_s_ss_incompatible_codesets;
break;
}
break;
case RPC_CS_EVAL_TAGS:
tags_p = &bind_p->cs_eval.tagged_union.tags_key;
if (tag == tags_p->client_tag)
{
wdata_temp = wdata;
ldata_temp = ldata;
for (i=0; i<= l_data_len; i++)
*wdata_temp++ = *ldata_temp++;
if (p_w_data_len != NULL)
{
*p_w_data_len = strlen((char *)wdata) + 1;
}
*status = rpc_s_ok;
}
else
{
stub_conversion (
h,
RPC_BINDING_IS_SERVER (bind_p),
tags_p->client_tag,
tag,
ldata,
l_data_len,
wdata,
p_w_data_len,
status );
if (p_w_data_len != NULL)
{
*p_w_data_len = strlen((char *)wdata) + 1;
}
}
break;
default:
*status = rpc_s_ss_incompatible_codesets;
break;
}
}
else
{
current_codeset = nl_langinfo(CODESET);
dce_cs_loc_to_rgy(
(unsigned_char_p_t)current_codeset,
¤t_rgy_codeset,
NULL, NULL,
status);
if (*status != dce_cs_c_ok)
{
*status = rpc_s_ok;
return;
}
if (tag == current_rgy_codeset)
{
wdata_temp = wdata;
ldata_temp = ldata;
for (i=0; i<= l_data_len; i++)
*wdata_temp++ = *ldata_temp++;
if (p_w_data_len != NULL)
{
*p_w_data_len = strlen((char *)wdata) + 1;
}
*status = rpc_s_ok;
}
else
{
stub_conversion (
h,
RPC_BINDING_IS_SERVER (bind_p),
current_rgy_codeset,
tag,
ldata,
l_data_len,
wdata,
p_w_data_len,
status );
if (p_w_data_len != NULL)
{
*p_w_data_len = strlen((char *)wdata) + 1;
}
}
}
return;
}
PUBLIC void wchar_t_to_netcs
(
rpc_binding_handle_t h,
unsigned32 tag,
wchar_t *ldata,
unsigned32 l_data_len,
idl_byte *wdata,
unsigned32 *p_w_data_len,
error_status_t *status
)
{
char *current_codeset;
unsigned32 current_rgy_codeset;
idl_byte *byte_ldata;
idl_byte *t_byte_ldata;
size_t ldata_length;
size_t conv_ret;
int i;
idl_byte *wdata_temp, *ldata_temp;
rpc_cs_method_eval_p_t method_p;
rpc_cs_tags_eval_p_t tags_p;
rpc_binding_rep_p_t bind_p;
ldata_length = l_data_len * MB_CUR_MAX + MB_CUR_MAX;
RPC_MEM_ALLOC (
byte_ldata,
unsigned_char_p_t,
ldata_length,
RPC_C_MEM_STRING,
RPC_C_MEM_WAITOK);
t_byte_ldata = byte_ldata;
i = ldata_length;
while (i--)
*t_byte_ldata++ = '\0';
conv_ret = wcstombs((char *)byte_ldata, ldata, ldata_length);
if (conv_ret == -1)
{
*status = rpc_s_ss_invalid_char_input;
RPC_MEM_FREE(byte_ldata, RPC_C_MEM_STRING);
return;
}
bind_p = (rpc_binding_rep_p_t)h;
if (!RPC_BINDING_IS_SERVER (bind_p))
{
switch (bind_p->cs_eval.key)
{
case RPC_CS_EVAL_METHOD:
method_p = &bind_p->cs_eval.tagged_union.method_key;
switch (method_p->method)
{
case RPC_EVAL_NO_CONVERSION:
case RPC_EVAL_RMIR_MODEL:
case RPC_EVAL_SMIR_MODEL:
wdata_temp = wdata;
ldata_temp = byte_ldata;
for (i=0; i<= conv_ret; i++)
*wdata_temp++ = *ldata_temp++;
if (p_w_data_len != NULL)
*p_w_data_len = conv_ret;
*status = rpc_s_ok;
break;
case RPC_EVAL_CMIR_MODEL:
case RPC_EVAL_INTERMEDIATE_MODEL:
case RPC_EVAL_UNIVERSAL_MODEL:
stub_conversion (
h,
RPC_BINDING_IS_SERVER (bind_p),
method_p->tags.client_tag,
tag,
byte_ldata,
conv_ret,
wdata,
p_w_data_len,
status );
break;
default:
*status = rpc_s_ss_incompatible_codesets;
break;
}
break;
case RPC_CS_EVAL_TAGS:
tags_p = &bind_p->cs_eval.tagged_union.tags_key;
if (tag == tags_p->client_tag)
{
wdata_temp = wdata;
ldata_temp = byte_ldata;
for (i=0; i<= conv_ret; i++)
*wdata_temp++ = *ldata_temp++;
if (p_w_data_len != NULL)
*p_w_data_len = conv_ret;
*status = rpc_s_ok;
}
else
{
stub_conversion (
h,
RPC_BINDING_IS_SERVER (bind_p),
tags_p->client_tag,
tag,
byte_ldata,
conv_ret,
wdata,
p_w_data_len,
status );
}
break;
default:
*status = rpc_s_ss_incompatible_codesets;
break;
}
}
else
{
current_codeset = nl_langinfo(CODESET);
dce_cs_loc_to_rgy(
(unsigned_char_p_t)current_codeset,
¤t_rgy_codeset,
NULL, NULL,
status);
if (*status != dce_cs_c_ok)
{
*status = rpc_s_ok;
RPC_MEM_FREE(byte_ldata, RPC_C_MEM_STRING);
return;
}
if (tag == current_rgy_codeset)
{
wdata_temp = wdata;
ldata_temp = byte_ldata;
for (i=0; i<= conv_ret; i++)
*wdata_temp++ = *ldata_temp++;
if (p_w_data_len != NULL)
*p_w_data_len = conv_ret;
*status = rpc_s_ok;
}
else
{
stub_conversion (
h,
RPC_BINDING_IS_SERVER (bind_p),
current_rgy_codeset,
tag,
byte_ldata,
conv_ret,
wdata,
p_w_data_len,
status );
}
}
RPC_MEM_FREE(byte_ldata, RPC_C_MEM_STRING);
return;
}
PUBLIC void cs_byte_from_netcs
(
rpc_binding_handle_t h,
unsigned32 tag,
idl_byte *wdata,
unsigned32 w_data_len,
unsigned32 l_storage_len,
idl_byte *ldata,
unsigned32 *p_l_data_len,
error_status_t *status
)
{
char *current_codeset;
unsigned32 current_rgy_codeset;
int i;
idl_byte *wdata_temp, *ldata_temp;
rpc_cs_method_eval_p_t method_p;
rpc_cs_tags_eval_p_t tags_p;
rpc_binding_rep_p_t bind_p;
bind_p = (rpc_binding_rep_p_t)h;
if (!RPC_BINDING_IS_SERVER (bind_p))
{
switch (bind_p->cs_eval.key)
{
case RPC_CS_EVAL_METHOD:
method_p = &bind_p->cs_eval.tagged_union.method_key;
switch (method_p->method)
{
case RPC_EVAL_NO_CONVERSION:
case RPC_EVAL_SMIR_MODEL:
wdata_temp = wdata;
ldata_temp = ldata;
for (i=0; i<= w_data_len; i++)
*wdata_temp++ = *ldata_temp++;
if (p_l_data_len != NULL)
{
*p_l_data_len = strlen((char *)wdata) + 1;
}
*status = rpc_s_ok;
break;
case RPC_EVAL_CMIR_MODEL:
case RPC_EVAL_RMIR_MODEL:
case RPC_EVAL_INTERMEDIATE_MODEL:
case RPC_EVAL_UNIVERSAL_MODEL:
stub_conversion (
h,
RPC_BINDING_IS_SERVER (bind_p),
tag,
method_p->tags.client_tag,
wdata,
w_data_len,
ldata,
p_l_data_len,
status );
if (p_l_data_len != NULL)
{
*p_l_data_len = strlen((char *)wdata) + 1;
}
break;
default:
*status = rpc_s_ss_incompatible_codesets;
break;
}
break;
case RPC_CS_EVAL_TAGS:
tags_p = &bind_p->cs_eval.tagged_union.tags_key;
if (tag == tags_p->client_tag)
{
wdata_temp = wdata;
ldata_temp = ldata;
for (i=0; i<= w_data_len; i++)
*wdata_temp++ = *ldata_temp++;
if (p_l_data_len != NULL)
{
*p_l_data_len = strlen((char *)wdata) + 1;
}
*status = rpc_s_ok;
}
else
{
stub_conversion (
h,
RPC_BINDING_IS_SERVER (bind_p),
tag,
tags_p->client_tag,
wdata,
w_data_len,
ldata,
p_l_data_len,
status );
if (p_l_data_len != NULL)
{
*p_l_data_len = strlen((char *)wdata) + 1;
}
}
break;
default:
*status = rpc_s_ss_incompatible_codesets;
break;
}
}
else
{
current_codeset = nl_langinfo(CODESET);
dce_cs_loc_to_rgy(
(unsigned_char_p_t)current_codeset,
¤t_rgy_codeset,
NULL, NULL,
status);
if (*status != dce_cs_c_ok)
{
*status = rpc_s_ok;
return;
}
if (tag == current_rgy_codeset)
{
wdata_temp = wdata;
ldata_temp = ldata;
for (i=0; i<= w_data_len; i++)
*wdata_temp++ = *ldata_temp++;
if (p_l_data_len != NULL)
{
*p_l_data_len = strlen((char *)wdata) + 1;
}
*status = rpc_s_ok;
}
else
{
stub_conversion (
h,
RPC_BINDING_IS_SERVER (bind_p),
tag,
current_rgy_codeset,
wdata,
w_data_len,
ldata,
p_l_data_len,
status );
if (p_l_data_len != NULL)
{
*p_l_data_len = strlen((char *)wdata) + 1;
}
}
}
return;
}
PUBLIC void wchar_t_from_netcs
(
rpc_binding_handle_t h,
unsigned32 tag,
idl_byte *wdata,
unsigned32 w_data_len,
unsigned32 l_storage_len,
wchar_t *ldata,
unsigned32 *p_l_data_len,
error_status_t *status
)
{
char *current_codeset;
unsigned32 current_rgy_codeset;
idl_byte *byte_wdata;
idl_byte *t_byte_wdata;
size_t wdata_length;
size_t conv_length;
int i;
idl_byte *ldata_temp;
rpc_cs_method_eval_p_t method_p;
rpc_cs_tags_eval_p_t tags_p;
rpc_binding_rep_p_t bind_p;
bind_p = (rpc_binding_rep_p_t)h;
if (!RPC_BINDING_IS_SERVER (bind_p))
{
switch (bind_p->cs_eval.key)
{
case RPC_CS_EVAL_METHOD:
method_p = &bind_p->cs_eval.tagged_union.method_key;
switch (method_p->method)
{
case RPC_EVAL_NO_CONVERSION:
case RPC_EVAL_SMIR_MODEL:
wdata_length = mbstowcs(ldata, (char *)wdata, (size_t)w_data_len);
if (wdata_length == -1)
*status = rpc_s_ss_invalid_char_input;
else
*status = rpc_s_ok;
if (p_l_data_len != NULL)
*p_l_data_len = wdata_length;
break;
case RPC_EVAL_CMIR_MODEL:
case RPC_EVAL_RMIR_MODEL:
case RPC_EVAL_INTERMEDIATE_MODEL:
case RPC_EVAL_UNIVERSAL_MODEL:
RPC_MEM_ALLOC (
byte_wdata,
unsigned_char_p_t,
w_data_len,
RPC_C_MEM_STRING,
RPC_C_MEM_WAITOK);
t_byte_wdata = byte_wdata;
i = l_storage_len;
while (i--)
*t_byte_wdata++ = L'\0';
stub_conversion (
h,
RPC_BINDING_IS_SERVER (bind_p),
tag,
method_p->tags.client_tag,
wdata,
w_data_len,
byte_wdata,
(unsigned32 *)&wdata_length,
status );
wdata_length = mbstowcs(ldata, (char *)byte_wdata, (size_t)w_data_len);
if (wdata_length == -1)
*status = rpc_s_ss_invalid_char_input;
else
{
if (p_l_data_len != NULL)
*p_l_data_len = wdata_length;
*status = rpc_s_ok;
}
RPC_MEM_FREE(byte_wdata, RPC_C_MEM_STRING);
break;
default:
*status = rpc_s_ss_incompatible_codesets;
break;
}
break;
case RPC_CS_EVAL_TAGS:
tags_p = &bind_p->cs_eval.tagged_union.tags_key;
if (tag == tags_p->client_tag)
{
wdata_length = mbstowcs(ldata, (char *)wdata, (size_t)w_data_len);
if (wdata_length == -1)
*status = rpc_s_ss_invalid_char_input;
else
*status = rpc_s_ok;
if (p_l_data_len != NULL)
*p_l_data_len = wdata_length;
}
else
{
RPC_MEM_ALLOC (
byte_wdata,
unsigned_char_p_t,
w_data_len,
RPC_C_MEM_STRING,
RPC_C_MEM_WAITOK);
t_byte_wdata = byte_wdata;
i = w_data_len;
while (i--)
*t_byte_wdata++ = L'\0';
stub_conversion (
h,
RPC_BINDING_IS_SERVER (bind_p),
tag,
tags_p->client_tag,
wdata,
w_data_len,
byte_wdata,
(unsigned32 *)&wdata_length,
status );
wdata_length = mbstowcs(ldata, (char *)byte_wdata, (size_t)w_data_len);
if (wdata_length == -1)
*status = rpc_s_ss_invalid_char_input;
else
{
if (p_l_data_len != NULL)
*p_l_data_len = wdata_length;
*status = rpc_s_ok;
}
RPC_MEM_FREE(byte_wdata, RPC_C_MEM_STRING);
}
break;
default:
*status = rpc_s_ss_incompatible_codesets;
break;
}
}
else
{
current_codeset = nl_langinfo(CODESET);
dce_cs_loc_to_rgy(
(unsigned_char_p_t)current_codeset,
¤t_rgy_codeset,
NULL, NULL,
status);
if (*status != dce_cs_c_ok)
{
*status = rpc_s_ok;
return;
}
if (tag == current_rgy_codeset)
{
wdata_length = mbstowcs(ldata, (char *)wdata, (size_t)w_data_len);
if (wdata_length == -1)
*status = rpc_s_ss_invalid_char_input;
else
{
if (p_l_data_len != NULL)
*p_l_data_len = wdata_length;
*status = rpc_s_ok;
}
}
else
{
RPC_MEM_ALLOC (
byte_wdata,
unsigned_char_p_t,
w_data_len,
RPC_C_MEM_STRING,
RPC_C_MEM_WAITOK);
t_byte_wdata = byte_wdata;
i = w_data_len;
while (i--)
*t_byte_wdata++ = L'\0';
stub_conversion (
h,
RPC_BINDING_IS_SERVER (bind_p),
tag,
current_rgy_codeset,
wdata,
w_data_len,
byte_wdata,
(unsigned32 *)&wdata_length,
status );
wdata_length = mbstowcs(ldata, (char *)byte_wdata, (size_t)w_data_len);
if (wdata_length == -1)
*status = rpc_s_ss_invalid_char_input;
else
{
if (p_l_data_len != NULL)
*p_l_data_len = wdata_length;
*status = rpc_s_ok;
}
RPC_MEM_FREE(byte_wdata, RPC_C_MEM_STRING);
}
}
return;
}
PUBLIC void cs_byte_net_size
(
rpc_binding_handle_t h,
unsigned32 tag,
unsigned32 l_storage_len,
idl_cs_convert_t *p_convert_type,
unsigned32 *p_w_storage_len,
error_status_t *status
)
{
char *current_codeset;
unsigned32 current_rgy_codeset;
unsigned16 stag_bytes;
unsigned16 client_bytes;
rpc_cs_method_eval_p_t method_p;
rpc_cs_tags_eval_p_t tags_p;
rpc_binding_rep_p_t bind_p;
bind_p = (rpc_binding_rep_p_t)h;
if (!RPC_BINDING_IS_SERVER (bind_p))
{
switch (bind_p->cs_eval.key)
{
case RPC_CS_EVAL_METHOD:
method_p = &bind_p->cs_eval.tagged_union.method_key;
if (method_p->tags.type_handle != NULL)
{
if ((idl_cs_convert_t)method_p->tags.type_handle
== idl_cs_no_convert ||
(idl_cs_convert_t)method_p->tags.type_handle
== idl_cs_in_place_convert)
{
*p_convert_type = (idl_cs_convert_t)
method_p->tags.type_handle;
if (p_w_storage_len != NULL)
*p_w_storage_len = l_storage_len;
*status = rpc_s_ok;
}
else if ((idl_cs_convert_t)
method_p->tags.type_handle
== idl_cs_new_buffer_convert)
{
*p_convert_type = (idl_cs_convert_t)
method_p->tags.type_handle;
if (p_w_storage_len != NULL)
*p_w_storage_len
= l_storage_len *
method_p->tags.stag_max_bytes;
*status = rpc_s_ok;
}
}
else
{
switch (method_p->method)
{
case RPC_EVAL_NO_CONVERSION:
case RPC_EVAL_RMIR_MODEL:
case RPC_EVAL_SMIR_MODEL:
*p_convert_type = idl_cs_no_convert;
if (p_w_storage_len != NULL)
*p_w_storage_len = l_storage_len;
if (method_p->fixed)
method_p->tags.type_handle
= (rpc_ns_handle_t)*p_convert_type;
*status = rpc_s_ok;
break;
case RPC_EVAL_CMIR_MODEL:
case RPC_EVAL_INTERMEDIATE_MODEL:
case RPC_EVAL_UNIVERSAL_MODEL:
if ((method_p->fixed) &&
(method_p->tags.stag_max_bytes ==
method_p->tags.client_max_bytes))
{
*p_convert_type =
idl_cs_in_place_convert;
if (p_w_storage_len != NULL)
*p_w_storage_len = l_storage_len;
}
else if ( method_p->tags.stag_max_bytes ==
method_p->client->codesets[0].c_max_bytes)
{
*p_convert_type =
idl_cs_in_place_convert;
if (p_w_storage_len != NULL)
*p_w_storage_len = l_storage_len;
}
else
{
*p_convert_type
= idl_cs_new_buffer_convert;
if (p_w_storage_len != NULL)
*p_w_storage_len = l_storage_len
* method_p->tags.stag_max_bytes;
}
*status = rpc_s_ok;
if (method_p->fixed)
method_p->tags.type_handle
= (rpc_ns_handle_t)*p_convert_type;
break;
default:
*status = rpc_s_ss_incompatible_codesets;
break;
}
}
break;
case RPC_CS_EVAL_TAGS:
tags_p = &bind_p->cs_eval.tagged_union.tags_key;
if (tags_p->type_handle != NULL)
{
if ((idl_cs_convert_t)tags_p->type_handle
== idl_cs_no_convert ||
(idl_cs_convert_t)tags_p->type_handle
== idl_cs_in_place_convert)
{
*p_convert_type = (idl_cs_convert_t)
tags_p->type_handle;
if (p_w_storage_len != NULL)
*p_w_storage_len = l_storage_len;
*status = rpc_s_ok;
}
else if ((idl_cs_convert_t)tags_p->type_handle
== idl_cs_new_buffer_convert)
{
*p_convert_type = (idl_cs_convert_t)
tags_p->type_handle;
if (p_w_storage_len != NULL)
*p_w_storage_len =
l_storage_len * tags_p->stag_max_bytes;
*status = rpc_s_ok;
}
}
else
{
if (tag == tags_p->client_tag)
{
*p_convert_type = idl_cs_no_convert;
if (p_w_storage_len != NULL)
*p_w_storage_len = l_storage_len;
}
else
{
if (tags_p->stag_max_bytes ==
tags_p->client_max_bytes)
{
*p_convert_type =
idl_cs_in_place_convert;
if (p_w_storage_len != NULL)
*p_w_storage_len = l_storage_len;
}
else
{
*p_convert_type =
idl_cs_new_buffer_convert;
if (p_w_storage_len != NULL)
*p_w_storage_len =
l_storage_len * tags_p->stag_max_bytes;
}
}
*status = rpc_s_ok;
tags_p->type_handle = (rpc_ns_handle_t)
*p_convert_type;
}
break;
default:
*status = rpc_s_ss_incompatible_codesets;
break;
}
}
else
{
current_codeset = nl_langinfo(CODESET);
dce_cs_loc_to_rgy(
(unsigned_char_p_t)current_codeset,
¤t_rgy_codeset,
NULL, NULL,
status);
if (*status != dce_cs_c_ok)
{
*status = rpc_s_ok;
return;
}
if (tag == current_rgy_codeset)
{
*p_convert_type = idl_cs_no_convert;
if (p_w_storage_len != NULL)
*p_w_storage_len = l_storage_len;
*status = rpc_s_ok;
}
else
{
rpc_rgy_get_max_bytes (
tag,
&stag_bytes,
status );
if (*status != rpc_s_ok)
return;
rpc_rgy_get_max_bytes (
current_rgy_codeset,
&client_bytes,
status );
if (*status != rpc_s_ok)
return;
if (stag_bytes == client_bytes)
{
*p_convert_type = idl_cs_in_place_convert;
if (p_w_storage_len != NULL)
*p_w_storage_len = l_storage_len;
}
else
{
*p_convert_type = idl_cs_new_buffer_convert;
if (p_w_storage_len != NULL)
*p_w_storage_len = l_storage_len * stag_bytes;
}
*status = rpc_s_ok;
}
}
return;
}
PUBLIC void wchar_t_net_size
(
rpc_binding_handle_t h,
unsigned32 tag,
unsigned32 l_storage_len,
idl_cs_convert_t *p_convert_type,
unsigned32 *p_w_storage_len,
error_status_t *status
)
{
char *current_codeset;
unsigned32 current_rgy_codeset;
unsigned16 stag_bytes;
unsigned16 client_bytes;
rpc_cs_method_eval_p_t method_p;
rpc_cs_tags_eval_p_t tags_p;
rpc_binding_rep_p_t bind_p;
bind_p = (rpc_binding_rep_p_t)h;
if (!RPC_BINDING_IS_SERVER (bind_p))
{
switch (bind_p->cs_eval.key)
{
case RPC_CS_EVAL_METHOD:
method_p = &bind_p->cs_eval.tagged_union.method_key;
if (method_p->tags.type_handle != NULL)
{
*p_convert_type = (idl_cs_convert_t)
method_p->tags.type_handle;
if (p_w_storage_len != NULL)
*p_w_storage_len = l_storage_len
* sizeof(wchar_t);
*status = rpc_s_ok;
}
else
{
switch (method_p->method)
{
case RPC_EVAL_NO_CONVERSION:
case RPC_EVAL_RMIR_MODEL:
case RPC_EVAL_SMIR_MODEL:
case RPC_EVAL_CMIR_MODEL:
case RPC_EVAL_INTERMEDIATE_MODEL:
case RPC_EVAL_UNIVERSAL_MODEL:
*p_convert_type = idl_cs_new_buffer_convert;
if (p_w_storage_len != NULL)
*p_w_storage_len = l_storage_len
* sizeof(wchar_t);
*status = rpc_s_ok;
if (method_p->fixed)
method_p->tags.type_handle
= (rpc_ns_handle_t)*p_convert_type;
break;
default:
*status = rpc_s_ss_incompatible_codesets;
break;
}
}
break;
case RPC_CS_EVAL_TAGS:
tags_p = &bind_p->cs_eval.tagged_union.tags_key;
if (tags_p->type_handle != NULL)
{
*p_convert_type = (idl_cs_convert_t)tags_p->type_handle;
if (p_w_storage_len != NULL)
*p_w_storage_len = l_storage_len
* sizeof(wchar_t);
*status = rpc_s_ok;
}
else
{
*p_convert_type = idl_cs_new_buffer_convert;
if (p_w_storage_len != NULL)
*p_w_storage_len = l_storage_len * sizeof(wchar_t);
*status = rpc_s_ok;
tags_p->type_handle =
(rpc_ns_handle_t)*p_convert_type;
}
break;
default:
*status = rpc_s_ss_incompatible_codesets;
break;
}
}
else
{
*p_convert_type = idl_cs_new_buffer_convert;
if (p_w_storage_len != NULL)
*p_w_storage_len = l_storage_len * sizeof(wchar_t);
*status = rpc_s_ok;
}
return;
}
PUBLIC void cs_byte_local_size
(
rpc_binding_handle_t h,
unsigned32 tag,
unsigned32 w_storage_len,
idl_cs_convert_t *p_convert_type,
unsigned32 *p_l_storage_len,
error_status_t *status
)
{
char *current_codeset;
unsigned32 current_rgy_codeset;
unsigned16 stag_bytes;
unsigned16 client_bytes;
rpc_cs_method_eval_p_t method_p;
rpc_cs_tags_eval_p_t tags_p;
rpc_binding_rep_p_t bind_p;
bind_p = (rpc_binding_rep_p_t)h;
if (!RPC_BINDING_IS_SERVER (bind_p))
{
switch (bind_p->cs_eval.key)
{
case RPC_CS_EVAL_METHOD:
method_p = &bind_p->cs_eval.tagged_union.method_key;
if (method_p->tags.type_handle != NULL)
{
if ((idl_cs_convert_t)method_p->tags.type_handle
== idl_cs_no_convert ||
(idl_cs_convert_t)method_p->tags.type_handle
== idl_cs_in_place_convert)
{
*p_convert_type = (idl_cs_convert_t)
method_p->tags.type_handle;
if (p_l_storage_len != NULL)
*p_l_storage_len = w_storage_len;
*status = rpc_s_ok;
}
else if ((idl_cs_convert_t)method_p->tags.type_handle
== idl_cs_new_buffer_convert)
{
*p_convert_type = (idl_cs_convert_t)
method_p->tags.type_handle;
if (p_l_storage_len != NULL)
*p_l_storage_len = w_storage_len
* method_p->tags.stag_max_bytes;
*status = rpc_s_ok;
}
}
else
{
switch (method_p->method)
{
case RPC_EVAL_NO_CONVERSION:
case RPC_EVAL_SMIR_MODEL:
case RPC_EVAL_CMIR_MODEL:
case RPC_EVAL_RMIR_MODEL:
case RPC_EVAL_INTERMEDIATE_MODEL:
case RPC_EVAL_UNIVERSAL_MODEL:
if ((method_p->fixed) &&
(method_p->tags.stag_max_bytes ==
method_p->tags.client_max_bytes))
{
*p_convert_type = idl_cs_in_place_convert;
if (p_l_storage_len != NULL)
*p_l_storage_len = w_storage_len;
}
else if (method_p->tags.stag_max_bytes ==
method_p->client->codesets[0].c_max_bytes)
{
*p_convert_type = idl_cs_in_place_convert;
if (p_l_storage_len != NULL)
*p_l_storage_len = w_storage_len;
}
else
{
*p_convert_type = idl_cs_new_buffer_convert;
if (p_l_storage_len != NULL)
*p_l_storage_len = w_storage_len
* method_p->tags.stag_max_bytes;
}
*status = rpc_s_ok;
if (method_p->fixed)
method_p->tags.type_handle =
(rpc_ns_handle_t)*p_convert_type;
break;
default:
*status = rpc_s_ss_incompatible_codesets;
break;
}
}
break;
case RPC_CS_EVAL_TAGS:
tags_p = &bind_p->cs_eval.tagged_union.tags_key;
if (tags_p->type_handle != NULL)
{
if ((idl_cs_convert_t)tags_p->type_handle
== idl_cs_no_convert ||
(idl_cs_convert_t)tags_p->type_handle
== idl_cs_in_place_convert)
{
*p_convert_type =
(idl_cs_convert_t)tags_p->type_handle;
if (p_l_storage_len != NULL)
*p_l_storage_len = w_storage_len;
*status = rpc_s_ok;
}
else if ((idl_cs_convert_t)tags_p->type_handle
== idl_cs_new_buffer_convert)
{
*p_convert_type =
(idl_cs_convert_t)tags_p->type_handle;
if (p_l_storage_len != NULL)
*p_l_storage_len =
w_storage_len * tags_p->stag_max_bytes;
*status = rpc_s_ok;
}
}
else
{
if (tag == tags_p->client_tag)
{
*p_convert_type = idl_cs_no_convert;
if (p_l_storage_len != NULL)
*p_l_storage_len = w_storage_len;
}
else
{
if (tags_p->stag_max_bytes ==
tags_p->client_max_bytes)
{
*p_convert_type
= idl_cs_in_place_convert;
if (p_l_storage_len != NULL)
*p_l_storage_len = w_storage_len;
}
else
{
*p_convert_type
= idl_cs_new_buffer_convert;
if (p_l_storage_len != NULL)
*p_l_storage_len
= w_storage_len * tags_p->stag_max_bytes;
}
}
*status = rpc_s_ok;
tags_p->type_handle
= (rpc_ns_handle_t) *p_convert_type;
}
break;
default:
*status = rpc_s_ss_incompatible_codesets;
break;
}
}
else
{
current_codeset = nl_langinfo(CODESET);
dce_cs_loc_to_rgy(
(unsigned_char_p_t)current_codeset,
¤t_rgy_codeset,
NULL, NULL,
status);
if (*status != dce_cs_c_ok)
{
*status = rpc_s_ok;
return;
}
if (tag == current_rgy_codeset)
{
*p_convert_type = idl_cs_no_convert;
if (p_l_storage_len != NULL)
*p_l_storage_len = w_storage_len;
*status = rpc_s_ok;
}
else
{
rpc_rgy_get_max_bytes (
tag,
&stag_bytes,
status );
if (*status != rpc_s_ok)
return;
rpc_rgy_get_max_bytes (
current_rgy_codeset,
&client_bytes,
status );
if (*status != rpc_s_ok)
return;
if (stag_bytes == client_bytes)
{
*p_convert_type = idl_cs_in_place_convert;
if (p_l_storage_len != NULL)
*p_l_storage_len = w_storage_len;
}
else
{
*p_convert_type = idl_cs_new_buffer_convert;
if (p_l_storage_len != NULL)
*p_l_storage_len = w_storage_len * stag_bytes;
}
*status = rpc_s_ok;
}
}
return;
}
PUBLIC void wchar_t_local_size
(
rpc_binding_handle_t h,
unsigned32 tag,
unsigned32 w_storage_len,
idl_cs_convert_t *p_convert_type,
unsigned32 *p_l_storage_len,
error_status_t *status
)
{
char *current_codeset;
unsigned32 current_rgy_codeset;
unsigned16 stag_bytes;
unsigned16 client_bytes;
rpc_cs_method_eval_p_t method_p;
rpc_cs_tags_eval_p_t tags_p;
rpc_binding_rep_p_t bind_p;
bind_p = (rpc_binding_rep_p_t)h;
if (!RPC_BINDING_IS_SERVER (bind_p))
{
switch (bind_p->cs_eval.key)
{
case RPC_CS_EVAL_METHOD:
method_p = &bind_p->cs_eval.tagged_union.method_key;
if (method_p->tags.type_handle != NULL)
{
*p_convert_type = (idl_cs_convert_t)
method_p->tags.type_handle;
if (p_l_storage_len != NULL)
*p_l_storage_len = w_storage_len
/ sizeof(wchar_t);
*status = rpc_s_ok;
}
else
{
switch (method_p->method)
{
case RPC_EVAL_NO_CONVERSION:
case RPC_EVAL_SMIR_MODEL:
case RPC_EVAL_CMIR_MODEL:
case RPC_EVAL_RMIR_MODEL:
case RPC_EVAL_INTERMEDIATE_MODEL:
case RPC_EVAL_UNIVERSAL_MODEL:
*p_convert_type = idl_cs_new_buffer_convert;
if (p_l_storage_len != NULL)
*p_l_storage_len =
w_storage_len / sizeof(wchar_t);
*status = rpc_s_ok;
if (method_p->fixed)
method_p->tags.type_handle =
(rpc_ns_handle_t)*p_convert_type;
break;
default:
*status = rpc_s_ss_incompatible_codesets;
break;
}
}
break;
case RPC_CS_EVAL_TAGS:
tags_p = &bind_p->cs_eval.tagged_union.tags_key;
if (tags_p->type_handle != NULL)
{
*p_convert_type =
(idl_cs_convert_t)tags_p->type_handle;
if (p_l_storage_len != NULL)
*p_l_storage_len = w_storage_len
/ sizeof(wchar_t);
*status = rpc_s_ok;
}
else
{
*p_convert_type = idl_cs_new_buffer_convert;
if (p_l_storage_len != NULL)
*p_l_storage_len = w_storage_len
/ sizeof(wchar_t);
*status = rpc_s_ok;
tags_p->type_handle
= (rpc_ns_handle_t) *p_convert_type;
}
break;
default:
*status = rpc_s_ss_incompatible_codesets;
break;
}
}
else
{
*p_convert_type = idl_cs_new_buffer_convert;
if (p_l_storage_len != NULL)
*p_l_storage_len = w_storage_len / sizeof(wchar_t);
*status = rpc_s_ok;
}
return;
}
PUBLIC void rpc_cs_get_tags
(
rpc_binding_handle_t h,
idl_boolean server_side,
unsigned32 *p_stag,
unsigned32 *p_drtag,
unsigned32 *p_rtag,
error_status_t *status
)
{
rpc_binding_rep_p_t bind_p;
rpc_cs_method_eval_p_t method_p;
rpc_cs_tags_eval_p_t tags_p;
unsigned_char_t *entry_name;
int i, j;
rpc_codeset_mgmt_p_t client, server;
int model_found, smir_true, cmir_true;
long i_code;
int i_max_bytes;
error_status_t temp_status;
if (!server_side)
{
bind_p = (rpc_binding_rep_p_t)h;
if (bind_p->extended_bind_flag == RPC_C_BH_EXTENDED_CODESETS)
{
switch (bind_p->cs_eval.key)
{
case RPC_CS_EVAL_METHOD:
method_p = &bind_p->cs_eval.tagged_union.method_key;
if (method_p->fixed)
{
*p_stag = method_p->tags.stag;
*p_drtag = method_p->tags.drtag;
}
else
{
(*(method_p->cs_stub_eval_func))(p_stag, p_drtag, status);
if (*status != rpc_s_ok)
return;
method_p->tags.stag = *p_stag;
method_p->tags.drtag = *p_drtag;
rpc_rgy_get_max_bytes (
*p_stag,
&method_p->tags.stag_max_bytes,
status
);
if (*status != rpc_s_ok)
return;
rpc_rgy_get_codesets (
&client,
status );
if (*status != rpc_s_ok)
return;
method_p->tags.client_tag = client->codesets[0].c_set;
method_p->tags.client_max_bytes = client->codesets[0].c_max_bytes;
method_p->tags.type_handle = NULL;
}
break;
case RPC_CS_EVAL_TAGS:
tags_p = &bind_p->cs_eval.tagged_union.tags_key;
*p_stag = tags_p->stag;
*p_drtag = tags_p->drtag;
break;
default:
*status = rpc_s_ss_invalid_codeset_tag;
}
*status = rpc_s_ok;
}
else
{
rpc_rgy_get_codesets (
&client,
status );
if (*status != rpc_s_ok)
return;
rpc_ns_binding_inq_entry_name (
h,
rpc_c_ns_syntax_default,
&entry_name,
status );
if (*status != rpc_s_ok)
{
rpc_ns_mgmt_free_codesets(&client, &temp_status);
return;
}
rpc_ns_mgmt_read_codesets (
rpc_c_ns_syntax_default,
entry_name,
&server,
status );
if (*status != rpc_s_ok)
{
rpc_ns_mgmt_free_codesets(&client, &temp_status);
return;
}
if (client->codesets[0].c_set == server->codesets[0].c_set)
{
*p_stag = client->codesets[0].c_set;
*p_drtag = server->codesets[0].c_set;
tags_p->stag = *p_stag;
tags_p->drtag = *p_drtag;
tags_p->stag_max_bytes = client->codesets[0].c_max_bytes;
tags_p->client_tag = client->codesets[0].c_set;
tags_p->client_max_bytes = client->codesets[0].c_max_bytes;
tags_p->type_handle = NULL;
}
else
{
rpc_cs_char_set_compat_check (
client->codesets[0].c_set,
server->codesets[0].c_set,
status );
if (*status != rpc_s_ok)
{
rpc_ns_mgmt_free_codesets(&server, &temp_status);
rpc_ns_mgmt_free_codesets(&client, &temp_status);
return;
}
smir_true = cmir_true = model_found = 0;
for (i = 1; i <= server->count; i++)
{
if (model_found)
break;
if (client->codesets[0].c_set
== server->codesets[i].c_set)
{
smir_true = 1;
model_found = 1;
}
if (server->codesets[0].c_set
== client->codesets[i].c_set)
{
cmir_true = 1;
model_found = 1;
}
}
if (model_found)
{
tags_p = &bind_p->cs_eval.tagged_union.tags_key;
if (smir_true && cmir_true)
{
*p_stag = client->codesets[0].c_set;
*p_drtag = server->codesets[0].c_set;
tags_p->stag = *p_stag;
tags_p->drtag = *p_drtag;
tags_p->stag_max_bytes = client->codesets[0].c_max_bytes;
tags_p->client_tag = client->codesets[0].c_set;
tags_p->client_max_bytes = client->codesets[0].c_max_bytes;
tags_p->type_handle = NULL;
}
else if (smir_true)
{
*p_stag = client->codesets[0].c_set;
*p_drtag = client->codesets[0].c_set;
tags_p->stag = *p_stag;
tags_p->drtag = *p_drtag;
tags_p->stag_max_bytes = client->codesets[0].c_max_bytes;
tags_p->client_tag = client->codesets[0].c_set;
tags_p->client_max_bytes = client->codesets[0].c_max_bytes;
tags_p->type_handle = NULL;
}
else
{
*p_stag = server->codesets[0].c_set;
*p_drtag = server->codesets[0].c_set;
tags_p->stag = *p_stag;
tags_p->drtag = *p_drtag;
tags_p->stag_max_bytes = server->codesets[0].c_max_bytes;
tags_p->client_tag = client->codesets[0].c_set;
tags_p->client_max_bytes = client->codesets[0].c_max_bytes;
tags_p->type_handle = NULL;
}
*status = rpc_s_ok;
}
else
{
tags_p->client_tag = client->codesets[0].c_set;
tags_p->client_max_bytes = client->codesets[0].c_max_bytes;
tags_p->type_handle = NULL;
for (i = 1; i <= client->count; i++)
{
if (model_found)
break;
for (j = 1; j <= server->count; j++)
{
if (client->codesets[i].c_set
== server->codesets[j].c_set)
{
*p_stag = client->codesets[i].c_set;
*p_drtag = client->codesets[i].c_set;
tags_p->stag = *p_stag;
tags_p->drtag = *p_drtag;
tags_p->stag_max_bytes = client->codesets[i].c_max_bytes;
model_found = 1;
break;
}
}
}
if (!model_found)
{
*p_stag = UCS2_L2;
*p_drtag = UCS2_L2;
tags_p->stag = *p_stag;
tags_p->drtag = *p_drtag;
tags_p->stag_max_bytes = client->codesets[i].c_max_bytes;
rpc_rgy_get_max_bytes (
UCS2_L2,
&tags_p->stag_max_bytes,
status
);
}
}
}
rpc_ns_mgmt_free_codesets(&server, &temp_status);
rpc_ns_mgmt_free_codesets(&client, &temp_status);
bind_p->extended_bind_flag = RPC_C_BH_EXTENDED_CODESETS;
}
}
else
{
if (p_rtag != p_drtag)
*p_rtag = *p_drtag;
*status = rpc_s_ok;
}
return;
}