diff -r 000000000000 -r e686773b3f54 contactextensions/predefinedcontacts/src/pdcdata.cpp --- /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 // CContactDatabase +#include // CRepository +#include // CRepository +#include // RFs +#include // 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; + }