2016-08-24 1 views
0

gsoap을 사용하여 ONVIF 서버 (nvt) 장치를 구현하려고합니다. 코드 생성을 위해 gsoap's website에 제공된 지침과 typemap.dat를 따르고 있습니다. wsdl2h에는 "-P"와 "-x"매개 변수를 사용하고 soapcpp2에는 "-S -i -x -w"매개 변수를 사용합니다. 모든 것이 예상대로 작동하지만 약간의 기이가 있습니다.gSOAP 및 ONVIF NVT 네임 스페이스/태그 문제

ONVIF 핵심 사양은 "서비스"구현의 응답에 선택적 "기능"구성원을 포함하는 GetServices() 작업을 정의합니다. 옵션 회원이 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을 사용하여이 작업을 수행 할 수 있습니다.

당신이 wsdl2h 명령에 -d을 추가해야 xsd_anyType에 DOM 요소를 할당 할 수 있도록하기 위해서 그런 다음

를 anyType에 요소 : XS를 채울 수

-d를 사용 DOM : 어떤 및 XSD

tev__Capabilities *tevcapabilities = soap_new_tev__Capabilities(soap); 

과 같이 할당 된 특수 capabilitites 구조는 다음과 같이 설정할 수 있습니다. o _any 필드는 다음과 같이 구조입니다.

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