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