hxsymbianapman.cpp
上传用户:dangjiwu
上传日期:2013-07-19
资源大小:42019k
文件大小:18k
源码类别:

Symbian

开发平台:

Visual C++

  1. /* ***** BEGIN LICENSE BLOCK *****
  2.  * Source last modified: $Id: hxsymbianapman.cpp,v 1.2.2.2 2004/07/09 02:08:48 hubbe Exp $
  3.  * 
  4.  * Portions Copyright (c) 1995-2004 RealNetworks, Inc. All Rights Reserved.
  5.  * 
  6.  * The contents of this file, and the files included with this file,
  7.  * are subject to the current version of the RealNetworks Public
  8.  * Source License (the "RPSL") available at
  9.  * http://www.helixcommunity.org/content/rpsl unless you have licensed
  10.  * the file under the current version of the RealNetworks Community
  11.  * Source License (the "RCSL") available at
  12.  * http://www.helixcommunity.org/content/rcsl, in which case the RCSL
  13.  * will apply. You may also obtain the license terms directly from
  14.  * RealNetworks.  You may not use this file except in compliance with
  15.  * the RPSL or, if you have a valid RCSL with RealNetworks applicable
  16.  * to this file, the RCSL.  Please see the applicable RPSL or RCSL for
  17.  * the rights, obligations and limitations governing use of the
  18.  * contents of the file.
  19.  * 
  20.  * Alternatively, the contents of this file may be used under the
  21.  * terms of the GNU General Public License Version 2 or later (the
  22.  * "GPL") in which case the provisions of the GPL are applicable
  23.  * instead of those above. If you wish to allow use of your version of
  24.  * this file only under the terms of the GPL, and not to allow others
  25.  * to use your version of this file under the terms of either the RPSL
  26.  * or RCSL, indicate your decision by deleting the provisions above
  27.  * and replace them with the notice and other provisions required by
  28.  * the GPL. If you do not delete the provisions above, a recipient may
  29.  * use your version of this file under the terms of any one of the
  30.  * RPSL, the RCSL or the GPL.
  31.  * 
  32.  * This file is part of the Helix DNA Technology. RealNetworks is the
  33.  * developer of the Original Code and owns the copyrights in the
  34.  * portions it created.
  35.  * 
  36.  * This file, and the files included with this file, is distributed
  37.  * and made available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY
  38.  * KIND, EITHER EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS
  39.  * ALL SUCH WARRANTIES, INCLUDING WITHOUT LIMITATION, ANY WARRANTIES
  40.  * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, QUIET
  41.  * ENJOYMENT OR NON-INFRINGEMENT.
  42.  * 
  43.  * Technology Compatibility Kit Test Suite(s) Location:
  44.  *    http://www.helixcommunity.org/content/tck
  45.  * 
  46.  * Contributor(s):
  47.  * 
  48.  * ***** END LICENSE BLOCK ***** */
  49. #include "platform/symbian/hxsymbianapman.h"
  50. #include "ihxpckts.h"
  51. #include "debug.h"
  52. #define D_AP_MANAGER 0x20000000
  53. const UINT32 DefaultNumOfRetries = 1; /* Number of connect retries before
  54.        * reporting the error. The retry
  55.        * mechanism is needed because switching
  56.        * access points can cause the first
  57.        * connect to fail. This is a documented
  58.        * Symbian bug.
  59.        */
  60. class HXSymbianAPManAO : public CActive
  61. {
  62. public:
  63.     HXSymbianAPManAO(HXSymbianAccessPointManager* pParent,
  64.      CIntConnectionInitiator* pConnInit);
  65.     ~HXSymbianAPManAO();
  66.     HX_RESULT Connect(UINT32 ulAccessPointId);
  67.     HX_RESULT Disconnect();
  68.     void RunL();
  69.     void DoCancel();
  70. private:
  71.     HXSymbianAccessPointManager* m_pParent;
  72.     CIntConnectionInitiator* m_pConnInit;
  73.     CCommsDbConnectionPrefTableView::TCommDbIapConnectionPref m_connPref;
  74.     BOOL m_bConnecting;
  75. };
  76. HXSymbianAPManAO::HXSymbianAPManAO(HXSymbianAccessPointManager* pParent,
  77.    CIntConnectionInitiator* pConnInit) :
  78.     CActive(EPriorityStandard),
  79.     m_pParent(pParent),
  80.     m_pConnInit(pConnInit),
  81.     m_bConnecting(FALSE)
  82. {
  83.     CActiveScheduler::Add(this);
  84. }
  85. HXSymbianAPManAO::~HXSymbianAPManAO()
  86. {
  87.     if (IsActive())
  88.     {
  89. Cancel();
  90.     }
  91.     
  92.     m_pParent = 0;
  93.     m_pConnInit = 0;
  94. }
  95. HX_RESULT HXSymbianAPManAO::Connect(UINT32 ulAccessPointId)
  96. {
  97.     HX_RESULT res = HXR_UNEXPECTED;
  98.     if (m_pConnInit && !IsActive())
  99.     {
  100. TInt theErr = KErrNone;
  101. m_bConnecting = TRUE;
  102. iStatus = KRequestPending;
  103. m_connPref.iRanking = 1; // Means always try this pref
  104. m_connPref.iDirection = ECommDbConnectionDirectionOutgoing;
  105. m_connPref.iDialogPref = ECommDbDialogPrefDoNotPrompt;
  106. m_connPref.iBearer.iBearerSet = (ECommDbBearerGPRS | ECommDbBearerCSD);
  107. m_connPref.iBearer.iIapId = ulAccessPointId;
  108. TRAP(theErr, m_pConnInit->ConnectL(m_connPref, iStatus));
  109. if (KErrNone == theErr)
  110. {
  111.     SetActive();
  112.     res = HXR_OK;
  113. }
  114. else
  115. {
  116.     res = HXR_NET_CONNECT;
  117. }
  118.     }
  119.     return res;
  120. }
  121. HX_RESULT HXSymbianAPManAO::Disconnect()
  122. {
  123.     HX_RESULT res = HXR_FAILED;
  124.     if (m_pConnInit && !IsActive())
  125.     {
  126. m_bConnecting = FALSE;
  127. iStatus = KRequestPending;
  128. if (KErrNone == m_pConnInit->TerminateActiveConnection(iStatus))
  129. {
  130.     SetActive();
  131.     res = HXR_OK;
  132. }
  133.     }
  134.     return res;
  135. }
  136. void HXSymbianAPManAO::RunL()
  137. {
  138.     if (m_pParent)
  139.     {
  140. HX_RESULT status = HXR_NET_CONNECT;
  141. if (m_bConnecting)
  142. {
  143.     if ((iStatus == KErrNone) ||
  144. (iStatus == KConnectionPref1Exists) ||
  145. (iStatus == KConnectionExists) ||
  146. (iStatus == KConnectionPref1Created) ||
  147. (iStatus == KConnectionCreated) ||
  148. (iStatus == KErrOutstandingRequest))
  149.     {
  150. status = HXR_OK;
  151.     }
  152.     m_pParent->ConnectDone(status);
  153. }
  154. else 
  155. {
  156.     if ((iStatus == KErrNone) ||
  157. (iStatus == KConnectionTerminated) ||
  158. (iStatus == KErrOutstandingRequest))
  159.     {
  160. status = HXR_OK;
  161.     }
  162.     m_pParent->DisconnectDone(status);
  163. }
  164.     }
  165. }
  166. void HXSymbianAPManAO::DoCancel()
  167. {
  168.     // Cancel possible outstanding request 
  169.     if(m_pConnInit && m_pConnInit->IsActive())
  170.     {
  171.         m_pConnInit->Cancel();
  172.     }
  173. }
  174. BEGIN_INTERFACE_LIST(HXSymbianAccessPointManager)
  175.     INTERFACE_LIST_ENTRY_SIMPLE(IHXAccessPointManager)
  176.     INTERFACE_LIST_ENTRY_SIMPLE(IHXAccessPointSelectorResponse)
  177. END_INTERFACE_LIST
  178. HXSymbianAccessPointManager::HXSymbianAccessPointManager():
  179.     m_state(apError),
  180.     m_pConnInit(0),
  181.     m_pConnector(0),
  182.     m_pPreferredInfo(NULL),
  183.     m_pCCF(NULL),
  184.     m_pAPSelector(NULL),
  185.     m_bSelectAPPending(FALSE)
  186. {
  187. #ifdef _DEBUG
  188.     debug_level() |= D_AP_MANAGER;
  189. #endif /* _DEBUG */
  190.     DPRINTF(D_AP_MANAGER, ("HXSymbianAccessPointManager::HXSymbianAccessPointManager()n"));
  191.     TRAPD(theErr, m_pConnInit = CIntConnectionInitiator::NewL());
  192.     m_pConnector = new HXSymbianAPManAO(this, m_pConnInit);
  193.     if (m_pConnInit && m_pConnector &&
  194. (KErrNone == m_sockServ.Connect()) &&
  195. (KErrNone == theErr))
  196.     {
  197. m_state = apIdle;
  198.     }
  199. }
  200. HXSymbianAccessPointManager::~HXSymbianAccessPointManager()
  201. {
  202.     DPRINTF(D_AP_MANAGER, ("HXSymbianAccessPointManager::~HXSymbianAccessPointManager()n"));
  203.     HX_DELETE(m_pConnector);
  204.     HX_DELETE(m_pConnInit);
  205.     HX_RELEASE(m_pPreferredInfo);
  206.     HX_RELEASE(m_pCCF);
  207.     HX_RELEASE(m_pAPSelector);
  208.     m_sockServ.Close();
  209.     DispatchConnectDones(HXR_FAILED);
  210. }
  211. /*
  212.  * IHXAccessPointManager methods
  213.  */
  214. /************************************************************************
  215.  * Method:
  216.  *     IHXAccessPointManager::Connect
  217.  * Purpose:
  218.  *     Notifies the access point manager that an object wants the access
  219.  *      point to connect to it's ISP.
  220.  *
  221.  */
  222. STDMETHODIMP
  223. HXSymbianAccessPointManager::Connect(THIS_ IHXAccessPointConnectResponse* pResp)
  224. {
  225.     DPRINTF(D_AP_MANAGER, ("HXSymbianAccessPointManager::Connect()n")); 
  226.     HX_RESULT res = HXR_FAILED;
  227.     if (pResp)
  228.     {
  229. res = DoConnect(pResp);
  230.     }
  231.     
  232.     return res;
  233. }
  234. /************************************************************************
  235.  * Method:
  236.  *     IHXAccessPointManager::RegisterSelector
  237.  * Purpose:
  238.  *      Provides the IHXAccessPointManager with an IHXAccessPointSelector 
  239.  *      to use when it needs information about the desired access point.
  240.  *
  241.  */
  242. STDMETHODIMP 
  243. HXSymbianAccessPointManager::RegisterSelector(THIS_ IHXAccessPointSelector* pSelector)
  244. {
  245.     HX_RESULT res = HXR_FAILED;
  246.     // Currently we only support 1 registered selector so
  247.     // we only allow this call to succeed if m_pAPSelector
  248.     // is not set.
  249.     if (pSelector && !m_pAPSelector)
  250.     {
  251. m_pAPSelector = pSelector;
  252. m_pAPSelector->AddRef();
  253. res = HXR_OK;
  254.     }
  255.     return res;
  256. }
  257.     
  258. /************************************************************************
  259.  * Method:
  260.  *     IHXAccessPointManager::UnregisterSelector
  261.  * Purpose:
  262.  *      Unregisters a previously registered IHXAccessPointSelector
  263.  *
  264.  */
  265. STDMETHODIMP
  266. HXSymbianAccessPointManager::UnregisterSelector(THIS_ IHXAccessPointSelector* pSelector) 
  267. {
  268.     HX_RESULT res = HXR_FAILED;
  269.     // We only allow one registered selector so this call
  270.     // will only succeed if the pSelector is a valid pointer
  271.     // and matches the selector that was registered.
  272.     if (pSelector && (pSelector == m_pAPSelector))
  273.     {
  274. HX_RELEASE(m_pAPSelector);
  275.     }
  276.     return res;
  277. }
  278.     
  279. /************************************************************************
  280.  * Method:
  281.  *     IHXAccessPointManager::GetActiveAccessPointInfo
  282.  * Purpose:
  283.  *      Returns information about the access point we are currently 
  284.  *      connected to. This function returns an error if we are 
  285.  *      not connected to an access point.
  286.  *
  287.  */
  288. STDMETHODIMP
  289. HXSymbianAccessPointManager::GetActiveAccessPointInfo(THIS_ REF(IHXValues*) pInfo)
  290. {
  291.     HX_RESULT res = HXR_UNEXPECTED;
  292.     pInfo = NULL;
  293.     if (m_pCCF)
  294.     {
  295. ULONG32 ulActiveID = 0;
  296. res = GetActiveID(ulActiveID);
  297. if (HXR_OK == res)
  298. {
  299.     res = m_pCCF->CreateInstance(CLSID_IHXValues, (void**)&pInfo);
  300.     
  301.     if (HXR_OK == res)
  302.     {
  303. res = pInfo->SetPropertyULONG32("ID", ulActiveID);
  304. if (HXR_OK != res)
  305. {
  306.     HX_RELEASE(pInfo);
  307. }
  308.     }
  309. }
  310.     }
  311.     DPRINTF(D_AP_MANAGER, 
  312.     ("HXSymbianAccessPointManager::GetActiveAccessPointInfo() : %08xn",
  313.      res));
  314.     
  315.     return res;
  316. }
  317. /************************************************************************
  318.  * Method:
  319.  *     IHXAccessPointManager::GetPreferredAccessPointInfo
  320.  * Purpose:
  321.  *      Returns information about the access point we want to connect to.
  322.  */
  323. STDMETHODIMP
  324. HXSymbianAccessPointManager::GetPreferredAccessPointInfo(THIS_ REF(IHXValues*) pInfo)
  325. {
  326.     HX_RESULT res = HXR_FAILED;
  327.     pInfo = m_pPreferredInfo;
  328.     if (pInfo)
  329.     {
  330. res = HXR_OK;
  331.     }
  332.     DPRINTF(D_AP_MANAGER, 
  333.     ("HXSymbianAccessPointManager::GetPreferredAccessPointInfo() : %08xn",
  334.      res));
  335.     return res;
  336. }
  337. /************************************************************************
  338.  * Method:
  339.  *     IHXAccessPointManager::SetPreferredAccessPointInfo
  340.  * Purpose:
  341.  *      Tells the access point manager about the access 
  342.  *      point we would like it to connect to.
  343.  */
  344. STDMETHODIMP
  345. HXSymbianAccessPointManager::SetPreferredAccessPointInfo(THIS_ IHXValues* pInfo)
  346. {
  347.     HX_RESULT res = HXR_FAILED;
  348.     ULONG32 ulAccessPointID = 0;
  349.     if (pInfo && (HXR_OK == pInfo->GetPropertyULONG32("ID", ulAccessPointID)))
  350.     {
  351. HX_RELEASE(m_pPreferredInfo);
  352. m_pPreferredInfo = pInfo;
  353. m_pPreferredInfo->AddRef();
  354. res = HXR_OK;
  355.     }
  356.     else
  357.     {
  358. HX_RELEASE(m_pPreferredInfo);
  359.     }
  360.     return res;
  361. }
  362. /*
  363.  * IHXAccessPointSelectorResponse methods
  364.  */
  365. /************************************************************************
  366.  * Method:
  367.  *     IHXAccessPointSelectorResponse::SelectAccessPointDone
  368.  * Purpose:
  369.  *      Returns the selected access point info
  370.  */
  371. STDMETHODIMP
  372. HXSymbianAccessPointManager::SelectAccessPointDone(THIS_ HX_RESULT status, 
  373.    IHXValues* pInfo)
  374. {
  375.     HX_RESULT res = HXR_UNEXPECTED;
  376.     if (m_bSelectAPPending)
  377.     {
  378. m_bSelectAPPending = FALSE;
  379. if ((HXR_OK == status) &&
  380.     (HXR_OK == SetPreferredAccessPointInfo(pInfo)))
  381. {
  382.     status = DoConnect(0);
  383. }
  384. if (HXR_OK != status)
  385. {
  386.     if (HXR_OUTOFMEMORY != status)
  387.     {
  388. status = HXR_NET_CONNECT;
  389.     }
  390.     DispatchConnectDones(status);
  391. }
  392. res = HXR_OK;
  393.     }
  394.     return res;
  395. }
  396. void HXSymbianAccessPointManager::SetContext(IUnknown* pContext)
  397. {
  398.     if (pContext)
  399.     {
  400. pContext->QueryInterface(IID_IHXCommonClassFactory, (void**)&m_pCCF);
  401.     }
  402. }
  403. HX_RESULT 
  404. HXSymbianAccessPointManager::DoConnect(IHXAccessPointConnectResponse* pResp)
  405. {
  406.     DPRINTF(D_AP_MANAGER, ("HXSymbianAccessPointManager::DoConnect(%p)n", 
  407.    pResp));
  408.     HX_RESULT res = HXR_FAILED;
  409.     ULONG32 ulActiveId = 0;
  410.     ULONG32 ulPreferredId = 0;
  411.     BOOL bQueueResponse = (pResp) ? TRUE : FALSE;
  412.     if (HXR_OK == GetPreferredID(ulPreferredId))
  413.     {
  414. // We have a preferred access point set
  415. if (HXR_OK != GetActiveID(ulActiveId))
  416. {
  417.     // We don't have an active access point
  418.     if (apConnected == m_state)
  419.     {
  420. // The access point disconnected without
  421. // our knowledge. Update our state.
  422. m_state = apIdle;
  423.     }
  424.     // Start to connect
  425.     res = StartConnection();
  426. }
  427. else if (ulActiveId == ulPreferredId)
  428. {
  429.     // We have a preferred access point and we are connected
  430.     // to it.
  431.     // Dispatch the callbacks now.
  432.     if (pResp)
  433.     {
  434. pResp->ConnectDone(HXR_OK);
  435. bQueueResponse = FALSE;
  436.     }
  437.     if (apIdle == m_state)
  438.     {
  439. m_state = apConnected;
  440. // Dispatch any other pending callbacks
  441. DispatchConnectDones(HXR_OK);
  442.     }
  443.     
  444.     res = HXR_OK;
  445. }
  446. else
  447. {
  448.     // We need to disconnect from the current access
  449.     // point
  450.     
  451.     res = StartDisconnect();
  452. }
  453.     }
  454.     else
  455.     {
  456. // We don't have a preferred access point
  457. if (m_pAPSelector)
  458. {
  459.     if (!m_bSelectAPPending)
  460.     {
  461. // Use the Selector to get the preferred access point
  462. m_bSelectAPPending = TRUE;
  463. res = m_pAPSelector->SelectAccessPoint(this);
  464. if (HXR_OK != res)
  465. {
  466.     m_bSelectAPPending = FALSE;
  467. }
  468.     }
  469.     else
  470.     {
  471. // A SelectAccessPoint() request is currently
  472. // pending
  473. res = HXR_OK;
  474.     }
  475. }
  476. else
  477. {
  478.     // We have no way to get access point information.
  479.     res = HXR_NET_CONNECT;
  480. }
  481.     }
  482.     if ((HXR_OK == res) && bQueueResponse)
  483.     {
  484. pResp->AddRef();
  485. m_respList.AddTail(pResp);
  486.     }
  487.     return res;
  488. }
  489. HX_RESULT HXSymbianAccessPointManager::StartConnection()
  490. {
  491.     DPRINTF(D_AP_MANAGER, ("HXSymbianAccessPointManager::StartConnection()n"));
  492.     HX_RESULT res = HXR_UNEXPECTED;
  493.     BOOL bConnect = TRUE;
  494.     if (apIdle == m_state)
  495.     {
  496. m_ulRetryCount = DefaultNumOfRetries;
  497.     }
  498.     else if (apConnecting != m_state)
  499.     {
  500. bConnect = FALSE;
  501.     }
  502.     if (bConnect && m_pPreferredInfo)
  503.     {
  504. ULONG32 ulAccessPointID = 0;
  505. res = m_pPreferredInfo->GetPropertyULONG32("ID", ulAccessPointID);
  506. if (HXR_OK == res)
  507. {
  508.     res = m_pConnector->Connect(ulAccessPointID);
  509.     if (HXR_OK == res)
  510.     {
  511. m_state = apConnecting;
  512.     }
  513. }
  514.     }
  515.     DPRINTF(D_AP_MANAGER, 
  516.     ("HXSymbianAccessPointManager::StartConnection() : res %08xn",
  517.      res));
  518.     return res;
  519. }
  520. void HXSymbianAccessPointManager::ConnectDone(HX_RESULT status)
  521. {
  522.     DPRINTF(D_AP_MANAGER, 
  523.     ("HXSymbianAccessPointManager::ConnectDone(%08x)n",
  524.      status));
  525.     HX_ASSERT(apConnecting == m_state);
  526.     BOOL bReportStatus = TRUE;
  527.     if (HXR_OK == status)
  528.     {
  529. m_state = apConnected;
  530.     }
  531.     else if (m_ulRetryCount)
  532.     {
  533. // Sometimes the first connect fails if we
  534. // disconnect from an access point and then
  535. // connect to a different one. This is a
  536. // documented Symbian bug.
  537. // Try to connect again
  538. m_ulRetryCount--;
  539. status = StartConnection();
  540. if (HXR_OK == status)
  541. {
  542.     bReportStatus = FALSE;
  543. }
  544.     }
  545.     else
  546.     {
  547. // Connect and all retries failed.
  548. // Transition back to the idle state
  549. m_state = apIdle;
  550.     }
  551.     if (bReportStatus)
  552.     {
  553. DispatchConnectDones(status);
  554.     }
  555. }
  556. HX_RESULT HXSymbianAccessPointManager::StartDisconnect()
  557. {
  558.     DPRINTF(D_AP_MANAGER, ("HXSymbianAccessPointManager::StartDisconnect()n"));
  559.     HX_RESULT res = HXR_FAILED;
  560.     
  561.     if (HXR_OK == m_pConnector->Disconnect())
  562.     {
  563. m_state = apDisconnecting;
  564. res = HXR_OK;
  565.     }
  566.     DPRINTF(D_AP_MANAGER, 
  567.     ("HXSymbianAccessPointManager::StartDisconnect() : res %08xn",
  568.      res));
  569.     return res;
  570. }
  571. void HXSymbianAccessPointManager::DisconnectDone(HX_RESULT status)
  572. {
  573.     DPRINTF(D_AP_MANAGER, 
  574.     ("HXSymbianAccessPointManager::DisconnectDone(%08x)n",
  575.      status));
  576.     HX_ASSERT(apDisconnecting == m_state);
  577.     m_state = apIdle;
  578.     if (HXR_OK == status)
  579.     {
  580. // Try to connect now
  581. status = DoConnect(0);
  582.     }
  583.     
  584.     if (HXR_OK != status)
  585.     {
  586. // We failed to reconnect. Send the
  587. // failure code to the response objects
  588. DispatchConnectDones(status);
  589.     }
  590. }
  591. void HXSymbianAccessPointManager::DispatchConnectDones(HX_RESULT status)
  592. {
  593.     DPRINTF(D_AP_MANAGER, 
  594.     ("HXSymbianAccessPointManager::DispatchConnectDones(%08x)n",
  595.      status));
  596.     // Handle any pending connect requests
  597.     while(!m_respList.IsEmpty())
  598.     {
  599. IHXAccessPointConnectResponse* pResp = 
  600.     (IHXAccessPointConnectResponse*)m_respList.RemoveHead();
  601. pResp->ConnectDone(status);
  602. HX_RELEASE(pResp);
  603.     }
  604. }
  605. HX_RESULT HXSymbianAccessPointManager::GetPreferredID(REF(ULONG32) ulID)
  606. {
  607.     HX_RESULT res = HXR_FAILED;
  608.     if (m_pPreferredInfo)
  609.     {
  610. res = m_pPreferredInfo->GetPropertyULONG32("ID", ulID);
  611.     }
  612.     return res;
  613. }
  614. HX_RESULT HXSymbianAccessPointManager::GetActiveID(REF(ULONG32) ulID)
  615. {
  616.     HX_RESULT res = HXR_FAILED;
  617.     TUint32 aIAPId = 0;
  618.     if (m_pConnInit && (KErrNone == m_pConnInit->GetActiveIap(aIAPId)))
  619.     {
  620. ulID = aIAPId;
  621. res = HXR_OK;
  622.     }
  623.     return res;
  624. }