GoDB内嵌HTML

原始的页面里面已经有一个内嵌HTML的例子了,那就是维护支持页面。下图是稍微修改后的页面...请自行脑补。

这里使用的是上一节所说的gdo containter的方法。

打开maintenance.frm文件,该文件包括了一个gdo控件,名字叫做gdoMaintenance,查看该frm文件的Source

<GDO UID="1"
Name="gdoMaintenance"
X="334"
Y="70"
W="800"
H="442"
ProgId="Shell.Explorer.2"
Left="0"
Top="0"
Width="800"
Height="442"
Visible="-1"
StatusBar="-1"
StatusText="-1"
ToolBar="1"
MenuBar="-1"
FullScreen="0"
Offline="0"
Silent="0"
RegisterAsBrowser="0"
RegisterAsDropTarget="-1"
TheaterMode="0"
AddressBar="-1"
Resizable="-1"
Scrollable="0"
/>

这里最主要的是ProgId="Shell.Explorer.2"一项,这里代表该gdo加载一个Shell Explorer,也就是内嵌IE。所以我们添加的话可以复制以上代码到其它的frm文件上,然后修改部分参数,比如说名字,位置,宽高等,然后就可以直接拿来用了。

图形添加的话:

然后我们再来看看maintenance.bas文件。

Sub Form_Load
dims temp_ver$
call displayControls(LabelName$,XPos,YPos,Wdh,height) #gdomaintenance.h = #gdomaintenance.h*~factorY -20
#gdomaintenance.w = #imgmainbg.w - 30
#lblnote.h = 47 * ~factorY assignSelectedImage("imgmenu[3]")
setfocus("imgmenu[3]")
showSubMenu(0,0)
#cmdback.hidden = 1
temp_ver$ = dwnldFile$(".ver_info");
split(version_info$,temp_ver$,"\n") '*** Code modified by karthi on 6-Dec-10 as per the CR dated on 3-Dec-10
if bkupfirmware = 1 then
#gdomaintenance.navigate$(~camAddPath$+"\MaintK_en.htm?bkup=1") 'CR-02
else
#gdomaintenance.navigate$(~camAddPath$+"\MaintK_en.htm?kver="+version_info$(1)+"&fsver="+version_info$(2))
endif
setfocus("lblnote")
End Sub

#gdomaintenance.navigate$(~camAddPath$+"\MaintK_en.htm?kver="+version_info$(1)+"&fsver="+version_info$(2))

MainK.htm文件在相应目录下可发现。

仔细观察maintenance.bas文件,我们可以发现,其中的按钮处理还是由gBasic来搞定,其实我们可以完全脱离gBasic来处理表单。

我们在这一节提到如何添加关键字,你会发现非常麻烦,如果我们使用内嵌HTML来实现那些表单将大大减少工作量。

这样能减少网页这一端的工作量,而boa和system_server那一端还是按照原来那样去做。

我们可以使用cgic库做一个表单和处理表单的程序,交叉编译,然后同样使用navigate方式来指向这个cgi程序所在的url。比如说192.168.1.160/xx.cgi

CGIC功能简介

CGIC是一个支持CGI开发的开放源码的标准C库,可以免费使用,只需要在开发的站点和程序文档中有个公开声明即可,表明程序使用了CGIC库,用户也可以购买商业授权而无需公开声明。

CGIC能够提供以下功能:

  1. 分析数据,并自动校正一些有缺陷的浏览器发来的数据;
  2. 接收以GET和POST两种方式发送的数据;
  3. 能接受上传文件;
  4. 能够设置和接收cookies;
  5. 用一致的方式处理From元素里的回车;
  6. 提供字符串,整数,浮点数,单选或多选功能来接收数据;
  7. 提供数字字段的边界检查;
  8. 能够将CGI环境变量转化成C中的非空字符串;
  9. 提供CGI程序的调试手段,能够回放CGI程序执行时的CGI状态;

CGIC是一个功能比较强大的支持CGI开发的标准C库,并支持Linux, Unix 和Windows等多操作系统。

这是官网:cgic,里面有相关api的说明。

获取最新源代码的方式;

git clone https://github.com/boutell/cgic

拖下来之后进入cgic文件夹有如下文件:

capture.c  cgic.h     cgictest.c   Makefile    support.txt
cgic.c cgic.html license.txt readme.txt

