// COMMDB.H
//
// Copyright (c) 1997-1999 Symbian Ltd.  All rights reserved.
//

// Comms Database and Table header

#ifndef __COMMDB_H__
#define	__COMMDB_H__

#include <d32dbms.h>
#include <dial.h>
#include <cdbcols.h>
#include <cdblen.h>

//

class CCommsDbTableView;

// CCommsDatabase class
//
// Controls access to the database and the DBMS server.  Also to the DBMS server
// notifier. One of these per client session.

class CCommsDatabase : public CBase
	{
public:
	friend class CCommsDbTableView;
public:
	IMPORT_C static CCommsDatabase* NewL();
	CCommsDatabase();
	IMPORT_C ~CCommsDatabase();
	IMPORT_C TVersion Version() const;
	IMPORT_C TInt Open();
	IMPORT_C void Close();
	IMPORT_C void CloseDatabase();
//
// Transactions
//
	IMPORT_C TInt BeginTransaction();
	IMPORT_C TInt CommitTransaction();
	IMPORT_C void RollbackTransaction();
	IMPORT_C TBool InTransaction();
//
// Notification
//
	IMPORT_C TInt RequestNotification(TRequestStatus& aStatus);
	IMPORT_C void CancelRequestNotification();
//
// Opening views
//
	IMPORT_C CCommsDbTableView* OpenTableLC(const TDesC& aTableName);
	IMPORT_C CCommsDbTableView* OpenViewLC(const TDesC& aTableName, const TDesC& aSqlQuery);
	IMPORT_C CCommsDbTableView* OpenViewMatchingUintLC(const TDesC& aTableName, const TDesC& aColumnToMatch, TUint32 aValueToMatch);
	IMPORT_C CCommsDbTableView* OpenViewMatchingBoolLC(const TDesC& aTableName, const TDesC& aColumnToMatch, TBool aValueToMatch);
	IMPORT_C CCommsDbTableView* OpenViewMatchingTextLC(const TDesC& aTableName, const TDesC& aColumnToMatch, const TDesC8& aValueToMatch);
	IMPORT_C CCommsDbTableView* OpenViewMatchingTextLC(const TDesC& aTableName, const TDesC& aColumnToMatch, const TDesC16& aValueToMatch);
//
// Default records
//
	IMPORT_C void GetDefaultRecordL(const TDesC& aTableName, TUint32& aId);
	IMPORT_C void SetDefaultRecordL(const TDesC& aTableName, TUint32 aId);
//
// Hidden records
//
	IMPORT_C TInt ShowHiddenRecords();
//
// Timeout table
// 
	IMPORT_C void GetClientTimeoutL(TUint32& aTimeout);
	IMPORT_C void GetRouteTimeoutL(TUint32& aTimeout);
	IMPORT_C void SetClientTimeoutL(const TUint32 aTimeout);
	IMPORT_C void SetRouteTimeoutL(const TUint32 aTimeout);
//
// Resolve phone number
//
	IMPORT_C static void ResolvePhoneNumberL(TDesC& aNumber, TDes8& aDialString, TParseMode aDialParseMode);
	IMPORT_C void ResolvePhoneNumberFromDatabaseL(TDesC& aNumber, TDes8& aDialString, TParseMode aDialParseMode);
//
	void DatabaseUpdateHasOccurred();
private:
	void ConstructL();
	void CreateDatabaseL(RFs& aFs);
	CCommsDbTableView* DoOpenViewMatchingUintL(const TDesC& aTableName, const TDesC& aColumnToMatch, TUint32 aValueToMatch);
	CCommsDbTableView* DoOpenViewMatchingTextL(const TDesC& aTableName, const TDesC& aColumnToMatch, const TDesC8& aValueToMatch);
	CCommsDbTableView* DoOpenViewMatchingTextL(const TDesC& aTableName, const TDesC& aColumnToMatch, const TDesC16& aValueToMatch);
	CCommsDbTableView* DoOpenTableViewL(const TDesC& aTableName, const TDesC& aSqlQuery);
	TBool TableWithDefaultRecord(const TDesC& aTableName) const;
	void PopulateDialLocationL(TUint32 aId, TDialLocation& aLocation,TUint32& aChargeCardId);
	void PopulateChargeCardL(TUint32 aId, TChargeCard& aChargeCard);
	void SetDefaultRecordWithoutTransactionL(const TDesC& aTableName, TUint32 aId);
	inline RDbNamedDatabase* Database();
private:	
	RDbs iDbs;
	RDbNamedDatabase iDatabase;
	RDbNotifier iNotifier;
	TInt iOpenRefCount;
	TInt iLockRefCount;
	TInt iNotifierOpenError;
	TBool iShowHiddenRecords;
	TBool iUpdateHasOccurred;
	};

