core/UserMessages.cpp
author Scott Ehlert <ds@alliedmods.net>
Wed Aug 15 06:19:30 2007 +0000 (2007-08-15)
changeset 1330 ab94316bb52b
parent 1250 8241c207b514
child 1690 7cc4f79a0416
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@592
     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
 * =============================================================================
ds@653
     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>.
ds@653
    28
 *
ds@653
    29
 * Version: $Id$
ds@653
    30
 */
dvander@592
    31
dvander@592
    32
#include "UserMessages.h"
ds@765
    33
#include "sm_stringutil.h"
dvander@592
    34
dvander@616
    35
UserMessages g_UserMsgs;
dvander@592
    36
dvander@592
    37
SH_DECL_HOOK2(IVEngineServer, UserMessageBegin, SH_NOATTRIB, 0, bf_write *, IRecipientFilter *, int);
dvander@592
    38
SH_DECL_HOOK0_void(IVEngineServer, MessageEnd, SH_NOATTRIB, 0);
dvander@592
    39
dvander@616
    40
UserMessages::UserMessages() : m_InterceptBuffer(m_pBase, 2500)
dvander@592
    41
{
dvander@592
    42
	m_Names = sm_trie_create();
dvander@592
    43
	m_HookCount = 0;
dvander@592
    44
	m_InExec = false;
dvander@592
    45
	m_InHook = false;
dvander@592
    46
	m_CurFlags = 0;
dvander@592
    47
	m_CurId = INVALID_MESSAGE_ID;
dvander@592
    48
}
dvander@592
    49
dvander@616
    50
UserMessages::~UserMessages()
dvander@592
    51
{
dvander@592
    52
	sm_trie_destroy(m_Names);
faluco@641
    53
faluco@641
    54
	CStack<ListenerInfo *>::iterator iter;
faluco@641
    55
	for (iter=m_FreeListeners.begin(); iter!=m_FreeListeners.end(); iter++)
faluco@641
    56
	{
faluco@641
    57
		delete (*iter);
faluco@641
    58
	}
faluco@641
    59
	m_FreeListeners.popall();
dvander@592
    60
}
dvander@592
    61
ds@765
    62
void UserMessages::OnSourceModStartup(bool late)
ds@765
    63
{
ds@765
    64
	/* -1 means SourceMM was unable to get the user message list */
ds@765
    65
	m_FallbackSearch = (g_SMAPI->GetUserMessageCount() == -1);
ds@765
    66
}
ds@765
    67
dvander@616
    68
void UserMessages::OnSourceModAllInitialized()
dvander@592
    69
{
dvander@592
    70
	g_ShareSys.AddInterface(NULL, this);
dvander@592
    71
}
dvander@592
    72
dvander@616
    73
void UserMessages::OnSourceModAllShutdown()
dvander@592
    74
{
dvander@592
    75
	if (m_HookCount)
dvander@592
    76
	{
dvander@616
    77
		SH_REMOVE_HOOK_MEMFUNC(IVEngineServer, UserMessageBegin, engine, this, &UserMessages::OnStartMessage_Pre, false);
dvander@616
    78
		SH_REMOVE_HOOK_MEMFUNC(IVEngineServer, UserMessageBegin, engine, this, &UserMessages::OnStartMessage_Post, true);
dvander@616
    79
		SH_REMOVE_HOOK_MEMFUNC(IVEngineServer, MessageEnd, engine, this, &UserMessages::OnMessageEnd_Pre, false);
dvander@616
    80
		SH_REMOVE_HOOK_MEMFUNC(IVEngineServer, MessageEnd, engine, this, &UserMessages::OnMessageEnd_Post, true);
dvander@592
    81
	}
dvander@592
    82
	m_HookCount = 0;
dvander@592
    83
}
dvander@592
    84
dvander@616
    85
