trace str和trace xml的不同

本文介绍了AS3中XML处理的多种技巧,包括tracestr和tracexml的区别、使用E4X规范处理XML的方法、XML对象的创建及操作、属性查询与修改、节点插入等高级操作。

trace str和trace xml的不同

var str:String = "<?xml version=\"1.0\" encode=\"UTF-8\"?><a><b><c res=\"true\" /></b></a>";
   
   
   var strXML:XML = new XML(str);
   
   trace(str);
   trace(strXML);

请大家想一下,输出结果是什么?--------------------------------

 

<?xml version="1.0" encode="UTF-8"?><a><b><c res="true" /></b></a>


<a>
  <b>
    <c res="true"/>
  </b>
</a>

 

可以看出输出xml,xml的头部没有了,每个结点前面加一个空格,而且strXML相当于a结点

如果我们要输出c结点的属性res

 trace("@:" + strXML.b.c[0].@res);

 

 

XML处理技巧一则

 

 

 由于AS3中XML 支持E4X 规范的 XML 处理..
所以我们可以方便的使用
xml.(条件)来过滤我们需要的节点..
如:

01.var xl:XML = <root>
02.            <item type="1">http://adobe.com </item>
03.            <item type="1">http://l4cd.net </item>
04.            <item type="2">http://google.com </item>
05.            <item type="2">http://qq.com </item>
06.        </root>
07.trace(xl.item.(@type == 1));
08.//output:
09.//<item type="1">http://adobe.com </item>
10.//<item type="1">http://l4cd.net </item>


但是有时候会遇到这样一种情况..并不是每个节点都包含指定的属性..
如:

1.<root>
2.    <item type="1">http://adobe.com </item>
3.    <item type="1">http://l4cd.net </item>
4.    <item type="2">http://google.com </item>
5.    <item>http://qq.com </item>
6.</root>

这时候如果还继续使用xl.item.(@type == 1),将出现以下错误

1.ReferenceError: Error #1065: 变量 @type 未定义。
2.    at Main()[X:\Main.as:21]


为避免这种情况..可以使用hasOwnProperty方法..先判断是否有指定的属性~

01.var xl:XML = <root>
02.            <item type="1">http://adobe.com </item>
03.            <item type="1">http://l4cd.net </item>
04.            <item type="2">http://google.com </item>
05.            <item>http://qq.com </item>
06.        </root>
07.trace(xl.item.(hasOwnProperty('@type') && @type == 1));
08.//output:
09.//<item type="1">http://adobe.com </item>
10.//<item type="1">http://l4cd.net </item>

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

None.gif   XML.ignoreComments  =  false;
None.gif  var xml:XML 
=  
None.gif  
< body >
None.gif  
< ! --  comment  -->
None.gif  text1
None.gif  
< a >
None.gif  
< b > text2 </ b >
None.gif  
</ a >
None.gif  
</ body > ;
None.gif  trace(xml.descendants(
" * " ).length());  //   5
None.gif  trace(xml.descendants(
" * " )[0]);  //   //   < ! --  comment  -->
None.gif  trace(xml.descendants(
" * " )[ 1 ].toXMLString());  //  text1
None.gif  trace(xml.descendants(
" a " ).toXMLString());  //   < a >< b > text2 </ b ></ a >
None.gif  trace(xml.descendants(
" b " ).toXMLString());  //   < b > text2 </ b >
None.gif

为什么放弃AS2.0选择AS3.0?如果只允许我说三个理由。那么AS3.0对XML的近乎完美的支持绝对是其中一个。
简单说说AS3.0中对于XML支持的不同吧:
A.AS2.0对XML的支持勉勉强强,将就着可以用。而AS3.0中对XML的支持是全方位的,极其强大和灵活的。
B.AS2.0对XML的支持不是内建的(build-in),也并非基于ECMAScript for XML(E4X)标准。而AS3.0中对XML的支持符合E4X标准,它的设计有三个优点:
1. 简易。包括操作和可读性。你会发现AS3.0中对于XML的操作犹如对一个普通Object对象一样浅显易懂。语句非常浅白流畅。
2. 连续性。其各个功能的设计和AS3.0其余的部分思想一致,易于理解。
3. 熟悉。操作符和操作逻辑对我们来说都相当熟悉易用。
在AS2.0时代,为了解决这部分的问题

C.效率。
效率包括两方面,开发效率,和代码执行效率。开发效率的论述见上。AS3.0对于XML的执行效率远远高过没有内建XML支持的AS2.0。

<strong>XML的输入</strong>
在AS2.0时代,在代码行中输入XML代码是一种痛苦。如果不是从文件中读取,那么我们就要忍受一长串挤在一块儿的字符串。

而在AS3.0中,太简单了。直接按照XML的内容输即可,想换行就换行,想Tab就Tab,就一个字,爽。
新建一个fla,选中第一帧,F9打开动作面板,输入如下代码:

None.gif   // 【黑羽】ActionScript  3 .0系列教程( 4 )
None.gif  
// http: // www.kingda.org
None.gif  
// 例1
None.gif  var kingdaXML:XML 
=  
None.gif  
< tutorial >
None.gif  
< item id = ' 1 ' >
None.gif  
< level > 2 </ level >
None.gif  
< title >     First touch of Flash  9 </ title >
None.gif  
</ item >
None.gif  
< item id = ' 2 ' >
None.gif  
< level > 3 </ level >
None.gif  
< title >     Binding Classes </ title >
None.gif  
</ item >
None.gif  
< item id = ' 3 ' >
None.gif  
< level > 4 </ level >
None.gif  
< title > Document Class </ title >
None.gif  
</ item >
None.gif  
</ tutorial >
None.gif  trace (kingdaXML.item[
1 ].level);   // output: 3
None.gif  
// 例2
None.gif  var kS:String 
=   " <root><txt>this is a test</txt></root> " ;
None.gif  var kXML:XML 
=  new XML(kS);
None.gif  trace (kXML.txt); 
// output:this  is   a test;

