installationservices/swi/source/sisregistry/client/sisregistrywritablesession.cpp
changeset 0 ba25891c3a9e
child 25 7333d7932ef7
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/installationservices/swi/source/sisregistry/client/sisregistrywritablesession.cpp	Thu Dec 17 08:51:10 2009 +0200
@@ -0,0 +1,335 @@
+/*
+* 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: 
+* sisregistry - restricted client registry session interface implementation
+*
+*/
+
+
+/**
+ @file 
+ @released
+ @internalTechnology
+*/
+
+#include <s32mem.h>
+#include "sisregistrywritablesession.h"
+#include "sisregistryobject.h"
+#include "sisregistryclientserver.h"
+#include "application.h"
+#include "siscontroller.h"
+#include "sisinfo.h"
+#include "sisuid.h"
+#include "cleanuputils.h"
+#include "arrayutils.h"
+#ifdef SYMBIAN_UNIVERSAL_INSTALL_FRAMEWORK
+#include "swtypereginfo.h"
+#endif
+
+using namespace Swi;
+
+#ifdef SYMBIAN_UNIVERSAL_INSTALL_FRAMEWORK
+EXPORT_C void RSisRegistryWritableSession::CreateTransactionL()
+	{
+	User::LeaveIfError(SendReceive(ECreateTransaction));
+	}
+
+EXPORT_C void RSisRegistryWritableSession::CommitTransactionL()
+	{
+	User::LeaveIfError(SendReceive(ECommitTransaction));
+	}
+
+EXPORT_C void RSisRegistryWritableSession::RollbackTransactionL()
+	{
+	User::LeaveIfError(SendReceive(ERollbackTransaction));
+	}
+#endif
+
+void RSisRegistryWritableSession::AddEntryImplL(TInt aMessage,
+												const CApplication& aApplication,
+												const TDesC8& aController, 
+												TInt64 aTransactionID,
+												TIpcArgs& aIpcArgs)
+	{
+	CBufFlat* tempBuffer = CBufFlat::NewL(KDefaultBufferSize);
+	CleanupStack::PushL(tempBuffer);
+	
+	CSisRegistryObject* object = CSisRegistryObject::NewLC();
+	object->ProcessApplicationL(aApplication, aController);
+	
+	RBufWriteStream stream(*tempBuffer);
+ 	CleanupClosePushL(stream);
+ 	
+	object->ExternalizeL(stream);
+	
+	CleanupStack::PopAndDestroy(2, object); // stream
+	
+	// Now, create an HBufC8 from the stream buf's length, and copy 
+	// the stream buffer into this descriptor
+	HBufC8* buffer = HBufC8::NewLC(tempBuffer->Size());
+	TPtr8 ptr(buffer->Des());
+	tempBuffer->Read(0, ptr, tempBuffer->Size());
+	
+	TPckgC<TInt64> transactionID(aTransactionID);
+	
+	aIpcArgs.Set(0, &ptr);
+	aIpcArgs.Set(1, &transactionID);
+	aIpcArgs.Set(2, &aController);
+	
+	User::LeaveIfError(SendReceive(aMessage, aIpcArgs));
+	
+	CleanupStack::PopAndDestroy(2, tempBuffer); // buffer
+	}
+
+EXPORT_C void RSisRegistryWritableSession::AddEntryL(const CApplication& aApplication,
+													 const TDesC8& aController, 
+													 TInt64 aTransactionID)
+	{
+	TIpcArgs ipcArgs;
+	AddEntryImplL(EAddEntry, aApplication, aController, aTransactionID, ipcArgs);
+	}
+
+#ifdef SYMBIAN_UNIVERSAL_INSTALL_FRAMEWORK
+EXPORT_C void RSisRegistryWritableSession::AddEntryL(const CApplication& aApplication,
+													 const TDesC8& aController,
+													 const RPointerArray<CSoftwareTypeRegInfo>& aSwTypeRegInfoArray,
+													 TInt64 aTransactionID)
+	{
+	RBuf8 serializedArray;
+	serializedArray.CleanupClosePushL();
+	SoftwareTypeRegInfoUtils::SerializeArrayL(aSwTypeRegInfoArray, serializedArray);
+	TIpcArgs ipcArgs;
+	ipcArgs.Set(3, &serializedArray);
+
+	AddEntryImplL(EAddSoftwareTypeEntry, aApplication, aController, aTransactionID, ipcArgs);
+
+	CleanupStack::PopAndDestroy(&serializedArray);
+	}
+#endif
+
+void RSisRegistryWritableSession::UpdateEntryImplL(TInt aMessage,
+												   const CApplication& aApplication, 
+												   const TDesC8& aController, 
+												   TInt64 aTransactionID,
+												   TIpcArgs& aIpcArgs)
+	{
+	CSisRegistryObject* object;
+	
+	// create a buffer for the final extenalisation
+	CBufFlat* tempBuffer = CBufFlat::NewL(KDefaultBufferSize);
+	CleanupStack::PushL(tempBuffer);
+	
+	// check whether it is full or partial upgrade
+	if (aApplication.IsPartialUpgrade())
+		{
+		TUid uid = aApplication.ControllerL().Info().Uid().Uid();
+		TPckg<TUid> packageUid(uid);
+		// request the copy of the object across IPC
+		HBufC8* buffer = SendReceiveBufferLC(EGetEntry, packageUid);
+
+		// create a stream based on the buffer
+		RDesReadStream stream(*buffer);
+		CleanupClosePushL(stream);
+		
+		// reassemble the object from the stream
+		object = CSisRegistryObject::NewLC(stream);
+		CleanupStack::Pop(object);
+		
+		CleanupStack::PopAndDestroy(2, buffer); // buffer, stream
+		CleanupStack::PushL(object);
+		// update the entry using the application stuff
+		object->UpgradeApplicationL(aApplication, aController);
+		}
+	else
+		{
+		// create a new object
+		object = CSisRegistryObject::NewLC();
+		object->ProcessApplicationL(aApplication, aController);
+		}
+
+	// create a stream to extenalise to
+	RBufWriteStream stream(*tempBuffer);
+ 	CleanupClosePushL(stream);
+
+	object->ExternalizeL(stream);
+	
+	CleanupStack::PopAndDestroy(2, object); // stream
+	
+	// create an HBufC8 from the stream buf's length, and copy 
+	// the stream buffer into this descriptor
+	HBufC8* buffer = HBufC8::NewLC(tempBuffer->Size());
+	TPtr8 ptr(buffer->Des());
+	tempBuffer->Read(0, ptr, tempBuffer->Size());
+	
+	// pass the transasction Id
+	TPckgC<TInt64> transactionID(aTransactionID);
+	
+	aIpcArgs.Set(0, &ptr);
+	aIpcArgs.Set(1, &transactionID);
+	aIpcArgs.Set(2, &aController);
+	
+	User::LeaveIfError(SendReceive(aMessage, aIpcArgs));
+
+	CleanupStack::PopAndDestroy(2, tempBuffer); // buffer 
+	}
+
+EXPORT_C void RSisRegistryWritableSession::UpdateEntryL(const CApplication& aApplication, 
+														const TDesC8& aController, 
+														TInt64 aTransactionID)
+	{
+	TIpcArgs ipcArgs;
+	UpdateEntryImplL(EUpdateEntry, aApplication, aController, aTransactionID, ipcArgs);
+	}
+
+#ifdef SYMBIAN_UNIVERSAL_INSTALL_FRAMEWORK
+EXPORT_C void RSisRegistryWritableSession::UpdateEntryL(const CApplication& aApplication, 
+														const TDesC8& aController,
+														const RPointerArray<CSoftwareTypeRegInfo>& aSwTypeRegInfoArray,
+														TInt64 aTransactionID)
+	{
+	RBuf8 serializedArray;
+	serializedArray.CleanupClosePushL();
+	SoftwareTypeRegInfoUtils::SerializeArrayL(aSwTypeRegInfoArray, serializedArray);
+	TIpcArgs ipcArgs;
+	ipcArgs.Set(3, &serializedArray);
+	
+	UpdateEntryImplL(EUpdateSoftwareTypeEntry, aApplication, aController, aTransactionID, ipcArgs);
+	
+	CleanupStack::PopAndDestroy(&serializedArray);
+	}
+#endif
+
+EXPORT_C void RSisRegistryWritableSession::DeleteEntryL(const CSisRegistryPackage& aPackage, TInt64 aTransactionID)
+	{
+	TPckgC<TUid> packageUid(aPackage.Uid());
+	TPckgC<TInt64> transactionID(aTransactionID);
+
+#ifdef SYMBIAN_UNIVERSAL_INSTALL_FRAMEWORK
+	TPckgC<TInt> packageIndex(aPackage.Index());
+	User::LeaveIfError(SendReceive(EDeleteEntry, TIpcArgs(&packageUid, &packageIndex, &transactionID)));
+#else
+	User::LeaveIfError(SendReceive(EDeleteEntry, TIpcArgs(&packageUid, &aPackage.Name(), &aPackage.Vendor(), &transactionID)));
+#endif
+	}
+
+EXPORT_C void RSisRegistryWritableSession::AddDriveL(const TInt aDrive)
+	{
+	TPckgC<TInt> packageDrive(aDrive);
+	User::LeaveIfError(SendReceive(EAddDrive, TIpcArgs(&packageDrive)));	
+	}
+
+#ifndef SYMBIAN_UNIVERSAL_INSTALL_FRAMEWORK
+EXPORT_C void RSisRegistryWritableSession::RemoveDriveL(const TInt aDrive)
+	{
+	TPckgC<TInt> packageDrive(aDrive);
+	User::LeaveIfError(SendReceive(ERemoveDrive, TIpcArgs(&packageDrive)));	
+	}
+
+EXPORT_C void RSisRegistryWritableSession::RegenerateCacheL()
+	{
+	User::LeaveIfError(SendReceive(ERegenerateCache));
+	}
+#endif
+
+/**
+* Returns ETrue if any ROM stub in the filesystem has the package uid specified
+* in aPackageId 
+* With the addition of SA upgrades to ROM, a package may be both in ROM, upgraded 
+* on another drive and this method can be used to check for the presence 
+* of an upgraded ROM package.
+*
+*
+* @param aPackageId		Package Id to be searched in the ROM stub files.
+*
+* @return ETrue if it can find the aPackageId or aFileName in any of the ROM stub SIS.
+*         EFalse otherwise
+*/
+
+EXPORT_C TBool RSisRegistryWritableSession::PackageExistsInRomL(const TUid& aPackageId)
+	{
+	TPckgBuf<TBool> present;	
+	TPckgC<TUid> tuid(aPackageId);
+	TInt returnCode = SendReceive(EPackageExistsInRom, TIpcArgs(&tuid, &present));
+	User::LeaveIfError(returnCode);
+		
+	return present();
+	}
+
+
+/**
+* Gets all the eclipsable file's entries from the ROM stub file of a ROM based package.
+*
+* @param aUid		Package UId to identify the right stub file.
+*
+* @param aFiles		A pointer array of file names to be populated.
+*
+*/
+EXPORT_C void RSisRegistryWritableSession::GetFilesForRomApplicationL(const TUid& aUid, RPointerArray<HBufC>& aFiles)
+	{
+	TInt startingFile = 0;
+	TPckgBuf<TInt> filesCount;
+	TPckgC<TInt> pckgStartingFile(startingFile);
+	TStubExtractionMode operationMode = EGetCount;
+	
+	// Get the total file count.	
+	TPckgC<TUid> packageUid(aUid);
+	TPckgC<TStubExtractionMode> packageMode(operationMode);
+	
+	TInt result = SendReceive(EStubFileEntries, TIpcArgs(&packageUid, &packageMode, &filesCount));
+	User::LeaveIfError(result);	
+	
+	TInt totalFilesCount = filesCount();
+	operationMode = EGetFiles;	
+	
+	do
+		{	
+		HBufC8* buffer = HBufC8::NewLC(KDefaultBufferSize);
+	
+		TPtr8 pOutput(buffer->Des());
+		
+		// Fetch the files.	
+		TInt result=SendReceive(EStubFileEntries, TIpcArgs(&packageUid, &packageMode, &pckgStartingFile, &pOutput));
+		User::LeaveIfError(result);
+		
+		// create a stream based on the buffer
+		RDesReadStream stream(*buffer);
+		CleanupClosePushL(stream);
+		
+		// reassemble the array from the stream
+		InternalizePointerArrayL(aFiles, stream);
+		
+		CleanupStack::PopAndDestroy(2, buffer); // buffer, stream
+		startingFile = aFiles.Count();	
+		} while (startingFile < totalFilesCount);	
+	}
+
+#ifdef SYMBIAN_UNIVERSAL_INSTALL_FRAMEWORK
+EXPORT_C void RSisRegistryWritableSession::ActivateComponentL(TComponentId aComponentId)
+	{
+	SetComponentStateL(aComponentId, Usif::EActivated);
+	}
+
+EXPORT_C void RSisRegistryWritableSession::DeactivateComponentL(TComponentId aComponentId)
+	{
+	SetComponentStateL(aComponentId, Usif::EDeactivated);
+	}
+
+void RSisRegistryWritableSession::SetComponentStateL(TComponentId aComponentId, TScomoState aState)
+	{
+	TPckgC<TComponentId> packageComponentId(aComponentId);
+	TPckgC<TScomoState> packageState(aState);	
+	TInt returnCode = SendReceive(ESetComponentState, TIpcArgs(&packageComponentId, &packageState));
+	User::LeaveIfError(returnCode);
+	}
+#endif