realtimenetprots/sipfw/ClientResolver/Server/src/sipcrworkerao.cpp
author Petteri Saari <petteri.saari@digia.com>
Thu, 02 Dec 2010 15:23:48 +0200
branchMSRP_FrameWork
changeset 60 7634585a4347
parent 0 307788aac0a8
permissions -rw-r--r--
This release addresses the following: - Multiple concurrent file transfer bug fixes. i.e. one device is concurrently receiving multiple files from multiple devices

// Copyright (c) 2007-2009 Nokia Corporation and/or its subsidiary(-ies).
// All rights reserved.
// This component and the accompanying materials are made available
// under the terms of "Eclipse Public License v1.0"
// which accompanies this distribution, and is available
// at the URL "http://www.eclipse.org/legal/epl-v10.html".
//
// Initial Contributors:
// Nokia Corporation - initial contribution.
//
// Contributors:
//
// Description:
// Name          : sipcrworkerao.cpp
// Part of       : SIP / SIP Client Resolver
// Version       : %version: 2.1.1 %
//



#include "sipcrworkerao.h"
#include "CSipCRServerSession.h"
 
// ----------------------------------------------------------------------------
// CSipCrWorkerAo::NewL
// ----------------------------------------------------------------------------
//
CSipCrWorkerAo* CSipCrWorkerAo::NewL(CSIPCRServerSession& aSession)
    {
    CSipCrWorkerAo* self = CSipCrWorkerAo::NewLC(aSession);
    CleanupStack::Pop(self);
    return self;
    }

// ----------------------------------------------------------------------------
// CSipCrWorkerAo::NewLC
// ----------------------------------------------------------------------------
//	        
CSipCrWorkerAo* CSipCrWorkerAo::NewLC(CSIPCRServerSession& aSession)
    {
    CSipCrWorkerAo* self = new(ELeave)CSipCrWorkerAo(aSession);
    CleanupStack::PushL(self);
    self->ConstructL();
    return self;
    }

// ----------------------------------------------------------------------------
// CSipCrWorkerAo::NewL
// ----------------------------------------------------------------------------
//
CSipCrWorkerAo* CSipCrWorkerAo::NewL(
    TUint32 aRequestId,
    CBufBase* aSerializedSipRequest,
    HBufC8* aSipRequestBody,
    const TSipClient& aSipClient,
    const TUid& aResolverUid,
    CSIPCRServerSession& aSession)
    {
    CSipCrWorkerAo* self = 
        CSipCrWorkerAo::NewLC(
            aRequestId,aSerializedSipRequest,aSipRequestBody,
            aSipClient,aResolverUid,aSession);
    CleanupStack::Pop(self);
    return self;    
    }

// ----------------------------------------------------------------------------
// CSipCrWorkerAo::NewLC
// ----------------------------------------------------------------------------
//	        
CSipCrWorkerAo* CSipCrWorkerAo::NewLC(
    TUint32 aRequestId,
    CBufBase* aSerializedSipRequest,
    HBufC8* aSipRequestBody,
    const TSipClient& aSipClient,
    const TUid& aResolverUid,
    CSIPCRServerSession& aSession)
    {
    CSipCrWorkerAo* self = 
        new(ELeave)CSipCrWorkerAo(
            aRequestId,aSipClient,aResolverUid,aSession);
    CleanupStack::PushL(self);
    self->ConstructL(aSerializedSipRequest,aSipRequestBody);
    return self;
    }

// ----------------------------------------------------------------------------
// CSipCrWorkerAo::CSipCrWorkerAo
// ----------------------------------------------------------------------------
//
CSipCrWorkerAo::CSipCrWorkerAo(CSIPCRServerSession& aSession)
 : CActive(EPriorityStandard),
   iSession(aSession),
   iSipClient(TUid::Null(),EFalse,EFalse)
    {
	CActiveScheduler::Add(this);
    }

// ----------------------------------------------------------------------------
// CSipCrWorkerAo::CSipCrWorkerAo
// ----------------------------------------------------------------------------
//
CSipCrWorkerAo::CSipCrWorkerAo(
    TUint32 aRequestId,
    const TSipClient& aSipClient,
    const TUid& aResolverUid,    
    CSIPCRServerSession& aSession)
 : CActive(EPriorityStandard),
   iSession(aSession),
   iRequestId(aRequestId),
   iSipClient(aSipClient),
   iResolverUid(aResolverUid)
    {
	CActiveScheduler::Add(this);
    }

