epoc32/include/app/cntdb.h
author William Roberts <williamr@symbian.org>
Wed, 31 Mar 2010 12:27:01 +0100
branchSymbian2
changeset 3 e1b950c65cb4
parent 2 epoc32/include/cntdb.h@2fe1408b6811
child 4 837f303aceeb
permissions -rw-r--r--
Attempt to represent the S^2->S^3 header reorganisation as a series of "hg rename" operations
williamr@2
     1
// Copyright (c) 1997-2009 Nokia Corporation and/or its subsidiary(-ies).
williamr@2
     2
// All rights reserved.
williamr@2
     3
// This component and the accompanying materials are made available
williamr@2
     4
// under the terms of the License "Symbian Foundation License v1.0" to Symbian Foundation members and "Symbian Foundation End User License Agreement v1.0" to non-members
williamr@2
     5
// which accompanies this distribution, and is available
williamr@2
     6
// at the URL "http://www.symbianfoundation.org/legal/licencesv10.html".
williamr@2
     7
//
williamr@2
     8
// Initial Contributors:
williamr@2
     9
// Nokia Corporation - initial contribution.
williamr@2
    10
//
williamr@2
    11
// Contributors:
williamr@2
    12
//
williamr@2
    13
// Description:
williamr@2
    14
//
williamr@2
    15
williamr@2
    16
#ifndef __CNTDB_H__
williamr@2
    17
#define __CNTDB_H__
williamr@2
    18
williamr@2
    19
// System includes
williamr@2
    20
#include <e32base.h>
williamr@2
    21
#include <cntdef.h>
williamr@2
    22
#include <cntdbobs.h>
williamr@2
    23
#include <cntsync.h>
williamr@2
    24
#include <s32file.h>
williamr@2
    25
#include <badesca.h>
williamr@2
    26
#include <versit.h>
williamr@2
    27
#include <collate.h>
williamr@2
    28
williamr@2
    29
#include <ecom/ecom.h>
williamr@2
    30
williamr@2
    31
// Classes referenced
williamr@2
    32
//
williamr@2
    33
class CContactViewDef;
williamr@2
    34
class CFoundMatches;
williamr@2
    35
class CContactTextDef;
williamr@2
    36
class CContactItem;
williamr@2
    37
class CContactItemViewDef;
williamr@2
    38
class CContactItemFieldSet;
williamr@2
    39
class CContactItemFieldDef;
williamr@2
    40
class CContactActiveCompress;
williamr@2
    41
class CContactActiveRecover;
williamr@2
    42
class CContactDatabase;
williamr@2
    43
class CContactTables;
williamr@2
    44
class CCntFilter;
williamr@2
    45
class CContentType;
williamr@2
    46
class CContactItemField;
williamr@2
    47
class CIdleFinder;
williamr@2
    48
class CContactClientSession;
williamr@2
    49
class CPrivConverter;
williamr@2
    50
class RCntModel;
williamr@2
    51
class CProxyFactory;
williamr@2
    52
class CCntTemplateCache;
williamr@2
    53
class CSortArray;
williamr@2
    54
class CCntIdleSorter;
williamr@2
    55
class MLplPersistenceLayerFactory;
williamr@2
    56
class CContactOpenOperation;
williamr@2
    57
class CDataBaseChangeObserver;
williamr@2
    58
class CContactConverter;
williamr@2
    59
williamr@2
    60
// Constants
williamr@2
    61
const TInt KMaxContactTextSeperator=4;
williamr@2
    62
const TInt KTextFieldMinimalLength=64;
williamr@2
    63
const TInt KMaxCustomFilterableFields=4;
williamr@2
    64
williamr@2
    65
const TInt KMajorVersion=1;
williamr@2
    66
const TInt KMinorVersion=0;
williamr@2
    67
const TInt KBuildNumber=40;
williamr@2
    68
williamr@2
    69
williamr@2
    70
//
williamr@2
    71
// Classes used for compact
williamr@2
    72
//
williamr@2
    73
williamr@2
    74
class MContactStorageObserver
williamr@2
    75
/**
williamr@2
    76
Mixin used to observe low disk events
williamr@2
    77
williamr@2
    78
@publishedAll
williamr@2
    79
@released
williamr@2
    80
*/
williamr@2
    81
	{
williamr@2
    82
public:
williamr@2
    83
	virtual void HandleDiskSpaceEvent(TInt aDrive) = 0;
williamr@2
    84
	};
williamr@2
    85
williamr@2
    86
class MContactUiCompactObserver
williamr@2
    87
/** Mixin used to observe contact database compaction status
williamr@2
    88
@publishedAll
williamr@2
    89
@released
williamr@2
    90
*/
williamr@2
    91
	{
williamr@2
    92
public:
williamr@2
    93
	virtual void Step(TInt aStep)=0;
williamr@2
    94
	virtual void HandleError(TInt aError)=0;
williamr@2
    95
	};
williamr@2
    96
williamr@2
    97
class MContactUiActive
williamr@2
    98
/**  Mixin used to register the observer.
williamr@2
    99
@publishedAll
williamr@2
   100
@released
williamr@2
   101
*/
williamr@2
   102
	{
williamr@2
   103
public:
williamr@2
   104
	virtual void Cancel()=0;
williamr@2
   105
	virtual void SetObserver(MContactUiCompactObserver *aObserver)=0;
williamr@2
   106
	virtual TInt StepsTogo() const=0;
williamr@2
   107
	virtual TInt Step()=0;
williamr@2
   108
	virtual TInt Error() const=0;
williamr@2
   109
private:
williamr@2
   110
	IMPORT_C virtual void MContactUiActive_Reserved1();
williamr@2
   111
	};
williamr@2
   112
williamr@2
   113
class CContactActiveBase : public CBase, public MContactUiActive
williamr@2
   114
/**
williamr@2
   115
@internalTechnology
williamr@2
   116
*/
williamr@2
   117
	{
williamr@2
   118
public:
williamr@2
   119
	~CContactActiveBase();
williamr@2
   120
	void SetObserver(MContactUiCompactObserver *aObserver);
williamr@2
   121
	void Cancel();
williamr@2
   122
	TInt StepsTogo() const;
williamr@2
   123
	TInt Step();
williamr@2
   124
	TInt Error() const;
williamr@2
   125
	void SetContactDatabase(CContactDatabase* aContactDatabase);
williamr@2
   126
	void SetFileManager(RCntModel& aCntSvr);
williamr@2
   127
	
williamr@2
   128
#ifndef __SYMBIAN_CNTMODEL_USE_SQLITE__ 	
williamr@2
   129
protected:
williamr@2
   130
	void ConstructL();
williamr@2
   131
	static TInt CompactCallBack(TAny *aThis);
williamr@2
   132
protected:
williamr@2
   133
	MContactUiCompactObserver *iObserver;
williamr@2
   134
	RCntModel* iCntSvr; 
williamr@2
   135
	CIdle *iIdle;
williamr@2
   136
	TInt iStep;
williamr@2
   137
	TInt iError;
williamr@2
   138
	CContactDatabase* iContactDatabase;
williamr@2
   139
#endif	
williamr@2
   140
	};
williamr@2
   141
	
williamr@2
   142
class CContactActiveCompress : public CContactActiveBase
williamr@2
   143
/**
williamr@2
   144
@publishedAll
williamr@2
   145
@released
williamr@2
   146
*/
williamr@2
   147
	{
williamr@2
   148
public:
williamr@2
   149
#if !( defined __SYMBIAN_CNTMODEL_HIDE_DBMS__ && defined __SYMBIAN_CNTMODEL_USE_SQLITE__ )
williamr@2
   150
    void ConstructL(RDbNamedDatabase /* &aDataBase */) {};
williamr@2
   151
#endif	
williamr@2
   152
	};
williamr@2
   153
williamr@2
   154
class CContactActiveRecover : public CContactActiveBase
williamr@2
   155
/**
williamr@2
   156
@publishedAll
williamr@2
   157
@released
williamr@2
   158
*/
williamr@2
   159
	{
williamr@2
   160
public:
williamr@2
   161
#if !( defined __SYMBIAN_CNTMODEL_HIDE_DBMS__ && defined __SYMBIAN_CNTMODEL_USE_SQLITE__ )
williamr@2
   162
    void ConstructL(RDbNamedDatabase /* &aDataBase */) {};
williamr@2
   163
#endif	
williamr@2
   164
	};
williamr@2
   165
williamr@2
   166
williamr@2
   167
williamr@2
   168
williamr@2
   169
class TContactTextDefItem
williamr@2
   170
/** An item in a text definition.
williamr@2
   171
williamr@2
   172
A TContactTextDefItem has a field type and an optional separator string
williamr@2
   173
with a maximum length of 4 characters.
williamr@2
   174
williamr@2
   175
@see CContactTextDef
williamr@2
   176
@publishedAll
williamr@2
   177
@released
williamr@2
   178
*/
williamr@2
   179
	{
williamr@2
   180
public:
williamr@2
   181
	IMPORT_C TContactTextDefItem();
williamr@2
   182
	IMPORT_C TContactTextDefItem(TFieldType aFieldType);
williamr@2
   183
	IMPORT_C TContactTextDefItem(TFieldType aFieldType, const TDesC &aSeperator);
williamr@2
   184
public:
williamr@2
   185
	/** The field type. */
williamr@2
   186
	TFieldType iFieldType;
williamr@2
   187
	/** The string used to separate the fields in the text definition. */
williamr@2
   188
	TBuf<KMaxContactTextSeperator> iSeperator;
williamr@2
   189
	};
williamr@2
   190
williamr@2
   191
class CContactTextDef : public CArrayFixFlat<TContactTextDefItem>
williamr@2
   192
/** Defines a way of grouping fields to form a string which represents
williamr@2
   193
a contact item.
williamr@2
   194
williamr@2
   195
A text definition is implemented as an array of text definition items
williamr@2
   196
(TContactTextDefItems).
williamr@2
   197
williamr@2
   198
For example, CContactDatabase::ReadContactTextDefL() uses a text definition to
williamr@2
   199
build up a string from a contact item. When creating the string, it searches
williamr@2
   200
the item for fields whose type matches one of the fields specified in the text
williamr@2
   201
definition. The contents of the first matching field of each type found in the
williamr@2
   202
item are read into the string. These strings may be separated using a field
williamr@2
   203
separator, which is also specified in the text definition. A separator is not
williamr@2
   204
appended to the last field used to make up the string. It is only inserted when
williamr@2
   205
there is a following non-empty field.
williamr@2
   206
williamr@2
   207
Additionally, the text definition may also contain a fallback field
williamr@2
   208
type. This is used when none of the fields specified in the text
williamr@2
   209
definition contain any text. If the item's fallback field contains no text
williamr@2
   210
either, or if the fallback field type's value is KUidContactFieldNone, the
williamr@2
   211
text is read from the first non-empty field in the item.
williamr@2
   212
williamr@2
   213
A contact database can have a default text definition which is set using CContactDatabase::SetTextDefinitionL().
williamr@2
   214
This may be overridden using the variants of CContactDatabase::ReadContactTextDefL()
williamr@2
   215
which take a CContactTextDef* argument.
williamr@2
   216
williamr@2
   217
CContactTextDef is derived from CArrayFixFlat<TContactTextDefItem>, so all
williamr@2
   218
relevant functions can be used, e.g. to add and remove elements.
williamr@2
   219
williamr@2
   220
@publishedAll
williamr@2
   221
@released
williamr@2
   222
*/
williamr@2
   223
	{
williamr@2
   224
	friend class CContactDatabase;
williamr@2
   225
	friend class CContactTables;
williamr@2
   226
public:
williamr@2
   227
	CContactTextDef();
williamr@2
   228
	IMPORT_C static CContactTextDef* NewL();
williamr@2
   229
	IMPORT_C static CContactTextDef* NewLC();
williamr@2
   230
	static CContactTextDef* NewLC(RReadStream& aStream);
williamr@2
   231
	IMPORT_C void SetFallbackField(TFieldType iFieldType);
williamr@2
   232
	IMPORT_C TFieldType FallbackField() const;
williamr@2
   233
	IMPORT_C TBool ExactMatchOnly();
williamr@2
   234
	IMPORT_C void SetExactMatchOnly(TBool aExactMatchOnly);
williamr@2
   235
	void ExternalizeL(RWriteStream& aStream) const;
williamr@2
   236
	void InternalizeL(RReadStream& aStream);	
williamr@2
   237
private:
williamr@2
   238
	TFieldType iFallbackFieldType;
williamr@2
   239
	TBool iExactMatchOnly;//Default to EFalse cause ReadInTextDef to only match the chosen fields and not attempt a matchall
williamr@2
   240
	};
