windows-nt/Source/XPSP1/NT/com/rpc/runtime/mtrt/rpcobj.cxx
2020-09-26 16:20:57 +08:00

386 lines
7.7 KiB
C++
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/*++
Copyright (C) Microsoft Corporation, 1991 - 1999
Module Name:
rpcobj.cxx
Abstract:
The implementation of the object dictionary lives in this file;
it is used to map from an object uuid to a type uuid. From there
we need to map to a manager entry point vector.
Author:
Michael Montague (mikemon) 14-Nov-1991
Revision History:
--*/
#include <precomp.hxx>
#include <rpcobj.hxx>
static RPC_OBJECT_INQ_FN PAPI * ObjectTypeInquiryFn = 0;
class OBJECT_ENTRY
/*++
Class Description:
Each of the entries in the object dictionary consist of one of these
objects.
Fields:
ObjectUuid - Contains the object uuid of this entry.
TypeUuid - Contains the type uuid of the object uuid in this entry.
DictionaryKey - Contains the key in the dictionary for this object
entry. I made this a public instance variable for two reasons:
(1) I was just going to defined a writer and a reader for
it (routines to set and get the value).
(2) This class is private to a source file, so it is very
obvious the scope of usage.
--*/
{
private:
RPC_UUID ObjectUuid;
RPC_UUID TypeUuid;
public:
unsigned int DictionaryKey;
OBJECT_ENTRY (
IN RPC_UUID PAPI * ObjectUuid,
IN RPC_UUID PAPI * TypeUuid
);
int
MatchObjectUuid (
IN RPC_UUID PAPI * ObjectUuid
);
void
CopyToTypeUuid (
OUT RPC_UUID PAPI * TypeUuid
);
};
OBJECT_ENTRY::OBJECT_ENTRY (
IN RPC_UUID PAPI * ObjectUuid,
IN RPC_UUID PAPI * TypeUuid
)
/*++
Routine Description:
This routine is used to construct an entry in the object dictionary.
Arguments:
ObjectUuid - Supplies the uuid to use to initialize the object uuid
in this entry.
TypeUuid - Supplies the uuid to use to initialize the type uuid in
this entry.
--*/
{
ALLOCATE_THIS(OBJECT_ENTRY);
this->ObjectUuid.CopyUuid(ObjectUuid);
this->TypeUuid.CopyUuid(TypeUuid);
}
inline int
OBJECT_ENTRY::MatchObjectUuid (
IN RPC_UUID PAPI * ObjectUuid
)
/*++
Routine Description:
This method compares the supplied object uuid against the object
uuid contained in this object entry.
Arguments:
ObjectUuid - Supplies the object uuid.
Return Value:
Zero will be returned if the supplied object uuid is the same as the
object uuid contained in this.
--*/
{
return(this->ObjectUuid.MatchUuid(ObjectUuid));
}
inline void
OBJECT_ENTRY::CopyToTypeUuid (
OUT RPC_UUID PAPI * TypeUuid
)
/*++
Routine Description:
We copy the type uuid for this object entry into the supplied type
uuid.
Arguments:
TypeUuid - Returns a copy of the type uuid in this object entry.
--*/
{
TypeUuid->CopyUuid(&(this->TypeUuid));
}
NEW_SDICT(OBJECT_ENTRY);
OBJECT_ENTRY_DICT * ObjectDictionary;
OBJECT_ENTRY *
FindObject (
IN RPC_UUID PAPI * ObjectUuid
)
/*++
Routine Description:
This routine is used to find the object entry in the object dictionary
having the specified object uuid.
Arguments:
ObjectUuid - Supplies the object uuid which we wish to find.
Return Value:
The object entry having the supplied object uuid will be returned if
it can be found, otherwise, zero will be returned.
--*/
{
OBJECT_ENTRY * ObjectEntry;
DictionaryCursor cursor;
ObjectDictionary->Reset(cursor);
while ((ObjectEntry = ObjectDictionary->Next(cursor)) != 0)
{
if (ObjectEntry->MatchObjectUuid(ObjectUuid) == 0)
return(ObjectEntry);
}
return(0);
}
RPC_STATUS
ObjectInqType (
IN RPC_UUID PAPI * ObjUuid,
OUT RPC_UUID PAPI * TypeUuid
)
/*++
Routine Description:
We search in the dictionary for the specified object UUID; if it
is found, we return its type UUID.
Parameters:
ObjUuid - Supplies the object UUID for which we are trying to
find the type UUID.
TypeUuid - Returns the type UUID of the object UUID, presuming
that the object UUID is found.
Return Value:
RPC_S_OK - The operation completed successfully; the object uuid
is registered with the runtime or the object inquiry function
knows the object uuid.
RPC_S_OBJECT_NOT_FOUND - The specified object uuid has not been
registered with the runtime and the object inquiry function
does not know about the object uuid.
--*/
{
RPC_STATUS Status;
OBJECT_ENTRY * ObjectEntry;
if ( ObjUuid == NULL
|| ObjUuid->IsNullUuid())
{
TypeUuid->SetToNullUuid();
return(RPC_S_OK);
}
RequestGlobalMutex();
ObjectEntry = FindObject(ObjUuid);
if (ObjectEntry == 0)
{
if (ObjectTypeInquiryFn == 0)
{
ClearGlobalMutex();
TypeUuid->SetToNullUuid();
return(RPC_S_OBJECT_NOT_FOUND);
}
ClearGlobalMutex();
(*ObjectTypeInquiryFn)((UUID PAPI *) ObjUuid, (UUID PAPI *) TypeUuid,
&Status);
return(Status);
}
ObjectEntry->CopyToTypeUuid(TypeUuid);
ClearGlobalMutex();
return(RPC_S_OK);
}
RPC_STATUS
ObjectSetInqFn (
IN RPC_OBJECT_INQ_FN PAPI * InquiryFn
)
/*++
Routine Description:
With just two lines of code, the comment for this routine is
already longer than the routine.
Arguments:
InquiryFn - Supplies a function to be used when the type of an
unknown object is inquired.
Return Value:
RPC_S_OK - This is always returned by the second line of code.
--*/
{
ObjectTypeInquiryFn = InquiryFn;
return(RPC_S_OK);
}
RPC_STATUS
ObjectSetType (
IN RPC_UUID PAPI * ObjUuid,
IN RPC_UUID PAPI * TypeUuid OPTIONAL
)
/*++
Routine Description:
This routine is used to associate a type UUID with an object UUID.
Arguments:
ObjUuid - Supplies the object UUID.
TypeUuid - Supplies the type UUID to associate with the object
UUID.
Return Value:
RPC_S_OK - The type UUID was successfully associated with the
object UUID.
RPC_S_ALREADY_REGISTERED - The object uuid specified has already
been registered with the runtime.
RPC_S_OUT_OF_MEMORY - There is insufficient memory available to
associate the object UUID with the type UUID.
RPC_S_INVALID_OBJECT - The object uuid specified is the nil uuid.
--*/
{
OBJECT_ENTRY * ObjectEntry;
if ( ObjUuid->IsNullUuid() != 0 )
{
return(RPC_S_INVALID_OBJECT);
}
RequestGlobalMutex();
ObjectEntry = FindObject(ObjUuid);
if ( (ARGUMENT_PRESENT(TypeUuid) == 0)
|| (TypeUuid->IsNullUuid() != 0))
{
if (ObjectEntry != 0)
{
ObjectDictionary->Delete(ObjectEntry->DictionaryKey);
ClearGlobalMutex();
return(RPC_S_OK);
}
ClearGlobalMutex();
return(RPC_S_OK);
}
if (ObjectEntry != 0)
{
ClearGlobalMutex();
return(RPC_S_ALREADY_REGISTERED);
}
ObjectEntry = new OBJECT_ENTRY(ObjUuid,TypeUuid);
if (ObjectEntry == 0)
{
ClearGlobalMutex();
return(RPC_S_OUT_OF_MEMORY);
}
ObjectEntry->DictionaryKey = ObjectDictionary->Insert(ObjectEntry);
if (ObjectEntry->DictionaryKey == -1)
{
ClearGlobalMutex();
delete ObjectEntry;
return(RPC_S_OUT_OF_MEMORY);
}
ClearGlobalMutex();
return(RPC_S_OK);
}
int
InitializeObjectDictionary (
)
/*++
Routine Description:
At DLL initialization time, this routine will get called.
Return Value:
Zero will be returned if initialization completes successfully;
otherwise, non-zero will be returned.
--*/
{
ObjectDictionary = new OBJECT_ENTRY_DICT;
if (ObjectDictionary == 0)
return(1);
return(0);
}