例1中注意到没,直接写XML内容在后面,想换行就换行,想tab就tab,多爽。不想AS2.0中写string时,换个行就不行了。
写完这一句后,我们所写出的类似于string的形式立刻就被Flash理解成了XML对象了,所以我们马上就可以用"."操作符来访问相应的属性。本例中访问了第2个item节点的level值。
这么简便直观的访问方式是不是比 AS2.0中那千遍一律的childNodes要好得多?<img src="/mt-static/smilies/laughing.gif" width="20" height="20" border="0" alt="laughing.gif" title="funny!" />

 

不过要注意,最后可以加";"结束。但我为了XML的视觉美观没有加。这个没有关系,编译时不会考虑这一点。
<strong>事实上只要你喜欢,AS1.0, 2.0, 3.0中语句结束都可以不加";"号。但是这并不是一个好的编程习惯,更不符合严谨的自我语法要求。因此我建议,除了XML可以不加外,其余的都应该加,呵呵。</strong>

例2展示了如何将一个包含了XML内容的字符串转换成XML对象。用的是XML的构造函数转换的。

AS3更有趣的是,可以使用已有的变量来直接构造XML,带来方便的编程特性。如下例。


None.gif var rootNodeName    :String  =   " site "
None.gif  var subNodeName        :String 
=   " orgin " ;
None.gif  var subNodeContent    :String 
=   " Kingda's Blog "
None.gif  var attributeName    :String 
=   " url "
None.gif  var attributeValue    :String 
=   " http://www.kingda.org "
None.gif  var extXML:XML 
=  
None.gif  
< {rootNodeName} {attributeName} = {attributeValue} >
None.gif  
< {subNodeName} > {subNodeContent} </ {subNodeName} >
None.gif  
</ {rootNodeName} > ;
None.gif  trace (extXML.toString());
None.gif  
/* output:
None.gif  
< site url = " http://www.kingda.org " >
None.gif  
< orgin > Kingda ' s Blog</orgin>
None.gif
   </ site >
None.gif  
*/
None.gif  
None.gif
< strong > 要点就是要把变量用 " {} " 括起来,并且设置属性时不要再加引号了。 </ strong >
None.gif这个特性黑羽非常喜欢。
None.gif
None.gif
< strong > XML的外部读取 </ strong >
None.gif包括读取外部xml文件,和通过URL读取xml。AS3.0中不像2.0那样集成了一个load()。
None.gifAS3.0在架构上就设计了所有与外部打交道的都由URLrequest对象来进行,数据都由URLloader对象来接受。这个我们会在下一部分教程详细讲解。这一次只要知道这样的架构设计是深思熟虑,且简洁优美的即可。
None.gif
None.gif
None.gif
None.gif  var myXML:XML 
=  new XML();
None.gif
// 初始化XML地址,可以是本地的 " xxx.xml " ,也可以是如下的URL地址。
None.gif  var XML_URL:String 
=   " http://www.kingda.org/blog/index.xml " ;        // 我的Blog RSS Feed
None.gifvar myXMLURL:URLRequest 
=  new URLRequest(XML_URL);
None.gif  var myLoader:URLLoader 
=  new URLLoader(myXMLURL);
None.gif
// 添加装载完成侦听器,
None.gif  
// Event.COMPLETE的值是 " complete " ,直接用此字符串也可以。
None.gif  myLoader.addEventListener(Event.COMPLETE, xmlLoaded);
None.giffunction xmlLoaded(evtObj:Event) { 
None.gif  myXML 
=  XML(myLoader.data);
None.gif  trace(
" 数据装载完成. " );
None.gif  trace (myXML);
None.gif  }
None.gif
None.gif
< strong > XML的操作。 </ strong >
None.gif
None.gif

精彩的部分到了。详细看我下面的例子代码。

1.查询

None.gif // 显示level为4的节点的title值
None.gif  trace (kingdaXML.item.(level 
==   4 ).title);
None.gif  
// output:Document Class
None.gif
// 显示level > 2的节点的title值,本处结果大于1,所以是一个XML Array。
None.gif  trace (kingdaXML.item.(level 
>   2 ).title);
None.gif  
/* output:
None.gif  
< title > Binding Classes </ title >
None.gif  
< title > Document Class </ title >
None.gif  
*/
None.gif
None.gif
// 使用属性用@开头即可。真方便。
None.gif  trace (kingdaXML.item.(level 
>   2 ).@id); 
None.gif  
// output: 23
None.gif  
// 这儿要注意,实际上是2, 3 。一个Array.
None.gif
// 也可以用属性来做判断
None.gif  trace (kingdaXML.item.(@id 
>   1 ).title);
None.gif 2 .添加或者修改属性
None.gif方便的不能再方便,直接写即可。爽翻天啊。
None.gif   // 把id  ==  1的节点level值改为2
None.gif  kingdaXML.item.(@id
== 1 ).level  =   2 ;
None.gif  
// 把id == 1的节点添加一个属性 page
None.gif  kingdaXML.item.(@id
== 1 ).page  =   100 ;
None.gif  trace (kingdaXML.item.(@id
== 1 ));
None.gif


 3.按某条件插入节点

