//====== Copyright ©, Valve Corporation, All rights reserved. ======= // // Purpose: Base class for objects that are kept in synch between client and server // //============================================================================= #ifndef SHAREDOBJECT_H #define SHAREDOBJECT_H #ifdef _WIN32 #pragma once #endif #include "utlsortvector.h" #include "tier0/memdbgon.h" namespace GCSDK { class CSQLAccess; class CSharedObject; typedef CSharedObject *(*SOCreationFunc_t)( ); class CSharedObjectCache; //---------------------------------------------------------------------------- // Purpose: Abstract base class for objects that are shared between the GC and // a gameserver/client. These can also be stored in the database. //---------------------------------------------------------------------------- class CSharedObject { friend class CGCSharedObjectCache; friend class CSharedObjectCache; public: virtual ~CSharedObject() {} virtual int GetTypeID() const = 0; virtual bool BParseFromMessage( const CUtlBuffer & buffer ) = 0; virtual bool BParseFromMessage( const std::string &buffer ) = 0; virtual bool BUpdateFromNetwork( const CSharedObject & objUpdate ) = 0; virtual bool BIsKeyLess( const CSharedObject & soRHS ) const = 0; virtual void Copy( const CSharedObject & soRHS ) = 0; virtual void Dump() const = 0; virtual bool BAddToMessage( std::string *pBuffer ) const = 0; virtual bool BAddDestroyToMessage( std::string *pBuffer ) const = 0; bool BIsKeyEqual( const CSharedObject & soRHS ) const; static void RegisterFactory( int nTypeID, SOCreationFunc_t fnFactory, uint32 unFlags, const char *pchClassName, const char* pszBuildCacheName, const char* pszCreateName, const char* pszUpdateName ); static CSharedObject *Create( int nTypeID ); static uint32 GetTypeFlags( int nTypeID ); static const char *PchClassName( int nTypeID ); static const char *PchClassBuildCacheNodeName( int nTypeID ); static const char *PchClassCreateNodeName( int nTypeID ); static const char *PchClassUpdateNodeName( int nTypeID ); #ifdef GC virtual bool BIsNetworked() const { return true; } virtual bool BIsDatabaseBacked() const { return true; } virtual bool BYieldingAddToDatabase(); virtual bool BYieldingWriteToDatabase( const CUtlVector< int > &fields ); virtual bool BYieldingRemoveFromDatabase(); virtual bool BYieldingAddInsertToTransaction( CSQLAccess & sqlAccess ) { return false; } virtual bool BYieldingAddWriteToTransaction( CSQLAccess & sqlAccess, const CUtlVector< int > &fields ) { return false; } virtual bool BYieldingAddRemoveToTransaction( CSQLAccess & sqlAccess ) { return false; } virtual bool BParseFromMemcached( CUtlBuffer & buffer ) { return false; } virtual bool BAddToMemcached( CUtlBuffer & bufOutput ) const { return false; } bool BSendCreateToSteamIDs( const CUtlVector & vecRecipients, const SOID_t ownerID, uint64 ulVersion ) const; bool BSendDestroyToSteamIDs( const CUtlVector & vecRecipients, const SOID_t ownerID, uint64 ulVersion ) const; protected: /* // Dirty bit modification. Do not call these directly on SharedObjects. Call them // on the cache that owns the object so they can be added/removed from the right lists. virtual void DirtyField( int nField ) = 0; virtual void MakeDatabaseClean() = 0; virtual void MakeNetworkClean() = 0; */ #endif // GC private: struct SharedObjectInfo_t { int m_nID; uint32 m_unFlags; SOCreationFunc_t m_pFactoryFunction; const char *m_pchClassName; const char *m_pchBuildCacheSubNodeName; const char *m_pchUpdateNodeName; const char *m_pchCreateNodeName; }; //compare class that supports sorting shared objects themselves, as well as searching based upon an integer key value class CCompareSharedObject { public: bool Less( const SharedObjectInfo_t& lhs, const SharedObjectInfo_t& rhs, void* ) const { return lhs.m_nID < rhs.m_nID; } bool Less( int lhs, const SharedObjectInfo_t& rhs, void* ) const { return lhs < rhs.m_nID; } bool Less( const SharedObjectInfo_t& lhs, int rhs, void* ) const { return lhs.m_nID < rhs; } }; typedef CUtlSortVector< SharedObjectInfo_t, CCompareSharedObject > TVecFactories; static TVecFactories sm_vecFactories; static const SharedObjectInfo_t* FindSharedObjectInfo( int nTypeID ); public: static TVecFactories & GetFactories() { return sm_vecFactories; } }; typedef CUtlVectorFixedGrowable CSharedObjectVec; //---------------------------------------------------------------------------- // Purpose: Templatized function to use as a factory method for // CSharedObject subclasses //---------------------------------------------------------------------------- template CSharedObject *CreateSharedObjectSubclass() { return new SharedObjectSubclass_t(); } //internal utility to expand the provided shared object class name into all the names needed for the node #define REG_SHARED_OBJECT_NAMES_INTERNAL( name ) #name, "BuildCacheSubscribed(" #name ")", "Create(" #name ")", "Update(" #name ")" #ifdef GC #define REG_SHARED_OBJECT_SUBCLASS( derivedClass, flags ) GCSDK::CSharedObject::RegisterFactory( derivedClass::k_nTypeID, GCSDK::CreateSharedObjectSubclass, (flags), REG_SHARED_OBJECT_NAMES_INTERNAL( derivedClass ) ) #else #define REG_SHARED_OBJECT_SUBCLASS( derivedClass ) GCSDK::CSharedObject::RegisterFactory( derivedClass::k_nTypeID, GCSDK::CreateSharedObjectSubclass, 0, REG_SHARED_OBJECT_NAMES_INTERNAL( derivedClass ) ) #endif } // namespace GCSDK #include "tier0/memdbgoff.h" #endif //SHAREDOBJECT_H