williamr@2
   241
williamr@2
   242
class CContactItemViewDef : public CBase
williamr@2
   243
/** A view definition for a contact item.
williamr@2
   244
williamr@2
   245
When reading or opening a contact item using the CContactDatabase class,
williamr@2
   246
a view definition may be specified to indicate which field data should be
williamr@2
   247
retrieved. See for instance CContactDatabase::ReadContactL().
williamr@2
   248
williamr@2
   249
A view definition for a contact item contains an array of field types, a use
williamr@2
   250
(CContactItemViewDef::TUse) and a mode (CContactItemViewDef::TMode). The use
williamr@2
   251
indicates whether the field types contained in the view definition should
williamr@2
   252
be included in or excluded from the view. The mode indicates whether fields
williamr@2
   253
with the hidden attribute should be included or excluded.
williamr@2
   254
williamr@2
   255
@publishedAll
williamr@2
   256
@released
williamr@2
   257
*/
williamr@2
   258
	{
williamr@2
   259
public:
williamr@2
   260
	/** Include or exclude specified fields. */
williamr@2
   261
	enum TUse
williamr@2
   262
			{
williamr@2
   263
			/** Include specified fields in the view. */
williamr@2
   264
			EIncludeFields,
williamr@2
   265
			/** Exclude specified fields from the view. */
williamr@2
   266
			EMaskFields
williamr@2
   267
			};
williamr@2
   268
	/** Include or exclude hidden fields.*/
williamr@2
   269
	enum TMode
williamr@2
   270
			{
williamr@2
   271
			/** Include hidden fields in the view. */
williamr@2
   272
			EIncludeHiddenFields,
williamr@2
   273
			/** Exclude hidden fields from the view. */
williamr@2
   274
			EMaskHiddenFields
williamr@2
   275
			};
williamr@2
   276
public:
williamr@2
   277
	IMPORT_C static CContactItemViewDef* NewL(TUse aUse, TMode aMode);
williamr@2
   278
	IMPORT_C static CContactItemViewDef* NewLC(TUse aUse, TMode aMode);
williamr@2
   279
	static CContactItemViewDef* NewLC(RReadStream& aStream);
williamr@2
   280
    inline TUid operator[](TInt aIndex) const;
williamr@2
   281
    IMPORT_C TInt Find(const CContentType &aContentType) const;
williamr@2
   282
    IMPORT_C TInt Find(TFieldType aFieldType) const;
williamr@2
   283
    inline TInt Count() const;
williamr@2
   284
    inline void Reset();
williamr@2
   285
	IMPORT_C void AddL(TFieldType aFieldType);
williamr@2
   286
	IMPORT_C void Remove(TFieldType aFieldType);
williamr@2
   287
	IMPORT_C void Remove(TInt aIndex);
williamr@2
   288
	inline TUse Use() const;
williamr@2
   289
	inline void SetUse(TUse aUse);
williamr@2
   290
	inline TMode Mode() const;
williamr@2
   291
	inline void SetMode(TMode aMode);
williamr@2
   292
	IMPORT_C TBool Contains(const CContactItem& aItem);
williamr@2
   293
	IMPORT_C void InternalizeL(RReadStream& aStream);
williamr@2
   294
	IMPORT_C void ExternalizeL(RWriteStream& aStream) const;
williamr@2
   295
	IMPORT_C TBool MatchesAll() const;
williamr@2
   296
private:
williamr@2
   297
	CContactItemViewDef(TUse aUse,TMode aMode);
williamr@2
   298
private:
williamr@2
   299
    CArrayFixFlat<TUid> iFieldTypes;
williamr@2
   300
	TUse iUse;
williamr@2
   301
	TMode iMode;
williamr@2
   302
	};
williamr@2
   303
williamr@2
   304
class CContactViewDef : public CBase
williamr@2
   305
/** Specifies a subset of fields to be loaded when reading a contact item.
williamr@2
   306
williamr@2
   307
A default view definition is owned by the contact database.
williamr@2
   308
It is set using CContactDatabase::SetViewDefinitionL() and is used in calls
williamr@2
   309
to CContactDatabase::ReadContactL(), ReadContactLC() and ReadContactAndAgentL()
williamr@2
   310
when no view definition is specified.
williamr@2
   311
williamr@2
   312
The view definition owns the item view definition (see the CContactItemViewDef
williamr@2
   313
class), which stores the view definition's field types, use and mode.
williamr@2
   314
williamr@2
   315
The following functions declared in class CContactViewDef have not been
williamr@2
   316
implemented:- Groups(), AddL().
williamr@2
   317
williamr@2
   318
@publishedAll
williamr@2
   319
@released
williamr@2
   320
*/
williamr@2
   321
	{
williamr@2
   322
public:
williamr@2
   323
	IMPORT_C static CContactViewDef* NewL();
williamr@2
   324
	IMPORT_C static CContactViewDef* NewLC();
williamr@2
   325
	IMPORT_C static CContactViewDef* NewL(CContactItemViewDef* aItemDef);
williamr@2
   326
	IMPORT_C static CContactViewDef* NewLC(CContactItemViewDef* aItemDef);
williamr@2
   327
	static CContactViewDef* NewLC(RReadStream& aStream);
williamr@2
   328
	IMPORT_C ~CContactViewDef();
williamr@2
   329
	IMPORT_C void InternalizeL(RReadStream& aStream);
williamr@2
   330
	IMPORT_C void ExternalizeL(RWriteStream& aStream) const;
williamr@2
   331
	IMPORT_C CContactItemViewDef& ItemDef() const;
williamr@2
   332
	/** This function is not implemented    */
williamr@2
   333
	IMPORT_C CContactIdArray& Groups() const;
williamr@2
   334
	/** This function is not implemented. 
williamr@2
   335
	@param aFieldType The field type to append to the array of field types. */
williamr@2
   336
	inline void AddL(TFieldType aFieldType);
williamr@2
   337
private:
williamr@2
   338
	CContactViewDef();
williamr@2
   339
	void ConstructL(CContactItemViewDef* aItemDef);
williamr@2
   340
private:
williamr@2
   341
	CContactItemViewDef* iItemDef;
williamr@2
   342
//	CContactIdArray* iGroupIds; // unused for now
williamr@2
   343
	};
williamr@2
   344
williamr@2
   345
class TContactIter
williamr@2
   346
/** Iterates through the sorted contact items in a contact database.
williamr@2
   347
williamr@2
   348
A value of KNullContactId is returned by the iterator if a requested item cannot
williamr@2
   349
be found.
williamr@2
   350
williamr@2
   351
@publishedAll
williamr@2
   352
@released
williamr@2
   353
*/
williamr@2
   354
	{
williamr@2
   355
public:
williamr@2
   356
	IMPORT_C TContactIter(CContactDatabase &aDatabase);
williamr@2
   357
	IMPORT_C TContactItemId FirstL();
williamr@2
   358
	IMPORT_C TContactItemId NextL();
williamr@2
   359
	IMPORT_C TContactItemId PreviousL();
williamr@2
   360
	IMPORT_C TContactItemId LastL();
williamr@2
   361
	IMPORT_C void GotoL(TContactItemId aContactId);
williamr@2
   362
	IMPORT_C void Reset();
williamr@2
   363
private:
williamr@2
   364
	void GotoIndexL(TInt aPos);
williamr@2
   365
private:
williamr@2
   366
	CContactDatabase &iDatabase;
williamr@2
   367
	TContactItemId iCursorId;
williamr@2
   368
	};
williamr@2
   369
williamr@2
   370
class MIdleFindObserver
williamr@2
   371
/** The interface for an asynchronous find observer.
williamr@2
   372
williamr@2
   373
An object which implements this interface is passed to the asynchronous find
williamr@2
   374
functions defined in class CContactDatabase, (FindAsyncL() and FindInTextDefAsyncL()).
williamr@2
   375
The observer would typically notify the user of the progress of the operation.
williamr@2
   376
williamr@2
   377
@publishedAll
williamr@2
   378
@released
williamr@2
   379
*/
williamr@2
   380
	{
williamr@2
   381
public:
williamr@2
   382
	/** Asynchronous find observer callback.
williamr@2
   383
williamr@2
   384
	If an observer is supplied to CContactDatabase::FindAsyncL()
williamr@2
   385
	or FindInTextDefAsyncL(), this callback function is called by CIdle::RunL()
williamr@2
   386
	when nothing of a higher priority can be scheduled. It is called for every
williamr@2
   387
	16 items searched to give the application a chance to update its search status.
williamr@2
   388
williamr@2
   389
	An implementation might test for and handle errors and retrieve information
williamr@2
   390
	about the progress of the search. This information may be retrieved using
williamr@2
   391
	functions provided by the CIdleFinder class. */
williamr@2
   392
	virtual void IdleFindCallback()=0;
williamr@2
   393
	};
williamr@2
   394
williamr@2
   395
struct SFindInTextDefWordParser
williamr@2
   396
/** Search string parser struct.
williamr@2
   397
williamr@2
   398
An object of this type is used in the callback parser function passed to
williamr@2
   399
CContactDatabase::FindInTextDefLC(). The parser function must walk
williamr@2
   400
through and parse iSearchString, adding any words found to iWordArray.
williamr@2
   401
williamr@2
   402
@publishedAll
williamr@2
   403
@released
williamr@2
   404
*/
williamr@2
   405
	{
williamr@2
   406
public:
williamr@2
   407
	inline SFindInTextDefWordParser(const TDesC *aSearchString, CDesCArray *aWordArray) : iSearchString(aSearchString), iWordArray(aWordArray)
williamr@2
   408
	/** Initialises the search string and the word array.
williamr@2
   409
williamr@2
   410
	@param aSearchString Pointer to the input string to be parsed.
williamr@2
   411
	@param aWordArray Pointer to the array to which words parsed from the input
williamr@2
   412
	string should be added. */
williamr@2
   413
		{};
williamr@2
   414
public:
williamr@2
   415
	/** Pointer to the input string to be parsed. */
williamr@2
   416
	const TDesC *iSearchString;
williamr@2
   417
	/** Pointer to the array to which words parsed from the input string should be
williamr@2
   418
	added. */
williamr@2
   419
	CDesCArray *iWordArray;
williamr@2
   420
	};
williamr@2
   421
williamr@2
   422
class CIdleFinder : public CIdle
williamr@2
   423
