多多色-多人伦交性欧美在线观看-多人伦精品一区二区三区视频-多色视频-免费黄色视屏网站-免费黄色在线

國內最全IT社區平臺 聯系我們 | 收藏本站
阿里云優惠2
您當前位置:首頁 > 互聯網 > gSoap實現ONVIF中xsd__anyType到具體結構類型的轉換

gSoap實現ONVIF中xsd__anyType到具體結構類型的轉換

來源:程序員人生   發布時間:2014-10-14 11:09:50 閱讀次數:3777次

上一篇文章已經粗略計劃要討論gsoap關于序列化/解析編程。

本文則闡述一下關于gsoap生成代碼的一些重要特征方法及使用。如題,下我們從ONVIF生成的C碼中,挑選簡單的一個類型來試驗一下與xsd__anyType之間的轉換。這個試驗如此重要,主要是因為,在之前我真的拿生成代碼的相關結構的的一些__any字段沒有辦法。雖依據ONVIF文檔,以及實際交互觀測的XML結構中可知明明是已知的標準結構,卻無奈生成被解析成any字段,主要是可能這部分字段可由廠商決定填充哪些擴展意義的結構。

簡單試驗

本次試驗選_trt__GetProfile結構作轉換例程,主要理由是這個結構實在簡單,只含有一個字段;書寫初始化簡單。

struct _trt__GetProfile

#soapStub.h

 

#ifndef SOAP_TYPE__trt__GetProfile #define SOAP_TYPE__trt__GetProfile (1365) /* trt:GetProfile */ struct _trt__GetProfile { char *ProfileToken; /* required element of type tt:ReferenceToken */ }; #endif

 

頭部概覽與FD操作

#include "inc.h" typedef struct soap *soap_pointer; #include "soap.nsmap" // anyType int anyType_ready(void) { return open("anyType.xml", O_RDWR|O_CREAT, S_IWUSR|S_IRUSR); } int FD_set(int* FD, int fd) { int ret = *FD; *FD = fd; return ret; }

注:inc.h是自組織的部分所需頭依賴;

后面包含了soap.nsmap文件,你懂的,里面解開可以可以依次了解清楚包含與依賴關系;

soap.nsmap < soapH.h < soapStub.h < stdsoap2.h

主流程 main()

static xsd__anyType* _trt__GetProfile2anyType(soap_pointer soap_, struct _trt__GetProfile* p_, xsd__anyType* _any); static struct _trt__GetProfile* _trt__GetProfile_from_anyType(soap_pointer soap_, struct _trt__GetProfile* _p, xsd__anyType* _any); int main(int argc, char const *argv[]) { /* code */ struct soap soap; soap_pointer soap_ = &soap; soap_init(soap_); struct _trt__GetProfile Data = {"Profile0"}; xsd__anyType Dom; soap_default_xsd__anyType(soap_, &Dom); if (_trt__GetProfile2anyType(soap_, &Data, &Dom)) { soap_default__trt__GetProfile(soap_, &Data); if (_trt__GetProfile_from_anyType(soap_, &Data, &Dom)) printf("Data >%s", Data.ProfileToken); } soap_end(soap_);soap_done(soap_); return 0; }

 

具體轉換實現

xsd__anyType* _trt__GetProfile2anyType( soap_pointer soap_, struct _trt__GetProfile* p_, xsd__anyType* _any ) { int fd = anyType_ready(); bool b = (fd == -1); if (b) return NULL; do { int* FD = &(soap_->sendfd); fd = FD_set(FD, fd); b = (soap_write__trt__GetProfile(soap_, p_) != SOAP_OK); fd = FD_set(FD, fd); b = b &&(lseek(fd, 0, SEEK_SET) == -1); if (b) break; FD = &(soap_->recvfd); fd = FD_set(FD, fd); b = (soap_read_xsd__anyType(soap_, _any) != SOAP_OK); fd = FD_set(FD, fd); } while(false); close(fd); if (b) return NULL; return _any; } struct _trt__GetProfile* _trt__GetProfile_from_anyType(soap_pointer soap_, struct _trt__GetProfile* _p, xsd__anyType* _any) { int fd = anyType_ready(); bool b = (fd == -1); if (b) return NULL; do { int* FD = &(soap_->sendfd); fd = FD_set(FD, fd); b = (soap_write_xsd__anyType(soap_, _any) != SOAP_OK); fd = FD_set(FD, fd); b = b &&(lseek(fd, 0, SEEK_SET) == -1); if (b) break; FD = &(soap_->recvfd); fd = FD_set(FD, fd); b = (soap_read__trt__GetProfile(soap_, _p) != SOAP_OK); fd = FD_set(FD, fd); } while(false); close(fd); if (b) return NULL; return _p; }

 

參考相關

本次試驗啟發于gsoap指南

gSOAP 2.8.11 User Guide

7.5.3 Serializing C/C++ Data to XML

You can assign an output stream to soap.os or a le descriptor to soap.sendfd. For example

soap.sendfd = open(file, O_RDWR|O_CREAT, S_IWUSR|S_IRUSR); soap_serialize_PointerTons_Person(&soap, &p); soap_begin_send(&soap); soap_put_PointerTons_Person(&soap, &p, "ns:element-name", "ns:type-name"); soap_end_send(&soap);

