core/UserMessagePBHelpers.h
author Nicholas Hastings <skamonkey@gmail.com>
Sat Mar 16 13:31:35 2013 -0400 (2013-03-16)
changeset 3813 bf1faf4a16c9
parent 3751 cd8b8f356da2
child 3814 ba22878ca775
permissions -rw-r--r--
Added repeated field handling to PbRead* natives. Deprecate PbReadRepeated* (bug 5633, r=asherkin).
skamonkey@3743
     1
/**
skamonkey@3743
     2
 * vim: set ts=4 :
skamonkey@3743
     3
 * =============================================================================
skamonkey@3743
     4
 * SourceMod
skamonkey@3743
     5
 * Copyright (C) 2013 AlliedModders LLC.  All rights reserved.
skamonkey@3743
     6
 * =============================================================================
skamonkey@3743
     7
 *
skamonkey@3743
     8
 * This program is free software; you can redistribute it and/or modify it under
skamonkey@3743
     9
 * the terms of the GNU General Public License, version 3.0, as published by the
skamonkey@3743
    10
 * Free Software Foundation.
skamonkey@3743
    11
 * 
skamonkey@3743
    12
 * This program is distributed in the hope that it will be useful, but WITHOUT
skamonkey@3743
    13
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
skamonkey@3743
    14
 * FOR A PARTICULAR PURPOSE.  See the GNU General Public License for more
skamonkey@3743
    15
 * details.
skamonkey@3743
    16
 *
skamonkey@3743
    17
 * You should have received a copy of the GNU General Public License along with
skamonkey@3743
    18
 * this program.  If not, see <http://www.gnu.org/licenses/>.
skamonkey@3743
    19
 *
skamonkey@3743
    20
 * As a special exception, AlliedModders LLC gives you permission to link the
skamonkey@3743
    21
 * code of this program (as well as its derivative works) to "Half-Life 2," the
skamonkey@3743
    22
 * "Source Engine," the "SourcePawn JIT," and any Game MODs that run on software
skamonkey@3743
    23
 * by the Valve Corporation.  You must obey the GNU General Public License in
skamonkey@3743
    24
 * all respects for all other code used.  Additionally, AlliedModders LLC grants
skamonkey@3743
    25
 * this exception to all derivative works.  AlliedModders LLC defines further
skamonkey@3743
    26
 * exceptions, found in LICENSE.txt (as of this writing, version JULY-31-2007),
skamonkey@3743
    27
 * or <http://www.sourcemod.net/license.php>.
skamonkey@3743
    28
 *
skamonkey@3743
    29
 * Version: $Id$
skamonkey@3743
    30
 */
skamonkey@3743
    31
skamonkey@3743
    32
#ifndef _INCLUDE_SOURCEMOD_SMPBMESSAGE_H_
skamonkey@3743
    33
#define _INCLUDE_SOURCEMOD_SMPBMESSAGE_H_
skamonkey@3743
    34
skamonkey@3743
    35
#include <sh_list.h>
skamonkey@3743
    36
#include <google/protobuf/descriptor.h>
skamonkey@3743
    37
skamonkey@3743
    38
#define GETCHECK_FIELD() \
skamonkey@3743
    39
	const protobuf::FieldDescriptor *field = msg->GetDescriptor()->FindFieldByName(pszFieldName); \
skamonkey@3743
    40
	if (!field)       \
skamonkey@3743
    41
	{                 \
skamonkey@3743
    42
		return false; \
skamonkey@3743
    43
	}
skamonkey@3743
    44
skamonkey@3743
    45