// ----------------------------------------------------------------------------
// CSipCrWorkerAo::ConstructL
// ----------------------------------------------------------------------------
//
void CSipCrWorkerAo::ConstructL()
    {
    iSerializedSipRequest = CBufFlat::NewL(1);
    iSipRequestBody = KNullDesC8().AllocL();
    }

// ----------------------------------------------------------------------------
// CSipCrWorkerAo::ConstructL
// ----------------------------------------------------------------------------
//
void CSipCrWorkerAo::ConstructL(
    CBufBase* aSerializedSipRequest,
    HBufC8* aSipRequestBody)
    {
    __ASSERT_ALWAYS(aSerializedSipRequest != NULL, User::Leave(KErrArgument));
    iSerializedSipRequest = aSerializedSipRequest;
    iSipRequestBody = aSipRequestBody;  
    }

// ----------------------------------------------------------------------------
// CSipCrWorkerAo::~CSipCrWorkerAo
// ----------------------------------------------------------------------------
//
CSipCrWorkerAo::~CSipCrWorkerAo()
    {
	CActive::Cancel();
	iThread.Close();
    delete iSerializedSipRequest;
    delete iSipRequestBody;	
    }

// ----------------------------------------------------------------------------
// CSipCrWorkerAo::StartThreadL
// ----------------------------------------------------------------------------
//
void CSipCrWorkerAo::StartThreadL(RThread& aThread)
    {
    User::LeaveIfError(iThread.Duplicate(aThread));
    aThread.Logon(iStatus);
    aThread.Resume();
    SetActive();
    }

// ----------------------------------------------------------------------------
// CSipCrWorkerAo::Session
// ----------------------------------------------------------------------------
//
CSIPCRServerSession& CSipCrWorkerAo::Session()
    {
    return iSession;
    }

// ----------------------------------------------------------------------------
// CSipCrWorkerAo::SerializedSipRequest
// ----------------------------------------------------------------------------
//
CBufBase& CSipCrWorkerAo::SerializedSipRequest()
    {
    return *iSerializedSipRequest;
    }

// ----------------------------------------------------------------------------
// CSipCrWorkerAo::GetSipRequestBody
// ----------------------------------------------------------------------------
//
HBufC8* CSipCrWorkerAo::GetSipRequestBody()
    {
    HBufC8* tmp = iSipRequestBody;
    iSipRequestBody = NULL;
    return tmp;
    }

// ----------------------------------------------------------------------------
// CSipCrWorkerAo::SipClient
// ----------------------------------------------------------------------------
//
TSipClient& CSipCrWorkerAo::SipClient()
    {
    return iSipClient;
    }

// ----------------------------------------------------------------------------
// CSipCrWorkerAo::ResolverUid
// ----------------------------------------------------------------------------
//
const TUid& CSipCrWorkerAo::ResolverUid() const
    {
    return iResolverUid;
    }

// ----------------------------------------------------------------------------
// CSipCrWorkerAo::RequestId
// ----------------------------------------------------------------------------
//
TUint32 CSipCrWorkerAo::RequestId() const
    {
    return iRequestId;
    }

// ----------------------------------------------------------------------------
// CSipCrWorkerAo::CompletionCode
// ----------------------------------------------------------------------------
//       
TInt CSipCrWorkerAo::CompletionCode() const
    {
    TExitType exitType = iThread.ExitType();
    if (exitType == EExitPanic)
        {
        return KErrGeneral;
        }
    return iStatus.Int();
    }

// ----------------------------------------------------------------------------
// CSipCrWorkerAo::RunL
// ----------------------------------------------------------------------------
//
void CSipCrWorkerAo::RunL()
    {
	iSession.WorkerAoRequestCompleted(this); // Note: deletes this
    }

// ----------------------------------------------------------------------------
// CSipCrWorkerAo::DoCancel
// ----------------------------------------------------------------------------
//	
void CSipCrWorkerAo::DoCancel()
    {
	iThread.LogonCancel(iStatus);
    }