blob: f2d6ba57b74145ceb3b5a1fb8fb71eb6fe4a2452 [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 "oscl_scheduler_ao.h"
#include "oscl_socket_accept.h"
//////////// Method /////////////////////
OsclAcceptMethod *OsclAcceptMethod::NewL(OsclIPSocketI& c)
{
OsclAny*p = c.Alloc().ALLOCATE(sizeof(OsclAcceptMethod));
OsclError::LeaveIfNull(p);
OsclAcceptMethod* self = OSCL_PLACEMENT_NEW(p, OsclAcceptMethod(c));
OsclError::LeaveIfNull(self);
OsclError::PushL(self);
self->ConstructL();
OsclError::Pop();
return self;
}
void OsclAcceptMethod::ConstructL()
{
OsclAny*p = iContainer.Alloc().ALLOCATE(sizeof(OsclAcceptRequest));
OsclError::LeaveIfNull(p);
OsclAcceptRequest* self = OSCL_PLACEMENT_NEW(p, OsclAcceptRequest(*this));
OsclError::LeaveIfNull(self);
OsclError::PushL(self);
self->ConstructL();
OsclError::Pop();
iSocketRequestAO = self;
OsclSocketMethod::ConstructL(iSocketRequestAO);
}
OsclAcceptMethod::~OsclAcceptMethod()
{
if (AcceptRequest())
{
AcceptRequest()->~OsclAcceptRequest();
Alloc().deallocate(AcceptRequest());
}
DiscardAcceptedSocket();
}
TPVSocketEvent OsclAcceptMethod::Accept(int32 aTimeout)
{
//in case previous accepted socket was never
//retrieved...
DiscardAcceptedSocket();
iAcceptedSocket = OsclSocketI::NewL(Alloc());
if (iAcceptedSocket->Open(*SocketServ()) != OsclErrNone)
{
DiscardAcceptedSocket();
return EPVSocketFailure;
}
if (!StartMethod(aTimeout))
{
DiscardAcceptedSocket();
return EPVSocketFailure;
}
AcceptRequest()->Accept(*iAcceptedSocket);
return EPVSocketPending;
}
void OsclAcceptMethod::DiscardAcceptedSocket()
{
if (iAcceptedSocket)
{
iAcceptedSocket->~OsclSocketI();
Alloc().deallocate(iAcceptedSocket);
}
iAcceptedSocket = NULL;
}
OsclSocketI *OsclAcceptMethod::GetAcceptedSocket()
{
if (iAcceptedSocket)
{
//Clear accepted socket once it has been retrieved.
OsclSocketI *sock = iAcceptedSocket;
iAcceptedSocket = NULL;
return sock;
}
else
return NULL;
}
void OsclAcceptMethod::Run()
{
//The request timed out!
//must discard accepted socket in addition
//to the usual timeout Run
DiscardAcceptedSocket();
//call the base class Run
OsclSocketMethod::Run();
}
//////////// Request /////////////////////
void OsclAcceptRequest::Accept(OsclSocketI &aSocket)
{
OsclAny *p = NewRequest(sizeof(AcceptParam));
if (!p)
PendComplete(OsclErrNoMemory);
else
{
iParam = OSCL_PLACEMENT_NEW(p, AcceptParam(aSocket));
if (!iParam)
PendComplete(OsclErrNoMemory);
else
SocketI()->Accept(*Param(), *this);
}
}
void OsclAcceptRequest::Run()
{
//The request was completed by the socket server
//may need to discard accepted socket in addition to
//the usual request completion.
if (Status() != OSCL_REQUEST_ERR_NONE)
((OsclAcceptMethod*)&iContainer)->DiscardAcceptedSocket();
//call the base class Run
OsclSocketRequestAO::Run();
}