uiacceltk/hitchcock/plugins/alftranseffect/alftranseffectplugin/inc/alfpolicyrequesthandler.h
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/uiacceltk/hitchcock/plugins/alftranseffect/alftranseffectplugin/inc/alfpolicyrequesthandler.h Tue Feb 02 07:56:43 2010 +0200
@@ -0,0 +1,290 @@
+/*
+* Copyright (c) 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: Handles sending policy updates to connected clients.
+*
+*/
+
+
+#ifndef __ALFPOLICYREQUESTHANDLER
+#define __ALFPOLICYREQUESTHANDLER
+
+//======= System includes =======
+#include <e32cmn.h>
+#include <e32base.h>
+#include <s32file.h>
+
+//======= User includes =======
+#include "alfpolicy.h"
+//#include "tfxserverclient.h"
+
+//======= Forward declarations =======
+class CPolicyHandler;
+class CPolicyClientRequestHandler;
+
+/**
+ * Helper class.
+ * This is basically a copy of the class that has already been defined in
+ * policy.h. The difference between this class and the original one is the destructor
+ * This class does not call ResetAndDestroy on iControlPolicies since these are
+ * copies of the original ones.
+ * This class is used when retrieving the original policies that are already stored
+ * in the system.
+ * This class works as a container class and is friend with the classes that used it.
+ *
+ * @since S60 3.2
+ */
+NONSHARABLE_CLASS(CClientControlPolicy) : public CBase
+ {
+public:
+ CClientControlPolicy();
+ ~CClientControlPolicy();
+private:
+ friend class CPolicyClientRequestHandler;
+ friend class CPolicyHandler;
+ friend class CPolicyEventReq;
+ TUid iUid;
+ RBuf16 iResourceDir;
+ RBuf16 iFilename;
+ RPointerArray<CActionPolicy> iControlPolicies; // Never destroy this!
+ };
+
+/*
+ * Helper class to handle transmission of policies when a client requests one
+ * This is created the first time a client connects and requests policies.
+ * This class works as a container class and is friend with the classes that used it.
+ *
+ * Since S60 V3.1
+ */
+NONSHARABLE_CLASS(CPolicyEventReq) : public CBase
+ {
+public:
+ CPolicyEventReq();
+ ~CPolicyEventReq();
+ TUint TotalPolicyCount() const;
+private:
+ friend class CPolicyClientRequestHandler;
+ TThreadId iClientId;
+ RMessagePtr2 iMessage;
+ RPointerArray<CClientControlPolicy> iOriginalControlPolicies; // Original already stored policies
+ RPointerArray<TControlPolicy> iAddedPolicies; // Recently added policies
+ RPointerArray<TControlPolicy> iRemovedPolicies; // Recently removed policies.
+ };
+
+/**
+ * Handler class for Client policies.
+ * Keeps track of which clients have received which policies.
+ * @since S60 3.2
+ */
+NONSHARABLE_CLASS(CPolicyClientRequestHandler) : public CBase
+ {
+public:
+ CPolicyClientRequestHandler(CPolicyHandler* aParent);
+ ~CPolicyClientRequestHandler();
+ /**
+ * Adds or update a policy for all connected clients.
+ *
+ * @since S60 3.2
+ *
+ * @param aAction The action ID of the policy that is to be updated.
+ * @param aUid the UID of the policy that is to be updated.
+ * @param The policy that is to be set on the policy that
+ * corresponds to the previous parameters.
+ * @return
+ */
+ void RegisterControlAction(const TUid aUid, TUint aAction);
+
+ /**
+ * Removes a Control policy. This will remove a policy either from
+ * the retrieved original policies, the recently added policies. If
+ * none of the above apply, it creates a policy that will be sent to
+ * the client letting the client know that the specified policy has
+ * been removed from the system. For a policy to be removed both aAction
+ * and aUid must be set in a policy item.
+ *
+ * @since S60 3.2
+ *
+ * @param aAction Action contained in the policy to be removed.
+ * @param aUid UID contained in the policy that is to be removed.
+ */
+ TInt RemoveControlPolicy(const TUid aUid, TUint aAction );
+
+ /**
+ * Handles policyrequest fro mthe client. If there are no polices
+ * waiting for this client, the message will be stored away and completed
+ * when a new policy is added. This policy may either be a new policy, updated
+ * policy or remove policy request.
+ *
+ * @since S60 3.2
+ *
+ * @param aMessage. Reference to the original message.
+ * @return KErrNone or any of the system error code.
+ */
+ TInt RequestPolicy(const RMessage2& aMessage);
+
+ /**
+ * Handles GetPolicy request from a client. The message that is received
+ * from the client must conatain a TTServerControlPolicy at position 0.
+ * The TTServerControlPolicy structure is filled with data from a waiting policy.
+ * Policies are sent in a LIFO way.
+ *
+ * @since S60 3.2
+ *
+ * @param aClientId id of the client that wants the policies
+ * @param aPolicyCount number of policies the caller can handle
+ * @param aOutBuf the buffer that will be filled with the policies
+ * @return KErrNone or any of the system error messages.
+ */
+ TInt GetPolicyL( TThreadId aClientId, TInt aPolicyCount, TPtr8& aOutBuf );
+
+ /**
+ * Removes all data that is used for a client.
+ *
+ * @param aClientId client id
+ */
+ void RemoveClient( TThreadId aClientId );
+
+ /**
+ * Removes all requests that belong to terminated clients.
+ *
+ * @since S60 3.2
+ */
+ void RemoveDeadClients();
+
+ /**
+ * Dumps a list of threadids of all connected clients waiting for
+ * policy updates
+ *
+ * Used for testing
+ * @since S60 3.2
+ *
+ * @param aFile an open write stream to dump clients to.
+ */
+ void DumpClientsL(RFileWriteStream& aFile);
+
+ /**
+ * Return total number of policies
+ */
+ TUint TotalPolicyCount() const;
+
+private:
+
+ /**
+ * Inserts a client into the client list. This method also retrieves
+ * all policies that already have been stored in the system. If no
+ * policies exist, the message is stored for later copletion when a new
+ * policye gets inserted.
+ *
+ * @since S60 3.2
+ *
+ * @param aMessage. Reference to the original message.
+ * @return KErrNone or one of the system error codes.
+ *
+ */
+ TInt InsertClient(const RMessage2& aMessage);
+
+ /**
+ * Searches the iAddedPolicies array for a UID corresponding to the inserted UID. If not found,
+ * it creates a new CControlPolicy entry and adds a TActionPolicy. If the UID is found, it calls
+ * AddControlPolicy.
+ *
+ * @since S60 3.2
+ *
+ * @param aPtr RPointerArray containing a list of CControlPolicies.
+ * @param aUid UID to add.
+ * @param aAction. Action to add.
+ * @param aPolicy. Policy to set.
+ * @return KErrNone if CControlPolicy contaning UID was found or created. Otherwise KErrNoMemory or
+ * one of the system error messages.
+ */
+ TInt AddControlPolicyAction( RPointerArray<TControlPolicy>& aAddedPolicies,
+ RPointerArray<TControlPolicy>& aRemovedPolicies,
+ const TUid aUid, TUint aAction);
+
+ /**
+ * Searches the retrieved list of policies for a policy corresponding to the UID and action.
+ *
+ * @since S60 3.2
+ *
+ * @param aPtr. Pointer array containing a list of policies.
+ * @param aUid. UID to search for.
+ * @param aAction. Action to search for.
+ * @return KErrNone if found otherwise KErrNotFound.
+ */
+ TInt CheckStoredControlPolicy(RPointerArray<CClientControlPolicy>& aPtr, const TUid aUid, TUint aAction);
+
+ /**
+ * Searches for a CControlPolicy object containing the UID inserted. If found, it calls RemovePolicyInfo.
+ * If the CControlPolicy object doesn't contain any policy actions after the call, it will be removed.
+ *
+ * @since S60 3.2
+ *
+ * @param aPolUid. Array containing pointers to CControlPolicy objects.
+ * @param aAction. Action of the policy to remove.
+ * @param aUid. UID of the policy to remove.
+ * @return KErrNone if policy is removed, KErrNotFound if policy is not found or one of
+ * the system error codes.
+ */
+ TInt RemovePolicyUid(RPointerArray<TControlPolicy>& aPolUid, TUint aAction, const TUid aUid);
+
+ /**
+ * Searches for a CClientControlPolicy object containing the UID inserted. If found, it calls
+ * RemovePolicyInfo. If the CClientControlPolicy object doesn't contain any policy actions after
+ * the call, it will be removed.
+ *
+ * @since S60 3.2
+ *
+ * @param aPolUid. Array containing pointers to CClientControlPolicy objects.
+ * @param aAction. Action of the policy to remove.
+ * @param aUid. UID of the policy to remove.
+ * @return KErrNone if policy is removed, KErrNotFound if policy is not found or one of
+ * the system error codes.
+ */
+ TInt RemovePolicyUid(RPointerArray<CClientControlPolicy>& aPolUid, TUint aAction, const TUid aUid);
+
+ /**
+ *
+ * @since S60 3.2
+ *
+ * @param aPolInfo. Reference to a pointer array containing a list of policy actions.
+ * @param aAction. Action to delete.
+ * @param aDelete. If ETrue, really delete the pointer otherwise, only remove the pointer from
+ * the pointerarray with Remove()
+ * @return KErrNone
+ */
+ TInt RemovePolicyInfo(RPointerArray<CActionPolicy>& aPolInfo, TUint aAction, TBool aDelete = EFalse);
+
+private: //data
+ // Array containing identifiers of connected clients.
+ RPointerArray<CPolicyEventReq> iControlPolicyClients;
+
+// Having everything in one array did not work very well, must keep the original implementation
+// for the time being
+// We have only one client (singleton, so we store everything in one place.
+// It should be simpler to have only one set or arrays to keep up to date
+// RPointerArray<CClientControlPolicy> iOriginalControlPolicies; // Original already stored policies
+// RPointerArray<TControlPolicy> iAddedPolicies; // Recently added policies
+// RPointerArray<TControlPolicy> iRemovedPolicies; // Recently removed policies.
+// I assume that there can be only one pending message (because we are called by a singleton).
+// If there can be more, we must make this an array.
+// We leave this to CPolicyEventReq for the time being...
+// RMessagePtr2 iMessage;
+
+ // Pointer to main class for GetAllPolicies. Not owned!
+ CPolicyHandler* iParent;
+
+ };
+
+
+
+#endif // __ALFPOLICYREQUESTHANDLER
\ No newline at end of file