core/logic/smn_handles.cpp
author Kyle Sanderson <kyle.leet@gmail.com>
Mon Aug 12 00:42:56 2013 +0100 (2013-08-12)
changeset 3994 4bc73bac0f4c
parent 3008 660ceb40e6ee
permissions -rw-r--r--
Added helper stock to check if a command exists. (bug 5510, r=asherkin)
     1 /**
     2  * vim: set ts=4 :
     3  * =============================================================================
     4  * SourceMod
     5  * Copyright (C) 2004-2008 AlliedModders LLC.  All rights reserved.
     6  * =============================================================================
     7  *
     8  * This program is free software; you can redistribute it and/or modify it under
     9  * the terms of the GNU General Public License, version 3.0, as published by the
    10  * Free Software Foundation.
    11  * 
    12  * This program is distributed in the hope that it will be useful, but WITHOUT
    13  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
    14  * FOR A PARTICULAR PURPOSE.  See the GNU General Public License for more
    15  * details.
    16  *
    17  * You should have received a copy of the GNU General Public License along with
    18  * this program.  If not, see <http://www.gnu.org/licenses/>.
    19  *
    20  * As a special exception, AlliedModders LLC gives you permission to link the
    21  * code of this program (as well as its derivative works) to "Half-Life 2," the
    22  * "Source Engine," the "SourcePawn JIT," and any Game MODs that run on software
    23  * by the Valve Corporation.  You must obey the GNU General Public License in
    24  * all respects for all other code used.  Additionally, AlliedModders LLC grants
    25  * this exception to all derivative works.  AlliedModders LLC defines further
    26  * exceptions, found in LICENSE.txt (as of this writing, version JULY-31-2007),
    27  * or <http://www.sourcemod.net/license.php>.
    28  *
    29  * Version: $Id$
    30  */
    31 
    32 #include "common_logic.h"
    33 #include <IHandleSys.h>
    34 #include <IPluginSys.h>
    35 
    36 using namespace SourceMod;
    37 
    38 static cell_t sm_IsValidHandle(IPluginContext *pContext, const cell_t *params)
    39 {
    40 	Handle_t hndl = static_cast<Handle_t>(params[1]);
    41 
    42 	HandleError err = handlesys->ReadHandle(hndl, 0, NULL, NULL);
    43 
    44 	if (err != HandleError_Access
    45 		&& err != HandleError_None)
    46 	{
    47 		return 0;
    48 	}
    49 
    50 	return 1;
    51 }
    52 
    53 static cell_t sm_CloseHandle(IPluginContext *pContext, const cell_t *params)
    54 {
    55 	Handle_t hndl = static_cast<Handle_t>(params[1]);
    56 	HandleSecurity sec;
    57 
    58 	sec.pIdentity = NULL;
    59 	sec.pOwner = pContext->GetIdentity();
    60 
    61 	HandleError err = handlesys->FreeHandle(hndl, &sec);
    62   
    63 	if (err == HandleError_None)
    64 	{
    65 		return 1;
    66 	} else if (err == HandleError_Access) {
    67 		return 0;
    68 	} else {
    69 		return pContext->ThrowNativeError("Handle %x is invalid (error %d)", hndl, err);
    70 	}
    71 }
    72 
    73 static cell_t sm_CloneHandle(IPluginContext *pContext, const cell_t *params)
    74 {
    75 	Handle_t new_hndl;
    76 	Handle_t hndl = static_cast<Handle_t>(params[1]);
    77 	HandleError err;
    78 	IdentityToken_t *pNewOwner;
    79 	
    80 	if (params[2] == 0)
    81 	{
    82 		pNewOwner = pContext->GetIdentity();
    83 	} else {
    84 		Handle_t hPlugin = static_cast<Handle_t>(params[2]);
    85 		IPlugin *pPlugin = pluginsys->PluginFromHandle(hPlugin, &err);
    86 		if (!pPlugin)
    87 		{
    88 			return pContext->ThrowNativeError("Plugin handle %x is invalid (error %d)", hndl, err);
    89 		}
    90 		pNewOwner = pPlugin->GetIdentity();
    91 	}
    92 
    93 	err = handlesys->CloneHandle(hndl, &new_hndl, pNewOwner, NULL);
    94 
    95 	if (err == HandleError_Access)
    96 	{
    97 		return 0;
    98 	} else if (err == HandleError_None) {
    99 		return new_hndl;
   100 	} else {
   101 		return pContext->ThrowNativeError("Handle %x cannot be cloned because it is invalid (error %d)", hndl, err);
   102 	}
   103 }
   104 
   105 static cell_t sm_GetMyHandle(IPluginContext *pContext, const cell_t *params)
   106 {
   107 	IPlugin *pPlugin = pluginsys->FindPluginByContext(pContext->GetContext());
   108 
   109 	return pPlugin->GetMyHandle();
   110 }
   111 
   112 REGISTER_NATIVES(handles)
   113 {
   114 	{"IsValidHandle",			sm_IsValidHandle},
   115 	{"CloseHandle",				sm_CloseHandle},
   116 	{"CloneHandle",				sm_CloneHandle},
   117 	{"GetMyHandle",				sm_GetMyHandle},
   118 	{NULL,						NULL},
   119 };