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.
 
 
 
 
 
 

227 lines
5.1 KiB

// Copyright (C) 1997 Microsoft Corporation, 1996 - 1997.
//
// IComponent implementation
//
// 9-2-97 sburns
#ifndef COMP_HPP_INCLUDED
#define COMP_HPP_INCLUDED
#include "scopnode.hpp"
#include "mmcprop.hpp"
#include "NodePointerExtractor.hpp"
// Implements IComponent. An instance of this class is created for each MDI
// child of a particular "load" of a Snapin.
class Component
:
public IComponent,
public IExtendContextMenu,
public IExtendPropertySheet /* ,
public IResultDataCompare */
{
// Only instances of ComponentData can create instances of this
// class.
friend class ComponentData;
public:
// IUnknown overrides
virtual
ULONG __stdcall
AddRef();
virtual
ULONG __stdcall
Release();
virtual
HRESULT __stdcall
QueryInterface(const IID& interfaceID, void** interfaceDesired);
// IComponent overrides
virtual
HRESULT __stdcall
Initialize(IConsole* console);
virtual
HRESULT __stdcall
Notify(
IDataObject* dataObject,
MMC_NOTIFY_TYPE event,
LPARAM arg,
LPARAM param);
virtual
HRESULT __stdcall
Destroy(MMC_COOKIE cookie);
virtual
HRESULT __stdcall
QueryDataObject(
MMC_COOKIE cookie,
DATA_OBJECT_TYPES type,
IDataObject** ppDataObject);
virtual
HRESULT __stdcall
GetResultViewType(MMC_COOKIE cookie, LPOLESTR* viewType, long* options);
virtual
HRESULT __stdcall
GetDisplayInfo(RESULTDATAITEM* item);
virtual
HRESULT __stdcall
CompareObjects(IDataObject* objectA, IDataObject* objectB);
// IExtendContextMenu overrides
virtual
HRESULT __stdcall
AddMenuItems(
IDataObject* dataObject,
IContextMenuCallback* callback,
long* insertionAllowed);
virtual
HRESULT __stdcall
Command(long commandID, IDataObject* dataObject);
// IExtendPropertySheet overrides
virtual
HRESULT __stdcall
CreatePropertyPages(
IPropertySheetCallback* callback,
LONG_PTR handle,
IDataObject* dataObject);
virtual
HRESULT __stdcall
QueryPagesFor(IDataObject* dataObject);
// IResultDataCompare overrides
// virtual
// HRESULT __stdcall
// Compare(
// LPARAM userParam,
// MMC_COOKIE cookieA,
// MMC_COOKIE cookieB,
// int* result);
private:
// only our friend class ComponentData can instantiate us.
//
// parent - the instantiating parent ComponentData object.
Component(ComponentData* parent);
// only Release can cause us to be deleted
virtual
~Component();
// MMCN_SHOW handler
HRESULT
DoShow(
IDataObject& dataObject,
bool selected // ,
/* HSCOPEITEM scopeID */ );
// MMCN_ADD_IMAGES handler
HRESULT
DoAddImages(IImageList& imageList);
// MMCN_REFRESH handler
HRESULT
DoRefresh(IDataObject& dataObject);
// MMCN_SELECT handler
HRESULT
DoSelect(
IDataObject& dataObject,
bool selected);
// MMCN_VIEW_CHANGE handler
HRESULT
DoViewChange(IDataObject& dataObject, bool clear);
// MMCN_PROPERY_CHANGE handler
HRESULT
DoResultPaneRefresh(ScopeNode& node);
// MMCN_RENAME handler
HRESULT
DoRename(
IDataObject& dataObject,
const String& newName);
// MMCN_DELETE handler
HRESULT
DoDelete(IDataObject& dataObject);
// not implemented; no instance copying allowed.
Component(const Component&);
void operator=(const Component&);
SmartInterface<IConsole2> console;
SmartInterface<IConsoleVerb> consoleVerb;
SmartInterface<IHeaderCtrl> headerCtrl;
SmartInterface<ComponentData> parent;
SmartInterface<IResultData> resultData;
SmartInterface<ScopeNode> selectedScopeNode;
SmartInterface<IDisplayHelp> displayHelp;
// We need a buffer that will persist beyond the life time of this call.
// This is needed because the item->str needs to be valid when this call
// returns. (the need for this buffer is a design flaw in MMC, which
// should have the snapin allocate an LPOLESTR and free it when it is not
// needed.).
//
// The MMC docs claim it is not safe to deallocate the buffer until the
// cookie is destroyed, the Component is destroyed (with
// IComponent::Destroy), or GetDisplayInfo is called again for the same
// cookie. We will cache the last result for each cookie in a map with the
// cookie as the key and the result String as the value.
//
// This map has the same lifetime as the Component instance. Access is
// threadsafe as the COM object in which it lives is apartment threaded.
typedef
std::map<
MMC_COOKIE,
String,
std::less<MMC_COOKIE>,
Burnslib::Heap::Allocator<String> >
CookieToStringMap;
CookieToStringMap displayInfoCache;
ComServerReference dllref;
long refcount;
NodePointerExtractor nodePointerExtractor;
};
#endif // COMP_HPP_INCLUDED