2016-08-24 20 views
0

gsoapを使用してONVIFサーバー(nvt)デバイスを実装しようとしています。私は命令とコード生成のためのgsoap's websiteで与えられたtypemap.datに従っています。私はsoapcpp2のためにwsdl2hと "-S -i -x -w"に "-P"と "-x"パラメータを使います。すべてが期待どおりに機能していますが、ちょっと変わったことがあります。gSOAPとONVIF NVTネームスペース/タグの問題

ONVIFコア仕様では、「サービス」実装の応答にオプションの「Capabilities」メンバーを含む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の要素

:任意のおよびxsd:XSを移入する

-d利用DOM以下のようなものが割り当てられ、特殊なcapabilitites構造:

tev__Capabilities *tevcapabilities = soap_new_tev__Capabilities(soap); 

はトンを設定することができますこのような構造の_anyフィールド:

tds__Service_Capabilities *capabilities = soap_new__tds__Service_Capabilities(soap); 
capabilities->__any = soap_dom_element(soap, NULL, "tev:Capabilities", 
          tevcapabilities, tevcapabilities->soap_type()); 
関連する問題