Leaked source code of windows server 2003
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.
 
 
 
 
 
 

281 lines
7.1 KiB

/***************************************************************************\
*
* File: MsgObject.inl
*
* Description:
* MsgObject.inl implements the "Message Object" class that is used to receive
* messages in DirectUser. This object is created for each instance of a
* class that is instantiated.
*
*
* History:
* 8/05/2000: JStall: Created
*
* Copyright (C) 2000 by Microsoft Corporation. All rights reserved.
*
\***************************************************************************/
#if !defined(MSG__MsgObject_inl__INCLUDED)
#define MSG__MsgObject_inl__INCLUDED
#pragma once
#include "MsgTable.h"
/***************************************************************************\
*****************************************************************************
*
* class MsgObject
*
*****************************************************************************
\***************************************************************************/
//------------------------------------------------------------------------------
inline MsgObject *
CastMsgObject(BaseObject * pbase)
{
if ((pbase != NULL) && TestFlag(pbase->GetHandleMask(), hmMsgObject)) {
return (MsgObject *) pbase;
}
return NULL;
}
//------------------------------------------------------------------------------
inline const MsgObject *
CastMsgObject(const BaseObject * pbase)
{
if ((pbase != NULL) && TestFlag(pbase->GetHandleMask(), hmMsgObject)) {
return (const MsgObject *) pbase;
}
return NULL;
}
//------------------------------------------------------------------------------
inline MsgObject *
ValidateMsgObject(HGADGET hgad)
{
return CastMsgObject(BaseObject::ValidateHandle(hgad));
}
//------------------------------------------------------------------------------
inline
MsgObject::MsgObject()
{
}
//------------------------------------------------------------------------------
inline
MsgObject::~MsgObject()
{
}
//------------------------------------------------------------------------------
inline MsgObject *
MsgObject::RawCastMsgObject(DUser::Gadget * pg)
{
Assert(pg != NULL);
return reinterpret_cast<MsgObject *> (((BYTE *) pg) - offsetof(MsgObject, m_emo));
}
//------------------------------------------------------------------------------
inline DUser::Gadget *
MsgObject::RawCastGadget(MsgObject * pmo)
{
Assert(pmo != NULL);
return reinterpret_cast<DUser::Gadget *> (((BYTE *) pmo) + offsetof(MsgObject, m_emo));
}
//------------------------------------------------------------------------------
inline DUser::Gadget *
MsgObject::CastGadget(HGADGET hgad)
{
return CastGadget(ValidateMsgObject(hgad));
}
//------------------------------------------------------------------------------
inline DUser::Gadget *
MsgObject::CastGadget(MsgObject * pmo)
{
if (pmo == NULL) {
return NULL;
} else {
return RawCastGadget(pmo);
}
}
//------------------------------------------------------------------------------
inline HGADGET
MsgObject::CastHandle(DUser::Gadget * pg)
{
if (pg == NULL) {
return NULL;
} else {
return (HGADGET) RawCastMsgObject(pg)->GetHandle();
}
}
//------------------------------------------------------------------------------
inline HGADGET
MsgObject::CastHandle(MsgObject * pmo)
{
if (pmo == NULL) {
return NULL;
} else {
return (HGADGET) pmo->GetHandle();
}
}
//------------------------------------------------------------------------------
inline MsgObject *
MsgObject::CastMsgObject(DUser::Gadget * pg)
{
if (pg == NULL) {
return NULL;
} else {
return RawCastMsgObject(pg);
}
}
//------------------------------------------------------------------------------
inline MsgObject *
MsgObject::CastMsgObject(HGADGET hgad)
{
return ValidateMsgObject(hgad);
}
//------------------------------------------------------------------------------
inline DUser::Gadget *
MsgObject::GetGadget() const
{
return RawCastGadget(const_cast<MsgObject *>(this));
}
//------------------------------------------------------------------------------
inline HRESULT
MsgObject::PreAllocThis(int cSlots)
{
#if DBG
AssertMsg(m_emo.m_arpThis.GetSize() == 0, "Only can preallocate once");
#endif
BOOL fSuccess = m_emo.m_arpThis.SetSize(cSlots);
#if DBG
if (fSuccess) {
for (int idxSlot = 0 ; idxSlot < cSlots; idxSlot++) {
m_emo.m_arpThis[idxSlot] = ULongToPtr(0xA0E20000 + idxSlot);
}
}
#endif
return fSuccess ? S_OK : E_OUTOFMEMORY;
}
//------------------------------------------------------------------------------
inline void
MsgObject::FillThis(int idxSlotStart, int idxSlotEnd, void * pvThis, const MsgTable * pmtNew)
{
AssertMsg(idxSlotStart <= idxSlotEnd, "Must give valid indicies");
AssertMsg(idxSlotEnd < m_emo.m_arpThis.GetSize(), "Must preallocate this array");
for (int idxSlot = idxSlotStart; idxSlot <= idxSlotEnd; idxSlot++) {
AssertMsg(m_emo.m_arpThis[idxSlot] == ULongToPtr(0xA0E20000 + idxSlot),
"Slot must not be already set");
m_emo.m_arpThis[idxSlot] = pvThis;
}
m_emo.m_pmt = pmtNew;
}
//------------------------------------------------------------------------------
inline HRESULT
MsgObject::Promote(void * pvThis, const MsgTable * pmtNew)
{
int idxAdd = m_emo.m_arpThis.Add(pvThis);
if (idxAdd < 0) {
return E_OUTOFMEMORY;
}
m_emo.m_pmt = pmtNew;
return S_OK;
}
//------------------------------------------------------------------------------
inline void
MsgObject::Demote(int cLevels)
{
int cThis = m_emo.m_arpThis.GetSize();
AssertMsg(cThis >= 1, "Must have been previously promoted");
AssertMsg(cLevels <= cThis, "Can only remove as many levels as available");
Verify(m_emo.m_arpThis.SetSize(cThis - cLevels));
}
//------------------------------------------------------------------------------
inline void *
MsgObject::GetThis(int idxThis) const
{
return m_emo.m_arpThis[idxThis];
}
//------------------------------------------------------------------------------
inline int
MsgObject::GetDepth() const
{
return m_emo.m_arpThis.GetSize();
}
//------------------------------------------------------------------------------
inline int
MsgObject::GetBuildDepth() const
{
return m_emo.m_pmt != NULL ? m_emo.m_pmt->GetDepth() + 1 : 0;
}
//------------------------------------------------------------------------------
inline void
MsgObject::InvokeMethod(
IN MethodMsg * pmsg // Method to invoke
) const
{
GetGadget()->CallStubMethod(pmsg);
}
//------------------------------------------------------------------------------
inline DUser::Gadget *
MsgObject::CastClass(const MsgClass * pmcTest) const
{
if (InstanceOf(pmcTest)) {
return GetGadget();
} else {
return NULL;
}
}
#endif // MSG__MsgObject_inl__INCLUDED