/** Provides information about the progress of an asynchronous contact database search,
williamr@2
   424
and can be used to get the results of the search.
williamr@2
   425
williamr@2
   426
An instance of this class is returned by calls to CContactDatabase::FindAsyncL()
williamr@2
   427
and CContactDatabase::FindInTextDefAsyncL().
williamr@2
   428
williamr@2
   429
@publishedAll
williamr@2
   430
@released
williamr@2
   431
*/
williamr@2
   432
	{
williamr@2
   433
public:
williamr@2
   434
	~CIdleFinder();
williamr@2
   435
	IMPORT_C TBool IsComplete() const;
williamr@2
   436
	IMPORT_C CContactIdArray *TakeContactIds();
williamr@2
   437
	IMPORT_C TInt Error() const;
williamr@2
   438
	TInt RunError(TInt aError);
williamr@2
   439
private:
williamr@2
   440
	friend class CContactDatabase;
williamr@2
   441
	static CIdleFinder *NewL(CContactDatabase &aContactDatabase, const TDesC& aText, const CContactItemFieldDef *aFieldDef, MIdleFindObserver *aObserver);
williamr@2
   442
	static CIdleFinder *NewL(CContactDatabase &aContactDatabase, const MDesCArray* aFindWords,const CContactTextDef* aTextDef, MIdleFindObserver *aObserver, const TCallBack &aWordParserCallback);
williamr@2
   443
	void DoCancel();
williamr@2
   444
	void Start();
williamr@2
   445
	static TInt CallbackL(TAny *aSelf);
williamr@2
   446
	void ConstructL(const TDesC *aText, const MDesCArray* aFindWords, const TCallBack *aWordParserCallback);
williamr@2
   447
	TBool ScanForMatchL(const TDesC &aFieldText,const TDesC &aFindText, CFoundMatches *aFoundMatches) const;
williamr@2
   448
	TBool CheckFindL(TContactItemId aContactId) const;
williamr@2
   449
	TBool CheckFindL() const;
williamr@2
   450
	CIdleFinder(CContactDatabase &aContactDatabase, const CContactItemFieldDef *aFieldDef, const CContactTextDef* aTextDef, MIdleFindObserver *aObserver);
williamr@2
   451
	TBool doFindL();
williamr@2
   452
williamr@2
   453
	enum TAsyncFindState
williamr@2
   454
		{
williamr@2
   455
		EFindInBlobFinished				=0x00000001,
williamr@2
   456
		EFindInIdentityFinished			=0x00000002,
williamr@2
   457
		EFindInEmailFinished			=0x00000004,
williamr@2
   458
		EFindInTextDefFinished			=0x00000008
williamr@2
   459
		};
williamr@2
   460
private:
williamr@2
   461
	CContactDatabase *iContactDatabase;
williamr@2
   462
	CContactIdArray *iIdsFound;
williamr@2
   463
	TBool iOwnsIds;
williamr@2
   464
	CDesCArray*		iFindWords;
williamr@2
   465
	TInt iReserved1;
williamr@2
   466
	TInt iReserved2;
williamr@2
   467
	TInt iReserved3;
williamr@2
   468
	const CContactItemFieldDef* iFieldDef;
williamr@2
   469
	const CContactTextDef* iTextDef;
williamr@2
   470
	MIdleFindObserver *iObserver;
williamr@2
   471
	TInt iError;
williamr@2
   472
	TCallBack iWordParserCallback;
williamr@2
   473
	TInt iReserved4;
williamr@2
   474
	TInt iReserved5;
williamr@2
   475
	TInt iReserved6;
williamr@2
   476
	TInt iReserved7; //was 	TDbColNo
williamr@2
   477
	TInt iReserved8; //was 	RDbView
williamr@2
   478
	TInt iReserved9; //was 	RDbView
williamr@2
   479
	TInt iReserved10; //was CIdentityTableColSet*
williamr@2
   480
	};
williamr@2
   481
williamr@2
   482
class MContactDbPrivObserver
williamr@2
   483
/** Provides notification of database changes to clients. 
williamr@2
   484
* Provides information about database change event details and the type of changed event.
williamr@2
   485
@publishedAll
williamr@2
   486
@released
williamr@2
   487
*/
williamr@2
   488
	{
williamr@2
   489
public:
williamr@2
   490
williamr@2
   491
#if !( defined __SYMBIAN_CNTMODEL_HIDE_DBMS__ && defined __SYMBIAN_CNTMODEL_USE_SQLITE__ )
williamr@2
   492
	virtual void HandleDatabaseEventL(RDbNotifier::TEvent)=0;
williamr@2
   493
#endif	
williamr@2
   494
	virtual void HandleDatabaseEventL(const TContactDbObserverEvent &aEvent)=0;
williamr@2
   495
	};
williamr@2
   496
williamr@2
   497
williamr@2
   498
class MContactSortObserver
williamr@2
   499
/**
williamr@2
   500
@publishedAll
williamr@2
   501
@deprecated
williamr@2
   502
*/
williamr@2
   503
	{
williamr@2
   504
public:
williamr@2
   505
    /**
williamr@2
   506
    @deprecated
williamr@2
   507
    */
williamr@2
   508
	virtual void HandleSortEventL(TInt aContactsSorted, TInt aContactsTotal)=0;
williamr@2
   509
	};
williamr@2
   510
williamr@2
   511
class MConverterCallBack
williamr@2
   512
/**
williamr@2
   513
Interface class for providing Intra-Contact Properties during a PBAP specific contacts export.
williamr@2
   514
@prototype
williamr@2
   515
@internalTechnology
williamr@2
   516
*/
williamr@2
   517
{
williamr@2
   518
	public:
williamr@2
   519
	/**
williamr@2
   520
	PBAP clients are supposed to provide any information regarding the contact item represented by aContactId.
williamr@2
   521
	This information should be in form of standard vCard property, all such properties should be appended to the array aPropertyList.
williamr@2
   522
	*/
williamr@2
   523
	virtual	void AddIntraContactPropertiesL(const TContactItemId& aContactId, CArrayPtr<CParserProperty>* aPropertyList) = 0;
williamr@2
   524
};
williamr@2
   525
williamr@2
   526
enum TVCardVersion
williamr@2
   527
/**
williamr@2
   528
Specifies type of export of contact items.
williamr@2
   529
PBAP clients should use EPBAPVCard21 and EPBAPVCard30.
williamr@2
   530
@prototype
williamr@2
   531
@internalTechnology
williamr@2
   532
*/
williamr@2
   533
	{
williamr@2
   534
	EVCardUDEF = -1,
williamr@2
   535
	EVCard21 = 0,
williamr@2
   536
	EVCard30,
williamr@2
   537
	EPBAPVCard21,
williamr@2
   538
	EPBAPVCard30
williamr@2
   539
	};
williamr@2
   540
williamr@2
   541
class CContactDatabase : public CBase, public MContactDbPrivObserver, public MContactStorageObserver
williamr@2
   542