#define CHECK_FIELD_TYPE(type) \
skamonkey@3743
    46
	if (field->cpp_type() != protobuf::FieldDescriptor::CPPTYPE_##type) \
skamonkey@3743
    47
	{                 \
skamonkey@3743
    48
		return false; \
skamonkey@3743
    49
	}
skamonkey@3743
    50
skamonkey@3743
    51
#define CHECK_FIELD_TYPE2(type1, type2) \
skamonkey@3743
    52
	protobuf::FieldDescriptor::CppType fieldType = field->cpp_type(); \
skamonkey@3743
    53
	if (fieldType != protobuf::FieldDescriptor::CPPTYPE_##type1       \
skamonkey@3743
    54
		&& fieldType != protobuf::FieldDescriptor::CPPTYPE_##type2) \
skamonkey@3743
    55
	{                 \
skamonkey@3743
    56
		return false; \
skamonkey@3743
    57
	}
skamonkey@3743
    58
skamonkey@3743
    59
#define CHECK_FIELD_REPEATED() \
skamonkey@3743
    60
	if (field->label() != protobuf::FieldDescriptor::LABEL_REPEATED) \
skamonkey@3743
    61
	{                 \
skamonkey@3743
    62
		return false; \
skamonkey@3743
    63
	}
skamonkey@3743
    64
skamonkey@3743
    65
#define CHECK_FIELD_NOT_REPEATED() \
skamonkey@3743
    66
	if (field->label() == protobuf::FieldDescriptor::LABEL_REPEATED) \
skamonkey@3743
    67
	{                 \
skamonkey@3743
    68
		return false; \
skamonkey@3743
    69
	}
skamonkey@3743
    70
skamonkey@3743
    71
#define CHECK_REPEATED_ELEMENT(idx) \
skamonkey@3743
    72
	int elemCount = msg->GetReflection()->FieldSize(*msg, field); \
skamonkey@3751
    73
	if (elemCount == 0 || idx >= elemCount || idx < 0)        \
skamonkey@3743
    74
	{                                                         \
skamonkey@3743
    75
		return false;                                         \
skamonkey@3743
    76
	}
skamonkey@3743
    77
skamonkey@3743
    78
typedef List<Handle_t> PBHandleList;
skamonkey@3743
    79
skamonkey@3743
    80
class SMProtobufMessage
skamonkey@3743
    81
{
skamonkey@3743
    82
public:
skamonkey@3743
    83
	SMProtobufMessage( protobuf::Message *message )
skamonkey@3743
    84
	{
skamonkey@3743
    85
		msg = message;
skamonkey@3743
    86
	}
skamonkey@3743
    87
skamonkey@3743
    88
	~SMProtobufMessage()
skamonkey@3743
    89
	{
skamonkey@3743
    90
		PBHandleList::iterator iter = childHandles.begin();
skamonkey@3743
    91
		while (iter != childHandles.end())
skamonkey@3743
    92
		{
skamonkey@3743
    93
			Handle_t &hndl = (*iter);
skamonkey@3743
    94
			HandleSecurity sec;
skamonkey@3743
    95
			sec.pIdentity = g_pCoreIdent;
skamonkey@3743
    96
			g_HandleSys.FreeHandle(hndl, &sec);
skamonkey@3743
    97
			iter = childHandles.erase(iter);
skamonkey@3743
    98
		}
skamonkey@3743
    99
	}
skamonkey@3743
   100
skamonkey@3743
   101
	inline void AddChildHandle(Handle_t hndl)
skamonkey@3743
   102
	{
skamonkey@3743
   103
		childHandles.push_back(hndl);
skamonkey@3743
   104
	}
skamonkey@3743
   105
skamonkey@3743
   106
	inline protobuf::Message *GetProtobufMessage()
skamonkey@3743
   107
	{
skamonkey@3743
   108
		return msg;
skamonkey@3743
   109
	}
skamonkey@3743
   110
skamonkey@3743
   111
	inline bool GetInt32(const char *pszFieldName, int32 *out)
skamonkey@3743
   112
	{
skamonkey@3743
   113
		GETCHECK_FIELD();
skamonkey@3743
   114
		CHECK_FIELD_TYPE(INT32);
skamonkey@3743
   115
		CHECK_FIELD_NOT_REPEATED();
skamonkey@3743
   116
skamonkey@3743
   117
		*out = msg->GetReflection()->GetInt32(*msg, field);
skamonkey@3743
   118
		return true;	
skamonkey@3743
   119
	}
skamonkey@3743
   120
skamonkey@3743
   121
	inline bool SetInt32(const char *pszFieldName, int32 value)
skamonkey@3743
   122
	{
skamonkey@3743
   123
		GETCHECK_FIELD();
skamonkey@3743
   124
		CHECK_FIELD_TYPE(INT32);
skamonkey@3743
   125
		CHECK_FIELD_NOT_REPEATED();
skamonkey@3743
   126
skamonkey@3743
   127
		msg->GetReflection()->SetInt32(msg, field, value);
skamonkey@3743
   128
		return true;
skamonkey@3743
   129
	}
skamonkey@3743
   130
skamonkey@3743
   131
	inline bool GetRepeatedInt32(const char *pszFieldName, int index, int32 *out)
skamonkey@3743
   132
	{
skamonkey@3743
   133
		GETCHECK_FIELD();
skamonkey@3743
   134
		CHECK_FIELD_TYPE(INT32);
skamonkey@3743
   135
		CHECK_FIELD_REPEATED();
skamonkey@3743
   136
		CHECK_REPEATED_ELEMENT(index);
skamonkey@3743
   137
		
skamonkey@3743
   138
		*out = msg->GetReflection()->GetRepeatedInt32(*msg, field, index);
skamonkey@3743
   139
		return true;
skamonkey@3743
   140
	}
skamonkey@3743
   141
skamonkey@3743
   142
	inline bool AddInt32(const char *pszFieldName, int32 value)
skamonkey@3743
   143
	{
skamonkey@3743
   144
		GETCHECK_FIELD();
skamonkey@3743
   145
		CHECK_FIELD_TYPE(INT32);
skamonkey@3743
   146
		CHECK_FIELD_REPEATED();
skamonkey@3743
   147
skamonkey@3743
   148
		msg->GetReflection()->AddInt32(msg, field, value);
skamonkey@3743
   149
		return true;
skamonkey@3743
   150
	}
skamonkey@3743
   151
skamonkey@3743
   152
	inline bool GetInt64(const char *pszFieldName, int64 *out)
skamonkey@3743
   153
	{
skamonkey@3743
   154
		GETCHECK_FIELD();
skamonkey@3743
   155
		CHECK_FIELD_TYPE(INT64);
skamonkey@3743
   156
		CHECK_FIELD_NOT_REPEATED();
skamonkey@3743
   157
skamonkey@3743
   158
		*out = msg->GetReflection()->GetInt64(*msg, field);
skamonkey@3743
   159
		return true;	
skamonkey@3743
   160
	}
skamonkey@3743
   161
skamonkey@3743
   162
	inline bool SetInt64(const char *pszFieldName, int64 value)
skamonkey@3743
   163
	{
skamonkey@3743
   164
		GETCHECK_FIELD();
skamonkey@3743
   165
		CHECK_FIELD_TYPE(INT64);
skamonkey@3743
   166
		CHECK_FIELD_NOT_REPEATED();
skamonkey@3743
   167
skamonkey@3743
   168
		msg->GetReflection()->SetInt64(msg, field, value);
skamonkey@3743
   169
		return true;
skamonkey@3743
   170
	}
skamonkey@3743
   171
skamonkey@3743
   172
	inline bool GetRepeatedInt64(const char *pszFieldName, int index, int64 *out)
skamonkey@3743
   173
	{
skamonkey@3743
   174
		GETCHECK_FIELD();
skamonkey@3743
   175
		CHECK_FIELD_TYPE(INT64);
skamonkey@3743
   176
		CHECK_FIELD_REPEATED();
skamonkey@3743
   177
		CHECK_REPEATED_ELEMENT(index);
skamonkey@3743
   178
		
skamonkey@3743
   179
		*out = msg->GetReflection()->GetRepeatedInt64(*msg, field, index);
skamonkey@3743
   180
		return true;
skamonkey@3743
   181
	}
skamonkey@3743
   182
skamonkey@3743
   183
	inline bool AddInt64(const char *pszFieldName, int64 value)
skamonkey@3743
   184
	{
skamonkey@3743
   185
		GETCHECK_FIELD();
skamonkey@3743
   186
		CHECK_FIELD_TYPE(INT64);
skamonkey@3743
   187
		CHECK_FIELD_REPEATED();
skamonkey@3743
   188
skamonkey@3743
   189
		msg->GetReflection()->AddInt64(msg, field, value);
skamonkey@3743
   190
		return true;
skamonkey@3743
   191
	}
skamonkey@3743
   192
skamonkey@3743
   193
	inline bool GetUInt32(const char *pszFieldName, uint32 *out)
skamonkey@3743
   194
	{
skamonkey@3743
   195
		GETCHECK_FIELD();
skamonkey@3743
   196
		CHECK_FIELD_TYPE(UINT32);
skamonkey@3743
   197
		CHECK_FIELD_NOT_REPEATED();
skamonkey@3743
   198
skamonkey@3743
   199
		*out = msg->GetReflection()->GetUInt32(*msg, field);
skamonkey@3743
   200
		return true;	
skamonkey@3743
   201
	}
skamonkey@3743
   202
skamonkey@3743
   203
	inline bool SetUInt32(const char *pszFieldName, uint32 value)
skamonkey@3743
   204
	{
skamonkey@3743
   205
		GETCHECK_FIELD();
skamonkey@3743
   206
		CHECK_FIELD_TYPE(UINT32);
skamonkey@3743
   207
		CHECK_FIELD_NOT_REPEATED();
skamonkey@3743
   208
skamonkey@3743
   209
		msg->GetReflection()->SetUInt32(msg, field, value);
skamonkey@3743
   210
		return true;
skamonkey@3743
   211
	}
skamonkey@3743
   212
skamonkey@3743
   213
	inline bool GetRepeatedUInt32(const char *pszFieldName, int index, uint32 *out)
skamonkey@3743
   214
	{
skamonkey@3743
   215
		GETCHECK_FIELD();
skamonkey@3743
   216
		CHECK_FIELD_TYPE(UINT32);
skamonkey@3743
   217
		CHECK_FIELD_REPEATED();
skamonkey@3743
   218
		CHECK_REPEATED_ELEMENT(index);
skamonkey@3743
   219
		
skamonkey@3743
   220
		*out = msg->GetReflection()->GetRepeatedUInt32(*msg, field, index);
skamonkey@3743
   221
		return true;
skamonkey@3743
   222
	}
skamonkey@3743
   223
skamonkey@3743
   224
	inline bool AddUInt32(const char *pszFieldName, uint32 value)
skamonkey@3743
   225
	{
skamonkey@3743
   226
		GETCHECK_FIELD();
skamonkey@3743
   227
		CHECK_FIELD_TYPE(UINT32);
skamonkey@3743
   228
		CHECK_FIELD_REPEATED();
skamonkey@3743
   229
skamonkey@3743
   230
		msg->GetReflection()->AddUInt32(msg, field, value);
skamonkey@3743
   231
		return true;
skamonkey@3743
   232
	}
skamonkey@3743
   233
skamonkey@3743
   234
	inline bool GetUInt64(const char *pszFieldName, uint64 *out)
skamonkey@3743
   235
	{
skamonkey@3743
   236
		GETCHECK_FIELD();
skamonkey@3743
   237
		CHECK_FIELD_TYPE(UINT64);
skamonkey@3743
   238
		CHECK_FIELD_NOT_REPEATED();
skamonkey@3743
   239
skamonkey@3743
   240
		*out = msg->GetReflection()->GetUInt64(*msg, field);
skamonkey@3743
   241
		return true;	
skamonkey@3743
   242
	}
skamonkey@3743
   243
skamonkey@3743
   244
	inline bool SetUInt64(const char *pszFieldName, uint64 value)
skamonkey@3743
   245
	{
skamonkey@3743
   246
		GETCHECK_FIELD();
skamonkey@3743
   247
		CHECK_FIELD_TYPE(UINT64);
skamonkey@3743
   248
		CHECK_FIELD_NOT_REPEATED();
skamonkey@3743
   249
skamonkey@3743
   250
		msg->GetReflection()->SetUInt64(msg, field, value);
skamonkey@3743
   251
		return true;
skamonkey@3743
   252
	}
skamonkey@3743
   253
skamonkey@3743
   254
	inline bool GetRepeatedUInt64(const char *pszFieldName, int index, uint64 *out)
skamonkey@3743
   255
	{
skamonkey@3743
   256
		GETCHECK_FIELD();
skamonkey@3743
   257
		CHECK_FIELD_TYPE(UINT64);
skamonkey@3743
   258
		CHECK_FIELD_REPEATED();
skamonkey@3743
   259
		CHECK_REPEATED_ELEMENT(index);
skamonkey@3743
   260
		
skamonkey@3743
   261
		*out = msg->GetReflection()->GetRepeatedUInt64(*msg, field, index);
skamonkey@3743
   262
		return true;
skamonkey@3743
   263
	}
skamonkey@3743
   264
skamonkey@3743
   265
	inline bool AddUInt64(const char *pszFieldName, uint64 value)
skamonkey@3743
   266
	{
skamonkey@3743
   267
		GETCHECK_FIELD();
skamonkey@3743
   268
		CHECK_FIELD_TYPE(UINT64);
skamonkey@3743
   269
		CHECK_FIELD_REPEATED();
skamonkey@3743
   270
skamonkey@3743
   271
		msg->GetReflection()->AddUInt32(msg, field, value);
skamonkey@3743
   272
		return true;
skamonkey@3743
   273
	}
skamonkey@3743
   274
skamonkey@3743
   275
	inline bool GetInt32OrUnsigned(const char *pszFieldName, int32 *out)
skamonkey@3743
   276
	{
skamonkey@3743
   277
		GETCHECK_FIELD();
skamonkey@3743
   278
		CHECK_FIELD_TYPE2(INT32, UINT32);
skamonkey@3743
   279
		CHECK_FIELD_NOT_REPEATED();
skamonkey@3743
   280
skamonkey@3743
   281
		if (fieldType == protobuf::FieldDescriptor::CPPTYPE_UINT32)
skamonkey@3743
   282
			*out = (int32)msg->GetReflection()->GetUInt32(*msg, field);
skamonkey@3743
   283
		else
skamonkey@3743
   284
			*out = msg->GetReflection()->GetInt32(*msg, field);
skamonkey@3743
   285
skamonkey@3743
   286
		return true;	
skamonkey@3743
   287
	}
skamonkey@3743
   288
skamonkey@3743
   289
	inline bool SetInt32OrUnsigned(const char *pszFieldName, int32 value)
skamonkey@3743
   290
	{
skamonkey@3743
   291
		GETCHECK_FIELD();
skamonkey@3743
   292
		CHECK_FIELD_TYPE2(INT32, UINT32);
skamonkey@3743
   293
		CHECK_FIELD_NOT_REPEATED();
skamonkey@3743
   294
skamonkey@3743
   295
		if (fieldType == protobuf::FieldDescriptor::CPPTYPE_UINT32)
skamonkey@3743
   296
			msg->GetReflection()->SetUInt32(msg, field, (uint32)value);
skamonkey@3743
   297
		else
skamonkey@3743
   298
			msg->GetReflection()->SetInt32(msg, field, value);
skamonkey@3743
   299
skamonkey@3743
   300
		return true;
skamonkey@3743
   301
	}
skamonkey@3743
   302
skamonkey@3743
   303
	inline bool GetRepeatedInt32OrUnsigned(const char *pszFieldName, int index, int32 *out)
skamonkey@3743
   304
	{
skamonkey@3743
   305
		GETCHECK_FIELD();
skamonkey@3743
   306
		CHECK_FIELD_TYPE2(INT32, UINT32);
skamonkey@3743
   307
		CHECK_FIELD_REPEATED();
skamonkey@3743
   308
		CHECK_REPEATED_ELEMENT(index);
skamonkey@3743
   309
		
skamonkey@3743
   310
		if (fieldType == protobuf::FieldDescriptor::CPPTYPE_UINT32)
skamonkey@3743
   311
			*out = (int32)msg->GetReflection()->GetRepeatedUInt32(*msg, field, index);
skamonkey@3743
   312
		else
skamonkey@3743
   313
			*out = msg->GetReflection()->GetRepeatedInt32(*msg, field, index);
skamonkey@3743
   314
skamonkey@3743
   315
		return true;
skamonkey@3743
   316
	}
skamonkey@3743
   317
skamonkey@3743
   318
	inline bool AddInt32OrUnsigned(const char *pszFieldName, int32 value)
skamonkey@3743
   319
	{
skamonkey@3743
   320
		GETCHECK_FIELD();
skamonkey@3743
   321
		CHECK_FIELD_TYPE2(INT32, UINT32);
skamonkey@3743
   322
		CHECK_FIELD_REPEATED();
skamonkey@3743
   323
skamonkey@3743
   324
		if (fieldType == protobuf::FieldDescriptor::CPPTYPE_UINT32)
skamonkey@3743
   325
			msg->GetReflection()->AddUInt32(msg, field, (uint32)value);
skamonkey@3743
   326
		else
skamonkey@3743
   327
			msg->GetReflection()->AddInt32(msg, field, value);
skamonkey@3743
   328
skamonkey@3743
   329
		return true;
skamonkey@3743
   330
	}
skamonkey@3743
   331
skamonkey@3743
   332
	inline bool GetBool(const char *pszFieldName, bool *out)
skamonkey@3743
   333
	{
skamonkey@3743
   334
		GETCHECK_FIELD();
skamonkey@3743
   335
		CHECK_FIELD_TYPE(BOOL);
skamonkey@3743
   336
		CHECK_FIELD_NOT_REPEATED();
skamonkey@3743
   337
skamonkey@3743
   338
		*out = msg->GetReflection()->GetBool(*msg, field);
skamonkey@3743
   339
		return true;	
skamonkey@3743
   340
	}
skamonkey@3743
   341
skamonkey@3743
   342
	inline bool SetBool(const char *pszFieldName, bool value)
skamonkey@3743
   343
	{
skamonkey@3743
   344
		GETCHECK_FIELD();
skamonkey@3743
   345
		CHECK_FIELD_TYPE(BOOL);
skamonkey@3743
   346
		CHECK_FIELD_NOT_REPEATED();
skamonkey@3743
   347
skamonkey@3743
   348
		msg->GetReflection()->SetBool(msg, field, value);
skamonkey@3743
   349
		return true;
skamonkey@3743
   350
	}
skamonkey@3743
   351
skamonkey@3743
   352
	inline bool GetRepeatedBool(const char *pszFieldName, int index, bool *out)
skamonkey@3743
   353
	{
skamonkey@3743
   354
		GETCHECK_FIELD();
skamonkey@3743
   355
		CHECK_FIELD_TYPE(BOOL);
skamonkey@3743
   356
		CHECK_FIELD_REPEATED();
skamonkey@3743
   357
		CHECK_REPEATED_ELEMENT(index);
skamonkey@3743
   358
		
skamonkey@3743
   359
		*out = msg->GetReflection()->GetRepeatedBool(*msg, field, index);
skamonkey@3743
   360
		return true;
skamonkey@3743
   361
	}
skamonkey@3743
   362
skamonkey@3743
   363
	inline bool AddBool(const char *pszFieldName, bool value)
skamonkey@3743
   364
	{
skamonkey@3743
   365
		GETCHECK_FIELD();
skamonkey@3743
   366
		CHECK_FIELD_TYPE(BOOL);
skamonkey@3743
   367
		CHECK_FIELD_REPEATED();
skamonkey@3743
   368
skamonkey@3743
   369
		msg->GetReflection()->AddBool(msg, field, value);
skamonkey@3743
   370
		return true;
skamonkey@3743
   371
	}
skamonkey@3743
   372
skamonkey@3743
   373
	inline bool GetFloat(const char *pszFieldName, float *out)
skamonkey@3743
   374
	{
skamonkey@3743
   375
		GETCHECK_FIELD();
skamonkey@3743
   376
		CHECK_FIELD_TYPE(FLOAT);
skamonkey@3743
   377
		CHECK_FIELD_NOT_REPEATED();
skamonkey@3743
   378
skamonkey@3743
   379
		*out = msg->GetReflection()->GetFloat(*msg, field);
skamonkey@3743
   380
		return true;	
skamonkey@3743
   381
	}
skamonkey@3743
   382
skamonkey@3743
   383
	inline bool SetFloat(const char *pszFieldName, float value)
skamonkey@3743
   384
	{
skamonkey@3743
   385
		GETCHECK_FIELD();
skamonkey@3743
   386
		CHECK_FIELD_TYPE(FLOAT);
skamonkey@3743
   387
		CHECK_FIELD_NOT_REPEATED();
skamonkey@3743
   388
skamonkey@3743
   389
		msg->GetReflection()->SetFloat(msg, field, value);
skamonkey@3743
   390
		return true;
skamonkey@3743
   391
	}
skamonkey@3743
   392
skamonkey@3743
   393
	inline bool GetRepeatedFloat(const char *pszFieldName, int index, float *out)
skamonkey@3743
   394
	{
skamonkey@3743
   395
		GETCHECK_FIELD();
skamonkey@3743
   396
		CHECK_FIELD_TYPE(FLOAT);
skamonkey@3743
   397
		CHECK_FIELD_REPEATED();
skamonkey@3743
   398
		CHECK_REPEATED_ELEMENT(index);
skamonkey@3743
   399
		
skamonkey@3743
   400
		*out = msg->GetReflection()->GetRepeatedFloat(*msg, field, index);
skamonkey@3743
   401
		return true;
skamonkey@3743
   402
	}
skamonkey@3743
   403
skamonkey@3743
   404
	inline bool AddFloat(const char *pszFieldName, float value)
skamonkey@3743
   405
	{
skamonkey@3743
   406
		GETCHECK_FIELD();
skamonkey@3743
   407
		CHECK_FIELD_TYPE(FLOAT);
skamonkey@3743
   408
		CHECK_FIELD_REPEATED();
skamonkey@3743
   409
skamonkey@3743
   410
		msg->GetReflection()->AddFloat(msg, field, value);
skamonkey@3743
   411
		return true;
skamonkey@3743
   412
	}
skamonkey@3743
   413
skamonkey@3743
   414
	inline bool GetDouble(const char *pszFieldName, double *out)
skamonkey@3743
   415
	{
skamonkey@3743
   416
		GETCHECK_FIELD();
skamonkey@3743
   417
		CHECK_FIELD_TYPE(DOUBLE);
skamonkey@3743
   418
		CHECK_FIELD_NOT_REPEATED();
skamonkey@3743
   419
skamonkey@3743
   420
		*out = msg->GetReflection()->GetDouble(*msg, field);
skamonkey@3743
   421
		return true;	
skamonkey@3743
   422
	}
skamonkey@3743
   423
skamonkey@3743
   424
	inline bool SetDouble(const char *pszFieldName, double value)
skamonkey@3743
   425
	{
skamonkey@3743
   426
		GETCHECK_FIELD();
skamonkey@3743
   427
		CHECK_FIELD_TYPE(DOUBLE);
skamonkey@3743
   428
		CHECK_FIELD_NOT_REPEATED();
skamonkey@3743
   429
skamonkey@3743
   430
		msg->GetReflection()->SetDouble(msg, field, value);
skamonkey@3743
   431
		return true;
skamonkey@3743
   432
	}
skamonkey@3743
   433
skamonkey@3743
   434
	inline bool GetRepeatedDouble(const char *pszFieldName, int index, double *out)
skamonkey@3743
   435
	{
skamonkey@3743
   436
		GETCHECK_FIELD();
skamonkey@3743
   437
		CHECK_FIELD_TYPE(DOUBLE);
skamonkey@3743
   438
		CHECK_FIELD_REPEATED();
skamonkey@3743
   439
		CHECK_REPEATED_ELEMENT(index);
skamonkey@3743
   440
		
skamonkey@3743
   441
		*out = msg->GetReflection()->GetRepeatedDouble(*msg, field, index);
skamonkey@3743
   442
		return true;
skamonkey@3743
   443
	}
skamonkey@3743
   444
skamonkey@3743
   445
	inline bool AddDouble(const char *pszFieldName, double value)
skamonkey@3743
   446
	{
skamonkey@3743
   447
		GETCHECK_FIELD();
skamonkey@3743
   448
		CHECK_FIELD_TYPE(DOUBLE);
skamonkey@3743
   449
		CHECK_FIELD_REPEATED();
skamonkey@3743
   450
skamonkey@3743
   451
		msg->GetReflection()->AddDouble(msg, field, value);
skamonkey@3743
   452
		return true;
skamonkey@3743
   453
	}
skamonkey@3743
   454
skamonkey@3743
   455
	inline bool GetFloatOrDouble(const char *pszFieldName, float *out)
skamonkey@3743
   456
	{
skamonkey@3743
   457
		GETCHECK_FIELD();
skamonkey@3743
   458
		CHECK_FIELD_TYPE2(FLOAT, DOUBLE);
skamonkey@3743
   459
		CHECK_FIELD_NOT_REPEATED();
skamonkey@3743
   460
skamonkey@3743
   461
		if (fieldType == protobuf::FieldDescriptor::CPPTYPE_DOUBLE)
skamonkey@3743
   462
			*out = (float)msg->GetReflection()->GetDouble(*msg, field);
skamonkey@3743
   463
		else
skamonkey@3743
   464
			*out = msg->GetReflection()->GetFloat(*msg, field);
skamonkey@3743
   465
skamonkey@3743
   466
		return true;	
skamonkey@3743
   467
	}
skamonkey@3743
   468
skamonkey@3743
   469
	inline bool SetFloatOrDouble(const char *pszFieldName, float value)
skamonkey@3743
   470
	{
skamonkey@3743
   471
		GETCHECK_FIELD();
skamonkey@3743
   472
		CHECK_FIELD_TYPE2(FLOAT, DOUBLE);
skamonkey@3743
   473
		CHECK_FIELD_NOT_REPEATED();
skamonkey@3743
   474
skamonkey@3743
   475
		if (fieldType == protobuf::FieldDescriptor::CPPTYPE_DOUBLE)
skamonkey@3743
   476
			msg->GetReflection()->SetDouble(msg, field, (double)value);
skamonkey@3743
   477
		else
skamonkey@3743
   478
			msg->GetReflection()->SetFloat(msg, field, value);
skamonkey@3743
   479
skamonkey@3743
   480
		return true;
skamonkey@3743
   481
	}
skamonkey@3743
   482
skamonkey@3743
   483
	inline bool GetRepeatedFloatOrDouble(const char *pszFieldName, int index, float *out)
skamonkey@3743
   484
	{
skamonkey@3743
   485
		GETCHECK_FIELD();
skamonkey@3743
   486
		CHECK_FIELD_TYPE2(FLOAT, DOUBLE);
skamonkey@3743
   487
		CHECK_FIELD_REPEATED();
skamonkey@3743
   488
		CHECK_REPEATED_ELEMENT(index);
skamonkey@3743
   489
		
skamonkey@3743
   490
		if (fieldType == protobuf::FieldDescriptor::CPPTYPE_DOUBLE)
skamonkey@3743
   491
			*out = (float)msg->GetReflection()->GetRepeatedDouble(*msg, field, index);
skamonkey@3743
   492
		else
skamonkey@3743
   493
			*out = msg->GetReflection()->GetRepeatedFloat(*msg, field, index);
skamonkey@3743
   494
skamonkey@3743
   495
		return true;
skamonkey@3743
   496
	}
skamonkey@3743
   497
skamonkey@3743
   498
	inline bool AddFloatOrDouble(const char *pszFieldName, float value)
skamonkey@3743
   499
	{
skamonkey@3743
   500
		GETCHECK_FIELD();
skamonkey@3743
   501
		CHECK_FIELD_TYPE2(FLOAT, DOUBLE);
skamonkey@3743
   502
		CHECK_FIELD_REPEATED();
skamonkey@3743
   503
skamonkey@3743
   504
		if (fieldType == protobuf::FieldDescriptor::CPPTYPE_DOUBLE)
skamonkey@3743
   505
			msg->GetReflection()->AddDouble(msg, field, (double)value);
skamonkey@3743
   506
		else
skamonkey@3743
   507
			msg->GetReflection()->AddFloat(msg, field, value);
skamonkey@3743
   508
skamonkey@3743
   509
		return true;
skamonkey@3743
   510
	}
skamonkey@3743
   511
skamonkey@3743
   512
	inline bool GetString(const char *pszFieldName, char *out, int size)
skamonkey@3743
   513
	{
skamonkey@3743
   514
		GETCHECK_FIELD();
skamonkey@3743
   515
		CHECK_FIELD_TYPE(STRING);
skamonkey@3743
   516
		CHECK_FIELD_NOT_REPEATED();
skamonkey@3743
   517
skamonkey@3743
   518
		std::string scratch;
skamonkey@3746
   519
		strncopy(out, msg->GetReflection()->GetStringReference(*msg, field, &scratch).c_str(), size);
skamonkey@3743
   520
skamonkey@3743
   521
		return true;	
skamonkey@3743
   522
	}
skamonkey@3743
   523
skamonkey@3743
   524
	inline bool SetString(const char *pszFieldName, const char *value)
skamonkey@3743
   525
	{
skamonkey@3743
   526
		GETCHECK_FIELD();
skamonkey@3743
   527
		CHECK_FIELD_TYPE(STRING);
skamonkey@3743
   528
		CHECK_FIELD_NOT_REPEATED();
skamonkey@3743
   529
skamonkey@3743
   530
		msg->GetReflection()->SetString(msg, field, value);
skamonkey@3743
   531
		return true;
skamonkey@3743
   532
	}
skamonkey@3743
   533
skamonkey@3743
   534
	inline bool GetRepeatedString(const char *pszFieldName, int index, char *out, int size)
skamonkey@3743
   535
	{
skamonkey@3743
   536
		GETCHECK_FIELD();
skamonkey@3743
   537
		CHECK_FIELD_TYPE(STRING);
skamonkey@3743
   538
		CHECK_FIELD_REPEATED();
skamonkey@3743
   539
		CHECK_REPEATED_ELEMENT(index);
skamonkey@3743
   540
		
skamonkey@3743
   541
		std::string scratch;
skamonkey@3743
   542
		strncopy(out, msg->GetReflection()->GetRepeatedStringReference(*msg, field, index, &scratch).c_str(), size);
skamonkey@3743
   543
skamonkey@3743
   544
		return true;
skamonkey@3743
   545
	}
skamonkey@3743
   546
skamonkey@3743
   547
	inline bool AddString(const char *pszFieldName, const char *value)
skamonkey@3743
   548
	{
skamonkey@3743
   549
		GETCHECK_FIELD();
skamonkey@3743
   550
		CHECK_FIELD_TYPE(STRING);
skamonkey@3743
   551
		CHECK_FIELD_REPEATED();
skamonkey@3743
   552
skamonkey@3743
   553
		msg->GetReflection()->AddString(msg, field, value);
skamonkey@3743
   554
		return true;
skamonkey@3743
   555
	}
skamonkey@3743
   556
skamonkey@3743
   557
	inline bool GetColor(const char *pszFieldName, Color *out)
skamonkey@3743
   558
	{
skamonkey@3743
   559
		GETCHECK_FIELD();
skamonkey@3743
   560
		CHECK_FIELD_TYPE(MESSAGE);
skamonkey@3743
   561
		CHECK_FIELD_NOT_REPEATED();
skamonkey@3743
   562
skamonkey@3743
   563
		const CMsgRGBA &msgRGBA = (const CMsgRGBA &)msg->GetReflection()->GetMessage(*msg, field);
skamonkey@3743
   564
		out->SetColor(
skamonkey@3743
   565
			msgRGBA.r(),
skamonkey@3743
   566
			msgRGBA.g(),
skamonkey@3743
   567
			msgRGBA.b(),
skamonkey@3743
   568
			msgRGBA.a()
skamonkey@3743
   569
			);
skamonkey@3743
   570
skamonkey@3743
   571
		return true;
skamonkey@3743
   572
	}
skamonkey@3743
   573
skamonkey@3743
   574
	inline bool SetColor(const char *pszFieldName, const Color &value)
skamonkey@3743
   575
	{
skamonkey@3743
   576
		GETCHECK_FIELD();
skamonkey@3743
   577
		CHECK_FIELD_TYPE(MESSAGE);
skamonkey@3743
   578
		CHECK_FIELD_NOT_REPEATED();
skamonkey@3743
   579
skamonkey@3743
   580
		CMsgRGBA *msgRGBA = (CMsgRGBA *)msg->GetReflection()->MutableMessage(msg, field);
skamonkey@3743
   581
		msgRGBA->set_r(value.r());
skamonkey@3743
   582
		msgRGBA->set_g(value.g());
skamonkey@3743
   583
		msgRGBA->set_b(value.b());
skamonkey@3743
   584
		msgRGBA->set_a(value.a());
skamonkey@3743
   585
skamonkey@3743
   586
		return true;
skamonkey@3743
   587
	}
skamonkey@3743
   588
skamonkey@3743
   589
	inline bool GetRepeatedColor(const char *pszFieldName, int index, Color *out)
skamonkey@3743
   590
	{
skamonkey@3743
   591
		GETCHECK_FIELD();
skamonkey@3743
   592
		CHECK_FIELD_TYPE(MESSAGE);
skamonkey@3743
   593
		CHECK_FIELD_REPEATED();
skamonkey@3743
   594
		CHECK_REPEATED_ELEMENT(index);
skamonkey@3743
   595
skamonkey@3743
   596
		const CMsgRGBA &msgRGBA = (const CMsgRGBA &)msg->GetReflection()->GetRepeatedMessage(*msg, field, index);
skamonkey@3743
   597
		out->SetColor(
skamonkey@3743
   598
			msgRGBA.r(),
skamonkey@3743
   599
			msgRGBA.g(),
skamonkey@3743
   600
			msgRGBA.b(),
skamonkey@3743
   601
			msgRGBA.a()
skamonkey@3743
   602
			);
skamonkey@3743
   603
skamonkey@3743
   604
		return true;
skamonkey@3743
   605
	}
skamonkey@3743
   606
skamonkey@3743
   607
	inline bool AddColor(const char *pszFieldName, const Color &value)
skamonkey@3743
   608
	{
skamonkey@3743
   609
		GETCHECK_FIELD();
skamonkey@3743
   610
		CHECK_FIELD_TYPE(MESSAGE);
skamonkey@3743
   611
		CHECK_FIELD_REPEATED();
skamonkey@3743
   612
skamonkey@3743
   613
		CMsgRGBA *msgRGBA = (CMsgRGBA *)msg->GetReflection()->AddMessage(msg, field);
skamonkey@3743
   614
		msgRGBA->set_r(value.r());
skamonkey@3743
   615
		msgRGBA->set_g(value.g());
skamonkey@3743
   616
		msgRGBA->set_b(value.b());
skamonkey@3743
   617
		msgRGBA->set_a(value.a());
skamonkey@3743
   618
skamonkey@3743
   619
		return true;
skamonkey@3743
   620
	}
skamonkey@3743
   621
skamonkey@3743
   622
	inline bool GetVector2D(const char *pszFieldName, Vector2D *out)
skamonkey@3743
   623
	{
skamonkey@3743
   624
		GETCHECK_FIELD();
skamonkey@3743
   625
		CHECK_FIELD_TYPE(MESSAGE);
skamonkey@3743
   626
		CHECK_FIELD_NOT_REPEATED();
skamonkey@3743
   627
skamonkey@3743
   628
		const CMsgVector2D &msgVec2d = (const CMsgVector2D &)msg->GetReflection()->GetMessage(*msg, field);
skamonkey@3743
   629
		out->Init(
skamonkey@3743
   630
			msgVec2d.x(),
skamonkey@3743
   631
			msgVec2d.y()
skamonkey@3743
   632
			);
skamonkey@3743
   633
skamonkey@3743
   634
		return true;
skamonkey@3743
   635
	}
skamonkey@3743
   636
skamonkey@3743
   637
	inline bool SetVector2D(const char *pszFieldName, Vector2D &vec)
skamonkey@3743
   638
	{
skamonkey@3743
   639
		GETCHECK_FIELD();
skamonkey@3743
   640
		CHECK_FIELD_TYPE(MESSAGE);
skamonkey@3743
   641
		CHECK_FIELD_NOT_REPEATED();
skamonkey@3743
   642
skamonkey@3743
   643
		CMsgVector2D *msgVec2d = (CMsgVector2D *)msg->GetReflection()->MutableMessage(msg, field);
skamonkey@3743
   644
		msgVec2d->set_x(vec.x);
skamonkey@3743
   645
		msgVec2d->set_y(vec.y);
skamonkey@3743
   646
skamonkey@3743
   647
		return true;
skamonkey@3743
   648
	}
skamonkey@3743
   649
skamonkey@3743
   650
	inline bool GetRepeatedVector2D(const char *pszFieldName, int index, Vector2D *out)
skamonkey@3743
   651
	{
skamonkey@3743
   652
		GETCHECK_FIELD();
skamonkey@3743
   653
		CHECK_FIELD_TYPE(MESSAGE);
skamonkey@3743
   654
		CHECK_FIELD_REPEATED();
skamonkey@3743
   655
		CHECK_REPEATED_ELEMENT(index);
skamonkey@3743
   656
skamonkey@3743
   657
		const CMsgVector2D &msgVec2d = (const CMsgVector2D &)msg->GetReflection()->GetRepeatedMessage(*msg, field, index);
skamonkey@3743
   658
		out->Init(
skamonkey@3743
   659
			msgVec2d.x(),
skamonkey@3743
   660
			msgVec2d.y()
skamonkey@3743
   661
			);
skamonkey@3743
   662
skamonkey@3743
   663
		return true;
skamonkey@3743
   664
	}
skamonkey@3743
   665
skamonkey@3743
   666
	inline bool AddVector2D(const char *pszFieldName, Vector2D &vec)
skamonkey@3743
   667
	{
skamonkey@3743
   668
		GETCHECK_FIELD();
skamonkey@3743
   669
		CHECK_FIELD_TYPE(MESSAGE);
skamonkey@3743
   670
		CHECK_FIELD_REPEATED();
skamonkey@3743
   671
skamonkey@3743
   672
		CMsgVector2D *msgVec2d = (CMsgVector2D *)msg->GetReflection()->AddMessage(msg, field);
skamonkey@3743
   673
		msgVec2d->set_x(vec.x);
skamonkey@3743
   674
		msgVec2d->set_y(vec.y);
skamonkey@3743
   675
skamonkey@3743
   676
		return true;
skamonkey@3743
   677
	}
skamonkey@3743
   678
skamonkey@3743
   679
	inline bool GetVector(const char *pszFieldName, Vector *out)
skamonkey@3743
   680
	{
skamonkey@3743
   681
		GETCHECK_FIELD();
skamonkey@3743
   682
		CHECK_FIELD_TYPE(MESSAGE);
skamonkey@3743
   683
		CHECK_FIELD_NOT_REPEATED();
skamonkey@3743
   684
skamonkey@3743
   685
		const CMsgVector &msgVec = (const CMsgVector &)msg->GetReflection()->GetMessage(*msg, field);
skamonkey@3743
   686
		out->Init(
skamonkey@3743
   687
			msgVec.x(),
skamonkey@3743
   688
			msgVec.y(),
skamonkey@3743
   689
			msgVec.z()
skamonkey@3743
   690
			);
skamonkey@3743
   691
skamonkey@3743
   692
		return true;
skamonkey@3743
   693
	}
skamonkey@3743
   694
skamonkey@3743
   695
	inline bool SetVector(const char *pszFieldName, Vector &vec)
skamonkey@3743
   696
	{
skamonkey@3743
   697
		GETCHECK_FIELD();
skamonkey@3743
   698
		CHECK_FIELD_TYPE(MESSAGE);
skamonkey@3743
   699
		CHECK_FIELD_NOT_REPEATED();
skamonkey@3743
   700
skamonkey@3743
   701
		CMsgVector *msgVec = (CMsgVector *)msg->GetReflection()->MutableMessage(msg, field);
skamonkey@3743
   702
		msgVec->set_x(vec.x);
skamonkey@3743
   703
		msgVec->set_y(vec.y);
skamonkey@3743
   704
		msgVec->set_z(vec.z);
skamonkey@3743
   705
skamonkey@3743
   706
		return true;
skamonkey@3743
   707
	}
skamonkey@3743
   708
skamonkey@3743
   709
	inline bool GetRepeatedVector(const char *pszFieldName, int index, Vector *out)
skamonkey@3743
   710
	{
skamonkey@3743
   711
		GETCHECK_FIELD();
skamonkey@3743
   712
		CHECK_FIELD_TYPE(MESSAGE);
skamonkey@3743
   713
		CHECK_FIELD_REPEATED();
skamonkey@3743
   714
		CHECK_REPEATED_ELEMENT(index);
skamonkey@3743
   715
skamonkey@3743
   716
		const CMsgVector &msgVec = (const CMsgVector &)msg->GetReflection()->GetRepeatedMessage(*msg, field, index);
skamonkey@3743
   717
		out->Init(
skamonkey@3743
   718
			msgVec.x(),
skamonkey@3743
   719
			msgVec.y(),
skamonkey@3743
   720
			msgVec.z()
skamonkey@3743
   721
			);
skamonkey@3743
   722
skamonkey@3743
   723
		return true;
skamonkey@3743
   724
	}
skamonkey@3743
   725
skamonkey@3743
   726
	inline bool AddVector(const char *pszFieldName, Vector &vec)
skamonkey@3743
   727
	{
skamonkey@3743
   728
		GETCHECK_FIELD();
skamonkey@3743
   729
		CHECK_FIELD_TYPE(MESSAGE);
skamonkey@3743
   730
		CHECK_FIELD_REPEATED();
skamonkey@3743
   731
skamonkey@3743
   732
		CMsgVector *msgVec = (CMsgVector *)msg->GetReflection()->AddMessage(msg, field);
skamonkey@3743
   733
		msgVec->set_x(vec.x);
skamonkey@3743
   734
		msgVec->set_y(vec.y);
skamonkey@3743
   735
		msgVec->set_z(vec.z);
skamonkey@3743
   736
skamonkey@3743
   737
		return true;
skamonkey@3743
   738
	}
skamonkey@3743
   739
skamonkey@3743
   740
	inline bool GetQAngle(const char *pszFieldName, QAngle *out)
skamonkey@3743
   741
	{
skamonkey@3743
   742
		GETCHECK_FIELD();
skamonkey@3743
   743
		CHECK_FIELD_TYPE(MESSAGE);
skamonkey@3743
   744
		CHECK_FIELD_NOT_REPEATED();
skamonkey@3743
   745
skamonkey@3743
   746
		const CMsgQAngle &msgAng = (const CMsgQAngle &)msg->GetReflection()->GetMessage(*msg, field);
skamonkey@3743
   747
		out->Init(
skamonkey@3743
   748
			msgAng.x(),
skamonkey@3743
   749
			msgAng.y(),
skamonkey@3743
   750
			msgAng.z()
skamonkey@3743
   751
			);
skamonkey@3743
   752
skamonkey@3743
   753
		return true;
skamonkey@3743
   754
	}
skamonkey@3743
   755
skamonkey@3743
   756
	inline bool SetQAngle(const char *pszFieldName, QAngle &vec)
skamonkey@3743
   757
	{
skamonkey@3743
   758
		GETCHECK_FIELD();
skamonkey@3743
   759
		CHECK_FIELD_TYPE(MESSAGE);
skamonkey@3743
   760
		CHECK_FIELD_NOT_REPEATED();
skamonkey@3743
   761
skamonkey@3743
   762
		CMsgQAngle *msgAng = (CMsgQAngle *)msg->GetReflection()->MutableMessage(msg, field);
skamonkey@3743
   763
		msgAng->set_x(vec.x);
skamonkey@3743
   764
		msgAng->set_y(vec.y);
skamonkey@3743
   765
		msgAng->set_z(vec.z);
skamonkey@3743
   766
skamonkey@3743
   767
		return true;
skamonkey@3743
   768
	}
skamonkey@3743
   769
skamonkey@3743
   770
	inline bool GetRepeatedQAngle(const char *pszFieldName, int index, QAngle *out)
skamonkey@3743
   771
	{
skamonkey@3743
   772
		GETCHECK_FIELD();
skamonkey@3743
   773
		CHECK_FIELD_TYPE(MESSAGE);
skamonkey@3743
   774
		CHECK_FIELD_REPEATED();
skamonkey@3743
   775
		CHECK_REPEATED_ELEMENT(index);
skamonkey@3743
   776
skamonkey@3743
   777
		const CMsgQAngle &msgAng = (const CMsgQAngle &)msg->GetReflection()->GetRepeatedMessage(*msg, field, index);
skamonkey@3743
   778
		out->Init(
skamonkey@3743
   779
			msgAng.x(),
skamonkey@3743
   780
			msgAng.y(),
skamonkey@3743
   781
			msgAng.z()
skamonkey@3743
   782
			);
skamonkey@3743
   783
skamonkey@3743
   784
		return true;
skamonkey@3743
   785
	}
skamonkey@3743
   786
skamonkey@3743
   787
	inline bool AddQAngle(const char *pszFieldName, QAngle &vec)
skamonkey@3743
   788
	{
skamonkey@3743
   789
		GETCHECK_FIELD();
skamonkey@3743
   790
		CHECK_FIELD_TYPE(MESSAGE);
skamonkey@3743
   791
		CHECK_FIELD_REPEATED();
skamonkey@3743
   792
skamonkey@3743
   793
		CMsgQAngle *msgAng = (CMsgQAngle *)msg->GetReflection()->AddMessage(msg, field);
skamonkey@3743
   794
		msgAng->set_x(vec.x);
skamonkey@3743
   795
		msgAng->set_y(vec.y);
skamonkey@3743
   796
		msgAng->set_z(vec.z);
skamonkey@3743
   797
skamonkey@3743
   798
		return true;
skamonkey@3743
   799
	}
skamonkey@3743
   800
skamonkey@3743
   801
	inline bool GetMessage(const char *pszFieldName, protobuf::Message **message)
skamonkey@3743
   802
	{
skamonkey@3743
   803
		GETCHECK_FIELD();
skamonkey@3743
   804
		CHECK_FIELD_TYPE(MESSAGE);
skamonkey@3743
   805
		CHECK_FIELD_NOT_REPEATED();
skamonkey@3743
   806
skamonkey@3743
   807
		*message = msg->GetReflection()->MutableMessage(msg, field);
skamonkey@3743
   808
skamonkey@3743
   809
		return true;
skamonkey@3743
   810
	}
skamonkey@3743
   811
skamonkey@3743
   812
	inline bool GetRepeatedMessage(const char *pszFieldName, int index, const protobuf::Message **message)
skamonkey@3743
   813
	{
skamonkey@3743
   814
		GETCHECK_FIELD();
skamonkey@3743
   815
		CHECK_FIELD_TYPE(MESSAGE);
skamonkey@3743
   816
		CHECK_FIELD_REPEATED();
skamonkey@3743
   817
		CHECK_REPEATED_ELEMENT(index);
skamonkey@3743
   818
skamonkey@3743
   819
		const protobuf::Message *m = &msg->GetReflection()->GetRepeatedMessage(*msg, field, index);
skamonkey@3743
   820
		*message = m;
skamonkey@3743
   821
skamonkey@3743
   822
		return true;
skamonkey@3743
   823
	}
skamonkey@3743
   824
skamonkey@3743
   825
	inline bool AddMessage(const char *pszFieldName, protobuf::Message **message)
skamonkey@3743
   826
	{
skamonkey@3743
   827
		GETCHECK_FIELD();
skamonkey@3743
   828
		CHECK_FIELD_TYPE(MESSAGE);
skamonkey@3743
   829
		CHECK_FIELD_REPEATED();
skamonkey@3743
   830
skamonkey@3743
   831
		*message = msg->GetReflection()->AddMessage(msg, field);
skamonkey@3743
   832
skamonkey@3743
   833
		return true;
skamonkey@3743
   834
	}
skamonkey@3743
   835
skamonkey@3743
   836
	inline int GetRepeatedFieldCount(const char *pszFieldName)
skamonkey@3743
   837
	{
skamonkey@3743
   838
		const protobuf::FieldDescriptor *field = msg->GetDescriptor()->FindFieldByName(pszFieldName); \
skamonkey@3743
   839
		if (!field)
skamonkey@3743
   840
			return -1;
skamonkey@3743
   841
skamonkey@3743
   842
		if (field->label() != protobuf::FieldDescriptor::LABEL_REPEATED)
skamonkey@3743
   843
			return -1;
skamonkey@3743
   844
skamonkey@3743
   845
		return msg->GetReflection()->FieldSize(*msg, field);
skamonkey@3743
   846
	}
skamonkey@3743
   847
skamonkey@3743
   848
private:
skamonkey@3743
   849
	protobuf::Message *msg;
skamonkey@3743
   850
	PBHandleList childHandles;
skamonkey@3743
   851
};
skamonkey@3743
   852
skamonkey@3743
   853
#endif // _INCLUDE_SOURCEMOD_SMPBMESSAGE_H_