blob: 3cb2e5f37abfae43a0a80262ee608155e13fe10c [file] [log] [blame]
/* ------------------------------------------------------------------
* Copyright (C) 2008 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.
* -------------------------------------------------------------------
*/
/*!
** PV DNS server implementation
*/
#include "oscl_dns_tuneables.h"
#if (PV_DNS_SERVER)
#include "oscl_scheduler_ao.h"
#include "oscl_dns_imp_pv.h"
#include "oscl_socket_serv_imp.h"
#include "oscl_error.h"
#include "oscl_assert.h"
#include "oscl_dns_method.h"
#include "oscl_dns_param.h"
OsclDNSI::OsclDNSI(Oscl_DefAlloc &a) : OsclDNSIBase(a)
{
}
OsclDNSI::~OsclDNSI()
{
Close();
}
OsclDNSI* OsclDNSI::NewL(Oscl_DefAlloc &a)
{
OsclAny*p = a.ALLOCATE(sizeof(OsclDNSI));
OsclError::LeaveIfNull(p);
OsclDNSI *self = OSCL_PLACEMENT_NEW(p, OsclDNSI(a));
OsclError::LeaveIfNull(self);
return self;
}
int32 OsclDNSI::Close()
{
//nothing needed
return 0;
}
void OsclDNSI::GetHostByName(GetHostByNameParam &aParam, OsclDNSRequestAO &ao)
{
if (!IsReady(ao))
return;
iGetHostByNameRequest.Activate(&aParam, ao);
}
void OsclDNSI::GetHostByNameSuccess(GetHostByNameParam &aParam)
{
//Nothing needed.
OSCL_UNUSED_ARG(aParam);
}
void OsclDNSI::CancelGetHostByName()
{
iGetHostByNameRequest.CancelRequest();
}
int32 OsclDNSI::Open(OsclSocketServI& aServer)
{
iSocketServ = &aServer;
//nothing needed
return 0;
}
bool OsclDNSI::IsReady(OsclDNSRequestAO &ao)
//see if server is ready to handle dns requests.
{
//Make sure server is ok.
//Note: we only really need the server active
//for Symbian, but to make the DNS calling protocol
//consistent, require an active server on all
//platforms.
if (!iSocketServ)
{
//use the pv server err code
ao.iSocketError = PVSOCK_ERR_SOCK_NO_SERV;
ao.PendComplete(OSCL_REQUEST_ERR_GENERAL);
return false;
}
if (!iSocketServ->IsServConnected())
{
//report the error from the server, if any.
ao.iSocketError = iSocketServ->iServError;
//use the pv server err code
if (ao.iSocketError == 0)
ao.iSocketError = PVSOCK_ERR_SERV_NOT_CONNECTED;
ao.PendComplete(OSCL_REQUEST_ERR_GENERAL);
return false;
}
return true;
}
void OsclDNSI::ProcessDnsRequest(GetHostByNameParam* aParam, int32& aComplete, int32& aSockerr)
//called under server thread or AO.
//This routine must not access any object memory outside of aParam.
{
aComplete = OSCL_REQUEST_ERR_GENERAL;
aSockerr = 0;
#if defined(OsclGethostbyname) && defined(OsclGetDottedAddr)
//make the platform-specific gethostbyname call...
TOsclHostent *hostent;
bool ok;
int sockerr = 0;
//this call blocks
OsclGethostbyname(aParam->iName, hostent, ok, sockerr);
if (!ok)
{
aSockerr = sockerr;
}
else
{
//convert to dotted address notation
char *dottedaddr;
OsclGetDottedAddr(hostent, dottedaddr, ok);
if (ok)
{
aParam->iAddr->ipAddr.Set(dottedaddr);
aComplete = OSCL_REQUEST_ERR_NONE;
aSockerr = sockerr;
}
else
{
aSockerr = sockerr;
}
}
#endif
}
#endif //OS switch