/** A database of contact items.
williamr@2
   543
williamr@2
   544
Contact items can be added to and removed from the database and items in the
williamr@2
   545
database can be opened or read. To edit an item, it must first be opened.
williamr@2
   546
Changes to the item can then be committed using CommitContactL()
williamr@2
   547
(committing can only take place to an open item).
williamr@2
   548
williamr@2
   549
If the available disk space is less than 128 kilobytes then changes to the
williamr@2
   550
contact database cannot be started, and methods such as CreateL() or CommitContactL()
williamr@2
   551
will leave with a KErrDiskFull error. Less obviously OpenL() can also fail with
williamr@2
   552
KErrDiskFull when trying to update the system template.
williamr@2
   553
williamr@2
   554
Each item has an access count. An item cannot be fully deleted unless its
williamr@2
   555
access count is zero. This is to prevent items which have been
williamr@2
   556
synchronised with another contacts application from being deleted.
williamr@2
   557
Also, if the item is a template, it cannot be deleted if other items are based
williamr@2
   558
on it.
williamr@2
   559
williamr@2
   560
More than one contact database can exist on a phone, but there is a
williamr@2
   561
default contact database. Its filename is contacts.cdb. It
williamr@2
   562
can be moved between drives.
williamr@2
   563
williamr@2
   564
CContactDatabase implements searching and sorting and also provides
williamr@2
   565
separate phone number matching functions. These provide a fast way of indexing
williamr@2
   566
and looking up phone numbers, e.g. for looking up caller IDs on incoming
williamr@2
   567
calls.
williamr@2
   568
williamr@2
   569
The database owns speed dial information. This is a mapping between a single
williamr@2
   570
digit integer and a telephone number. There may be up to 9 speed dial telephone
williamr@2
   571
numbers; each of them belongs to a contact item in the database. If a
williamr@2
   572
contact item is deleted, its speed dial mapping is removed.
williamr@2
   573
williamr@2
   574
The following functions defined in class CContactDatabase are not
williamr@2
   575
supported. If called, they leave with KErrNotSupported.
williamr@2
   576
williamr@2
   577
- ReplacePrefL()
williamr@2
   578
williamr@2
   579
- ReadPrefL()
williamr@2
   580
williamr@2
   581
- CreatePrefL()
williamr@2
   582
williamr@2
   583
@publishedAll
williamr@2
   584
@released
williamr@2
   585
*/
williamr@2
   586
	{
williamr@2
   587
	friend class TContactIter;
williamr@2
   588
	friend class CIdleFinder;
williamr@2
   589
	friend class CCntIdleSorter;
williamr@2
   590
	friend class CContactLocalView;
williamr@2
   591
	friend class CContactOpenOperation;
williamr@2
   592
	friend class RContactRemoteView;
williamr@2
   593
	friend class CViewIteratorProxyManager;
williamr@2
   594
	friend class CCollectionProxy;
williamr@2
   595
	friend class CContactActiveBase;
williamr@2
   596
public:
williamr@2
   597
	class TSortPref
williamr@2
   598
	/** Specifies the field type and order preferences used for sorting items in the
williamr@2
   599
	contacts database.
williamr@2
   600
williamr@2
   601
	The contents of the first field in a contact item matching the field type
williamr@2
   602
	is used as the data to sort on. The order can either be ascending or descending.
williamr@2
   603
williamr@2
   604
	@see CContactDatabase::SortL()
williamr@2
   605
	@see CContactDatabase::SortArrayL()
williamr@2
   606
	@publishedAll
williamr@2
   607
	@deprecated
williamr@2
   608
	*/
williamr@2
   609
		{
williamr@2
   610
	public:
williamr@2
   611
		/** The sort order. */
williamr@2
   612
		enum TOrder
williamr@2
   613
			{
williamr@2
   614
			/** Ascending sort order. */
williamr@2
   615
			EAsc,
williamr@2
   616
			/** Descending sort order. */
williamr@2
   617
			EDesc
williamr@2
   618
			};
williamr@2
   619
	public:
williamr@2
   620
		inline TSortPref();
williamr@2
   621
		inline TSortPref(TFieldType aFieldType,TOrder aOrder=EAsc);
williamr@2
   622
		IMPORT_C void ExternalizeL(RWriteStream& aStream) const;
williamr@2
   623
		IMPORT_C void InternalizeL(RReadStream& aStream);
williamr@2
   624
	public:
williamr@2
   625
		/** Specifies whether the sort should be ascending or descending. */
williamr@2
   626
		TOrder iOrder;
williamr@2
   627
		/** The first field matching this field type is used for the text to sort on. */
williamr@2
   628
		TFieldType iFieldType;
williamr@2
   629
		};
williamr@2
   630
williamr@2
   631
	/** Import and export format flags. Contacts can be imported into
williamr@2
   632
	or exported from the contact database as vCards.
williamr@2
   633
williamr@2
   634
	The following options are available during import and export.
williamr@2
   635
williamr@2
   636
	@deprecated This enum is deprecated. It has been replaced by the TOptions enum in
williamr@2
   637
	the plugin convertor class CContactVCardConverter, so that each plugin converter
williamr@2
   638
	can define its own options. */
williamr@2
   639
	enum TOptions
williamr@2
   640
  		{
williamr@2
   641
  		EDefault=0x0000,
williamr@2
   642
		/** Handle Symbian's extended vCard format options. */
williamr@2
   643
		EIncludeX =0x0001,
williamr@2
   644
		/** Support non-standard extensions requried by Symbian PC connectivity software
williamr@2
   645
		and Microsoft, amongst others. */
williamr@2
   646
  		ETTFormat =0x0002,
williamr@2
   647
		/** Don't export the contact ID (for exporting only). */
williamr@2
   648
		EExcludeUid=0x0004,
williamr@2
   649
		/** Decrease the contact's access count when importing and exporting. */
williamr@2
   650
		EDecreaseAccessCount=0x0008,
williamr@2
   651
		/** Only import the first contact in the read stream (for importing only). */
williamr@2
   652
		EImportSingleContact=0x0010,
williamr@2
   653
		/** Increase the contact's access count when importing and exporting. */
williamr@2
   654
		EIncreaseAccessCount=0x0020,
williamr@2
   655
		/** Sets a contact item to the local time when importing. */
williamr@2
   656
		ELocalTime=0x0040,
williamr@2
   657
		/** Allows you to set a template to a contact item that does not exist. */
williamr@2
   658
		ENullTemplateId=0x0080,
williamr@2
   659
		/** For use by implementor of converter plug-in. */
williamr@2
   660
		EConverterDefined1=0x0100,
williamr@2
   661
		/** For use by implementor of converter plug-in. */
williamr@2
   662
		EConverterDefined2=0x0200,
williamr@2
   663
		/** For use by implementor of converter plug-in. */
williamr@2
   664
		EConverterDefined3=0x0400,
williamr@2
   665
		/** For use by implementor of converter plug-in. */
williamr@2
   666
		EConverterDefined4=0x0800,
williamr@2
   667
		/** For use by implementor of converter plug-in. */
williamr@2
   668
		EConverterDefined5=0x1000,
williamr@2
   669
		/** For use by implementor of converter plug-in. */
williamr@2
   670
		EConverterDefined6=0x2000,
williamr@2
   671
		/** For use by implementor of converter plug-in. */
williamr@2
   672
		EConverterDefined7=0x4000,
williamr@2
   673
		/** For use by implementor of converter plug-in. */
williamr@2
   674
		EConverterDefined8=0x8000,
williamr@2
   675
		/** Reserved for use by Symbian. */
williamr@2
   676
		EConverterReserved1=0x00010000, 
williamr@2
   677
		/** Reserved for use by Symbian. */
williamr@2
   678
		EConverterReserved2=0x00020000, 
williamr@2
   679
		/** Reserved for use by Symbian. */
williamr@2
   680
		EConverterReserved3=0x00040000, 
williamr@2
   681
		/** Reserved for use by Symbian. */
williamr@2
   682
		EConverterReserved4=0x00080000, 
williamr@2
   683
		/** Reserved for use by Symbian. */
williamr@2
   684
		EConverterReserved5=0x00100000, 
williamr@2
   685
		/** Reserved for use by Symbian. */
williamr@2
   686
		EConverterReserved6=0x00200000, 
williamr@2
   687
		/** Reserved for use by Symbian. */
williamr@2
   688
		EConverterReserved7=0x00400000, 
williamr@2
   689
		/** Reserved for use by Symbian. */
williamr@2
   690
		EConverterReserved8=0x00800000, 
williamr@2
   691
		/** Reserved for use by Symbian. */
williamr@2
   692
		EConverterReserved9=0x01000000, 
williamr@2
   693
		/** Reserved for use by Symbian. */
williamr@2
   694
		EConverterReserved10=0x02000000, 
williamr@2
   695
		/** Reserved for use by Symbian. */
williamr@2
   696
		EConverterReserved11=0x04000000, 
williamr@2
   697
		/** Reserved for use by Symbian. */
williamr@2
   698
		EConverterReserved12=0x08000000, 
williamr@2
   699
		/** Reserved for use by Symbian. */
williamr@2
   700
		EConverterReserved13=0x10000000, 
williamr@2
   701
		/** Reserved for use by Symbian. */
williamr@2
   702
		EConverterReserved14=0x20000000, 
williamr@2
   703
		/** Reserved for use by Symbian. */
williamr@2
   704
		EConverterReserved15=0x40000000, 
williamr@2
   705
		/** Reserved for use by Symbian. */
williamr@2
   706
		EConverterReserved16=0x80000000 
williamr@2
   707
  		};
williamr@2
   708
	/** Specifies whether the database can be accessed from single or multiple threads. */
williamr@2
   709
	enum TThreadAccess
williamr@2
   710
		{
williamr@2
   711
		/** Allows access to the contacts database from a single thread only. */
williamr@2
   712
		ESingleThread,
williamr@2
   713
		/** Allows for a multi-threaded program to access the contact database from multiple
williamr@2
   714
		threads but note that the contacts model provides no synchronisation support
williamr@2
   715
		for such use. */
williamr@2
   716
		EMultiThread
williamr@2
   717
		};
williamr@2
   718
/**
williamr@2
   719
@internalComponent
williamr@2
   720
*/
williamr@2
   721
	enum TSortDataSource
williamr@2
   722
		{
williamr@2
   723
		ENoOrder,
williamr@2
   724
		EUsesIdentityTableOnly,
williamr@2
   725
		EUsesAllTables,
williamr@2
   726
		EIdentityTableNotUsed //Not used
williamr@2
   727
		};
williamr@2
   728
public:
williamr@2
   729
	IMPORT_C static CContactDatabase* OpenL(TThreadAccess aAccess=ESingleThread);
williamr@2
   730
	IMPORT_C static CContactDatabase* OpenL(const TDesC& aFileName,TThreadAccess aAccess=ESingleThread);
williamr@2
   731
	IMPORT_C static CContactDatabase* CreateL(TThreadAccess aAccess=ESingleThread);
williamr@2
   732
	IMPORT_C static CContactDatabase* CreateL(const TDesC& aFileName,TThreadAccess aAccess=ESingleThread);
williamr@2
   733
	IMPORT_C static CContactDatabase* ReplaceL(TThreadAccess aAccess=ESingleThread);
williamr@2
   734
	IMPORT_C static CContactDatabase* ReplaceL(const TDesC& aFileName,TThreadAccess aAccess=ESingleThread);
williamr@2
   735
	// asynchronous Open
williamr@2
   736
	IMPORT_C static CContactOpenOperation* Open(TRequestStatus& aStatus, TThreadAccess aAccess=ESingleThread);
williamr@2
   737
	IMPORT_C static CContactOpenOperation* Open(const TDesC& aFileName, TRequestStatus& aStatus, TThreadAccess aAccess=ESingleThread);
williamr@2
   738
	IMPORT_C static TBool DatabaseDrive(TDriveUnit &aDriveUnit);
williamr@2
   739
	inline static TInt NullUidValue();
williamr@2
   740
	IMPORT_C static void SetDatabaseDriveL(TDriveUnit aDriveUnit, TBool aCopy=ETrue);
williamr@2
   741
	IMPORT_C static void GetDefaultNameL(TDes &aDes);
williamr@2
   742
	IMPORT_C static void DeleteDefaultFileL();
williamr@2
   743
	// database file mangement
williamr@2
   744
	IMPORT_C static void DeleteDatabaseL(const TDesC& aFileName);
williamr@2
   745
	IMPORT_C static CDesCArray* ListDatabasesL();
williamr@2
   746
	IMPORT_C static CDesCArray* ListDatabasesL(TDriveUnit aDriveUnit);
williamr@2
   747
	IMPORT_C static TBool DefaultContactDatabaseExistsL();
williamr@2
   748
	IMPORT_C static TBool ContactDatabaseExistsL(const TDesC& aFileName);
williamr@2
   749
	IMPORT_C ~CContactDatabase();
williamr@2
   750
williamr@2
   751
	IMPORT_C void SetViewDefinitionL(CContactViewDef* aView);
williamr@2
   752
	IMPORT_C void SetTextDefinitionL(CContactTextDef* aView);
williamr@2
   753
	IMPORT_C const CContactTextDef* TextDefinition() const;
williamr@2
   754
	IMPORT_C TInt CountL();
williamr@2
   755
	IMPORT_C void SetDbViewContactType(const TUid aUid);
williamr@2
   756
	IMPORT_C TUid GetDbViewContactType() const;
williamr@2
   757
williamr@2
   758
williamr@2
   759
	IMPORT_C TContactItemId AddNewContactL(CContactItem& aContact);
williamr@2
   760
williamr@2
   761
	IMPORT_C CContactItem* CreateContactGroupL(TBool aInTransaction=EFalse);
williamr@2
   762
	IMPORT_C CContactItem* CreateContactGroupLC(TBool aInTransaction=EFalse);
williamr@2
   763
	IMPORT_C CContactItem* CreateContactGroupL(const TDesC& aGroupLabel,TBool aInTransaction=EFalse);
williamr@2
   764
	IMPORT_C CContactItem* CreateContactGroupLC(const TDesC& aGroupLabel,TBool aInTransaction=EFalse);
williamr@2
   765
	IMPORT_C CContactItem* CreateContactCardTemplateL(const TDesC& aTemplateLabel,TBool aInTransaction=EFalse);
williamr@2
   766
	IMPORT_C CContactItem* CreateContactCardTemplateLC(const TDesC& aTemplateLabel,TBool aInTransaction=EFalse);
williamr@2
   767
	IMPORT_C CContactItem* CreateContactCardTemplateL(const CContactItem* aTemplate,const TDesC& aTemplateLabel,TBool aInTransaction=EFalse);
williamr@2
   768
	IMPORT_C CContactItem* CreateContactCardTemplateLC(const CContactItem* aTemplate,const TDesC& aTemplateLabel,TBool aInTransaction=EFalse);
williamr@2
   769
williamr@2
   770
	IMPORT_C CContactIdArray* GetCardTemplateIdListL() const;
williamr@2
   771
	IMPORT_C CContactIdArray* GetGroupIdListL() const;
williamr@2
   772
	IMPORT_C void AddContactToGroupL(TContactItemId aItemId, TContactItemId aGroupId);
williamr@2
   773
	IMPORT_C void AddContactToGroupL(CContactItem& aItem, CContactItem& aGroup);
williamr@2
   774
	IMPORT_C void AddContactToGroupL(TContactItemId aItemId, TContactItemId aGroupId,TBool aInTransaction);
williamr@2
   775
	IMPORT_C void RemoveContactFromGroupL(CContactItem& aItem, CContactItem& aGroup);
williamr@2
   776
	IMPORT_C void RemoveContactFromGroupL(TContactItemId aItemId, TContactItemId aGroupId);
williamr@2
   777
	inline TInt GroupCount() const;
williamr@2
   778
	inline TInt TemplateCount() const;
williamr@2
   779
williamr@2
   780
	// speed dial functions
williamr@2
   781
	IMPORT_C void SetFieldAsSpeedDialL(CContactItem& aItem, TInt aFieldIndex, TInt aSpeedDialPosition);
williamr@2
   782
	IMPORT_C TContactItemId GetSpeedDialFieldL(TInt aSpeedDialPosition, TDes& aPhoneNumber);
williamr@2
   783
	IMPORT_C void RemoveSpeedDialFieldL(TContactItemId aContactId, TInt aSpeedDialPosition);
williamr@2
   784
williamr@2
   785
	// reading contacts from the db
williamr@2
   786
	IMPORT_C CContactItem* ReadMinimalContactL(TContactItemId aContactId);
williamr@2
   787
	IMPORT_C CContactItem* ReadMinimalContactLC(TContactItemId aContactId);
williamr@2
   788
	IMPORT_C CContactItem* ReadContactL(TContactItemId aContactId);
williamr@2
   789
	IMPORT_C CArrayPtr<CContactItem>* ReadContactAndAgentL(TContactItemId aContactId);
williamr@2
   790
	IMPORT_C CContactItem* ReadContactL(TContactItemId aContactId,const CContactItemViewDef& aViewDef);
williamr@2
   791
	IMPORT_C CContactItem* ReadContactLC(TContactItemId aContactId);
williamr@2
   792
	IMPORT_C CContactItem* ReadContactLC(TContactItemId aContactId,const CContactItemViewDef& aViewDef);
williamr@2
   793
	IMPORT_C void ReadContactTextDefL(const CContactItem &aItem, TDes &aResult);
williamr@2
   794
	IMPORT_C void ReadContactTextDefL(const CContactItem &aItem, TDes &aResult,CContactTextDef* aTextDef);
williamr@2
   795
	IMPORT_C void ReadContactTextDefL(TContactItemId aContactId, TDes &aResult);
williamr@2
   796
	IMPORT_C void ReadContactTextDefL(TContactItemId aContactId, TDes &aResult,CContactTextDef* aTextDef);
williamr@2
   797
	IMPORT_C CContactItem* OpenContactL(TContactItemId aContactId);
williamr@2
   798
	IMPORT_C CContactItem* OpenContactL(TContactItemId aContactId,const CContactItemViewDef& aViewDef);
williamr@2
   799
	IMPORT_C CContactItem* OpenContactLX(TContactItemId aContactId);
williamr@2
   800
	IMPORT_C CContactItem* OpenContactLX(TContactItemId aContactId,const CContactItemViewDef& aViewDef);
williamr@2
   801
	IMPORT_C void CloseContactL(TContactItemId aContactId);
williamr@2
   802
	IMPORT_C void CommitContactL(const CContactItem& aContact);
williamr@2
   803
	IMPORT_C void DeleteContactL(TContactItemId aContactId);
williamr@2
   804
	IMPORT_C void DeleteContactsL(const CContactIdArray& aContactIds);
williamr@2
   805
  	IMPORT_C CArrayPtr<CContactItem>* ImportContactsL(const TUid& aFormat,RReadStream& aReadStream,TBool& aImportSuccessful,TInt aOption);
williamr@2
   806
  	IMPORT_C void ExportSelectedContactsL(const TUid& aFormat,const CContactIdArray& aSelectedContactIds,RWriteStream& aWriteStream,TInt aOption,TBool aExportPrivateFields=ETrue);
williamr@2
   807
  	IMPORT_C void ExportSelectedContactsL(const TUid& aFormat,const CContactIdArray& aSelectedContactIds,RWriteStream& aWriteStream,TInt aOption,const Versit::TVersitCharSet aCharSet, TBool aExportPrivateFields=ETrue);
williamr@2
   808
	IMPORT_C void CompactL();
williamr@2
   809
williamr@2
   810
	IMPORT_C CContactIdArray* FindLC(const TDesC& aText,const CContactItemFieldDef *aFieldDef);
williamr@2
   811
	IMPORT_C CIdleFinder* FindAsyncL(const TDesC& aText,const CContactItemFieldDef *aFieldDef, MIdleFindObserver *aObserver);
williamr@2
   812
	IMPORT_C CContactIdArray* FindInTextDefLC(const MDesCArray& aFindWords, const TCallBack &aWordParserCallback);
williamr@2
   813
	IMPORT_C CContactIdArray* FindInTextDefLC(const MDesCArray& aFindWords,CContactTextDef* aTextDef, const TCallBack &aWordParserCallback);
williamr@2
   814
	IMPORT_C CIdleFinder* FindInTextDefAsyncL(const MDesCArray& aFindWords, MIdleFindObserver *aObserver, const TCallBack &aWordParserCallback);
williamr@2
   815
	IMPORT_C CIdleFinder* FindInTextDefAsyncL(const MDesCArray& aFindWords,const CContactTextDef* aTextDef, MIdleFindObserver *aObserver, const TCallBack &aWordParserCallback);
williamr@2
   816
	IMPORT_C CContactIdArray* SortArrayL(const CContactIdArray* aIdArray, const CArrayFix<TSortPref>* aSortOrder);
williamr@2
   817
	IMPORT_C CContactIdArray* SortArrayLC(const CContactIdArray* aIdArray, const CArrayFix<TSortPref>* aSortOrder);
williamr@2
   818
	IMPORT_C void SortByTypeL(CArrayFix<TSortPref>* aSortOrder);
williamr@2
   819
	IMPORT_C void SortL(CArrayFix<TSortPref>* aSortOrder);
williamr@2
   820
	IMPORT_C void SortAsyncL(CArrayFix<TSortPref>* aSortOrder, TRequestStatus& aStatus);
williamr@2
   821
	IMPORT_C void CancelAsyncSort();
williamr@2
   822
	IMPORT_C void SortAsyncL(CArrayFix<TSortPref>* aSortOrder, TRequestStatus& aStatus, MContactSortObserver& aObserver);
williamr@2
   823
williamr@2
   824
	IMPORT_C void SetOperationTimeOutL(const TInt aMicroSeconds) const;
williamr@2
   825
  	IMPORT_C TPtrC FileUid();
williamr@2
   826
	IMPORT_C CContactActiveCompress* CreateCompressorLC();
williamr@2
   827
	IMPORT_C CContactActiveRecover* CreateRecoverLC();
williamr@2
   828
	IMPORT_C void RecoverL();
williamr@2
   829
	IMPORT_C TBool IsDamaged() const;
williamr@2
   830
	IMPORT_C TBool CompressRequired();
williamr@2
   831
	IMPORT_C void CloseTables();
williamr@2
   832
	IMPORT_C void OpenTablesL();
williamr@2
   833
williamr@2
   834
	//New Phone Matching function, takes a number as a TDesc& and will match from the right of the string
williamr@2
   835
	//by the the number defined
williamr@2
   836
	IMPORT_C CContactIdArray* MatchPhoneNumberL(const TDesC& aNumber, TInt aMatchLengthFromRight);
williamr@2
   837
williamr@2
   838
williamr@2
   839
	IMPORT_C const CContactIdArray* SortedItemsL();
williamr@2
   840
	IMPORT_C TContactItemId TemplateId() const;
williamr@2
   841
	IMPORT_C CContactItem* CreateOwnCardLC();
williamr@2
   842
	IMPORT_C CContactItem* CreateOwnCardL();
williamr@2
   843
	IMPORT_C TContactItemId OwnCardId() const;
williamr@2
   844
	IMPORT_C void SetOwnCardL(const CContactItem& aContact);
williamr@2
   845
williamr@2
   846
//	Preferred Template
williamr@2
   847
	IMPORT_C TContactItemId PrefTemplateId() const;
williamr@2
   848
	IMPORT_C void SetPrefTemplateL(const CContactItem& aContact);
williamr@2
   849
williamr@2
   850
//	Current item
williamr@2
   851
	IMPORT_C void SetCurrentItem(const TContactItemId aContactId);
williamr@2
   852
	IMPORT_C TContactItemId GetCurrentItem() const;
williamr@2
   853
williamr@2
   854
//	Connectivity
williamr@2
   855
	IMPORT_C void SetDateFormatTextL(const TDesC& aFormat);
williamr@2
   856
	IMPORT_C void FilterDatabaseL(CCntFilter& aFilter);
williamr@2
   857
	IMPORT_C CContactIdArray* ContactsChangedSinceL(const TTime& aTime);
williamr@2
   858
	IMPORT_C TContactSyncId SetLastSyncDateL(const TTime& aSyncDate);
williamr@2
   859
	IMPORT_C void SetLastSyncDateL(TContactSyncId aSyncId, const TTime& aSyncDate);
williamr@2
   860
	IMPORT_C void GetLastSyncDateL(TContactSyncId aSyncId, TTime& aSyncDate);
williamr@2
   861
williamr@2
   862
	IMPORT_C TInt FileSize() const;
williamr@2
   863
	IMPORT_C TInt WastedSpaceInBytes() const;
williamr@2
   864
	IMPORT_C TUint ConnectionId() const;
williamr@2
   865
	IMPORT_C const CContentType &TemplateContentType(const CContactItemField &aField) const;
williamr@2
   866
	IMPORT_C TVersion Version() const;
williamr@2
   867
	IMPORT_C TInt64 MachineId() const;
williamr@2
   868
	IMPORT_C TContactItemId ICCTemplateIdL();
williamr@2
   869
	IMPORT_C TContactItemId ICCTemplateIdL(TUid aPhonebookUid);
williamr@2
   870
	IMPORT_C TContactItemId PhonebookGroupIdL();
williamr@2
   871
williamr@2
   872
public:	// For test code only
williamr@2
   873
	IMPORT_C void DamageDatabaseL(TInt aSecretCode);	// Don't use this, you don't really want to damage your database do you?
williamr@2
   874
	IMPORT_C void OverrideMachineUniqueId(TInt64 aMachineUniqueId);
williamr@2
   875
	IMPORT_C TInt CntServerResourceCount();
williamr@2
   876
	IMPORT_C void SetCntServerHeapFailure(TInt aTAllocFailType,TInt aRate);
williamr@2
   877
	IMPORT_C CContactIdArray* DeletedContactsLC();
williamr@2
   878
	IMPORT_C void ResetServerSpeedDialsL();
williamr@2
   879
williamr@2
   880
public:	// For cnt server only
williamr@2
   881
#if !( defined __SYMBIAN_CNTMODEL_HIDE_DBMS__ && defined __SYMBIAN_CNTMODEL_USE_SQLITE__ )
williamr@2
   882
			 void HandleDatabaseEventL(RDbNotifier::TEvent) {};
williamr@2
   883
#endif
williamr@2
   884
	IMPORT_C void HandleDatabaseEventL(const TContactDbObserverEvent &aEvent);
williamr@2
   885
	IMPORT_C TInt GetCurrentDatabase(TDes& aDatabase) const;
williamr@2
   886
	IMPORT_C TInt SetCurrentDatabase(const TDesC& aDatabase) const;
williamr@2
   887
williamr@2
   888
	IMPORT_C void StoreSortOrderL();
williamr@2
   889
	IMPORT_C void RestoreSortOrderL();
williamr@2
   890
	IMPORT_C const CArrayFix<TSortPref>* SortOrder() const;
williamr@2
   891
	//Contact Hint Field Access
williamr@2
   892
williamr@2
   893
	/** Contact view filter flags.
williamr@2
   894
williamr@2
   895
	These flags define the bits that can be set in filtered views (CContactFilteredView)
williamr@2
   896
	and in the filter passed to CContactDatabase::ContactMatchesHintFieldL() for
williamr@2
   897
	comparing against contact view items (CViewContact).
williamr@2
   898
williamr@2
   899
	If the item's bit field and the view's filter have the same settings for the
williamr@2
   900
	CContactDatabase::EHome and CContactDatabase::EWork flags and any of the other
williamr@2
   901
	flags are set in both, a match occurs and the item is included in the view.
williamr@2
   902
williamr@2
   903
	Filters only apply to non-hidden contact fields with content. */
williamr@2
   904
	enum TContactViewFilter
williamr@2
   905
		{
williamr@2
   906
		/** The view is unfiltered; it includes all contact items. */
williamr@2
   907
		EUnfiltered	=0x00000000,
williamr@2
   908
		/** The filter includes items that have an email address. */
williamr@2
   909
		EMailable	=0x00000001,
williamr@2
   910
		/** The filter includes items that have a mobile telephone number. */
williamr@2
   911
		ESmsable	=0x00000002,
williamr@2
   912
		/** The filter includes items that have a landline telephone number. */
williamr@2
   913
		ELandLine	=0x00000004,
williamr@2
   914
		/** The filter includes items that have a fax number. */
williamr@2
   915
		EFaxable	=0x00000008,
williamr@2
   916
		/** The filter includes items that are phonable. (All items with any of the above
williamr@2
   917
		three flags set also have this flag set). */
williamr@2
   918
		EPhonable   =0x00000010,
williamr@2
   919
		/** The filter excludes items without a work telephone number or email address. */
williamr@2
   920
		EWork		=0x00000020,
williamr@2
   921
		/** The filter excludes items without a home telephone number or email address. */
williamr@2
   922
		EHome		=0x00000040,
williamr@2
   923
		/** The filter includes items that have a non-empty ring tone field (a ring tone
williamr@2
   924
		that is associated with the  item). */
williamr@2
   925
		ERingTone	=0x00000080,
williamr@2
   926
		/** The filter includes items that have a non-empty voice dial field (a voice
williamr@2
   927
		recording associated with a telephone number field in the  item). */
williamr@2
   928
		EVoiceDial	=0x00000100,
williamr@2
   929
		/** The filter includes items that have any non empty instant messaging address field. */
williamr@2
   930
		EIMAddress  =0x00000200,
williamr@2
   931
		/** The filter includes items that have a non empty Wireless Village ID field.
williamr@2
   932
		An item with this flag set will also have the EIMAddress flag set. */
williamr@2
   933
		EWirelessVillage = 0x00000400,
williamr@2
   934
		/** Reserved filters for future use. */
williamr@2
   935
		ECustomFilter1	 = 0x00000800,
williamr@2
   936
		/** Reserved filters for future use. */
williamr@2
   937
		ECustomFilter2	 = 0x00001000,
williamr@2
   938
		/** Reserved filters for future use. */
williamr@2
   939
		ECustomFilter3	 = 0x00002000,
williamr@2
   940
		/** Reserved filters for future use. */
williamr@2
   941
		ECustomFilter4	 = 0x00004000
williamr@2
   942
		};
williamr@2
   943
williamr@2
   944
	IMPORT_C TBool ContactMatchesHintFieldL(TInt aBitWiseFilter,TContactItemId aContactId);
williamr@2
   945
public: // for vCard converter only
williamr@2
   946
	IMPORT_C void DatabaseBeginLC(TBool aIsInTransaction);
williamr@2
   947
	IMPORT_C void DatabaseCommitLP(TBool aIsInTransaction);
williamr@2
   948
  	IMPORT_C CContactItem *UpdateContactLC(TContactItemId aContactId,CContactItem* aNewContact);
williamr@2
   949
	IMPORT_C TContactItemId doAddNewContactL(CContactItem& aContact,TBool aIsTemplate,TBool aIsInTransaction);
williamr@2
   950
	IMPORT_C void doCommitContactL(const CContactItem& aContact,TBool aIsInTransaction, TBool aSendChangedEvent);
williamr@2
   951
	IMPORT_C TContactItemId ContactIdByGuidL(const TDesC& aGuid);
williamr@2
   952
	IMPORT_C void doDeleteContactL(TContactItemId aContactId, TBool aIsInTransaction, TBool aSendChangedEvent, TBool aDecAccessCount=EFalse);
williamr@2
   953
	IMPORT_C CContactItemViewDef* AllFieldsView();
williamr@2
   954
public: // For Symbian use only
williamr@2
   955
	IMPORT_C void DatabaseBeginL(TBool aIsInTransaction);
williamr@2
   956
	IMPORT_C void DatabaseCommitL(TBool aIsInTransaction);
williamr@2
   957
	IMPORT_C void DatabaseRollback();
williamr@2
   958
	IMPORT_C void SetSortedItemsList(CContactIdArray* aSortedItems, CArrayFix<TSortPref>* aSortOrder);
williamr@2
   959
	IMPORT_C CContactIdArray* UnfiledContactsL();
williamr@2
   960
	IMPORT_C static void RecreateSystemTemplateL(const TDesC& aFileName);
williamr@2
   961
public:	// For Contacts Lock Server use only
williamr@2
   962
	IMPORT_C static CContactDatabase* LockServerConnectL(const TDesC& aFileName);
williamr@2
   963
	IMPORT_C static CContactDatabase* LockServerConnectL(const TDesC& aFileName, TInt aOperation);
williamr@2
   964
	IMPORT_C TInt LockServerCallBackL(TUint aServerOperation);
williamr@2
   965
	IMPORT_C void LockServerCleanup();
williamr@2
   966
public:
williamr@2
   967
	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
   968
private:
williamr@2
   969
	//for cntiter
williamr@2
   970
	TInt ContactPosL(TContactItemId aContactId); 
williamr@2
   971
	TInt DoGotoL(TContactItemId aContactId);
williamr@2
   972
	
williamr@2
   973
	void DoReadContactTextDefL(const CContactItemFieldSet* aFieldSet,TDes& aResult,CContactTextDef* aTextDef);
williamr@2
   974
	CContactItem* OpenNoMergeLCX(TContactItemId aContactId);
williamr@2
   975
williamr@2
   976
	void FetchGroupAndTemplateListsL();
williamr@2
   977
williamr@2
   978
public:
williamr@2
   979
	void CancelNotifyRequestL();
williamr@2
   980
	TBool IsICCSynchronisedL();
williamr@2
   981
williamr@2
   982
	//for LocalView
williamr@2
   983
	void AddObserverL(MContactDbObserver& aChangeNotifier);
williamr@2
   984
	void RemoveObserver(const MContactDbObserver& aChangeNotifier);
williamr@2
   985
williamr@2
   986
	void OpenDatabaseAsyncL(TRequestStatus& aStatus, const TDesC& aFileName = KNullDesC);
williamr@2
   987
	static void CleanupLastLockedContact(TAny *aDatabase);
williamr@2
   988
williamr@2
   989
private:
williamr@2
   990
	CContactConverter& CContactDatabase::ConverterL(const TUid& aFormat);
williamr@2
   991
	CContactConverter& CContactDatabase::ConverterL(const TUid& aFormat, const TInt64 aContactFieldFilter, MConverterCallBack* aCallback, const TVCardVersion aVersion,const TBool aExportTel);
williamr@2
   992
	static void CleanupDatabaseRollback(TAny *aDatabase);
williamr@2
   993
williamr@2
   994
	CContactIdArray* SortLC(const CArrayFix<TSortPref>* aSortOrder, const CContactIdArray* aIdArray);
williamr@2
   995
	TBool CheckType(TUid aUid) const;
williamr@2
   996
	void SortDuplicatesL(const CArrayFix<TSortPref>& aSortOrder,CSortArray& aList,TInt aPos);
williamr@2
   997
	void SortDuplicatesL(const CArrayFix<TSortPref>& aSortOrder,CSortArray& aList,
williamr@2
   998
								TInt aIndex,TInt aStartPos,TInt aEndPos);
williamr@2
   999
	TBool AddContactToSortListL(TContactItemId aReqId, TContactItemId& aActualId,CBase* aItems, TUid& aFieldType, TBool aHasSortOrder);
williamr@2
  1000
	void RemoveFromSortArray(TContactItemId aContactId);
williamr@2
  1001
	void HandleDbObserverEventGroupDeletedL(const TContactItemId aContactId);
williamr@2
  1002
	void RemoveFromGroupIds(const TContactItemId aContactId);
williamr@2
  1003
williamr@2
  1004
public:
williamr@2
  1005
	static void CleanupTableCancel(TAny *aTable);
williamr@2
  1006
/** A text buffer of KTextFieldMinimalLength used during sorting and searching of contacts  */
williamr@2
  1007
	typedef TBuf<KTextFieldMinimalLength> TTextFieldMinimal;
williamr@2
  1008
	static TUid SpeedDialFieldUidFromSpeedDialPosition(TInt aSpeedDialPosition);
williamr@2
  1009
	void HandleDiskSpaceEvent(TInt aDrive);
williamr@2
  1010
williamr@2
  1011
	/** State of database connection
williamr@2
  1012
	*/
williamr@2
  1013
	enum TDbConnState
williamr@2
  1014
		{
williamr@2
  1015
		/** Database is open, connection is available for use. */
williamr@2
  1016
		EDbConnectionOpen = 0,
williamr@2
  1017
		/** Initial state. */
williamr@2
  1018
		EDbConnectionNotReady,
williamr@2
  1019
		/** Asynchronous Open failed. */
williamr@2
  1020
		EDbConnectionFailed,
williamr@2
  1021
		/** A Rollback has occurred and a Recover is required now. */
williamr@2
  1022
		EDbConnectionRecoverRequired,
williamr@2
  1023
		/** Write access is locked during backup. */
williamr@2
  1024
		EDbConnectionWriteLockedForBackup,
williamr@2
  1025
		/** The database has been closed whilst a Restore is in progress. */
williamr@2
  1026
		EDbConnectionClosedForRestore,
williamr@2
  1027
		/** Restore is in progress need to close after current transaction. */
williamr@2
  1028
		EDbConnectionNeedToCloseForRestore,
williamr@2
  1029
		};
williamr@2
  1030
	/** Currently unused    */
williamr@2
  1031
	enum TDirection {EAsc,EDesc}; //unused
williamr@2
  1032
	void SetDbConnectionState(TDbConnState aDbConnectionState);
williamr@2
  1033
private:
williamr@2
  1034
	void CheckDbConnForWriteL() const;
williamr@2
  1035
	void CheckDbConnForReadL() const;
williamr@2
  1036
	void CheckDbConnForRecoverL() const;
williamr@2
  1037
	void CheckTemplateField(CContactItem& aCnt);
williamr@2
  1038
	static void ValidateDatabaseNameL(const TParse& aParseName);
williamr@2
  1039
	void StartAsyncActivityL();
williamr@2
  1040
	void EndAsyncActivityL();
williamr@2
  1041
	TBool DatabaseReadyL() const;
williamr@2
  1042
	enum TSvrSessionType //unused
williamr@2
  1043
		{  
williamr@2
  1044
		// Server Session is persistent, for Open(L), CreateL or ReplaceL
williamr@2
  1045
		ESvrSessionPersistent,
williamr@2
  1046
		// Server Session is temporary, for a simple static API
williamr@2
  1047
		ESvrSessionTemporary,
williamr@2
  1048
		// Session is from the Contacts Lock Server
williamr@2
  1049
		ESvrSessionFromLockServer,
williamr@2
  1050
		};
williamr@2
  1051
private: // objec construction/destruction
williamr@2
  1052
williamr@2
  1053
	CContactDatabase();
williamr@2
  1054
	static CContactDatabase* NewLC();
williamr@2
  1055
	void ConstructL();
williamr@2
  1056
	void CreateViewDefL();
williamr@2
  1057
	MLplPersistenceLayerFactory* FactoryL();
williamr@2
  1058
williamr@2
  1059
private:
williamr@2
  1060
	CContactItem* doCreateContactGroupLC(const TDesC& aGroupLabel = KNullDesC);
williamr@2
  1061
	void AddCntToOpenedGroupL(TContactItemId aItemId, CContactItem& aGroup);
williamr@2
  1062
	void ReadTemplateIds();
williamr@2
  1063
	void AddToTemplateListL(const TContactItemId aNewTemplateId);
williamr@2
  1064
	void RemoveFromTemplateList(const TContactItemId aOldTemplateId);
williamr@2
  1065
	TBool SystemTemplateFieldsValid(const CContactItem& aContact);
williamr@2
  1066
	void RespondToEventL(const TContactDbObserverEventType aEventType, const TContactItemId aContactId);
williamr@2
  1067
	void HandleDbObserverEventGroupOrContactChangedL(const TContactItemId aContactId);
williamr@2
  1068
	void HandleDbObserverEventGroupOrContactAddedL(const TContactDbObserverEventType aEventType, const TContactItemId aContactId);
williamr@2
  1069
   	TBool CheckSortError(TInt aError);
williamr@2
  1070
   	TInt NextExistingL(TInt aIndex);
williamr@2
  1071
   	TInt PreviousExistingL(TInt aIndex);
williamr@2
  1072
   	void ReSortL(CArrayFix<TSortPref>* aSortOrder);
williamr@2
  1073
   	void InsertInSortArray(const CContactItem& aContact);
williamr@2
  1074
   	void MoveInSortArray(const CContactItem& aContact);
williamr@2
  1075
   	void InsertInSortArrayL(const CContactItem& aContact);
williamr@2
  1076
   	void MoveInSortArrayL(const CContactItem& aContact);
williamr@2
  1077
	TInt NewSortIndexL(const CContactItem& aContact,TInt aStartPos,TInt aEndPos);
williamr@2
  1078
	TInt CompareSortFieldsL(const CContactItem& aContact);
williamr@2
  1079
   	void ConstructTableUsageFlagsFromSortOrderL(TInt& aFlags);
williamr@2
  1080
   	void LoadSyncPluginL();
williamr@2
  1081
   	void DeleteContactSendEventActionL(TContactItemId aContactId, TCntSendEventAction aActionType);
williamr@2
  1082
williamr@2
  1083
private:
williamr@2
  1084
	// Member variables
williamr@2
  1085
	RCntModel*					iCntSvr;			//was RDbNamedDatabase iDatabase;
williamr@2
  1086
	CProxyFactory*				iProxyFactory;		//was RDbs iDbsSession;
williamr@2
  1087
	TDbConnState				iDbConnectionState;	//was CContactClientSession* iContactClientSession;
williamr@2
  1088
	CDataBaseChangeObserver*	iDataBaseObserver;	//was CPrivateDbChangeNotifier* iDbChangeNotifier;
williamr@2
  1089
	CCntIdleSorter*				iIdleSorter;		//was CPrivateSvrSessionManager* iServerSessionManager;
williamr@2
  1090
	CPrivConverter*				iConv;				//was TContactItemId iLastLockedContactId;
williamr@2
  1091
	TBool						iTablesOpen;		//was TContactItemId iTemplateId;
williamr@2
  1092
	CContactItemViewDef*		iAllFieldsView;		//was TContactItemId iOwnCardId;
williamr@2
  1093
	TUid						iDbViewContactType;	//used to select which contact type to sort / search on
williamr@2
  1094
	
williamr@2
  1095
	//These two members are accessed via the inline functions!
williamr@2
  1096
	CContactIdArray* iCardTemplateIds;
williamr@2
  1097
	CContactIdArray* iGroupIds;
williamr@2
  1098
williamr@2
  1099
	CCntTemplateCache* iTemplateCache; //was CContactTables* iItemTable;
williamr@2
  1100
	CContactTextDef* iTextDef;		//remains
williamr@2
  1101
	CContactIdArray* iSortedItems;	//remains
williamr@2
  1102
	CContactViewDef* iView;			//remains
williamr@2
  1103
	
williamr@2
  1104
	// Used in SetLastSyncDateL() and GetLastSyncDateL()
williamr@2
  1105
	TTime iSyncDate;	//was TInt64 iMachineUniqueId;
williamr@2
  1106
	TCollationMethod iCollateMethod; //remains: used for sorting contacts
williamr@2
  1107
williamr@2
  1108
	TInt iAsyncActivityCount;
williamr@2
  1109
	CContactSynchroniser* iContactSynchroniser; //a handle to the synchroniser plugin
williamr@2
  1110
	CArrayFix<TSortPref>* iSortOrder; // holds a sort order passed into SortL(), as in cntmodelv1, 
williamr@2
  1111
									  // for delayed deletion to maintain backwards compatibility
williamr@2
  1112
	};