int UserMessages::GetMessageIndex(const char *msg)
dvander@592
    86
{
dvander@592
    87
	int msgid;
ds@698
    88
dvander@592
    89
	if (!sm_trie_retrieve(m_Names, msg, reinterpret_cast<void **>(&msgid)))
dvander@592
    90
	{
ds@765
    91
		if (m_FallbackSearch)
ds@765
    92
		{
ds@765
    93
			char msgbuf[64];
ds@765
    94
			int size;
ds@765
    95
			msgid = 0;
ds@765
    96
ds@765
    97
			while (gamedll->GetUserMessageInfo(msgid, msgbuf, sizeof(msgbuf), size))
ds@765
    98
			{
ds@765
    99
				if (strcmp(msgbuf, msg) == 0)
ds@765
   100
				{
ds@765
   101
					sm_trie_insert(m_Names, msg, reinterpret_cast<void *>(msgid));
ds@765
   102
					return msgid;
ds@765
   103
				}
ds@765
   104
				msgid++;
ds@765
   105
			}
ds@765
   106
		}
ds@765
   107
ds@698
   108
		msgid = g_SMAPI->FindUserMessage(msg);
dvander@592
   109
ds@698
   110
		if (msgid != INVALID_MESSAGE_ID)
dvander@592
   111
		{
ds@698
   112
			sm_trie_insert(m_Names, msg, reinterpret_cast<void *>(msgid));
dvander@592
   113
		}
dvander@592
   114
	}
dvander@592
   115
dvander@592
   116
	return msgid;
dvander@592
   117
}
dvander@592
   118
ds@765
   119
bool UserMessages::GetMessageName(int msgid, char *buffer, size_t maxlength) const
ds@765
   120
{
ds@765
   121
	if (m_FallbackSearch)
ds@765
   122
	{
ds@765
   123
		int size;
ds@765
   124
		return gamedll->GetUserMessageInfo(msgid, buffer, maxlength, size);
ds@765
   125
	}
ds@766
   126
ds@765
   127
	const char *msg = g_SMAPI->GetUserMessage(msgid);
ds@765
   128
ds@765
   129
	if (msg)
ds@765
   130
	{
ds@765
   131
		strncopy(buffer, msg, maxlength);
ds@765
   132
		return true;
ds@765
   133
	}
ds@765
   134
ds@765
   135
	return false;
ds@765
   136
}
ds@765
   137
dvander@616
   138
bf_write *UserMessages::StartMessage(int msg_id, cell_t players[], unsigned int playersNum, int flags)
dvander@592
   139
{
dvander@592
   140
	bf_write *buffer;
faluco@593
   141
faluco@593
   142
	if (m_InExec || m_InHook)
dvander@592
   143
	{
dvander@592
   144
		return NULL;
dvander@592
   145
	}
dvander@592
   146
	if (msg_id < 0 || msg_id >= 255)
dvander@592
   147
	{
dvander@592
   148
		return NULL;
dvander@592
   149
	}
dvander@592
   150
faluco@593
   151
	m_CellRecFilter.Initialize(players, playersNum);
dvander@592
   152
dvander@592
   153
	m_CurFlags = flags;
dvander@592
   154
	if (m_CurFlags & USERMSG_INITMSG)
dvander@592
   155
	{
faluco@593
   156
		m_CellRecFilter.SetToInit(true);
dvander@592
   157
	}
dvander@592
   158
	if (m_CurFlags & USERMSG_RELIABLE)
dvander@592
   159
	{
faluco@593
   160
		m_CellRecFilter.SetToReliable(true);
dvander@592
   161
	}
dvander@592
   162
dvander@592
   163
	m_InExec = true;
dvander@592
   164
faluco@1250
   165
	if (m_CurFlags & USERMSG_BLOCKHOOKS)
dvander@592
   166
	{
faluco@1250
   167
		buffer = ENGINE_CALL(UserMessageBegin)(static_cast<IRecipientFilter *>(&m_CellRecFilter), msg_id);
faluco@1250
   168
	} else {
dvander@592
   169
		buffer = engine->UserMessageBegin(static_cast<IRecipientFilter *>(&m_CellRecFilter), msg_id);
dvander@592
   170
	}
dvander@592
   171
dvander@592
   172
	return buffer;
dvander@592
   173
}
dvander@592
   174