None.gif var newNode1:XML  =   < item id = ' 2.5 ' >< level > 0 </ level >< title > None </ title ></ item >  
None.gif
None.gif  var newNode2:XML 
=   < item id = ' 1.5 ' >< level > 0 </ level >< title > None </ title ></ item >  
None.gif
None.gif  
// 把newNode1插入到id == 2的节点后面
None.gif
None.gif  kingdaXML 
=  kingdaXML.insertChildAfter(kingdaXML.item.(@id == 2 ), newNode1);
None.gif
None.gif
None.gif
None.gif
// 把newNode1插入到id == 2的节点前面
None.gif
None.gif  kingdaXML 
=  kingdaXML.insertChildBefore(kingdaXML.item.(@id == 2 ), newNode2);
None.gif
None.gif  trace (kingdaXML);
None.gif
None.gif  
None.gif
None.gif
None.gif
< strong > XML的高级操作。 </ strong >
None.gif


常用的操作上面已经介绍的很清楚了。高级操作则是留给对XML应用更深的兄弟们。
几点注意:
1.在AS3.0中, XML类的ignoreWhitespace默认为true。
2.AS3.0支持对comments的直接操作。但默认


  
None.gif XML.ignoreComments  =  false;
None.gif  var kingdaXML:XML 
=  
None.gif  
< item >
None.gif  
< ! --  comment   1 -->
None.gif  
< ! --  comment   2 -->
None.gif  
</ item > ;
None.gif  trace(kingdaXML.toXMLString());  
// 默认为true时,不会显示comment的
None.gif  
None.gif访问comment用
None.gif
None.gif
None.gif  trace(kingdaXML.comments()[
1 ].toXMLString()); 

3.XML支持克隆。
使用copy()可以得到一份现有XML的值拷贝。


var kingdaCopy:XML = kingdaXML.copy();


对kingdaCopy操作就不会影响kingdaXML对象了。
4.极有用的descendants函数返回一个XMLList对象,包括所有的子节点。
设ignoreComments = false;和ignoreProcessingInstructions = false后,连comments和process instructions也会包含在这个XMLList对象中。
运用示例如下:

None.gif   XML.ignoreComments  =  false;
None.gif  var xml:XML 
=  
None.gif  
< body >
None.gif  
< ! --  comment  -->
None.gif  text1
None.gif  
< a >
None.gif  
< b > text2 </ b >
None.gif  
</ a >
None.gif  
</ body > ;
None.gif  trace(xml.descendants(
" * " ).length());  //   5
None.gif  trace(xml.descendants(
" * " )[0]);  //   //   < ! --  comment  -->
None.gif  trace(xml.descendants(
" * " )[ 1 ].toXMLString());  //  text1
None.gif  trace(xml.descendants(
" a " ).toXMLString());  //   < a >< b > text2 </ b ></ a >
None.gif  trace(xml.descendants(
" b " ).toXMLString());  //   < b > text2 </ b >
None.gif

还有太多的XML有用操作功能了(如对namespace的操作)。用到时再去翻参考书吧。
以上的介绍可以满足绝大部分运用了。

 

打完收工,歇歇。
对了AS2.0已有的XML类,在3.0中变成了XMLDocument类,使用方法不变。便于AS2.0程序移植。其余不推荐。

 

posted on 2009-11-02 08:51 jiahuafu 阅读(...) 评论(...) 编辑 收藏

