public/AutoHandleRooter.h
author Nicholas Hastings <skamonkey@gmail.com>
Fri Mar 21 13:23:48 2014 -0400 (2014-03-21)
changeset 4293 f61ae385f12e
parent 3872 4c93f74cae51
permissions -rw-r--r--
Add PbRemoveRepeatedFieldValue native (bug 6066, r=asherkin).
dvander@2996
     1
/**
dvander@2996
     2
 * vim: set ts=4 sw=4 tw=99 noet :
dvander@2996
     3
 * =============================================================================
dvander@2996
     4
 * SourceMod
dvander@2996
     5
 * Copyright (C) 2004-2009 AlliedModders LLC.  All rights reserved.
dvander@2996
     6
 * =============================================================================
dvander@2996
     7
 *
dvander@2996
     8
 * This program is free software; you can redistribute it and/or modify it under
dvander@2996
     9
 * the terms of the GNU General Public License, version 3.0, as published by the
dvander@2996
    10
 * Free Software Foundation.
dvander@2996
    11
 * 
dvander@2996
    12
 * This program is distributed in the hope that it will be useful, but WITHOUT
dvander@2996
    13
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
dvander@2996
    14
 * FOR A PARTICULAR PURPOSE.  See the GNU General Public License for more
dvander@2996
    15
 * details.
dvander@2996
    16
 *
dvander@2996
    17
 * You should have received a copy of the GNU General Public License along with
dvander@2996
    18
 * this program.  If not, see <http://www.gnu.org/licenses/>.
dvander@2996
    19
 *
dvander@2996
    20
 * As a special exception, AlliedModders LLC gives you permission to link the
dvander@2996
    21
 * code of this program (as well as its derivative works) to "Half-Life 2," the
dvander@2996
    22
 * "Source Engine," the "SourcePawn JIT," and any Game MODs that run on software
dvander@2996
    23
 * by the Valve Corporation.  You must obey the GNU General Public License in
dvander@2996
    24
 * all respects for all other code used.  Additionally, AlliedModders LLC grants
dvander@2996
    25
 * this exception to all derivative works.  AlliedModders LLC defines further
dvander@2996
    26
 * exceptions, found in LICENSE.txt (as of this writing, version JULY-31-2007),
dvander@2996
    27
 * or <http://www.sourcemod.net/license.php>.
dvander@2996
    28
 *
dvander@2996
    29
 * Version: $Id$
dvander@2996
    30
 */
dvander@2996
    31
dvander@2996
    32
#ifndef _INCLUDE_SOURCEMOD_AUTO_HANDLE_ROOTER_H_
dvander@2996
    33
#define _INCLUDE_SOURCEMOD_AUTO_HANDLE_ROOTER_H_
dvander@2996
    34
dvander@2996
    35
#include <IHandleSys.h>
dvander@2996
    36
dvander@2996
    37
class AutoHandleRooter
dvander@2996
    38
{
dvander@2996
    39
public:
dvander@2996
    40
	AutoHandleRooter(Handle_t hndl)
dvander@2996
    41
	{
dvander@2996
    42
		if (hndl != BAD_HANDLE)
dvander@2996
    43
			this->hndl = handlesys->FastCloneHandle(hndl);
dvander@2996
    44
		else
dvander@2996
    45
			this->hndl = BAD_HANDLE;
dvander@2996
    46
	}
dvander@2996
    47
dvander@2996
    48
	~AutoHandleRooter()
dvander@2996
    49
	{
dvander@2996
    50
		if (hndl != BAD_HANDLE)
dvander@2996
    51
		{
dvander@2996
    52
			HandleSecurity sec(g_pCoreIdent, g_pCoreIdent);
dvander@2996
    53
			handlesys->FreeHandle(hndl, &sec);
dvander@2996
    54
		}
dvander@2996
    55
	}
dvander@2996
    56
dvander@2996
    57
	Handle_t getHandle()
dvander@2996
    58
	{
dvander@2996
    59
		return hndl;
dvander@2996
    60
	}
dvander@2996
    61
private:
dvander@2996
    62
	Handle_t hndl;
dvander@2996
    63
};
dvander@2996
    64
dvander@2996
    65
class AutoHandleCloner
dvander@2996
    66
{
dvander@2996
    67
	Handle_t original;
dvander@2996
    68
	HandleSecurity sec;
dvander@2996
    69
	AutoHandleRooter ahr;
dvander@2996
    70
public:
dvander@2996
    71
	AutoHandleCloner(Handle_t original, HandleSecurity sec)
dvander@2996
    72
	  : original(original), sec(sec), ahr(original)
dvander@2996
    73
	{
dvander@2996
    74
	}
dvander@2996
    75
dvander@2996
    76
	~AutoHandleCloner()
dvander@2996
    77
	{
dvander@2996
    78
		if (original != BAD_HANDLE)
dvander@2996
    79
		{
dvander@2996
    80
			handlesys->FreeHandle(original, &sec);
dvander@2996
    81
		}
dvander@2996
    82
	}
dvander@2996
    83
dvander@2996
    84
	Handle_t getClone()
dvander@2996
    85
	{
dvander@2996
    86
		return ahr.getHandle();
dvander@2996
    87
	}
dvander@2996
    88
};
dvander@2996
    89
dvander@2996
    90
#endif /* _INCLUDE_SOURCEMOD_AUTO_HANDLE_ROOTER_H_ */
dvander@2996
    91