installationservices/swi/inc/sishelper.h
changeset 0 ba25891c3a9e
child 81 42552535c1ac
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/installationservices/swi/inc/sishelper.h	Thu Dec 17 08:51:10 2009 +0200
@@ -0,0 +1,189 @@
+/*
+* 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: 
+* SISHelper server header file
+*
+*/
+
+
+/**
+ @file 
+ @internalTechnology
+*/
+
+#ifndef __SISHELPER_H__
+#define __SISHELPER_H__
+
+#include "sisdataprovider.h"
+#include "sishelperclient.h"
+
+ 
+namespace Swi
+{
+
+namespace Sis
+	{
+	class CContents;
+	}
+
+/**
+ * Timer that shuts down SISHelper server if it is idle for a predefined 
+ * amount of time.
+ *
+ * @internalTechnology
+ * @released
+ */
+class CSisHelperSession;
+class CSisHelperShutdown : public CTimer
+	{
+#ifdef __WINS__ // Occassionally, there are transient problems in the emulator that cause the timer to kick in sooner than needed (DEF104102)
+	enum {KShutdownDelay=5*1000*1000}; // 5 seconds
+#else
+	enum {KShutdownDelay=2*1000*1000}; // 2 seconds
+#endif
+public:
+	inline CSisHelperShutdown();
+	virtual ~CSisHelperShutdown();
+	inline void ConstructL();
+	inline void Start();
+private:
+	void RunL();
+	};
+
+/**
+ * This class provides interface for SWIS to get SIS file data and other 
+ * parameters. Since the only think using it is SWIS, the SisHelper client 
+ * code is built into SWIS and is not available to any other program.
+ *
+ * @internalTechnology
+ * @released
+ */
+class CSisRegistryPackage;
+class CSisHelperServer : public CPolicyServer
+	{
+public:
+	IMPORT_C static CSisHelperServer* NewLC(TSisHelperStartParams& aParams);
+	IMPORT_C static CSisHelperServer* NewL(TSisHelperStartParams& aParams);
+	~CSisHelperServer();
+	void AddSession();
+	void DropSession();
+	TInt GetSisFileDrive();
+	TBool IsSisFileReadOnly();
+	const TDesC& GetSisFileNameL();
+	
+private:
+	CSisHelperServer();
+	void ConstructL(TSisHelperStartParams& aParams);
+	CSession2* NewSessionL(const TVersion& aVersion, 
+		const RMessage2& aMessage) const;
+
+	// Starting SISHelper
+public:
+	/// Gets the main package entry associated with a UID. Ownership is transferred to the client.
+	static CSisRegistryPackage* MainPackageEntryL(TUid aUid); 
+	static TInt StartSisHelper(TSisHelperStartParams& aParams, RThread& aServer);
+	static void Abort();
+private:
+	static TInt SisHelperThreadFunction(TAny* aPtr); // SISHelper thread EP
+
+private:
+	TInt iSessionCount;
+	CSisHelperShutdown* iShutdown; ///< Ensures the server is there for client
+	
+	/**
+	 * Data provider instance implementation pointer; if a pointer to it is 
+	 * passed when creating the server, it is just stored in this member.
+	 * If a file name is passed,  a file data provider is created and 
+	 * stored in this member.
+	 */
+	MSisDataProvider* iDataProvider;
+	TBool iDeleteDataProvider;
+	RFs iFs;
+	TBool iSessionConnected;
+	TInt iSisFileDrive;
+	TBool iSisFileReadOnly;
+	HBufC* iSisFileName;
+	
+private:
+	// Server Policies
+  	static const TUint iRangeCount=1;
+  	static const TInt iRanges[iRangeCount];
+  	static const TUint8 iElementsIndex[iRangeCount];
+  	static const CPolicyServer::TPolicyElement iPolicyElements[2];
+  	static const CPolicyServer::TPolicy iPolicy;
+	};
+
+/**
+ * SISHelper server session class that serves requests from SWIS
+ *
+ * @internalTechnology
+ * @released
+ */
+class CSisHelperSession : public CSession2
+	{
+public:
+	CSisHelperSession(MSisDataProvider& aDataProvider);
+	void CreateL();
+	void Send(const TDesC& aMessage);
+private:
+	~CSisHelperSession();
+	inline CSisHelperServer& Server();
+	void ServiceL(const RMessage2& aMessage);
+	void ServiceError(const RMessage2& aMessage, TInt aError);
+	inline TBool ReceivePending() const;
+	
+	void GetControllerL(const RMessage2& aMessage);
+	void ExtractFileL(const RMessage2& aMessage);
+	void CreateSisStubL(const RMessage2& aMessage);
+	void IsStubL(const RMessage2& aMessage);
+	void IsDrmProtectedL(const RMessage2& aMessage);
+	void GetEquivalentLanguagesL(const RMessage2& aMessage);
+	void GetSisFileDriveL(const RMessage2& aMessage);
+	void IsSisFileReadOnlyL(const RMessage2& aMessage);
+	void GetSisFileNameL(const RMessage2& aMessage);
+	void GetControllerFromSisL(const RMessage2& aMessage);
+
+	// Functions for asynchronous extraction
+	void SetupAsyncExtractionL(const RMessage2& aMessage);
+	void AsyncExtractionL(const RMessage2& aMessage);
+	void EndAsyncExtractionL(const RMessage2& aMessage);
+	void CleanupAsyncExtractionL();
+	/**
+	 * Utility function that supply SWIS with drive and free space information
+	 *
+	 * @param aDriveLetters Array of drive letters available for installation
+	 * @param aDriveSpaces  Array of drive free spaces for installation
+	 */
+	static void FillDrivesAndSpacesL(RArray<TChar>& aDriveLetters, 
+		RArray<TInt64>& aDriveSpaces);
+
+	// access the current Contents object
+	Sis::CContents& CurrentContentsL();
+private:
+	RMessagePtr2 iReceiveMsg;
+	TInt iReceiveLen;
+	MSisDataProvider& iDataProvider;
+	Sis::CContents* iCurrentContents;
+
+	// Members for asynchronous extraction
+	RFs iAsyncFs;
+	RFile iAsyncFile;
+	TBool iInAsyncExtraction;
+	TInt32 iAsyncFileIndex;
+	TInt32 iAsyncDataUnit;
+	};
+
+} // namespace Swi
+
+#endif // __SISHELPER_H__