--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/contactextensions/predefinedcontacts/src/pdcdata.cpp Tue Feb 02 10:12:17 2010 +0200
@@ -0,0 +1,271 @@
+/*
+* Copyright (c) 2007 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description: Predefined contacts engine (state machine)
+*
+*/
+
+// System includes
+#include <cntdb.h> // CContactDatabase
+#include <centralrepository.h> // CRepository
+#include <centralrepository.h> // CRepository
+#include <f32file.h> // RFs
+#include <CVPbkContactLinkArray.h> // CVPbkContactLinkArray
+
+// User includes
+#include "pdcdata.h" // CPdcData
+
+
+// Constants
+
+/**
+ * Cenrep key for the predefined contacts
+ */
+const TInt KCRUidPredefinedContacts = 0x2000BEE5;
+
+/**
+ * Default file location index in cenrep file
+ */
+const TInt KPdcFileLocation = 2;
+
+/**
+ * Pdc data file name
+ */
+_LIT( KPdcDataFileName, "c:\\private\\2000BEE5\\pdcdatafile");
+_LIT( KPdcDataFilePath, "c:\\private\\2000BEE5\\");
+/**
+ * Pdc data file major version number
+ */
+const TInt KPdcMajorVersion = 1;
+
+/**
+ * Pdc data file minor version number
+ */
+const TInt KPdcMinorVersion = 0;
+
+// ======== MEMBER FUNCTIONS ========
+
+// ---------------------------------------------------------------------------
+// CPdcData::NewLC
+// Symbian 1st phase constructor
+// @param aFs file system
+// @param aContactIds ids of any predefined contacts that have been added.
+// @return Self pointer to CPdcData pushed to
+// the cleanup stack.
+// ---------------------------------------------------------------------------
+//
+CPdcData* CPdcData::NewL( RFs& aFs, CVPbkContactLinkArray& aLinkArray )
+ {
+ CPdcData* self = new( ELeave ) CPdcData( aFs, aLinkArray );
+ CleanupStack::PushL( self );
+ self->ConstructL();
+ CleanupStack::Pop( self );
+ return self;
+ }
+
+// ---------------------------------------------------------------------------
+// CPdcData::~CPdcData
+// Destructor
+// ---------------------------------------------------------------------------
+//
+CPdcData::~CPdcData()
+ {
+ delete iRepository;
+ delete iLinkBuffer;
+ }
+
+// ---------------------------------------------------------------------------
+// CPdcData::CPdcData
+// C++ constructor
+// @param aFs file system
+// @param aLinkArray links to contacts that have been added.
+// ---------------------------------------------------------------------------
+//
+CPdcData::CPdcData( RFs& aFs, CVPbkContactLinkArray& aLinkArray )
+ : iFs( aFs ), iLinkArray( aLinkArray )
+ {
+ }
+
+// ---------------------------------------------------------------------------
+// CPdcData::ConstructL
+// Second-phase constructor
+// ---------------------------------------------------------------------------
+//
+void CPdcData::ConstructL()
+ {
+ iRepository = CRepository::NewL( TUid::Uid( KCRUidPredefinedContacts ) );
+ }
+
+// ---------------------------------------------------------------------------
+// CPdcData::ContactsUpToDateL()
+// Checks if the predefined contacts need to be added.
+// @return ETrue if the predefined contacts need to be added
+// ---------------------------------------------------------------------------
+//
+TBool CPdcData::ContactsUpToDateL()
+ {
+ TBool upDate = ETrue;
+
+ // Does the pdcdata file exist?
+ RFile pdcDataFile;
+
+ TInt error = pdcDataFile.Open( iFs, KPdcDataFileName,
+ EFileRead | EFileStreamText );
+ CleanupClosePushL( pdcDataFile );
+
+ if ( error == KErrNone )
+ {
+ // Open a read stream and internalise the file
+ RFileReadStream stream( pdcDataFile );
+ stream.PushL();
+
+ InternalizeL( stream );
+
+ stream.Pop();
+ stream.Close();
+ }
+ else
+ {
+ // If the pdc file doe not exist, it indicates that
+ // this is the first run, a firmware upgrade or a
+ // file system format. Hence the predefined contacts
+ // are added. Leave if it is a different error.
+ if ( error != KErrNotFound && error != KErrPathNotFound )
+ {
+ User::Leave( error );
+ }
+ }
+
+ CleanupStack::PopAndDestroy(); // pdcDataFile
+
+ // Get timestamp from cenrep
+ return upDate;
+ }
+
+// ---------------------------------------------------------------------------
+// CPdcData::StoreL()
+// Stores the ids of anycontacts that have been added. Plus the most recent
+// info about the firmware etc if needed
+// ---------------------------------------------------------------------------
+//
+void CPdcData::StoreL()
+ {
+ // Write out the new details
+ RFile pdcDataFile;
+ TInt error = pdcDataFile.Replace( iFs, KPdcDataFileName, EFileWrite );
+ if ( error == KErrPathNotFound )
+ {
+ // Create the path if it can not be found
+ User::LeaveIfError( iFs.MkDir( KPdcDataFilePath ) );
+ error = pdcDataFile.Replace( iFs, KPdcDataFileName, EFileWrite );
+ }
+ // If there has been an error leave
+ User::LeaveIfError( error );
+
+ CleanupClosePushL( pdcDataFile );
+
+ // Open a write stream and externalise the file
+ RFileWriteStream stream( pdcDataFile );
+ stream.PushL();
+
+ // Externalise the data to the stream.
+ ExternalizeL( stream );
+
+ // Tidy up
+ stream.CommitL();
+ stream.Pop();
+ stream.Close();
+ CleanupStack::PopAndDestroy(); // pdcDataFile
+ }
+
+// ---------------------------------------------------------------------------
+// CPdcData::GetFileLocationL
+// Gets the file location of the predefined contacts from the central
+// repository.
+// @return location of the predefined contacts.
+// ---------------------------------------------------------------------------
+//
+HBufC* CPdcData::GetFileLocationL()
+ {
+ // Get the filename
+ TFileName fileName;
+ TInt error = iRepository->Get( KPdcFileLocation, fileName );
+ User::LeaveIfError( error );
+
+ HBufC* fileLocation = fileName.AllocL();
+
+ return fileLocation;
+ }
+
+// ---------------------------------------------------------------------------
+// CPdcData::InternalizeL
+// Reads in the list of added contacts and any other persisted data such as
+// timestamp, firmware id.
+// @param aStream readstream to read data from
+// ---------------------------------------------------------------------------
+//
+void CPdcData::InternalizeL( RReadStream& aStream )
+ {
+ // Read the major and minor version numbers in case there is a future
+ // BC break that may need to be detected.
+ TInt major = aStream.ReadInt8L();
+ TInt minor = aStream.ReadInt8L();
+
+ ASSERT( major == KPdcMajorVersion && minor == KPdcMinorVersion );
+
+ // Get the size of the list of contact links and store it in
+ // a buffer
+ TInt bufferSize = aStream.ReadUint16L();
+ iLinkBuffer = HBufC8::NewL( bufferSize );
+ TPtr8 bufferPtr = iLinkBuffer->Des();
+ aStream >> bufferPtr;
+ bufferPtr.SetLength( bufferSize );
+ }
+
+// ---------------------------------------------------------------------------
+// CPdcData::ExternalizeL
+// Writes out the added contacts list and any other the persisted data such
+// as timestamp, firmware id
+//
+// @param aStream writestream to write data to
+// ---------------------------------------------------------------------------
+//
+void CPdcData::ExternalizeL( RWriteStream& aStream ) const
+ {
+ // Write out the major and minor version numbers in case there is a future
+ // BC break that may need to be detected.
+ aStream.WriteInt8L( KPdcMajorVersion );
+ aStream.WriteInt8L( KPdcMinorVersion );
+
+ // Write out the list of contacts, first pack the link list into
+ // a buffer
+ HBufC8* buf = iLinkArray.PackLC();
+
+ // Write the size of the descriptor, followed by the buffer
+ aStream.WriteUint16L(buf->Length());
+ aStream << *buf;
+
+ // tidy up buffer
+ CleanupStack::PopAndDestroy(); // buf
+ }
+
+// ---------------------------------------------------------------------------
+// CPdcData::LinkArrayBuffer
+// Gets the buffer of contact links
+// @return buffer of contact links
+// ---------------------------------------------------------------------------
+//
+HBufC8* CPdcData::LinkArrayBuffer()
+ {
+ return iLinkBuffer;
+ }