blob: 70e507f1cb218fe6fb716b6757f6317d37d5ef98 [file] [log] [blame]
/* ------------------------------------------------------------------
* Copyright (C) 1998-2009 PacketVideo
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
* express or implied.
* See the License for the specific language governing permissions
* and limitations under the License.
* -------------------------------------------------------------------
*/
#include "osclconfig_io.h"
#include "oscl_scheduler_ao.h"
#include "oscl_dns_method.h"
#include "oscl_dns.h"
#include "oscl_socket_imp.h"
#include "oscl_dns_imp.h"
#define LOGINFOMED(m) PVLOGGER_LOGMSG(PVLOGMSG_INST_MLDBG,iLogger,PVLOGMSG_DEBUG,m);
static const char* const TPVDNSFxnStr[] =
{
"EPVDNSGetHostByName"
} ;
static const char* const TPVDNSEventStr[] =
{
"EPVDNSSuccess"
, "EPVDNSPending"
, "EPVDNSTimeout"
, "EPVDNSFailure"
, "EPVDNSCancel"
} ;
//////////// Request AO //////////////////////
void OsclDNSRequestAO::NewRequest()
{
PendForExec();
LOGINFOMED((0, "OsclSocket: New Request %s", TPVDNSFxnStr[iDNSMethod->iDNSFxn]));
}
void OsclDNSRequestAO::RequestDone()
{
iDNSMethod->Abort();
RemoveFromScheduler();
}
int OsclDNSRequestAO::GetSocketError()
{
#if PV_DNS_SERVER
//Errors from PV socket server are in
//iSocketError.
return iSocketError;
#else
#error No Implementation!
#endif
}
void OsclDNSRequestAO::DoCancel()
{
iDNSI->CancelFxn(iDNSMethod->iDNSFxn);
}
void OsclDNSRequestAO::Run()
{
//the request was completed.
RequestDone();
switch (Status())
{
case OSCL_REQUEST_ERR_NONE:
Success();
LOGINFOMED((0, "OsclSocket: %s %s", TPVDNSFxnStr[iDNSMethod->iDNSFxn], TPVDNSEventStr[EPVDNSSuccess]));
iDNSMethod->iDNSObserver->HandleDNSEvent(iDNSMethod->iId, iDNSMethod->iDNSFxn, EPVDNSSuccess, 0);
break;
case OSCL_REQUEST_ERR_CANCEL:
LOGINFOMED((0, "OsclSocket: %s %s", TPVDNSFxnStr[iDNSMethod->iDNSFxn], TPVDNSEventStr[EPVDNSCancel]));
iDNSMethod->iDNSObserver->HandleDNSEvent(iDNSMethod->iId, iDNSMethod->iDNSFxn, EPVDNSCancel, 0);
break;
default:
LOGINFOMED((0, "OsclSocket: %s %s %d", TPVDNSFxnStr[iDNSMethod->iDNSFxn], TPVDNSEventStr[EPVDNSCancel], GetSocketError()));
iDNSMethod->iDNSObserver->HandleDNSEvent(iDNSMethod->iId, iDNSMethod->iDNSFxn, EPVDNSFailure, GetSocketError());
break;
}
}
//////////// Method //////////////////////
void OsclDNSMethod::ConstructL(
OsclDNSObserver*aObserver,
OsclDNSRequestAO *aAO,
uint32 aId)
{
if (!aAO)
OsclError::Leave(OsclErrGeneral);
iDNSRequestAO = aAO;
iDNSObserver = aObserver;
iId = aId;
}
void OsclDNSMethod::Abort()
{
Cancel();
RemoveFromScheduler();
}
void OsclDNSMethod::AbortAll()
{
Abort();
if (iDNSRequestAO)
iDNSRequestAO->Abort();
}
bool OsclDNSMethod::StartMethod(int32 aTimeoutMsec)
{
//make sure there's not already a request
//in progress
if (IsAdded() || iDNSRequestAO->IsAdded())
return false;
AddToScheduler();
iDNSRequestAO->AddToScheduler();
//set the timeout
if (aTimeoutMsec > 0)
After(aTimeoutMsec*1000);
iDNSRequestAO->iSocketError = 0;
return true;
}
void OsclDNSMethod::MethodDone()
{
iDNSRequestAO->Abort();
RemoveFromScheduler();
}
void OsclDNSMethod::CancelMethod()
{
//cancel the timeout if any
Abort();
//cancel the request.
iDNSRequestAO->iDNSI->CancelFxn(iDNSFxn);
}
void OsclDNSMethod::Run()
{
//the request timed out!
MethodDone();
LOGINFOMED((0, "OsclSocket: %s %s", TPVDNSFxnStr[iDNSFxn], TPVDNSEventStr[EPVDNSTimeout]));
iDNSObserver->HandleDNSEvent(iId, iDNSFxn, EPVDNSTimeout, 0);
}