上面的代码拖下来之后自带了测试的例子:cgictest.cgicapture

编译:

make

移植CGIC

  1. 修改makefile
SUBDIRS=addclass showclass gLogon update_firmware
CFLAGS=-g -Wall
CC=${BUILD_TOOL_PREFIX}gcc
AR=${BUILD_TOOL_PREFIX}ar
RANLIB=${BUILD_TOOL_PREFIX}ranlib DEBUGSUBDIRS = $(addsuffix .debug, $(SUBDIRS))
CLEANSUBDIRS = $(addsuffix .clean, $(SUBDIRS))
INSTALLSUBDIRS = $(addsuffix .install, $(SUBDIRS)) .PHONY: $(SUBDIRS) $(DEBUGSUBDIRS) $(INSTALLSUBDIRS) \
$(CLEANSUBDIRS) all: libcgic.a cgictest.cgi capture $(SUBDIRS) $(SUBDIRS):libcgic.a
@echo
@echo Making all in subdirectory $@...
@$(MAKE) -C $@ $(DEBUGSUBDIRS):
@echo
@echo Executing make debug in subdirectory $(basename $@)...
@cd $(basename $@) ; $(MAKE) debug

主要是添加了BUILD_TOOL_PREFIX这个编译器后缀...还有相应的子文件夹,各个子文件夹将会使用cgic.h和链接libcgic.a库文件..

使用CGIC的思路

从cgic.c的代码可以看出,它定义了main函数,而在cgictest.c中定义了一个cgiMain函数。也就是说,对于使用CGIC编写的 CGI程序,都是从cgic.c中的代码进入,在库函数完成了一系列必要的操作(比如解析参数、获取系统环境变量)之后,它才会调用你的代码(从你定义的 cgiMain进入)

另外一点就是,cgi程序输出HTML页面的方式都是使用printf把页面一行一行地打印出来,比如cgictest.c中的这一段代码。

fprintf(cgiOut, "<textarea NAME=\"address\" ROWS=4 COLS=40>\n");

其实我们还是可以直接使用printf,但是我们还是推荐使用这种做法,因为在调试的时候会用到fprintf来重定向输出,CGI 调试起来比较麻烦,CGIC提供了一个函数可以将环境变量输入到文件,方便调试:

#define SAVED_ENVIRONMENT "/tmp/cgicsave.env"
cgiWriteEnvironment(SAVED_ENVIRONMENT);

调试的另外一种做法就是fprintf写到stderr中,这样在/var/log/boa/error_log会记录这些打印...

CGIC之GET和POST

获取Get请求字符串.

Get请求就是我们在浏览器地址栏输入URL时发送请求的方式,或者我们在HTML中定义一个表单(form)时,把action属性设为“Get”时的工作方式;

在进入我们自己编写的cgi代码之前,CGIC库已经事先把这个字符串取到了,我们可以在程序中直接获得,要做的仅仅是在你编写的cgiMain方法前面加入以下声明:

extern char *cgiQueryString;

我们在浏览器执行执行url时多加入?xxxx这样就能查看GET的字符了...

当form执行post操作时,我们的程序通过下面的函数来得到form中各个变量的值,这个函数的第一个参数:是form的名字,第二个和第三个存储变量值的buf相关.

cgiFormString("name", name, 241);
cgiFormStringNoNewlines     //用来去掉换行符(如果用户是在一个TextArea里输入字符的话);
cgiFormStringSpaceNeeded //用于测试输入值的长度,可以以此为依据,然后按需精确分配缓冲区。

cgic之表单处理

  1. 按钮处理

下面代码检测html表单中按钮按下动作,该函数的唯一参数name对应html该按钮的name值

