Merge branch 'master' of https://github.com/alliedmodders/sourcemod
This commit is contained in:
commit
65cb76e2f6
@ -32,6 +32,7 @@
|
|||||||
#include <time.h>
|
#include <time.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
|
#include <list>
|
||||||
#include "common_logic.h"
|
#include "common_logic.h"
|
||||||
#include "Logger.h"
|
#include "Logger.h"
|
||||||
|
|
||||||
@ -56,6 +57,7 @@
|
|||||||
#include <bridge/include/CoreProvider.h>
|
#include <bridge/include/CoreProvider.h>
|
||||||
#include <bridge/include/IScriptManager.h>
|
#include <bridge/include/IScriptManager.h>
|
||||||
#include <bridge/include/IExtensionBridge.h>
|
#include <bridge/include/IExtensionBridge.h>
|
||||||
|
#include <sh_vector.h>
|
||||||
|
|
||||||
using namespace SourceMod;
|
using namespace SourceMod;
|
||||||
using namespace SourcePawn;
|
using namespace SourcePawn;
|
||||||
@ -114,6 +116,71 @@ public:
|
|||||||
}
|
}
|
||||||
} g_CoreNativeHelpers;
|
} g_CoreNativeHelpers;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Nearly identical to the standard core plugin iterator
|
||||||
|
* with one key difference. Next doesn't increment the counter
|
||||||
|
* the first time it is ran. This is a hack for the methodmap..
|
||||||
|
*/
|
||||||
|
class CMMPluginIterator
|
||||||
|
: public IPluginIterator,
|
||||||
|
public IPluginsListener
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
CMMPluginIterator(const CVector<SMPlugin *> *list)
|
||||||
|
: m_hasStarted(false)
|
||||||
|
{
|
||||||
|
for(auto iter = list->begin(); iter != list->end(); ++iter) {
|
||||||
|
m_list.push_back(*iter);
|
||||||
|
}
|
||||||
|
scripts->FreePluginList(list);
|
||||||
|
|
||||||
|
m_current = m_list.begin();
|
||||||
|
|
||||||
|
scripts->AddPluginsListener(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
virtual ~CMMPluginIterator()
|
||||||
|
{
|
||||||
|
scripts->RemovePluginsListener(this);
|
||||||
|
}
|
||||||
|
virtual bool MorePlugins() override
|
||||||
|
{
|
||||||
|
return (m_current != m_list.end());
|
||||||
|
}
|
||||||
|
virtual IPlugin *GetPlugin() override
|
||||||
|
{
|
||||||
|
return *m_current;
|
||||||
|
}
|
||||||
|
virtual void NextPlugin() override
|
||||||
|
{
|
||||||
|
if(!m_hasStarted)
|
||||||
|
{
|
||||||
|
m_hasStarted = true;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
m_current++;
|
||||||
|
}
|
||||||
|
virtual void Release() override
|
||||||
|
{
|
||||||
|
delete this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public:
|
||||||
|
virtual void OnPluginDestroyed(IPlugin *plugin) override
|
||||||
|
{
|
||||||
|
if (*m_current == plugin)
|
||||||
|
m_current = m_list.erase(m_current);
|
||||||
|
else
|
||||||
|
m_list.remove(static_cast<SMPlugin *>(plugin));
|
||||||
|
}
|
||||||
|
|
||||||
|
private:
|
||||||
|
std::list<SMPlugin *> m_list;
|
||||||
|
std::list<SMPlugin *>::iterator m_current;
|
||||||
|
bool m_hasStarted;
|
||||||
|
};
|
||||||
|
|
||||||
void LogAction(Handle_t hndl, int type, int client, int target, const char *message)
|
void LogAction(Handle_t hndl, int type, int client, int target, const char *message)
|
||||||
{
|
{
|
||||||
if (g_OnLogAction->GetFunctionCount())
|
if (g_OnLogAction->GetFunctionCount())
|
||||||
@ -146,7 +213,7 @@ void LogAction(Handle_t hndl, int type, int client, int target, const char *mess
|
|||||||
g_Logger.LogMessage("[%s] %s", logtag, message);
|
g_Logger.LogMessage("[%s] %s", logtag, message);
|
||||||
}
|
}
|
||||||
|
|
||||||
static cell_t ThrowError(IPluginContext *pContext, const cell_t *params)
|
static cell_t ThrowError(IPluginContext *pContext, const cell_t *params)
|
||||||
{
|
{
|
||||||
char buffer[512];
|
char buffer[512];
|
||||||
|
|
||||||
@ -264,6 +331,60 @@ static cell_t ReadPlugin(IPluginContext *pContext, const cell_t *params)
|
|||||||
return pPlugin->GetMyHandle();
|
return pPlugin->GetMyHandle();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static cell_t PluginIterator_Create(IPluginContext *pContext, const cell_t *params)
|
||||||
|
{
|
||||||
|
IPluginIterator *iter = new CMMPluginIterator(scripts->ListPlugins());
|
||||||
|
|
||||||
|
Handle_t hndl = handlesys->CreateHandle(g_PlIter, iter, pContext->GetIdentity(), g_pCoreIdent, NULL);
|
||||||
|
|
||||||
|
if (hndl == BAD_HANDLE)
|
||||||
|
{
|
||||||
|
iter->Release();
|
||||||
|
}
|
||||||
|
|
||||||
|
return hndl;
|
||||||
|
}
|
||||||
|
|
||||||
|
static cell_t PluginIterator_Next(IPluginContext *pContext, const cell_t *params)
|
||||||
|
{
|
||||||
|
Handle_t hndl = (Handle_t)params[1];
|
||||||
|
HandleSecurity sec{pContext->GetIdentity(), g_pCoreIdent};
|
||||||
|
HandleError err{};
|
||||||
|
IPluginIterator *pIter = nullptr;
|
||||||
|
|
||||||
|
if ((err=handlesys->ReadHandle(hndl, g_PlIter, &sec, (void **)&pIter)) != HandleError_None)
|
||||||
|
{
|
||||||
|
return pContext->ThrowNativeError("Could not read Handle %x (error %d)", hndl, err);
|
||||||
|
}
|
||||||
|
|
||||||
|
if(!pIter->MorePlugins())
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
pIter->NextPlugin();
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
static cell_t PluginIterator_Plugin_get(IPluginContext *pContext, const cell_t *params)
|
||||||
|
{
|
||||||
|
Handle_t hndl = (Handle_t)params[1];
|
||||||
|
HandleSecurity sec{pContext->GetIdentity(), g_pCoreIdent};
|
||||||
|
HandleError err{};
|
||||||
|
IPluginIterator *pIter = nullptr;
|
||||||
|
|
||||||
|
if ((err=handlesys->ReadHandle(hndl, g_PlIter, &sec, (void **)&pIter)) != HandleError_None)
|
||||||
|
{
|
||||||
|
return pContext->ThrowNativeError("Could not read Handle %x (error %d)", hndl, err);
|
||||||
|
}
|
||||||
|
|
||||||
|
IPlugin *pPlugin = pIter->GetPlugin();
|
||||||
|
if (!pPlugin)
|
||||||
|
{
|
||||||
|
return BAD_HANDLE;
|
||||||
|
}
|
||||||
|
|
||||||
|
return pPlugin->GetMyHandle();
|
||||||
|
}
|
||||||
|
|
||||||
IPlugin *GetPluginFromHandle(IPluginContext *pContext, Handle_t hndl)
|
IPlugin *GetPluginFromHandle(IPluginContext *pContext, Handle_t hndl)
|
||||||
{
|
{
|
||||||
if (hndl == BAD_HANDLE)
|
if (hndl == BAD_HANDLE)
|
||||||
@ -969,7 +1090,7 @@ REGISTER_NATIVES(coreNatives)
|
|||||||
{"FormatTime", FormatTime},
|
{"FormatTime", FormatTime},
|
||||||
{"GetPluginIterator", GetPluginIterator},
|
{"GetPluginIterator", GetPluginIterator},
|
||||||
{"MorePlugins", MorePlugins},
|
{"MorePlugins", MorePlugins},
|
||||||
{"ReadPlugin", ReadPlugin},
|
{"ReadPlugin", ReadPlugin},
|
||||||
{"GetPluginStatus", GetPluginStatus},
|
{"GetPluginStatus", GetPluginStatus},
|
||||||
{"GetPluginFilename", GetPluginFilename},
|
{"GetPluginFilename", GetPluginFilename},
|
||||||
{"IsPluginDebugging", IsPluginDebugging},
|
{"IsPluginDebugging", IsPluginDebugging},
|
||||||
@ -1000,5 +1121,9 @@ REGISTER_NATIVES(coreNatives)
|
|||||||
{"FrameIterator.LineNumber.get", FrameIterator_LineNumber},
|
{"FrameIterator.LineNumber.get", FrameIterator_LineNumber},
|
||||||
{"FrameIterator.GetFunctionName", FrameIterator_GetFunctionName},
|
{"FrameIterator.GetFunctionName", FrameIterator_GetFunctionName},
|
||||||
{"FrameIterator.GetFilePath", FrameIterator_GetFilePath},
|
{"FrameIterator.GetFilePath", FrameIterator_GetFilePath},
|
||||||
|
|
||||||
|
{"PluginIterator.PluginIterator", PluginIterator_Create},
|
||||||
|
{"PluginIterator.Next", PluginIterator_Next},
|
||||||
|
{"PluginIterator.Plugin.get", PluginIterator_Plugin_get},
|
||||||
{NULL, NULL},
|
{NULL, NULL},
|
||||||
};
|
};
|
||||||
|
@ -243,6 +243,28 @@ forward void OnAllPluginsLoaded();
|
|||||||
*/
|
*/
|
||||||
native Handle GetMyHandle();
|
native Handle GetMyHandle();
|
||||||
|
|
||||||
|
methodmap PluginIterator < Handle
|
||||||
|
{
|
||||||
|
// Returns an iterator that can be used to search through plugins.
|
||||||
|
//
|
||||||
|
// @return A new Handle to a PluginIterator.
|
||||||
|
public native PluginIterator();
|
||||||
|
|
||||||
|
// Advances the iterator. Returns whether there are more plugins available in the iterator.
|
||||||
|
//
|
||||||
|
// @return True on more plugins, false otherwise.
|
||||||
|
// @error Invalid Handle.
|
||||||
|
public native bool Next();
|
||||||
|
|
||||||
|
// Returns the current plugin in the iterator.
|
||||||
|
//
|
||||||
|
// @return Current plugin the iterator is at
|
||||||
|
// @error Invalid Handle.
|
||||||
|
property Handle Plugin {
|
||||||
|
public native get();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns an iterator that can be used to search through plugins.
|
* Returns an iterator that can be used to search through plugins.
|
||||||
*
|
*
|
||||||
|
Loading…
Reference in New Issue
Block a user