// CCommsDbTableView class
//
// Implements actions on tables and rows in the database.  Uses a CCommsDatabase 
// and has an RDbView to read from and write to database.  Created via the 
// CCommsDatabase object OpenTableLC() (to open a view on all the records in the table) 
// or one of the OpenViewLC() functions (to open a specific view on the table).

class CCommsDbTableView : public CBase
	{
public:
	friend class CCommsDatabase;
	friend class CCommsDbTemplateRecord;
public:
	static CCommsDbTableView* NewL(CCommsDatabase* aDb, const TDesC& aTableName, const TDbQuery& aQuery, TBool aUseTemplate =ETrue);
	CCommsDbTableView(CCommsDatabase* aDb, const TDesC& aTableName);
	IMPORT_C virtual ~CCommsDbTableView();
//
// Record operations
//
	IMPORT_C TInt InsertRecord(TUint32& aId);
	IMPORT_C TInt UpdateRecord();
	IMPORT_C TInt DeleteRecord();
	IMPORT_C TInt PutRecordChanges(TBool aHidden =EFalse);
	IMPORT_C TInt CancelRecordChanges();
//
// Navigating records
//
	IMPORT_C TInt GotoFirstRecord();
	IMPORT_C TInt GotoNextRecord();
	IMPORT_C TInt GotoPreviousRecord();
//
// Reads
//
	IMPORT_C void ReadTextL(const TDesC& aColumn, TDes8& aValue);
	IMPORT_C void ReadTextL(const TDesC& aColumn, TDes16& aValue);
	IMPORT_C HBufC* ReadLongTextLC(const TDesC& aColumn);
	IMPORT_C void ReadUintL(const TDesC& aColumn, TUint32& aValue);
	IMPORT_C void ReadBoolL(const TDesC& aColumn, TBool& aValue);
	IMPORT_C void ReadTypeAttribL(const TDesC& aColumn, TDbColType& aColType, TUint32& aAttrib);
	IMPORT_C void ReadColumnLengthL(const TDesC& aColumn, TInt& aLength);
//
// Writes
//
	IMPORT_C void WriteTextL(const TDesC& aColumn, const TDesC8& aValue);
	IMPORT_C void WriteTextL(const TDesC& aColumn, const TDesC16& aValue);
	IMPORT_C void WriteLongTextL(const TDesC& aColumn, const TDesC& aValue);
	IMPORT_C void WriteUintL(const TDesC& aColumn, const TUint32& aValue);
	IMPORT_C void WriteBoolL(const TDesC& aColumn, const TBool& aValue);
	IMPORT_C void SetNullL(const TDesC& aColumn);
//
// Get table name
//
	inline void GetTableName(TDes& aTableName) const;
//
private:
	void ConstructL(const TDbQuery& aQuery, TBool aUseTemplate);
	void Close();
	TInt InsertRecordWithThisId(TUint32 aId);
	TBool TableWithTemplateRecord() const;
	TBool EncryptedColumn(const TDesC& aColumn) const;
	TDbColNo ColNumL(const TDesC& aColumn) const;
private:
	enum TTableState {
		EClosed,
		EOpenIdle,
		EAddUpdate
		};
private:
	CCommsDatabase* iDb;
	RDbView iTableView;
	CDbColSet* iColSet;
	TTableState iState;
	TBuf<KCommsDbSvrMaxColumnNameLength> iTableName;
	CCommsDbTemplateRecord* iTemplate;
	};

#include <commdb.inl>

#endif
