Source code of Windows XP (NT5)
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

127 lines
3.6 KiB

/*--------------------------------------------------------------------------*
*
* Microsoft Windows
* Copyright (C) Microsoft Corporation, 1992 - 1999
*
* File: bookmark.h
*
* Contents: Interface file for CBookmark
*
* History: 05-Oct-98 jeffro Created
*
*--------------------------------------------------------------------------*/
#ifndef BOOKMARK_H
#define BOOKMARK_H
#pragma once
#include <windows.h>
#include <vector>
#include <objbase.h>
#include "ndmgr.h"
#include "ndmgrpriv.h"
#include "stddbg.h"
#include "stgio.h"
#include "xmlbase.h"
typedef std::vector<BYTE> ByteVector;
#define BOOKMARK_CUSTOMSTREAMSIGNATURE "MMCCustomStream"
/*+-------------------------------------------------------------------------*
* class CDynamicPathEntry
*
*
* PURPOSE: Encapsulates a single entry in the dynamic path of a bookmark.
*
*+-------------------------------------------------------------------------*/
class CDynamicPathEntry : public CXMLObject
{
protected:
enum PathEntryType
{
NDTYP_STRING = 0x01,
NDTYP_CUSTOM = 0x02
};
public:
// comparison
bool operator ==(const CDynamicPathEntry &rhs) const;
bool operator < (const CDynamicPathEntry &rhs) const;
SC ScInitialize(bool bIs10Path, /*[IN,OUT]*/ByteVector::iterator &iter);
void Write (ByteVector& v) const; // write the contents to a byte vector
virtual void Persist(CPersistor &persistor);
DEFINE_XML_TYPE(XML_TAG_DYNAMIC_PATH_ENTRY);
protected:
BYTE m_type; // string or custom ID?
// compiler error C2621 prevents making the next two fields a union.
ByteVector m_byteVector; // the actual data if it is a custom ID
std::wstring m_strEntry; // the actual data if it is a string.
};
/*+-------------------------------------------------------------------------*
* class CBookmark
*
*
* PURPOSE: Maintains a persistent representation of a scope node.
*
*+-------------------------------------------------------------------------*/
class CBookmark : public CXMLObject
{
friend class CScopeTree;
typedef std::list<CDynamicPathEntry> CDynamicPath;
public:
enum { ID_Unknown = -1 };
CBookmark(MTNODEID idStatic = ID_Unknown) : m_idStatic (idStatic) , m_bIsFastBookmark(true) {}
CBookmark(bool bIsFastBookmark) : m_idStatic (0), m_bIsFastBookmark(bIsFastBookmark) {}
virtual ~CBookmark () {}
bool IsValid () const { return (m_idStatic != ID_Unknown); }
bool IsStatic () const { ASSERT (IsValid()); return (m_dynamicPath.empty()); }
bool IsDynamic () const { return (!IsStatic());}
void Reset() {m_idStatic = ID_Unknown; m_dynamicPath.clear();}
IStream & Load(IStream &stm);
IStream & Save(IStream &stm) const;
// Casts
operator HBOOKMARK() const;
static CBookmark * GetBookmark(HBOOKMARK hbm);
// XML
DEFINE_XML_TYPE(XML_TAG_BOOKMARK);
virtual void Persist(CPersistor &persistor);
public:
bool operator ==(const CBookmark& other) const;
bool operator !=(const CBookmark& other) const;
bool operator < (const CBookmark& other) const;
void SetFastBookmark(bool b) {m_bIsFastBookmark = b;}
protected:
MTNODEID m_idStatic;
CDynamicPath m_dynamicPath;
protected:
bool m_bIsFastBookmark;
bool IsFastBookmark() {return m_bIsFastBookmark;}
};
inline IStream& operator>> (IStream& stm, CBookmark& bm)
{
return bm.Load(stm);
}
inline IStream& operator<< (IStream& stm, const CBookmark& bm)
{
return bm.Save(stm);
}
#include "bookmark.inl"
#endif // BOOKMARK_H