📄 hxsymbianapman.cpp
字号:
pInfo = m_pPreferredInfo;
if (pInfo)
{
res = HXR_OK;
}
DPRINTF(D_AP_MANAGER,
("HXSymbianAccessPointManager::GetPreferredAccessPointInfo() : %08x\n",
res));
return res;
}
/************************************************************************
* Method:
* IHXAccessPointManager::SetPreferredAccessPointInfo
* Purpose:
* Tells the access point manager about the access
* point we would like it to connect to.
*/
STDMETHODIMP
HXSymbianAccessPointManager::SetPreferredAccessPointInfo(THIS_ IHXValues* pInfo)
{
HX_RESULT res = HXR_FAILED;
ULONG32 ulAccessPointID = 0;
if (pInfo && (HXR_OK == pInfo->GetPropertyULONG32("ID", ulAccessPointID)))
{
HX_RELEASE(m_pPreferredInfo);
m_pPreferredInfo = pInfo;
m_pPreferredInfo->AddRef();
res = HXR_OK;
}
else
{
HX_RELEASE(m_pPreferredInfo);
}
return res;
}
/*
* IHXAccessPointSelectorResponse methods
*/
/************************************************************************
* Method:
* IHXAccessPointSelectorResponse::SelectAccessPointDone
* Purpose:
* Returns the selected access point info
*/
STDMETHODIMP
HXSymbianAccessPointManager::SelectAccessPointDone(THIS_ HX_RESULT status,
IHXValues* pInfo)
{
HX_RESULT res = HXR_UNEXPECTED;
if (m_bSelectAPPending)
{
m_bSelectAPPending = FALSE;
if ((HXR_OK == status) &&
(HXR_OK == SetPreferredAccessPointInfo(pInfo)))
{
status = DoConnect(0);
}
if (HXR_OK != status)
{
if (HXR_OUTOFMEMORY != status)
{
status = HXR_NET_CONNECT;
}
DispatchConnectDones(status);
}
res = HXR_OK;
}
return res;
}
void HXSymbianAccessPointManager::SetContext(IUnknown* pContext)
{
if (pContext)
{
pContext->QueryInterface(IID_IHXCommonClassFactory, (void**)&m_pCCF);
}
}
HX_RESULT
HXSymbianAccessPointManager::DoConnect(IHXAccessPointConnectResponse* pResp)
{
DPRINTF(D_AP_MANAGER, ("HXSymbianAccessPointManager::DoConnect(%p)\n",
pResp));
HX_RESULT res = HXR_FAILED;
ULONG32 ulActiveId = 0;
ULONG32 ulPreferredId = 0;
BOOL bQueueResponse = (pResp) ? TRUE : FALSE;
if (HXR_OK == GetPreferredID(ulPreferredId))
{
// We have a preferred access point set
if (HXR_OK != GetActiveID(ulActiveId))
{
// We don't have an active access point
if (apConnected == m_state)
{
// The access point disconnected without
// our knowledge. Update our state.
m_state = apIdle;
}
// Start to connect
res = StartConnection();
}
else if (ulActiveId == ulPreferredId)
{
// We have a preferred access point and we are connected
// to it.
// Dispatch the callbacks now.
if (pResp)
{
pResp->ConnectDone(HXR_OK);
bQueueResponse = FALSE;
}
if (apIdle == m_state)
{
m_state = apConnected;
// Dispatch any other pending callbacks
DispatchConnectDones(HXR_OK);
}
res = HXR_OK;
}
else
{
// We need to disconnect from the current access
// point
res = StartDisconnect();
}
}
else
{
// We don't have a preferred access point
if (m_pAPSelector)
{
if (!m_bSelectAPPending)
{
// Use the Selector to get the preferred access point
m_bSelectAPPending = TRUE;
res = m_pAPSelector->SelectAccessPoint(this);
if (HXR_OK != res)
{
m_bSelectAPPending = FALSE;
}
}
else
{
// A SelectAccessPoint() request is currently
// pending
res = HXR_OK;
}
}
else
{
// We have no way to get access point information.
res = HXR_NET_CONNECT;
}
}
if ((HXR_OK == res) && bQueueResponse)
{
pResp->AddRef();
m_respList.AddTail(pResp);
}
return res;
}
HX_RESULT HXSymbianAccessPointManager::StartConnection()
{
DPRINTF(D_AP_MANAGER, ("HXSymbianAccessPointManager::StartConnection()\n"));
HX_RESULT res = HXR_UNEXPECTED;
BOOL bConnect = TRUE;
if (apIdle == m_state)
{
m_ulRetryCount = DefaultNumOfRetries;
}
else if (apConnecting != m_state)
{
bConnect = FALSE;
}
if (bConnect && m_pPreferredInfo)
{
ULONG32 ulAccessPointID = 0;
res = m_pPreferredInfo->GetPropertyULONG32("ID", ulAccessPointID);
if (HXR_OK == res)
{
res = m_pConnector->Connect(ulAccessPointID);
if (HXR_OK == res)
{
m_state = apConnecting;
}
}
}
DPRINTF(D_AP_MANAGER,
("HXSymbianAccessPointManager::StartConnection() : res %08x\n",
res));
return res;
}
void HXSymbianAccessPointManager::ConnectDone(HX_RESULT status)
{
DPRINTF(D_AP_MANAGER,
("HXSymbianAccessPointManager::ConnectDone(%08x)\n",
status));
HX_ASSERT(apConnecting == m_state);
BOOL bReportStatus = TRUE;
if (HXR_OK == status)
{
m_state = apConnected;
}
else if (m_ulRetryCount)
{
// Sometimes the first connect fails if we
// disconnect from an access point and then
// connect to a different one. This is a
// documented Symbian bug.
// Try to connect again
m_ulRetryCount--;
status = StartConnection();
if (HXR_OK == status)
{
bReportStatus = FALSE;
}
}
else
{
// Connect and all retries failed.
// Transition back to the idle state
m_state = apIdle;
}
if (bReportStatus)
{
DispatchConnectDones(status);
}
}
HX_RESULT HXSymbianAccessPointManager::StartDisconnect()
{
DPRINTF(D_AP_MANAGER, ("HXSymbianAccessPointManager::StartDisconnect()\n"));
HX_RESULT res = HXR_FAILED;
if (HXR_OK == m_pConnector->Disconnect())
{
m_state = apDisconnecting;
res = HXR_OK;
}
DPRINTF(D_AP_MANAGER,
("HXSymbianAccessPointManager::StartDisconnect() : res %08x\n",
res));
return res;
}
void HXSymbianAccessPointManager::DisconnectDone(HX_RESULT status)
{
DPRINTF(D_AP_MANAGER,
("HXSymbianAccessPointManager::DisconnectDone(%08x)\n",
status));
HX_ASSERT(apDisconnecting == m_state);
m_state = apIdle;
if (HXR_OK == status)
{
// Try to connect now
status = DoConnect(0);
}
if (HXR_OK != status)
{
// We failed to reconnect. Send the
// failure code to the response objects
DispatchConnectDones(status);
}
}
void HXSymbianAccessPointManager::DispatchConnectDones(HX_RESULT status)
{
DPRINTF(D_AP_MANAGER,
("HXSymbianAccessPointManager::DispatchConnectDones(%08x)\n",
status));
// Handle any pending connect requests
while(!m_respList.IsEmpty())
{
IHXAccessPointConnectResponse* pResp =
(IHXAccessPointConnectResponse*)m_respList.RemoveHead();
pResp->ConnectDone(status);
HX_RELEASE(pResp);
}
}
HX_RESULT HXSymbianAccessPointManager::GetPreferredID(REF(ULONG32) ulID)
{
HX_RESULT res = HXR_FAILED;
if (m_pPreferredInfo)
{
res = m_pPreferredInfo->GetPropertyULONG32("ID", ulID);
}
return res;
}
HX_RESULT HXSymbianAccessPointManager::GetActiveID(REF(ULONG32) ulID)
{
HX_RESULT res = HXR_FAILED;
TUint32 aIAPId = 0;
if (m_pConnInit && (KErrNone == m_pConnInit->GetActiveIap(aIAPId)))
{
ulID = aIAPId;
res = HXR_OK;
}
return res;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -