core/systems/PluginSys.cpp
author David Anderson <dvander@alliedmods.net>
Fri Nov 10 18:08:13 2006 +0000 (2006-11-10)
changeset 173 662fc7f7144b
child 174 5611e4b3fa42
permissions -rw-r--r--
added plugin sys initial import
dvander@173
     1
#include <stdio.h>
dvander@173
     2
#include "PluginSys.h"
dvander@173
     3
dvander@173
     4
using namespace SourcePawn;
dvander@173
     5
dvander@173
     6
CPlugin *CPlugin::CreatePlugin(const char *file, 
dvander@173
     7
								bool debug_default, 
dvander@173
     8
								PluginLifetime life, 
dvander@173
     9
								char *error, 
dvander@173
    10
								size_t maxlen)
dvander@173
    11
{
dvander@173
    12
	static unsigned int MySerial = 0;
dvander@173
    13
	FILE *fp = fopen(file, "rb");
dvander@173
    14
dvander@173
    15
	if (!fp)
dvander@173
    16
	{
dvander@173
    17
		snprintf(error, maxlen, "Could not open file");
dvander@173
    18
		return NULL;
dvander@173
    19
	}
dvander@173
    20
dvander@173
    21
	int err;
dvander@173
    22
	sp_plugin_t *pl = g_pSourcePawn->LoadFromFilePointer(fp, &err);
dvander@173
    23
	if (pl == NULL)
dvander@173
    24
	{
dvander@173
    25
		snprintf(error, maxlen, "Could not load plugin, error %d", err);
dvander@173
    26
		return NULL;
dvander@173
    27
	}
dvander@173
    28
dvander@173
    29
	fclose(fp);
dvander@173
    30
dvander@173
    31
	ICompilation *co = g_pVM->StartCompilation(pl);
dvander@173
    32
	
dvander@173
    33
	if (debug_default)
dvander@173
    34
	{
dvander@173
    35
		if (!g_pVM->SetCompilationOption(co, "debug", "1"))
dvander@173
    36
		{
dvander@173
    37
			g_pVM->AbortCompilation(co);
dvander@173
    38
			snprintf(error, maxlen, "Could not set plugin to debug mode");
dvander@173
    39
			return NULL;
dvander@173
    40
		}
dvander@173
    41
	}
dvander@173
    42
dvander@173
    43
	sp_context_t *ctx = g_pVM->CompileToContext(co, &err);
dvander@173
    44
	if (ctx == NULL)
dvander@173
    45
	{
dvander@173
    46
		snprintf(error, maxlen, "Plugin failed to load, JIT error: %d", err);
dvander@173
    47
		return NULL;
dvander@173
    48
	}
dvander@173
    49
dvander@173
    50
	IPluginContext *base = g_pSourcePawn->CreateBaseContext(ctx);
dvander@173
    51
	CPlugin *pPlugin = new CPlugin;
dvander@173
    52
dvander@173
    53
	snprintf(pPlugin->m_filename, PLATFORM_MAX_PATH, "%s", file);
dvander@173
    54
	pPlugin->m_debugging = debug_default;
dvander@173
    55
	pPlugin->m_ctx_current.base = base;
dvander@173
    56
	pPlugin->m_ctx_current.ctx = ctx;
dvander@173
    57
	pPlugin->m_lifetime = life;
dvander@173
    58
	pPlugin->m_lock = false;
dvander@173
    59
	pPlugin->m_serial = ++MySerial;
dvander@173
    60
	pPlugin->m_status = Plugin_Loaded;
dvander@173
    61
	pPlugin->m_plugin = pl;
dvander@173
    62
dvander@173
    63
	pPlugin->UpdateInfo();
dvander@173
    64
dvander@173
    65
	return pPlugin;
dvander@173
    66
}
dvander@173
    67
dvander@173
    68
