windows-nt/Source/XPSP1/NT/enduser/stuff/hhctrl/sitemap.h
2020-09-26 16:20:57 +08:00

535 lines
21 KiB
C++

// Copyright (C) 1996-1997 Microsoft Corporation. All rights reserved.
#if _MSC_VER > 1000
#pragma once
#endif
#ifndef __SITEMAP_H__
#define __SITEMAP_H__
class CHtmlHelpControl; // forward reference
#include "cinput.h"
#include "strtable.h"
typedef PCSTR URL;
typedef UINT INFOTYPE;
const INFOTYPE ITYPE_ALWAYS_SHOW = 0; // when this info type is defined, the entry is always shown to the user (unless a Hidden info type overrides)
const int MAX_RELATED_ENTRIES = 256; // maximum number of sitemap entries for Related Topics
const int MAX_KEYSEARCH_ENTRIES = 256; // maximum number of sitemap entries for Keyword Search
enum {
IMAGE_CLOSED_BOOK = 1,
IMAGE_OPEN_BOOK,
IMAGE_CLOSED_BOOK_NEW,
IMAGE_OPEN_BOOK_NEW,
IMAGE_CLOSED_FOLDER,
IMAGE_OPEN_FOLDER,
IMAGE_CLOSED_FOLDER_NEW,
IMAGE_OPEN_FOLDER_NEW,
IMAGE_HELP_TOPIC,
IMAGE_HELP_TOPIC_NEW,
IMAGE_TOPIC,
IMAGE_TOPIC_NEW,
IMAGE_TOPIC_REMOTE,
IMAGE_TOPIC_NEW_REMOTE,
};
#define IMAGE_INFOTYPE 37
#define ESCAPE_ENTITY 0x01
#define ESCAPE_URL 0x02
#define ESCAPE_C 0x04
#define ESCAPE_ALL 0x07
/*
Each URL can be associated with any number of information types.
Information types are stored as bit flags. By default, each
SITE_ENTRY_URL entry contains enough storage for 32 information types.
If more are needed, then additional memory must be allocated. Note that
we must allocate 4 bytes for each additional information type in order to
avoid alignment problems.
The CSiteMap class must keep track of the total number of bytes to
allocate for each SITE_ENTRY_URL structure. This can NOT change once
a SITEMAP_ENTRY has been allocated (unless all SITEMAP_ENTRY structures
get updated). Within the SITEMAP_ENTRY structure, cUrls tells us how
many SITE_ENTRY_URL structures to allocate.
*/
typedef struct {
PCSTR pszTitle;
URL urlPrimary;
URL urlSecondary;
//INFOTYPE ainfoTypes[1]; // which information types
INFOTYPE *ainfoTypes;
} SITE_ENTRY_URL;
const int MAX_CATEGORIES = 10;
typedef struct {
int c_Types; // the number of ITs in a category
INFOTYPE *pInfoType; // a pointer to a set of infotype bits. The bits represent info types
// bit zero is reserved.
} CATEGORY_TYPE;
typedef struct {
CTable* m_ptblInfoTypes;
CTable* m_ptblInfoTypeDescriptions;
CTable* m_ptblCategories;
CTable* m_ptblCatDescription;
int m_cTypes; // total number of types
int m_cITSize; // The number of DWORDs allocated for categories, m_pExclusive, and m_pHidden
INFOTYPE* m_pExclusive; // index to first exclusive information type
INFOTYPE* m_pHidden; // index to first hidden information type
int m_max_categories; // The number of categories currently allocated.
CATEGORY_TYPE *m_aCategories;
} INFOTYPE_TABLES;
// Overhead is 20 bytes per entry + 12 for each URL (assuming up to 32 InfoTypes)
// forward reference
class CSiteMap;
typedef struct _tagSiteMapEntry {
#ifndef HHA
CSiteMap* pSiteMap;
#endif
PCSTR pszText; // title/keyword for this entry
#ifndef HHCTRL
PCSTR pszComment;
PCSTR pszSort; // used when sorting index
#endif
short iWindowName;
short iFrameName;
short iFontName;
short cUrls; // number or URLS
BYTE iImage;
BYTE level;
BYTE fInclude; // Used by HHW to track included sitemap file
BYTE fTopic:1;
BYTE fNew:1;
BYTE fNoDisplay:1;
BYTE fSeeAlso:1;
BYTE fShowToEveryOne:1; // TRUE if no Information Type was specified
BYTE fSendEvent:1; // TRUE if URL is an event string
BYTE fSendMessage:1; // TRUE if URL is a message string
BYTE fShortCut:1; // TRUE if URL is a shortcut string
// WARNING! pUrls must be the last member of this structure
SITE_ENTRY_URL* pUrls;
int GetLevel(void) const { return level; }
void SetLevel(int val) { level = (BYTE)val; }
PCSTR GetKeyword() const { return pszText; }
#ifdef HHCTRL
#ifndef HHA
HRESULT GetKeyword( WCHAR* pwszKeyword, int cch );
#endif
#endif
PCSTR GetTitle( SITE_ENTRY_URL* pUrl ) { return pUrl->pszTitle ? pUrl->pszTitle : GetStringResource(IDS_UNTITLED); }
#ifdef HHCTRL
#ifndef HHA
HRESULT GetTitle( SITE_ENTRY_URL* pUrl, WCHAR* pwszTitle, int cch );
#endif
#endif
BOOL IsTopic(void) const { return fTopic; }
void SetTopic(BOOL fSetting) { fTopic = fSetting; }
BOOL IsNew(void) const { return fNew; }
void SetNew(BOOL fSetting) { fNew = fSetting; }
BOOL GetSeeAlso(void) const { return fSeeAlso; }
void SetSeeAlso(BOOL fSetting) { fSeeAlso = fSetting; }
int GetImageIndex(void) const { return iImage; }
void SetImageIndex(int IndexImage) { iImage = (BYTE) IndexImage; }
int GetWindowIndex(void) const { return (int) iWindowName; }
void SetWindowIndex(int index) { iWindowName = (short)index; }
int GetFrameIndex(void) const { return (int) iFrameName; }
void SetFrameIndex(int index) { iFrameName = (short)index; }
int GetFontIndex(void) const { return (int) iFontName; }
void SetFontIndex(int index) { iFontName = (short)index; }
void Clear(void) { ClearMemory(this, sizeof(_tagSiteMapEntry)); }
} SITEMAP_ENTRY;
class CSiteMapEntry : public SITEMAP_ENTRY
{
public:
CSiteMapEntry() { ClearMemory(this, sizeof(CSiteMapEntry)); }
#ifndef HHCTRL
void CopyFrom(const SITEMAP_ENTRY* pSiteMapEntry, CSiteMap* pSiteMapSrc, CSiteMap* pSiteMapDst);
void CopyTo(SITEMAP_ENTRY* pSiteMapEntry, CSiteMap* pSiteMapSrc, CSiteMap* pSiteMapDst);
#endif
};
class CSiteEntryUrl
{
public:
CSiteEntryUrl(int ITSize) {
m_pUrl = (SITE_ENTRY_URL*) lcCalloc(sizeof(SITE_ENTRY_URL) );
m_pUrl->ainfoTypes = (INFOTYPE*)lcCalloc( ITSize==0?sizeof(INFOTYPE):ITSize );
m_fUrlSpecified = FALSE;
}
~CSiteEntryUrl() { lcFree(m_pUrl->ainfoTypes); lcFree(m_pUrl); }
void SaveUrlEntry(CSiteMap* pSiteMap, SITEMAP_ENTRY* pSiteMapEntry);
SITE_ENTRY_URL* m_pUrl;
int m_cMaxTypes;
BOOL m_fUrlSpecified;
};
class CParseSitemap; // forward reference
// Forward declarations declared in genit.cpp
//
int GetITBitfromIT(INFOTYPE const *IT, int* offset, int* bit, int cTypes);
void AddIT(int const type, INFOTYPE *pIT );
void DeleteIT(int const type, INFOTYPE *pIT );
int GetITfromCat(int* offset, INFOTYPE* bit, INFOTYPE* pInfoType, int cTypes);
int GetITBitfromIT(INFOTYPE const *IT, int* offset, INFOTYPE* bit, int cTypes);
void CopyITBits(INFOTYPE** ITDst, INFOTYPE* ITSrc, int size);
// WARNING!!! All member classes should be included as pointers or initialization
// will trash the class.
// forward reference
SITEMAP_ENTRY;
class CSiteMap : public CTable
{
private:
void SizeIT(int oldSize);
public:
CSiteMap(int cMaxEntries = 0);
virtual ~CSiteMap();
#ifdef HHA
SITEMAP_ENTRY* AddEntry( SITEMAP_ENTRY* pSiteMapEntry = NULL )
{
int iData = AddData(sizeof(SITEMAP_ENTRY), pSiteMapEntry);
if (iData)
{
return GetSiteMapEntry(iData);
}
else
return NULL;
}
#else
SITEMAP_ENTRY* AddEntry( SITEMAP_ENTRY* pSiteMapEntry = NULL )
{
int iData = AddData(sizeof(SITEMAP_ENTRY), pSiteMapEntry);
if (iData)
{
SITEMAP_ENTRY* pReturn = GetSiteMapEntry(iData);
pReturn->pSiteMap = this;
return pReturn;
}
else
return NULL;
}
#endif
void AddFavoriteNodes(PCSTR pszRoot, PCSTR pszNewFolder, int level);
void AddInfoTypeToUrl(SITEMAP_ENTRY* pSiteMapEntry, INFOTYPE iType);
int AddTypeName(PCSTR pszName);
int Count(void) const { return endpos - 1; };
void CreateFavorites(int level = 1);
int GetImageNumber(SITEMAP_ENTRY* pSiteMapEntry) const;
SITEMAP_ENTRY* GetSiteMapEntry(int pos) const { return (SITEMAP_ENTRY*) GetPointer(pos); }
#ifdef HHCTRL
#ifdef HHA
BOOL ReadFromFile(PCSTR pszFileName, BOOL fIndex, CHtmlHelpControl* phhctrl );
#else
BOOL ReadFromFile(PCSTR pszFileName, BOOL fIndex, CHtmlHelpControl* phhctrl, UINT CodePage );
#endif
#else
BOOL ReadFromFile(PCSTR pszFileName, BOOL fIndex, PCSTR pszBaseFile = NULL);
#endif
BOOL AreAnyInfoTypesDefined(SITEMAP_ENTRY* pSiteMapEntry);
SITE_ENTRY_URL* AreTheseInfoTypesDefined(SITEMAP_ENTRY* pSiteMapEntry, INFOTYPE types, int offset) const;
SITE_ENTRY_URL* NextUrlEntry(SITE_ENTRY_URL* pUrl) const { return (SITE_ENTRY_URL*) ((PBYTE) pUrl + sizeof(SITE_ENTRY_URL) ); }
SITE_ENTRY_URL* GetUrlEntry(SITEMAP_ENTRY* pSiteMapEntry, int pos /* zero-based */) { return (SITE_ENTRY_URL*) ((PBYTE) pSiteMapEntry->pUrls + (GetUrlEntrySize() * pos)); }
SITE_ENTRY_URL* GetUrlEntry(SITE_ENTRY_URL* pUrl, int pos /* zero-based */) { return (SITE_ENTRY_URL*) ((PBYTE) pUrl + (GetUrlEntrySize() * pos)); }
PCSTR GetUrlTitle(SITEMAP_ENTRY* pSiteMapEntry, int pos /* zero-based */) { return pSiteMapEntry->GetTitle((SITE_ENTRY_URL*) (SITE_ENTRY_URL*) ((PBYTE) pSiteMapEntry->pUrls + (GetUrlEntrySize() * pos))); }
int GetUrlEntrySize(void) const { return sizeof(SITE_ENTRY_URL); }
BOOL ParseSiteMapParam(CParseSitemap* pcparse, PCSTR pszParamType, CTable *ptblSubSets);
void ReSizeIT(int Size=0);
void ReSizeURLIT(int Size=0);
BOOL IsEntryInCurTypeList(SITEMAP_ENTRY* pSiteMapEntry) const;
int GetInfoType(PCSTR pszTypeName);
PCSTR GetInfoTypeName(int pos) const { return m_itTables.m_ptblInfoTypes->GetPointer(pos); }
int GetITIndex(PCSTR pszString) const { return m_itTables.m_ptblInfoTypes->IsStringInTable( pszString ); }
PCSTR GetInfoTypeDescription(int pos) const { return m_itTables.m_ptblInfoTypeDescriptions->GetPointer(pos); }
int GetInfoTypeSize(void) const { return InfoTypeSize(); }
int HowManyInfoTypes(void) const { return m_itTables.m_ptblInfoTypes ? m_itTables.m_ptblInfoTypes->CountStrings() : 0; }
BOOL IsInACategory( int type ) const;
int InfoTypeSize(void) const { return m_itTables.m_cITSize * sizeof(INFOTYPE); }
BOOL IsDeleted( const int pos ) const { return ( *(GetInfoTypeName(pos))==' ' )?TRUE:FALSE; }
int GetFirstExclusive(int=-1, INFOTYPE=1) const;
int GetNextExclusive(void) const;
int GetLastExclusive(void) const;
void AddExclusiveIT(int const type) { AddIT( type, m_itTables.m_pExclusive ); }
void DeleteExclusiveIT(int const type ) { DeleteIT( type, m_itTables.m_pExclusive); }
BOOL IsExclusive(int const type) const { return m_itTables.m_pExclusive?*(m_itTables.m_pExclusive+(type/32)) & (1<<(type%32)):0; }
int GetFirstHidden(int=-1, INFOTYPE=1) const;
int GetNextHidden(void) const;
int GetLastHidden(void) const;
void AddHiddenIT(int const type ) { AddIT(type, m_itTables.m_pHidden); }
void DeleteHiddenIT(int const type) { DeleteIT( type, m_itTables.m_pHidden ); }
BOOL IsHidden(int const type) const { return m_itTables.m_pHidden?*(m_itTables.m_pHidden+(type/32)) & (1<<(type%32)):0; }
int GetFirstCategoryType(int pos) const ;
int GetNextITinCategory( void ) const ;
int GetLastCategoryType(int pos) const ;
void AddITtoCategory(int pos, int type);
void AddToCategory( int iLastType );
void DeleteITfromCat(int pos, int type);
BOOL IsITinCategory( int pos, int type) const { return m_itTables.m_aCategories[pos].pInfoType?*(m_itTables.m_aCategories[pos].pInfoType+(type/32)) & (1<<(type%32)):0; }
BOOL IsCatDeleted( const int pos ) const { return ( *(GetCategoryString(pos))==' ' )?TRUE:FALSE; }
void CopyCat(INFOTYPE_TABLES*, const INFOTYPE_TABLES*);
PCSTR GetCategoryString(int pos) const { return m_itTables.m_ptblCategories->GetPointer(pos); }
int GetCatPosition(PCSTR psz) const { return m_itTables.m_ptblCategories->IsStringInTable(psz); }
int HowManyCategories(void) const { return m_itTables.m_ptblCategories ? m_itTables.m_ptblCategories->CountStrings() : 0; }
PCSTR GetCategoryDescription(int pos) const { return m_itTables.m_ptblCatDescription?m_itTables.m_ptblCatDescription->GetPointer(pos):0; }
int GetLevel(int pos) const { return GetSiteMapEntry(pos)->GetLevel(); }
void SetLevel(int val, int pos) { GetSiteMapEntry(pos)->SetLevel(val); }
PCSTR GetPathName(void) { return m_pszSitemapFile; }
PCSTR GetSiteMapFile(void) { return m_pszSitemapFile; }
void SetSiteMapFile(PCSTR pszFile)
{
if (!m_pszSitemapFile && pszFile)
m_pszSitemapFile = StrDup(pszFile);
}
PCSTR GetFrameName(void) { return m_pszFrameName ? m_pszFrameName : ""; }
void SetFrameName(PCSTR psz) { m_pszFrameName = IsEmptyString(psz) ? NULL : StrDup(psz); }
BOOL IsFrameDefined(void) { return m_pszFrameName != NULL; }
void SetEntryFrame(SITEMAP_ENTRY* pSiteMapEntry, PCSTR psz) { pSiteMapEntry->SetFrameIndex(AddName(psz)); }
PCSTR GetEntryFrame(SITEMAP_ENTRY* pSiteMapEntry) { return GetName(pSiteMapEntry->GetFrameIndex()); }
PCSTR GetWindowName(void) { return m_pszWindowName ? m_pszWindowName : ""; }
void SetWindowName(PCSTR psz) { m_pszWindowName = IsEmptyString(psz) ? NULL : StrDup(psz); }
BOOL IsWindowDefined(void) { return m_pszWindowName != NULL; }
void SetEntryWindow(SITEMAP_ENTRY* pSiteMapEntry, PCSTR psz) { pSiteMapEntry->SetWindowIndex(AddName(psz)); }
PCSTR GetEntryWindow(SITEMAP_ENTRY* pSiteMapEntry) { return GetName(pSiteMapEntry->GetWindowIndex()); }
URL AddUrl(PCSTR pszUrl);
PCSTR GetUrlString(URL url) const { return (PCSTR) url; }
int AddName(PCSTR psz);
PCSTR GetName(int pos)
{
#ifdef _DEBUG
if (m_ptblStrings)
ASSERT(pos <= m_ptblStrings->CountStrings());
#endif
return (m_ptblStrings && pos > 0) ? m_ptblStrings->GetHashStringPointer(pos) : "";
}
BOOL IsIndex(void) { return m_fIndex; }
#ifndef HHA
UINT GetCodePage() { if( m_CodePage != (UINT)-1 ) return m_CodePage; else return CP_ACP; }
#endif
//////// member variables //////////
/*
!!! WARNING: if you add or remove members, you must change the version
!!! number in hhamsgs.h or face a GPF when the author does a View Entry.
*/
BOOL m_fTypeCopy; // TRUE if following tables are pointers that must not be freed
INFOTYPE_TABLES m_itTables;
// CSubSets *m_pSubSets;
PCSTR m_pszSitemapFile;
INFOTYPE* m_pInfoTypes; // user-specified Information Types
INFOTYPE* m_pTypicalInfoTypes; // "typical" information types
BOOL m_fIndex; // TRUE if using this as an index
PSTR m_pszBase; // used when reading sitemap file
PCSTR m_pszImageList;
int m_cImageWidth; // width of each icon in image
int m_cImages;
COLORREF m_clrMask;
COLORREF m_clrBackground;
COLORREF m_clrForeground;
PCSTR m_pszFont; // name, pointsize, ext. usefull to CTocClass.
BOOL m_fFolderImages; // use folders instead of books as the image
BOOL m_fPromotForInfoTypes;
DWORD m_tvStyles; // regular window styles
DWORD m_exStyles; // extended window styles
PCSTR m_pszBackBitmap; // used for TOC and Index
int m_cITSize; // The number of DWORDS currently allocated for IT bits for the URL
// int m_cUrlEntry; // sizeof(SITE_ENTRY_URL) + sizeof(URL) for each additional 32 Information Types
// int m_cInfoTypeOffsets; // number of additional offsets to check
BOOL m_fAutoGenerated; // means the file is not writeable
#ifndef HHCTRL
SITEMAP_ENTRY* Add(const SITEMAP_ENTRY* pSiteMapEntry = NULL);
SITEMAP_ENTRY* Insert(int pos, const SITEMAP_ENTRY* pSiteMapEntry = NULL);
void Remove(int pos, BOOL fCompact = TRUE);
void FillUrlComboBox(SITEMAP_ENTRY* pSiteMapEntry, HWND hwndCombo);
void MoveEntry(int posSrc, int posDst);
BOOL SaveSiteMap(PCSTR pszPathName, BOOL fIndex);
void OutputDefaultSiteMapEntry(COutput* pout, SITEMAP_ENTRY* pSiteMapEntry, int curLevel, BOOL fIndex);
void CopyProperties(CSiteMap* pSiteMap, BOOL fIncludeTables = FALSE);
#endif
CTable* m_ptblStrings;
PCSTR m_pszFrameName; // default frame to use
PCSTR m_pszWindowName; // default window to use
PCSTR m_pszHHIFile;
BOOL m_fSaveIT; // Save the declared IT in an instance of CSitemap, if there is an hhi hhc IT declarations are not saved.
#ifndef HHA
private:
UINT m_CodePage;
#endif
};
// note the inlined SITEMAP_ENTRY functions below must be declared after
// the declaration of CSiteMap otherwise the compiler will choke on them
// since they access CSiteMap members/methods
#ifdef HHCTRL
#ifndef HHA
inline HRESULT SITEMAP_ENTRY::GetKeyword( WCHAR* pwszKeyword, int cch )
{
ASSERT( pSiteMap );
//ASSERT( pSiteMap->GetCodePage() );
UINT CodePage = pSiteMap->GetCodePage();
if( MultiByteToWideChar( CodePage, 0, pszText, -1, pwszKeyword, cch ) == 0 )
return E_FAIL;
return S_OK;
}
#endif
#endif
#ifdef HHCTRL
#ifndef HHA
inline HRESULT SITEMAP_ENTRY::GetTitle( SITE_ENTRY_URL* pUrl, WCHAR* pwszTitle, int cch )
{
ASSERT( pSiteMap );
//ASSERT( pSiteMap->GetCodePage() );
if( !pUrl->pszTitle ) {
wcsncpy( pwszTitle, GetStringResourceW(IDS_UNTITLED), cch);
pwszTitle[cch] = 0;
return S_OK;
}
UINT CodePage = pSiteMap->GetCodePage();
if( MultiByteToWideChar( CodePage, 0, pszText, -1, pwszTitle, cch) == 0 )
return E_FAIL;
return S_OK;
}
#endif
#endif
extern const char txtBeginList[]; // "<UL>"
extern const char txtEndList[] ; // "</UL>"
extern const char txtBeginListItem[]; // "<LI"
extern const char txtSitemap[]; // "<!Sitemap";
extern const char txtSitemap1[]; // "<!--Sitemap";
extern const char txtSitemap2[]; // "<!Sitemap";
extern const char txtParam[]; // "<param name";
extern const char txtValue[]; // "value";
extern const char txtBeginHref[]; // "<A HREF";
extern const char txtEndHref[]; // "</A>";
extern const char txtBeginObject[]; // "<OBJECT"
extern const char txtEndObject[]; // "</OBJECT>"
extern const char txtSiteMapObject[]; // "text/sitemap";
extern const char txtSitemapProperties[]; // "text/site properties";
extern const char txtBackGround[]; // "Background";
extern const char txtForeGround[]; // "Foreground";
extern const char txtFont[]; // "Font";
extern const char txtImageList[]; // "ImageList";
extern const char txtImageWidth[]; // "Image Width";
extern const char txtColorMask[]; // "Color Mask";
extern const char txtNumberImages[]; // "NumberImages";
extern const char txtExWindowStyles[]; // "ExWindow Styles";
extern const char txtWindowStyles[]; // "Window Styles";
extern const char txtType[]; // "type";
extern const char txtNo[]; // "No";
extern const char txtFolderType[]; // "Folder";
extern const char txtEndTag[]; // "</";
extern const char txtInfoTypeDeclaration[]; // "InformationTypeDecl";
// Param labels
extern const char txtParamType[]; // "Type";
extern const char txtParamTypeExclusive[];// "TypeExclusive";
extern const char txtParamTypeHidden[]; // "TypeHidden";
extern const char txtParamTypeDesc[]; // "TypeDesc";
extern const char txtParamCategory[]; // "Category";
extern const char txtParamCategoryDesc[]; // "CategoryDesc";
extern const char txtParamName[]; // "Name";
extern const char txtParamUrl[]; // "URL";
extern const char txtParamIcon[]; // "Icon";
extern const char txtParamLocal[]; // "Local";
extern const char txtParamFrame[]; // "Frame";
extern const char txtParamWindow[]; // "Window";
extern const char txtParamNew[]; // "New";
extern const char txtParamComment[]; // "Comment";
extern const char txtParamImageNumber[]; // "ImageNumber";
extern const char txtParamDisplay[]; // "Display";
extern const char txtParamKeyword[]; // "Keyword";
extern const char txtParamInstruction[]; // "Instruction";
extern const char txtParamSectionTitle[]; // "Section Title";
extern const char txtSeeAlso[]; // "See Also";
extern const char txtImageType[]; // "ImageType";
extern const char txtFavorites[]; // "Favorites";
extern const char txtAutoGenerated[]; // "Auto Generated";
extern const char txtSSInclusive[]; // "Inclusive";
extern const char txtSSExclusive[]; // "Exclusive";
//////////////////////////////////// Functions ///////////////////////////////
int CompareSz(PCSTR psz, PCSTR pszSub);
HASH HashFromSz(PCSTR pszKey);
BOOL ReplaceEscapes(PCSTR pszSrc, PSTR pszDst, int); // pszSrc can be same as pszDst
#endif // __SITEMAP_H__