dvander@616
   175
bool UserMessages::EndMessage()
dvander@592
   176
{
dvander@592
   177
	if (!m_InExec)
dvander@592
   178
	{
dvander@592
   179
		return false;
dvander@592
   180
	}
dvander@592
   181
faluco@1250
   182
	if (m_CurFlags & USERMSG_BLOCKHOOKS)
dvander@592
   183
	{
faluco@1250
   184
		ENGINE_CALL(MessageEnd)();
faluco@1250
   185
	} else {
dvander@592
   186
		engine->MessageEnd();
dvander@592
   187
	}
dvander@592
   188
dvander@592
   189
	m_InExec = false;
dvander@592
   190
	m_CurFlags = 0;
faluco@593
   191
	m_CellRecFilter.Reset();
dvander@592
   192
dvander@592
   193
	return true;
dvander@592
   194
}
dvander@592
   195
dvander@616
   196
bool UserMessages::HookUserMessage(int msg_id, IUserMessageListener *pListener, bool intercept)
dvander@592
   197
{
dvander@592
   198
	if (msg_id < 0 || msg_id >= 255)
dvander@592
   199
	{
dvander@592
   200
		return false;
dvander@592
   201
	}
dvander@592
   202
faluco@593
   203
	ListenerInfo *pInfo;
faluco@593
   204
	if (m_FreeListeners.empty())
faluco@593
   205
	{
faluco@593
   206
		pInfo = new ListenerInfo;
faluco@593
   207
	} else {
faluco@593
   208
		pInfo = m_FreeListeners.front();
faluco@593
   209
		m_FreeListeners.pop();
faluco@593
   210
	}
faluco@593
   211
faluco@593
   212
	pInfo->Callback = pListener;
faluco@593
   213
	pInfo->IsHooked = false;
faluco@593
   214
	pInfo->KillMe = false;
faluco@593
   215
dvander@592
   216
	if (!m_HookCount++)
dvander@592
   217
	{
dvander@616
   218
		SH_ADD_HOOK_MEMFUNC(IVEngineServer, UserMessageBegin, engine, this, &UserMessages::OnStartMessage_Pre, false);
dvander@616
   219
		SH_ADD_HOOK_MEMFUNC(IVEngineServer, UserMessageBegin, engine, this, &UserMessages::OnStartMessage_Post, true);
dvander@616
   220
		SH_ADD_HOOK_MEMFUNC(IVEngineServer, MessageEnd, engine, this, &UserMessages::OnMessageEnd_Pre, false);
dvander@616
   221
		SH_ADD_HOOK_MEMFUNC(IVEngineServer, MessageEnd, engine, this, &UserMessages::OnMessageEnd_Post, true);
dvander@592
   222
	}
dvander@592
   223
dvander@592
   224
	if (intercept)
dvander@592
   225
	{
faluco@593
   226
		m_msgIntercepts[msg_id].push_back(pInfo);
dvander@592
   227
	} else {
faluco@593
   228
		m_msgHooks[msg_id].push_back(pInfo);
dvander@592
   229
	}
dvander@592
   230
dvander@592
   231
	return true;
dvander@592
   232
}
dvander@592
   233
dvander@616
   234
