继续刚才的,现在来看具体代码,先是ConnectL的实现:
void CWebEngine::ConnectL()
{
CSenXmlServiceDescription* pattern = CSenXmlServiceDescription::NewLC();
pattern->SetFrameworkIdL(KDefaultBasicWebServicesFrameworkID);
pattern->SetEndPointL(KWSEndPoint);
delete iConnection;
iConnection = NULL;
iConnection = CSenServiceConnection::NewL(*this, *pattern);
CleanupStack::PopAndDestroy(pattern);
}
这里注意一点与那个AddressBook例子不同的是我们声明了不同框架类型是KDefaultBasicWebServicesFrameworkID,并且这样只需要提供EndPoint而不需要Contract了。KWSEndPoint的值是在CPP前声明了:_LIT8(KWSEndPoint,"http://192.168.0.201/uim/PService.asmx");
CSenServiceConnection::NewL的两个参数,一是自己(即MSenServiceConsumer)负责处理回调,二是一个CSenXmlServiceDescription负责参数配置。
在回调SetStatus中我只是简单地打印出状态值。
再看那个SayHello的实现吧,在这个函数中要负责封装SOAP消息包,这时我才遇到了使用Symbian的WebServiceAPI烦人的问题:原来这个SOAP包要自己封装啊!同样SOAP的结果也要自己去解析!!
void CWebEngine::SayHello()
{
if(iConnectionState==1){
//send
CSenSoapEnvelope *env = CSenSoapEnvelope::NewL();
CleanupStack::PushL(env);
env->SetSoapActionL(KWSContract);
env->BodyL().AddElementL(KWSNamespace,KWSHelloworld);
iConnection->SendL(*env);
CleanupStack::PopAndDestroy(env);
}
}
好在HelloWorld不需要参数,所以这个SOAP请求还算简单,注意这个SetSoapActionL函数它的KWSContract就是那个"urn:pservice:helloworld" (见上篇中的SOAP请求描述)。因为CSenSoapEnvelope同样派生于CSenBaseFragment,所以它的Body也可以增加下级节点,上面的代码很好理解。
一旦调用了iConnection->SendL以后,手机会弹出选择接入点,说明这里开始连接网络了,得到结果后,我们回调HandleMessageL中处理结果。
void CWebEngine::HandleMessageL(const TDesC8& aMessage)
{
RDebug::Printf("===================HandleMessageL");
LOG_ALL(aMessage);
SetReader(*iXmlReader);
ParseL(aMessage);
}
这里我们将得到的结果(完整的SOAP响应的XML内容)交给iXmlReader去解析,于是此时又会涉及到另两个回调StartElement和EndElement。注意这里补充一下iXmlReader的初始化在WebEngine的ConstructL中完成:
void CWebEngine::ConstructL()
{
LOG_OPEN();
CSenBaseFragment::BaseConstructL(KQueryResponseLocalName);
iXmlReader = CSenXmlReader::NewL();
}
两句话:一是因为自己是派生于CSenBaseFragment,所以先调用BaseConstructL构造一下自己是一个HelloWorldResponse标签的XML节点。二是构造出iXmlReader实例。
下面继续说解析XML的回调处理:
void CWebEngine::StartElementL(const TDesC8& aNsUri, const TDesC8& aLocalName, const TDesC8& aQName, const Xml::RAttributeArray& aAttrs)
{
RDebug::Printf("================StartElement");
_LIT(KFmt,"StartElement (%s)");
LOG_FORMAT((KFmt,aLocalName));
if(aLocalName==KQueryResponseLocalName){
delegate = CHelloWorldResult::NewL(aNsUri,aLocalName,aQName);
CleanupStack::PushL(delegate);
DelegateParsingL(*delegate);
CleanupStack::Pop(delegate);
}
}
void CWebEngine::EndElementL(const TDesC8& aNsUri, const TDesC8& aLocalName, const TDesC8& aQName)
{
RDebug::Printf("==================EndElement");
_LIT(KFmt,"EndElement (%s)");
LOG_FORMAT((KFmt,aLocalName));
CSenBaseFragment::EndElementL(aNsUri, aLocalName, aQName);
}
这个EndElement没啥好说的,就是调一下老子的EndElement罢了。倒是那个StartElement函数它在遇到HelloWorldResponse标签时会交给delegate去处理下级节点,就是说<HelloWorldResponse>以下的XML内容由CHelloWorldResult类的负责处理了。
分享到:
相关推荐
Sun官方提供的纯Java的SIP开发包(JAIN-SIP-API-1.2.jar) 提供黑莓(Blackberry),塞班(Symbian)等移动平台的SIP开发。
本学习笔记旨在为初学者提供全面、细致的Symbian操作系统知识,帮助你快速入门并深入理解其工作原理。 一、Symbian系统概述 Symbian操作系统最初由英国的EPOC公司开发,后被诺基亚收购并成为其主要的操作系统平台。...
这些学习笔记涵盖了Symbian开发的多个关键方面,包括调试、基础概念、应用框架、图形用户界面(GUI)开发、多线程处理、定时器、系统集成以及网络通信。 1. **Debug On Device**: 在设备上进行调试是开发过程中的...
《Symbian OS End-to-End HTTP API 示例详解》 Symbian OS 是一款历史悠久的移动操作系统,曾经广泛应用于诺基亚等手机厂商的高端设备上。...通过实践与学习,可以有效提升Symbian OS上的网络编程能力。
使用案例部分详细介绍了移动客户端和Web UI之间的交互,包括任务加载、任务完成、密码更改、任务添加、删除、修改以及发送短信等操作。每个案例都包含了交互图和关键类的描述,有助于开发人员理解不同场景下的数据流...
【Symbian学习笔记概述】 Symbian操作系统是一款曾经广泛应用于智能手机的操作系统,尤其在诺基亚手机上占据主导地位。对于想要学习Symbian开发的初学者来说,理解其开发环境的搭建至关重要。本系列笔记共28讲,...
《Symbian OS End-to-End HTTP API 示例详解》 ...通过学习这个例子,开发者不仅可以提升在网络编程方面的技能,还能更好地适应Symbian OS的编程环境。无论是对于 Series 60 还是 Series 80 的应用开发,都能从中受益。
塞班论坛是一个专门为塞班(Symbian)操作系统用户提供交流平台的社区,其中涉及了大量的技术讨论和资源分享。本文将详细介绍“塞班证书签名程序”的相关知识点,以及如何使用DOSPY签名工具v2.2.9.0627.exe来给SIS或...
- **官方文档**: Symbian SDK 中通常会包含许多示例代码,这些示例可以帮助开发者理解如何使用特定的功能或 API。 - **在线资源**: 除了 SDK 包含的示例外,还可以通过访问 Nokia Developer Community 等网站获取更...
7. **Javadoc文档**:压缩包中的"doc"文件夹包含了完整的Nokia UI API 1.3 Javadoc,它是学习和使用API的重要参考资料。Javadoc提供了每个类、方法和接口的详细描述,包括参数、返回值、异常以及使用示例,极大地...
《基于塞班平台的Small-Water游戏设计与实现》是一个典型的毕业设计项目,它涉及到的是在塞班(Symbian)操作系统上开发游戏的过程。塞班系统曾是智能手机市场的主流平台,尤其在功能手机时代,它拥有广泛的用户基础...
首先,我们要明确的是,塞班系统(Symbian)是早期智能手机广泛采用的操作系统,尤其在诺基亚手机中非常流行。Java作为一种跨平台的编程语言,为塞班平台提供了丰富的开发环境,使得开发者可以利用Java ME(Java ...
**塞班60 PYTHON API** 是一个专为Symbian操作系统设计的Python环境,简化了应用程序开发流程,并为Symbian C++ API提供了一种脚本解决方案。此文档主要介绍的是基于Python 2.2.2版本的Python for S60平台1.3.13版本...
**Symbian操作系统详解** Symbian是一款历史悠久的智能手机操作系统,尤其在2000年至2010年间,它是全球领先的移动设备...通过深入学习和实践,开发者可以从Symbian中学到很多关于移动平台优化和资源管理的宝贵经验。
- **连接建立**:在使用端口API建立连接之前,蓝牙设备必须先与合适的设备建立连接,这通常通过SDP协议完成。 #### 五、服务搜索(SDP) SDP协议分为两大部分: 1. **搜索可用的设备和服务**:在有效范围内搜索...
pys60 是一个 Python 的移植版本,专为塞班(Symbian)操作系统设计,使得开发者能够使用 Python 语言在智能手机上创建应用程序。 Python API 在这里指的是 pys60 的 API 文档或库,这可能包括类、函数、模块和接口...
本示例利用了Jquery-UI实现Web桌面系统jWebOS,左侧菜单和桌面菜单的链接都是动态设置。整体效果非常棒。大家可以用于自己的网站建设。 建议开发童鞋使用跨平台开发工具——统一开发环境UDE来进行查看、调试、开发...