tsrc/testtools/stubsrv/src/stubclient.cpp
author hgs
Tue, 13 Jul 2010 00:24:10 +0300
changeset 62 eadeea68c837
permissions -rw-r--r--
201027

/*
* Copyright (c) 2010 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:
*
*/

#include <e32cmn.h>
#include "stubclient.h"
#include "stubclientsrv.h"

_LIT(KStubSrvExe, "stubsrv.exe");
static TInt ClientStart()
	{
	RProcess server;
	TInt r = server.Create(KStubSrvExe, KNullDesC, TUidType(KNullUid, KNullUid, KStubSrvUid3));
	if (r!=KErrNone)
		return r;
	TRequestStatus stat;
	server.Rendezvous(stat);
	if (stat != KRequestPending)
	    server.Kill(0);
	else
	    server.Resume();
	User::WaitForRequest(stat);
	r = (server.ExitType() == EExitPanic) ? KErrGeneral : stat.Int();
	server.Close();
	return r;
	}

void RStubClient::EnqueBehavior(const TApiBehavior& aBeh, TInt aExeDuration)
    {
    CheckSession();
    TApiBehaviorPckgBuf buf(aBeh);
    (void) SendReceive(EStubSrvEnqueApiBehavior, TIpcArgs(&buf, aExeDuration));    
    }

void RStubClient::DeleteBehaviors(TUint aLib, TUint aApi)
    {
    CheckSession();
    (void) SendReceive(EStubSrvDeleteApiBehaviors, TIpcArgs(aLib, aApi)); 
    }

void RStubClient::InvokeApi(TApiBehaviorPckg& aBehPckg, TApiInvokeMode aMode)
    {
    CheckSession();
    (void) SendReceive(EStubSrvInvokeApi, TIpcArgs(&aBehPckg, aMode, 0));    
    }

void RStubClient::InvokeApiL(TApiBehaviorPckg& aBehPckg, TRequestStatus& aStatus, TApiInvokeMode aMode)
    {
    CheckSession();
    TInt transctionId = 0;
    TPckg<TInt> transpckg(transctionId);
    TInt err = SendReceive(EStubSrvGetApiCompletionCode, TIpcArgs(aBehPckg().iLib, aBehPckg().iApi, &transpckg));
    if (err)
        {
        User::Leave(err);
        }
    SendReceive(EStubSrvInvokeApi, TIpcArgs(&aBehPckg, aMode, transctionId), aStatus);
    }

void RStubClient::InvokeApiCancel(TUint aLib, TUint aApi)
    {
    CheckSession();
    (void) SendReceive(EStubSrvInvokeApiCancel, TIpcArgs(aLib, aApi));
    }

TInt RStubClient::Connect()
    {
	TInt retVal = CreateSession(KStubSrvName, Version());
	if (retVal)
        {
        retVal = ClientStart();
        if (!retVal)
            retVal = CreateSession(KStubSrvName, Version());
        }
    return retVal;
    }

TVersion RStubClient::Version() const
    {
    return(TVersion(KStubSrvMajorVersionNumber, KStubSrvMinorVersionNumber, KStubSrvBuildNumber));
    }

_LIT(KPanicCat, "!Stubsrv");

void RStubClient::CheckSession()
    {
    if (!Handle())
        User::Panic(KPanicCat, KErrBadHandle);
    }