dvander@2545: /**
dvander@2545: * vim: set ts=4 :
dvander@2545: * =============================================================================
dvander@2545: * SourceMod
dvander@2545: * Copyright (C) 2004-2009 AlliedModders LLC. All rights reserved.
dvander@2545: * =============================================================================
dvander@2545: *
dvander@2545: * This program is free software; you can redistribute it and/or modify it under
dvander@2545: * the terms of the GNU General Public License, version 3.0, as published by the
dvander@2545: * Free Software Foundation.
dvander@2545: *
dvander@2545: * This program is distributed in the hope that it will be useful, but WITHOUT
dvander@2545: * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
dvander@2545: * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
dvander@2545: * details.
dvander@2545: *
dvander@2545: * You should have received a copy of the GNU General Public License along with
dvander@2545: * this program. If not, see .
dvander@2545: *
dvander@2545: * As a special exception, AlliedModders LLC gives you permission to link the
dvander@2545: * code of this program (as well as its derivative works) to "Half-Life 2," the
dvander@2545: * "Source Engine," the "SourcePawn JIT," and any Game MODs that run on software
dvander@2545: * by the Valve Corporation. You must obey the GNU General Public License in
dvander@2545: * all respects for all other code used. Additionally, AlliedModders LLC grants
dvander@2545: * this exception to all derivative works. AlliedModders LLC defines further
dvander@2545: * exceptions, found in LICENSE.txt (as of this writing, version JULY-31-2007),
dvander@2545: * or .
dvander@2545: *
dvander@2545: * Version: $Id$
dvander@2545: */
dvander@2545:
dvander@2545: #ifndef _INCLUDE_SOURCEMOD_NATIVE_INVOKER_H_
dvander@2545: #define _INCLUDE_SOURCEMOD_NATIVE_INVOKER_H_
dvander@2545:
dvander@2545: #include "sm_globals.h"
dvander@2545: #include
dvander@2545:
dvander@2545: struct ParamInfo
dvander@2545: {
dvander@2545: int flags; /* Copy-back flags */
dvander@2545: bool marked; /* Whether this is marked as being used */
dvander@2545: cell_t local_addr; /* Local address to free */
dvander@2545: cell_t *phys_addr; /* Physical address of our copy */
dvander@2545: cell_t *orig_addr; /* Original address to copy back to */
dvander@2545: ucell_t size; /* Size of array in bytes */
dvander@2545: struct
dvander@2545: {
dvander@2545: bool is_sz; /* is a string */
dvander@2545: int sz_flags; /* has sz flags */
dvander@2545: } str;
dvander@2545: };
dvander@2545:
dvander@2545: class NativeInvoker : public INativeInvoker
dvander@2545: {
dvander@2545: public:
dvander@2545: NativeInvoker();
dvander@2545: ~NativeInvoker();
dvander@2545: public: /* ICallable */
dvander@2545: int PushCell(cell_t cell);
dvander@2545: int PushCellByRef(cell_t *cell, int flags=SM_PARAM_COPYBACK);
dvander@2545: int PushFloat(float number);
dvander@2545: int PushFloatByRef(float *number, int flags=SM_PARAM_COPYBACK);
dvander@2545: int PushArray(cell_t *inarray, unsigned int cells, int flags=0);
dvander@2545: int PushString(const char *string);
dvander@2545: int PushStringEx(char *buffer, size_t length, int sz_flags, int cp_flags);
dvander@2545: void Cancel();
dvander@2545: public: /* INativeInvoker */
dvander@2545: bool Start(IPluginContext *pContext, const char *name);
dvander@2545: int Invoke(cell_t *result);
dvander@2545: private:
dvander@2545: int _PushString(const char *string, int sz_flags, int cp_flags, size_t len);
dvander@2545: int SetError(int err);
dvander@2545: private:
dvander@2545: IPluginContext *pContext;
dvander@2545: SPVM_NATIVE_FUNC native;
dvander@2545: cell_t m_params[SP_MAX_EXEC_PARAMS];
dvander@2545: ParamInfo m_info[SP_MAX_EXEC_PARAMS];
dvander@2545: unsigned int m_curparam;
dvander@2545: int m_errorstate;
dvander@2545: };
dvander@2545:
dvander@2545: class NativeInterface :
dvander@2545: public INativeInterface,
dvander@2545: public SMGlobalClass
dvander@2545: {
dvander@2545: public: /* SMGlobalClass */
dvander@2545: void OnSourceModAllInitialized();
dvander@2545: public: /* SMInterface */
dvander@2545: unsigned int GetInterfaceVersion();
dvander@2545: const char *GetInterfaceName();
dvander@2545: public: /* INativeInvoker */
dvander@2545: IPluginRuntime *CreateRuntime(const char *name, size_t bytes);
dvander@2545: INativeInvoker *CreateInvoker();
dvander@2545: };
dvander@2545:
dvander@2545: extern NativeInterface g_NInvoke;
dvander@2545:
dvander@2545: #endif /* _INCLUDE_SOURCEMOD_NATIVE_INVOKER_H_ */