bool UserMessages::UnhookUserMessage(int msg_id, IUserMessageListener *pListener, bool intercept)
faluco@593
   235
{	
faluco@593
   236
	MsgList *pList;
dvander@592
   237
	MsgIter iter;
faluco@593
   238
	ListenerInfo *pInfo;
dvander@592
   239
	bool deleted = false;
dvander@592
   240
dvander@592
   241
	if (msg_id < 0 || msg_id >= 255)
dvander@592
   242
	{
dvander@592
   243
		return false;
dvander@592
   244
	}
dvander@592
   245
faluco@593
   246
	pList = (intercept) ? &m_msgIntercepts[msg_id] : &m_msgHooks[msg_id];
faluco@593
   247
	for (iter=pList->begin(); iter!=pList->end(); iter++)
dvander@592
   248
	{
faluco@593
   249
		pInfo = (*iter);
faluco@593
   250
		if (pInfo->Callback == pListener)
dvander@592
   251
		{
faluco@593
   252
			if (pInfo->IsHooked)
faluco@593
   253
			{
faluco@593
   254
				pInfo->KillMe = true;
faluco@593
   255
				return true;
faluco@593
   256
			}
faluco@593
   257
			pList->erase(iter);
dvander@592
   258
			deleted = true;
dvander@592
   259
			break;
dvander@592
   260
		}
dvander@592
   261
	}
dvander@592
   262
faluco@593
   263
	if (deleted)
faluco@593
   264
	{
faluco@593
   265
		_DecRefCounter();
faluco@593
   266
	}
faluco@593
   267
faluco@593
   268
	return deleted;
faluco@593
   269
}
faluco@593
   270
dvander@616
   271
void UserMessages::_DecRefCounter()
faluco@593
   272
{
faluco@593
   273
	if (--m_HookCount == 0)
dvander@592
   274
	{
dvander@616
   275
		SH_REMOVE_HOOK_MEMFUNC(IVEngineServer, UserMessageBegin, engine, this, &UserMessages::OnStartMessage_Pre, false);
dvander@616
   276
		SH_REMOVE_HOOK_MEMFUNC(IVEngineServer, UserMessageBegin, engine, this, &UserMessages::OnStartMessage_Post, true);
dvander@616
   277
		SH_REMOVE_HOOK_MEMFUNC(IVEngineServer, MessageEnd, engine, this, &UserMessages::OnMessageEnd_Pre, false);
dvander@616
   278
		SH_REMOVE_HOOK_MEMFUNC(IVEngineServer, MessageEnd, engine, this, &UserMessages::OnMessageEnd_Post, true);
dvander@592
   279
	}
dvander@592
   280
}
dvander@592
   281
dvander@616
   282
bf_write *UserMessages::OnStartMessage_Pre(IRecipientFilter *filter, int msg_type)
dvander@592
   283
{
dvander@592
   284
	bool is_intercept_empty = m_msgIntercepts[msg_type].empty();
dvander@592
   285
	bool is_hook_empty = m_msgHooks[msg_type].empty();
dvander@592
   286
faluco@593
   287
	if ((is_intercept_empty && is_hook_empty)
faluco@1250
   288
		|| (m_InExec && (m_CurFlags & USERMSG_BLOCKHOOKS)))
dvander@592
   289
	{
dvander@592
   290
		m_InHook = false;
dvander@592
   291
		RETURN_META_VALUE(MRES_IGNORED, NULL);
dvander@592
   292
	}
dvander@592
   293
dvander@592
   294
	m_CurId = msg_type;
dvander@592
   295
	m_CurRecFilter = filter;
dvander@592
   296
	m_InHook = true;
faluco@597
   297
	m_BlockEndPost = false;
dvander@592
   298
dvander@592
   299
	if (!is_intercept_empty)
dvander@592
   300
	{
faluco@593
   301
		m_InterceptBuffer.Reset();
dvander@592
   302
		RETURN_META_VALUE(MRES_SUPERCEDE, &m_InterceptBuffer);
dvander@592
   303
	}
dvander@592
   304
dvander@592
   305
	RETURN_META_VALUE(MRES_IGNORED, NULL);
dvander@592
   306
}
dvander@592
   307
dvander@616
   308
bf_write *UserMessages::OnStartMessage_Post(IRecipientFilter *filter, int msg_type)
dvander@592
   309
{
dvander@592
   310
	if (!m_InHook)
dvander@592
   311
	{
dvander@592
   312
		RETURN_META_VALUE(MRES_IGNORED, NULL);
dvander@592
   313
	}
dvander@592
   314
dvander@592
   315
	m_OrigBuffer = META_RESULT_ORIG_RET(bf_write *);
dvander@592
   316
dvander@592
   317
	RETURN_META_VALUE(MRES_IGNORED, NULL);
dvander@592
   318
}
dvander@592
   319
