2016-12-09 21 views
1

gSOAPを使用してONVIF互換カメラを設定しています。 現在、私は手動でこのようなことを行うことで、リクエスト内のすべてのパラメータを設定しています。これは、これを行うための簡単な方法がありますgSOAPリクエスト/レスポンスに値を設定/取得する簡単な方法はありますか?

MediaBindingProxy mediaDevice (uri); 
AUTHENTICATE (mediaDevice); 
_trt__SetVideoEncoderConfiguration req; 
_trt__SetVideoEncoderConfigurationResponse resp; 
struct tt__VideoEncoderConfiguration encoderConfig; 
struct tt__VideoResolution resolutionConfig; 
encoderConfig.Name = strdup (name); 
encoderConfig.UseCount = 1; 
encoderConfig.Quality = 50; 

if (strcmp (encoding, "H264") == 0) 
encoderConfig.Encoding = tt__VideoEncoding__H264; 
else if (strcmp (encoding, "JPEG") == 0) 
encoderConfig.Encoding = tt__VideoEncoding__JPEG; 

encoderConfig.token = strdup (profileToken); 
encoderConfig.SessionTimeout = (LONG64)"PT0S"; 
resolutionConfig.Width=1280; 
resolutionConfig.Height=720; 
encoderConfig.Resolution = &resolutionConfig; 
tt__VideoRateControl rateControl; 
rateControl.FrameRateLimit = 15; 
rateControl.EncodingInterval = 1; 
rateControl.BitrateLimit = 4500; 
encoderConfig.RateControl = &rateControl; 
struct tt__H264Configuration h264; 
h264.GovLength = 30; 
h264.H264Profile = tt__H264Profile__Baseline; 
encoderConfig.H264 = &h264; 

struct tt__MulticastConfiguration multicast; 
struct tt__IPAddress address; 
address.IPv4Address = strdup ("0.0.0.0"); 
multicast.Address = &address; 

encoderConfig.Multicast = &multicast; 

req.Configuration = &encoderConfig; 
req.ForcePersistence = true; 



int ret = mediaDevice.SetVideoEncoderConfiguration (&req, resp); 
qDebug() << "Set Encoder: " << ret; 

SetVideEncoderConfigurationのためにあるのですか?要求パラメータを設定する関数呼び出しがありますか?私はGetMediaUriで見つかったもう一つの方法は、

soap_new_req__trt__GetStreamUri (mediaDevice.soap,soap_new_req_tt__StreamSetup (mediaDevice.soap, (enum tt__StreamType)0, soap_new_tt__Transport(mediaDevice.soap), 1, NULL), "profile1"); 

のようなものを使用していた、これらはのgSOAPと、クライアント側のコードのための唯一の二つの方法はありますか?

-Mandar女子

+0

メモリリークに注意してください。 'stapdup'ではなく' soap_malloc'を使って文字列を割り当てるべきです。 – mpromonet

答えて

2

のgSOAPとC++でタイプTのデータを割り当てるsoap_new_T()の4つのバリエーションがあります

  • T * soap_new_T(struct soap*)デフォルト が初期化に割り当てられTの新しいインスタンスを返しますヒープはsoapコンテキストで管理されます。
  • T * soap_new_T(struct soap*, int n)は、 Tの新しいインスタンスnのインスタンスを管理対象ヒープに返します。上記のように、配列内のインスタンスはデフォルトで初期化されます。
  • T * soap_new_req_T(struct soap*, ...)(構造体とクラスのみ) 新しいインスタンスTが管理対象ヒープに割り当てられ、必要なデータメンバーが他の引数...に指定された値に設定されます。
  • T * soap_new_set_T(struct soap*, ...)(構造体とクラスのみ)は、管理されたヒープ上にTの新しいインスタンス を返し、public/serializableデータメンバーを他の引数...に指定された値に設定します。

strdupの代わりにsoap_strdup(struct soap*, const char*)を使用すると、管理対象ヒープに文字列をダブすることができます。

マネージヒープ上のすべてのデータが大量に削除soap_destroy(soap)soap_end(soap)と(そのためにこれらを呼び出す)soap_done(soap)または前に呼び出されなければならないです。

template<class T> 
T * soap_make(struct soap *soap, T val) 
{ 
    T *p = (T*)soap_malloc(soap, sizeof(T)); 
    if (p) 
    *p = val; 
    return p; 
} 
template<class T> 
T **soap_make_array(struct soap *soap, T* array, int n) 
{ 
    T **p = (T**)soap_malloc(soap, n * sizeof(T*)); 
    for (int i = 0; i < n; ++i) 
    p[i] = &array[i]; 
    return p; 
} 

その後CLASSNAMEの100のインスタンスに100個のポインタを作成するために、マネージヒープとsoap_make_array(soap, soap_new_CLASSNAME(soap, 100), 100)に値123へのポインタを作成するためにsoap_make<int>(soap, 123)を使用:データ、使用テンプレートへのポインタを割り当てること

gSOAPツールでも、詳細コピー操作が生成されます。CLASSNAME::soap_dup(struct soap*)は、オブジェクトのディープコピーを作成し、引数として指定した別のsoapコンテキストに割り当てます。この引数としてNULLを使用して、アンマネージドディープコピーを割り当てます(ただし、ポインタサイクルは使用できません)。次に、すべてのメンバの深い削除のためにCLASSNAME::soap_del()でアンマネージコピーを削除し、オブジェクトdeleteを削除します。

詳細については、Memory management in C++を参照してください。 gSOAP 2.8.39以上を使用してください。

関連する問題