//函数原型
//cgiFormResultType cgiFormSubmitClicked( char *name)
if ( cgiFormSubmitClicked("rfs") == cgiFormSuccess ) /*跟新内核*/
{
//... }
//从指定域中获取整数值,比如说下拉菜单...
cgiFormResultType cgiFormInteger( char *name, int *result, int defaultV) ;

system_server进程之外进程获取SysInfo结构体的方法

网页上所有设置都保存到一个SysInfo的结构体上,而这个结构体有保存到syscfg.cfg文件上,现在我们需要设计另外几个进程,我们应该怎样和其它进程通信呢?

  //头文件必须至少包括这三个
#include <sys_env_type.h>
#include <file_msg_drv.h>
#include <File_Msg_Def.h>
//....
//这是初始化必须先执行,另外关键的是FILE_SC_MSG另外定义,一个进程定义一个。
if (InitFileMsgDrv(FILE_MSG_KEY, FILE_SC_MSG) < 0) {
exit(1);
}
//通过共享存储获取这个结构体...
SysInfo *pSysInfo = GetSysInfo();
if ( pSysInfo == NULL )
{
exit(1);
}
//写配置到syscfg文件..在file_msg_drv.h中定义..
ret = fSet_channel_id(3);
if ( ret != 0 )
{
exit(1);
}

编译链接时必须将三个头文件所在路径告诉编译器;必须将Aprro interface的静态库链接进去;具体做法是:

IPNC_INTERFACE_DIR:=/home/tracyone/work/dm8127/Source/ipnc_rdk/ipnc_app/interface/
APP_LIB_DIR:=${IPNC_INTERFACE_DIR}/lib/
APP_INC_DIR:=${IPNC_INTERFACE_DIR}/inc/
INCULDES:=-I${APP_INC_DIR}
LIBS := $(APP_LIB_DIR)/msg_util.a $(APP_LIB_DIR)/Appro_interface.a \
$(APP_LIB_DIR)/file_msg_drv.a $(APP_LIB_DIR)/sysctrl.a \
$(APP_LIB_DIR)/sys_msg_drv.a

总结

这样我们就可以脱离恶心的gBasic语言,使用html和c语言来处理表单了,这样有更多的灵活性。

GoDB图片相关的修改

总共两种,

其中Internal Jpegs必须是jpeg编码的图片文件。而GoDB Images则可以为其它格式的图片,然后GoDB自动将其转化为bitmap格式,后缀自动变成.bin,这也就是为啥你在leftMenu.frm中看到的图片的SRC属性都是.bin而实际上在GoDB Images则是.png格式的。

!settings_Off.bin

如果是Internal Jpegs我们则直接!display.jpg

查看Image控件的SRC属性

This attribute lets you specify the filename of the image.

To specify local images use a ! at the beginning of the file Name.

GoDB Converts images to to GoDB Bitmap format doing the build process.

When an image is dragged dropped onto a form in the IDE the SRC

Extension automatically gets changed to .bin.

You need to enable compression (in IDE) for large images to conserve space.

External images should be in the images folder in the current working

directory.

Platforms that support PNG/JPG Image (WIN 32) rendering in the native OS can render external PNG and JPG images. Png usually requires gImgDLL.DLL or a linux so.

背景颜色修改

请修改global.css文件。

里面的关于颜色的表达非常奇怪。可以在gStudi中的帮助搜索css

COLORNAME=#24bit COLOR in Hex (Similar to the HTML Color).
TXTFLD_SEL_COL=#8080FF

字体相关

修改字体请看gStudio的帮助中lesson9

控件修改成中文字体之后,你会发现有些控件变化了,比如checkboxradio的形状变小了,其实这些控件在原有工程也是通过图片来显示的,当你修改这些控件的字体之后,他们找不到对应的图片所以只显示末默认的图标(非常难看)

具体请查看gStudio中的Styles帮助。

Custom Icons in GoDB一小节中:

Color Icons can also be added into the BDB and should be named CIC[FONT][ASCII CharCode].bin

所以你会发现在Images文件夹下有不少CIC开头的文件,只不过原始的字体是西文字体,改成中文之后就识别不出来了,所以你要修改这些png文件的名字..

TI IPNC Web网页之进阶修改的更多相关文章

  1. TI IPNC Web网页之流程分析

    流程 Appro IPNC使用的web服务器是boa. 请仔细理解下面这段话. boa这个web服务器是GUI界面和IPNC应用程序之间的通信的桥梁.它的责任是从web GUI中接收HTTP请求,并且 ...

  2. Ti IPNC Web网页之ActiveX控件

    Ti IPNC Web网页之ActiveX控件 本篇介绍关于TI IPNC网页中播放器相关的东西. gStudio工程中添加播放器并控制播放器 打开IPNC网页时首先会自动下载ActiveX控件并安装 ...

  3. TI IPNC Web网页之网页修改教程

    web网页程序修改 打开gStudio之后,点击菜单栏中Help->Contents.先把这个诡异的编程语言看一遍吧.这里搬一些东西出来. GoDB简介 从第一副图片中,我们可以看出,从源文件到 ...

  4. TI IPNC Web网页之GoDB开发环境

    介绍 下面介绍DM8127/DM385 IPNC RDK中网页制作相关的东东. 具体来说,各位获得这个RDK包时有以下文件: IPNC_RDK_DM812x_DM385_Version3.5.0.ta ...

  5. web网页中使用vlc插件播放相机rtsp流视频

    可参考: 使用vlc播放器做rtsp服务器 使用vlc播放器播放rtsp视频 使用vlc进行二次开发做自己的播放器 vlc功能还是很强大的,有很多的现成的二次开发接口,不需配置太多即可轻松做客户端播放 ...

  6. web网页练习

    一. HTML部分 1. XHTML和HTML有什么区别 HTML是一种基本的WEB网页设计语言,XHTML是一个基于XML的置标语言最主要的不同: XHTML 元素必须被正确地嵌套. XHTML 元 ...

  7. C#开发BIMFACE系列50 Web网页中使用jQuery加载模型与图纸

    BIMFACE二次开发系列目录     [已更新最新开发文章,点击查看详细] 在前一篇博客<C#开发BIMFACE系列49 Web网页集成BIMFACE应用的技术方案>中介绍了目前市场主流 ...

  8. WEB网页插件 如何实现 选择上传图片路径 【高级问题】

    发表于 2010-10-22 12:11 | |只看楼主       按键精灵程序里面的WEB网页插件 如何实现 选择上传图片路径 我想在上传图片的选框设置图片路径为 C:\fakepath\001. ...

  9. JS实现Web网页打印功能(IE)

    问题描述:     JS实现Web网页打印功能 问题解决:     这里主要使用WebBrowser控件的ExeWB在IE中打印功能的实现 WebBrowser介绍:         WebBrows ...

随机推荐

  1. windows下mysql安装失败的一个解决案例

    操作系统:windows8.1,之前安装过mysql,这次安装在配置的最后一部执行“Apply security settings”的过程中弹出经典错误: Access denied for user ...

  2. myeclipse自动生成相应对象接收返回值的快捷键

    在你要自动生成返回值对象的那一行的末尾(注意一定要将光标点到最后),按Alt+Shift+L:就可以了.

  3. 使用selenium前学习HTML(3)——元素

    <!-- HTML 元素指的是从开始标签(start tag)到结束标签(end tag)的所有代码. 注释:开始标签常被称为开放标签(opening tag),结束标签常称为闭合标签(clos ...

  4. JS正则表达式从入门到入土(9)—— test方法以及它的那些坑

    test方法 test方法介绍 RegExp.prototype.test(str) test方法用于测试字符串参数中是否存在匹配正则表达式模式的字符串 test方法的使用 let reg = /\w ...

  5. [日志]logback告警

    开发过程中,难免会有发生错误或异常的时候,有些是需要及时通知到相关开发人员的.logback可以通过简单的配置达到邮件告警的目的. 一.错误告警 如下配置,所有Error级别的log发送邮件告警给re ...

  6. 【c++ primer, 5e】返回类型和return语句

    [无返回值函数] 1.在c++的void函数中,可以显式地使用return;语句来提前结束函数的调用. [有返回值函数] 1.值是如何被返回的:返回一个值的方式和初始化一个变量或者形参的方式完全一样. ...

  7. Spring使用事务

    Spring使用事务,一共有4个步骤 1.配置数据源 例如: <bean id="dataSource" class="com.mchange.v2.c3p0.Co ...

  8. [BZOJ1912]巡逻

    Description Input 第一行包含两个整数 n, K(1 ≤ K ≤ 2).接下来 n – 1行,每行两个整数 a, b, 表示村庄a与b之间有一条道路(1 ≤ a, b ≤ n). Ou ...

  9. [转][修]利用matlab绘制地图上的点、线、面

    一.绘制点 %生成背景地图地图   h = worldmap('France'); %读取和显示大陆架   landareas = shaperead('landareas.shp','UseGeoC ...

  10. RMQ问题 - ST表的简单应用

    2017-08-26 22:25:57 writer:pprp 题意很简单,给你一串数字,问你给定区间中最大值减去给定区间中的最小值是多少? 用ST表即可实现 一开始无脑套模板,找了最大值,找了最小值 ...