144 lines
3.4 KiB
C++
144 lines
3.4 KiB
C++
/*++
|
|
|
|
Copyright (c) 1995 Microsoft Corporation
|
|
|
|
Module Name:
|
|
|
|
COxid.hxx
|
|
|
|
Abstract:
|
|
|
|
CClientOxid objects represent OXIDs which are in use by one or more clients
|
|
on this machine. These are referenced by
|
|
is pinging the server of the OXID. These objects maybe kept around
|
|
after the last client reference to improve performance.
|
|
|
|
Author:
|
|
|
|
Mario Goertzel [MarioGo]
|
|
|
|
Revision History:
|
|
|
|
MarioGo 02-16-95 Bits 'n pieces
|
|
MarioGo 04-04-95 Split client and server.
|
|
MarioGo 01-06-96 Locally unique IDs
|
|
|
|
--*/
|
|
|
|
#ifndef __COXID_HXX
|
|
#define __COXID_HXX
|
|
|
|
class CClientOxid : public CId2TableElement
|
|
/*++
|
|
|
|
Class Description:
|
|
|
|
Represtents an OXID on some machine.
|
|
|
|
Members:
|
|
|
|
_plist - Embedded CPList element used to store CClientOxids
|
|
in gpOxidPList.
|
|
|
|
_oxidInfo - Static information about this OXID and its
|
|
string + security bindings.
|
|
|
|
_pMid - Pointer to the machine ID for this OXID, we
|
|
own a reference.
|
|
|
|
_fLocal - non-Zero if this OXID is on this machine. Need only 1 bit.
|
|
|
|
_fApartment - non-Zero if this process is prefers apartment model.
|
|
Meaning less for non-local OXIDs. Need only 1 bit.
|
|
|
|
--*/
|
|
{
|
|
private:
|
|
CPListElement _plist;
|
|
OXID_INFO _oxidInfo;
|
|
CMid *_pMid;
|
|
USHORT _wProtseq; // 0 means local
|
|
USHORT _iStringBinding; // ~0 means unknown
|
|
BOOL _fApartment:8;
|
|
WCHAR * _pMachineName;
|
|
|
|
public:
|
|
|
|
CClientOxid(OXID &oxid,
|
|
CMid *pMid,
|
|
USHORT wProtseq,
|
|
WCHAR *pMachineName,
|
|
BOOL fApartment) :
|
|
CId2TableElement(oxid, pMid->Id()),
|
|
_pMid(pMid), // We get a refernce.
|
|
_wProtseq(wProtseq),
|
|
_pMachineName(NULL),
|
|
_iStringBinding(0xFFFF),
|
|
_fApartment(fApartment)
|
|
{
|
|
WCHAR * pSB = pMid->GetStringBinding();
|
|
|
|
if (pMachineName)
|
|
{
|
|
// use the ones passed in
|
|
_pMachineName = new WCHAR[lstrlenW(pMachineName) + 1];
|
|
if (_pMachineName)
|
|
lstrcpyW(_pMachineName, pMachineName);
|
|
}
|
|
else if (pSB)
|
|
{
|
|
// use protseq and machine name from the mid
|
|
_wProtseq = *pSB;
|
|
_pMachineName = ExtractMachineName(pSB);
|
|
}
|
|
_oxidInfo.psa = 0;
|
|
ASSERT(wProtseq != 0 || pMid->IsLocal());
|
|
// ASSERT(wProtseq == 0 || pMachineName != NULL);
|
|
}
|
|
|
|
~CClientOxid()
|
|
{
|
|
if (_pMachineName) delete [] _pMachineName;
|
|
ASSERT(gpClientLock->HeldExclusive());
|
|
gpClientOxidTable->Remove(this);
|
|
delete _oxidInfo.psa;
|
|
_pMid->Release();
|
|
}
|
|
|
|
ORSTATUS GetInfo(BOOL fApartment,
|
|
OXID_INFO *);
|
|
|
|
ORSTATUS UpdateInfo(OXID_INFO *);
|
|
|
|
CMid *GetMid() {
|
|
return(_pMid);
|
|
}
|
|
|
|
void Reference();
|
|
|
|
DWORD Release();
|
|
|
|
static CClientOxid *ContainingRecord(CListElement *ple) {
|
|
return CONTAINING_RECORD(ple, CClientOxid, _plist);
|
|
}
|
|
|
|
void Insert() {
|
|
gpClientOxidPList->Insert(&_plist);
|
|
}
|
|
|
|
CPListElement *Remove() {
|
|
return(gpClientOxidPList->Remove(&_plist));
|
|
}
|
|
|
|
void Reset() {
|
|
gpClientOxidPList->Reset(&_plist);
|
|
}
|
|
|
|
BOOL IsLocal() {
|
|
return(_wProtseq == 0);
|
|
}
|
|
};
|
|
|
|
#endif // __COXID_HXX
|
|
|