emailservices/emailstore/message_store/client/api/MsgStorePropertyContainer.h
changeset 0 8466d47a6819
child 8 e1b6206813b4
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/emailservices/emailstore/message_store/client/api/MsgStorePropertyContainer.h	Thu Dec 17 08:39:21 2009 +0200
@@ -0,0 +1,358 @@
+/*
+* 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:  Message store property collection.
+*
+*/
+
+
+
+#ifndef __MSG_STORE_PROPERTY_CONTAINER_H__
+#define __MSG_STORE_PROPERTY_CONTAINER_H__
+
+#include <e32base.h>
+//<cmail>
+#include "MsgStoreTypes.h"
+#include "MsgStoreAddress.h"
+//</cmail>
+
+/**
+ * Internal property value storage
+ */
+struct TMsgStoreProperty
+{
+	RBuf8                      iName;
+	RBuf8                      iValue;
+	TPtrC16                    iValue16;
+	TMsgStorePropertyValueType iType;
+	
+	inline ~TMsgStoreProperty() {iName.Close(); iValue.Close();}
+
+}; // end TMsgStoreProperty
+
+/** This class defines a collection of name/value pairs.
+
+	This class represents a collection of properties (i.e. name/value pairs) and provides functions
+	to add/update/remove/find the properties.
+	
+	The maximum length for property names is 255 characters.  Functions will leave with KErrUnderflow if
+	a zero length property name is given, and will leave with KErrOverflow if the property name is too
+	long.
+	
+	The maximum length for property values is 65535 bytes.  Functions will leave with KErrOverflow if the
+	property value is too long.	
+*/
+class CMsgStorePropertyContainer : public CBase
+	{
+	public:
+
+		/** Creates a property container. */
+		IMPORT_C static CMsgStorePropertyContainer* NewL();
+		
+		virtual ~CMsgStorePropertyContainer();
+	
+		/** Returns the ID of the container in storage (KMsgStoreInvalid if not yet stored). */
+		IMPORT_C TMsgStoreId Id() const;
+	
+		/** Returns the parent ID of the container in storage (KMsgStoreInvalid if not yet stored). */
+		IMPORT_C TMsgStoreId ParentId() const;
+
+		/** Returns the total number of properties. */
+		IMPORT_C TUint PropertyCount() const;
+		
+		/** Returns the name of the given property.
+		
+			\note: This function will leave with KErrNotFound if an invalid property index is provided.
+		*/
+		IMPORT_C const TDesC8& PropertyNameL( TUint aPropertyIndex ) const;
+		
+		/** Returns the type of value of the given property.
+		
+			\note: This function will leave with KErrNotFound if an invalid property index is provided.
+		*/		
+		IMPORT_C TMsgStorePropertyValueType PropertyTypeL( TUint aPropertyIndex ) const;
+		
+		/** Returns the value of the given property as a boolean.
+		
+			\note: This function will leave with KErrNotFound if an invalid property index is provided.			
+			\note: This function will leave with KErrArgument if the property value type doesn't match.
+		*/
+		IMPORT_C TBool PropertyValueBoolL( TUint aPropertyIndex ) const;
+		
+		/** Returns the value of the given property as an 8-bit descriptor.
+		
+			\note: This function will leave with KErrNotFound if an invalid property index is provided.			
+			\note: This function will leave with KErrArgument if the property value type doesn't match.
+		*/
+		IMPORT_C const TDesC8& PropertyValueDes8L( TUint aPropertyIndex ) const;
+		
+		/** Returns the value of the given property as a 16-bit descriptor.
+
+			\note: This function will leave with KErrNotFound if an invalid property index is provided.			
+			\note: This function will leave with KErrArgument if the property value type doesn't match.
+		*/		
+		IMPORT_C const TDesC& PropertyValueDesL( TUint aPropertyIndex ) const;
+		
+		/** Returns the value of the given property as an integer. 
+		
+			\note: This function will leave with KErrNotFound if an invalid property index is provided.			
+			\note: This function will leave with KErrArgument if the property value type doesn't match.
+		*/
+		IMPORT_C TUint32 PropertyValueUint32L( TUint aPropertyIndex ) const;
+		
+		/** Returns the value of the given property as an TTime. 
+		
+			\note: This function will leave with KErrNotFound if an invalid property index is provided.			
+			\note: This function will leave with KErrArgument if the property value type doesn't match.
+		*/
+		IMPORT_C void PropertyValueTimeL( TUint aPropertyIndex, TTime& aTime ) const;
+		
+		/** Returns the value of the given property as an Address. 
+		
+			\note: This function will leave with KErrNotFound if an invalid property index is provided.			
+			\note: This function will leave with KErrArgument if the property value type doesn't match.
+		*/
+		IMPORT_C void PropertyValueAddressL( TUint aPropertyIndex, RMsgStoreAddress& aAddress ) const;
+		
+		/** Returns the value of the given property as an property container. 
+		
+			The caller is responsible for deallocating the returned object.
+		
+			\note: This function will leave with KErrNotFound if an invalid property index is provided.			
+			\note: This function will leave with KErrArgument if the property value type doesn't match.
+		*/
+		IMPORT_C CMsgStorePropertyContainer* PropertyValueContainerL( TUint aPropertyIndex ) const;
+		
+		/** Adds a boolean property. 
+
+			\retval Returns the index of the added property.
+		*/
+		IMPORT_C TUint AddPropertyL( const TDesC8& aName, TBool aValue );
+		
+		/** Adds a integer property. 
+
+			\retval Returns the index of the added property.
+		*/
+		IMPORT_C TUint AddPropertyL( const TDesC8& aName, TUint32 aValue );
+		
+		/** Adds an 8-bit descriptor property.
+		
+			\retval Returns the index of the added property.
+		*/	
+		IMPORT_C TUint AddPropertyL( const TDesC8& aName, const TDesC8& aValue );
+	
+		/** Adds a 16-bit descriptor property.
+		
+			\retval Returns the index of the added property.
+		*/	
+		IMPORT_C TUint AddPropertyL( const TDesC8& aName, const TDesC& aValue );
+		
+		/** Adds a TTime property.
+		
+			\retval Returns the index of the added property.
+		*/	
+		IMPORT_C TUint AddPropertyL( const TDesC8& aName, const TTime& aValue );
+		
+		/** Adds a Address property.
+		
+			\retval Returns the index of the added property.
+		*/	
+		IMPORT_C TUint AddPropertyL( const TDesC8& aName, const RMsgStoreAddress& aValue );
+	
+		/** Adds a container property.
+		
+			\retval Returns the index of the added property.
+		*/	
+		IMPORT_C TUint AddPropertyL( const TDesC8& aName, const CMsgStorePropertyContainer& aContainer );
+	
+		/** Updates an 8-bit descriptor property.
+		
+			\note: This function will leave with KErrNotFound if an invalid property index is provided.						
+			\note: This function will leave with KErrArgument if the property value type doesn't match.
+		*/
+		IMPORT_C void UpdatePropertyL( TUint aPropertyIndex, const TDesC8& aValue );
+	
+		/** Updates a 16-bit descriptor property.
+		
+			\note: This function will leave with KErrNotFound if an invalid property index is provided.						
+			\note: This function will leave with KErrArgument if the property value type doesn't match.
+		*/
+		IMPORT_C void UpdatePropertyL( TUint aPropertyIndex, const TDesC& aValue );
+	
+		/** Updates a integer property.
+		
+			\note: This function will leave with KErrNotFound if an invalid property index is provided.						
+			\note: This function will leave with KErrArgument if the property value type doesn't match.
+		*/
+		IMPORT_C void UpdatePropertyL( TUint aPropertyIndex, TUint32 aValue );
+	
+		/** Updates a boolean property.
+		
+			\note: This function will leave with KErrNotFound if an invalid property index is provided.						
+			\note: This function will leave with KErrArgument if the property value type doesn't match.
+		*/
+		IMPORT_C void UpdatePropertyL( TUint aPropertyIndex, TBool aValue );
+		
+		/** Updates a TTime property.
+		
+			\note: This function will leave with KErrNotFound if an invalid property index is provided.						
+			\note: This function will leave with KErrArgument if the property value type doesn't match.
+		*/
+		IMPORT_C void UpdatePropertyL( TUint aPropertyIndex, const TTime& aValue );
+		
+		/** Updates a Address property.
+		
+			\note: This function will leave with KErrNotFound if an invalid property index is provided.						
+			\note: This function will leave with KErrArgument if the property value type doesn't match.
+		*/
+		IMPORT_C void UpdatePropertyL( TUint aPropertyIndex, const RMsgStoreAddress& aValue );
+	
+		/** Updates a container property.
+		
+			\note: This function will leave with KErrNotFound if an invalid property index is provided.						
+			\note: This function will leave with KErrArgument if the property value type doesn't match.
+		*/
+		IMPORT_C void UpdatePropertyL( TUint aPropertyIndex, const CMsgStorePropertyContainer& aContainer );
+	
+		/** Adds or updates a boolean property. 
+
+			If a property with the given name already exists then the first instance of the property will
+			be updated.  If not, the property will be added.
+		
+			\note: This function will leave with KErrArgument if the property already exists and the
+			       value type doesn't match.
+			
+			\retval Returns the index of the added or updated property.
+		*/
+		IMPORT_C TUint AddOrUpdatePropertyL( const TDesC8& aName, TBool aValue );
+		
+		/** Adds or updates a integer property. 
+
+			If a property with the given name already exists then the first instance of the property will
+			be updated.  If not, the property will be added.
+		
+			\note: This function will leave with KErrArgument if the property already exists and the
+			       value type doesn't match.
+			
+			\retval Returns the index of the added or updated property.
+		*/
+		IMPORT_C TUint AddOrUpdatePropertyL( const TDesC8& aName, TUint32 aValue );
+		
+		/** Adds or updates an 8-bit descriptor property.
+		
+			If a property with the given name already exists then the first instance of the property will
+			be updated.  If not, the property will be added.
+		
+			\note: This function will leave with KErrArgument if the property already exists and the
+			       value type doesn't match.
+			
+			\retval Returns the index of the added or updated property.
+		*/	
+		IMPORT_C TUint AddOrUpdatePropertyL( const TDesC8& aName, const TDesC8& aValue );
+	
+		/** Adds or updates a 16-bit descriptor property.
+		
+			If a property with the given name already exists then the first instance of the property will
+			be updated.  If not, the property will be added.
+		
+			\note: This function will leave with KErrArgument if the property already exists and the
+			       value type doesn't match.
+			
+			\retval Returns the index of the added or updated property.
+		*/	
+		IMPORT_C TUint AddOrUpdatePropertyL( const TDesC8& aName, const TDesC& aValue );
+		
+		/** Adds or updates a TTime property.
+		
+			If a property with the given name already exists then the first instance of the property will
+			be updated.  If not, the property will be added.
+		
+			\note: This function will leave with KErrArgument if the property already exists and the
+			       value type doesn't match.
+			
+			\retval Returns the index of the added or updated property.
+		*/	
+		IMPORT_C TUint AddOrUpdatePropertyL( const TDesC8& aName, const TTime& aValue );
+	
+		/** Adds or updates an Address property.
+		
+			If a property with the given name already exists then the first instance of the property will
+			be updated.  If not, the property will be added.
+		
+			\note: This function will leave with KErrArgument if the property already exists and the
+			       value type doesn't match.
+			
+			\retval Returns the index of the added or updated property.
+		*/	
+		IMPORT_C TUint AddOrUpdatePropertyL( const TDesC8& aName, const RMsgStoreAddress& aValue );
+		
+		/** Adds or updates a container property.
+		
+			If a property with the given name already exists then the first instance of the property will
+			be updated.  If not, the property will be added.
+		
+			\note: This function will leave with KErrArgument if the property already exists and the
+			       value type doesn't match.
+			
+			\retval Returns the index of the added or updated property.
+		*/	
+		IMPORT_C TUint AddOrUpdatePropertyL( const TDesC8& aName, const CMsgStorePropertyContainer& aContainer );
+	
+		/** Removes a property.
+		
+			\note: This function will leave with KErrNotFound if an invalid property index is provided.			
+		*/
+		IMPORT_C void RemovePropertyL( TUint aPropertyIndex );
+
+		/** Finds a property based on name, starting at the given index.
+		
+			\retval Returns ETrue if the property was found, EFalse otherwise.
+		*/		
+		IMPORT_C TBool FindProperty( const TDesC8& aName, TUint& aFoundIndex, TUint aStartIndex = 0 ) const;
+
+		// ---------------------------
+		// INTERNAL USE (NOT EXPORTED)
+		// ---------------------------
+		
+		void SerializeL( RBuf8& aBuffer ) const;
+		
+		void DeserializeL( const TDesC8& aBuf );
+		
+		void SetIds( TMsgStoreId aId, TMsgStoreId aParentId );
+
+	protected:
+		
+		CMsgStorePropertyContainer();
+
+        void ValidateIndexL( TUint aIndex ) const;
+
+		TMsgStoreId                      iId;
+		TMsgStoreId                      iParentId;		
+        RPointerArray<TMsgStoreProperty> iProperties;
+        
+    private:
+    	TUint AddPropertyL( const TDesC8& aName, const CMsgStorePropertyContainer& aContainer, TMsgStorePropertyValueType aType );
+    	void UpdatePropertyL( TUint aPropertyIndex, const CMsgStorePropertyContainer& aContainer, TMsgStorePropertyValueType aType );
+    	CMsgStorePropertyContainer* CMsgStorePropertyContainer::PropertyValueContainerL( TUint aPropertyIndex, TMsgStorePropertyValueType aType ) const;   
+    	
+        void ValidateIndexAndTypeL( TUint aIndex, TMsgStorePropertyValueType aType ) const;
+        void ValidateLengthsL( TUint aNameLength, TUint aValueLength ) const;
+        void ValidateValueLengthL( TUint aValueLength ) const;
+		
+		TUint DoAddPropertyL( TMsgStorePropertyValueType aType, const TDesC8& aName, const TDesC8& aValue );
+        void DoUpdatePropertyL( TUint aPropertyIndex, TMsgStorePropertyValueType aType, const TDesC8& aValue );
+        
+	}; // end class CMsgStorePropertyContainer
+		
+
+#endif  //__MSG_STORE_PROPERTY_CONTAINER_H__
\ No newline at end of file