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.
180 lines
7.4 KiB
180 lines
7.4 KiB
/*==LICENSE==* |
|
|
|
CyanWorlds.com Engine - MMOG client, server and tools |
|
Copyright (C) 2011 Cyan Worlds, Inc. |
|
|
|
This program is free software: you can redistribute it and/or modify |
|
it under the terms of the GNU General Public License as published by |
|
the Free Software Foundation, either version 3 of the License, or |
|
(at your option) any later version. |
|
|
|
This program is distributed in the hope that it will be useful, |
|
but WITHOUT ANY WARRANTY; without even the implied warranty of |
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|
GNU General Public License for more details. |
|
|
|
You should have received a copy of the GNU General Public License |
|
along with this program. If not, see <http://www.gnu.org/licenses/>. |
|
|
|
Additional permissions under GNU GPL version 3 section 7 |
|
|
|
If you modify this Program, or any covered work, by linking or |
|
combining it with any of RAD Game Tools Bink SDK, Autodesk 3ds Max SDK, |
|
NVIDIA PhysX SDK, Microsoft DirectX SDK, OpenSSL library, Independent |
|
JPEG Group JPEG library, Microsoft Windows Media SDK, or Apple QuickTime SDK |
|
(or a modified version of those libraries), |
|
containing parts covered by the terms of the Bink SDK EULA, 3ds Max EULA, |
|
PhysX SDK EULA, DirectX SDK EULA, OpenSSL and SSLeay licenses, IJG |
|
JPEG Library README, Windows Media SDK EULA, or QuickTime SDK EULA, the |
|
licensors of this Program grant you additional |
|
permission to convey the resulting work. Corresponding Source for a |
|
non-source form of such a combination shall include the source code for |
|
the parts of OpenSSL and IJG JPEG Library used as well as that of the covered |
|
work. |
|
|
|
You can contact Cyan Worlds, Inc. by email legal@cyan.com |
|
or by snail mail at: |
|
Cyan Worlds, Inc. |
|
14617 N Newport Hwy |
|
Mead, WA 99021 |
|
|
|
*==LICENSE==*/ |
|
#ifndef plKeyImp_inc |
|
#define plKeyImp_inc |
|
|
|
#include "plKey.h" |
|
#include "hsTemplates.h" |
|
#include "plUoid.h" |
|
#include "hsBitVector.h" |
|
#include "plRefFlags.h" |
|
|
|
//------------------------------------ |
|
// plKey is a handle to a keyedObject |
|
//------------------------------------ |
|
class plKeyImp : public plKeyData |
|
{ |
|
private: |
|
static hsKeyedObject* SafeGetObject(const plKeyImp* key); |
|
|
|
public: |
|
plKeyImp(); |
|
plKeyImp(plUoid, uint32_t pos,uint32_t len); |
|
virtual ~plKeyImp(); |
|
|
|
virtual const plUoid& GetUoid() const { return fUoid; } |
|
virtual const plString& GetName() const; |
|
|
|
virtual hsKeyedObject* GetObjectPtr(); |
|
virtual hsKeyedObject* ObjectIsLoaded() const; |
|
virtual hsKeyedObject* VerifyLoaded(); |
|
|
|
// called before writing to disk so that static keys can have faster lookups (int compare instead of string compare) |
|
void SetObjectID(uint32_t id) {fUoid.SetObjectID(id);} |
|
|
|
//---------------------- |
|
// I/O |
|
// ResMgr performs read, so it can search for an existing instance.... |
|
//---------------------- |
|
void Read(hsStream* s); |
|
void Write(hsStream* s); |
|
void WriteObject(hsStream* s); |
|
// For when you need to skip over a key in a stream |
|
static void SkipRead(hsStream* s); |
|
|
|
uint32_t GetStartPos() const { return fStartPos; } // for ResMgr to read the Objects |
|
uint32_t GetDataLen() const { return fDataLen; } // for ResMgr to read the Objects |
|
|
|
//---------------------- |
|
// Allow a keyed object to behave as if it has an active ref when in fact the object |
|
// should only be active ref'ed by a non-keyed parent. Essentially just bumps/decs |
|
// the active ref count to facilitate normal object creation/destruction |
|
//---------------------- |
|
virtual hsKeyedObject* RefObject(plRefFlags::Type flags = plRefFlags::kActiveRef); |
|
virtual void UnRefObject(plRefFlags::Type flags = plRefFlags::kActiveRef); |
|
|
|
//---------------------- |
|
// Release has two behaviors, depending on whether the ref is active or passive: |
|
// Active - Release decs the ActiveRefCnt. When it gets to zero, the object will be deleted. |
|
// Passive - Unregisters my interest in when the object is created or destroyed. |
|
//---------------------- |
|
virtual void Release(plKey targetKey); |
|
|
|
void UnRegister(); |
|
void SetUoid(const plUoid& uoid); |
|
void SetupNotify(plRefMsg* msg, plRefFlags::Type flags); |
|
|
|
// hsKeyedObject use only! |
|
hsKeyedObject* SetObjectPtr(hsKeyedObject* p); |
|
|
|
//////////////////////////////////////////////////////////////////////////// |
|
// ResManager/Registry use only! |
|
// |
|
|
|
//---------------------- |
|
// Clone access |
|
//---------------------- |
|
void AddClone(plKeyImp* c); |
|
void RemoveClone(plKeyImp* c) const; |
|
plKey GetClone(uint32_t playerID, uint32_t cloneID) const; |
|
void CopyForClone(const plKeyImp* p, uint32_t playerID, uint32_t cloneID); // Copy the contents of p for cloning process |
|
|
|
uint32_t GetNumClones(); |
|
plKey GetCloneByIdx(uint32_t idx); |
|
plKey GetCloneOwner() { return fCloneOwner; } |
|
|
|
void NotifyCreated(); |
|
void ISetupNotify(plRefMsg* msg, plRefFlags::Type flags); // Setup notifcations for reference, don't send anything. |
|
|
|
void AddRef(plKeyImp* key) const; |
|
uint16_t GetNumRefs() const { return fRefs.GetCount(); } |
|
plKeyImp* GetRef(int i) const { return fRefs[i]; } |
|
void RemoveRef(plKeyImp *key) const; |
|
|
|
virtual uint16_t GetActiveRefs() const { return fNumActiveRefs; } |
|
virtual uint16_t GetNumNotifyCreated() const { return fNotifyCreated.GetCount(); } |
|
virtual plRefMsg* GetNotifyCreated(int i) const { return fNotifyCreated[i]; } |
|
virtual const hsBitVector& GetActiveBits() const { return fActiveRefs; } |
|
|
|
protected: |
|
void AddNotifyCreated(plRefMsg* msg, plRefFlags::Type flags); |
|
void ClearNotifyCreated(); |
|
uint16_t GetNumNotifyCreated() { return fNotifyCreated.GetCount(); } |
|
plRefMsg* GetNotifyCreated(int i) { return fNotifyCreated[i]; } |
|
void RemoveNotifyCreated(int i); |
|
|
|
uint16_t IncActiveRefs() { return ++fNumActiveRefs; } |
|
uint16_t DecActiveRefs() { return fNumActiveRefs ? --fNumActiveRefs : 0; } |
|
|
|
bool IsActiveRef(int i) const { return fActiveRefs.IsBitSet(i) != 0; } |
|
void SetActiveRef(int i, bool on=true) { fActiveRefs.SetBit(i, on); } |
|
bool IsNotified(int i) const { return fNotified.IsBitSet(i) != 0; } |
|
void SetNotified(int i, bool on=true) { fNotified.SetBit(i, on); } |
|
|
|
void SatisfyPending(plRefMsg* msg) const; |
|
void SatisfyPending() const; |
|
|
|
void INotifySelf(hsKeyedObject* ko); |
|
void INotifyDestroyed(); |
|
void IClearRefs(); |
|
|
|
void IRelease(plKeyImp* keyImp); |
|
|
|
hsKeyedObject* fObjectPtr; |
|
|
|
// These fields are the ones actually saved to disk |
|
plUoid fUoid; |
|
uint32_t fStartPos; // where I live in the Datafile |
|
uint32_t fDataLen; // Length in the Datafile |
|
|
|
// Following used by hsResMgr to notify on defered load or when a passive ref is destroyed. |
|
uint16_t fNumActiveRefs; // num active refs on me |
|
hsBitVector fActiveRefs; // Which of notify created are active refs |
|
hsBitVector fNotified; // which of notifycreated i've already notified. |
|
hsTArray<plRefMsg*> fNotifyCreated; // people to notify when I'm created or destroyed |
|
mutable hsTArray<plKeyImp*> fRefs; // refs I've made (to be released when I'm unregistered). |
|
mutable int16_t fPendingRefs; // Outstanding requests I have out. |
|
mutable hsTArray<plKeyImp*> fClones; // clones of me |
|
mutable plKey fCloneOwner; // pointer for clones back to the owning key |
|
}; |
|
|
|
#endif // hsRegistry_inc
|
|
|