📄 dnsresolverengine.cpp
字号:
/*
* ============================================================================
* Name : CDnsResolverEngine from DnsResolverEngine.cpp
* Part of : UdpSocket
* Created : 31.01.2006 by ToBeReplacedByAuthor
* Implementation notes:
*
* Version :
* Copyright: ToBeReplacedByCopyright
* ============================================================================
*/
// INCLUDE FILES
#include "DnsResolverEngine.h"
// CONSTANTS
const TInt KTimeout = 10; // seocnds
// ================= MEMBER FUNCTIONS =======================
// Two-phased constructor.
CDnsResolverEngine* CDnsResolverEngine::NewL(MObserver& aObserver)
{
CDnsResolverEngine* self = new (ELeave) CDnsResolverEngine( aObserver );
CleanupStack::PushL( self );
self->ConstructL();
CleanupStack::Pop();
return self;
}
// destructor
CDnsResolverEngine::~CDnsResolverEngine()
{
Cancel();
delete iTimer;
iHostResolver.Close();
iSocketServ.Close();
}
void CDnsResolverEngine::GetHostName()
{
Cancel();
iTimer->Start(KTimeout);
iState = EStateGettingHostName;
iHostResolver.GetHostName(iHostName, iStatus);
SetActive();
}
// New functions
void CDnsResolverEngine::GetByName(const THostName& aHostName)
{
Cancel();
iTimer->Start(KTimeout);
iState = EStateGettingByName;
iHostName.Copy(aHostName);
iHostResolver.GetByName(iHostName, iNameEntry, iStatus);
SetActive();
}
void CDnsResolverEngine::GetByAddressL(const TDesC& aAddr)
{
Cancel();
iTimer->Start(KTimeout);
iState = EStateGettingByAddress;
User::LeaveIfError(iInetAddr.Input(aAddr));
iHostResolver.GetByAddress(iInetAddr, iNameEntry, iStatus);
SetActive();
}
// Functions from CDnsResolverTimer::MObserver
void CDnsResolverEngine::OnTimerL(TInt aError)
{
Cancel();
TInt err = (aError==KErrNone)? KErrTimedOut:aError;
iObserver.OnResolvedL(KNullDesC(), err);
}
// Functions from CActive
void CDnsResolverEngine::DoCancel()
{
if(iTimer!=NULL)
{
iTimer->Cancel();
}
iState = EStateIdle;
iHostResolver.Cancel();
}
void CDnsResolverEngine::RunL()
{
iTimer->Cancel();
TInt err = iStatus.Int();
switch(iState)
{
case EStateGettingHostName:
{
iObserver.OnResolvedL(iHostName, err);
break;
}
case EStateGettingByName:
{
if(err==KErrNone)
{
TNameRecord& nr = iNameEntry();
iInetAddr.Copy(nr.iAddr);
TBuf<15> ip;
iInetAddr.Output(ip);
iObserver.OnResolvedL(ip, err);
}
else
{
iObserver.OnResolvedL(KNullDesC(), err);
}
break;
}
case EStateGettingByAddress:
{
if(err==KErrNone)
{
TNameRecord& nr = iNameEntry();
iObserver.OnResolvedL(nr.iName, err);
}
else
{
iObserver.OnResolvedL(KNullDesC(), err);
}
break;
}
default:
{
// should be unreachable
}
}
iState = EStateIdle;
}
// constructor
CDnsResolverEngine::CDnsResolverEngine(MObserver& aObserver)
: CActive(CActive::EPriorityStandard), iObserver(aObserver)
{
CActiveScheduler::Add(this);
}
// EPOC default constructor can leave.
void CDnsResolverEngine::ConstructL()
{
// Open a session to Socket Server
User::LeaveIfError(iSocketServ.Connect());
// Open a host resolver
User::LeaveIfError(iHostResolver.Open(iSocketServ, KAfInet, KProtocolInetUdp));
// Create a timeout timer
iTimer = CDnsResolverTimer::NewL(*this);
}
// End of File
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -