×
Namespaces

Variants
Actions

Archived:如何通过Browser Control API复制下载管理器的连接方式

From Nokia Developer Wiki
Jump to: navigation, search
Article Metadata

代码示例
兼容于
平台: S60 3rd Edition FP1
Symbian
S60 3rd Edition FP1

文章
翻译:
hoolee
最后由 hamishwillee 在 27 Aug 2012 编辑
  • 详细描述

当我们从browser control应用程序开启下载时,下载管理服务器将会开始工作,并生成一个连接,在客户端进程(BrCtlSampleApp)打开它。


当请求完成后,下载管理器试图使用CHttpConnHandler::ConnectL()中的当前连接从网络层获得回调。

// This will try to clone the opened connection
User::LeaveIfError(iConnection.Open(iClient->Engine()->SocketServ(), connName));

但在下载管理服务器进程中复制已存在的连接时却会发生失败,并返回-46(KErrPermissionDenied)错误,没有任何回调。但可以通过使用StartL启动下载。

如果从程序中恢复下载,那么下载管理器将会使用现存的连接再次进行尝试,最终还是会失败。因为没有监控回调,因此防止暂停的下载重新恢复。

  • 解决方案

简而言之,这里的解决方案将重写代码以便正确复制系在管理服务进程的连接方式。

首先需要将提供进程(在复制前打开连接)以便编辑链接为可复制。否则另一个进程(接收端)将无法复制这个连接。这里提供者为BrCtlSampleApp,而接收者为下载管理服务器。

这样如果提供者(BrCtlSampleApp)提供当前连接的复制,那么下载管理服务器进程就会成功的打开/复制这个连接,并获得网络层的回调。其下的HTTP请求就可以完成,并获得正确的数据包。在恢复后也一样。

提供者程序可以通过使用RConnection::Control以限制复制连接

 // Enable connection cloning  
LIT_SECURITY_POLICY_C2(KProcPolicy1,
ECapabilityNetworkServices,
ECapabilityNetworkControl);
TSecurityPolicyBuf secPolBuf;
secPolBuf().Set(KProcPolicy1().Package());
iConnection.Control(KCOLConnection, KCoEnableCloneOpen, secPolBuf);


注意,在平台安全性方面,任何程序都能复制,并使用这个连接。一个进程只要知道连接表示名(可通过RConnection::Name获得)即可复制连接。

但是平台安全需要提供者主动去表示某个链接为可复制,否则其他进程接收程序无法进行复制。

此外通过简单的标记一个连接,提供者可以致命接收者需要的能力。

更多相关信息,可以参考该实例File:BrCtlSampleApp.zip

This page was last modified on 27 August 2012, at 06:41.
71 page views in the last 30 days.
×