symhelp/helpmodel/dbwriter/DBWRITER.H
changeset 0 1f04cf54edd8
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/symhelp/helpmodel/dbwriter/DBWRITER.H	Tue Jan 26 15:15:23 2010 +0200
@@ -0,0 +1,250 @@
+// Copyright (c) 1999-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 __DBWRITER_H__
+#define __DBWRITER_H__
+
+#include <d32dbms.h>
+#include <e32std.h>
+#include <s32file.h>
+#include <bautils.h>
+#include <txtrich.h>
+#include <txtfmlyr.h>
+#include <txtmrtsr.h>
+#include <gdi.h>
+
+// User includes
+#include "hlpconstants.h"
+
+// Db writer constants
+const TInt KTopicTblTopicTitle = 1;
+const TInt KTopicTblCategoryTitle = 2;
+const TInt KTopicTblTopicText = 3;
+const TInt KTopicTblTopicMarkup = 4;
+const TInt KTopicTblSynonym = 5;
+const TInt KTopicTblTopicId = 6;
+const TInt KTopicTblCategoryUID = 7;
+
+const TInt KIndexTblIndex = 1;
+const TInt KIndexTblIndexId = 2;
+
+const TInt KTopicIndexTblTopicId = 1;
+const TInt KTopicIndexTblIndexId = 2;
+const TInt KTopicIndexTblCategoryUID = 3;
+const TInt KTopicIndexTblTopicTitle = 4;
+
+const TInt KContextTblContext = 1;
+const TInt KContextTblTopicId = 2;
+
+const TInt KImageTblImageId = 1;
+const TInt KImageTblImageCount = 2;
+const TInt KImageTblImage0 = 3;
+const TInt KImageTblImage1 = 4;
+const TInt KImageTblImage2 = 5;
+
+
+
+// DML statements used in creating the database tables and indices
+_LIT(KHlpDMLTopicTable,			"CREATE TABLE Topic (TopicTitle CHAR(120), Category CHAR(120), TopicText LONG VARCHAR, TopicMarkup LONG VARBINARY, Synonym CHAR(200), TopicId UNSIGNED INTEGER, CategoryUID UNSIGNED INTEGER)");
+
+// IndexeId's are unique on a per-helpfile basis, ie. all indexId's in one help file are unique.
+_LIT(KHlpDMLIndexTable,			"CREATE TABLE Index (Index CHAR(120), IndexId UNSIGNED INTEGER)");
+
+// TopicId's are unique within a helpfile but not across a help file
+_LIT(KHlpDMLTopicIndexTable,	"CREATE TABLE TopicIndex (TopicId UNSIGNED INTEGER, IndexId UNSIGNED INTEGER, CategoryUID UNSIGNED INTEGER, TopicTitle CHAR(120))");
+
+_LIT(KHlpDMLContextTable,		"CREATE TABLE Context (Context CHAR(30), TopicId UNSIGNED INTEGER)");
+
+_LIT(KHlpDMLImageTable,			"CREATE TABLE Image (ImageId UNSIGNED INTEGER, ImageCount UNSIGNED INTEGER, Image0 LONG VARBINARY, Image1 LONG VARBINARY, Image2 LONG VARBINARY)");
+
+
+_LIT(KHlpDMLTopicTableIdx,		"CREATE UNIQUE INDEX TopicIdx ON Topic (TopicId)");
+_LIT(KHlpDMLIndexTableIdx,		"CREATE UNIQUE INDEX IndexIdx ON Index (IndexId)");
+_LIT(KHlpDMLTopicIndexTableIdx, "CREATE UNIQUE INDEX TopicIndexIdx ON TopicIndex (IndexId, TopicId)");
+_LIT(KHlpDMLContextTableIdx,	"CREATE UNIQUE INDEX ContextIdx ON Context (Context)");
+_LIT(KHlpDMLImageTableIdx,		"CREATE UNIQUE INDEX ImageIdx ON Image (ImageId)");
+
+// DDL statements used in opening tables for writing
+_LIT(KHlpSQLTopicTable,			"SELECT * FROM Topic");
+_LIT(KHlpSQLIndexTable,			"SELECT * FROM Index");
+_LIT(KHlpSQLTopicIndexTable,	"SELECT * FROM TopicIndex");
+_LIT(KHlpSQLContextTable,		"SELECT * FROM Context");
+_LIT(KHlpSQLImageTable,			"SELECT * FROM Image");
+
+// enum for selecting a table for writing to
+enum
+	{
+	ETopicTable,
+	EIndexTable,
+	ETopicIndexTable,
+	EContextTable,
+	EImageTable
+	};
+
+
+class CHlpTable;
+
+// CHlpDbWriter class: creates the store and the database, and provides the interface to write to the file
+class CHlpDbWriter : public CBase
+/**
+@internalComponent
+@released
+*/
+	{
+public:
+	IMPORT_C	~CHlpDbWriter();
+	IMPORT_C	static CHlpDbWriter* NewL(RFs& aFs);
+	IMPORT_C	static CHlpDbWriter* NewLC(RFs& aFs);
+public:
+	IMPORT_C	void CreateFileL(const TDesC& aFileName);
+	IMPORT_C	void CreateDatabaseL();
+	IMPORT_C	void CompressDatabaseL();
+	IMPORT_C	void SetDatabaseUidL(TUid& aUid);
+	IMPORT_C	void CloseFileL();
+public:
+	IMPORT_C	void AddBitmapL(TInt aBitmapId);
+	IMPORT_C	TBool IsBitmapStored(TInt aBitmapId) const;
+	IMPORT_C	TInt BitmapCount() const;
+	IMPORT_C	TInt BitmapIdForIndex(TInt aIndex) const;
+public:
+	IMPORT_C	void BeginTransaction();
+	IMPORT_C	void CommitTransaction();
+public:
+	IMPORT_C	CHlpTable* TopicTable();
+	IMPORT_C	CHlpTable* IndexTable();
+	IMPORT_C	CHlpTable* TopicIndexTable();
+	IMPORT_C	CHlpTable* ContextTable();
+	IMPORT_C	CHlpTable* ImageTable();
+	IMPORT_C	void SetUidL(TUid aUid);
+private:
+	void DoCreateDatabaseL();
+	CHlpTable* DoOpenTableLC(TInt aTable);
+	void DoOpenTablesL();
+	void StoreUidsL();
+	void StoreStreamDictionaryL();
+private:
+	CHlpDbWriter(RFs& aFs);
+	void ConstructL();
+private:
+	RFs& iFs;
+	TFileName iFileName;
+
+	RDbStoreDatabase iDatabase;
+	CArrayFixFlat<TUid>* iUids;
+	CArrayPtrFlat<CHlpTable>* iTables;
+	CArrayFixFlat<TUid>* iImagesAlreadyStored;
+
+	CPermanentFileStore* iStore;
+	CStreamDictionary* iDictionary;
+	};
+
+class THlpStoreResolver : public MRichTextStoreResolver
+/**
+@internalComponent
+@released
+*/
+	{
+public:
+	virtual const CStreamStore& StreamStoreL(TInt aPos) const;
+	CStreamStore* iStore;
+	};
+
+// CHlpRowSet class: abstract class for accessing database tables
+class CHlpRowSet : public CBase
+/**
+@internalComponent
+@released
+*/
+	{
+public:
+	CHlpRowSet(RDbView* aView);
+	IMPORT_C	virtual ~CHlpRowSet();
+	IMPORT_C	TBool AtRow();
+	IMPORT_C	TBool AtBeginning();	
+	IMPORT_C	TBool AtEnd();
+	IMPORT_C	TBool FirstL();
+	IMPORT_C	TBool LastL();
+	IMPORT_C	TInt  CountL();
+public:
+	IMPORT_C	void NextL();
+	IMPORT_C	void PreviousL();
+public:
+	IMPORT_C	TDbColNo MapColNameToColNo(const TDbCol& aCol);
+	IMPORT_C	TDbColNo MapColNameToColNo(const TDesC& aName);
+	IMPORT_C	CDbColSet* ColSet();
+
+	IMPORT_C	RDbView* View();
+private:
+	RDbView* iView;
+	};
+
+// CHlpView class: concrete class used for accessing database tables (for test code)
+class CHlpView : public CHlpRowSet
+/**
+@internalComponent
+@released
+*/
+	{
+public:
+	IMPORT_C	static CHlpView* NewL(RDbView* aView);
+	IMPORT_C	static CHlpView* NewLC(RDbView* aView);
+	~CHlpView();
+public:
+	inline void SetPictureFactory(MPictureFactory* aPictureFactory) {iPictureFactory=aPictureFactory;};
+public:
+	IMPORT_C	void GetTextL(TDbColNo aCol, TDes& aText);
+	IMPORT_C	void GetRichTextL(TDbColNo aTextCol, TDbColNo aMarkupCol, CRichText& aRichText);
+	IMPORT_C	void GetValL(TDbColNo aCol, TUint32& aValue);
+	IMPORT_C	void GetL();
+private:
+	void GetMarkupL(CRichText& aRichText, TDbColNo aMarkupCol);
+private:
+	CHlpView(RDbView* aView);
+	void ConstructL();
+private:
+	THlpStoreResolver iStoreResolver;
+	MPictureFactory *iPictureFactory;
+	TBool iHasRows;
+	};
+
+// CHlpTable class: concrete class used for writing to database tables
+class CHlpTable : public CHlpRowSet
+/**
+@internalComponent
+@released
+*/
+	{
+public:
+	IMPORT_C	static CHlpTable* NewL(RDbView* aView);
+	IMPORT_C	static CHlpTable* NewLC(RDbView* aView);
+	~CHlpTable();
+public:
+	IMPORT_C	void InsertL();
+	IMPORT_C	void PutL();
+public:
+	IMPORT_C	void SetColL(TDbColNo aCol, const TDesC& aText);
+	IMPORT_C	void SetColL(TDbColNo aTextCol, TDbColNo aMarkupCol, CRichText& aRichText);
+	IMPORT_C	void SetColL(TDbColNo aTextCol, CRichText& aRichText);
+	IMPORT_C	void SetColL(TDbColNo aCol, TUint32 aValue);
+	IMPORT_C	void SetColL(TDbColNo aCol, const CFbsBitmap& aBitmap);
+private:
+	void SetMarkupL(CRichText& aRichText, TDbColNo aMarkupCol);
+	void SetLongTextL(const TDesC& aText, TDbColNo aLongTextCol);
+private:
+	CHlpTable(RDbView* aView); 
+	void ConstructL();
+	};
+
+#endif