williamr@2
  1113
williamr@2
  1114
williamr@2
  1115
class CContactChangeNotifier : public CBase
williamr@2
  1116
/** Receives events reporting changes to a contact database.
williamr@2
  1117
williamr@2
  1118
After the change notifier has been created, it notifies the specified
williamr@2
  1119
observer whenever a change takes place to the database.
williamr@2
  1120
williamr@2
  1121
@publishedAll
williamr@2
  1122
@released
williamr@2
  1123
*/
williamr@2
  1124
	{
williamr@2
  1125
public:
williamr@2
  1126
	IMPORT_C ~CContactChangeNotifier();
williamr@2
  1127
	IMPORT_C static CContactChangeNotifier* NewL(CContactDatabase& aDatabase, MContactDbObserver *aObserver);
williamr@2
  1128
private:
williamr@2
  1129
	CContactChangeNotifier(CContactDatabase& aDatabase, MContactDbObserver *aObserver);
williamr@2
  1130
	void ConstructL();
williamr@2
  1131
private:
williamr@2
  1132
	CContactDatabase &iDatabase;
williamr@2
  1133
	MContactDbObserver* iObserver;
williamr@2
  1134
	};
williamr@2
  1135
williamr@2
  1136
williamr@2
  1137
/** The UID of the default vCard converter implemented by an ECom plugin. */
williamr@2
  1138
