160 lines
3.8 KiB
C++
160 lines
3.8 KiB
C++
/*++
|
|
|
|
Copyright (c) 1995 Microsoft Corporation
|
|
|
|
Module Name:
|
|
|
|
csets.hxx
|
|
|
|
Abstract:
|
|
|
|
CClientSet objects represent sets of OIDs which are referenced by
|
|
one or more local client processes.
|
|
|
|
Author:
|
|
|
|
Mario Goertzel [MarioGo]
|
|
|
|
Revision History:
|
|
|
|
MarioGo 04-08-95 Bits 'n pieces
|
|
MarioGo 12-28-95 Locally unique ids
|
|
|
|
--*/
|
|
|
|
#ifndef __CSET_HXX
|
|
#define __CSET_HXX
|
|
|
|
class CClientSet : public CId2TableElement
|
|
/*++
|
|
|
|
Class Description:
|
|
|
|
Represents a set of OIDs in use by a local user on a remote
|
|
(or local) machine. Instances are indexed by machine ID
|
|
and the a pointer to the users CToken objec.
|
|
|
|
Memebers:
|
|
|
|
_setid - A uuid allocated by the server during the first
|
|
update ping. Uniqueness is not required by the client.
|
|
|
|
_lastping - Time of last successful ping.
|
|
|
|
_sequence - The sequence number of the last successful ping.
|
|
|
|
// _factor - Power of two multiplier for ping period. Not implemented.
|
|
|
|
_fChange - The set of OIDs has changed since the last update ping.
|
|
|
|
_hServer - current saved binding handle to the server.
|
|
|
|
_pMid - Pointer to the CMid instance for this user. We own a reference.
|
|
|
|
_blistOids - A CBList instance containing pointers to all the OIDs
|
|
owned by this set. The set holds a reference on each.
|
|
|
|
_plist - CPListElement instance used by the worker thread to maintain
|
|
sets in time sorted order.
|
|
|
|
_pAuthIdentity - saved copy of the auth identity struct passed to
|
|
RpcBindingSetAuthInfoEx; we cannot free this until the binding
|
|
is freed since RPC holds a pointer to it.
|
|
--*/
|
|
{
|
|
private:
|
|
|
|
SETID _setid;
|
|
CTime _lastping;
|
|
CMid *_pMid;
|
|
RPC_BINDING_HANDLE _hServer;
|
|
USHORT _iBinding;
|
|
USHORT _sequence;
|
|
USHORT _cFailedPings;
|
|
USHORT _fChange:1;
|
|
USHORT _fSecure:1;
|
|
CBList _blistOids;
|
|
CPListElement _plist;
|
|
COAUTHIDENTITY *_pAuthIdentity;
|
|
|
|
public:
|
|
|
|
CClientSet(
|
|
IN CMid *pMid,
|
|
IN CToken *pToken
|
|
) :
|
|
CId2TableElement(pMid->Id(), (ID)pToken),
|
|
_blistOids(16),
|
|
_sequence(0),
|
|
_cFailedPings(0),
|
|
_setid(0),
|
|
_hServer(0),
|
|
_fChange(TRUE),
|
|
_fSecure(TRUE),
|
|
_pAuthIdentity(0)
|
|
{
|
|
// Client lock held shared.
|
|
pToken->AddRef();
|
|
_pMid = pMid;
|
|
_pMid->Reference();
|
|
}
|
|
|
|
CClientSet::~CClientSet()
|
|
{
|
|
ASSERT(gpClientLock->HeldExclusive());
|
|
ASSERT(_blistOids.Size() == 0);
|
|
|
|
// REVIEW: make sure the linker throws out all copies of this except
|
|
// the inline versions. Otherwise, make this out-of-line and rethink
|
|
// other inline d'tors.
|
|
|
|
_pMid->Release();
|
|
|
|
CToken *pToken = (CToken *)Id2();
|
|
|
|
pToken->Release();
|
|
|
|
gpClientSetTable->Remove(this);
|
|
|
|
// Possible to get here w/o freeing the binding?
|
|
if (_hServer)
|
|
RpcBindingFree(&_hServer);
|
|
|
|
if (_pAuthIdentity)
|
|
delete _pAuthIdentity;
|
|
}
|
|
|
|
ORSTATUS RegisterObject(CClientOid *);
|
|
|
|
void ObjectUpdate(CClientOid *pOid)
|
|
{
|
|
ASSERT(gpClientLock->HeldExclusive());
|
|
|
|
_fChange = TRUE;
|
|
}
|
|
|
|
ORSTATUS PingServer();
|
|
|
|
void NextPing(CTime &ctimePing)
|
|
{
|
|
ctimePing = _lastping;
|
|
ctimePing += BasePingInterval;
|
|
}
|
|
|
|
static CClientSet *ContainingRecord(CListElement *ple) {
|
|
return CONTAINING_RECORD(ple, CClientSet, _plist);
|
|
}
|
|
|
|
void Insert() {
|
|
gpClientSetPList->Insert(&_plist);
|
|
}
|
|
|
|
CPListElement * Remove() {
|
|
return(gpClientSetPList->Remove(&_plist));
|
|
}
|
|
|
|
};
|
|
|
|
#endif // __CSET_HXX
|
|
|