/****************************************************************************** * Copyright (c) 2018-2018 TP-Link Systems Inc. * * Filename: imaging.c * Version: 1.0 * Description: Imaging 请求中,与透传相关的指令处理接口 * Author: yexuelin<yexuelin@tp-link.com.cn> * Date: 2019-03-14 ******************************************************************************/ #include <stdio.h> #include "onvif_passthrough.h" #include "libds.h" #include "soap_auth.h" #include "soap_pack.h" #include "soap_timg.h" #include "soap_parse.h" #include "soap_tptz.h" #define MAX_INTEGER_STR_LEN 32 /*最大整数字符串长度*/ #define IMAGE_STR "image" #define COMMON_STR "common" #define START_FOCUS_STR "start_focus" #define STOP_FOCUS_STR "stop_focus" #define START_IRIS_STR "start_iris" #define VELOCITY_STR "velocity" #define TIMG_IMG_SETTING "timg:ImagingSettings" #define TIMG_GET_IMG_SETTINGS "timg:GetImagingSettings" #define TIMG_SET_IMG_SETTINGS "timg:SetImagingSettings" #define TIMG_GET_SETTING_RSP "timg:GetImagingSettingsResponse" #define TIMG_SET_SETTING_RSP "timg:SetImagingSettingsResponse" #define TIMG_MOVE "timg:Move" #define TIMG_STOP "timg:Stop" #define TIMG_MOVE_RSP "timg:MoveResponse" #define TIMG_STOP_RSP "timg:StopResponse" /* 功能:构建一个获取图像设置的JSON请求对象。 输入:SOAP_CONTEXT指针(包含请求信息),输出参数json_req(用于返回构建的JSON对象),模块名节名。 输出:返回OK或ERROR。 过程: a. 进行鉴权(检查是否有操作员权限)。 b. 创建JSON对象,添加方法为"get",并添加指定的模块节。 c. 将构建的JSON对象通过json_req返回。*/ LOCAL S32 get_json_settings(SOAP_CONTEXT *soap, JSON_OBJPTR *json_req, char *module_name, char *sec_name) { JSON_OBJPTR json_data = NULL; JSON_OBJPTR json_sec = NULL; if (soap == NULL || json_req == NULL) { ONVIF_WARN("soap == NULL."); return ERROR; } /* 需要鉴权 */ if (OK != soap_usernametoken_auth(soap, UM_OPERATOR)) { ONVIF_ERROR("Auth failed\n"); soap_fault(soap, "SOAP-ENV:Sender", "ter:NotAuthorized", NULL, "Authority failure"); soap->error = 400; return ERROR; } json_data = jso_new_obj(); json_sec = jso_new_obj(); if (json_data == NULL || json_sec == NULL) { ONVIF_WARN("jso_new_obj error."); jso_free_obj(json_data); jso_free_obj(json_sec); return ERROR; } jso_add_string(json_data, DS_METHOD_STR, METHOD_GET_STR); jso_obj_add(json_data, module_name, json_sec); jso_add_string(json_sec, DS_SECTION_STR, sec_name); *json_req = json_data; return OK; } /*------------------------- 获取图像参数 ----------------------------------*/ /* 功能:生成获取图像设置的SOAP响应(XML格式)。 输入:xml_buf(输出缓冲区),data(未使用)。 输出:返回OK或ERROR。 过程: a. 从设备服务(ds_read)读取当前的图像通用设置(亮度、饱度、对比度、锐度)模块规格(判断是否支持光圈优先)。 b. 开始构建XML响应,按照ONVIF标准格式输出各个图像参数。 c. 如果设备支持光圈优先(iris_first),则输出曝光模式(手动、自动或光圈优先)当前的光圈值。 d. 如果设备支持变焦(通过tptz_get_local_capability判断),则输出聚焦相关的参数(自动对焦模式、默认速度、近限远限)。*/ LOCAL S32 soap_out_timg_get_settings_rsp(ONVIF_BUF *xml_buf, void *data) { IMAGE_COMMON image_common; MODULE_SPEC module_spec; struct onvif_ptz_capability *ptz_capability = NULL; const char *tag_str[] = {TT_BRIGHTNESS_STR, TT_COLORSATURATION_STR, TT_CONTRAST_STR, TT_SHARPNESS_STR}; U8 *value[] = {&image_common.luma, &image_common.saturation, &image_common.contrast, &image_common.sharpness}; U32 i; if (NULL == xml_buf) { ONVIF_WARN("Input NULL."); return ERROR; } memset(&image_common, 0, sizeof(IMAGE_COMMON)); if (0 == ds_read(IMAGE_COMMON_PATH, &image_common, sizeof(IMAGE_COMMON))) { ONVIF_ERROR("ds_read %s fail.", IMAGE_COMMON_PATH); return ERROR; } memset(&module_spec, 0, sizeof(MODULE_SPEC)); if (0 == ds_read(MODULE_SPEC_PATH, &module_spec, sizeof(MODULE_SPEC))) { ONVIF_ERROR("ds_read %s fail.", MODULE_SPEC_PATH); return ERROR; } SOAP_IF_FAIL_RET(soap_element_begin_out(xml_buf, TIMG_GET_SETTING_RSP, NULL)); SOAP_IF_FAIL_RET(soap_element_begin_out(xml_buf, TIMG_IMG_SETTING, NULL)); for (i = 0; i < sizeof(tag_str) / sizeof(char*); ++i) { SOAP_IF_FAIL_RET(soap_element_int_type(xml_buf, tag_str[i], *value[i], NULL)); } if (module_spec.iris_first[0] == '1') { /* tt:Exposure begin */ SOAP_IF_FAIL_RET(soap_element_begin_out(xml_buf, "tt:Exposure", NULL)); /* tt:Mode */ switch (image_common.exp_type) { case EXP_TYPE_MANUAL: SOAP_IF_FAIL_RET(soap_element(xml_buf, "tt:Mode", "MANUAL", NULL)); break; case EXP_TYPE_AUTO: SOAP_IF_FAIL_RET(soap_element(xml_buf, "tt:Mode", "AUTO", NULL)); break; case EXP_TYPE_IRIS_FIRST: SOAP_IF_FAIL_RET(soap_element(xml_buf, "tt:Mode", "IRIS_FIRST", NULL)); break; default: ONVIF_WARN("Unsupported expore mode."); return ERROR; } /* tt:Iris */ SOAP_IF_FAIL_RET(soap_element_int_type(xml_buf, "tt:Iris", image_common.iris_level, NULL)); /* tt:Exposure end */ SOAP_IF_FAIL_RET(soap_element_end_out(xml_buf, "tt:Exposure")); } if (tptz_get_local_capability(&ptz_capability) && ptz_capability->zoom_valid) { /*FOCUS begin */ SOAP_IF_FAIL_RET(soap_element_begin_out(xml_buf, "tt:Focus", NULL)); SOAP_IF_FAIL_RET(soap_element(xml_buf, "tt:AutoFocusModes", "AUTO", NULL)); SOAP_IF_FAIL_RET(soap_element(xml_buf, "tt:AutoFocusModes", "MANUAL", NULL)); SOAP_IF_FAIL_RET(soap_element_begin_out(xml_buf, "tt:DefaultSpeed", NULL)); SOAP_IF_FAIL_RET(soap_element_int_type(xml_buf, "tt:Min", 1, NULL)); SOAP_IF_FAIL_RET(soap_element_int_type(xml_buf, "tt:Max", 1, NULL)); SOAP_IF_FAIL_RET(soap_element_end_out(xml_buf, "tt:DefaultSpeed")); SOAP_IF_FAIL_RET(soap_element_begin_out(xml_buf, "tt:NearLimit", NULL)); SOAP_IF_FAIL_RET(soap_element_int_type(xml_buf, "tt:Min", 10, NULL)); SOAP_IF_FAIL_RET(soap_element_int_type(xml_buf, "tt:Max", 2000, NULL)); SOAP_IF_FAIL_RET(soap_element_end_out(xml_buf, "tt:NearLimit")); SOAP_IF_FAIL_RET(soap_element_begin_out(xml_buf, "tt:FarLimit", NULL)); SOAP_IF_FAIL_RET(soap_element_int_type(xml_buf, "tt:Min", 0, NULL)); SOAP_IF_FAIL_RET(soap_element_int_type(xml_buf, "tt:Max", 0, NULL)); SOAP_IF_FAIL_RET(soap_element_end_out(xml_buf, "tt:FarLimit")); SOAP_IF_FAIL_RET(soap_element_end_out(xml_buf, "tt:Focus")); /*FOCUS end */ } SOAP_IF_FAIL_RET(soap_element_end_out(xml_buf, TIMG_IMG_SETTING)); SOAP_IF_FAIL_RET(soap_element_end_out(xml_buf, TIMG_GET_SETTING_RSP)); return OK; } /* 功能:将获取图像设置的SOAP请求(XML)转换为内部JSON请求对象。 输入:SOAP_CONTEXT指针,输出参数json_req(返回构建的JSON对象)。 输出:返回OK或ERROR。 过程: a. 鉴权。 b. 解析SOAP请求中的VideoSourceToken(视频源令牌),检查是否为"raw_vs1"(目前只支持这个)。 c. 调用get_json_settings函数构建JSON请求。*/ LOCAL S32 timg_get_settings_xml_to_json(SOAP_CONTEXT *soap, JSON_OBJPTR *json_req) { S32 request_len = 0; S32 ch = 0; char *xml_start = NULL; char *xml_str = NULL; char **p = NULL; char charbuf[LEN_INFO] = {0}; if (soap == NULL || json_req == NULL) { ONVIF_TRACE("soap == NULL."); return ERROR; } ONVIF_TRACE("timg:GetImagingSettings"); /* 需确认是否支持 */ if (OK != soap_usernametoken_auth(soap, UM_OPERATOR)) { ONVIF_TRACE("Auth failed\n"); soap_fault(soap, "SOAP-ENV:Sender", "ter:NotAuthorized", NULL, "Authority failure"); soap->error = 400; return ERROR; } /* 分析 GetVideoEncoderConfigurationOptions 请求的具体内容 */ if (soap->request_begin != NULL && soap->request_end != NULL) { request_len = soap->request_end - soap->request_begin; if (request_len < 0) { ONVIF_TRACE("request_len < 0."); return ERROR; } xml_str = xml_start = soap->request_begin; p = (char **)&xml_str; } else { ONVIF_TRACE("no content"); return ERROR; } while (((*p) - xml_start) < request_len) { if ((ch = soap_get_tag(xml_start, request_len, p, charbuf, sizeof(charbuf))) == EOF) { return ERROR; } if (charbuf[0] == '/') { continue; } if (TRUE == soap_match_tag(charbuf, "VideoSourceToken")) { if (OK != soap_parse_element_value(xml_start, request_len, p, ch, charbuf, sizeof(charbuf))) { return ERROR; } ONVIF_TRACE("VideoSourceToken: %s", charbuf); if (strcmp(charbuf, "raw_vs1")) { SOAP_IF_FAIL_RET(soap_fault(soap, "SOAP-ENV:Sender", "ter:InvalidArgVal", "ter:SettingsInvalid", "error data")); soap->error = SOAP_FAULT; return ERROR; } continue; } } return get_json_settings(soap, json_req, IMAGE_STR, COMMON_STR); } /* 功能:将内部处理后的JSON响应转换为SOAP响应(XML)。 输入:SOAP_CONTEXT指针,json_rsp(内部处理返回的JSON响应)。 输出:返回OK或ERROR。 过程:调用soap_generate_xml函数,使用soap_out_timg_get_settings_rsp函数生成XML。*/ LOCAL S32 timg_get_settings_json_to_xml(SOAP_CONTEXT *soap, JSON_OBJPTR json_rsp) { if (soap == NULL) { ONVIF_WARN("soap == NULL."); return ERROR; } return soap_generate_xml((p_out_fun)(soap_out_timg_get_settings_rsp), soap, NULL); } /*------------------------- 配置图像参数 ----------------------------------*/ /* 功能:生成设置图像设置的SOAP响应(XML)。 输入:xml_buf(输出缓冲区),data(未使用)。 输出:返回OK或ERROR。 过程:生成一个空的timg:SetImagingSettingsResponse标签。*/ LOCAL S32 soap_out_set_timg_rsp(ONVIF_BUF *xml_buf, void *data) { if (NULL == xml_buf) { ONVIF_WARN("Input NULL."); return ERROR; } SOAP_IF_FAIL_RET(soap_element_begin_out(xml_buf, TIMG_SET_SETTING_RSP, NULL)); SOAP_IF_FAIL_RET(soap_element_end_out(xml_buf, TIMG_SET_SETTING_RSP)); return OK; } #if 0 /*------------------------- 开始聚焦 ----------------------------------*/ LOCAL S32 soap_out_timg_move_rsp(ONVIF_BUF *xml_buf, void *data) { if (NULL == xml_buf) { ONVIF_WARN("Input NULL."); return ERROR; } /* timg:MoveResponse */ SOAP_IF_FAIL_RET(soap_element(xml_buf, TIMG_MOVE_RSP, NULL, NULL)); return OK; } /*------------------------- 停止聚焦 ----------------------------------*/ LOCAL S32 soap_out_timg_stop_rsp(ONVIF_BUF *xml_buf, void *data) { if (NULL == xml_buf) { ONVIF_WARN("Input NULL."); return ERROR; } /* timg:StopResponse */ SOAP_IF_FAIL_RET(soap_element(xml_buf, TIMG_STOP_RSP, NULL, NULL)); return OK; } #endif LOCAL S32 timg_set_imaging_xml_to_json(SOAP_CONTEXT *soap, JSON_OBJPTR *json_req) { S32 request_len = 0; char *xml_start = NULL; char *xml_str = NULL; char **p = NULL; S32 ch = 0; char charbuf[LEN_INFO * 2] = {0}; JSON_OBJPTR json_data = NULL; JSON_OBJPTR json_sec = NULL; JSON_OBJPTR json_seg = NULL; const char *tag_str[] = {BRIGHTNESS_STR, COLORSATURATION_STR, CONTRAST_STR, SHARPNESS_STR}; const char *jso_str[] = {LUMA_JSO_STR, SATURATION_JSO_STR, CONTRAST_JSO_STR, SHARPNESS_JSO_STR}; U32 min[] = {LUMA_MIN, SATURATION_MIN, CONTRAST_MIN, SHARPNESS_MIN}; U32 max[] = {LUMA_MAX, SATURATION_MAX, CONTRAST_MAX, SHARPNESS_MAX}; U32 i; JSON_OBJPTR json_data_iris = NULL; JSON_OBJPTR json_sec_iris = NULL; JSON_OBJPTR json_seg_iris = NULL; int iris_to_set = 0; IMAGE_COMMON image_common; MODULE_SPEC module_spec; JSON_OBJ *rsp_obj = NULL; if (soap == NULL || json_req == NULL) { ONVIF_WARN("soap == NULL."); return ERROR; } /* 需要鉴权 */ if (OK != soap_usernametoken_auth(soap, UM_OPERATOR)) { ONVIF_WARN("Auth failed"); soap_fault(soap, "SOAP-ENV:Sender", "ter:NotAuthorized", NULL, "Authority failure"); soap->error = 400; return ERROR; } /* 分析SetImage请求的具体内容 */ if (soap->request_begin != NULL && soap->request_end != NULL) { request_len = soap->request_end - soap->request_begin; if (request_len < 0) { ONVIF_WARN("Invalid request"); return ERROR; } xml_str = soap->request_begin; xml_start = soap->request_begin; p = (char **)&xml_str; } else { ONVIF_ERROR("soap request content is NULL."); return ERROR; } json_data = jso_new_obj(); json_sec = jso_new_obj(); json_seg = jso_new_obj(); if (NULL == json_data || NULL == json_sec || NULL == json_seg) { ONVIF_WARN("jso_new_obj error."); goto err_out; } while (((*p) - xml_start) < request_len) { if ((ch = soap_get_tag(xml_start, request_len, p, charbuf, sizeof(charbuf))) == EOF) { goto err_out; } if (charbuf[0] == '/') { continue; } if (TRUE == soap_match_tag(charbuf, "VideoSourceToken")) { if (OK != soap_parse_element_value(xml_start, request_len, p, ch, charbuf, sizeof(charbuf))) { goto err_out; } ONVIF_TRACE("VideoSourceToken: %s", charbuf); if (strcmp(charbuf, "raw_vs1")) { SOAP_IF_FAIL_RET(soap_fault(soap, "SOAP-ENV:Sender", "ter:InvalidArgVal", "ter:SettingsInvalid", "error data")); soap->error = SOAP_FAULT; goto err_out; } continue; } for (i = 0; i < sizeof(tag_str) / sizeof(char*); ++i) { if (TRUE != soap_match_tag(charbuf, tag_str[i])) { continue; } if (OK != soap_parse_element_value(xml_start, request_len, p, ch, charbuf, sizeof(charbuf)) || 0 != jso_add_int(json_seg, jso_str[i], atoi(charbuf))) { goto err_out; } if((atoi(charbuf) < min[i]) || (atoi(charbuf) > max[i])) { SOAP_IF_FAIL_RET(soap_fault(soap, "SOAP-ENV:Sender", "ter:InvalidArgVal", "ter:SettingsInvalid", "error data")); soap->error = SOAP_FAULT; goto err_out; } break; } if (TRUE == soap_match_tag(charbuf, "Iris")) { if (OK != soap_parse_element_value(xml_start, request_len, p, ch, charbuf, sizeof(charbuf))) { goto err_out; } ONVIF_TRACE("Iris: %s", charbuf); iris_to_set = atoi(charbuf); continue; } } jso_obj_add(json_sec, COMMON_STR, json_seg); jso_obj_add(json_data, IMAGE_STR, json_sec); jso_add_string(json_data, DS_METHOD_STR, METHOD_SET_STR); *json_req = json_data; memset(&module_spec, 0, sizeof(MODULE_SPEC)); if (0 == ds_read(MODULE_SPEC_PATH, &module_spec, sizeof(MODULE_SPEC))) { ONVIF_ERROR("ds_read %s fail.", MODULE_SPEC_PATH); goto err_out; } if (module_spec.iris_first[0] == '1') { memset(&image_common, 0, sizeof(IMAGE_COMMON)); if (0 == ds_read(IMAGE_COMMON_PATH, &image_common, sizeof(IMAGE_COMMON))) { ONVIF_ERROR("ds_read %s fail.", IMAGE_COMMON_PATH); goto err_out; } json_data_iris = jso_new_obj(); json_sec_iris = jso_new_obj(); json_seg_iris = jso_new_obj(); if (NULL == json_data_iris || NULL == json_sec_iris || NULL == json_seg_iris) { ONVIF_WARN("jso_new_obj error."); goto err_out; } if (iris_to_set > image_common.iris_level) { jso_add_string(json_seg_iris, VELOCITY_STR, "0.1"); } else if (iris_to_set < image_common.iris_level) { jso_add_string(json_seg_iris, VELOCITY_STR, "-0.1"); } else { ONVIF_WARN("iris_to_set is the same as DUT."); goto err_out; } jso_obj_add(json_sec_iris, START_IRIS_STR, json_seg_iris); jso_obj_add(json_data_iris, IMAGE_STR, json_sec_iris); jso_add_string(json_data_iris, DS_METHOD_STR, METHOD_DO_STR); if (OK != onvif_passthrough(soap, json_data_iris, &rsp_obj)) { ONVIF_WARN("passthrough error."); goto err_out; } jso_free_obj(json_data_iris); jso_free_obj(rsp_obj); } return OK; err_out: jso_free_obj(json_data); jso_free_obj(json_sec); jso_free_obj(json_seg); jso_free_obj(json_data_iris); jso_free_obj(json_sec_iris); jso_free_obj(json_seg_iris); jso_free_obj(rsp_obj); return ERROR; } LOCAL S32 timg_set_imaging_json_to_xml(SOAP_CONTEXT *soap, JSON_OBJPTR json_rsp) { if (soap == NULL) { ONVIF_WARN("soap == NULL."); return ERROR; } return soap_generate_xml((p_out_fun)(soap_out_set_timg_rsp), soap, NULL); } #if 0 LOCAL S32 timg_move_xml_to_json(SOAP_CONTEXT *soap, JSON_OBJPTR *json_req) { S32 request_len = 0; char *xml_start = NULL; char *xml_str = NULL; char **p = NULL; S32 ch = 0; char charbuf[LEN_INFO] = {0}; char vs_token[LEN_INFO] = {0}; JSON_OBJPTR json_data = NULL; JSON_OBJPTR json_sec = NULL; JSON_OBJPTR json_seg = NULL; if (soap == NULL || json_req == NULL) { ONVIF_WARN("soap == NULL."); return ERROR; } /* 判断是否支持ptzzoom,不支持直接返回 */ if (!is_ptz_support() || !is_ptz_3D_zoom_support()) { ONVIF_WARN("not support ptz or zoom."); return ERROR; } /* 需要鉴权 */ if (OK != soap_usernametoken_auth(soap, UM_OPERATOR)) { ONVIF_WARN("Auth failed"); soap_fault(soap, "SOAP-ENV:Sender", "ter:NotAuthorized", NULL, "Authority failure"); soap->error = 400; return ERROR; } /* 需要分析 timg:Move请求的具体内容 */ if (soap->request_begin != NULL && soap->request_end != NULL) { request_len = soap->request_end - soap->request_begin; if (request_len < 0) { ONVIF_TRACE("request_len < 0."); return ERROR; } xml_str = xml_start = soap->request_begin; p = (char **)&xml_str; } else { ONVIF_ERROR("soap request content is NULL."); return ERROR; } json_data = jso_new_obj(); json_sec = jso_new_obj(); json_seg = jso_new_obj(); if (NULL == json_data || NULL == json_sec || NULL == json_seg) { ONVIF_WARN("jso_new_obj error."); goto err_out; } while (((*p) - xml_start) < request_len) { if ((ch = soap_get_tag(xml_start, request_len, p, charbuf, sizeof(charbuf))) == EOF) { ONVIF_ERROR("soap_get_tag failed"); goto err_out; } if (charbuf[0] == '/') { continue; } if (TRUE == soap_match_tag(charbuf, "VideoSourceToken")) { if (OK != soap_parse_element_value(xml_start, request_len, p, ch, charbuf, sizeof(charbuf))) { goto err_out; } ONVIF_TRACE("VideoSourceToken: %s", charbuf); snprintf(vs_token, LEN_INFO, "%s", charbuf); continue; } if (TRUE == soap_match_tag(charbuf, "Speed")) { if (OK != soap_parse_element_value(xml_start, request_len, p, ch, charbuf, sizeof(charbuf)) || 0 != jso_add_string(json_seg, VELOCITY_STR, charbuf)) { goto err_out; } ONVIF_TRACE("Speed: %s", charbuf); } } if (0 != strcmp("raw_vs1", vs_token)) { soap->error = SOAP_FAULT; goto err_out; } jso_obj_add(json_sec, START_FOCUS_STR, json_seg); jso_obj_add(json_data, IMAGE_STR, json_sec); jso_add_string(json_data, DS_METHOD_STR, METHOD_DO_STR); *json_req = json_data; return OK; err_out: jso_free_obj(json_data); jso_free_obj(json_sec); jso_free_obj(json_seg); return ERROR; } LOCAL S32 timg_move_json_to_xml(SOAP_CONTEXT *soap, JSON_OBJPTR json_rsp) { if (soap == NULL) { ONVIF_WARN("soap == NULL."); return ERROR; } return soap_generate_xml((p_out_fun)(soap_out_timg_move_rsp), soap, NULL); } LOCAL S32 timg_stop_xml_to_json(SOAP_CONTEXT *soap, JSON_OBJPTR *json_req) { S32 request_len = 0; char *xml_start = NULL; char *xml_str = NULL; char **p = NULL; S32 ch = 0; char charbuf[LEN_INFO] = {0}; char vs_token[LEN_INFO] = {0}; JSON_OBJPTR json_data = NULL; JSON_OBJPTR json_sec = NULL; JSON_OBJPTR json_seg = NULL; if (soap == NULL || json_req == NULL) { ONVIF_WARN("soap == NULL."); return ERROR; } /* 判断是否支持ptzzoom,不支持直接返回 */ if (!is_ptz_support() || !is_ptz_3D_zoom_support()) { ONVIF_WARN("not support ptz or zoom."); return ERROR; } /* 需要鉴权 */ if (OK != soap_usernametoken_auth(soap, UM_OPERATOR)) { ONVIF_WARN("Auth failed"); soap_fault(soap, "SOAP-ENV:Sender", "ter:NotAuthorized", NULL, "Authority failure"); soap->error = 400; return ERROR; } /* 需要分析 timg:Move请求的具体内容 */ if (soap->request_begin != NULL && soap->request_end != NULL) { request_len = soap->request_end - soap->request_begin; if (request_len < 0) { ONVIF_TRACE("request_len < 0."); return ERROR; } xml_str = xml_start = soap->request_begin; p = (char **)&xml_str; } else { ONVIF_ERROR("soap request content is NULL."); return ERROR; } json_data = jso_new_obj(); json_sec = jso_new_obj(); json_seg = jso_new_obj(); if (NULL == json_data || NULL == json_sec || NULL == json_seg) { ONVIF_WARN("jso_new_obj error."); goto err_out; } while (((*p) - xml_start) < request_len) { if ((ch = soap_get_tag(xml_start, request_len, p, charbuf, sizeof(charbuf))) == EOF) { ONVIF_ERROR("soap_get_tag failed"); goto err_out; } if (charbuf[0] == '/') { continue; } if (TRUE == soap_match_tag(charbuf, "VideoSourceToken")) { if (OK != soap_parse_element_value(xml_start, request_len, p, ch, charbuf, sizeof(charbuf))) { goto err_out; } ONVIF_TRACE("VideoSourceToken: %s", charbuf); snprintf(vs_token, LEN_INFO, "%s", charbuf); break; } } if (0 != strcmp("raw_vs1", vs_token)) { soap->error = SOAP_FAULT; goto err_out; } jso_obj_add(json_sec, STOP_FOCUS_STR, json_seg); jso_obj_add(json_data, IMAGE_STR, json_sec); jso_add_string(json_data, DS_METHOD_STR, METHOD_DO_STR); *json_req = json_data; return OK; err_out: jso_free_obj(json_data); jso_free_obj(json_sec); jso_free_obj(json_seg); return ERROR; } LOCAL S32 timg_stop_json_to_xml(SOAP_CONTEXT *soap, JSON_OBJPTR json_rsp) { if (soap == NULL) { ONVIF_WARN("soap == NULL."); return ERROR; } return soap_generate_xml((p_out_fun)(soap_out_timg_stop_rsp), soap, NULL); } #endif void imaging_passthrough_init() { onvif_passthrough_handle_add(TIMG_GET_IMG_SETTINGS, timg_get_settings_xml_to_json, timg_get_settings_json_to_xml); onvif_passthrough_handle_add(TIMG_SET_IMG_SETTINGS, timg_set_imaging_xml_to_json, timg_set_imaging_json_to_xml); /* 调焦相关,目前不支持 */ #if 0 onvif_passthrough_handle_add(TIMG_MOVE, timg_move_xml_to_json, timg_move_json_to_xml); onvif_passthrough_handle_add(TIMG_STOP, timg_stop_xml_to_json, timg_stop_json_to_xml); #endif } /****************************************************************************** 模块流程: 系统初始化时调用imaging_passthrough_init,将本模块的处理函数注册到全局透传路由表。 当收到SOAP请求时,透传框架(onvif_serve_passthrough)会匹配请求标签(如timg:GetImagingSettings)。 匹配成功后,调用注册的xml_to_json函数(如timg_get_settings_xml_to_json)将SOAP请求转换为内部JSON请求。 调用onvif_passthrough函数(核心业务处理)执行JSON指令,得到JSON响应。 调用注册的json_to_xml函数(如timg_get_settings_json_to_xml)将JSON响应转换为SOAP响应。 将SOAP响应返回给客户端。 对外接口: 本模块对外提供的唯一接口是imaging_passthrough_init,它被系统初始化函数调用,用于注册本模块的处理函数。 ******************************************************************************/
最新发布
09-02
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

银狐游戏开发资源2

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值