core/smn_handles.cpp
author Scott Ehlert <ds@alliedmods.net>
Wed Aug 15 06:19:30 2007 +0000 (2007-08-15)
changeset 1330 ab94316bb52b
parent 1231 17badaf66ce4
child 1947 e73a1e51833b
permissions -rw-r--r--
Updated license headers on virtually all files with extremely minor changes in the name of some sort of strange consistency.
All plugin and include file headers also have been changed to say about GPL3 instead of GPL2.

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