--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/phonebookengines/contactsmodel/cntvcard/cntvcardutils.h Tue Feb 02 10:12:17 2010 +0200
@@ -0,0 +1,260 @@
+// Copyright (c) 2003-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 __CNTVCARDUTILS_H__
+#define __CNTVCARDUTILS_H__
+
+#include <cntvcard.h>
+#include "pbapconverter.h"
+
+// Constants
+const TUint KContactVCardSpaceCharacter = 0x20;
+const TInt KContactMaxVCardPropertyNameLength=75;
+const TInt KContactStandardCardValueLength=40;
+_LIT(KSingleSpacePropertyValue," ");
+
+// Literal constants
+_LIT8(KContactVCardXDashEPOCCNTMODEL,"X-EPOCCNTMODEL");
+_LIT(KContactVarVCardXDashEPOCCNTMODEL,"X-EPOCCNTMODEL");
+_LIT(KContactVCardFIELDLABEL,"FIELDLABEL");
+_LIT8(KContactVCardLABELn,"LABEL%d");
+_LIT(KContactVarVCardLABELn,"LABEL%d");
+_LIT(KContactVCardLABEL0 ,"LABEL0");
+_LIT(KContactVCardLABEL1 ,"LABEL1");
+_LIT(KContactVCardLABEL2 ,"LABEL2");
+_LIT(KContactVCardLABEL3 ,"LABEL3");
+_LIT(KContactVCardLABEL4 ,"LABEL4");
+_LIT(KContactVCardLABEL5 ,"LABEL5");
+_LIT(KContactVCardLABEL6 ,"LABEL6");
+_LIT(KContactVCardFIELDHIDDEN,"FIELDHIDDEN");
+_LIT(KContactVCardFIELDREADONLY,"FIELDREADONLY");
+//
+_LIT(KContactVCardCompositeSupportedButEmptyFieldValue, " ");
+_LIT(KContactVCardCompositeUnsupportedFieldValue, "");
+_LIT(KContactVCardNonCompositeEmptyFieldValue, "");
+_LIT(KContactVCardEmptyFieldValue, "");
+_LIT8(KVersitTokenSIPID,"X-SIP");
+_LIT8(KVersitParamPOC,"POC");
+_LIT8(KVersitParamSWIS,"SWIS");
+_LIT8(KVersitParamVOIP,"VOIP");
+_LIT8(KVersitTokenWVID,"X-WV-ID");
+
+
+/**
+Export converter, Converts contact items into vCard objects.
+also provides support for export of contacts to PBAP client.
+ */
+class CContactsAppToVCardConverter : public CBase
+ {
+public:
+ ~CContactsAppToVCardConverter();
+ CContactsAppToVCardConverter(TInt64 aMachineUniqueId, Versit::TVersitCharSet aCharSet, TVCardVersion aVCardVersion);
+ CParserVCard* GetContactItemAsVCardL(CContactItem* aMainItem, CArrayPtr<CContactItem>* aAgentItemArray, TInt aOption, TBool aExportPrivateFields);
+ void SetFilter(TInt64 aFilter);
+ TBool NeedsToBeExported(TPBAPProperties aProp) const;
+ TBool IsPBAPExport()const;
+private:
+ void EncodeItemPropertiesL(const CContactItem& aContactItem,TInt aOption);
+ void EncodeFieldPropertiesL(const CContactItem& aContactItem, CArrayPtr<CContactItem>* aAgentItemArray, TInt aOption, TBool aExportPrivateFields);
+ void GetVCardNamePrnL(CContactItemFieldSet& aFields,TInt aOption,TBool aExportPrivateFields);
+ void GetVCardNameL(CContactItemFieldSet& aFields,TInt aOption, TBool aExportPrivateFields);
+ void GetVCardAddressL(const CContactItem& aContact, TUid aVCardMapping, const TDesC8& aToken, TInt aOption, TBool aExportPrivateFields);
+ void MapContactFieldToVCardPropertyL(const CContactItemField& aField,CContactItem* aAgent,TInt aOption,TInt aDuplicateCount,TBool aExportPrivateFields);
+ void MapContactMappingToVCardPropertyNameAndTypeL(const CContentType& aContactType,TDes8& aName,TUid& aPropertyUid,CArrayPtr<CParserParam>* aArrayOfParams) const;
+ void RetrieveAddressFieldL(const CContactItemFieldSet& aFields, CArrayPtr<CParserParam>& aParams, CDesCArrayFlat& aDesArray, TFieldType aFieldType, TUid aMapping, const TDesC& aLabel, TInt aOption, TBool& aFound,TBool aExportPrivateFields,TBool aWithoutPref=ETrue) const;
+ TBool LocateSpecificNameValueL(const CContactItemFieldSet& aFieldSet, TUid aSearchField, CDesCArray& aPropValueArray, CArrayPtr<CParserParam>& aPropParamArray, const TDesC& aLabelPrefix, TInt aOption, TBool aExportPrivateFields);
+ static CParserPropertyValueDateTime* CreateDateTimePropertyL(const TTime& aDateTime, TVersitDateTime::TRelativeTime aRelativeTime);
+ static CParserPropertyValueDate* CreateDatePropertyL(const TTime& aDateTime);
+ void GetVCardOrgInfoL(const CContactItemFieldSet& aFields, TInt aOption, TBool aExportPrivateFields);
+ void RemoveNewLineL(CDesCArray& aPropValueArray, const TPtrC& aFieldContents);
+ TVCardVersion GetExportVersion()const;
+ void GetVCardFormattedNameL(CContactItemFieldSet& aFields, TInt aOption, TBool aExportPrivateFields);
+ TPBAPProperties AttributeFromMapping(TUid aMapping) const;
+ TBool DefaultInternetParameterRequired(const CContentType& aContactType) const;
+ void AddParamToArrayL(CArrayPtr<CParserParam>* aArrayOfParams, CParserParam* aParserParam, TInt32 aMappingUid, TInt32 aFieldTypeUid) const;
+private: // UTILITY methods
+ static TInt FindAddressFieldByMappingAndType(const CContactItemFieldSet& aFields, TFieldType aFieldType, TUid aMapping);
+
+private:
+ CParserVCard* iVCard;
+ TInt64 iMachineUniqueId;
+ Versit::TVersitCharSet iCharSet;
+ TVCardVersion iVCardVersion;
+ TInt64 iFilter;
+ };
+
+
+/**
+ * Import and update converter
+ */
+class CVCardToContactsAppConverter : public CBase
+ {
+public:
+ enum TUnknownPropertyBehaviour
+ {
+ EPreserveAllProperties,
+ EDiscardNonXDashUnknownProperties,
+ EDiscardAllUnknownProperties
+ };
+
+public:
+ CContactItem* GetVCardAsContactItemLC(CParserVCard& aSourceVCard, TUnknownPropertyBehaviour aUnknownPropertyBehaviour, TInt aOption);
+ void GetVCardUidStringL(CParserVCard& aSourceVCard, TDes& aUidString) const;
+ TBool MergeVCardWithContactItemL(CContactItem& aContact,CParserVCard& aSourceVCard,TUnknownPropertyBehaviour aUnknownPropertyBehaviour,TInt aOption);
+
+private:
+ CContactItemField* GetVCardPropertyAsContactFieldLC(CParserProperty* aVCardProperty, TInt aOption,TBool& aUnsupportedProperty);
+ static CContentType* MapVCardPropertyToContentAndStorageTypeL(const CParserProperty& aVCardProperty, TStorageType& aStorageType);
+ //
+ static void GetVCardModifiedTimeL(CParserVCard& aVCard,TTime& aLastModified);
+ static TInt GetVCardPropertyTTNumber(CParserProperty* aVCardProperty);
+ static void DeleteField(CContactItem& aContact, const CContactItemFieldSet& aFieldSet, TFieldType aFieldType, TUid aMapping);
+
+ static void GetContactNameL(CParserVCard& aVCard,CDesCArray* aName,TInt aOption,CDesCArray* aLabels);
+ static TBool GetSpecifiedAddressL(CArrayPtr<CParserProperty>& aProperties, TInt aOption, const TDesC8& aParamMustMatch, const TDesC8& aParamMustNotMatch1, const TDesC8& aParamMustNotMatch2, CDesCArray& aAddressRepository, CDesCArray& aAddressLabelRepository);
+
+ void MergeNameFieldsL(CContactItem& aContact, CVCardItemAndLabel& aNames, TInt aOption, TBool aTreatAsPrn = EFalse);
+ void MergeSpecifiedNameFieldL(CContactItem& aContact, TFieldType aFieldType, CVCardItemAndLabel& aNames, TInt aOption, TInt aNameIndex);
+ void MergeAddressFieldsL(CContactItem& aContact, const CVCardAddress& aAddress, TInt aOption);
+ void MergeSpecifiedAddressFieldL(CContactItem& aContact, const CVCardAddress& aAddresses, const TUid& aFieldUid, const TUid& aMappingUid, TInt aNameIndex, TInt aOption);
+
+
+private: // UTILITY methods
+ TBool TextArrayContainsImportableData(const CDesCArray& aArray) const;
+ static void RemoveWhitespaceFromCompositePropertyL(CDesCArray& aArray);
+ static TFieldType MapVCardPhotoTypeToFieldType(TPtrC8 aBitmapStringPtr);
+ inline void SetImportType(TCntVCardImportType aType) { iImportType = aType; }
+ inline TCntVCardImportType ImportType() const { return iImportType; }
+ HBufC* EncodeL(const TDesC& aText, TBool aTextTobeTruncated) const;
+ TBool PropertyTobeTruncated(const TPtrC8& aFieldName) const;
+ static void GetBitMapFormat(const CParserProperty& aVCardProperty, TFieldType& bitMapFormat);
+ void AdjustForPrefRule(CContactItem& aContactItem, TFieldType aFieldType, TUid aMapping);
+
+private: // NAME handling
+ static void DeleteNameFields(CContactItem& aContact);
+ static CVCardItemAndLabel* GetContactNameLC(CParserVCard& aVCard, TInt aOption);
+ static CVCardItemAndLabel* GetContactNamePrnLC(CParserVCard& aVCard, TInt aOption);
+ void SetNameFieldsL(const CVCardItemAndLabel& aNames, CContactItem& aContact, TInt aOption, TBool aTreatAsPronunciation = EFalse) const;
+ void SetNameFieldL(const CVCardItemAndLabel& aNames, CContactItem& aContact, TInt aOption, TInt aIndex, TFieldType aFieldType, TInt& aInsertPos) const;
+ static CVCardItemAndLabel* MakeNamesFromItemsL(const CDesCArray& aItems, TInt aOption, const CParserProperty* aProperty );
+
+private: // ADDRESS handling
+ static void DeleteAddressFields(CContactItem& aContact, TFieldType aFieldType);
+ static void GetAddressesL(CParserVCard& aVCard, TInt aOption, RPointerArray<CVCardAddress>& aAddresses);
+ static void GetHomeAndWorkAddressL(CParserVCard& aVCard, CDesCArray* aAddressHome, CDesCArray* aAddressWork, TInt aOption, CDesCArray* aAddressHomeLabels, CDesCArray* aAddressWorkLabels);
+ void SetAddressFieldsL(const CVCardAddress& aAddress, CContactItem& aContact, TInt aOption) const;
+ void SetAddressFieldL(const CVCardAddress& aAddress,
+ CContactItem& aContact,
+ TInt aOption,
+ TInt aIndex,
+ TFieldType aFieldType,
+ TInt& aInsertPos,
+ TUid aMapping
+ ) const;
+
+ static CVCardAddress* GetSpecifiedAddressLC(const CArrayPtr<CParserProperty>& aProperties,
+ TInt aOption,
+ const TDesC8& aParamMustMatch,
+ const TDesC8& aParamMustNotMatch1,
+ const TDesC8& aParamMustNotMatch2,
+ TUid aMapping
+ );
+
+private: // Organization handling
+TInt GetVCardPropertyAsArrayOfValuesL(const CParserVCard& aVCard, const TDesC8& aToken, CDesCArray& aItems);
+void SetOrgDetailsL(CContactItem& aContact, CDesCArray& aItems, const TInt aOption);
+void SetSpecificFieldL(CContactItem& aContact, CDesCArray& aItems, const TUid& aFieldType,const TUid& aMapping, TInt aOption, TInt aStartIndex, TInt aEndIndex);
+void MergeOrgDetailsL(CContactItem& aContact, CDesCArray& aItems, TInt aOption);
+void MergeSpecificFieldL(CContactItem& aContact, CDesCArray& aItems, const TFieldType& aFieldType, const TUid& aMapping, TInt aOption, TInt aStartIndex, TInt aEndIndex);
+
+private: // Class handling
+TInt GetSingleInstanceL(const CParserVCard& aVCard, const TDesC8& aToken, TDes& aClass);
+void SetSingleInstanceL(CContactItem& aContact, const TDes& aValue,const TFieldType& aFieldType, const TUid& aMapping, TInt aOption);
+void MergeSingleInstanceL(CContactItem& aContact, const TDes& aValue,const TFieldType& aFieldType, const TUid& aMapping, TInt aOption);
+
+private: // Parameter handling
+ static TBool IsParameterValuePresent(CArrayPtr<CParserParam>* aParamArray, const TDesC8& aParamName, const TDesC8& aParamValue);
+
+private:
+ TUnknownPropertyBehaviour iUnknownPropertyBehaviour;
+ TCntVCardImportType iImportType;
+ };
+
+
+/**
+ * Generic base class representing a collection of items (e.g. names sub-fields) and their
+ * associated labels
+ */
+class CVCardItemAndLabel : public CBase
+ {
+public:
+ static CVCardItemAndLabel* NewLC();
+ ~CVCardItemAndLabel();
+
+protected:
+ CVCardItemAndLabel();
+ void ConstructL();
+
+public:
+ void AddItemL(const TDesC& aItem);
+ void AddLabelL(const TDesC& aItem);
+ //
+ TInt ItemCount() const;
+ TInt LabelCount() const;
+ //
+ TPtrC Item(TInt aIndex) const;
+ TPtrC Label(TInt aIndex) const;
+ //
+ TInt FindLabel(const TDesC& aName, TInt& aPosition) const;
+
+public:
+ static void CleanUpResetDestroyAndCloseArray(TAny* aArray);
+
+private:
+ CDesCArray* iItems;
+ CDesCArray* iLabels;
+ };
+
+
+/**
+ * Class used to hold address sub-fields and their associated labels.
+ */
+class CVCardAddress : public CVCardItemAndLabel
+ {
+public:
+ static CVCardAddress* NewLC(TUid aMapping);
+
+private:
+ CVCardAddress(TUid aMapping);
+
+public:
+ inline TUid Mapping() const { return iMapping; }
+
+private:
+ TUid iMapping;
+ };
+
+/** Panic enumeration */
+enum TCntVCardPanic
+ {
+ ECntVPanicAgentNotNull,
+ ECntVPanicBadParamName,
+ ECntVPanicInvalidImportType,
+ };
+
+GLREF_C void Panic(TCntVCardPanic aPanic);
+GLREF_C void CleanUpResetAndDestroy(TAny *aArray);
+
+#endif