dvander@560: /** dvander@560: * =============================================================== dvander@560: * SourceMod (C)2004-2007 AlliedModders LLC. All rights reserved. dvander@560: * =============================================================== dvander@560: * dvander@560: * This file is not open source and may not be copied without explicit dvander@560: * written permission of AlliedModders LLC. This file may not be redistributed dvander@560: * in whole or significant part. dvander@560: * For information, see LICENSE.txt or http://www.sourcemod.net/license.php dvander@560: * dvander@560: * Version: $Id$ dvander@560: */ dvander@560: dvander@595: #include dvander@560: #include "sm_globals.h" dvander@560: #include "sourcemod.h" dvander@618: #include "PluginSys.h" dvander@618: #include "HandleSys.h" dvander@618: dvander@618: HandleType_t g_PlIter; dvander@618: dvander@618: dvander@618: class CoreNativeHelpers : dvander@618: public SMGlobalClass, dvander@618: public IHandleTypeDispatch dvander@618: { dvander@618: public: dvander@618: void OnSourceModAllInitialized() dvander@618: { dvander@618: HandleAccess hacc; dvander@618: g_HandleSys.InitAccessDefaults(NULL, &hacc); dvander@618: hacc.access[HandleAccess_Clone] = HANDLE_RESTRICT_IDENTITY|HANDLE_RESTRICT_OWNER; dvander@618: dvander@618: g_PlIter = g_HandleSys.CreateType("PluginIterator", this, 0, NULL, NULL, g_pCoreIdent, NULL); dvander@618: } dvander@618: void OnHandleDestroy(HandleType_t type, void *object) dvander@618: { dvander@618: IPluginIterator *iter = (IPluginIterator *)object; dvander@618: iter->Release(); dvander@618: } dvander@618: void OnSourceModShutdown() dvander@618: { dvander@618: g_HandleSys.RemoveType(g_PlIter, g_pCoreIdent); dvander@618: } dvander@618: } g_CoreNativeHelpers; dvander@618: dvander@560: dvander@560: static cell_t ThrowError(IPluginContext *pContext, const cell_t *params) dvander@560: { dvander@560: char buffer[512]; dvander@560: dvander@560: g_SourceMod.FormatString(buffer, sizeof(buffer), pContext, params, 1); dvander@560: dvander@560: if (pContext->GetContext()->n_err == SP_ERROR_NONE) dvander@560: { dvander@560: pContext->ThrowNativeErrorEx(SP_ERROR_ABORTED, "%s", buffer); dvander@560: } dvander@560: dvander@560: return 0; dvander@560: } dvander@560: dvander@595: static cell_t GetTime(IPluginContext *pContext, const cell_t *params) dvander@595: { dvander@595: time_t t = time(NULL); dvander@595: cell_t *addr; dvander@595: pContext->LocalToPhysAddr(params[1], &addr); dvander@595: dvander@595: *(time_t *)addr = t; dvander@595: dvander@595: return static_cast(t); dvander@595: } dvander@595: dvander@618: static cell_t GetPluginIterator(IPluginContext *pContext, const cell_t *params) dvander@618: { dvander@618: IPluginIterator *iter = g_PluginSys.GetPluginIterator(); dvander@618: dvander@618: Handle_t hndl = g_HandleSys.CreateHandle(g_PlIter, iter, pContext->GetIdentity(), g_pCoreIdent, NULL); dvander@618: dvander@618: if (hndl == BAD_HANDLE) dvander@618: { dvander@618: iter->Release(); dvander@618: } dvander@618: dvander@618: return hndl; dvander@618: } dvander@618: dvander@618: static cell_t MorePlugins(IPluginContext *pContext, const cell_t *params) dvander@618: { dvander@618: Handle_t hndl = (Handle_t)params[1]; dvander@618: HandleError err; dvander@618: IPluginIterator *pIter; dvander@618: dvander@618: HandleSecurity sec; dvander@618: sec.pIdentity = g_pCoreIdent; dvander@618: sec.pOwner = pContext->GetIdentity(); dvander@618: dvander@618: if ((err=g_HandleSys.ReadHandle(hndl, g_PlIter, &sec, (void **)&pIter)) != HandleError_None) dvander@618: { dvander@618: return pContext->ThrowNativeError("Could not read Handle %x (error %d)", hndl, err); dvander@618: } dvander@618: dvander@618: return pIter->MorePlugins() ? 1 : 0; dvander@618: } dvander@618: dvander@618: static cell_t ReadPlugin(IPluginContext *pContext, const cell_t *params) dvander@618: { dvander@618: Handle_t hndl = (Handle_t)params[1]; dvander@618: HandleError err; dvander@618: IPluginIterator *pIter; dvander@618: dvander@618: HandleSecurity sec; dvander@618: sec.pIdentity = g_pCoreIdent; dvander@618: sec.pOwner = pContext->GetIdentity(); dvander@618: dvander@618: if ((err=g_HandleSys.ReadHandle(hndl, g_PlIter, &sec, (void **)&pIter)) != HandleError_None) dvander@618: { dvander@618: return pContext->ThrowNativeError("Could not read Handle %x (error %d)", hndl, err); dvander@618: } dvander@618: dvander@618: CPlugin *pPlugin = (CPlugin *)pIter->GetPlugin(); dvander@618: if (!pPlugin) dvander@618: { dvander@618: return BAD_HANDLE; dvander@618: } dvander@618: dvander@618: pIter->NextPlugin(); dvander@618: dvander@618: return pPlugin->GetMyHandle(); dvander@618: } dvander@618: dvander@618: CPlugin *GetPluginFromHandle(IPluginContext *pContext, Handle_t hndl) dvander@618: { dvander@618: if (hndl == BAD_HANDLE) dvander@618: { dvander@618: return g_PluginSys.GetPluginByCtx(pContext->GetContext()); dvander@618: } else { dvander@618: HandleError err; dvander@618: CPlugin *pPlugin = (CPlugin *)g_PluginSys.PluginFromHandle(hndl, &err); dvander@618: if (!pPlugin) dvander@618: { dvander@618: pContext->ThrowNativeError("Could not read Handle %x (error %d)", hndl, err); dvander@618: } dvander@618: return pPlugin; dvander@618: } dvander@618: } dvander@618: dvander@618: static cell_t GetPluginStatus(IPluginContext *pContext, const cell_t *params) dvander@618: { dvander@618: CPlugin *pPlugin = GetPluginFromHandle(pContext, params[1]); dvander@618: if (!pPlugin) dvander@618: { dvander@618: return 0; dvander@618: } dvander@618: dvander@618: return pPlugin->GetStatus(); dvander@618: } dvander@618: dvander@618: static cell_t GetPluginFilename(IPluginContext *pContext, const cell_t *params) dvander@618: { dvander@618: CPlugin *pPlugin = GetPluginFromHandle(pContext, params[1]); dvander@618: if (!pPlugin) dvander@618: { dvander@618: return 0; dvander@618: } dvander@618: dvander@618: pContext->StringToLocalUTF8(params[2], params[3], pPlugin->GetFilename(), NULL); dvander@618: dvander@618: return 1; dvander@618: } dvander@618: dvander@618: static cell_t IsPluginDebugging(IPluginContext *pContext, const cell_t *params) dvander@618: { dvander@618: CPlugin *pPlugin = GetPluginFromHandle(pContext, params[1]); dvander@618: if (!pPlugin) dvander@618: { dvander@618: return 0; dvander@618: } dvander@618: dvander@618: return pPlugin->IsDebugging() ? 1 : 0; dvander@618: } dvander@618: dvander@618: /* Local to plugins only */ dvander@618: enum PluginInfo dvander@618: { dvander@618: PlInfo_Name, /**< Plugin name */ dvander@618: PlInfo_Author, /**< Plugin author */ dvander@618: PlInfo_Description, /**< Plugin description */ dvander@618: PlInfo_Version, /**< Plugin verison */ dvander@618: PlInfo_URL, /**< Plugin URL */ dvander@618: }; dvander@618: dvander@618: static cell_t GetPluginInfo(IPluginContext *pContext, const cell_t *params) dvander@618: { dvander@618: CPlugin *pPlugin = GetPluginFromHandle(pContext, params[1]); dvander@618: if (!pPlugin) dvander@618: { dvander@618: return 0; dvander@618: } dvander@618: dvander@618: const sm_plugininfo_t *info = pPlugin->GetPublicInfo(); dvander@618: dvander@618: if (!info) dvander@618: { dvander@618: return 0; dvander@618: } dvander@618: dvander@618: const char *str = NULL; dvander@618: dvander@618: switch ((PluginInfo)params[2]) dvander@618: { dvander@618: case PlInfo_Name: dvander@618: { dvander@618: str = info->name; dvander@618: break; dvander@618: } dvander@618: case PlInfo_Author: dvander@618: { dvander@618: str = info->author; dvander@618: break; dvander@618: } dvander@618: case PlInfo_Description: dvander@618: { dvander@618: str = info->description; dvander@618: break; dvander@618: } dvander@618: case PlInfo_Version: dvander@618: { dvander@618: str = info->version; dvander@618: break; dvander@618: } dvander@618: case PlInfo_URL: dvander@618: { dvander@618: str = info->url; dvander@618: break; dvander@618: } dvander@618: } dvander@618: dvander@618: if (!str || str[0] == '\0') dvander@618: { dvander@618: return 0; dvander@618: } dvander@618: dvander@618: pContext->StringToLocalUTF8(params[3], params[4], str, NULL); dvander@618: dvander@618: return 1; dvander@618: } dvander@618: dvander@560: REGISTER_NATIVES(coreNatives) dvander@560: { dvander@618: {"GetPluginFilename", GetPluginFilename}, dvander@618: {"GetPluginInfo", GetPluginInfo}, dvander@618: {"GetPluginIterator", GetPluginIterator}, dvander@618: {"GetPluginStatus", GetPluginStatus}, dvander@595: {"GetTime", GetTime}, dvander@618: {"IsPluginDebugging", IsPluginDebugging}, dvander@618: {"MorePlugins", MorePlugins}, dvander@618: {"ReadPlugin", ReadPlugin}, dvander@560: {"ThrowError", ThrowError}, dvander@560: {NULL, NULL}, dvander@560: };