RConnection 的基類是RSubSessionBase。目前我所知道的就是兩個功能:一、為套接字在SymbianOS上使用建立會話通道,二、使用已建立的會話通道
第一種應(yīng)用是為了屏蔽接入點(IAP)選擇對話框,具體代碼如下
TInt currentProfileId;
// Check whether we are offline or online
iRepository->Get(KProEngActiveProfile, currentProfileId);
if (currentProfileId == 5)
{
// Close and uninitialize
iConnection.Close();
iSocketServ.Close();
}
//這里的iSelectedIap是已經(jīng)選擇好的接入點iap
if(iSelectedIap == 0)
return;
User::LeaveIfError(iSocketServ.Connect());
User::LeaveIfError(iConnection.Open(iSocketServ));
TCommDbConnPref pref;
// IAP ID for connection to be used
pref.SetIapId(iSelectedIap);
//CEikonEnv::Static()->InfoWinL(_L("note:"), _L("Iap OK"));
pref.SetDialogPreference( ECommDbDialogPrefDoNotPrompt);
pref.SetDirection(ECommDbConnectionDirectionOutgoing );
//CEikonEnv::Static()->InfoWinL(_L("note:"), _L("Pref Ok"));
iConnection.Start(pref,iStatus);
SetActive();
由以上代碼可知,建立會話通道是一個異步函數(shù),所以最好在活動對象中使用,因為目前該代碼只是在G網(wǎng)上親測過,在3G和WLAN是否也通用暫時還不敢肯定。
第二種應(yīng)用往往用在復(fù)用通道上,比方說同一個程序有多個線程(或者使用C/S架構(gòu)的程序,不同的進程乃至兩個完全無關(guān)的)需要使用網(wǎng)絡(luò),沒必要每個線程都去建立一個會話通道,所以就采用復(fù)用的方式;還有一種復(fù)用的要求就是用RConnection來獲得當前鏈接的流量等數(shù)據(jù),以下就給出這么一種應(yīng)用的代碼:
TUint vUl = 0;
TUint vDl = 0;
TPckg< TUint > UplinkVolume(vUl);
TPckg< TUint > DownlinkVolume(vDl);
TRequestStatus aStatus;
RConnection vConnection;
if(vConnection.Open(iSocketServ) == KErrNone)
{
TPckgBuf<TConnectionInfo> connInfo;
TUint count;
if (vConnection.EnumerateConnections(count) == KErrNone)
{
for (TUint i=1; i<=count; i++)
{
// Note: GetConnectionInfo expects 1-based index.
if (vConnection.GetConnectionInfo(i, connInfo) == KErrNone)
{
TInt vErr = vConnection.Attach(connInfo, RConnection::EAttachTypeNormal);
}
}
}
}
vConnection.DataTransferredRequest(UplinkVolume, DownlinkVolume, aStatus);
User::WaitForRequest(aStatus);
TFileName vBuffergg,vBuffergg2;
vBuffergg.AppendNum(vDl);
iObserver.RComValuesL(EGetConnectId,_L("KDownlinkData"),vBuffergg,0);
vBuffergg2.AppendNum(vUl);
iObserver.RComValuesL(EGetConnectId,_L("KUplinkData"),vBuffergg2,0);
vConnection.Close();
代碼往往都是很簡單的,但是往往會有點問題,在這個獲取流量的方法上,起初我們使用單線程可以用,但是后來居然不能用了,百思不得其解,后來經(jīng)過分析存在后面的一些問題,先得出一個結(jié)論,RConnection可以跨線程乃至進程使用
注意點
TConnectionInfoV2獲取的coninfo不能進行attach,否則會爆-34錯誤,如果同一個RConnection對象已經(jīng)連接上了,再繼續(xù)使用attach,則會報-14錯誤,但是RConnection對象仍然是可以正常使用的,可以通過它創(chuàng)建Socket和監(jiān)控流量等。
在使用TPckg的時候尤其要注意類型的配對問題,因為上面代碼中用到的是局部變量,很顯然如下代碼不會有誤
TUint vUl = 0;
TUint vDl = 0;
TPckg< TUint > UplinkVolume(vUl);
TPckg< TUint > DownlinkVolume(vDl);
但是一次當我將vUl和vDl聲明成類的成員變量時,弄成如下方式
TUint32 iUl = 0;
TUint32 iDl = 0;
再將其用TPckg進行封裝之后,傳入DataTransferredRequest函數(shù),得到的流量始終是0,真的讓我百思不得其解,這種失誤教訓真的太深刻。
另外,近來發(fā)現(xiàn)RConnection類的實例對象是不能夠進行跨線程調(diào)用,同樣的CRepository的實例對象跨線程調(diào)用也是不允許的。
posted on 2009-08-12 17:37
frank.sunny 閱讀(2496)
評論(0) 編輯 收藏 引用 所屬分類:
symbian 開發(fā)