#define KUidEComCntVCardConverterDefaultImplementation  0x102035F9
williamr@2
  1139
/** The UID of the default vCard converter plugin implementation. This
williamr@2
  1140
implementation is independent of the plugin framework used. */
williamr@2
  1141
#define KUidVCardConvDefaultImpl 	KUidEComCntVCardConverterDefaultImplementation
williamr@2
  1142
williamr@2
  1143
/** The UID of the vCard converter ECom plugin interface. */
williamr@2
  1144
const TUid KUidEcomCntVCardConverterInterface = {0x102035F7};
williamr@2
  1145
williamr@2
  1146
/** The UID of the phone number parser ECom plugin interface. */
williamr@2
  1147
const TUid KUidEcomCntPhoneNumberParserInterface = {0x102035FA};
williamr@2
  1148
williamr@2
  1149
/** The UID of PBAP vCard Converter plugin Implementation.
williamr@2
  1150
@prototype
williamr@2
  1151
@internalTechnology
williamr@2
  1152
*/
williamr@2
  1153
#define KUidPBAPVCardConvImpl 0xA00015C1
williamr@2
  1154
williamr@2
  1155
class TPluginParameters
williamr@2
  1156
/**
williamr@2
  1157
Class used to pack the extra arguments required for a PBAP conveter,
williamr@2
  1158
PBAP client provides these arguments using overloaded CContactDatabase::ExportSelectedContacts.
williamr@2
  1159
@prototype
williamr@2
  1160
@internalComponent
williamr@2
  1161
*/
williamr@2
  1162
{
williamr@2
  1163
public:
williamr@2
  1164
	TPluginParameters(TInt64 aContactFieldFilter, MConverterCallBack* aCallback, TVCardVersion aVersion, TBool aExportTel);
williamr@2
  1165
	TInt64 GetFilter()const;
williamr@2
  1166
	MConverterCallBack* GetCallback()const;
williamr@2
  1167
	TVCardVersion GetExportVersion()const;
williamr@2
  1168
	TBool IsExportTel()const;
williamr@2
  1169
private:
williamr@2
  1170
	TInt64 iFilter;
williamr@2
  1171
	MConverterCallBack* iCallback;
williamr@2
  1172
	TVCardVersion iVersion;
williamr@2
  1173
	TBool iExportTel;
williamr@2
  1174
};
williamr@2
  1175
