mmappcomponents/mmmtpdataprovider/mmmtpdprequestprocessor/inc/crequestchecker.h
changeset 0 a2952bb97e68
child 17 780c925249c1
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mmappcomponents/mmmtpdataprovider/mmmtpdprequestprocessor/inc/crequestchecker.h	Thu Dec 17 08:55:47 2009 +0200
@@ -0,0 +1,225 @@
+/*
+* Copyright (c) 2009 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: 
+*
+*/
+
+
+#ifndef CREQUESTCHECKER_H
+#define CREQUESTCHECKER_H
+
+#include <e32base.h>
+#include <mtp/mtpprotocolconstants.h>
+#include <mtp/tmtptyperequest.h>
+
+class CMTPObjectMetaData;
+class MMTPDataProviderFramework;
+class MMTPConnection;
+
+/**
+* element type in the request
+*/
+enum TMTPElementType
+    {
+    /**
+    * Session ID type
+    */
+    EMTPElementTypeSessionID,
+
+    /**
+    * Object Handle type
+    */
+    EMTPElementTypeObjectHandle,
+
+    /**
+    * Format code type
+    */
+    EMTPElementTypeFormatCode,
+
+    /**
+    * Storeage Id type
+    */
+    EMTPElementTypeStorageId,
+    };
+
+/**
+* element attribute to check in the reqeust
+*/
+enum TMTPElementAttr
+    {
+    /**
+    * no attribute to check
+    */
+    EMTPElementAttrNone = 0x0000,
+
+    /**
+    * the object/storage should be readable
+    */
+    EMTPElementAttrRead = 0x0001,
+
+    /**
+    * the object/storage should be writable
+    */
+    EMTPElementAttrWrite = 0x0002,
+
+    /**
+    * the object should be a file
+    */
+    EMTPElementAttrFile = 0x0004,
+
+    /**
+    * the object should be a directory
+    */
+    EMTPElementAttrDir = 0x0008,
+
+    /**
+    * supported format array
+    */
+    EMTPElementAttrFormatEnums = 0x0010,
+
+    /**
+    * The object can be either a file or directory.
+    */
+    EMTPElementAttrFileOrDir = 0x0020,
+    };
+
+/**
+* defines the verification data structure
+*/
+struct TMTPRequestElementInfo
+    {
+    TMTPTypeRequest::TElements iElementIndex; //which element in the request to check
+    TMTPElementType iElementType; //the type of the element
+    TInt iElementAttr; //the attribute of the element
+    TInt iCount; //number of special values (0, 1, 2)
+    TUint32 iValue1; //special value 1
+    TUint32 iValue2; //special value 2
+    };
+
+/**
+* defines a generic request verification class.  It iterates through the verification data elements,
+* and performs the check based on the element type/attribute.
+*/
+class CRequestChecker : public CBase
+    {
+public:
+    /**
+    * Two-phase construction method
+    * @param aFramework   The data provider framework
+    * @param aConnection  The connection object
+    * @return a pointer to the created request checker object
+    */
+    static CRequestChecker* NewL( MMTPDataProviderFramework& aFramework,
+            MMTPConnection& aConnection );
+
+    /**
+    * Destructor
+    */
+    ~CRequestChecker();
+
+    /**
+    * Verfiy the request.  It check the request header first (session id and transaction code), and check for special values, last
+    * it iterates through the verification elements for checking individul parameters in the request
+    * @param aRequest The request object to verify
+    * @param aCount   The number of verification elements
+    * @param aElementInfo The array of verification elements
+    * @return reponse code to return to the initiator
+    */
+    TMTPResponseCode VerifyRequestL( const TMTPTypeRequest& aRequest,
+        TInt aCount,
+        const TMTPRequestElementInfo* aElementInfo );
+
+    /**
+    * Return the object info for the handle.
+    * This is to remove extra expensive DMBS retrieval operations.
+    * @param aHandle  the handle of the object requested
+    * @return an object info for the handle
+    */
+    CMTPObjectMetaData* GetObjectInfo( TUint32 aHandle ) const;
+
+private:
+    /**
+    * Check the request header portion (session Id and transaction code)
+    * @param aRequest the request object to check
+    * @return repsonse code to return to initiator
+    */
+    TMTPResponseCode CheckRequestHeader( const TMTPTypeRequest& aRequest ) const;
+
+    /**
+    * Check the session id in the request parameter (NOTE the session id is different from the one in the request header),
+    * this usually only applies to the OpenSession request
+    * @param aSessionId   Session id of the request.
+    * @param aElementInfo ElementInfo data array to check against.
+    * @return repsonse code to return to initiator
+    */
+    TMTPResponseCode VerifySessionId( TUint32 aSessionId,
+        const TMTPRequestElementInfo& aElementInfo ) const;
+
+    /**
+    * Check the object handle in the request parameter, whether the handle is in the object store, read/write, file/dir
+    * @param aHandle  Object handle to be checked.
+    * @param aElementInfo Element info array to be checked against.
+    * @return repsonse code to return to initiator
+    */
+    TMTPResponseCode VerifyObjectHandleL( TUint32 aHandle,
+        const TMTPRequestElementInfo& aElementInfo );
+
+    /**
+    * Check the storage id parameter in the request, read/write attributes
+    * @param aStorageId   Storage id to be checked.
+    * @param aElementInfo Element info array to be checked against.
+    * @return repsonse code to return to initiator
+    */
+    TMTPResponseCode VerifyStorageIdL( TUint32 aStorageId,
+        const TMTPRequestElementInfo& aElementInfo ) const;
+
+    /**
+    * Check the format code parameter in the request,
+    * @param aStorageId   aFormatCode to be checked.
+    * @param aElementInfo Element info array to be checked against.
+    * @return repsonse code to return to initiator
+    */
+    TMTPResponseCode VerifyFormatCode( TUint32 aFormatCode,
+        const TMTPRequestElementInfo& aElementInfo ) const;
+
+    /**
+    * Check if the parameter is one of the special values
+    * @param aParameter   The parameter value in the request
+    * @param aElementInfo The ElementInfo for the parameter
+    * @return ETrue if the parameter is one of the special values, otherwise, EFalse
+    */
+    TBool IsSpecialValue( TUint32 aParameter,
+        const TMTPRequestElementInfo& aElementInfo ) const;
+
+private:
+    /**
+    * Standard c++ constructor
+    */
+    CRequestChecker( MMTPDataProviderFramework& aFramework,
+        MMTPConnection& aConnection );
+    
+    /**
+    * Two-phase construction
+    */
+    void ConstructL();
+
+private:
+    MMTPDataProviderFramework& iFramework;
+    MMTPConnection& iConnection;
+    RArray<TUint32> iHandles; //these two arrays contain the mapping from the handle to objectinfo
+    RPointerArray<CMTPObjectMetaData> iObjectArray;
+    
+    };
+
+#endif // CREQUESTCHECKER_H