浏览器切换接入点无法立即生效的问题

来源:互联网 发布:淘宝联盟抽成 编辑:程序博客网 时间:2024/05/08 15:09

 

问题:

S60系统中使用浏览器控件时,会遇到这样一个问题:当程序切换接入点时,浏览器控件不会立即使用新的接入点拨号。

问题分析:

引起上面问题的原因是重新设置接入点后,原来的链路没有断开。

问题解决:

1、 在切换接入点时,现将现有的浏览器控件对象销毁,重新创建新的对象,重新设置接入点,这样程序就会用新接入点拨号了。这种方式虽然能解决浏览器重新拨号的问题,但是会带来一个新的:在某些S60的版本中,程序中销毁然后重新创建浏览器对象会崩溃(这应该是symbian系统的一个bug),所以一般不采用这种方式。

2、 浏览器对象不需要销毁,但是切换接入点后,需要手动断开原来连接的链路。具体见下面代码:


CSpecialLoadObserver类成员变量如下:

TBool iIAPChange;             // 接入点切换标识

TBool iConnectFlag;           // 网路连接标识

TUint32 iSelectIAP;           // 接入点

RSocketServ iSocketServer;

RConnection iConnection;


// 初始化

void CSpecialLoadObserver::ConstructL()

{

    // 创建连接对象

   User::LeaveIfError(iSocketServer.Connect(KESockDefaultMessageSlots));

    User::LeaveIfError(iConnection.Open(iSocketServer, KConnectionTypeDefault));

}

 

CSpecialLoadObserver::~CSpecialLoadObserver()

{

 // 关闭连接

    iConnection.Close();

    iSocketServer.Close();

}

 

void CSpecialLoadObserver::SetIAPID(TUint32 iIAPID) 

{

if (iIAPID != iSelectIAP)

{

iSelectIAP = iIAPID;

iIAPChange = ETrue;

}

}



// 连接网络

void CSpecialLoadObserver::NetworkConnectionNeededL(TInt* aConnectionPtr,TInt* aSockSvrHandle, TBool*aNewConn,TApBearerType* aBearerType)

{

 *aBearerType = EApBearerTypeAllBearers;

   

 if (iIAPChange)

{

if (iConnectFlag)

       {

           // 先断开网络,此处是重新设置网络后,使用新接入点拨号的关键代码

          iConnection.Stop();

          iConnectFlag = EFalse;

       }

   

      // 建立网络连接

       TCommDbConnPref prefs;

       prefs.SetDialogPreference(ECommDbDialogPrefDoNotPrompt);

       prefs.SetDirection(ECommDbConnectionDirectionOutgoing);

       prefs.SetIapId(iSelectIAP);        //preferred IAP

       User::LeaveIfError(iConnection.Start(prefs));

       *aNewConn = ETrue;

       *aConnectionPtr = reinterpret_cast<TInt>(&iConnection);

       *aSockSvrHandle = iSocketServer.Handle();

      

      iConnectFlag = ETrue;

       iIAPChange = EFalse;

    }

    else

    {

       *aNewConn = EFalse;

    }

}

 

说明:CSpecialLoadObserverMBrCtlSpecialLoadObserver继承,在CSpecialLoadObserver中实现MBrCtlSpecialLoadObserver中的函数NetworkConnectionNeededL();在创建浏览器控件对象时,同时需要创建CSpecialLoadObserver observer对象,然后将observer设置到浏览器控件中,代码如下:


CSpecialLoadObserver observer = CSpecialLoadObserver::NewL();

if (observer != NULL)

{

       observer->SetIAPID(aIAPID);

}

   

// 创建浏览器控件

CBrCtlInterface* iBrCtlInterface = CreateBrowserControlL(this, iBrCtlRect, iBrCtlCapabilities, iCommandBase,

NULL, iLinkResolver, iSpecialLoadObserver, NULL, NULL);

 

 

原创粉丝点击