/* ================================================ idVoiceChatMgr::AddMachine ================================================ */ int idVoiceChatMgr::AddMachine( const lobbyAddress_t& address, int lobbyType ) { int machineIndex = FindMachine( address, lobbyType ); if( machineIndex != -1 ) { // If we find an existing machine, just increase the ref remoteMachines[machineIndex].refCount++; return machineIndex; } // // We didn't find a machine, we'll need to add one // // First, see if there is a free machine slot to take int index = -1; for( int i = 0; i < remoteMachines.Num(); i++ ) { if( remoteMachines[i].refCount == 0 ) { index = i; break; } } remoteMachine_t newMachine; newMachine.lobbyType = lobbyType; newMachine.address = address; newMachine.refCount = 1; newMachine.sendFrame = -1; if( index == -1 ) { // If we didn't find a machine slot, then add one index = remoteMachines.Append( newMachine ); } else { // Re-use the machine slot we found remoteMachines[index] = newMachine; } return index; }
bool MachineBridge::unlockMachine() { // std::cout << "[" << getName().toStdString() << "] Trying to unlock machine..." << std::endl; nsresult rc; uint32_t state; GET_AND_DEBUG_MACHINE_STATE(session, state, rc); NS_CHECK_AND_DEBUG_ERROR(session, UnlockMachine(), rc); // if(NS_SUCCEEDED(rc) && state == SessionState::Unlocked) // std::cout << "[" << getName().toStdString() << "] Machine unlocked" << std::endl; // else // std::cout << "[" << getName().toStdString() << "] Failed to unlock machine (rc: 0x" << std::hex << rc << std::dec << ")" << std::endl; GET_AND_DEBUG_MACHINE_STATE(session, state, rc); //HACK FIXME Renew machine object because actual object is unlockable NS_CHECK_AND_DEBUG_ERROR(vboxbridge->virtualBox, FindMachine(machineUUID, &machine), rc); session = nsnull; return NS_SUCCEEDED(rc); }
RTEXITCODE handleDebugVM(HandlerArg *pArgs) { RTEXITCODE rcExit = RTEXITCODE_FAILURE; /* * The first argument is the VM name or UUID. Open a session to it. */ if (pArgs->argc < 2) return errorNoSubcommand(); ComPtr<IMachine> ptrMachine; CHECK_ERROR2I_RET(pArgs->virtualBox, FindMachine(com::Bstr(pArgs->argv[0]).raw(), ptrMachine.asOutParam()), RTEXITCODE_FAILURE); CHECK_ERROR2I_RET(ptrMachine, LockMachine(pArgs->session, LockType_Shared), RTEXITCODE_FAILURE); /* * Get the associated console and machine debugger. */ HRESULT rc; ComPtr<IConsole> ptrConsole; CHECK_ERROR(pArgs->session, COMGETTER(Console)(ptrConsole.asOutParam())); if (SUCCEEDED(rc)) { if (ptrConsole.isNotNull()) { ComPtr<IMachineDebugger> ptrDebugger; CHECK_ERROR(ptrConsole, COMGETTER(Debugger)(ptrDebugger.asOutParam())); if (SUCCEEDED(rc)) { /* * String switch on the sub-command. */ const char *pszSubCmd = pArgs->argv[1]; if (!strcmp(pszSubCmd, "dumpvmcore")) { setCurrentSubcommand(HELP_SCOPE_DEBUGVM_DUMPVMCORE); rcExit = handleDebugVM_DumpVMCore(pArgs, ptrDebugger); } else if (!strcmp(pszSubCmd, "getregisters")) { setCurrentSubcommand(HELP_SCOPE_DEBUGVM_GETREGISTERS); rcExit = handleDebugVM_GetRegisters(pArgs, ptrDebugger); } else if (!strcmp(pszSubCmd, "info")) { setCurrentSubcommand(HELP_SCOPE_DEBUGVM_INFO); rcExit = handleDebugVM_Info(pArgs, ptrDebugger); } else if (!strcmp(pszSubCmd, "injectnmi")) { setCurrentSubcommand(HELP_SCOPE_DEBUGVM_INJECTNMI); rcExit = handleDebugVM_InjectNMI(pArgs, ptrDebugger); } else if (!strcmp(pszSubCmd, "log")) { setCurrentSubcommand(HELP_SCOPE_DEBUGVM_LOG); rcExit = handleDebugVM_LogXXXX(pArgs, ptrDebugger, pszSubCmd); } else if (!strcmp(pszSubCmd, "logdest")) { setCurrentSubcommand(HELP_SCOPE_DEBUGVM_LOGDEST); rcExit = handleDebugVM_LogXXXX(pArgs, ptrDebugger, pszSubCmd); } else if (!strcmp(pszSubCmd, "logflags")) { setCurrentSubcommand(HELP_SCOPE_DEBUGVM_LOGFLAGS); rcExit = handleDebugVM_LogXXXX(pArgs, ptrDebugger, pszSubCmd); } else if (!strcmp(pszSubCmd, "osdetect")) { setCurrentSubcommand(HELP_SCOPE_DEBUGVM_OSDETECT); rcExit = handleDebugVM_OSDetect(pArgs, ptrDebugger); } else if (!strcmp(pszSubCmd, "osinfo")) { setCurrentSubcommand(HELP_SCOPE_DEBUGVM_OSINFO); rcExit = handleDebugVM_OSInfo(pArgs, ptrDebugger); } else if (!strcmp(pszSubCmd, "osdmesg")) { setCurrentSubcommand(HELP_SCOPE_DEBUGVM_OSDMESG); rcExit = handleDebugVM_OSDmesg(pArgs, ptrDebugger); } else if (!strcmp(pszSubCmd, "setregisters")) { setCurrentSubcommand(HELP_SCOPE_DEBUGVM_SETREGISTERS); rcExit = handleDebugVM_SetRegisters(pArgs, ptrDebugger); } else if (!strcmp(pszSubCmd, "show")) { setCurrentSubcommand(HELP_SCOPE_DEBUGVM_SHOW); rcExit = handleDebugVM_Show(pArgs, ptrDebugger); } else if (!strcmp(pszSubCmd, "statistics")) { setCurrentSubcommand(HELP_SCOPE_DEBUGVM_STATISTICS); rcExit = handleDebugVM_Statistics(pArgs, ptrDebugger); } else errorUnknownSubcommand(pszSubCmd); } } else RTMsgError("Machine '%s' is not currently running.\n", pArgs->argv[0]); } pArgs->session->UnlockMachine(); return rcExit; }
//*---------------------------------------------------------------------------- //*函数: long LPort_DataProcess(TSSmartDocEx *pDocEx,TSSmartTask *pTask,TSCmdBuffer *pBuffer) //*功能: 处理具体的业务请求 //*参数: 无 //*返回: 见系统返回值说明 //*说明: //*---------------------------------------------------------------------------- long CCollectionData::LPort_Process(TSSmartDocEx *pDocEx,TSSmartTask *pTask,TSCmdBuffer *pBuffer) { unsigned char ucRawData[256]; int nTotalPortNo, nPortNo; memset(ucRawData, 0, sizeof(ucRawData)); memcpy(ucRawData, &pBuffer->pBuffer[4], pBuffer->pBuffer[3]); #ifdef __DEBUG_OUTPUT__ for(int i=0; i< 256; i++) { printf("%02X ", pBuffer->pBuffer[i]); } printf("\n"); #endif int nTempLen = pBuffer->nCmdSize ; unsigned char sTempData[256]; memcpy(sTempData, pBuffer->pBuffer, 256); //不等于端口总数 if( ucRawData[2] != pDocEx->pChildDoc[pDocEx->nPortNo]->m_nPortCount ) { CString strString; strString.Format("收集LPort数据时, 返回的端口总数与数据库端口总数不相等. 返回的端口数为:%d, 档案表为:%d! 您的LPort参数设置不正确, 请重新校对LPort的参数", ucRawData[2], pDocEx->pChildDoc[0]->m_nPortCount); ReportLog(pDocEx, pTask, RET_SYSERROR, "实时收数", strString.GetBuffer(0) ); if( !ResetDevice(pDocEx->pChildDoc[pDocEx->nPortNo], pBuffer) ) { printf("1---实时收集LPORT数据时,返回的端口总数不等于参数内的端口总数\n"); ReportLog(pDocEx, pTask, RET_SYSERROR, "实时收数", "收集LPort数据时, 由于返回的端口总数不相等, 复位时出错!"); } return RET_SYSERROR; } /* LportState(pDocEx,pTask,pBuffer,ucRawData); if( !LportState(pDocEx,pTask,pBuffer,ucRawData) ) { InterlockedIncrement((LONG*)&gNotFound); //Sleep(50); return RET_NG; }*/ nTotalPortNo = ucRawData[2]; nPortNo = ucRawData[3+nTotalPortNo]; //端口数不对, 复位 if( nPortNo > nTotalPortNo ) { printf("1---实时收集LPORT数据时,返回的端口总数不等于参数内的端口总数\n"); ResetDevice(pDocEx->pChildDoc[pDocEx->nPortNo], pBuffer); return RET_SYSERROR; } nPortNo = GetPos(pDocEx, nPortNo); pBuffer->nCmdSize = nTempLen; memset(pBuffer->pBuffer, 0, pBuffer->nBufferSize); memcpy(pBuffer->pBuffer, sTempData, 256); long nRet = RET_NG ; switch(GetMacDataType(pBuffer)) { case MACDATA_TYPE_JY://为交易类型数据 { int nType = MACHINE_TYPE_5301 ; if( nPortNo < 0 ) { char szDataReg[32]; sprintf(szDataReg, "%.2X%.2X%.2X%.2X", ucRawData[5+nTotalPortNo],ucRawData[6+nTotalPortNo],ucRawData[7+nTotalPortNo],ucRawData[8+nTotalPortNo]); if( nPortNo < 0 ) { //是否在本服务器内 int iPos = GetPos(pDocEx, szDataReg); if( iPos > 0 ) { nPortNo = iPos; } else { TSSmartDoc doc; //档案表中有数据 if( FindMachine(szDataReg, &doc) ) nType = GetMachineType(&doc); } } } nType = GetMachineType(pDocEx->pChildDoc[nPortNo]); switch( nType) { case MACHINE_TYPE_5301://服务器 case MACHINE_TYPE_0201://增值机 case MACHINE_TYPE_0226://收费机 case MACHINE_TYPE_0228://车载机 case MACHINE_TYPE_0230://管理机 case MACHINE_TYPE_0232://上机上网机 case MACHINE_TYPE_0234://淋浴管理机 case MACHINE_TYPE_0240://售票机 case MACHINE_TYPE_0130://身份识别机 case MACHINE_TYPE_0140://检票机 case MACHINE_TYPE_0248://上海理工转帐机 nRet = Process_DealTypeData(pDocEx,pTask,pBuffer,&ucRawData[5+nTotalPortNo],nPortNo); break; case MACHINE_TYPE_0121://计时宝 nRet = Process_IdentifyData(pDocEx,pTask,pBuffer,&ucRawData[5+nTotalPortNo],nPortNo); break; case MACHINE_TYPE_0224://挂失机 nRet = Process_GSJData(pDocEx,pTask,pBuffer,&ucRawData[5+nTotalPortNo],nPortNo); break; default: break; } } break; case MACDATA_TYPE_ZZ://为扎帐数据 nRet = Process_StateData(pDocEx,pTask,pBuffer,&ucRawData[5+nTotalPortNo],pDocEx->nPortNo); break; case MACDATA_TYPE_BZ://为补助数据 nRet = Process_AssisData(pDocEx,pTask,pBuffer,&ucRawData[5+nTotalPortNo],nPortNo); break; default: break; } LportState(pDocEx,pTask,pBuffer,ucRawData); /*if( !LportState(pDocEx,pTask,pBuffer,ucRawData) ) { InterlockedIncrement((LONG*)&gNotFound); Sleep(50); //printf("处理LPORT%.8X状态返回\n",pDocEx->pChildDoc[0]->m_nAuthID); return RET_NG; }*/ Sleep(100); return nRet; }
IMachine *VirtualBoxBridge::cloneVM(QString qName, bool reInitIfaces, IMachine *m) { nsXPIDLString name; name.AssignWithConversion(qName.toStdString().c_str()); nsXPIDLString osTypeId; nsresult rc; m->GetOSTypeId(getter_Copies(osTypeId)); IMachine *new_machine; IProgress *progress; NS_CHECK_AND_DEBUG_ERROR(virtualBox, FindMachine(name, &new_machine), rc); if(rc != VBOX_E_OBJECT_NOT_FOUND) { std::cout << "machine: " << &new_machine << std::endl; return NULL; } nsXPIDLString settingsFile; virtualBox->ComposeMachineFilename(name, NULL, NULL, NULL, getter_Copies(settingsFile)); std::cout << "Predicted settings file name: " << returnQStringValue(settingsFile).toStdString() << std::endl; QFile file(returnQStringValue(settingsFile)); QFile file_prev(returnQStringValue(settingsFile).append("-prev")); if(file.exists()) { if(file.remove()) std::cerr << "Deleted old settings file: " << file.fileName().toStdString() << std::endl; else std::cerr << "Error while deleting old settings file: " << file.fileName().toStdString() << std::endl; } if(file_prev.exists()) { if(file_prev.remove()) std::cerr << "Deleted old backup settings file: " << file_prev.fileName().toStdString() << std::endl; else std::cerr << "Error while deleting old backup settings file: " << file_prev.fileName().toStdString() << std::endl; } QString label = QString::fromUtf8("Creazione macchina \"").append(qName).append("\"..."); ProgressDialog p(label); p.ui->progressBar->setValue(0); p.ui->label->setText(label); p.open(); NS_CHECK_AND_DEBUG_ERROR(virtualBox, CreateMachine(NULL, name, 0, NULL, osTypeId, NULL, &new_machine), rc); if(NS_FAILED(rc)) return NULL; std::cout << "Machine " << qName.toStdString() << " created" << std::endl; if(!reInitIfaces) { uint32_t clone_options[1]; clone_options[0] = CloneOptions::KeepAllMACs; NS_CHECK_AND_DEBUG_ERROR(m, CloneTo(new_machine, CloneMode::MachineState, 1, clone_options, &progress), rc); } else NS_CHECK_AND_DEBUG_ERROR(m, CloneTo(new_machine, CloneMode::MachineState, 0, NULL, &progress), rc); if(NS_FAILED(rc)) return NULL; int32_t resultCode; PRBool progress_completed; do { uint32_t percent; progress->GetCompleted(&progress_completed); progress->GetPercent(&percent); p.ui->progressBar->setValue(percent); p.refresh(); usleep(750000); } while(!progress_completed); progress->GetResultCode(&resultCode); if (resultCode != 0) // check success { std::cout << "Error during clone process: " << resultCode << std::endl; return NULL; } std::cout << "Machine " << qName.toStdString() << " cloned" << std::endl; p.ui->label->setText(QString::fromUtf8("Registrazione macchina \"").append(qName).append("\"...")); NS_CHECK_AND_DEBUG_ERROR(virtualBox, RegisterMachine(new_machine), rc); if(NS_FAILED(rc)) return NULL; std::cout << "Machine " << qName.toStdString() << " registered" << std::endl; return new_machine; }