void
SurfaceStream_TripleBuffer::SurrenderSurfaces(SharedSurface*& producer,
                                              SharedSurface*& consumer)
{
    mIsAlive = false;

    producer = Surrender(mProducer);
    consumer = Surrender(mConsumer);

    if (!consumer)
        consumer = Surrender(mStaging);
}
void CGuildWarManager::NetworkMsgParse( BYTE Protocol, void* pMsg )
{
	switch( Protocol )
	{
	case MP_GUILD_WAR_NACK:
		{
			MSG_BYTE* pmsg = (MSG_BYTE*)pMsg;

			CObject* object = g_pUserTable->FindUser( pmsg->dwObjectID );
			
			if( object )
			{
				object->SendMsg( pmsg, sizeof( MSG_BYTE ) );
			}

			break;
		}
	case MP_GUILD_WAR_DECLARE:
		{
			Declare( pMsg );
			break;
		}
	case MP_GUILD_WAR_DECLARE_NACK:
		{
			break;
		}
	case MP_GUILD_WAR_DECLARE_ACCEPT:
		{
			DeclareAccept( pMsg );
			break;
		}
	case MP_GUILD_WAR_DECLARE_DENY:
		{
			DeclareDeny( pMsg );
			break;
		}
	case MP_GUILD_WAR_DECLARE_DENY_NOTIFY_TOMAP:
		{
			DeclareDenyNotifyToMap( pMsg );
			break;
		}
	case MP_GUILD_WAR_START:
		{
			break;
		}
	case MP_GUILD_WAR_START_NOTIFY_TOMAP:
		{
			StartNotifyToMap( pMsg );
			break;
		}
	case MP_GUILD_WAR_PROC:
		{
			break;
		}
	case MP_GUILD_WAR_END:
		{
			break;
		}
	case MP_GUILD_WAR_END_NOTIFY_TOMAP:
		{
			MSG_DWORD2* pmsg = (MSG_DWORD2*)pMsg;

			DWORD dwGuildIdxWinner = pmsg->dwData1;
			DWORD dwGuildIdxLoser = pmsg->dwData2;
			if( dwGuildIdxWinner == 0 || dwGuildIdxLoser == 0 )	return;

			CGuild* pGuildWinner = GUILDMGR->GetGuild( dwGuildIdxWinner );
			CGuild* pGuildLoser = GUILDMGR->GetGuild( dwGuildIdxLoser );

			if( pGuildWinner == NULL || pGuildLoser == NULL )	return;

			MSG_DWORD2 Msg;
			Msg.Category = MP_GUILD_WAR;
			Msg.Protocol = MP_GUILD_WAR_END;

			// send guildwinner
			Msg.dwData1 = 1;	// 0 = lose, 1 = win
			Msg.dwData2 = dwGuildIdxLoser; 
			pGuildWinner->SendMsgToAll( &Msg, sizeof(Msg) );

			// send guildloser
			Msg.dwData1 = 0;
			Msg.dwData2 = dwGuildIdxWinner; 
			pGuildLoser->SendMsgToAll( &Msg, sizeof(Msg) );

			// unregist
			UnregistGuildWar( dwGuildIdxWinner, dwGuildIdxLoser );
			//	PenaltyForEndNotifyToMap( 0, dwGuildIdxLoser );

			// guildfieldwarrecord
			UpdateGuildWarRecord( FALSE, 0, dwGuildIdxLoser );
			UpdateGuildWarRecord( FALSE, 1, dwGuildIdxWinner );

			// registend
			//RegistEnd( dwGuildIdxWinner, dwGuildIdxLoser );
			break;
		}
	case MP_GUILD_WAR_SUGGESTEND:
		{
			SuggestEnd( pMsg );
			break;
		}
	case MP_GUILD_WAR_SUGGESTEND_NOTIFY_TOMAP:
		{
			const MSG_DWORD2*	pmsg	= (MSG_DWORD2*)pMsg;
			CObject*			object	= g_pUserTable->FindUser( pmsg->dwData1 );
			if( object )
			{
				MSG_DWORD message;
				message.Category	= MP_GUILD_WAR;
				message.Protocol	= MP_GUILD_WAR_SUGGESTEND;
				message.dwData		= pmsg->dwData2;

				object->SendMsg( &message, sizeof(message) );
			}

			break;
		}
	case MP_GUILD_WAR_SUGGESTEND_NACK:
		{
			break;
		}
	case MP_GUILD_WAR_SUGGESTEND_ACCEPT:
		{
			SuggestEndAccept( pMsg );
			break;
		}
	case MP_GUILD_WAR_SUGGESTEND_ACCEPT_NOTIFY_TOMAP:
		{
			SuggestEndAcceptNotifyToMap( pMsg );
			break;
		}
	case MP_GUILD_WAR_SUGGESTEND_DENY:
		{
			SuggestEndDeny( pMsg );
			break;
		}
	case MP_GUILD_WAR_SUGGESTEND_DENY_NOTIFY_TOMAP:
		{
			SuggestEndDenyNotifyToMap( pMsg );
			break;
		}
	case MP_GUILD_WAR_SURRENDER:
		{
			Surrender( pMsg );
			break;
		}
	case MP_GUILD_WAR_SURRENDER_NACK:
		{
			break;
		}
	case MP_GUILD_WAR_SURRENDER_NOTIFY_TOMAP:
		{
			SurrenderNotifyToMap( pMsg );
			break;
		}
	case MP_GUILD_WAR_ADDMONEY_TOMAP:
		{
			AddMoneyToMap( pMsg );
			break;
		}
	default:
		{
			ASSERT( 0 && "It is not defined" );
			break;
		}
	}
}