diff -r 000000000000 -r 6a9f87576119 filesystemuis/memscaneng/clientsrc/memscanclient.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/filesystemuis/memscaneng/clientsrc/memscanclient.cpp Mon Jan 18 20:09:41 2010 +0200 @@ -0,0 +1,260 @@ +/* +* Copyright (c) 2006-2006 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: Memory Scan Client +* +*/ + + + +// SYSTEM INCLUDES +#include +#include // RBufReadStream + +// USER INCLUDES +#include "memscanclient.h" +#include "memscanutils.h" // traces + + +// Standard server startup code +// +static TInt StartServer() + { + TRACES( RDebug::Print(_L("MemScanClient: Starting server...")) ); + + RProcess server; + TInt r=server.Create(KMemScanServImg,KNullDesC); + + if (r!=KErrNone) + { + TRACES( RDebug::Print(_L("MemScanClient: server start failed %d"),r) ); + return r; + } + TRequestStatus stat; + server.Rendezvous(stat); + if (stat!=KRequestPending) + server.Kill(0); // abort startup + else + server.Resume(); // logon OK - start the server + TRACES( RDebug::Print(_L("MemScanClient: Started")) ); + User::WaitForRequest(stat); // wait for start or death + // we can't use the 'exit reason' if the server panicked as this + // is the panic 'reason' and may be '0' which cannot be distinguished + // from KErrNone + r=(server.ExitType()==EExitPanic) ? KErrGeneral : stat.Int(); + server.Close(); + return r; + } + +EXPORT_C RMemScanClient::RMemScanClient() +: iScanEventPackagePointer( NULL, 0, 0 ) + { + } + + +// This is the standard retry pattern for server connection +EXPORT_C TInt RMemScanClient::Connect() + { + TVersion version(KMemScanServMajor, KMemScanServMinor, KMemScanServBuild); + TInt retry=2; + for (;;) + { + TInt r=CreateSession(KMemScanServName, version, 1); + if (r!=KErrNotFound && r!=KErrServerTerminated) + return r; + if (--retry==0) + return r; + r=StartServer(); + if (r!=KErrNone && r!=KErrAlreadyExists) + return r; + } + } + +EXPORT_C void RMemScanClient::Close() + { + RSessionBase::Close(); //basecall + } + + +// *************************************************************************** +// Client Server functions +// *************************************************************************** + + +// --------------------------------------------------------------------------- +// RMemScanClient::DataGroupsL() +// +// --------------------------------------------------------------------------- +EXPORT_C CDesCArray* RMemScanClient::DataGroupsL() const + { + // Ask server to externalize the data group array to buffer + // and to provide size of buffer + TPckgBuf bufferSize; + User::LeaveIfError(SendReceive( EMemScanPrepareDataGroups, TIpcArgs(&bufferSize) )); + + // Create a buffer of sufficient size in order to fetch the + // buffer from the server + CBufBase* buffer = CBufFlat::NewL( bufferSize() ); //buffer granularity + CleanupStack::PushL( buffer ); + buffer->ResizeL( bufferSize() ); //buffer size + + // Now fetch the transfer buffer from the server + TPtr8 pBuffer(buffer->Ptr(0)); + User::LeaveIfError(SendReceive( EMemScanGetDataGroups, TIpcArgs(&pBuffer) )); + + // *** Start internalizing the buffer *** + + RBufReadStream stream(*buffer); + CleanupClosePushL(stream); + + // Read the number of data groups from the beginning of the stream + const TInt count = stream.ReadInt32L(); + + // Create the array for the data group names with appropriate granularity + CDesCArray* dataGroupNameArray = new (ELeave) CDesCArrayFlat(count); + CleanupStack::PushL( dataGroupNameArray ); + + + // Read each group name to array + for(TInt i=0; iAppendL( *group ); + CleanupStack::PopAndDestroy( group ); + } + + // *** Internalizing done *** + + CleanupStack::Pop( dataGroupNameArray ); + CleanupStack::PopAndDestroy( &stream ); + CleanupStack::PopAndDestroy( buffer ); + + + return dataGroupNameArray; + } + + +// --------------------------------------------------------------------------- +// RMemScanClient::ScanResultL() +// +// --------------------------------------------------------------------------- +EXPORT_C CArrayFix* RMemScanClient::ScanResultL() const + { + // Ask server to externalize the scan result array to buffer + // and to provide size of buffer + TPckgBuf bufferSize; + User::LeaveIfError(SendReceive(EMemScanPrepareScanResults, TIpcArgs( &bufferSize ))); + + // Create a buffer of sufficient size in order to fetch the + // buffer from the server + CBufBase* buffer = CBufFlat::NewL( bufferSize() ); //buffer granularity + CleanupStack::PushL( buffer ); + buffer->ResizeL( bufferSize() ); //buffer size + + // Now fetch the transfer buffer from the server + TPtr8 pBuffer(buffer->Ptr(0)); + TIpcArgs args(&pBuffer); + User::LeaveIfError(SendReceive( EMemScanGetScanResults, args )); + + // *** Start internalizing the buffer *** + + RBufReadStream stream(*buffer); + CleanupClosePushL(stream); + + // Read the number of results from the beginning of the stream + const TInt count = stream.ReadInt32L(); + + // Create the result array with such granularity + // that reallocations do not happen + CArrayFix* resultArray = new (ELeave) CArrayFixFlat(count); + CleanupStack::PushL(resultArray); + + + // Read scan results for each data group and write them to result array + for(TInt i=0; i> result; + resultArray->AppendL(result); + } + + // *** Internalizing done *** + + CleanupStack::Pop( resultArray ); + CleanupStack::PopAndDestroy( &stream ); + CleanupStack::PopAndDestroy( buffer ); + + + return resultArray; + } + +// --------------------------------------------------------------------------- +// RMemScanClient::Scan() +// +// --------------------------------------------------------------------------- +EXPORT_C TInt RMemScanClient::Scan(TDriveNumber aDrive) + { + TInt err = SendReceive( EMemScanStartScan, TIpcArgs( aDrive ) ); + return err; + } + + +// --------------------------------------------------------------------------- +// RMemScanClient::RequestScanEvents() +// +// --------------------------------------------------------------------------- +EXPORT_C void RMemScanClient::RequestScanEvents( TInt& aError, TRequestStatus& aRequestStatus ) + { + iScanEventPackagePointer.Set( (TUint8*) &aError, sizeof(TInt), sizeof(TInt) ); + + TIpcArgs args( &iScanEventPackagePointer ); + SendReceive( EMemScanRequestScanEvents, args, aRequestStatus ); + } + + +// --------------------------------------------------------------------------- +// RMemScanClient::RequestScanEventsCancel() +// +// --------------------------------------------------------------------------- +EXPORT_C void RMemScanClient::RequestScanEventsCancel() + { + // There is nothing client can do if cancelling went wrong, + // so we don't return any error + SendReceive( EMemScanRequestScanEventsCancel ); + } + + +// --------------------------------------------------------------------------- +// RMemScanClient::ScanInProgress() +// +// --------------------------------------------------------------------------- +EXPORT_C TBool RMemScanClient::ScanInProgress() const + { + TBool result = EFalse; + TInt err = SendReceive(EMemScanInProgress); + if( err < 0 ) + { + result = EFalse; + } + else + { + result = static_cast (err); + } + return result; + } + + +// End of File