2 * vim: set ts=4 sw=4 tw=99 noet :
3 * =============================================================================
5 * Copyright (C) 2004-2008 AlliedModders LLC. All rights reserved.
6 * =============================================================================
8 * This program is free software; you can redistribute it and/or modify it under
9 * the terms of the GNU General Public License, version 3.0, as published by the
10 * Free Software Foundation.
12 * This program is distributed in the hope that it will be useful, but WITHOUT
13 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
14 * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
17 * You should have received a copy of the GNU General Public License along with
18 * this program. If not, see <http://www.gnu.org/licenses/>.
20 * As a special exception, AlliedModders LLC gives you permission to link the
21 * code of this program (as well as its derivative works) to "Half-Life 2," the
22 * "Source Engine," the "SourcePawn JIT," and any Game MODs that run on software
23 * by the Valve Corporation. You must obey the GNU General Public License in
24 * all respects for all other code used. Additionally, AlliedModders LLC grants
25 * this exception to all derivative works. AlliedModders LLC defines further
26 * exceptions, found in LICENSE.txt (as of this writing, version JULY-31-2007),
27 * or <http://www.sourcemod.net/license.php>.
32 #ifndef _INCLUDE_SOURCEMOD_SHARESYSTEM_H_
33 #define _INCLUDE_SOURCEMOD_SHARESYSTEM_H_
35 #include <IShareSys.h>
36 #include <IHandleSys.h>
37 #include <am-string.h>
38 #include <am-utility.h>
39 #include <am-refcounting.h>
41 #include <sm_stringhashmap.h>
42 #include <sm_namehashset.h>
43 #include "common_logic.h"
46 using namespace SourceHook;
50 struct IdentityToken_t
60 bool operator ==(const IfaceInfo &info)
62 return (info.iface == iface && info.owner == owner);
74 IFeatureProvider *provider;
80 public IHandleTypeDispatch
82 friend class CNativeOwner;
86 bool AddInterface(IExtension *myself, SMInterface *pIface);
87 bool RequestInterface(const char *iface_name,
88 unsigned int iface_vers,
90 SMInterface **pIface);
91 void AddNatives(IExtension *myself, const sp_nativeinfo_t *natives);
92 IdentityType_t CreateIdentType(const char *name);
93 IdentityType_t FindIdentType(const char *name);
94 IdentityToken_t *CreateIdentity(IdentityType_t type, void *ptr);
95 void DestroyIdentType(IdentityType_t type);
96 void DestroyIdentity(IdentityToken_t *identity);
97 void AddDependency(IExtension *myself, const char *filename, bool require, bool autoload);
98 void RegisterLibrary(IExtension *myself, const char *name);
99 void OverrideNatives(IExtension *myself, const sp_nativeinfo_t *natives);
100 void AddCapabilityProvider(IExtension *myself, IFeatureProvider *provider,
102 void DropCapabilityProvider(IExtension *myself, IFeatureProvider *provider,
104 public: //SMGlobalClass
105 /* Pre-empt in case anything tries to register idents early */
107 void OnSourceModShutdown();
108 public: //IHandleTypeDispatch
109 void OnHandleDestroy(HandleType_t type, void *object);
111 IdentityToken_t *CreateCoreIdentity();
112 void RemoveInterfaces(IExtension *pExtension);
113 FeatureStatus TestFeature(IPluginRuntime *pRuntime, FeatureType feature, const char *name);
114 FeatureStatus TestNative(IPluginRuntime *pRuntime, const char *name);
115 FeatureStatus TestCap(const char *name);
117 inline IdentityToken_t *GetIdentRoot()
122 void BindNativesToPlugin(CPlugin *pPlugin, bool bCoreOnly);
123 void BindNativeToPlugin(CPlugin *pPlugin, const ke::Ref<Native> &pEntry);
124 ke::PassRef<Native> AddFakeNative(IPluginFunction *pFunc, const char *name, SPVM_FAKENATIVE_FUNC func);
125 ke::PassRef<Native> FindNative(const char *name);
127 ke::PassRef<Native> AddNativeToCache(CNativeOwner *pOwner, const sp_nativeinfo_t *ntv);
128 void ClearNativeFromCache(CNativeOwner *pOwner, const char *name);
129 void BindNativeToPlugin(CPlugin *pPlugin, sp_native_t *ntv, uint32_t index, const ke::Ref<Native> &pEntry);
131 typedef NameHashSet<ke::Ref<Native>, Native> NativeCache;
133 List<IfaceInfo> m_Interfaces;
134 HandleType_t m_TypeRoot;
135 IdentityToken_t m_IdentRoot;
136 HandleType_t m_IfaceType;
137 IdentityType_t m_CoreType;
138 NativeCache m_NtvCache;
139 StringHashMap<Capability> m_caps;
142 extern ShareSystem g_ShareSys;
144 #endif //_INCLUDE_SOURCEMOD_SHARESYSTEM_H_