dvander@173: #include dvander@173: #include "PluginSys.h" dvander@173: dvander@173: using namespace SourcePawn; dvander@173: dvander@173: CPlugin *CPlugin::CreatePlugin(const char *file, dvander@173: bool debug_default, dvander@173: PluginLifetime life, dvander@173: char *error, dvander@173: size_t maxlen) dvander@173: { dvander@173: static unsigned int MySerial = 0; dvander@173: FILE *fp = fopen(file, "rb"); dvander@173: dvander@173: if (!fp) dvander@173: { dvander@173: snprintf(error, maxlen, "Could not open file"); dvander@173: return NULL; dvander@173: } dvander@173: dvander@173: int err; dvander@173: sp_plugin_t *pl = g_pSourcePawn->LoadFromFilePointer(fp, &err); dvander@173: if (pl == NULL) dvander@173: { dvander@173: snprintf(error, maxlen, "Could not load plugin, error %d", err); dvander@173: return NULL; dvander@173: } dvander@173: dvander@173: fclose(fp); dvander@173: dvander@173: ICompilation *co = g_pVM->StartCompilation(pl); dvander@173: dvander@173: if (debug_default) dvander@173: { dvander@173: if (!g_pVM->SetCompilationOption(co, "debug", "1")) dvander@173: { dvander@173: g_pVM->AbortCompilation(co); dvander@173: snprintf(error, maxlen, "Could not set plugin to debug mode"); dvander@173: return NULL; dvander@173: } dvander@173: } dvander@173: dvander@173: sp_context_t *ctx = g_pVM->CompileToContext(co, &err); dvander@173: if (ctx == NULL) dvander@173: { dvander@173: snprintf(error, maxlen, "Plugin failed to load, JIT error: %d", err); dvander@173: return NULL; dvander@173: } dvander@173: dvander@173: IPluginContext *base = g_pSourcePawn->CreateBaseContext(ctx); dvander@173: CPlugin *pPlugin = new CPlugin; dvander@173: dvander@173: snprintf(pPlugin->m_filename, PLATFORM_MAX_PATH, "%s", file); dvander@173: pPlugin->m_debugging = debug_default; dvander@173: pPlugin->m_ctx_current.base = base; dvander@173: pPlugin->m_ctx_current.ctx = ctx; dvander@173: pPlugin->m_lifetime = life; dvander@173: pPlugin->m_lock = false; dvander@173: pPlugin->m_serial = ++MySerial; dvander@173: pPlugin->m_status = Plugin_Loaded; dvander@173: pPlugin->m_plugin = pl; dvander@173: dvander@173: pPlugin->UpdateInfo(); dvander@173: dvander@173: return pPlugin; dvander@173: } dvander@173: dvander@173: void CPlugin::UpdateInfo() dvander@173: { dvander@173: /* Now grab the info */ dvander@173: uint32_t idx; dvander@173: IPluginContext *base = GetBaseContext(); dvander@173: int err = base->FindPubvarByName("myinfo", &idx); dvander@173: dvander@173: if (err == SP_ERROR_NONE) dvander@173: { dvander@173: struct sm_plugininfo_c_t dvander@173: { dvander@173: cell_t name; dvander@173: cell_t description; dvander@173: cell_t author; dvander@173: cell_t version; dvander@173: cell_t url; dvander@173: }; dvander@173: sm_plugininfo_c_t *cinfo; dvander@173: cell_t local_addr; dvander@173: dvander@173: base->GetPubvarAddrs(idx, &local_addr, (cell_t **)&cinfo); dvander@173: base->LocalToString(cinfo->name, (char **)&m_info.name); dvander@173: base->LocalToString(cinfo->description, (char **)&m_info.description); dvander@173: base->LocalToString(cinfo->author, (char **)&m_info.author); dvander@173: base->LocalToString(cinfo->url, (char **)&m_info.url); dvander@173: base->LocalToString(cinfo->version, (char **)&m_info.version); dvander@173: } dvander@173: dvander@173: m_info.author = m_info.author ? m_info.author : ""; dvander@173: m_info.description = m_info.description ? m_info.description : ""; dvander@173: m_info.name = m_info.name ? m_info.name : ""; dvander@173: m_info.url = m_info.url ? m_info.url : ""; dvander@173: m_info.version = m_info.version ? m_info.version : ""; dvander@173: } dvander@173: dvander@173: const sp_plugin_t *CPlugin::GetPluginStructure() const dvander@173: { dvander@173: return m_plugin; dvander@173: } dvander@173: dvander@173: IPluginContext *CPlugin::GetBaseContext() const dvander@173: { dvander@173: return m_ctx_current.base; dvander@173: } dvander@173: dvander@173: sp_context_t *CPlugin::GetContext() const dvander@173: { dvander@173: return m_ctx_current.ctx; dvander@173: } dvander@173: dvander@173: const char *CPlugin::GetFilename() const dvander@173: { dvander@173: return m_filename; dvander@173: } dvander@173: dvander@173: PluginLifetime CPlugin::GetLifetime() const dvander@173: { dvander@173: return m_lifetime; dvander@173: } dvander@173: dvander@173: bool CPlugin::GetLockForUpdates() const dvander@173: { dvander@173: return m_lock; dvander@173: } dvander@173: dvander@173: const sm_plugininfo_t *CPlugin::GetPublicInfo() const dvander@173: { dvander@173: return &m_info; dvander@173: } dvander@173: dvander@173: unsigned int CPlugin::GetSerial() const dvander@173: { dvander@173: return m_serial; dvander@173: } dvander@173: dvander@173: PluginStatus CPlugin::GetStatus() const dvander@173: { dvander@173: return m_status; dvander@173: } dvander@173: dvander@173: bool CPlugin::IsDebugging() const dvander@173: { dvander@173: return m_debugging; dvander@173: } dvander@173: dvander@173: void CPlugin::SetLockForUpdates(bool lock_status) dvander@173: { dvander@173: m_lock = lock_status; dvander@173: } dvander@173: dvander@173: bool CPlugin::SetPauseState(bool paused) dvander@173: { dvander@173: if (paused && GetStatus() != Plugin_Paused) dvander@173: { dvander@173: return false; dvander@173: } else if (!paused && GetStatus() != Plugin_Running) { dvander@173: return false; dvander@173: } dvander@173: dvander@173: /* :TODO: execute some forwards or some crap */ dvander@173: dvander@173: return true; dvander@173: }