diff -r 000000000000 -r 876b1a06bc25 plugins/contacts/symbian/contactsmodel/cntvcard/cntvcardutils.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/plugins/contacts/symbian/contactsmodel/cntvcard/cntvcardutils.h Wed Aug 25 15:49:42 2010 +0300 @@ -0,0 +1,263 @@ +/* +* 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 +#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* 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* 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* aArrayOfParams) const; + void RetrieveAddressFieldL(const CContactItemFieldSet& aFields, CArrayPtr& 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& 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* 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& 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& 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& 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* 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