dvander@616
   320
void UserMessages::OnMessageEnd_Post()
dvander@592
   321
{
faluco@597
   322
	if (!m_InHook || m_BlockEndPost)
dvander@592
   323
	{
dvander@592
   324
		RETURN_META(MRES_IGNORED);
dvander@592
   325
	}
dvander@592
   326
faluco@593
   327
	MsgList *pList;
dvander@592
   328
	MsgIter iter;
faluco@593
   329
	ListenerInfo *pInfo;
faluco@593
   330
faluco@593
   331
	pList = &m_msgIntercepts[m_CurId];
faluco@593
   332
	for (iter=pList->begin(); iter!=pList->end(); )
faluco@593
   333
	{
faluco@593
   334
		pInfo = (*iter);
faluco@593
   335
		pInfo->IsHooked = true;
faluco@593
   336
		pInfo->Callback->OnUserMessageSent(m_CurId);
dvander@592
   337
faluco@593
   338
		if (pInfo->KillMe)
faluco@593
   339
		{
faluco@593
   340
			iter = pList->erase(iter);
faluco@593
   341
			m_FreeListeners.push(pInfo);
faluco@593
   342
			_DecRefCounter();
faluco@593
   343
			continue;
faluco@593
   344
		}
faluco@593
   345
faluco@593
   346
		pInfo->IsHooked = false;
faluco@593
   347
		iter++;
dvander@592
   348
	}
dvander@592
   349
dvander@1132
   350
	m_InHook = false;
dvander@1132
   351
faluco@593
   352
	pList = &m_msgHooks[m_CurId];
faluco@594
   353
	for (iter=pList->begin(); iter!=pList->end(); )
dvander@592
   354
	{
faluco@593
   355
		pInfo = (*iter);
faluco@594
   356
		pInfo->IsHooked = true;
faluco@593
   357
		pInfo->Callback->OnUserMessageSent(m_CurId);
faluco@593
   358
faluco@593
   359
		if (pInfo->KillMe)
faluco@593
   360
		{
faluco@593
   361
			iter = pList->erase(iter);
faluco@593
   362
			m_FreeListeners.push(pInfo);
faluco@593
   363
			_DecRefCounter();
faluco@593
   364
			continue;
faluco@593
   365
		}
faluco@593
   366
faluco@593
   367
		pInfo->IsHooked = false;
faluco@593
   368
		iter++;
dvander@592
   369
	}
dvander@592
   370
}
dvander@592
   371
dvander@616
   372