williamr@2
  1176
inline TBool TPluginParameters::IsExportTel()const
williamr@2
  1177
	{
williamr@2
  1178
	return iExportTel;
williamr@2
  1179
	}
williamr@2
  1180
inline TInt64 TPluginParameters::GetFilter()const
williamr@2
  1181
	{
williamr@2
  1182
	return iFilter;
williamr@2
  1183
	}
williamr@2
  1184
williamr@2
  1185
inline MConverterCallBack* TPluginParameters::GetCallback()const
williamr@2
  1186
	{
williamr@2
  1187
	return iCallback;
williamr@2
  1188
	}
williamr@2
  1189
williamr@2
  1190
inline TVCardVersion TPluginParameters::GetExportVersion()const
williamr@2
  1191
	{
williamr@2
  1192
	return iVersion;
williamr@2
  1193
	}
williamr@2
  1194
williamr@2
  1195
inline	TPluginParameters::TPluginParameters(TInt64 aContactFieldFilter, MConverterCallBack* aCallback, TVCardVersion aVersion, TBool aExportTel):iFilter(aContactFieldFilter), iCallback(aCallback), iVersion(aVersion), iExportTel(aExportTel)
williamr@2
  1196
	{
williamr@2
  1197
	}
williamr@2
  1198
williamr@2
  1199
class CContactConverter : public CBase
williamr@2
  1200
/** Provides functionality to import and export vCards.
williamr@2
  1201
One or more vCards can be imported from a read stream (the vCards are converted 
williamr@2
  1202
into contact items and added to the database). Also, contact items can be exported as vCards.
williamr@2
  1203
williamr@2
  1204
@publishedPartner
williamr@2
  1205
@released
williamr@2
  1206
*/
williamr@2
  1207
	{
williamr@2
  1208
public:
williamr@2
  1209
	virtual CArrayPtr<CContactItem>*  ImportL(CContactDatabase& aDb,RReadStream& aReadStream,TBool& aImportSuccessful,TInt aOptions,TBool aImportSingle)=0;
williamr@2
  1210
	virtual void ExportL(CContactDatabase& aDb,const CContactIdArray& aSelectedContactIds,RWriteStream& aWriteStream,TInt aOptions,const Versit::TVersitCharSet aCharSet,TBool aExportPrivateFields, TInt aCommitNumber=10)=0;
williamr@2
  1211
	};
williamr@2
  1212
williamr@2
  1213
williamr@2
  1214
class CContactEcomConverter : public CContactConverter
williamr@2
  1215
/**
williamr@2
  1216
It provides Ecom Framework based facilities to resolve and load the appropriate implementations at run-time.
williamr@2
  1217
The framework supplies a default resolver for selecting appropriate implementations.
williamr@2
  1218
@publishedPartner
williamr@2
  1219
@released
williamr@2
  1220
*/
williamr@2
  1221
	{
williamr@2
  1222
public:
williamr@2
  1223
	static CContactEcomConverter* NewL(TUid aImplementationUid);
williamr@2
  1224
	static CContactEcomConverter* NewL(TUid aImplementationUid, TInt64 aContactFieldFilter, MConverterCallBack* aCallback, TVCardVersion aVersion, TBool aExportTel);
williamr@2
  1225
	inline virtual ~CContactEcomConverter();
williamr@2
  1226
private:
williamr@2
  1227
	TUid iDtor_ID_Key;
williamr@2
  1228
	};
williamr@2
  1229
williamr@2
  1230
inline CContactEcomConverter* CContactEcomConverter::NewL(TUid aImplementationUid)
williamr@2
  1231
/** Allocates and instantiates an interface implementation to satisfy the specified interface.
williamr@2
  1232
@param aImplementationUid Denotes the type of implemetation that needs to be loaded.
williamr@2
  1233
@return A pointer to a newly allocated and initialised object of type CContactEcomConverter.   */
williamr@2
  1234
	
