Files
2020-08-19 20:37:30 +02:00

197 lines
4.8 KiB
SourcePawn

/* PluginPack Helpers */
static DataPackPos PluginPack_Plugin;
static DataPackPos PluginPack_Files;
static DataPackPos PluginPack_Status;
static DataPackPos PluginPack_URL;
int GetMaxPlugins()
{
return GetArraySize(g_hPluginPacks);
}
bool IsValidPlugin(Handle plugin)
{
/* Check if the plugin handle is pointing to a valid plugin. */
Handle hIterator = GetPluginIterator();
bool bIsValid = false;
while (MorePlugins(hIterator))
{
if (plugin == ReadPlugin(hIterator))
{
bIsValid = true;
break;
}
}
CloseHandle(hIterator);
return bIsValid;
}
int PluginToIndex(Handle plugin)
{
Handle hPluginPack = INVALID_HANDLE;
int maxPlugins = GetMaxPlugins();
for (int i = 0; i < maxPlugins; i++)
{
hPluginPack = GetArrayCell(g_hPluginPacks, i);
SetPackPosition(hPluginPack, PluginPack_Plugin);
if (plugin == view_as<Handle>(ReadPackCell(hPluginPack)))
{
return i;
}
}
return -1;
}
Handle IndexToPlugin(int index)
{
Handle hPluginPack = GetArrayCell(g_hPluginPacks, index);
SetPackPosition(hPluginPack, PluginPack_Plugin);
return view_as<Handle>(ReadPackCell(hPluginPack));
}
void Updater_AddPlugin(Handle plugin, const char[] url)
{
int index = PluginToIndex(plugin);
if (index != -1)
{
// Remove plugin from removal queue.
int maxPlugins = GetArraySize(g_hRemoveQueue);
for (int i = 0; i < maxPlugins; i++)
{
if (plugin == GetArrayCell(g_hRemoveQueue, i))
{
RemoveFromArray(g_hRemoveQueue, i);
break;
}
}
// Update the url.
Updater_SetURL(index, url);
}
else
{
Handle hPluginPack = CreateDataPack();
Handle hFiles = CreateArray(PLATFORM_MAX_PATH);
PluginPack_Plugin = GetPackPosition(hPluginPack);
WritePackCell(hPluginPack, view_as<int>(plugin));
PluginPack_Files = GetPackPosition(hPluginPack);
WritePackCell(hPluginPack, view_as<int>(hFiles));
PluginPack_Status = GetPackPosition(hPluginPack);
WritePackCell(hPluginPack, view_as<int>(Status_Idle));
PluginPack_URL = GetPackPosition(hPluginPack);
WritePackString(hPluginPack, url);
PushArrayCell(g_hPluginPacks, hPluginPack);
}
}
void Updater_QueueRemovePlugin(Handle plugin)
{
/* Flag a plugin for removal. */
int maxPlugins = GetArraySize(g_hRemoveQueue);
for (int i = 0; i < maxPlugins; i++)
{
// Make sure it wasn't previously flagged.
if (plugin == GetArrayCell(g_hRemoveQueue, i))
{
return;
}
}
PushArrayCell(g_hRemoveQueue, plugin);
Updater_FreeMemory();
}
void Updater_RemovePlugin(int index)
{
/* Warning: Removing a plugin will shift indexes. */
CloseHandle(Updater_GetFiles(index)); // hFiles
CloseHandle(GetArrayCell(g_hPluginPacks, index)); // hPluginPack
RemoveFromArray(g_hPluginPacks, index);
}
Handle Updater_GetFiles(int index)
{
Handle hPluginPack = GetArrayCell(g_hPluginPacks, index);
SetPackPosition(hPluginPack, PluginPack_Files);
return view_as<Handle>(ReadPackCell(hPluginPack));
}
UpdateStatus Updater_GetStatus(int index)
{
Handle hPluginPack = GetArrayCell(g_hPluginPacks, index);
SetPackPosition(hPluginPack, PluginPack_Status);
return view_as<UpdateStatus>(ReadPackCell(hPluginPack));
}
void Updater_SetStatus(int index, UpdateStatus status)
{
Handle hPluginPack = GetArrayCell(g_hPluginPacks, index);
SetPackPosition(hPluginPack, PluginPack_Status);
WritePackCell(hPluginPack, view_as<int>(status));
}
void Updater_GetURL(int index, char[] buffer, int size)
{
Handle hPluginPack = GetArrayCell(g_hPluginPacks, index);
SetPackPosition(hPluginPack, PluginPack_URL);
ReadPackString(hPluginPack, buffer, size);
}
void Updater_SetURL(int index, const char[] url)
{
Handle hPluginPack = GetArrayCell(g_hPluginPacks, index);
SetPackPosition(hPluginPack, PluginPack_URL);
WritePackString(hPluginPack, url);
}
/* Stocks */
stock void ReloadPlugin(Handle plugin=INVALID_HANDLE)
{
char filename[64];
GetPluginFilename(plugin, filename, sizeof(filename));
ServerCommand("sm plugins reload %s", filename);
}
stock void UnloadPlugin(Handle plugin=INVALID_HANDLE)
{
char filename[64];
GetPluginFilename(plugin, filename, sizeof(filename));
ServerCommand("sm plugins unload %s", filename);
}
stock void DisablePlugin(Handle plugin=INVALID_HANDLE)
{
char filename[64];
char path_disabled[PLATFORM_MAX_PATH];
char path_plugin[PLATFORM_MAX_PATH];
GetPluginFilename(plugin, filename, sizeof(filename));
BuildPath(Path_SM, path_disabled, sizeof(path_disabled), "plugins/disabled/%s", filename);
BuildPath(Path_SM, path_plugin, sizeof(path_plugin), "plugins/%s", filename);
if (FileExists(path_disabled))
{
DeleteFile(path_disabled);
}
if (!RenameFile(path_disabled, path_plugin))
{
DeleteFile(path_plugin);
}
ServerCommand("sm plugins unload %s", filename);
}