2016-08-24 35 views
0

我正尝试使用gsoap实现ONVIF服务器(nvt)设备。我遵循gsoap's website中给出的说明和typemap.dat来生成代码。我为wsdl2h使用“-P”和“-x”参数,为soapcpp2使用“-S -i -x -w”。一切都按预期工作,但有一点点怪癖。gSOAP和ONVIF NVT命名空间/标签问题

ONVIF核心规范定义了GetServices()动作,其中包含一个可选的“Capabilities”成员,其响应在“服务”实现下。由于可选的成员不是由wsdl2h创建(由于我的参数我猜),我提出以下修改我的类型表文件:

_tds__Service_Capabilities = $ xsd__anyType * Capabilities;

然后我能够指定自定义/导出功能反对这种成员根据ONVIF规范的要求,具体取决于服务类型的实现。但是,最终的Capabilities对象始终使用与所需操作不同的GetServices()操作的相同名称空间表示。比如这里是预期的响应(简体):

<tds:Service> 
    <tds:Capabilities> 
     <tds:Capabilities> 
     </tds:Capabilities> 
    </tds:Capabilities> 
</tds:Service> 
<tds:Service> 
    <tds:Capabilities> 
     <trt:Capabilities> 
     ... 
     </trt:Capabilities> 
    </tds:Capabilities> 
</tds:Service> 
<tds:Service> 
    <tds:Capabilities> 
     <tev:Capabilities> 
      ... 
     </tev:Capabilities> 
    </tds:Capabilities> 
</tds:Service> 

而实际反应是:

<tds:Service> 
    <tds:Capabilities> 
     <tds:Capabilities> 
     </tds:Capabilities> 
    </tds:Capabilities> 
</tds:Service> 
<tds:Service> 
    <tds:Capabilities> 
     <tds:Capabilities> 
     ... 
     </tds:Capabilities> 
    </tds:Capabilities> 
</tds:Service> 
<tds:Service> 
    <tds:Capabilities> 
     <tds:Capabilities> 
      ... 
     </tds:Capabilities> 
    </tds:Capabilities> 
</tds:Service> 

为了克服这个怪癖,我申请以下难看的补丁,以创建soapC.cpp文件:

@@ -42068,7 +51777,7 @@ void tev__Capabilities::soap_serialize(struct soap *soap) const 

int tev__Capabilities::soap_out(struct soap *soap, const char *tag, int id, const char *type) const 
{ 
- return soap_out_tev__Capabilities(soap, "tev:Capabilities", id, this, type); 
+ return soap_out_tev__Capabilities(soap, tag, id, this, type); 
} 

SOAP_FMAC3 int SOAP_FMAC4 soap_out_tev__Capabilities(struct soap *soap, const char *tag, int id, const tev__Capabilities *a, const char *type) 
@@ -64741,7 +74450,7 @@ void trt__Capabilities::soap_serialize(struct soap *soap) const 

int trt__Capabilities::soap_out(struct soap *soap, const char *tag, int id, const char *type) const 
{ 
- return soap_out_trt__Capabilities(soap, "trt:Capabilities", id, this, type); 
+ return soap_out_trt__Capabilities(soap, tag, id, this, type); 
} 

我必须在每次重新生成文件时应用此修补程序,并且我担心这会在将来导致一些兼容性问题。覆盖命名空间标签的正确方法是什么?

回答

1

它不应该需要在typemap.dat文件中修改,你应该能够使用gSOAP dom api来做到这一点。

为了允许DOM元素分配给xsd_anyType你应该添加-d到wsdl2h命令:

-d使用DOM填充的xs:any和xsd:anyType的元素

然后专门的能力结构,分配类似于:

tev__Capabilities *tevcapabilities = soap_new_tev__Capabilities(soap); 

可以设置t tds::Capabilities结构的_any字段如下:

tds__Service_Capabilities *capabilities = soap_new__tds__Service_Capabilities(soap); 
capabilities->__any = soap_dom_element(soap, NULL, "tev:Capabilities", 
          tevcapabilities, tevcapabilities->soap_type());