void CPlugin::UpdateInfo()
dvander@173
    69
{
dvander@173
    70
	/* Now grab the info */
dvander@173
    71
	uint32_t idx;
dvander@173
    72
	IPluginContext *base = GetBaseContext();
dvander@173
    73
	int err = base->FindPubvarByName("myinfo", &idx);
dvander@173
    74
dvander@173
    75
	if (err == SP_ERROR_NONE)
dvander@173
    76
	{
dvander@173
    77
		struct sm_plugininfo_c_t
dvander@173
    78
		{
dvander@173
    79
			cell_t name;
dvander@173
    80
			cell_t description;
dvander@173
    81
			cell_t author;
dvander@173
    82
			cell_t version;
dvander@173
    83
			cell_t url;
dvander@173
    84
		};
dvander@173
    85
		sm_plugininfo_c_t *cinfo;
dvander@173
    86
		cell_t local_addr;
dvander@173
    87
dvander@173
    88
		base->GetPubvarAddrs(idx, &local_addr, (cell_t **)&cinfo);
dvander@173
    89
		base->LocalToString(cinfo->name, (char **)&m_info.name);
dvander@173
    90
		base->LocalToString(cinfo->description, (char **)&m_info.description);
dvander@173
    91
		base->LocalToString(cinfo->author, (char **)&m_info.author);
dvander@173
    92
		base->LocalToString(cinfo->url, (char **)&m_info.url);
dvander@173
    93
		base->LocalToString(cinfo->version, (char **)&m_info.version);
dvander@173
    94
	}
dvander@173
    95
dvander@173
    96
	m_info.author = m_info.author ? m_info.author : "";
dvander@173
    97
	m_info.description = m_info.description ? m_info.description : "";
dvander@173
    98
	m_info.name = m_info.name ? m_info.name : "";
dvander@173
    99
	m_info.url = m_info.url ? m_info.url : "";
dvander@173
   100
	m_info.version = m_info.version ? m_info.version : "";
dvander@173
   101
}
dvander@173
   102
dvander@173
   103
const sp_plugin_t *CPlugin::GetPluginStructure() const
dvander@173
   104
{
dvander@173
   105
	return m_plugin;
dvander@173
   106
}
dvander@173
   107
dvander@173
   108
IPluginContext *CPlugin::GetBaseContext() const
dvander@173
   109
{
dvander@173
   110
	return m_ctx_current.base;
dvander@173
   111
}
dvander@173
   112
dvander@173
   113
sp_context_t *CPlugin::GetContext() const
dvander@173
   114
{
dvander@173
   115
	return m_ctx_current.ctx;
dvander@173
   116
}
dvander@173
   117
dvander@173
   118
const char *CPlugin::GetFilename() const
dvander@173
   119
{
dvander@173
   120
	return m_filename;
dvander@173
   121
}
dvander@173
   122
dvander@173
   123
PluginLifetime CPlugin::GetLifetime() const
dvander@173
   124
{
dvander@173
   125
	return m_lifetime;
dvander@173
   126
}
dvander@173
   127
dvander@173
   128
bool CPlugin::GetLockForUpdates() const
dvander@173
   129
{
dvander@173
   130
	return m_lock;
dvander@173
   131
}
dvander@173
   132
dvander@173
   133
const sm_plugininfo_t *CPlugin::GetPublicInfo() const
dvander@173
   134
{
dvander@173
   135
	return &m_info;
dvander@173
   136
}
dvander@173
   137
dvander@173
   138
unsigned int CPlugin::GetSerial() const
dvander@173
   139
{
dvander@173
   140
	return m_serial;
dvander@173
   141
}
dvander@173
   142
dvander@173
   143
PluginStatus CPlugin::GetStatus() const
dvander@173
   144
{
dvander@173
   145
	return m_status;
dvander@173
   146
}
dvander@173
   147
dvander@173
   148
bool CPlugin::IsDebugging() const
dvander@173
   149
{
dvander@173
   150
	return m_debugging;
dvander@173
   151
}
dvander@173
   152
dvander@173
   153
void CPlugin::SetLockForUpdates(bool lock_status)
dvander@173
   154
{
dvander@173
   155
	m_lock = lock_status;
dvander@173
   156
}
dvander@173
   157
dvander@173
   158
bool CPlugin::SetPauseState(bool paused)
dvander@173
   159
{
dvander@173
   160
	if (paused && GetStatus() != Plugin_Paused)
dvander@173
   161
	{
dvander@173
   162
		return false;
dvander@173
   163
	} else if (!paused && GetStatus() != Plugin_Running) {
dvander@173
   164
		return false;
dvander@173
   165
	}
dvander@173
   166
	
dvander@173
   167
	/* :TODO: execute some forwards or some crap */
dvander@173
   168
dvander@173
   169
	return true;
dvander@173
   170
}