williamr@2: // Copyright (c) 1997-2009 Nokia Corporation and/or its subsidiary(-ies). williamr@2: // All rights reserved. williamr@2: // This component and the accompanying materials are made available williamr@4: // under the terms of "Eclipse Public License v1.0" williamr@2: // which accompanies this distribution, and is available williamr@4: // at the URL "http://www.eclipse.org/legal/epl-v10.html". williamr@2: // williamr@2: // Initial Contributors: williamr@2: // Nokia Corporation - initial contribution. williamr@2: // williamr@2: // Contributors: williamr@2: // williamr@2: // Description: williamr@2: // williamr@2: williamr@2: #ifndef __CNTDB_H__ williamr@2: #define __CNTDB_H__ williamr@2: williamr@2: // System includes williamr@2: #include williamr@2: #include williamr@2: #include williamr@2: #include williamr@2: #include williamr@2: #include williamr@2: #include williamr@2: #include williamr@2: williamr@2: #include williamr@2: williamr@2: // Classes referenced williamr@2: // williamr@2: class CContactViewDef; williamr@2: class CFoundMatches; williamr@2: class CContactTextDef; williamr@2: class CContactItem; williamr@2: class CContactItemViewDef; williamr@2: class CContactItemFieldSet; williamr@2: class CContactItemFieldDef; williamr@2: class CContactActiveCompress; williamr@2: class CContactActiveRecover; williamr@2: class CContactDatabase; williamr@2: class CContactTables; williamr@2: class CCntFilter; williamr@2: class CContentType; williamr@2: class CContactItemField; williamr@2: class CIdleFinder; williamr@2: class CContactClientSession; williamr@2: class CPrivConverter; williamr@2: class RCntModel; williamr@2: class CProxyFactory; williamr@2: class CCntTemplateCache; williamr@2: class CSortArray; williamr@2: class CCntIdleSorter; williamr@2: class MLplPersistenceLayerFactory; williamr@2: class CContactOpenOperation; williamr@2: class CDataBaseChangeObserver; williamr@2: class CContactConverter; williamr@2: williamr@4: #ifdef SYMBIAN_ENABLE_SPLIT_HEADERS williamr@4: class CContactSynchroniser; williamr@4: #endif williamr@4: williamr@2: // Constants williamr@4: williamr@4: /** williamr@4: Maximum string length used to separate the fields in the text definition. williamr@4: @see TContactTextDefItem williamr@4: @publishedAll williamr@4: @released williamr@4: */ williamr@2: const TInt KMaxContactTextSeperator=4; williamr@4: /** williamr@4: Constant used during sorting and searching of contacts. williamr@4: @publishedAll williamr@4: @released williamr@4: */ williamr@2: const TInt KTextFieldMinimalLength=64; williamr@4: /** williamr@4: Maximum number of fields that can be set as filterable fields by licensees. williamr@4: @publishedAll williamr@4: @released williamr@4: */ williamr@2: const TInt KMaxCustomFilterableFields=4; williamr@2: williamr@4: #ifndef SYMBIAN_ENABLE_SPLIT_HEADERS williamr@4: williamr@4: /** @internalComponent */ williamr@2: const TInt KMajorVersion=1; williamr@4: /** @internalComponent */ williamr@2: const TInt KMinorVersion=0; williamr@4: /** @internalComponent */ williamr@2: const TInt KBuildNumber=40; williamr@2: williamr@4: #endif //SYMBIAN_ENABLE_SPLIT_HEADERS williamr@2: williamr@2: // williamr@2: // Classes used for compact williamr@2: // williamr@2: williamr@2: class MContactStorageObserver williamr@2: /** williamr@2: Mixin used to observe low disk events williamr@2: williamr@2: @publishedAll williamr@2: @released williamr@2: */ williamr@2: { williamr@2: public: williamr@2: virtual void HandleDiskSpaceEvent(TInt aDrive) = 0; williamr@2: }; williamr@2: williamr@2: class MContactUiCompactObserver williamr@2: /** Mixin used to observe contact database compaction status williamr@2: @publishedAll williamr@2: @released williamr@2: */ williamr@2: { williamr@2: public: williamr@2: virtual void Step(TInt aStep)=0; williamr@2: virtual void HandleError(TInt aError)=0; williamr@2: }; williamr@2: williamr@2: class MContactUiActive williamr@2: /** Mixin used to register the observer. williamr@2: @publishedAll williamr@2: @released williamr@2: */ williamr@2: { williamr@2: public: williamr@2: virtual void Cancel()=0; williamr@2: virtual void SetObserver(MContactUiCompactObserver *aObserver)=0; williamr@2: virtual TInt StepsTogo() const=0; williamr@2: virtual TInt Step()=0; williamr@2: virtual TInt Error() const=0; williamr@2: private: williamr@2: IMPORT_C virtual void MContactUiActive_Reserved1(); williamr@2: }; williamr@2: williamr@2: class CContactActiveBase : public CBase, public MContactUiActive williamr@2: /** williamr@4: @publishedAll williamr@4: @released williamr@2: */ williamr@2: { williamr@2: public: williamr@2: ~CContactActiveBase(); williamr@2: void SetObserver(MContactUiCompactObserver *aObserver); williamr@2: void Cancel(); williamr@2: TInt StepsTogo() const; williamr@2: TInt Step(); williamr@2: TInt Error() const; williamr@2: void SetContactDatabase(CContactDatabase* aContactDatabase); williamr@4: void SetFileManagerL(RCntModel& aCntSvr); williamr@2: williamr@2: #ifndef __SYMBIAN_CNTMODEL_USE_SQLITE__ williamr@2: protected: williamr@2: MContactUiCompactObserver *iObserver; williamr@2: RCntModel* iCntSvr; williamr@2: CIdle *iIdle; williamr@2: TInt iStep; williamr@2: TInt iError; williamr@2: CContactDatabase* iContactDatabase; williamr@2: #endif williamr@2: }; williamr@2: williamr@2: class CContactActiveCompress : public CContactActiveBase williamr@2: /** williamr@2: @publishedAll williamr@2: @released williamr@2: */ williamr@2: { williamr@2: public: williamr@2: #if !( defined __SYMBIAN_CNTMODEL_HIDE_DBMS__ && defined __SYMBIAN_CNTMODEL_USE_SQLITE__ ) williamr@2: void ConstructL(RDbNamedDatabase /* &aDataBase */) {}; williamr@2: #endif williamr@2: }; williamr@2: williamr@2: class CContactActiveRecover : public CContactActiveBase williamr@2: /** williamr@2: @publishedAll williamr@2: @released williamr@2: */ williamr@2: { williamr@2: public: williamr@2: #if !( defined __SYMBIAN_CNTMODEL_HIDE_DBMS__ && defined __SYMBIAN_CNTMODEL_USE_SQLITE__ ) williamr@2: void ConstructL(RDbNamedDatabase /* &aDataBase */) {}; williamr@2: #endif williamr@2: }; williamr@2: williamr@2: williamr@2: class TContactTextDefItem williamr@2: /** An item in a text definition. williamr@2: williamr@2: A TContactTextDefItem has a field type and an optional separator string williamr@2: with a maximum length of 4 characters. williamr@2: williamr@2: @see CContactTextDef williamr@2: @publishedAll williamr@2: @released williamr@2: */ williamr@2: { williamr@2: public: williamr@2: IMPORT_C TContactTextDefItem(); williamr@2: IMPORT_C TContactTextDefItem(TFieldType aFieldType); williamr@2: IMPORT_C TContactTextDefItem(TFieldType aFieldType, const TDesC &aSeperator); williamr@2: public: williamr@2: /** The field type. */ williamr@2: TFieldType iFieldType; williamr@2: /** The string used to separate the fields in the text definition. */ williamr@2: TBuf iSeperator; williamr@2: }; williamr@2: williamr@2: class CContactTextDef : public CArrayFixFlat williamr@2: /** Defines a way of grouping fields to form a string which represents williamr@2: a contact item. williamr@2: williamr@2: A text definition is implemented as an array of text definition items williamr@2: (TContactTextDefItems). williamr@2: williamr@2: For example, CContactDatabase::ReadContactTextDefL() uses a text definition to williamr@2: build up a string from a contact item. When creating the string, it searches williamr@2: the item for fields whose type matches one of the fields specified in the text williamr@2: definition. The contents of the first matching field of each type found in the williamr@2: item are read into the string. These strings may be separated using a field williamr@2: separator, which is also specified in the text definition. A separator is not williamr@2: appended to the last field used to make up the string. It is only inserted when williamr@2: there is a following non-empty field. williamr@2: williamr@2: Additionally, the text definition may also contain a fallback field williamr@2: type. This is used when none of the fields specified in the text williamr@2: definition contain any text. If the item's fallback field contains no text williamr@2: either, or if the fallback field type's value is KUidContactFieldNone, the williamr@2: text is read from the first non-empty field in the item. williamr@2: williamr@2: A contact database can have a default text definition which is set using CContactDatabase::SetTextDefinitionL(). williamr@2: This may be overridden using the variants of CContactDatabase::ReadContactTextDefL() williamr@2: which take a CContactTextDef* argument. williamr@2: williamr@2: CContactTextDef is derived from CArrayFixFlat, so all williamr@2: relevant functions can be used, e.g. to add and remove elements. williamr@2: williamr@2: @publishedAll williamr@2: @released williamr@2: */ williamr@2: { williamr@2: friend class CContactDatabase; williamr@2: friend class CContactTables; williamr@2: public: williamr@2: CContactTextDef(); williamr@2: IMPORT_C static CContactTextDef* NewL(); williamr@2: IMPORT_C static CContactTextDef* NewLC(); williamr@2: static CContactTextDef* NewLC(RReadStream& aStream); williamr@2: IMPORT_C void SetFallbackField(TFieldType iFieldType); williamr@2: IMPORT_C TFieldType FallbackField() const; williamr@2: IMPORT_C TBool ExactMatchOnly(); williamr@2: IMPORT_C void SetExactMatchOnly(TBool aExactMatchOnly); williamr@2: void ExternalizeL(RWriteStream& aStream) const; williamr@2: void InternalizeL(RReadStream& aStream); williamr@2: private: williamr@2: TFieldType iFallbackFieldType; williamr@2: TBool iExactMatchOnly;//Default to EFalse cause ReadInTextDef to only match the chosen fields and not attempt a matchall williamr@2: }; williamr@2: williamr@2: class CContactItemViewDef : public CBase williamr@2: /** A view definition for a contact item. williamr@2: williamr@2: When reading or opening a contact item using the CContactDatabase class, williamr@2: a view definition may be specified to indicate which field data should be williamr@2: retrieved. See for instance CContactDatabase::ReadContactL(). williamr@2: williamr@2: A view definition for a contact item contains an array of field types, a use williamr@2: (CContactItemViewDef::TUse) and a mode (CContactItemViewDef::TMode). The use williamr@2: indicates whether the field types contained in the view definition should williamr@2: be included in or excluded from the view. The mode indicates whether fields williamr@2: with the hidden attribute should be included or excluded. williamr@2: williamr@2: @publishedAll williamr@2: @released williamr@2: */ williamr@2: { williamr@2: public: williamr@2: /** Include or exclude specified fields. */ williamr@2: enum TUse williamr@2: { williamr@2: /** Include specified fields in the view. */ williamr@2: EIncludeFields, williamr@2: /** Exclude specified fields from the view. */ williamr@2: EMaskFields williamr@2: }; williamr@2: /** Include or exclude hidden fields.*/ williamr@2: enum TMode williamr@2: { williamr@2: /** Include hidden fields in the view. */ williamr@2: EIncludeHiddenFields, williamr@2: /** Exclude hidden fields from the view. */ williamr@2: EMaskHiddenFields williamr@2: }; williamr@2: public: williamr@2: IMPORT_C static CContactItemViewDef* NewL(TUse aUse, TMode aMode); williamr@2: IMPORT_C static CContactItemViewDef* NewLC(TUse aUse, TMode aMode); williamr@2: static CContactItemViewDef* NewLC(RReadStream& aStream); williamr@2: inline TUid operator[](TInt aIndex) const; williamr@2: IMPORT_C TInt Find(const CContentType &aContentType) const; williamr@2: IMPORT_C TInt Find(TFieldType aFieldType) const; williamr@2: inline TInt Count() const; williamr@2: inline void Reset(); williamr@2: IMPORT_C void AddL(TFieldType aFieldType); williamr@2: IMPORT_C void Remove(TFieldType aFieldType); williamr@2: IMPORT_C void Remove(TInt aIndex); williamr@2: inline TUse Use() const; williamr@2: inline void SetUse(TUse aUse); williamr@2: inline TMode Mode() const; williamr@2: inline void SetMode(TMode aMode); williamr@2: IMPORT_C TBool Contains(const CContactItem& aItem); williamr@2: IMPORT_C void InternalizeL(RReadStream& aStream); williamr@2: IMPORT_C void ExternalizeL(RWriteStream& aStream) const; williamr@2: IMPORT_C TBool MatchesAll() const; williamr@2: private: williamr@2: CContactItemViewDef(TUse aUse,TMode aMode); williamr@2: private: williamr@2: CArrayFixFlat iFieldTypes; williamr@2: TUse iUse; williamr@2: TMode iMode; williamr@2: }; williamr@2: williamr@2: class CContactViewDef : public CBase williamr@2: /** Specifies a subset of fields to be loaded when reading a contact item. williamr@2: williamr@2: A default view definition is owned by the contact database. williamr@2: It is set using CContactDatabase::SetViewDefinitionL() and is used in calls williamr@2: to CContactDatabase::ReadContactL(), ReadContactLC() and ReadContactAndAgentL() williamr@2: when no view definition is specified. williamr@2: williamr@2: The view definition owns the item view definition (see the CContactItemViewDef williamr@2: class), which stores the view definition's field types, use and mode. williamr@2: williamr@2: The following functions declared in class CContactViewDef have not been williamr@2: implemented:- Groups(), AddL(). williamr@2: williamr@2: @publishedAll williamr@2: @released williamr@2: */ williamr@2: { williamr@2: public: williamr@2: IMPORT_C static CContactViewDef* NewL(); williamr@2: IMPORT_C static CContactViewDef* NewLC(); williamr@2: IMPORT_C static CContactViewDef* NewL(CContactItemViewDef* aItemDef); williamr@2: IMPORT_C static CContactViewDef* NewLC(CContactItemViewDef* aItemDef); williamr@2: static CContactViewDef* NewLC(RReadStream& aStream); williamr@2: IMPORT_C ~CContactViewDef(); williamr@2: IMPORT_C void InternalizeL(RReadStream& aStream); williamr@2: IMPORT_C void ExternalizeL(RWriteStream& aStream) const; williamr@2: IMPORT_C CContactItemViewDef& ItemDef() const; williamr@2: /** This function is not implemented */ williamr@2: IMPORT_C CContactIdArray& Groups() const; williamr@2: /** This function is not implemented. williamr@2: @param aFieldType The field type to append to the array of field types. */ williamr@2: inline void AddL(TFieldType aFieldType); williamr@2: private: williamr@2: CContactViewDef(); williamr@2: void ConstructL(CContactItemViewDef* aItemDef); williamr@2: private: williamr@2: CContactItemViewDef* iItemDef; williamr@2: // CContactIdArray* iGroupIds; // unused for now williamr@2: }; williamr@2: williamr@2: class TContactIter williamr@2: /** Iterates through the sorted contact items in a contact database. williamr@2: williamr@2: A value of KNullContactId is returned by the iterator if a requested item cannot williamr@2: be found. williamr@2: williamr@2: @publishedAll williamr@2: @released williamr@2: */ williamr@2: { williamr@2: public: williamr@2: IMPORT_C TContactIter(CContactDatabase &aDatabase); williamr@2: IMPORT_C TContactItemId FirstL(); williamr@2: IMPORT_C TContactItemId NextL(); williamr@2: IMPORT_C TContactItemId PreviousL(); williamr@2: IMPORT_C TContactItemId LastL(); williamr@2: IMPORT_C void GotoL(TContactItemId aContactId); williamr@2: IMPORT_C void Reset(); williamr@2: private: williamr@2: void GotoIndexL(TInt aPos); williamr@2: private: williamr@2: CContactDatabase &iDatabase; williamr@2: TContactItemId iCursorId; williamr@2: }; williamr@2: williamr@2: class MIdleFindObserver williamr@2: /** The interface for an asynchronous find observer. williamr@2: williamr@2: An object which implements this interface is passed to the asynchronous find williamr@2: functions defined in class CContactDatabase, (FindAsyncL() and FindInTextDefAsyncL()). williamr@2: The observer would typically notify the user of the progress of the operation. williamr@2: williamr@2: @publishedAll williamr@2: @released williamr@2: */ williamr@2: { williamr@2: public: williamr@2: /** Asynchronous find observer callback. williamr@2: williamr@2: If an observer is supplied to CContactDatabase::FindAsyncL() williamr@2: or FindInTextDefAsyncL(), this callback function is called by CIdle::RunL() williamr@2: when nothing of a higher priority can be scheduled. It is called for every williamr@2: 16 items searched to give the application a chance to update its search status. williamr@2: williamr@2: An implementation might test for and handle errors and retrieve information williamr@2: about the progress of the search. This information may be retrieved using williamr@2: functions provided by the CIdleFinder class. */ williamr@2: virtual void IdleFindCallback()=0; williamr@2: }; williamr@2: williamr@2: struct SFindInTextDefWordParser williamr@2: /** Search string parser struct. williamr@2: williamr@2: An object of this type is used in the callback parser function passed to williamr@2: CContactDatabase::FindInTextDefLC(). The parser function must walk williamr@2: through and parse iSearchString, adding any words found to iWordArray. williamr@2: williamr@2: @publishedAll williamr@2: @released williamr@2: */ williamr@2: { williamr@2: public: williamr@2: inline SFindInTextDefWordParser(const TDesC *aSearchString, CDesCArray *aWordArray) : iSearchString(aSearchString), iWordArray(aWordArray) williamr@2: /** Initialises the search string and the word array. williamr@2: williamr@2: @param aSearchString Pointer to the input string to be parsed. williamr@2: @param aWordArray Pointer to the array to which words parsed from the input williamr@2: string should be added. */ williamr@2: {}; williamr@2: public: williamr@2: /** Pointer to the input string to be parsed. */ williamr@2: const TDesC *iSearchString; williamr@2: /** Pointer to the array to which words parsed from the input string should be williamr@2: added. */ williamr@2: CDesCArray *iWordArray; williamr@2: }; williamr@2: williamr@2: class CIdleFinder : public CIdle williamr@2: /** Provides information about the progress of an asynchronous contact database search, williamr@2: and can be used to get the results of the search. williamr@2: williamr@2: An instance of this class is returned by calls to CContactDatabase::FindAsyncL() williamr@2: and CContactDatabase::FindInTextDefAsyncL(). williamr@2: williamr@2: @publishedAll williamr@2: @released williamr@2: */ williamr@2: { williamr@2: public: williamr@2: ~CIdleFinder(); williamr@2: IMPORT_C TBool IsComplete() const; williamr@2: IMPORT_C CContactIdArray *TakeContactIds(); williamr@2: IMPORT_C TInt Error() const; williamr@2: TInt RunError(TInt aError); williamr@2: private: williamr@2: friend class CContactDatabase; williamr@2: static CIdleFinder *NewL(CContactDatabase &aContactDatabase, const TDesC& aText, const CContactItemFieldDef *aFieldDef, MIdleFindObserver *aObserver); williamr@2: static CIdleFinder *NewL(CContactDatabase &aContactDatabase, const MDesCArray* aFindWords,const CContactTextDef* aTextDef, MIdleFindObserver *aObserver, const TCallBack &aWordParserCallback); williamr@2: void DoCancel(); williamr@2: void Start(); williamr@2: static TInt CallbackL(TAny *aSelf); williamr@2: void ConstructL(const TDesC *aText, const MDesCArray* aFindWords, const TCallBack *aWordParserCallback); williamr@2: TBool ScanForMatchL(const TDesC &aFieldText,const TDesC &aFindText, CFoundMatches *aFoundMatches) const; williamr@2: TBool CheckFindL(TContactItemId aContactId) const; williamr@2: TBool CheckFindL() const; williamr@2: CIdleFinder(CContactDatabase &aContactDatabase, const CContactItemFieldDef *aFieldDef, const CContactTextDef* aTextDef, MIdleFindObserver *aObserver); williamr@2: TBool doFindL(); williamr@2: williamr@2: enum TAsyncFindState williamr@2: { williamr@2: EFindInBlobFinished =0x00000001, williamr@2: EFindInIdentityFinished =0x00000002, williamr@2: EFindInEmailFinished =0x00000004, williamr@2: EFindInTextDefFinished =0x00000008 williamr@2: }; williamr@2: private: williamr@2: CContactDatabase *iContactDatabase; williamr@2: CContactIdArray *iIdsFound; williamr@2: TBool iOwnsIds; williamr@2: CDesCArray* iFindWords; williamr@2: TInt iReserved1; williamr@2: TInt iReserved2; williamr@2: TInt iReserved3; williamr@2: const CContactItemFieldDef* iFieldDef; williamr@2: const CContactTextDef* iTextDef; williamr@2: MIdleFindObserver *iObserver; williamr@2: TInt iError; williamr@2: TCallBack iWordParserCallback; williamr@2: TInt iReserved4; williamr@2: TInt iReserved5; williamr@2: TInt iReserved6; williamr@2: TInt iReserved7; //was TDbColNo williamr@2: TInt iReserved8; //was RDbView williamr@2: TInt iReserved9; //was RDbView williamr@2: TInt iReserved10; //was CIdentityTableColSet* williamr@2: }; williamr@2: williamr@2: class MContactDbPrivObserver williamr@2: /** Provides notification of database changes to clients. williamr@2: * Provides information about database change event details and the type of changed event. williamr@2: @publishedAll williamr@2: @released williamr@2: */ williamr@2: { williamr@2: public: williamr@2: williamr@2: #if !( defined __SYMBIAN_CNTMODEL_HIDE_DBMS__ && defined __SYMBIAN_CNTMODEL_USE_SQLITE__ ) williamr@2: virtual void HandleDatabaseEventL(RDbNotifier::TEvent)=0; williamr@2: #endif williamr@2: virtual void HandleDatabaseEventL(const TContactDbObserverEvent &aEvent)=0; williamr@2: }; williamr@2: williamr@2: williamr@2: class MContactSortObserver williamr@2: /** williamr@2: @publishedAll williamr@2: @deprecated williamr@2: */ williamr@2: { williamr@2: public: williamr@2: /** williamr@2: @deprecated williamr@2: */ williamr@2: virtual void HandleSortEventL(TInt aContactsSorted, TInt aContactsTotal)=0; williamr@2: }; williamr@2: williamr@4: #ifndef SYMBIAN_ENABLE_SPLIT_HEADERS williamr@2: class MConverterCallBack williamr@2: /** williamr@2: Interface class for providing Intra-Contact Properties during a PBAP specific contacts export. williamr@4: @released williamr@2: @internalTechnology williamr@2: */ williamr@2: { williamr@2: public: williamr@2: /** williamr@2: PBAP clients are supposed to provide any information regarding the contact item represented by aContactId. williamr@2: This information should be in form of standard vCard property, all such properties should be appended to the array aPropertyList. williamr@2: */ williamr@2: virtual void AddIntraContactPropertiesL(const TContactItemId& aContactId, CArrayPtr* aPropertyList) = 0; williamr@2: }; williamr@4: #else williamr@4: class MConverterCallBack; williamr@4: #endif //SYMBIAN_ENABLE_SPLIT_HEADERS williamr@2: williamr@2: enum TVCardVersion williamr@2: /** williamr@2: Specifies type of export of contact items. williamr@2: PBAP clients should use EPBAPVCard21 and EPBAPVCard30. williamr@4: @publishedAll williamr@4: @released williamr@2: */ williamr@2: { williamr@2: EVCardUDEF = -1, williamr@2: EVCard21 = 0, williamr@2: EVCard30, williamr@2: EPBAPVCard21, williamr@2: EPBAPVCard30 williamr@2: }; williamr@2: williamr@2: class CContactDatabase : public CBase, public MContactDbPrivObserver, public MContactStorageObserver williamr@2: /** A database of contact items. williamr@2: williamr@2: Contact items can be added to and removed from the database and items in the williamr@2: database can be opened or read. To edit an item, it must first be opened. williamr@2: Changes to the item can then be committed using CommitContactL() williamr@2: (committing can only take place to an open item). williamr@2: williamr@2: If the available disk space is less than 128 kilobytes then changes to the williamr@2: contact database cannot be started, and methods such as CreateL() or CommitContactL() williamr@2: will leave with a KErrDiskFull error. Less obviously OpenL() can also fail with williamr@2: KErrDiskFull when trying to update the system template. williamr@2: williamr@2: Each item has an access count. An item cannot be fully deleted unless its williamr@2: access count is zero. This is to prevent items which have been williamr@2: synchronised with another contacts application from being deleted. williamr@2: Also, if the item is a template, it cannot be deleted if other items are based williamr@2: on it. williamr@2: williamr@2: More than one contact database can exist on a phone, but there is a williamr@2: default contact database. Its filename is contacts.cdb. It williamr@2: can be moved between drives. williamr@2: williamr@2: CContactDatabase implements searching and sorting and also provides williamr@2: separate phone number matching functions. These provide a fast way of indexing williamr@2: and looking up phone numbers, e.g. for looking up caller IDs on incoming williamr@2: calls. williamr@2: williamr@2: The database owns speed dial information. This is a mapping between a single williamr@2: digit integer and a telephone number. There may be up to 9 speed dial telephone williamr@2: numbers; each of them belongs to a contact item in the database. If a williamr@2: contact item is deleted, its speed dial mapping is removed. williamr@2: williamr@2: The following functions defined in class CContactDatabase are not williamr@2: supported. If called, they leave with KErrNotSupported. williamr@2: williamr@2: - ReplacePrefL() williamr@2: williamr@2: - ReadPrefL() williamr@2: williamr@2: - CreatePrefL() williamr@2: williamr@2: @publishedAll williamr@2: @released williamr@2: */ williamr@2: { williamr@2: friend class TContactIter; williamr@2: friend class CIdleFinder; williamr@2: friend class CCntIdleSorter; williamr@2: friend class CContactLocalView; williamr@2: friend class CContactOpenOperation; williamr@2: friend class RContactRemoteView; williamr@2: friend class CViewIteratorProxyManager; williamr@2: friend class CCollectionProxy; williamr@2: friend class CContactActiveBase; williamr@2: public: williamr@2: class TSortPref williamr@2: /** Specifies the field type and order preferences used for sorting items in the williamr@2: contacts database. williamr@2: williamr@2: The contents of the first field in a contact item matching the field type williamr@2: is used as the data to sort on. The order can either be ascending or descending. williamr@2: williamr@2: @see CContactDatabase::SortL() williamr@2: @see CContactDatabase::SortArrayL() williamr@2: @publishedAll williamr@2: @deprecated williamr@2: */ williamr@2: { williamr@2: public: williamr@2: /** The sort order. */ williamr@2: enum TOrder williamr@2: { williamr@2: /** Ascending sort order. */ williamr@2: EAsc, williamr@2: /** Descending sort order. */ williamr@2: EDesc williamr@2: }; williamr@2: public: williamr@2: inline TSortPref(); williamr@2: inline TSortPref(TFieldType aFieldType,TOrder aOrder=EAsc); williamr@2: IMPORT_C void ExternalizeL(RWriteStream& aStream) const; williamr@2: IMPORT_C void InternalizeL(RReadStream& aStream); williamr@2: public: williamr@2: /** Specifies whether the sort should be ascending or descending. */ williamr@2: TOrder iOrder; williamr@2: /** The first field matching this field type is used for the text to sort on. */ williamr@2: TFieldType iFieldType; williamr@2: }; williamr@2: williamr@2: /** Import and export format flags. Contacts can be imported into williamr@2: or exported from the contact database as vCards. williamr@2: williamr@2: The following options are available during import and export. williamr@2: williamr@2: @deprecated This enum is deprecated. It has been replaced by the TOptions enum in williamr@2: the plugin convertor class CContactVCardConverter, so that each plugin converter williamr@2: can define its own options. */ williamr@2: enum TOptions williamr@2: { williamr@2: EDefault=0x0000, williamr@2: /** Handle Symbian's extended vCard format options. */ williamr@2: EIncludeX =0x0001, williamr@2: /** Support non-standard extensions requried by Symbian PC connectivity software williamr@2: and Microsoft, amongst others. */ williamr@2: ETTFormat =0x0002, williamr@2: /** Don't export the contact ID (for exporting only). */ williamr@2: EExcludeUid=0x0004, williamr@2: /** Decrease the contact's access count when importing and exporting. */ williamr@2: EDecreaseAccessCount=0x0008, williamr@2: /** Only import the first contact in the read stream (for importing only). */ williamr@2: EImportSingleContact=0x0010, williamr@2: /** Increase the contact's access count when importing and exporting. */ williamr@2: EIncreaseAccessCount=0x0020, williamr@2: /** Sets a contact item to the local time when importing. */ williamr@2: ELocalTime=0x0040, williamr@2: /** Allows you to set a template to a contact item that does not exist. */ williamr@2: ENullTemplateId=0x0080, williamr@2: /** For use by implementor of converter plug-in. */ williamr@2: EConverterDefined1=0x0100, williamr@2: /** For use by implementor of converter plug-in. */ williamr@2: EConverterDefined2=0x0200, williamr@2: /** For use by implementor of converter plug-in. */ williamr@2: EConverterDefined3=0x0400, williamr@2: /** For use by implementor of converter plug-in. */ williamr@2: EConverterDefined4=0x0800, williamr@2: /** For use by implementor of converter plug-in. */ williamr@2: EConverterDefined5=0x1000, williamr@2: /** For use by implementor of converter plug-in. */ williamr@2: EConverterDefined6=0x2000, williamr@2: /** For use by implementor of converter plug-in. */ williamr@2: EConverterDefined7=0x4000, williamr@2: /** For use by implementor of converter plug-in. */ williamr@2: EConverterDefined8=0x8000, williamr@2: /** Reserved for use by Symbian. */ williamr@2: EConverterReserved1=0x00010000, williamr@2: /** Reserved for use by Symbian. */ williamr@2: EConverterReserved2=0x00020000, williamr@2: /** Reserved for use by Symbian. */ williamr@2: EConverterReserved3=0x00040000, williamr@2: /** Reserved for use by Symbian. */ williamr@2: EConverterReserved4=0x00080000, williamr@2: /** Reserved for use by Symbian. */ williamr@2: EConverterReserved5=0x00100000, williamr@2: /** Reserved for use by Symbian. */ williamr@2: EConverterReserved6=0x00200000, williamr@2: /** Reserved for use by Symbian. */ williamr@2: EConverterReserved7=0x00400000, williamr@2: /** Reserved for use by Symbian. */ williamr@2: EConverterReserved8=0x00800000, williamr@2: /** Reserved for use by Symbian. */ williamr@2: EConverterReserved9=0x01000000, williamr@2: /** Reserved for use by Symbian. */ williamr@2: EConverterReserved10=0x02000000, williamr@2: /** Reserved for use by Symbian. */ williamr@2: EConverterReserved11=0x04000000, williamr@2: /** Reserved for use by Symbian. */ williamr@2: EConverterReserved12=0x08000000, williamr@2: /** Reserved for use by Symbian. */ williamr@2: EConverterReserved13=0x10000000, williamr@2: /** Reserved for use by Symbian. */ williamr@2: EConverterReserved14=0x20000000, williamr@2: /** Reserved for use by Symbian. */ williamr@2: EConverterReserved15=0x40000000, williamr@2: /** Reserved for use by Symbian. */ williamr@2: EConverterReserved16=0x80000000 williamr@2: }; williamr@2: /** Specifies whether the database can be accessed from single or multiple threads. */ williamr@2: enum TThreadAccess williamr@2: { williamr@2: /** Allows access to the contacts database from a single thread only. */ williamr@2: ESingleThread, williamr@2: /** Allows for a multi-threaded program to access the contact database from multiple williamr@2: threads but note that the contacts model provides no synchronisation support williamr@2: for such use. */ williamr@2: EMultiThread williamr@2: }; williamr@4: williamr@4: #ifndef SYMBIAN_ENABLE_SPLIT_HEADERS williamr@2: /** williamr@2: @internalComponent williamr@2: */ williamr@2: enum TSortDataSource williamr@2: { williamr@2: ENoOrder, williamr@2: EUsesIdentityTableOnly, williamr@2: EUsesAllTables, williamr@2: EIdentityTableNotUsed //Not used williamr@2: }; williamr@4: #endif williamr@2: public: williamr@2: IMPORT_C static CContactDatabase* OpenL(TThreadAccess aAccess=ESingleThread); williamr@2: IMPORT_C static CContactDatabase* OpenL(const TDesC& aFileName,TThreadAccess aAccess=ESingleThread); williamr@2: IMPORT_C static CContactDatabase* CreateL(TThreadAccess aAccess=ESingleThread); williamr@2: IMPORT_C static CContactDatabase* CreateL(const TDesC& aFileName,TThreadAccess aAccess=ESingleThread); williamr@2: IMPORT_C static CContactDatabase* ReplaceL(TThreadAccess aAccess=ESingleThread); williamr@2: IMPORT_C static CContactDatabase* ReplaceL(const TDesC& aFileName,TThreadAccess aAccess=ESingleThread); williamr@2: // asynchronous Open williamr@2: IMPORT_C static CContactOpenOperation* Open(TRequestStatus& aStatus, TThreadAccess aAccess=ESingleThread); williamr@2: IMPORT_C static CContactOpenOperation* Open(const TDesC& aFileName, TRequestStatus& aStatus, TThreadAccess aAccess=ESingleThread); williamr@2: IMPORT_C static TBool DatabaseDrive(TDriveUnit &aDriveUnit); williamr@2: inline static TInt NullUidValue(); williamr@2: IMPORT_C static void SetDatabaseDriveL(TDriveUnit aDriveUnit, TBool aCopy=ETrue); williamr@2: IMPORT_C static void GetDefaultNameL(TDes &aDes); williamr@2: IMPORT_C static void DeleteDefaultFileL(); williamr@2: // database file mangement williamr@2: IMPORT_C static void DeleteDatabaseL(const TDesC& aFileName); williamr@2: IMPORT_C static CDesCArray* ListDatabasesL(); williamr@2: IMPORT_C static CDesCArray* ListDatabasesL(TDriveUnit aDriveUnit); williamr@2: IMPORT_C static TBool DefaultContactDatabaseExistsL(); williamr@2: IMPORT_C static TBool ContactDatabaseExistsL(const TDesC& aFileName); williamr@2: IMPORT_C ~CContactDatabase(); williamr@2: williamr@2: IMPORT_C void SetViewDefinitionL(CContactViewDef* aView); williamr@2: IMPORT_C void SetTextDefinitionL(CContactTextDef* aView); williamr@2: IMPORT_C const CContactTextDef* TextDefinition() const; williamr@2: IMPORT_C TInt CountL(); williamr@2: IMPORT_C void SetDbViewContactType(const TUid aUid); williamr@2: IMPORT_C TUid GetDbViewContactType() const; williamr@2: williamr@2: williamr@2: IMPORT_C TContactItemId AddNewContactL(CContactItem& aContact); williamr@2: williamr@2: IMPORT_C CContactItem* CreateContactGroupL(TBool aInTransaction=EFalse); williamr@2: IMPORT_C CContactItem* CreateContactGroupLC(TBool aInTransaction=EFalse); williamr@2: IMPORT_C CContactItem* CreateContactGroupL(const TDesC& aGroupLabel,TBool aInTransaction=EFalse); williamr@2: IMPORT_C CContactItem* CreateContactGroupLC(const TDesC& aGroupLabel,TBool aInTransaction=EFalse); williamr@2: IMPORT_C CContactItem* CreateContactCardTemplateL(const TDesC& aTemplateLabel,TBool aInTransaction=EFalse); williamr@2: IMPORT_C CContactItem* CreateContactCardTemplateLC(const TDesC& aTemplateLabel,TBool aInTransaction=EFalse); williamr@2: IMPORT_C CContactItem* CreateContactCardTemplateL(const CContactItem* aTemplate,const TDesC& aTemplateLabel,TBool aInTransaction=EFalse); williamr@2: IMPORT_C CContactItem* CreateContactCardTemplateLC(const CContactItem* aTemplate,const TDesC& aTemplateLabel,TBool aInTransaction=EFalse); williamr@2: williamr@2: IMPORT_C CContactIdArray* GetCardTemplateIdListL() const; williamr@2: IMPORT_C CContactIdArray* GetGroupIdListL() const; williamr@2: IMPORT_C void AddContactToGroupL(TContactItemId aItemId, TContactItemId aGroupId); williamr@2: IMPORT_C void AddContactToGroupL(CContactItem& aItem, CContactItem& aGroup); williamr@2: IMPORT_C void AddContactToGroupL(TContactItemId aItemId, TContactItemId aGroupId,TBool aInTransaction); williamr@2: IMPORT_C void RemoveContactFromGroupL(CContactItem& aItem, CContactItem& aGroup); williamr@2: IMPORT_C void RemoveContactFromGroupL(TContactItemId aItemId, TContactItemId aGroupId); williamr@2: inline TInt GroupCount() const; williamr@2: inline TInt TemplateCount() const; williamr@2: williamr@2: // speed dial functions williamr@2: IMPORT_C void SetFieldAsSpeedDialL(CContactItem& aItem, TInt aFieldIndex, TInt aSpeedDialPosition); williamr@2: IMPORT_C TContactItemId GetSpeedDialFieldL(TInt aSpeedDialPosition, TDes& aPhoneNumber); williamr@2: IMPORT_C void RemoveSpeedDialFieldL(TContactItemId aContactId, TInt aSpeedDialPosition); williamr@2: williamr@2: // reading contacts from the db williamr@2: IMPORT_C CContactItem* ReadMinimalContactL(TContactItemId aContactId); williamr@2: IMPORT_C CContactItem* ReadMinimalContactLC(TContactItemId aContactId); williamr@2: IMPORT_C CContactItem* ReadContactL(TContactItemId aContactId); williamr@2: IMPORT_C CArrayPtr* ReadContactAndAgentL(TContactItemId aContactId); williamr@2: IMPORT_C CContactItem* ReadContactL(TContactItemId aContactId,const CContactItemViewDef& aViewDef); williamr@2: IMPORT_C CContactItem* ReadContactLC(TContactItemId aContactId); williamr@2: IMPORT_C CContactItem* ReadContactLC(TContactItemId aContactId,const CContactItemViewDef& aViewDef); williamr@2: IMPORT_C void ReadContactTextDefL(const CContactItem &aItem, TDes &aResult); williamr@2: IMPORT_C void ReadContactTextDefL(const CContactItem &aItem, TDes &aResult,CContactTextDef* aTextDef); williamr@2: IMPORT_C void ReadContactTextDefL(TContactItemId aContactId, TDes &aResult); williamr@2: IMPORT_C void ReadContactTextDefL(TContactItemId aContactId, TDes &aResult,CContactTextDef* aTextDef); williamr@2: IMPORT_C CContactItem* OpenContactL(TContactItemId aContactId); williamr@2: IMPORT_C CContactItem* OpenContactL(TContactItemId aContactId,const CContactItemViewDef& aViewDef); williamr@2: IMPORT_C CContactItem* OpenContactLX(TContactItemId aContactId); williamr@2: IMPORT_C CContactItem* OpenContactLX(TContactItemId aContactId,const CContactItemViewDef& aViewDef); williamr@2: IMPORT_C void CloseContactL(TContactItemId aContactId); williamr@2: IMPORT_C void CommitContactL(const CContactItem& aContact); williamr@2: IMPORT_C void DeleteContactL(TContactItemId aContactId); williamr@2: IMPORT_C void DeleteContactsL(const CContactIdArray& aContactIds); williamr@2: IMPORT_C CArrayPtr* ImportContactsL(const TUid& aFormat,RReadStream& aReadStream,TBool& aImportSuccessful,TInt aOption); williamr@2: IMPORT_C void ExportSelectedContactsL(const TUid& aFormat,const CContactIdArray& aSelectedContactIds,RWriteStream& aWriteStream,TInt aOption,TBool aExportPrivateFields=ETrue); williamr@2: IMPORT_C void ExportSelectedContactsL(const TUid& aFormat,const CContactIdArray& aSelectedContactIds,RWriteStream& aWriteStream,TInt aOption,const Versit::TVersitCharSet aCharSet, TBool aExportPrivateFields=ETrue); williamr@2: IMPORT_C void CompactL(); williamr@2: williamr@2: IMPORT_C CContactIdArray* FindLC(const TDesC& aText,const CContactItemFieldDef *aFieldDef); williamr@2: IMPORT_C CIdleFinder* FindAsyncL(const TDesC& aText,const CContactItemFieldDef *aFieldDef, MIdleFindObserver *aObserver); williamr@2: IMPORT_C CContactIdArray* FindInTextDefLC(const MDesCArray& aFindWords, const TCallBack &aWordParserCallback); williamr@2: IMPORT_C CContactIdArray* FindInTextDefLC(const MDesCArray& aFindWords,CContactTextDef* aTextDef, const TCallBack &aWordParserCallback); williamr@2: IMPORT_C CIdleFinder* FindInTextDefAsyncL(const MDesCArray& aFindWords, MIdleFindObserver *aObserver, const TCallBack &aWordParserCallback); williamr@2: IMPORT_C CIdleFinder* FindInTextDefAsyncL(const MDesCArray& aFindWords,const CContactTextDef* aTextDef, MIdleFindObserver *aObserver, const TCallBack &aWordParserCallback); williamr@2: IMPORT_C CContactIdArray* SortArrayL(const CContactIdArray* aIdArray, const CArrayFix* aSortOrder); williamr@2: IMPORT_C CContactIdArray* SortArrayLC(const CContactIdArray* aIdArray, const CArrayFix* aSortOrder); williamr@2: IMPORT_C void SortByTypeL(CArrayFix* aSortOrder); williamr@2: IMPORT_C void SortL(CArrayFix* aSortOrder); williamr@2: IMPORT_C void SortAsyncL(CArrayFix* aSortOrder, TRequestStatus& aStatus); williamr@2: IMPORT_C void CancelAsyncSort(); williamr@2: IMPORT_C void SortAsyncL(CArrayFix* aSortOrder, TRequestStatus& aStatus, MContactSortObserver& aObserver); williamr@2: williamr@2: IMPORT_C void SetOperationTimeOutL(const TInt aMicroSeconds) const; williamr@2: IMPORT_C TPtrC FileUid(); williamr@2: IMPORT_C CContactActiveCompress* CreateCompressorLC(); williamr@2: IMPORT_C CContactActiveRecover* CreateRecoverLC(); williamr@2: IMPORT_C void RecoverL(); williamr@2: IMPORT_C TBool IsDamaged() const; williamr@2: IMPORT_C TBool CompressRequired(); williamr@2: IMPORT_C void CloseTables(); williamr@2: IMPORT_C void OpenTablesL(); williamr@2: williamr@2: //New Phone Matching function, takes a number as a TDesc& and will match from the right of the string williamr@2: //by the the number defined williamr@2: IMPORT_C CContactIdArray* MatchPhoneNumberL(const TDesC& aNumber, TInt aMatchLengthFromRight); williamr@2: williamr@2: williamr@2: IMPORT_C const CContactIdArray* SortedItemsL(); williamr@2: IMPORT_C TContactItemId TemplateId() const; williamr@2: IMPORT_C CContactItem* CreateOwnCardLC(); williamr@2: IMPORT_C CContactItem* CreateOwnCardL(); williamr@2: IMPORT_C TContactItemId OwnCardId() const; williamr@2: IMPORT_C void SetOwnCardL(const CContactItem& aContact); williamr@2: williamr@2: // Preferred Template williamr@2: IMPORT_C TContactItemId PrefTemplateId() const; williamr@2: IMPORT_C void SetPrefTemplateL(const CContactItem& aContact); williamr@2: williamr@2: // Current item williamr@2: IMPORT_C void SetCurrentItem(const TContactItemId aContactId); williamr@2: IMPORT_C TContactItemId GetCurrentItem() const; williamr@2: williamr@2: // Connectivity williamr@2: IMPORT_C void SetDateFormatTextL(const TDesC& aFormat); williamr@2: IMPORT_C void FilterDatabaseL(CCntFilter& aFilter); williamr@2: IMPORT_C CContactIdArray* ContactsChangedSinceL(const TTime& aTime); williamr@2: IMPORT_C TContactSyncId SetLastSyncDateL(const TTime& aSyncDate); williamr@2: IMPORT_C void SetLastSyncDateL(TContactSyncId aSyncId, const TTime& aSyncDate); williamr@2: IMPORT_C void GetLastSyncDateL(TContactSyncId aSyncId, TTime& aSyncDate); williamr@2: williamr@2: IMPORT_C TInt FileSize() const; williamr@2: IMPORT_C TInt WastedSpaceInBytes() const; williamr@2: IMPORT_C TUint ConnectionId() const; williamr@2: IMPORT_C const CContentType &TemplateContentType(const CContactItemField &aField) const; williamr@2: IMPORT_C TVersion Version() const; williamr@2: IMPORT_C TInt64 MachineId() const; williamr@2: IMPORT_C TContactItemId ICCTemplateIdL(); williamr@2: IMPORT_C TContactItemId ICCTemplateIdL(TUid aPhonebookUid); williamr@2: IMPORT_C TContactItemId PhonebookGroupIdL(); williamr@2: williamr@2: public: // For test code only williamr@2: IMPORT_C void DamageDatabaseL(TInt aSecretCode); // Don't use this, you don't really want to damage your database do you? williamr@2: IMPORT_C void OverrideMachineUniqueId(TInt64 aMachineUniqueId); williamr@2: IMPORT_C TInt CntServerResourceCount(); williamr@2: IMPORT_C void SetCntServerHeapFailure(TInt aTAllocFailType,TInt aRate); williamr@2: IMPORT_C CContactIdArray* DeletedContactsLC(); williamr@2: IMPORT_C void ResetServerSpeedDialsL(); williamr@2: williamr@2: public: // For cnt server only williamr@2: #if !( defined __SYMBIAN_CNTMODEL_HIDE_DBMS__ && defined __SYMBIAN_CNTMODEL_USE_SQLITE__ ) williamr@2: void HandleDatabaseEventL(RDbNotifier::TEvent) {}; williamr@2: #endif williamr@2: IMPORT_C void HandleDatabaseEventL(const TContactDbObserverEvent &aEvent); williamr@2: IMPORT_C TInt GetCurrentDatabase(TDes& aDatabase) const; williamr@2: IMPORT_C TInt SetCurrentDatabase(const TDesC& aDatabase) const; williamr@2: williamr@2: IMPORT_C void StoreSortOrderL(); williamr@2: IMPORT_C void RestoreSortOrderL(); williamr@2: IMPORT_C const CArrayFix* SortOrder() const; williamr@2: //Contact Hint Field Access williamr@2: williamr@2: /** Contact view filter flags. williamr@2: williamr@2: These flags define the bits that can be set in filtered views (CContactFilteredView) williamr@2: and in the filter passed to CContactDatabase::ContactMatchesHintFieldL() for williamr@2: comparing against contact view items (CViewContact). williamr@2: williamr@2: If the item's bit field and the view's filter have the same settings for the williamr@2: CContactDatabase::EHome and CContactDatabase::EWork flags and any of the other williamr@2: flags are set in both, a match occurs and the item is included in the view. williamr@2: williamr@2: Filters only apply to non-hidden contact fields with content. */ williamr@2: enum TContactViewFilter williamr@2: { williamr@2: /** The view is unfiltered; it includes all contact items. */ williamr@2: EUnfiltered =0x00000000, williamr@2: /** The filter includes items that have an email address. */ williamr@2: EMailable =0x00000001, williamr@2: /** The filter includes items that have a mobile telephone number. */ williamr@2: ESmsable =0x00000002, williamr@2: /** The filter includes items that have a landline telephone number. */ williamr@2: ELandLine =0x00000004, williamr@2: /** The filter includes items that have a fax number. */ williamr@2: EFaxable =0x00000008, williamr@2: /** The filter includes items that are phonable. (All items with any of the above williamr@2: three flags set also have this flag set). */ williamr@2: EPhonable =0x00000010, williamr@2: /** The filter excludes items without a work telephone number or email address. */ williamr@2: EWork =0x00000020, williamr@2: /** The filter excludes items without a home telephone number or email address. */ williamr@2: EHome =0x00000040, williamr@2: /** The filter includes items that have a non-empty ring tone field (a ring tone williamr@2: that is associated with the item). */ williamr@2: ERingTone =0x00000080, williamr@2: /** The filter includes items that have a non-empty voice dial field (a voice williamr@2: recording associated with a telephone number field in the item). */ williamr@2: EVoiceDial =0x00000100, williamr@2: /** The filter includes items that have any non empty instant messaging address field. */ williamr@2: EIMAddress =0x00000200, williamr@2: /** The filter includes items that have a non empty Wireless Village ID field. williamr@2: An item with this flag set will also have the EIMAddress flag set. */ williamr@2: EWirelessVillage = 0x00000400, williamr@2: /** Reserved filters for future use. */ williamr@2: ECustomFilter1 = 0x00000800, williamr@2: /** Reserved filters for future use. */ williamr@2: ECustomFilter2 = 0x00001000, williamr@2: /** Reserved filters for future use. */ williamr@2: ECustomFilter3 = 0x00002000, williamr@2: /** Reserved filters for future use. */ williamr@2: ECustomFilter4 = 0x00004000 williamr@2: }; williamr@2: williamr@2: IMPORT_C TBool ContactMatchesHintFieldL(TInt aBitWiseFilter,TContactItemId aContactId); williamr@2: public: // for vCard converter only williamr@2: IMPORT_C void DatabaseBeginLC(TBool aIsInTransaction); williamr@2: IMPORT_C void DatabaseCommitLP(TBool aIsInTransaction); williamr@2: IMPORT_C CContactItem *UpdateContactLC(TContactItemId aContactId,CContactItem* aNewContact); williamr@2: IMPORT_C TContactItemId doAddNewContactL(CContactItem& aContact,TBool aIsTemplate,TBool aIsInTransaction); williamr@2: IMPORT_C void doCommitContactL(const CContactItem& aContact,TBool aIsInTransaction, TBool aSendChangedEvent); williamr@2: IMPORT_C TContactItemId ContactIdByGuidL(const TDesC& aGuid); williamr@2: IMPORT_C void doDeleteContactL(TContactItemId aContactId, TBool aIsInTransaction, TBool aSendChangedEvent, TBool aDecAccessCount=EFalse); williamr@2: IMPORT_C CContactItemViewDef* AllFieldsView(); williamr@2: public: // For Symbian use only williamr@2: IMPORT_C void DatabaseBeginL(TBool aIsInTransaction); williamr@2: IMPORT_C void DatabaseCommitL(TBool aIsInTransaction); williamr@2: IMPORT_C void DatabaseRollback(); williamr@2: IMPORT_C void SetSortedItemsList(CContactIdArray* aSortedItems, CArrayFix* aSortOrder); williamr@2: IMPORT_C CContactIdArray* UnfiledContactsL(); williamr@2: IMPORT_C static void RecreateSystemTemplateL(const TDesC& aFileName); williamr@2: public: // For Contacts Lock Server use only williamr@2: IMPORT_C static CContactDatabase* LockServerConnectL(const TDesC& aFileName); williamr@2: IMPORT_C static CContactDatabase* LockServerConnectL(const TDesC& aFileName, TInt aOperation); williamr@2: IMPORT_C TInt LockServerCallBackL(TUint aServerOperation); williamr@2: IMPORT_C void LockServerCleanup(); williamr@2: public: williamr@2: IMPORT_C void ExportSelectedContactsL(const TUid& aFormat, const CContactIdArray& aSelectedContactIds, RWriteStream& aWriteStream, TInt aOption, const TInt64 aContactFieldFilter, MConverterCallBack* aCallback, const TVCardVersion aVersion, const TBool aExportTel, Versit::TVersitCharSet aCharSet = Versit::EUTF8CharSet, TBool aExportPrivateFields = ETrue); williamr@2: private: williamr@2: //for cntiter williamr@2: TInt ContactPosL(TContactItemId aContactId); williamr@2: TInt DoGotoL(TContactItemId aContactId); williamr@2: williamr@2: void DoReadContactTextDefL(const CContactItemFieldSet* aFieldSet,TDes& aResult,CContactTextDef* aTextDef); williamr@2: CContactItem* OpenNoMergeLCX(TContactItemId aContactId); williamr@2: williamr@2: void FetchGroupAndTemplateListsL(); williamr@2: williamr@2: public: williamr@2: void CancelNotifyRequestL(); williamr@2: TBool IsICCSynchronisedL(); williamr@2: williamr@2: //for LocalView williamr@2: void AddObserverL(MContactDbObserver& aChangeNotifier); williamr@2: void RemoveObserver(const MContactDbObserver& aChangeNotifier); williamr@2: williamr@2: void OpenDatabaseAsyncL(TRequestStatus& aStatus, const TDesC& aFileName = KNullDesC); williamr@2: static void CleanupLastLockedContact(TAny *aDatabase); williamr@2: williamr@2: private: williamr@4: CContactConverter& ConverterL(const TUid& aFormat); williamr@4: CContactConverter& ConverterL(const TUid& aFormat, const TInt64 aContactFieldFilter, MConverterCallBack* aCallback, const TVCardVersion aVersion,const TBool aExportTel); williamr@2: static void CleanupDatabaseRollback(TAny *aDatabase); williamr@2: williamr@2: CContactIdArray* SortLC(const CArrayFix* aSortOrder, const CContactIdArray* aIdArray); williamr@2: TBool CheckType(TUid aUid) const; williamr@2: void SortDuplicatesL(const CArrayFix& aSortOrder,CSortArray& aList,TInt aPos); williamr@2: void SortDuplicatesL(const CArrayFix& aSortOrder,CSortArray& aList, williamr@2: TInt aIndex,TInt aStartPos,TInt aEndPos); williamr@2: TBool AddContactToSortListL(TContactItemId aReqId, TContactItemId& aActualId,CBase* aItems, TUid& aFieldType, TBool aHasSortOrder); williamr@2: void RemoveFromSortArray(TContactItemId aContactId); williamr@2: void HandleDbObserverEventGroupDeletedL(const TContactItemId aContactId); williamr@2: void RemoveFromGroupIds(const TContactItemId aContactId); williamr@2: williamr@2: public: williamr@2: static void CleanupTableCancel(TAny *aTable); williamr@2: /** A text buffer of KTextFieldMinimalLength used during sorting and searching of contacts */ williamr@2: typedef TBuf TTextFieldMinimal; williamr@2: static TUid SpeedDialFieldUidFromSpeedDialPosition(TInt aSpeedDialPosition); williamr@2: void HandleDiskSpaceEvent(TInt aDrive); williamr@2: williamr@2: /** State of database connection williamr@2: */ williamr@2: enum TDbConnState williamr@2: { williamr@2: /** Database is open, connection is available for use. */ williamr@2: EDbConnectionOpen = 0, williamr@2: /** Initial state. */ williamr@2: EDbConnectionNotReady, williamr@2: /** Asynchronous Open failed. */ williamr@2: EDbConnectionFailed, williamr@2: /** A Rollback has occurred and a Recover is required now. */ williamr@2: EDbConnectionRecoverRequired, williamr@2: /** Write access is locked during backup. */ williamr@2: EDbConnectionWriteLockedForBackup, williamr@2: /** The database has been closed whilst a Restore is in progress. */ williamr@2: EDbConnectionClosedForRestore, williamr@2: /** Restore is in progress need to close after current transaction. */ williamr@2: EDbConnectionNeedToCloseForRestore, williamr@2: }; williamr@2: /** Currently unused */ williamr@2: enum TDirection {EAsc,EDesc}; //unused williamr@2: void SetDbConnectionState(TDbConnState aDbConnectionState); williamr@2: private: williamr@2: void CheckDbConnForWriteL() const; williamr@2: void CheckDbConnForReadL() const; williamr@2: void CheckDbConnForRecoverL() const; williamr@2: void CheckTemplateField(CContactItem& aCnt); williamr@2: static void ValidateDatabaseNameL(const TParse& aParseName); williamr@2: void StartAsyncActivityL(); williamr@2: void EndAsyncActivityL(); williamr@2: TBool DatabaseReadyL() const; williamr@2: enum TSvrSessionType //unused williamr@2: { williamr@2: // Server Session is persistent, for Open(L), CreateL or ReplaceL williamr@2: ESvrSessionPersistent, williamr@2: // Server Session is temporary, for a simple static API williamr@2: ESvrSessionTemporary, williamr@2: // Session is from the Contacts Lock Server williamr@2: ESvrSessionFromLockServer, williamr@2: }; williamr@2: private: // objec construction/destruction williamr@2: williamr@2: CContactDatabase(); williamr@2: static CContactDatabase* NewLC(); williamr@2: void ConstructL(); williamr@2: void CreateViewDefL(); williamr@2: MLplPersistenceLayerFactory* FactoryL(); williamr@2: williamr@2: private: williamr@2: CContactItem* doCreateContactGroupLC(const TDesC& aGroupLabel = KNullDesC); williamr@2: void AddCntToOpenedGroupL(TContactItemId aItemId, CContactItem& aGroup); williamr@4: void ReadTemplateIdsL(); williamr@2: void AddToTemplateListL(const TContactItemId aNewTemplateId); williamr@2: void RemoveFromTemplateList(const TContactItemId aOldTemplateId); williamr@2: TBool SystemTemplateFieldsValid(const CContactItem& aContact); williamr@2: void RespondToEventL(const TContactDbObserverEventType aEventType, const TContactItemId aContactId); williamr@2: void HandleDbObserverEventGroupOrContactChangedL(const TContactItemId aContactId); williamr@2: void HandleDbObserverEventGroupOrContactAddedL(const TContactDbObserverEventType aEventType, const TContactItemId aContactId); williamr@2: TBool CheckSortError(TInt aError); williamr@2: TInt NextExistingL(TInt aIndex); williamr@2: TInt PreviousExistingL(TInt aIndex); williamr@2: void ReSortL(CArrayFix* aSortOrder); williamr@2: void InsertInSortArray(const CContactItem& aContact); williamr@2: void MoveInSortArray(const CContactItem& aContact); williamr@2: void InsertInSortArrayL(const CContactItem& aContact); williamr@2: void MoveInSortArrayL(const CContactItem& aContact); williamr@2: TInt NewSortIndexL(const CContactItem& aContact,TInt aStartPos,TInt aEndPos); williamr@2: TInt CompareSortFieldsL(const CContactItem& aContact); williamr@2: void ConstructTableUsageFlagsFromSortOrderL(TInt& aFlags); williamr@2: void LoadSyncPluginL(); williamr@2: void DeleteContactSendEventActionL(TContactItemId aContactId, TCntSendEventAction aActionType); williamr@2: williamr@2: private: williamr@2: // Member variables williamr@2: RCntModel* iCntSvr; //was RDbNamedDatabase iDatabase; williamr@2: CProxyFactory* iProxyFactory; //was RDbs iDbsSession; williamr@2: TDbConnState iDbConnectionState; //was CContactClientSession* iContactClientSession; williamr@2: CDataBaseChangeObserver* iDataBaseObserver; //was CPrivateDbChangeNotifier* iDbChangeNotifier; williamr@2: CCntIdleSorter* iIdleSorter; //was CPrivateSvrSessionManager* iServerSessionManager; williamr@2: CPrivConverter* iConv; //was TContactItemId iLastLockedContactId; williamr@2: TBool iTablesOpen; //was TContactItemId iTemplateId; williamr@2: CContactItemViewDef* iAllFieldsView; //was TContactItemId iOwnCardId; williamr@2: TUid iDbViewContactType; //used to select which contact type to sort / search on williamr@2: williamr@2: //These two members are accessed via the inline functions! williamr@2: CContactIdArray* iCardTemplateIds; williamr@2: CContactIdArray* iGroupIds; williamr@2: williamr@2: CCntTemplateCache* iTemplateCache; //was CContactTables* iItemTable; williamr@2: CContactTextDef* iTextDef; //remains williamr@2: CContactIdArray* iSortedItems; //remains williamr@2: CContactViewDef* iView; //remains williamr@2: williamr@2: // Used in SetLastSyncDateL() and GetLastSyncDateL() williamr@2: TTime iSyncDate; //was TInt64 iMachineUniqueId; williamr@2: TCollationMethod iCollateMethod; //remains: used for sorting contacts williamr@2: williamr@2: TInt iAsyncActivityCount; williamr@2: CContactSynchroniser* iContactSynchroniser; //a handle to the synchroniser plugin williamr@4: CArrayFix* iSortOrder; // holds a sort order passed into SortL(), as in cntmodelv1, williamr@4: // for delayed deletion to maintain backwards compatibility williamr@2: }; williamr@2: williamr@2: williamr@2: class CContactChangeNotifier : public CBase williamr@2: /** Receives events reporting changes to a contact database. williamr@2: williamr@2: After the change notifier has been created, it notifies the specified williamr@2: observer whenever a change takes place to the database. williamr@2: williamr@2: @publishedAll williamr@2: @released williamr@2: */ williamr@2: { williamr@2: public: williamr@2: IMPORT_C ~CContactChangeNotifier(); williamr@2: IMPORT_C static CContactChangeNotifier* NewL(CContactDatabase& aDatabase, MContactDbObserver *aObserver); williamr@2: private: williamr@2: CContactChangeNotifier(CContactDatabase& aDatabase, MContactDbObserver *aObserver); williamr@2: void ConstructL(); williamr@2: private: williamr@2: CContactDatabase &iDatabase; williamr@2: MContactDbObserver* iObserver; williamr@2: }; williamr@2: williamr@2: williamr@4: /** The UID of the default vCard converter implemented by an ECom plugin. williamr@4: @publishedAll williamr@4: @released williamr@4: */ williamr@2: #define KUidEComCntVCardConverterDefaultImplementation 0x102035F9 williamr@2: /** The UID of the default vCard converter plugin implementation. This williamr@4: implementation is independent of the plugin framework used. williamr@4: @publishedAll williamr@4: @released williamr@4: */ williamr@2: #define KUidVCardConvDefaultImpl KUidEComCntVCardConverterDefaultImplementation williamr@2: williamr@4: #ifndef SYMBIAN_ENABLE_SPLIT_HEADERS williamr@4: williamr@4: /** The UID of the vCard converter ECom plugin interface. williamr@4: @released williamr@4: @internalTechnology williamr@4: */ williamr@2: const TUid KUidEcomCntVCardConverterInterface = {0x102035F7}; williamr@2: williamr@4: /** The UID of the phone number parser ECom plugin interface. williamr@4: @released williamr@4: @internalTechnology williamr@4: */ williamr@2: const TUid KUidEcomCntPhoneNumberParserInterface = {0x102035FA}; williamr@2: williamr@2: /** The UID of PBAP vCard Converter plugin Implementation. williamr@2: @internalTechnology williamr@4: @released williamr@2: */ williamr@2: #define KUidPBAPVCardConvImpl 0xA00015C1 williamr@2: williamr@4: #endif //SYMBIAN_ENABLE_SPLIT_HEADERS williamr@4: williamr@2: class TPluginParameters williamr@2: /** williamr@2: Class used to pack the extra arguments required for a PBAP conveter, williamr@2: PBAP client provides these arguments using overloaded CContactDatabase::ExportSelectedContacts. williamr@4: @publishedAll williamr@4: @released williamr@2: */ williamr@2: { williamr@2: public: williamr@2: TPluginParameters(TInt64 aContactFieldFilter, MConverterCallBack* aCallback, TVCardVersion aVersion, TBool aExportTel); williamr@2: TInt64 GetFilter()const; williamr@2: MConverterCallBack* GetCallback()const; williamr@2: TVCardVersion GetExportVersion()const; williamr@2: TBool IsExportTel()const; williamr@2: private: williamr@2: TInt64 iFilter; williamr@2: MConverterCallBack* iCallback; williamr@2: TVCardVersion iVersion; williamr@2: TBool iExportTel; williamr@2: }; williamr@2: williamr@2: inline TBool TPluginParameters::IsExportTel()const williamr@2: { williamr@2: return iExportTel; williamr@2: } williamr@2: inline TInt64 TPluginParameters::GetFilter()const williamr@2: { williamr@2: return iFilter; williamr@2: } williamr@2: williamr@2: inline MConverterCallBack* TPluginParameters::GetCallback()const williamr@2: { williamr@2: return iCallback; williamr@2: } williamr@2: williamr@2: inline TVCardVersion TPluginParameters::GetExportVersion()const williamr@2: { williamr@2: return iVersion; williamr@2: } williamr@2: williamr@2: inline TPluginParameters::TPluginParameters(TInt64 aContactFieldFilter, MConverterCallBack* aCallback, TVCardVersion aVersion, TBool aExportTel):iFilter(aContactFieldFilter), iCallback(aCallback), iVersion(aVersion), iExportTel(aExportTel) williamr@2: { williamr@2: } williamr@2: williamr@2: class CContactConverter : public CBase williamr@2: /** Provides functionality to import and export vCards. williamr@2: One or more vCards can be imported from a read stream (the vCards are converted williamr@2: into contact items and added to the database). Also, contact items can be exported as vCards. williamr@4: @publishedAll williamr@2: @released williamr@2: */ williamr@2: { williamr@2: public: williamr@2: virtual CArrayPtr* ImportL(CContactDatabase& aDb,RReadStream& aReadStream,TBool& aImportSuccessful,TInt aOptions,TBool aImportSingle)=0; williamr@2: virtual void ExportL(CContactDatabase& aDb,const CContactIdArray& aSelectedContactIds,RWriteStream& aWriteStream,TInt aOptions,const Versit::TVersitCharSet aCharSet,TBool aExportPrivateFields, TInt aCommitNumber=10)=0; williamr@2: }; williamr@2: williamr@2: williamr@2: class CContactEcomConverter : public CContactConverter williamr@2: /** williamr@2: It provides Ecom Framework based facilities to resolve and load the appropriate implementations at run-time. williamr@2: The framework supplies a default resolver for selecting appropriate implementations. williamr@4: @publishedAll williamr@2: @released williamr@2: */ williamr@2: { williamr@2: public: williamr@2: static CContactEcomConverter* NewL(TUid aImplementationUid); williamr@2: static CContactEcomConverter* NewL(TUid aImplementationUid, TInt64 aContactFieldFilter, MConverterCallBack* aCallback, TVCardVersion aVersion, TBool aExportTel); williamr@2: inline virtual ~CContactEcomConverter(); williamr@2: private: williamr@2: TUid iDtor_ID_Key; williamr@2: }; williamr@2: williamr@2: inline CContactEcomConverter* CContactEcomConverter::NewL(TUid aImplementationUid) williamr@2: /** Allocates and instantiates an interface implementation to satisfy the specified interface. williamr@2: @param aImplementationUid Denotes the type of implemetation that needs to be loaded. williamr@2: @return A pointer to a newly allocated and initialised object of type CContactEcomConverter. */ williamr@2: williamr@2: { williamr@2: TAny* ptr = REComSession::CreateImplementationL(aImplementationUid, williamr@2: _FOFF(CContactEcomConverter, williamr@2: iDtor_ID_Key)); williamr@2: return reinterpret_cast(ptr); williamr@2: } williamr@2: williamr@2: inline CContactEcomConverter* CContactEcomConverter::NewL(TUid aImplementationUid, TInt64 aContactFieldFilter, MConverterCallBack* aCallback, TVCardVersion aVersion, TBool aExportTel) williamr@2: /** Allocates and instantiates an interface implementation for PBAP export. williamr@2: @param aImplementationUid Denotes the type of implemetation that needs to be loaded. williamr@2: @param aContactFieldFilter Specifies contact fields to be exported. williamr@2: @param aCallback Callback to client for providing intra-contact properties. williamr@2: @param aVersion Denotes the vCard version for contact export. williamr@2: @return A pointer to a newly allocated and initialised object of type CContactEcomConverter. */ williamr@2: williamr@2: { williamr@2: TPluginParameters partr(aContactFieldFilter,aCallback,aVersion,aExportTel); williamr@2: williamr@2: TAny* ptr = REComSession::CreateImplementationL(aImplementationUid, williamr@2: _FOFF(CContactEcomConverter, williamr@2: iDtor_ID_Key), &partr); williamr@2: return reinterpret_cast(ptr); williamr@2: } williamr@2: williamr@2: inline CContactEcomConverter::~CContactEcomConverter() williamr@2: /** The destruction of the interface implementation referred to by iDtor_ID_Key */ williamr@2: { williamr@2: REComSession::DestroyedImplementation(iDtor_ID_Key); williamr@2: } williamr@2: williamr@4: #ifndef SYMBIAN_ENABLE_SPLIT_HEADERS williamr@2: class CContactPhoneNumberParser : public CBase williamr@2: /** Provides functionality to extract the real phone number from a contact's phone number field. williamr@2: @publishedPartner williamr@2: @released williamr@2: */ williamr@2: { williamr@2: public: williamr@2: virtual void ExtractRawNumber(const TDesC& aTextualNumber, TDes& aRawNumber)=0; williamr@2: }; williamr@2: williamr@2: williamr@2: class CContactEcomPhoneNumberParser : public CContactPhoneNumberParser williamr@2: /** It provides Ecom Framework based facilities to resolve and load the appropriate implementations at run-time. williamr@2: The framework supplies a default resolver for selecting appropriate implementations. williamr@2: @publishedPartner williamr@2: @released williamr@2: */ williamr@2: { williamr@2: public: williamr@2: static CContactEcomPhoneNumberParser* NewL(TUid aImplementationUid); williamr@2: inline virtual ~CContactEcomPhoneNumberParser(); williamr@2: private: williamr@2: TUid iDtor_ID_Key; williamr@2: }; williamr@2: williamr@2: inline CContactEcomPhoneNumberParser* CContactEcomPhoneNumberParser::NewL(TUid aImplementationUid) williamr@2: /** Allocates and Instantiates an interface implementation to satisfy the specified interface. williamr@2: @param aImplementationUid denotes the type of implemetation that need to be loaded. williamr@2: @return A pointer to a newly allocated and initialised object of type CContactEcomPhoneNumberParser. */ williamr@2: { williamr@2: TAny* ptr = REComSession::CreateImplementationL(aImplementationUid, williamr@2: _FOFF(CContactEcomPhoneNumberParser, williamr@2: iDtor_ID_Key)); williamr@2: return reinterpret_cast(ptr); williamr@2: } williamr@2: williamr@2: inline CContactEcomPhoneNumberParser::~CContactEcomPhoneNumberParser() williamr@2: /** The destruction of the interface implementation referred to by iDtor_ID_Key */ williamr@2: { williamr@2: REComSession::DestroyedImplementation(iDtor_ID_Key); williamr@2: } williamr@4: #endif //SYMBIAN_ENABLE_SPLIT_HEADERS williamr@2: williamr@2: inline TInt CContactDatabase::TemplateCount() const williamr@2: /** Gets the number of contact card templates that exist in the database. williamr@2: This does not include the system template. williamr@2: @deprecated williamr@2: @return The number of contact card templates that exist in the database. */ williamr@2: { return iCardTemplateIds->Count(); } williamr@2: williamr@2: inline TInt CContactDatabase::GroupCount() const williamr@2: /** Gets the number of groups that exist in the database. williamr@2: @deprecated williamr@2: @return The number of groups that exist in the database. */ williamr@2: { return iGroupIds->Count(); } williamr@2: williamr@2: inline TInt CContactDatabase::NullUidValue() williamr@2: /** Gets the NULL contact ID value. williamr@2: williamr@2: @return KNullContactId. */ williamr@2: { return KNullContactId; } williamr@2: williamr@2: inline TUid CContactItemViewDef::operator[](TInt aIndex) const williamr@2: /** Gets the field type located at a specified index position within the field type array. williamr@2: williamr@2: @param aIndex The position of the field type in the array, relative to zero. It williamr@2: must be non-negative and less than the number of objects in the array otherwise the williamr@2: function raises a panic. williamr@2: @return The field type located at index aIndex within the array (this is equivalent to a williamr@2: TFieldType). */ williamr@2: { return iFieldTypes[aIndex]; } williamr@2: williamr@2: inline TInt CContactItemViewDef::Count() const williamr@2: /** Gets the number of field types in the view definition. williamr@2: williamr@2: @return The number of field types in the view definition. */ williamr@2: { return iFieldTypes.Count(); } williamr@2: williamr@2: inline void CContactItemViewDef::Reset() williamr@2: /** Deletes all field types from the view definition's field type array. */ williamr@2: { iFieldTypes.Reset(); } williamr@2: williamr@2: inline CContactItemViewDef::TUse CContactItemViewDef::Use() const williamr@2: /** Gets the view definition's use. williamr@2: williamr@2: @return The current TUse setting. */ williamr@2: { return iUse; } williamr@2: williamr@2: inline void CContactItemViewDef::SetUse(CContactItemViewDef::TUse aUse) williamr@2: /** Sets the view definition's use. williamr@2: williamr@2: @param aUse The new TUse setting. */ williamr@2: { iUse=aUse; } williamr@2: williamr@2: inline CContactItemViewDef::TMode CContactItemViewDef::Mode() const williamr@2: /** Gets the view definition's mode. williamr@2: williamr@2: @return The current TMode setting. */ williamr@2: { return iMode; } williamr@2: williamr@2: inline void CContactItemViewDef::SetMode(CContactItemViewDef::TMode aMode) williamr@2: /** Sets the view definition's mode. williamr@2: williamr@2: @param aMode The new TMode setting. */ williamr@2: { iMode=aMode; } williamr@2: williamr@2: inline CContactDatabase::TSortPref::TSortPref() williamr@2: : iOrder(EAsc), iFieldType(KNullUid) williamr@2: /** Constructs a TSortPref object. The order is initialised to EAsc and the field williamr@2: type to KNullUid. williamr@2: @deprecated williamr@2: */ williamr@2: {} williamr@2: williamr@2: inline CContactDatabase::TSortPref::TSortPref(TFieldType aFieldType,TOrder aOrder) williamr@2: : iOrder(aOrder), iFieldType(aFieldType) williamr@2: /** Constructs the TSortPref object with a field type and an order. williamr@2: @param aFieldType Specifies the field type to sort on. williamr@2: @param aOrder Specifies the sort order. williamr@2: @deprecated williamr@2: */ williamr@2: {} williamr@2: williamr@2: williamr@2: /** A class that manages the asynchronous open operation for a CContactDatabase. williamr@2: williamr@2: The object can be deleted before the asynchronous open completes. This will set williamr@2: the state of the client supplied TRequestStatus to KErrCancel. williamr@2: williamr@2: When the client supplied TRequestStatus is completed with KErrNone the TakeDatabase() williamr@2: method is called to pass ownership of the open database to the client. williamr@2: williamr@2: @publishedAll williamr@2: @released williamr@2: williamr@2: @see CContactDatabase::OpenL() williamr@2: */ williamr@2: class CContactOpenOperation : private CActive williamr@2: { williamr@2: public: williamr@2: IMPORT_C CContactDatabase* TakeDatabase(); williamr@2: IMPORT_C ~CContactOpenOperation(); williamr@2: williamr@2: static CContactOpenOperation* NewL(TRequestStatus& aPtrStatus); williamr@2: static CContactOpenOperation* NewL(const TDesC& aFileName, TRequestStatus& aPtrStatus); williamr@2: williamr@2: private: williamr@2: // from CActive (for BC reasons) williamr@2: void RunL(); williamr@2: TInt RunError(TInt aError); williamr@2: void DoCancel(); williamr@2: williamr@2: CContactOpenOperation (TRequestStatus& aClientStatus); williamr@2: void ConstructL (const TDesC& aFileName = KNullDesC); williamr@2: williamr@2: private: williamr@2: TRequestStatus* iClientStatus; williamr@2: CContactDatabase* iContactDatabase; williamr@2: }; williamr@2: williamr@2: williamr@2: #endif //__CNTDB_H__