是否有更简单的方法在gSOAP请求/响应中设置/获取值?

时间:2016-12-09 02:15:52

标签: gsoap onvif

我正在使用gSOAP配置兼容ONVIF的相机。 目前,我通过这样做手动设置请求中的所有参数。这适用于 SetVideEncoderConfiguration

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;

有更简单的方法吗?可能是一些设置请求参数的函数调用?我用 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 Joshi

1 个答案:

答案 0 :(得分:3)

使用gSOAP在C ++中分配类型soap_new_T()的数据有T的四种变体:

  • T * soap_new_T(struct soap*)返回默认的T新实例 在由soap上下文管理的堆上初始化和分配。
  • T * soap_new_T(struct soap*, int n)返回n个新实例的数组 托管堆上的T。数组中的实例默认初始化如上所述。
  • T * soap_new_req_T(struct soap*, ...)(仅限结构和类)返回a 在托管堆上分配的T的新实例,并将所需的数据成员设置为其他参数...中指定的值。
  • T * soap_new_set_T(struct soap*, ...)(仅限结构和类)返回a 托管堆上的T的新实例,并将公共/可序列化数据成员设置为其他参数...中指定的值。

使用soap_strdup(struct soap*, const char*)代替strdup将字符串复制到托管堆上。

托管堆上的所有数据都使用soap_destroy(soap)进行批量删除 soap_end(soap)(按此顺序调用这些内容)必须在soap_done(soap)soap_free(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;
}

然后使用soap_make<int>(soap, 123)创建指向托管堆上的值123的指针,并soap_make_array(soap, soap_new_CLASSNAME(soap, 100), 100)创建指向100个CLASSNAME实例的指针。

gSOAP工具还为您生成深层复制操作:CLASSNAME::soap_dup(struct soap*)创建对象的深层副本,并将其分配给您作为参数提供的另一个soap上下文。使用NULL作为此参数来分配非托管深层副本(但这些副本不能有指针循环!)。然后删除包含CLASSNAME::soap_del()的非托管副本,以便彻底删除所有成员,然后delete对象本身。

有关详细信息,请参阅Memory management in C++。使用gSOAP 2.8.39及更高版本。