void UserMessages::OnMessageEnd_Pre()
dvander@592
   373
{
dvander@592
   374
	if (!m_InHook)
dvander@592
   375
	{
dvander@592
   376
		RETURN_META(MRES_IGNORED);
dvander@592
   377
	}
dvander@592
   378
faluco@593
   379
	MsgList *pList;
dvander@592
   380
	MsgIter iter;
faluco@593
   381
	ListenerInfo *pInfo;
faluco@593
   382
dvander@592
   383
	ResultType res;
dvander@592
   384
	bool intercepted = false;
dvander@592
   385
	bool handled = false;
dvander@592
   386
faluco@593
   387
	pList = &m_msgIntercepts[m_CurId];
faluco@593
   388
	for (iter=pList->begin(); iter!=pList->end(); )
dvander@592
   389
	{
faluco@593
   390
		pInfo = (*iter);
faluco@593
   391
		pInfo->IsHooked = true;
faluco@593
   392
		res = pInfo->Callback->InterceptUserMessage(m_CurId, &m_InterceptBuffer, m_CurRecFilter);
faluco@593
   393
faluco@597
   394
		intercepted = true;
faluco@597
   395
faluco@593
   396
		switch (res)
dvander@592
   397
		{
faluco@593
   398
		case Pl_Stop:
faluco@593
   399
			{
faluco@593
   400
				if (pInfo->KillMe)
faluco@593
   401
				{
faluco@593
   402
					pList->erase(iter);
faluco@593
   403
					m_FreeListeners.push(pInfo);
faluco@593
   404
					_DecRefCounter();
faluco@593
   405
					goto supercede;
faluco@593
   406
				}
faluco@593
   407
				pInfo->IsHooked = false;
faluco@593
   408
				goto supercede;
faluco@593
   409
			}
faluco@593
   410
		case Pl_Handled:
faluco@593
   411
			{
faluco@593
   412
				handled = true;
faluco@593
   413
				if (pInfo->KillMe)
faluco@593
   414
				{
faluco@593
   415
					iter = pList->erase(iter);
faluco@593
   416
					m_FreeListeners.push(pInfo);
faluco@593
   417
					_DecRefCounter();
faluco@593
   418
					continue;
faluco@593
   419
				}
faluco@593
   420
				break;
faluco@593
   421
			}
faluco@593
   422
		default:
faluco@593
   423
			{
faluco@593
   424
				if (pInfo->KillMe)
faluco@593
   425
				{
faluco@593
   426
					iter = pList->erase(iter);
faluco@593
   427
					m_FreeListeners.push(pInfo);
faluco@593
   428
					_DecRefCounter();
faluco@593
   429
					continue;
faluco@593
   430
				}
faluco@597
   431
				break;
faluco@593
   432
			}
dvander@592
   433
		}
faluco@593
   434
		pInfo->IsHooked = false;
faluco@593
   435
		iter++;
dvander@592
   436
	}
dvander@592
   437
dvander@592
   438
	if (handled)
dvander@592
   439
	{
dvander@592
   440
		goto supercede;
dvander@592
   441
	}
dvander@592
   442
dvander@592
   443
	if (intercepted)
dvander@592
   444
	{
faluco@593
   445
		bf_write *engine_bfw;
faluco@593
   446
dvander@592
   447
		engine_bfw = ENGINE_CALL(UserMessageBegin)(m_CurRecFilter, m_CurId);
dvander@592
   448
		m_ReadBuffer.StartReading(m_InterceptBuffer.GetBasePointer(), m_InterceptBuffer.GetNumBytesWritten());
dvander@592
   449
		engine_bfw->WriteBitsFromBuffer(&m_ReadBuffer, m_InterceptBuffer.GetNumBitsWritten());
dvander@592
   450
		ENGINE_CALL(MessageEnd)();
dvander@592
   451
	}
dvander@592
   452
faluco@593
   453
	pList = &m_msgHooks[m_CurId];
faluco@593
   454
	for (iter=pList->begin(); iter!=pList->end(); )
dvander@592
   455
	{
faluco@593
   456
		pInfo = (*iter);
faluco@593
   457
		pInfo->IsHooked = true;
faluco@593
   458
		pInfo->Callback->OnUserMessage(m_CurId, m_OrigBuffer, m_CurRecFilter);
faluco@593
   459
faluco@593
   460
		if (pInfo->KillMe)
faluco@593
   461
		{
faluco@593
   462
			iter = pList->erase(iter);
faluco@593
   463
			m_FreeListeners.push(pInfo);
faluco@593
   464
			_DecRefCounter();
faluco@593
   465
			continue;
faluco@593
   466
		}
faluco@593
   467
faluco@594
   468
		pInfo->IsHooked = false;
faluco@593
   469
		iter++;
dvander@592
   470
	}
dvander@592
   471
faluco@597
   472
	RETURN_META((intercepted) ? MRES_SUPERCEDE : MRES_IGNORED);
dvander@592
   473
supercede:
faluco@593
   474
	m_InHook = false;
faluco@597
   475
	m_BlockEndPost = true;
dvander@592
   476
	RETURN_META(MRES_SUPERCEDE);
dvander@592
   477
}