williamr@2
  1235
{
williamr@2
  1236
	TAny* ptr = REComSession::CreateImplementationL(aImplementationUid,
williamr@2
  1237
													_FOFF(CContactEcomConverter,
williamr@2
  1238
														  iDtor_ID_Key));
williamr@2
  1239
	return reinterpret_cast<CContactEcomConverter*>(ptr);
williamr@2
  1240
}
williamr@2
  1241
williamr@2
  1242
inline CContactEcomConverter* CContactEcomConverter::NewL(TUid aImplementationUid, TInt64 aContactFieldFilter, MConverterCallBack* aCallback, TVCardVersion aVersion, TBool aExportTel)
williamr@2
  1243
/** Allocates and instantiates an interface implementation for PBAP export.
williamr@2
  1244
@param aImplementationUid Denotes the type of implemetation that needs to be loaded.
williamr@2
  1245
@param aContactFieldFilter Specifies contact fields to be exported.
williamr@2
  1246
@param aCallback Callback to client for providing intra-contact properties.
williamr@2
  1247
@param aVersion Denotes the vCard version for contact export.
williamr@2
  1248
@return A pointer to a newly allocated and initialised object of type CContactEcomConverter.   */
williamr@2
  1249
	
williamr@2
  1250
{	
williamr@2
  1251
	TPluginParameters partr(aContactFieldFilter,aCallback,aVersion,aExportTel);
williamr@2
  1252
	
williamr@2
  1253
	TAny* ptr = REComSession::CreateImplementationL(aImplementationUid,
williamr@2
  1254
													_FOFF(CContactEcomConverter,
williamr@2
  1255
													  iDtor_ID_Key), &partr);
williamr@2
  1256
	return reinterpret_cast<CContactEcomConverter*>(ptr);
williamr@2
  1257
}
williamr@2
  1258
williamr@2
  1259
inline CContactEcomConverter::~CContactEcomConverter()
williamr@2
  1260
/** The destruction of the interface implementation referred to by iDtor_ID_Key */
williamr@2
  1261
	{
williamr@2
  1262
	REComSession::DestroyedImplementation(iDtor_ID_Key);
williamr@2
  1263
	}
williamr@2
  1264
williamr@2
  1265
williamr@2
  1266
class CContactPhoneNumberParser : public CBase
williamr@2
  1267
/** Provides functionality to extract the real phone number from a contact's phone number field.
williamr@2
  1268
@publishedPartner
williamr@2
  1269
@released
williamr@2
  1270
*/
williamr@2
  1271
	{
williamr@2
  1272
public:
williamr@2
  1273
	virtual void ExtractRawNumber(const TDesC& aTextualNumber, TDes& aRawNumber)=0;
williamr@2
  1274
	};
williamr@2
  1275
williamr@2
  1276
williamr@2
  1277
class CContactEcomPhoneNumberParser : public CContactPhoneNumberParser
williamr@2
  1278
/** It provides Ecom Framework based facilities to resolve and load the appropriate implementations at run-time.
williamr@2
  1279
The framework supplies a default resolver for selecting appropriate implementations.
williamr@2
  1280
@publishedPartner
williamr@2
  1281
@released
williamr@2
  1282
*/
williamr@2
  1283
	{
williamr@2
  1284
public:
williamr@2
  1285
	static CContactEcomPhoneNumberParser* NewL(TUid aImplementationUid);
williamr@2
  1286
	inline virtual ~CContactEcomPhoneNumberParser();
williamr@2
  1287
private:
williamr@2
  1288
	TUid iDtor_ID_Key;
williamr@2
  1289
	};
williamr@2
  1290
williamr@2
  1291
inline CContactEcomPhoneNumberParser* CContactEcomPhoneNumberParser::NewL(TUid aImplementationUid)
williamr@2
  1292
/** Allocates and Instantiates an interface implementation to satisfy the specified interface. 
williamr@2
  1293
@param aImplementationUid denotes the type of implemetation that need to be loaded.
williamr@2
  1294
@return A pointer to a newly allocated and initialised object of type CContactEcomPhoneNumberParser.   */
williamr@2
  1295
	{
williamr@2
  1296
	TAny* ptr = REComSession::CreateImplementationL(aImplementationUid,
williamr@2
  1297
													_FOFF(CContactEcomPhoneNumberParser,
williamr@2
  1298
														  iDtor_ID_Key));
williamr@2
  1299
	return reinterpret_cast<CContactEcomPhoneNumberParser*>(ptr);
williamr@2
  1300
	}
williamr@2
  1301
williamr@2
  1302
inline CContactEcomPhoneNumberParser::~CContactEcomPhoneNumberParser()
williamr@2
  1303
/** The destruction of the interface implementation referred to by iDtor_ID_Key */
williamr@2
  1304
	{
williamr@2
  1305
	REComSession::DestroyedImplementation(iDtor_ID_Key);
williamr@2
  1306
	}
williamr@2
  1307
williamr@2
  1308
williamr@2
  1309
inline TInt CContactDatabase::TemplateCount() const
williamr@2
  1310
/** Gets the number of contact card templates that exist in the database.
williamr@2
  1311
This does not include the system template.
williamr@2
  1312
@deprecated
williamr@2
  1313
@return The number of contact card templates that exist in the database. */
williamr@2
  1314
	{ return iCardTemplateIds->Count(); }
williamr@2
  1315
williamr@2
  1316
inline TInt CContactDatabase::GroupCount() const
williamr@2
  1317
/** Gets the number of groups that exist in the database.
williamr@2
  1318
@deprecated
williamr@2
  1319
@return The number of groups that exist in the database. */
williamr@2
  1320
	{ return iGroupIds->Count(); }
williamr@2
  1321
williamr@2
  1322
inline TInt CContactDatabase::NullUidValue()
williamr@2
  1323
/** Gets the NULL contact ID value.
williamr@2
  1324
williamr@2
  1325
@return KNullContactId. */
williamr@2
  1326
	{ return KNullContactId; }
williamr@2
  1327
williamr@2
  1328
inline TUid CContactItemViewDef::operator[](TInt aIndex) const
williamr@2
  1329
/** Gets the field type located at a specified index position within the field type array.
williamr@2
  1330
williamr@2
  1331
@param aIndex The position of the field type in the array, relative to zero. It
williamr@2
  1332
must be non-negative and less than the number of objects in the array otherwise the
williamr@2
  1333
function raises a panic.
williamr@2
  1334
@return The field type located at index aIndex within the array (this is equivalent to a
williamr@2
  1335
TFieldType). */
williamr@2
  1336
    { return iFieldTypes[aIndex]; }
williamr@2
  1337
williamr@2
  1338
inline TInt CContactItemViewDef::Count() const
williamr@2
  1339
/** Gets the number of field types in the view definition.
williamr@2
  1340
williamr@2
  1341
@return The number of field types in the view definition. */
williamr@2
  1342
    { return iFieldTypes.Count(); }
williamr@2
  1343
williamr@2
  1344
inline void CContactItemViewDef::Reset()
williamr@2
  1345
/** Deletes all field types from the view definition's field type array. */
williamr@2
  1346
    { iFieldTypes.Reset(); }
williamr@2
  1347
williamr@2
  1348
inline CContactItemViewDef::TUse CContactItemViewDef::Use() const
williamr@2
  1349
/** Gets the view definition's use.
williamr@2
  1350
williamr@2
  1351
@return The current TUse setting. */
williamr@2
  1352
	{ return iUse; }
williamr@2
  1353
williamr@2
  1354
inline void CContactItemViewDef::SetUse(CContactItemViewDef::TUse aUse)
williamr@2
  1355
/** Sets the view definition's use.
williamr@2
  1356
williamr@2
  1357
@param aUse The new TUse setting. */
williamr@2
  1358
	{ iUse=aUse; }
williamr@2
  1359
williamr@2
  1360
inline CContactItemViewDef::TMode CContactItemViewDef::Mode() const
williamr@2
  1361
/** Gets the view definition's mode.
williamr@2
  1362
williamr@2
  1363
@return The current TMode setting. */
williamr@2
  1364
	{ return iMode; }
williamr@2
  1365
williamr@2
  1366
inline void CContactItemViewDef::SetMode(CContactItemViewDef::TMode aMode)
williamr@2
  1367
/** Sets the view definition's mode.
williamr@2
  1368
williamr@2
  1369
@param aMode The new TMode setting. */
williamr@2
  1370
	{ iMode=aMode; }
williamr@2
  1371
williamr@2
  1372
inline CContactDatabase::TSortPref::TSortPref()
williamr@2
  1373
	: iOrder(EAsc), iFieldType(KNullUid)
williamr@2
  1374
/** Constructs a TSortPref object. The order is initialised to EAsc and the field
williamr@2
  1375
type to KNullUid.
williamr@2
  1376
@deprecated
williamr@2
  1377
*/
williamr@2
  1378
	{}
williamr@2
  1379
williamr@2
  1380
inline CContactDatabase::TSortPref::TSortPref(TFieldType aFieldType,TOrder aOrder)
williamr@2
  1381
	: iOrder(aOrder), iFieldType(aFieldType)
williamr@2
  1382
/** Constructs the TSortPref object with a field type and an order.
williamr@2
  1383
@param aFieldType Specifies the field type to sort on.
williamr@2
  1384
@param aOrder Specifies the sort order.
williamr@2
  1385
@deprecated
williamr@2
  1386
*/
williamr@2
  1387
	{}
williamr@2
  1388
williamr@2
  1389
williamr@2
  1390
/** A class that manages the asynchronous open operation for a CContactDatabase.
williamr@2
  1391
williamr@2
  1392
The object can be deleted before the asynchronous open completes. This will set
williamr@2
  1393
the state of the client supplied TRequestStatus to KErrCancel.
williamr@2
  1394
williamr@2
  1395
When the client supplied TRequestStatus is completed with KErrNone the TakeDatabase()
williamr@2
  1396
method is called to pass ownership of the open database to the client.
williamr@2
  1397
williamr@2
  1398
@publishedAll
williamr@2
  1399
@released
williamr@2
  1400
williamr@2
  1401
@see CContactDatabase::OpenL()
williamr@2
  1402
*/
williamr@2
  1403
class CContactOpenOperation : private CActive
williamr@2
  1404
	{
williamr@2
  1405
public:
williamr@2
  1406
	IMPORT_C CContactDatabase* TakeDatabase();
williamr@2
  1407
	IMPORT_C ~CContactOpenOperation();
williamr@2
  1408
williamr@2
  1409
	static CContactOpenOperation* NewL(TRequestStatus& aPtrStatus);
williamr@2
  1410
	static CContactOpenOperation* NewL(const TDesC& aFileName, TRequestStatus& aPtrStatus);
williamr@2
  1411
williamr@2
  1412
private:
williamr@2
  1413
	// from CActive (for BC reasons)
williamr@2
  1414
	void RunL();
williamr@2
  1415
	TInt RunError(TInt aError);
williamr@2
  1416
	void DoCancel();
williamr@2
  1417
williamr@2
  1418
	CContactOpenOperation (TRequestStatus& aClientStatus);
williamr@2
  1419
	void ConstructL		  (const TDesC& aFileName = KNullDesC);
williamr@2
  1420
williamr@2
  1421
private:
williamr@2
  1422
	TRequestStatus*  	iClientStatus;
williamr@2
  1423
	CContactDatabase*	iContactDatabase;
williamr@2
  1424
	};
williamr@2
  1425
williamr@2
  1426
williamr@2
  1427
#endif //__CNTDB_H__