The above can be abbreviated to

soap.sendfd = open(file, O_RDWR|O_CREAT, S_IWUSR|S_IRUSR); soap_write_PointerTons_Person(&soap, &p);

gSoap生成代碼的重要使用特征

 

生成清單

  • soapStub.h
  • soapClient.c
  • soapH.h
  • soapC.c
  • soap.nsmap

這是客戶端的生成簡單,soapClient.c 是soapStub.h的實現, soapC.c是soapH.h的實現,soap.nsmap是定義全局編譯所需的xmlns集合namespaces[];

我們主要通過調用soapStub.h聲明的方法來完成Service的訪問,其中封裝了交互過程;所有結構都定義在soapStub.h中有聲明;

當然soapH.h則對應每一個結構都生成了相應的序列化/解析的方法,以及一些讀寫宏。

soapStub.h

所有交互命令的調用及結構聲明;

soapH.h

#ifndef SOAP_TYPE_xsd__duration #define SOAP_TYPE_xsd__duration (190) #endif SOAP_FMAC1 void SOAP_FMAC2 soap_default_xsd__duration(struct soap*, LONG64 *); SOAP_FMAC3S const char* SOAP_FMAC4S soap_xsd__duration2s(struct soap*, LONG64); SOAP_FMAC1 int SOAP_FMAC2 soap_out_xsd__duration(struct soap*, const char*, int, const LONG64 *, const char*); SOAP_FMAC3S int SOAP_FMAC4S soap_s2xsd__duration(struct soap*, const char*, LONG64 *); SOAP_FMAC1 LONG64 * SOAP_FMAC2 soap_in_xsd__duration(struct soap*, const char*, LONG64 *, const char*); SOAP_FMAC3 int SOAP_FMAC4 soap_put_xsd__duration(struct soap*, const LONG64 *, const char*, const char*); #ifndef soap_write_xsd__duration #define soap_write_xsd__duration(soap, data) ( soap_serialize_xsd__duration(soap, data), soap_begin_send(soap) || soap_put_xsd__duration(soap, data, "xsd:duration", NULL) || soap_end_send(soap), soap->error ) #endif SOAP_FMAC3 LONG64 * SOAP_FMAC4 soap_get_xsd__duration(struct soap*, LONG64 *, const char*, const char*); #ifndef soap_read_xsd__duration #define soap_read_xsd__duration(soap, data) ( soap_begin_recv(soap) || !soap_get_xsd__duration(soap, data, NULL, NULL) || soap_end_recv(soap), soap->error ) #endif


我們能見到大量類似這樣規則的定義,每個方法的前置宏聲明是有區別意義的。

SOAP_FMAC3S 這是序列化成字符串的方法修飾;這類方法主要是一類簡單的基本類型到字符串的序列化轉換, 比如ONVIF中有定義許多的枚舉;

具體這么多修飾宏的意義可以參照stdsoap2.h中描述,在VC環境下使用助手的outline功夫查看文件代碼結構是相當直觀的。

另外我們還看見每一種類型都定義了soap_read/write_***的函式宏,本文試驗主要就是通過這類讀寫來實現不同實現結構的轉換的。

標準化

總之,為了工作簡潔高效,日后可讀可維護,我們盡量使用標準化的調用方式,而不走偏方,這才是本文針對各編程界提倡的建議。

生活不易,碼農辛苦
如果您覺得本網站對您的學習有所幫助,可以手機掃描二維碼進行捐贈
程序員人生
------分隔線----------------------------
分享到:
------分隔線----------------------------
關閉
程序員人生
主站蜘蛛池模板: 毛片h| 亚洲精品老司机综合影院 | 午夜影院官网 | 欧美成人性色大片在线观看 | 精品的一区二区三区 | 最近最新中文字幕大全高清6 | 欧美性高清video | 成人做爰免费视频免费看 | 国产精品自产拍在线观看 | 色久综合大榴莲 | 中国特黄特级真人毛片 | 天天鲁天天爱天天鲁天天 | 国产高清一区二区三区免费视频 | 国产精品国产三级国产a | 美国美女毛片 | 亚洲视频在线网站 | 最近免费中文字幕完整4 | 亚洲一区二区福利视频 | 欧美激情一区二区三区在线 | h在线免费视频 | 国产农村1级毛片 | 中文字幕123| 成人国产精品一级毛片视频 | 在线免费欧美 | 免费观看性欧美毛片 | 日本一级高清不卡视频在线 | 免费在线视频播放 | 欧美另类久久久精品 | 波多野结衣久久高清免费 | 成人视屏在线 | 中文字幕免费人成乱码中国 | 欧美最猛性xxxxx亚洲精品 | 午夜免费体验 | 日本欧美一区二区三区视频 | 免费国产一区二区三区四区 | 亚洲国产精品久久久久久网站 | h视频在线免费 | 久久 精品 一区二区 | 国产精品久久久久久五月尺 | 波多野结衣久久一区二区 | 亚洲成a人v欧美综合天 |