tzservices/tzserver/Server/Include/tzlocalizationdb.h
changeset 0 2e3d3ce01487
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tzservices/tzserver/Server/Include/tzlocalizationdb.h	Tue Feb 02 10:12:00 2010 +0200
@@ -0,0 +1,196 @@
+// Copyright (c) 2008-2009 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:
+//
+
+#ifndef __TZLOCALIZATIONDB_H__
+#define __TZLOCALIZATIONDB_H__
+
+#include <e32base.h>
+#include <d32dbms.h>
+#include <tzlocalizationdatatypes.h>
+#include <tz.h>
+#include "tzsystemdata.h"
+#include "tzuserdata.h"
+#include "mtimezonedataaccess.h"
+
+class CTzServer;
+
+/**
+This class provides access to a database containing the localization information.
+
+The database contains two tables : one called "FrequentlyUsedZones" containing time zones 
+and one called "UserCities" containing cities.
+
+The "FrequentlyUsedZones" table contains one entry (row) for each of the frequently used zones 
+as defined by the CTzLocalizedTimeZone::TTzFrequentlyUsedZone enum (i.e. 5 rows at the time of 
+writing). The table always contains this number of rows. When the database is created all the 
+rows are initialized to a "null" value.
+
+The table contains 9 columns containing the following information:
+Column 1: The time zone id (note this column is a TUint16 while CTzId uses a TUint32)
+Column 2: The standard name of the time zone
+Column 3: The DST name of the time zone
+Column 4: The short standard name of the time zone
+Column 5: The short DST name of the time zone
+Column 6: The name of the city that is representative of this time zone
+Column 7: The group id of the city that is representative of this time zone
+Column 8: The resource id associated with the time zone id.
+Column 9: The index of the city in the resource file (note this is not the resource id but the 
+position of this city in the list of cities in the resource file)
+
+In other words columns 1 and 8 store the values of CTzLocalizedTimeZone::iTzLocalizedId columns 2 to 5 
+store the other members of CTzLocalizedTimeZone.
+
+As we mentioned above this table always has the same number of rows but they may have been initialized to
+a "null". The code in CTzLocalizer::PrepareFrequentlyUsedZonesL() checks if this is the case and replaces 
+the "null" value with the correct data.
+
+Column 9 holds an index that is used when changing language. This is used in the 
+CTzLocalizer::UpdateFrequentlyUsedZonesL() function. When changing language the UpdateFrequentlyUsedZonesL()
+code first tries to find a city with the same name in the new resource file. If it can't find a city with
+the same name it will use the city that has the same index. The index is simply the position of the city in
+the resource file so this code assumes that cities are in the same order in the different resource files. See
+CTzLocalizationResourceReader::AddCityArrayFromResourceL() for the code that initializes the index.
+
+Note that this table used to have only 8 columns. Column 9 was added as part of a defect fix in 
+October 2006. The CTzLocalizer class will check whether the database has 8 or 9 columns on construction
+and upgrade the database format if needed. However because of this the CTzLocalizationDb code must cope
+with the absence of the 9th column.
+	      
+The "UserCities" table contains the list of cities that have been added by the user using the
+@see CTzLocalizer::AddCityL() function. The table contains 4 columns containing the following 
+information:
+Column 1: The id of the time zone in which the city is
+Column 2: The name of the city
+Column 3: The id of the group this city is part of or 0 if the city doesn't belong to a group
+Column 4: The resource id associated with the time zone id.
+
+In other words columns 1 and 2 store the values of CTzLocalizedCity::iTzLocalizedId, column 2 stores
+the value of CTzLocalizedCity::iName and column stores the value of CTzLocalizedCity::iGroupId.
+
+The columns can be addressed using the TTzCityColumn enum.
+
+@internalComponent
+*/
+class CTzLocalizationDb : public CBase, public MTzUserDataChangeObserver, public MTzDataObserver
+	{
+public:
+	static CTzLocalizationDb* NewL(CTzServer& aServer);
+	~CTzLocalizationDb();
+	
+private:
+	CTzLocalizationDb(CTzServer& aServer);
+	void ConstructL();
+	
+public:
+	void OpenDbL();
+	void CloseDb();
+	
+private:
+	void CreateBlankDatabaseL();
+	void CreateBlankFrequentlyUsedZoneTableL();
+	void CreateBlankUserCityTableL();
+	TBool IsInvalidL();
+	void RecreateBlankDatabaseL();
+	TBool NeedsUpdatingL();
+	
+public: // from MTzUserDataChangeObserver
+	void NotifyUserTzRulesChange(TTzUserDataChange aChange);
+	void NotifyUserTzNamesChange(TTzUserDataChange aChange);
+	
+	// from MTzDataObserver
+	void NotifyTZDataStatusChangeL(RTz::TTzChanges);
+				
+public:
+	void ReadCitiesL(RPointerArray<CTzLocalizedCityRecord>& aCities);
+	void ReadCitiesL(RPointerArray<CTzLocalizedCityRecord>& aCities, TInt aTimeZoneId);
+	void ReadCitiesInGroupL(RPointerArray<CTzLocalizedCityRecord>& aCities, TUint8 aGroupId);
+	CTzLocalizedTimeZoneRecord* ReadFrequentlyUsedZoneL(TInt aFrequentlyUsedZone);
+	CTzLocalizedCityRecord* ReadCachedTimeZoneCityL(TInt aFrequentlyUsedZone);
+	void WriteCityL(const TDesC& aCityName, TUint16 aCityTzId, TUint8 aCityGroupId, TUint aCityTzResourceId);
+	void DeleteCityL(const TDesC& aCityName, TUint16 aCityTzId);
+	void WriteFrequentlyUsedZoneL(const CTzLocalizedTimeZoneRecord& aTimeZone, 
+		const CTzLocalizedCityRecord& aCity, TInt aFrequentlyUsedZone);
+	void WriteAllFrequentlyUsedZonesL(const RPointerArray<CTzLocalizedTimeZoneRecord>& aTimeZones, 
+		const RPointerArray<CTzLocalizedCityRecord>& aCities);
+	
+	// methods to handle backup-restore
+	void BackupBeginningL();
+	void BackupCompletedL();
+	void RestoreBeginningL();
+	void RestoreCompletedL();
+	
+private:
+	void PrepareCityViewL(RDbView& aCityView, const TDesC& aSqlQuery);
+	void PrepareZoneViewL(RDbView& aZoneView);
+	HBufC* GetCityQueryLC(const TDesC& aCityName, TInt aCityTimeZoneId);
+	HBufC* GetCityQueryLC(TInt aCityTimeZoneId);
+	void DoReadCitiesL(RPointerArray<CTzLocalizedCityRecord>& aCities, const TDesC& aSqlString);
+	void DoWriteFrequentlyUsedZoneL(RDbView& aZoneView, const CTzLocalizedTimeZoneRecord& aTimeZone,
+		const CTzLocalizedCityRecord& aCity);
+	TInt GetTimeZoneIdFromTzServerL(CTzSystemDataDb& aSystemDataDb);
+	void NotifyUserTzNamesChangeL(TTzUserDataChange aChange);
+	TBool ExistsL(TUint aTzId);
+	static void ReleaseMutex(TAny* iTarget);
+	void DeleteCitiesL(TTzUserDataChange aChange);
+	void UpdateTimeZoneAndCityRecordL(RPointerArray<CTzLocalizedTimeZoneRecord>& aFrequentlyUsedZones, 
+		RPointerArray<CTzLocalizedCityRecord>& aCachedCities, TInt aTzId);
+	static void CleanupTimeZonePointerArray(TAny* aArray);
+    static void CleanupCityPointerArray(TAny* aArray);
+	TBool ExistsInSystemDbL(TUint aTzId, CTzSystemDataDb& aSystemDataDb);
+	void UpdateTimeZoneAndCityRecordForSystemDataL(RPointerArray<CTzLocalizedTimeZoneRecord>& aFrequentlyUsedZones, 
+		RPointerArray<CTzLocalizedCityRecord>& aCachedCities, TInt aTzId, CTzSystemDataDb& aSystemDataDb);
+	void RestoreDbL();
+	TUint32 GetFrequentlyUsedDefaultZoneCenRepKeyL(CTzLocalizedTimeZone::TTzFrequentlyUsedZone aFreqUsedZone);
+	CTzLocalizedTimeZoneRecord* DoReadFrequentlyUsedZoneL(TInt aFrequentlyUsedZone);
+	void DoWriteAllFrequentlyUsedZonesL(const RPointerArray<CTzLocalizedTimeZoneRecord>& aTimeZones, 
+		const RPointerArray<CTzLocalizedCityRecord>& aCities);
+	TInt GetFrequentlyUsedDefaultZoneIdL(CTzLocalizedTimeZone::TTzFrequentlyUsedZone aFreqUsedZone,	CTzSystemDataDb& aSystemDataDb);
+
+private:
+	enum  TTzCityColumn
+		{
+		// Enum will used as a DB column index, so it must start at 1
+		ETzCityId =1,
+		ETzCityCity,
+		ETzCityGroup,
+		ETzCityResourceId,
+		};
+
+	// enum that specifies the maximum length of the strings corresponding
+	// to time zone IDs and group IDs
+	enum TTzStringLength
+		{
+		// Group ID is an unsigned 8-bit integer
+		EMaxGroupIdStringLength = 3,
+		// Time Zone ID is an unsigned 16-bit integer
+		EMaxTimeZoneIdStringLength = 5
+		};
+	
+private:
+	CTzServer& iServer;
+	RDbs iDbsSession;
+	RDbNamedDatabase iLocalizedTimeZoneDb;
+	/**
+	This is used to forbid clients to access the database when a backup/restore 
+	is taking place. The database can also be locked permanently if there has been
+	an unrecoverable error during an update, in which case only a server reboot
+	will unlock it. 
+	*/
+	TBool iLocked;
+	// Protecting iZoneView changes
+	RMutex iZoneMutex;
+	};
+
+#endif