diff -r 000000000000 -r ba25891c3a9e installationservices/swi/source/sishelper/sishelperclient.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/installationservices/swi/source/sishelper/sishelperclient.cpp Thu Dec 17 08:51:10 2009 +0200 @@ -0,0 +1,294 @@ +/* +* Copyright (c) 2004-2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of the License "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 +#include +#include +#include "sishelperclient.h" +#include "log.h" + +using namespace Swi; + +// +// RSisHelper +// + +EXPORT_C TInt RSisHelper::Connect() + { + return CreateSession(KSisHelperServerName, + TVersion(KSisHelperVersionMajor, + KSisHelperVersionMinor, + KSisHelperVersionBuild)); + } + +EXPORT_C void RSisHelper::Close() + { + RSessionBase::Close(); + } + +// Request SISController data from SISHelper +EXPORT_C HBufC8* RSisHelper::SisControllerLC() + { + // Allocate a buffer + const TInt KDefaultControllerBuffer=1024; // 1KB + HBufC8* controllerData=HBufC8::NewMaxLC(KDefaultControllerBuffer); + TPtr8 des=controllerData->Des(); + + TInt err=SendReceive(ESisHelperGetController, TIpcArgs(&des)); + if (err == KErrOverflow) + { + // is there enough space for an integer? + if(des.Length() != sizeof(TInt)) + { + User::Leave(KErrCorrupt); + } + + // Get needed size + TInt neededSize=0; + TPckg neededSizePackage(neededSize); + neededSizePackage.Copy(des); + + // Re-allocate buffer + CleanupStack::PopAndDestroy(controllerData); + controllerData=HBufC8::NewMaxLC(neededSize); + TPtr8 neededDes=controllerData->Des(); + + // Rerequest + err=SendReceive(ESisHelperGetController, TIpcArgs(&neededDes)); + } + + User::LeaveIfError(err); + return controllerData; + } + +EXPORT_C TInt RSisHelper::ExtractFileL(RFs& /*aFs*/, RFile& aFile, TInt aFileIndex, + TInt aDataUnit, RUiHandler& /*aUiHandler*/) + { + TIpcArgs args; + aFile.TransferToServer(args, 0, 1); + args.Set(2, aFileIndex); + args.Set(3, aDataUnit); + return SendReceive(ESisHelperExtractFile, args); + } + +void RSisHelper::SetupAsyncExtractionL(RFs& aFs, RFile& aFile, TInt aFileIndex,TInt aDataUnit) + { + User::LeaveIfError(SendReceive(ESisHelperSetupAsyncExtraction, TIpcArgs(aFs, aFile.SubSessionHandle(), aFileIndex, aDataUnit))); + } + +void RSisHelper::AsyncExtractionL(TInt64 length, TRequestStatus& aStatus) + { + SendReceive(ESisHelperAsyncExtraction, TIpcArgs(I64HIGH(length), I64LOW(length)), aStatus); + } + +void RSisHelper::EndAsyncExtractionL() + { + User::LeaveIfError(SendReceive(ESisHelperEndAsyncExtraction, TIpcArgs())); + } + +EXPORT_C void RSisHelper::FillDrivesAndSpacesL(RArray& aDriveLetters, + RArray& aDriveSpaces) + { + // calculate the likely size of the data transfer buffer + const TInt KMaxBufSize= + sizeof(TInt)+ // number of entries + KMaxDrives*sizeof(TUint)+ // drive letters stored as TUints + KMaxDrives*sizeof(TInt64); // drive free spaces + + // allocate buffer for the returned arrays + HBufC8* buf=HBufC8::NewMaxLC(KMaxBufSize); + TPtr8 pBuf=buf->Des(); + User::LeaveIfError(SendReceive(ESisHelperFillDrivesAndSpaces, + TIpcArgs(&pBuf))); + + // got the buffer, internalise the arrays + RDesReadStream ins(*buf); + CleanupClosePushL(ins); + + // first comes the number of entries (TInt) + TInt count=ins.ReadInt32L(); + + // then drive letters + TInt i; + for (i = 0; i < count; ++i) + { + TUint chVal=ins.ReadUint32L(); + TChar ch(chVal); + aDriveLetters.AppendL(ch); + } + + // then drive spaces + for (i = 0; i < count; ++i) + { + TInt32 l=ins.ReadInt32L(); + TInt32 h=ins.ReadInt32L(); + TInt64 space=MAKE_TINT64(h, l); + aDriveSpaces.AppendL(space); + } + + // cleanup + CleanupStack::PopAndDestroy(2, buf); // ins, buf + } + +EXPORT_C void RSisHelper::OpenDrmContentL(ContentAccess::TIntent aIntent) + { + TInt intent = static_cast(aIntent); + User::LeaveIfError(SendReceive(ESisHelperOpenDrmContent, TIpcArgs(intent))); + } + +EXPORT_C void RSisHelper::ExecuteDrmIntentL(ContentAccess::TIntent aIntent) + { + TInt intent = static_cast(aIntent); + User::LeaveIfError(SendReceive(ESisHelperExecuteDrmIntent, TIpcArgs(intent))); + } + +TInt RSisHelper::CreateSisStub(RFile& aFile) + { + TIpcArgs ipcArgs; + aFile.TransferToServer(ipcArgs, 0, 1); + return SendReceive(ESisHelperCreateSisStub, ipcArgs); + } + +TBool RSisHelper::IsStubL() + { + TBool stub = EFalse; + TPckg stubPckg(stub); + User::LeaveIfError(SendReceive(ESisHelperIsStub, TIpcArgs(&stubPckg))); + return stub; + } + +TChar RSisHelper::GetSisFileDriveL() + { + TChar drive(0); + TPckg drivePckg(drive); + User::LeaveIfError(SendReceive(ESisHelperGetSisFileDrive, TIpcArgs(&drivePckg))); + return drive; + } + +TBool RSisHelper::IsSisFileReadOnlyL() + { + TBool readOnly = EFalse; + TPckg readOnlyPckg(readOnly); + User::LeaveIfError(SendReceive(ESisHelperIsSisFileReadOnly, TIpcArgs(&readOnlyPckg))); + return readOnly; + } + +// Request SIS file name from SISHelper +void RSisHelper::GetSisFileNameL(TDes& aFileName) + { + TInt err = SendReceive(ESisHelperGetSisFileName, TIpcArgs(&aFileName)); + User::LeaveIfError(err); + } + +// Retrieve Controller from the specified SIS file +EXPORT_C HBufC8* RSisHelper::GetControllerFromSisFileLC(const TDesC& aFileName) + { + // Open the file and pass the handle securely to SisHelper since + // it does not have the capability to read files from private folders + // of other processes + RFs fs; + User::LeaveIfError(fs.Connect()); + CleanupClosePushL(fs); + User::LeaveIfError(fs.ShareProtected()); + RFile file; + User::LeaveIfError(file.Open(fs, aFileName, EFileRead | EFileShareReadersOnly)); + CleanupClosePushL(file); + + // Allocate a buffer + const TInt KDefaultControllerBuffer = 1024; // 1KB + HBufC8* controllerData = HBufC8::NewMaxLC(KDefaultControllerBuffer); + TPtr8 ptr(controllerData->Des()); + + // Store the RFs handle in message slot 1 and the RFile handle in slot 2 + TIpcArgs ipcArgs; + User::LeaveIfError(file.TransferToServer(ipcArgs, 1, 2)); + + ipcArgs.Set(0, &ptr); + TInt err = SendReceive(ESisHelperGetControllerFromSis, ipcArgs); + if (err == KErrOverflow) + { + // is there enough space for an integer? + if(ptr.Length() != sizeof(TInt)) + { + User::Leave(KErrCorrupt); + } + + // Get needed size + TInt neededSize = 0; + TPckg neededSizePackage(neededSize); + neededSizePackage.Copy(ptr); + + // Re-allocate buffer + CleanupStack::PopAndDestroy(controllerData); + controllerData = HBufC8::NewMaxLC(neededSize); + TPtr8 neededPtr(controllerData->Des()); + + // Rerequest + User::LeaveIfError(file.TransferToServer(ipcArgs, 1, 2)); + ipcArgs.Set(0, &neededPtr); + err = SendReceive(ESisHelperGetControllerFromSis, ipcArgs); + } + + User::LeaveIfError(err); + + CleanupStack::Pop(controllerData); + CleanupStack::PopAndDestroy(2, &fs); + CleanupStack::PushL(controllerData); + return controllerData; + } + +#ifdef SYMBIAN_UNIVERSAL_INSTALL_FRAMEWORK +TBool RSisHelper::IsDrmProtectedL() + { + TPckgBuf isContentProtected; + TInt returnCode = SendReceive(ESisHelperIsDrmProtected, TIpcArgs(&isContentProtected)); + User::LeaveIfError(returnCode); + + return isContentProtected(); + } +#endif +void RSisHelper::GetEquivalentLanguageListL(TLanguage aLangId,RArray& aEquivLangs) + { + // calculate the likely size of the data transfer buffer + const TInt KMaxBufSize= + sizeof(TInt)+ // number of entries + (KMaxDowngradeLanguages+1)*sizeof(TLanguage); // Languages IDs stored as TLanguage + + // allocate buffer for the returned arrays + HBufC8* buf=HBufC8::NewMaxLC(KMaxBufSize); + TPtr8 pBuf=buf->Des(); + User::LeaveIfError(SendReceive(ESisHelperGetEquivalentLanguages, + TIpcArgs(&pBuf,aLangId))); + + // got the buffer, internalise the arrays + RDesReadStream ins(*buf); + CleanupClosePushL(ins); + + // first comes the number of entries (TInt) + TInt count=ins.ReadInt32L(); + + // then language ID's + TInt i; + for (i = 0; i < count; ++i) + { + TLanguage langId=(TLanguage)ins.ReadInt32L(); + aEquivLangs.AppendL(langId); + } + // cleanup + CleanupStack::PopAndDestroy(2, buf); // buf + }