diff -r 000000000000 -r 164170e6151a wim/WimServer/src/WimSimFileHandler.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/wim/WimServer/src/WimSimFileHandler.cpp Tue Jan 26 15:20:08 2010 +0200 @@ -0,0 +1,306 @@ +/* +* Copyright (c) 2003 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: Handler for Wimlib request for SIM file reading. Calls +* services from CustomAPI to read file and returns read file +* to WIMI (and Wimlib) +* +*/ + + + +// INCLUDE FILES +#include "WimSimFileHandler.h" +#include "Wimi.h" // WIMI +#include "WimTrace.h" +#include // TSY and Phone name + + +// ============================ MEMBER FUNCTIONS =============================== + +// ----------------------------------------------------------------------------- +// CWimSimFileHandler::CWimSignTextHandler +// C++ default constructor can NOT contain any code, that +// might leave. +// ----------------------------------------------------------------------------- +// +CWimSimFileHandler::CWimSimFileHandler() : CActive( EPriorityStandard ) + { + _WIMTRACE(_L("WIM | WIMServer | CWimSimFileHandler::CWimSimFileHandler | Begin")); + } + +// ----------------------------------------------------------------------------- +// CWimSimFileHandler::ConstructL +// Symbian 2nd phase constructor can leave. +// ----------------------------------------------------------------------------- +// +void CWimSimFileHandler::ConstructL() + { + _WIMTRACE(_L("WIM | WIMServer | CWimSimFileHandler::ConstructL | Begin")); + CActiveScheduler::Add( this ); + + //Create new CustomAPI instance + iCustomApi = new( ELeave ) RMmCustomAPI; + OpenCustomApiL(); // Open connection to CustomAPI + } + +// ----------------------------------------------------------------------------- +// CWimSimFileHandler::NewL +// Two-phased constructor. +// ----------------------------------------------------------------------------- +// +CWimSimFileHandler* CWimSimFileHandler::NewL() + { + _WIMTRACE(_L("WIM | WIMServer | CWimSimFileHandler::NewL | Begin")); + CWimSimFileHandler* self = new( ELeave ) CWimSimFileHandler; + + CleanupStack::PushL( self ); + self->ConstructL(); + CleanupStack::Pop( self ); + _WIMTRACE(_L("WIM | WIMServer | CWimSimFileHandler::NewL | End")); + return self; + } + +// Destructor +CWimSimFileHandler::~CWimSimFileHandler() + { + _WIMTRACE(_L("WIM | WIMServer | CWimSimFileHandler::~CWimSimFileHandler | Begin")); + if ( iCustomApi ) + { + iCustomApi->Close(); + } + if ( iEtelServer ) + { + iEtelServer->Close(); + } + delete iCustomApi; + delete iEtelServer; + Cancel(); + delete iResponseBytesBuf; + delete iResponseBytesPtr; + _WIMTRACE(_L("WIM | WIMServer | CWimSimFileHandler::~CWimSimFileHandler | End")); + } + +// ----------------------------------------------------------------------------- +// CWimSimFileHandler::OpenCustomApiL +// Open CustomAPI for communication +// ----------------------------------------------------------------------------- +// +void CWimSimFileHandler::OpenCustomApiL() + { + _WIMTRACE(_L("WIM | WIMServer | CWimSimFileHandler::OpenCustomApiL | Begin")); + iEtelServer = new( ELeave ) RTelServer(); + + RMobilePhone phone; + + // Connect to the Etel server. + TInt ret = iEtelServer->Connect(); + + if ( ret != KErrNone ) + { + _WIMTRACE2(_L("WIM | WIMServer | CWimSimFileHandler::OpenCustomApiL | Connection to etel server failed: %d"), ret); + User::Leave( ret ); + } + + // Load phone module. + ret = iEtelServer->LoadPhoneModule( KMmTsyModuleName ); + + if ( ret != KErrNone ) + { + _WIMTRACE2(_L("WIM | WIMServer | CWimSimFileHandler::OpenCustomApiL | loading phone module failed: %d"), ret); + User::Leave( ret ); + } + + // Open phone + ret = phone.Open( *iEtelServer, KMmTsyPhoneName ); + + if ( ret != KErrNone ) + { + _WIMTRACE2(_L("WIM | WIMServer | CWimSimFileHandler::OpenCustomApiL | phone.Open failed: %d"), ret); + User::Leave( ret ); + } + + // Open new CustomAPI session for phone + ret = iCustomApi->Open( phone ); + + phone.Close(); // Close phone + + if ( ret != KErrNone ) + { + _WIMTRACE2(_L("WIM | WIMServer | CWimSimFileHandler::OpenCustomApiL | iCustomApi->Open failed: %d"), ret); + User::Leave( ret ); + } + } + +// ----------------------------------------------------------------------------- +// CWimSimFileHandler::ReadSimFileL +// Read SIM file using CustomAPI's ReadSimFile() method. +// ----------------------------------------------------------------------------- +// +void CWimSimFileHandler::ReadSimFileL( + TUint8 aReader, + const TDes8& aPath, + TUint16 aOffset, + TUint16 aSize ) + { + _WIMTRACE(_L("WIM | WIMServer | CWimSimFileHandler::ReadSimFileL | Begin")); + + iReaderNumber = aReader; + + TInt size; + if ( aSize == 0 ) // Read whole file + { + size = KMaxSimFileSize; + } + else + { + // If size is bigger than maximum file size declared in header file use + // declared max size + if ( aSize > KMaxSimFileSize ) + { + size = KMaxSimFileSize; + } + else + { + size = aSize; + } + } + + iSimFileInfo.iPath = aPath; + iSimFileInfo.iOffSet = aOffset; + iSimFileInfo.iSize = ( TUint16 )size; + + RMmCustomAPI::TSimFileInfoPckg simFileInfoPckg( iSimFileInfo ); + + iResponseBytesBuf = HBufC8::NewL( size ); + iResponseBytesPtr = new( ELeave ) TPtr8( NULL, 0, size ); + iResponseBytesPtr->Set( iResponseBytesBuf->Des() ); + + iStatus = KRequestPending; + + _WIMTRACE9(_L("WIM | WIMServer | CWimSimFileHandler::ReadSimFileL | Path = %02x%02x %02x%02x %02x%02x %02x%02x "), + iSimFileInfo.iPath[0], iSimFileInfo.iPath[1], iSimFileInfo.iPath[2], iSimFileInfo.iPath[3], + iSimFileInfo.iPath[4], iSimFileInfo.iPath[5], iSimFileInfo.iPath[6], iSimFileInfo.iPath[7] ); + + _WIMTRACE2(_L("WIM | WIMServer | CWimSimFileHandler::ReadSimFileL | Offset = 0x%04x"), iSimFileInfo.iOffSet ); + + iCustomApi->ReadSimFile( iStatus, simFileInfoPckg, *iResponseBytesPtr ); + + SetActiveAndWait(); // Wait request to be completed + + _WIMTRACE(_L("WIM | WIMServer | CWimSimFileHandler::ReadSimFileL | End")); + } + +// ----------------------------------------------------------------------------- +// CWimSimFileHandler::FileReceivedL +// Handle received file +// ----------------------------------------------------------------------------- +// +void CWimSimFileHandler::FileReceived() + { + _WIMTRACE2(_L("WIM | WIMServer | CWimSimFileHandler::FileReceived | Begin, error: %d"), iStatus.Int()); + WIMI_BinData_t responseBytes; + + TInt error = iStatus.Int(); + TUint8 status; + + switch ( error ) + { + case KErrPathNotFound: + { + _WIMTRACE(_L("WIM | WIMServer | CWimSimFileHandler::FileReceived | File not found")); + break; + } + case KErrNotFound: + { + _WIMTRACE(_L("WIM | WIMServer | CWimSimFileHandler::FileReceived | No data found from file")); + break; + } + case KErrUnknown: + { + _WIMTRACE(_L("WIM | WIMServer | CWimSimFileHandler::FileReceived | Unknown error")); + break; + } + default: + { + _WIMTRACE2(_L("WIM | WIMServer | CWimSimFileHandler::FileReceived | Error: %d"), error); + break; + } + } + + if ( error != KErrNone ) // Error occurred in SIM file reading + { + responseBytes.pb_buf = NULL; + responseBytes.ui_buf_length = 0; + status = WIMI_Err; + } + else // SIM file read succesfully + { + responseBytes.pb_buf = ( TUint8* )iResponseBytesPtr->Ptr(); + responseBytes.ui_buf_length = ( TUint16 )iResponseBytesPtr->Length(); + status = WIMI_Ok; + } + + _WIMTRACE2(_L("WIM | WIMServer | CWimSimFileHandler::FileReceived | FileLength = %d"), responseBytes.ui_buf_length); + + // Pass data to WIMI + WIMI_SIM_ReadFileResp( iReaderNumber, status, &responseBytes ); + + delete iResponseBytesBuf; + iResponseBytesBuf = NULL; + delete iResponseBytesPtr; + iResponseBytesPtr = NULL; + + _WIMTRACE(_L("WIM | WIMServer | CWimSimFileHandler::FileReceived | End")); + } + +// ----------------------------------------------------------------------------- +// CWimSimFileHandler::RunL +// Handle CustomAPI response +// ----------------------------------------------------------------------------- +// +void CWimSimFileHandler::RunL() + { + _WIMTRACE2(_L("WIM | WIMServer | CWimSimFileHandler::RunL, status: %d"), iStatus.Int()); + iWait.AsyncStop(); + FileReceived(); + } + +// ----------------------------------------------------------------------------- +// CWimSimFileHandler::DoCancel +// Cancel asyncronous request +// ----------------------------------------------------------------------------- +// +void CWimSimFileHandler::DoCancel() + { + _WIMTRACE(_L("WIM | WIMServer | CWimSimFileHandler::DoCancel | Begin")); + delete iResponseBytesBuf; + iResponseBytesBuf = NULL; + delete iResponseBytesPtr; + iResponseBytesPtr = NULL; + } + +// ----------------------------------------------------------------------------- +// CWimSimFileHandler::SetActiveAndWait +// Wait until asynchronous call is completed +// ----------------------------------------------------------------------------- +// +void CWimSimFileHandler::SetActiveAndWait() + { + _WIMTRACE(_L("WIM | WIMServer | CWimSimFileHandler::SetActiveAndWait | Begin")); + SetActive(); + iWait.Start(); + _WIMTRACE(_L("WIM | WIMServer | CWimSimFileHandler::SetActiveAndWait | End")); + } + +// End of File