[gsoap] [C] Не определено SOAP_TYPE_wchar - PullRequest
0 голосов
/ 05 марта 2019

Я застрял с gsoap 2.7.13 (wsdl2h v1.2.1 и soapcpp2 v2.7.13).Когда я пытался отобразить строки в широкие символы в чистом C-проекте, я получаю много ошибок компиляции (SOAP_TYPE_wchar undefined).

Кто-то экспериментировал с такой же проблемой, как я?

С уважением,

Мой typemap.dat

[
struct SOAP_ENV__Header
{
    _XML wsse__Security;
};
]

#   Use unicode
xsd__string = | wchar_t* | wchar_t*

#   CMIS recommended prefix
SOAP-ENV    =   "http://schemas.xmlsoap.org/soap/envelope"
SOAP-ENC    =   "http://schemas.xmlsoap.org/soap/encoding"
xsi         =   "http://www.w3.org/2001/XMLSchema-instance"
xsd         =   "http://www.w3.org/2001/XMLSchema"
ns1         =   "http://docs.oasis-open.org/ns/cmis/core/200908/"
ns2         =   "http://docs.oasis-open.org/ns/cmis/messaging/200908/"
cmis        =   "http://docs.oasis-open.org/ns/cmis/ws/200908/"
cmis2       =   "http://docs.oasis-open.org/ns/cmis/ws/200908/DiscoveryServicePortBinding"
cmis3       =   "http://docs.oasis-open.org/ns/cmis/ws/200908/MultiFilingServicePortBinding"
cmis4       =   "http://docs.oasis-open.org/ns/cmis/ws/200908/NavigationServicePortBinding"
cmis5       =   "http://docs.oasis-open.org/ns/cmis/ws/200908/ObjectServicePortBinding"
cmis6       =   "http://docs.oasis-open.org/ns/cmis/ws/200908/PolicyServicePortBinding"
cmis7       =   "http://docs.oasis-open.org/ns/cmis/ws/200908/RelationshipServicePortBinding"
cmis8       =   "http://docs.oasis-open.org/ns/cmis/ws/200908/RepositoryServicePortBinding"
cmis9       =   "http://docs.oasis-open.org/ns/cmis/ws/200908/VersioningServicePortBinding"
cmis10      =   "http://docs.oasis-open.org/ns/cmis/ws/200908/ACLServicePortBinding"

# End of file

И мои командные строки:

wsdl2h -c -o cmis_ws.h -t typemap.dat -x "http://docs.oasis-open.org/cmis/CMIS/v1.0/errata-01/os/schemas/CMISWS-Service.wsdl"
soapcpp2 -c -p cmis cmis_ws.h

1 Ответ

0 голосов
/ 01 апреля 2019

Патч для исправления этой проблемы:

  1. изменить gsoap/src/symbol2.c строку 11201 и вставить
  if (is_wstring(typ)) /* wchar_t* is serializable but wchar_t is transient */
    return 0;

Первая часть функции is_transient должна выглядеть следующим образомэто:

int
is_transient(Tnode *typ)
{
  if (!typ)
    return 1;
  if (typ->type == Tstruct && typ->id == lookup("soap"))
    return 1;
  if (is_external(typ) || is_volatile(typ))
    return 0;
  if (typ->transient > 0)
    return 1;
  if (is_wstring(typ)) /* wchar_t* is serializable but wchar_t is transient */
    return 0;
снова запустите make, вы можете сделать это в каталоге gsoap/src.Это создаст soapcpp2 в каталоге gsoap/src.Скопируйте soapcpp2 в свой проект или в каталог bin вашего $PATH.
...