windows-nt/Source/XPSP1/NT/admin/pchealth/helpctr/service/include/mergedhhk.h
2020-09-26 16:20:57 +08:00

330 lines
9.7 KiB
C++

/******************************************************************************
Copyright (c) 1999-2000 Microsoft Corporation
Module Name:
MergedHHK.h
Abstract:
This file contains the declaration of the classes used to parse and
process HHK files.
Revision History:
Davide Massarenti (Dmassare) 12/18/99
created
******************************************************************************/
#if !defined(__INCLUDED___HCP___MERGEDHHK_H___)
#define __INCLUDED___HCP___MERGEDHHK_H___
#include <TaxonomyDatabase.h>
#define HHK_BUF_SIZE (32 * 1024)
namespace HHK
{
/*
The Following HHK Exerpt serves as an example to keep at hand in order to understand
the way the different objects interact.
<LI> <OBJECT type="text/sitemap">
<param name="Name" value=".bmp files">
<param name="Name" value="Using Paint to create pictures">
<param name="Local" value="app_paintbrush.htm">
<param name="Name" value="To change the background of your desktop">
<param name="Local" value="win_deskpr_changebackgrnd.htm">
</OBJECT>
*/
/*
Entry represents just the basic HHK entries. Basic HHK entries are comprised of
a couple of Param Name="Name" and Param Name="Local" lines. the first line contains
in its value attribute the Title of the Entry, and the second the url. In the example
the relevant lines are:
<param name="Name" value="Using Paint to create pictures">
<param name="Local" value="app_paintbrush.htm">
In this case m_strTitle == "Using Paint to create pictures"
and m_lstUrl == "app_paintbrush.htm"
*/
class Entry
{
public:
typedef std::list<MPC::string> UrlList;
typedef UrlList::iterator UrlIter;
typedef UrlList::const_iterator UrlIterConst;
MPC::string m_strTitle;
UrlList m_lstUrl;
void MergeURLs( const Entry& entry );
};
/*
A section, is everything that is between a line that starts with:
<LI> <OBJECT type="text/sitemap"
and the closing line which is:
</OBJECT>
A section may contain subsections. Finally a section may be in the form of multiple
entries, or in the form of see also
*/
class Section
{
public:
typedef std::list<Entry> EntryList;
typedef EntryList::iterator EntryIter;
typedef EntryList::const_iterator EntryIterConst;
typedef std::list<Section*> SectionList;
typedef SectionList::iterator SectionIter;
typedef SectionList::const_iterator SectionIterConst;
MPC::string m_strTitle;
EntryList m_lstEntries;
MPC::string m_strSeeAlso;
SectionList m_lstSeeAlso;
Section();
~Section();
void MergeURLs ( const Entry& entry );
void MergeSeeAlso( const Section& sec );
void CleanEntries( EntryList& lstEntries );
};
/*
A reader essentially Opens a stream on the CHM and reads the HHK file from within
the CHM
*/
class Reader
{
private:
static BOOL s_fDBCSSystem;
static LCID s_lcidSystem;
////////////////////////////////////////////////////////////
CComPtr<IStream> m_stream;
MPC::string m_strStorage;
CHAR m_rgBuf[HHK_BUF_SIZE];
LPSTR m_szBuf_Pos;
LPSTR m_szBuf_End;
MPC::string m_strLine;
LPCSTR m_szLine_Pos;
LPCSTR m_szLine_End;
int m_iLevel;
bool m_fOpeningBraceSeen;
inline bool IsEndOfBuffer() { return m_szBuf_Pos >= m_szBuf_End; }
inline bool IsEndOfLine () { return m_szLine_Pos >= m_szLine_End; }
////////////////////////////////////////////////////////////
public:
static LPCSTR StrChr ( LPCSTR szString, CHAR cSearch );
static LPCSTR StriStr ( LPCSTR szString, LPCSTR szSearch );
static int StrColl ( LPCSTR szLeft , LPCSTR szRight );
static LPCSTR ComparePrefix( LPCSTR szString, LPCSTR szPrefix );
Reader();
~Reader();
HRESULT Init( LPCWSTR szFile );
bool ReadNextBuffer ( );
bool GetLine ( MPC::wstring* pstrString = NULL );
bool FirstNonSpace ( bool fWrap = true );
bool FindCharacter ( CHAR ch, bool fSkip = true, bool fWrap = true );
bool FindDblQuote ( bool fSkip = true, bool fWrap = true );
bool FindOpeningBrace( bool fSkip = true, bool fWrap = true );
bool FindClosingBrace( bool fSkip = true, bool fWrap = true );
bool GetQuotedString( MPC::string& strString );
bool GetValue ( MPC::string& strName, MPC::string& strValue );
bool GetType ( MPC::string& strType );
Section* Parse();
};
/*
Writer has as task writing the output MERGED.HHK file
*/
class Writer
{
private:
CComPtr<MPC::FileStream> m_stream;
CHAR m_rgBuf[HHK_BUF_SIZE];
LPSTR m_szBuf_Pos;
inline size_t Available() { return &m_rgBuf[HHK_BUF_SIZE] - m_szBuf_Pos; }
////////////////////////////////////////////////////////////
HRESULT FlushBuffer();
public:
Writer();
~Writer();
HRESULT Init ( LPCWSTR szFile );
HRESULT Close( );
HRESULT OutputLine ( LPCSTR szLine );
HRESULT OutputSection( Section* sec );
};
////////////////////////////////////////////////////////////
class Merger
{
public:
class Entity
{
Section* m_Section;
protected:
void SetSection( Section* sec );
public:
Entity();
virtual ~Entity();
virtual HRESULT Init() = 0;
Section* GetSection();
Section* Detach ();
virtual bool MoveNext() = 0;
virtual long Size() const = 0;
};
class FileEntity : public Entity
{
MPC::wstring m_strFile;
Reader m_Input;
public:
FileEntity( LPCWSTR szFile );
virtual ~FileEntity();
virtual HRESULT Init();
virtual bool MoveNext();
virtual long Size() const;
};
class DbEntity : public Entity
{
public:
struct match
{
long ID_keyword;
long ID_topic;
MPC::string strKeyword;
MPC::string strTitle;
MPC::string strURI;
};
class CompareMatches
{
public:
bool operator()( /*[in]*/ const match *, /*[in]*/ const match * ) const;
};
typedef std::list<match> MatchList;
typedef MatchList::iterator MatchIter;
typedef MatchList::const_iterator MatchIterConst;
typedef std::map<match*,match*,CompareMatches> SortMap;
typedef SortMap::iterator SortIter;
typedef SortMap::const_iterator SortIterConst;
typedef std::map<long,match*> TopicMap;
typedef TopicMap::iterator TopicIter;
typedef TopicMap::const_iterator TopicIterConst;
typedef std::map<long,MPC::string> KeywordMap;
typedef KeywordMap::iterator KeywordIter;
typedef KeywordMap::const_iterator KeywordIterConst;
private:
Section::SectionList m_lst;
Taxonomy::Updater& m_updater;
Taxonomy::WordSet m_setCHM;
public:
DbEntity( /*[in]*/ Taxonomy::Updater& updater, /*[in]*/ Taxonomy::WordSet& setCHM );
virtual ~DbEntity();
virtual HRESULT Init();
virtual bool MoveNext();
virtual long Size() const;
};
class SortingFileEntity : public Entity
{
typedef std::vector<Section*> SectionVec;
typedef SectionVec::iterator SectionIter;
typedef SectionVec::const_iterator SectionIterConst;
Section::SectionList m_lst;
FileEntity m_in;
public:
SortingFileEntity( LPCWSTR szFile );
virtual ~SortingFileEntity();
virtual HRESULT Init();
virtual bool MoveNext();
virtual long Size() const;
};
typedef std::list<Entity*> EntityList;
typedef EntityList::iterator EntityIter;
typedef EntityList::const_iterator EntityIterConst;
EntityList m_lst;
EntityList m_lstSelected;
Section* m_SectionSelected;
Section* m_SectionTemp;
public:
Merger();
~Merger();
HRESULT AddFile( Entity* ent, bool fIgnoreMissing = true );
bool MoveNext();
Section* GetSection();
long Size() const;
HRESULT PrepareMergedHhk ( Writer& writer, Taxonomy::Updater& updater , Taxonomy::WordSet& setCHM, MPC::WStringList& lst, LPCWSTR szOutputHHK );
HRESULT PrepareSortingOfHhk( Writer& writer, LPCWSTR szInputHHK, LPCWSTR szOutputHHK );
static Section* MergeSections( Section::SectionList& lst );
};
////////////////////////////////////////////////////////////
};
/////////////////////////////////////////////////////////////////////////////
#endif // !defined(__INCLUDED___HCP___MERGEDHHK_H___)