--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/clock2/clockui/uilayer/src/clockdocument.cpp Wed Sep 01 12:32:31 2010 +0100
@@ -0,0 +1,432 @@
+/*
+* Copyright (c) 2008 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: This is the source file for the CClockDocument class.
+*
+*/
+
+// System includes
+#include <s32file.h>
+#include <f32file.h>
+#include <tzlocalizationdatatypes.h>
+#include <tzlocalizer.h>
+
+// User includes
+#include "clockdocument.h"
+#include "clockappui.h"
+#include "clkuialarmmodel.h"
+#include "clkcommon.h"
+
+// Constants
+const TInt KWorldClockListGranularity( 15 );
+const TInt KZeroValue( 0 );
+
+// Literals
+_LIT( KFileName, "clock.dat" );
+
+// ---------------------------------------------------------
+// CClockDocument::NewL
+// rest of the details are commented in the header
+// ---------------------------------------------------------
+//
+CClockDocument* CClockDocument::NewL( CEikApplication& aApp )
+ {
+ CClockDocument* selfObj = new ( ELeave ) CClockDocument( aApp );
+ CleanupStack::PushL( selfObj );
+
+ selfObj->ConstructL();
+
+ CleanupStack::Pop( selfObj );
+ return selfObj;
+ }
+
+// ---------------------------------------------------------
+// CClockDocument::~CClockDocument
+// rest of the details are commented in the header
+// ---------------------------------------------------------
+//
+CClockDocument::~CClockDocument()
+ {
+ if( iAlarmModel )
+ {
+ delete iAlarmModel;
+ iAlarmModel = NULL;
+ }
+ if( iTzLocalizer )
+ {
+ delete iTzLocalizer;
+ iTzLocalizer = NULL;
+ }
+ if( iWorldClockList )
+ {
+ iWorldClockList->Reset();
+ delete iWorldClockList;
+ iWorldClockList = NULL;
+ }
+ }
+
+// ---------------------------------------------------------
+// CClockDocument::ReadDataL
+// rest of the details are commented in the header
+// ---------------------------------------------------------
+//
+void CClockDocument::ReadDataL()
+ {
+ // The stream used to store data.
+ RFileReadStream fileRStream;
+ TFileName fileName;
+
+ CleanupClosePushL( fileRStream );
+
+ // The eikon environment.
+ CEikonEnv* eikonEnv = CEikonEnv::Static();
+ eikonEnv->FsSession().PrivatePath( fileName );
+
+ TParse fileParse;
+ fileParse.Set( KFileName, &fileName, NULL );
+
+ // Open the file for reading.
+ User::LeaveIfError( fileRStream.Open( Process()->FsSession(), fileParse.FullName(), EFileShareReadersOnly ) );
+
+ TUint highInt( fileRStream.ReadUint32L() );
+ TUint lowInt( fileRStream.ReadUint32L() );
+
+ // Restore the previous alarm time.
+ iPrevAlarmTime = MAKE_TINT64( highInt, lowInt );
+
+ // Read the cities selected by user previously.
+ TUint cityCount( FALSE );
+ TRAP_IGNORE( cityCount = fileRStream.ReadUint32L() );
+
+ TCityInfo cityInfo;
+ RTz tzHandle;
+ // Connect to the timezone handle.
+ User::LeaveIfError( tzHandle.Connect() );
+ CleanupClosePushL( tzHandle );
+
+ for( TUint index( FALSE ); index < cityCount; index++ )
+ {
+ cityInfo.iImagePath.Delete( KZeroValue, cityInfo.iImagePath.Length() );
+ ReadCityL( fileRStream, cityInfo, tzHandle );
+ iWorldClockList->AppendL( cityInfo, sizeof( cityInfo ) );
+ }
+
+ // Cleanup.
+ CleanupStack::PopAndDestroy( &tzHandle );
+ CleanupStack::PopAndDestroy( &fileRStream );
+ }
+
+// ---------------------------------------------------------
+// CClockDocument::StoreDataL
+// rest of the details are commented in the header
+// ---------------------------------------------------------
+//
+void CClockDocument::StoreDataL()
+ {
+ // The stream used to store data.
+ RFileWriteStream fileWStream;
+ TFileName fileName;
+
+ CleanupClosePushL( fileWStream );
+
+ // The eikon environment.
+ CEikonEnv* eikonEnv = CEikonEnv::Static();
+
+ eikonEnv->FsSession().PrivatePath( fileName );
+ eikonEnv->FsSession().MkDirAll( fileName );
+
+ TParse fileParse;
+ fileParse.Set( KFileName, &fileName, NULL );
+
+ // Replace the file if it already exists.
+ User::LeaveIfError( fileWStream.Replace( Process()->FsSession(),fileParse.FullName(), EFileShareExclusive ) );
+
+ // Store the previous alarm time.
+ fileWStream.WriteUint32L( I64HIGH( iPrevAlarmTime ) );
+ fileWStream.WriteUint32L( I64LOW( iPrevAlarmTime ) );
+
+ // Complete the write operation.
+ fileWStream.CommitL();
+
+ TInt index( FALSE );
+ // Check if the home city is added in world clock
+ if( iHomeCityItemAdded )
+ {
+ // Do not store the home city data.
+ // Start storing data from index 1
+ index = TRUE;
+ // Store the count of cities in the list without home city.
+ fileWStream.WriteUint32L( iWorldClockList->Count()- 1 );
+ }
+ else
+ {
+ // Store all the cities selected in world clock view.
+ // Store the count of cities in the list.
+ fileWStream.WriteUint32L( iWorldClockList->Count() );
+ }
+
+ // Now store the cities selected in world clock view.
+ for( ; index < iWorldClockList->Count(); index++ )
+ {
+ fileWStream.WriteInt16L( ( *iWorldClockList )[ index ].iCityGroupId );
+ fileWStream.WriteInt16L( ( *iWorldClockList )[ index ].iCityOffsetInGroup );
+
+ TInt imagePathLength = ( *iWorldClockList )[ index ].iImagePath.Length();
+ fileWStream.WriteInt16L( imagePathLength );
+ if( KZeroValue != imagePathLength )
+ {
+ fileWStream.WriteL( ( *iWorldClockList )[ index ].iImagePath, imagePathLength );
+ }
+ }
+ // Complete the write operation.
+ fileWStream.CommitL();
+
+ // Cleanup.
+ CleanupStack::PopAndDestroy( &fileWStream );
+ }
+
+// ---------------------------------------------------------
+// CClockDocument::AlarmModel
+// rest of the details are commented in the header
+// ---------------------------------------------------------
+//
+CClkUiAlarmModel* CClockDocument::AlarmModel()
+ {
+ return iAlarmModel;
+ }
+
+/*// ---------------------------------------------------------
+// CClockDocument::GetPrevAlarmTime
+// rest of the details are commented in the header
+// ---------------------------------------------------------
+//
+TTime CClockDocument::GetPrevAlarmTime()
+ {
+ return TTime( iPrevAlarmTime );
+ }
+
+// ---------------------------------------------------------
+// CClockDocument::SetPrevAlarmTime
+// rest of the details are commented in the header
+// ---------------------------------------------------------
+//
+void CClockDocument::SetPrevAlarmTime( TTime aPrevAlarmTime )
+ {
+ iPrevAlarmTime = aPrevAlarmTime.Int64();
+ }*/
+
+// ---------------------------------------------------------
+// CClockDocument::GetWorldClockList
+// rest of the details are commented in the header
+// ---------------------------------------------------------
+//
+CArrayPakFlat< TCityInfo >* CClockDocument::GetWorldClockList()
+ {
+ return iWorldClockList;
+ }
+
+// ---------------------------------------------------------
+// CClockDocument::GetHomeCity
+// rest of the details are commented in the header
+// ---------------------------------------------------------
+//
+const TBuf< KHomeCityLength > CClockDocument::GetHomeCity()
+ {
+ return iHomeCity;
+ }
+
+// ---------------------------------------------------------
+// CClockDocument::SetHomeCityL
+// rest of the details are commented in the header
+// ---------------------------------------------------------
+//
+void CClockDocument::SetHomeCityL( TCityInfo& aCityInfo )
+ {
+ // First save the home city.
+ iHomeCity.Copy( aCityInfo.iCity );
+
+ // Now use the localizer to update the home city as a frequently used zone.
+ iTzLocalizer->SetTimeZoneL( aCityInfo.iTimeZoneId );
+ CTzLocalizedCity* localizedCity = iTzLocalizer->FindCityByNameL( aCityInfo.iCity, aCityInfo.iTimeZoneId );
+ if( localizedCity )
+ {
+ CleanupStack::PushL( localizedCity );
+ iTzLocalizer->SetFrequentlyUsedZoneL( *localizedCity, CTzLocalizedTimeZone::ECurrentZone );
+ // Cleanup.
+ CleanupStack::PopAndDestroy( localizedCity );
+ }
+ }
+
+// ---------------------------------------------------------
+// CClockDocument::UpdateHomeCityL
+// rest of the details are commented in the header
+// ---------------------------------------------------------
+//
+void CClockDocument::UpdateHomeCityL()
+ {
+ // Connect to the timezone server.
+ RTz tzHandle;
+ User::LeaveIfError( tzHandle.Connect() );
+ CleanupClosePushL( tzHandle );
+
+ // Get the current timezone ID.
+ CTzId* timeZoneId;
+ timeZoneId = tzHandle.GetTimeZoneIdL();
+ CleanupStack::PushL( timeZoneId);
+
+ CTzLocalizedTimeZone* localizedTimeZone( NULL );
+ CTzLocalizer* localizer( NULL );
+
+ TRAPD( errVal, localizer = CTzLocalizer::NewL() );
+ if( localizer && ( !errVal ) )
+ {
+ CleanupStack::PushL( localizer );
+ // Get the currently set localized timezone.
+ TRAPD( errVal, localizedTimeZone = localizer->GetLocalizedTimeZoneL( timeZoneId->TimeZoneNumericID() ) );
+ CleanupStack::PushL( localizedTimeZone );
+
+ if( localizedTimeZone && ( !errVal ) )
+ {
+ // This returns the previously stored value of homecity.
+ CTzLocalizedCity* localizedCity = localizer->GetFrequentlyUsedZoneCityL(CTzLocalizedTimeZone::ECurrentZone);
+ CleanupStack::PushL(localizedCity);
+
+ // Update the local copy of homecity.
+ iHomeCity.Copy(localizedCity->Name());
+
+ // Cleanup.
+ CleanupStack::PopAndDestroy(localizedCity);
+ }
+
+ // Cleanup.
+ CleanupStack::PopAndDestroy( localizedTimeZone );
+ CleanupStack::PopAndDestroy(localizer);
+ }
+
+ // Cleanup.
+ CleanupStack::PopAndDestroy( timeZoneId );
+ CleanupStack::PopAndDestroy( &tzHandle );
+ }
+
+// CClockDocument::CClockDocument
+// rest of the details are commented in the header
+// ---------------------------------------------------------
+//
+CClockDocument::CClockDocument( CEikApplication& aApp ) : CAknDocument( aApp )
+ {
+ // No implementation yet.
+ }
+
+// ---------------------------------------------------------
+// CClockDocument::ConstructL
+// rest of the details are commented in the header
+// ---------------------------------------------------------
+//
+void CClockDocument::ConstructL()
+ {
+ // Construct the localizer.
+ iTzLocalizer = CTzLocalizer::NewL();
+ // Construct the alarm model.
+ iAlarmModel = CClkUiAlarmModel::NewL( NULL, KAlarmListenerPriority );
+ // Construct the world clock cities list.
+ iWorldClockList = new( ELeave ) CArrayPakFlat< TCityInfo >( KWorldClockListGranularity );
+
+ // Try to open the document file and read the data.
+ TRAPD( readError, ReadDataL() );
+
+ if( KErrNone != readError )
+ {
+ TTime homeTime;
+ homeTime.HomeTime();
+ TDateTime homeDateTime = homeTime.DateTime();
+ // Set the hour minute and second.
+ homeDateTime.SetHour( 9 );
+ homeDateTime.SetMinute( 0 );
+ homeDateTime.SetSecond( 0 );
+ homeTime = homeDateTime;
+
+ // Update the previous alarm time.
+ iPrevAlarmTime = homeTime.Int64();
+
+ // Reset the worldclocklist.
+ iWorldClockList->Reset();
+ }
+
+ // Store the date read above.
+ TRAP_IGNORE( StoreDataL() );
+ // Update the homecity data.
+ UpdateHomeCityL();
+ }
+
+// ---------------------------------------------------------
+// CClockDocument::ReadCityL
+// rest of the details are commented in the header
+// ---------------------------------------------------------
+//
+void CClockDocument::ReadCityL( RFileReadStream& aStream, TCityInfo& aCityInfo, RTz& aTzHandle )
+ {
+ // We store the offset and the city group id. So we just read them.
+ TInt cityGroupId( aStream.ReadInt16L() );
+ TInt cityOffset( aStream.ReadInt16L() );
+ TInt imagePathLength ( aStream.ReadInt16L() );
+
+ // These will hold the read zones and the respective UTC offsets.
+ RArray<TInt> timeZones;
+ RArray<TInt> utcOffsets;
+
+ CTzLocalizedCityGroup* cityGroup( NULL );
+ CTzLocalizedCityArray* cityArray( NULL );
+ // Construct the cityArray and the cityGroup.
+ cityArray = iTzLocalizer->GetCitiesInGroupL( cityGroupId, CTzLocalizer::ETzUnsorted );
+ CleanupStack::PushL( cityArray );
+ cityGroup = iTzLocalizer->GetCityGroupL( cityGroupId );
+ CleanupStack::PushL( cityGroup );
+
+ if( ( FALSE <= cityOffset ) && ( cityOffset < cityArray->Count() ) )
+ {
+ // First get the localized city and get the offset for the same.
+ CTzLocalizedCity& localizedCity = cityArray->At( cityOffset );
+ timeZones.Append( localizedCity.TimeZoneId() );
+ aTzHandle.GetOffsetsForTimeZoneIdsL( timeZones, utcOffsets );
+
+ // Now with the data obtained, update the city information to be returned.
+ aCityInfo.iCity.Copy( localizedCity.Name() );
+ aCityInfo.iCountry.Copy(cityGroup->Name());
+ aCityInfo.iCityGroupId = localizedCity.GroupId();
+ aCityInfo.iUtcOffset = utcOffsets[ FALSE ];
+ aCityInfo.iCityOffsetInGroup = cityOffset;
+ aCityInfo.iTimeZoneId = localizedCity.TimeZoneId();
+ }
+ if( KZeroValue != imagePathLength )
+ {
+ aStream.ReadL( aCityInfo.iImagePath, imagePathLength );
+ }
+
+ // Cleanup.
+ CleanupStack::PopAndDestroy( cityGroup );
+ CleanupStack::PopAndDestroy( cityArray );
+ timeZones.Close();
+ utcOffsets.Close();
+ }
+
+// ---------------------------------------------------------
+// CClockDocument::CreateAppUiL
+// rest of the details are commented in the header
+// ---------------------------------------------------------
+//
+CEikAppUi* CClockDocument::CreateAppUiL()
+ {
+ return new( ELeave ) CClockAppUi;
+ }
+
+// End of file