BOOL vncServer::Authenticated(vncClientId clientid) { vncClientList::iterator i; BOOL authok = TRUE; omni_mutex_lock l1(m_desktopLock); omni_mutex_lock l2(m_clientsLock); // Search the unauthenticated client list for (i = m_unauthClients.begin(); i != m_unauthClients.end(); i++) { // Is this the right client? if ((*i) == clientid) { vncClient *client = GetClient(clientid); // Yes, so remove the client and add it to the auth list m_unauthClients.erase(i); // Create the screen handler if necessary if (m_desktop == NULL) { if (RemoveWallpaperEnabled()) { m_wallpaper_wait = TRUE; DoNotify(WM_SRV_CLIENT_HIDEWALLPAPER, 0, 0); } m_desktop = new vncDesktop(); if (m_desktop == NULL) { vnclog.Print(LL_CONNERR, VNCLOG("failed to allocate desktop object\n")); client->Kill(); authok = FALSE; break; } if (!m_desktop->Init(this)) { vnclog.Print(LL_CONNERR, VNCLOG("failed to initialize desktop object\n")); client->Kill(); authok = FALSE; delete m_desktop; m_desktop = NULL; break; } } // Create a buffer object for this client vncBuffer *buffer = new vncBuffer(m_desktop); if (buffer == NULL) { vnclog.Print(LL_CONNERR, VNCLOG("failed to allocate buffer object\n")); client->Kill(); authok = FALSE; break; } // Tell the client about this new buffer client->SetBuffer(buffer); // Add the client to the auth list m_authClients.push_back(clientid); break; } } // Notify anyone interested of this event DoNotify(WM_SRV_CLIENT_AUTHENTICATED, 0, 0); vnclog.Print(LL_INTINFO, VNCLOG("Authenticated() done\n")); // If so configured, beep to indicate the new connection is // present. if (authok && GetBeepConnect()) { MessageBeep(MB_OK); } return authok; }
float PlantExplosive::GetPriority() { if ( IsActive() ) return GetLastPriority(); ExplosiveTargetType myTargetType = XPLO_TYPE_DYNAMITE; ETQW_Weapon weaponType = ETQW_WP_HE_CHARGE; switch ( GetClient()->GetClass() ) { case ETQW_CLASS_ENGINEER: { weaponType = ETQW_WP_HE_CHARGE; myTargetType = XPLO_TYPE_DYNAMITE; break; } /*case ETQW_CLASS_COVERTOPS: { weaponType = ETQW_WP_SATCHEL; myTargetType = XPLO_TYPE_SATCHEL; break; }*/ default: return 0.0; } mMapGoal.reset(); if ( InterfaceFuncs::IsWeaponCharged( GetClient(), weaponType, Primary ) ) { { GoalManager::Query qry( 0xbbcae592 /* PLANT */, GetClient() ); System::mInstance->mGoalManager->GetGoals( qry ); for ( uint32_t i = 0; i < qry.mList.size(); ++i ) { if ( BlackboardIsDelayed( qry.mList[ i ]->GetSerialNum() ) ) continue; if ( qry.mList[ i ]->GetSlotsOpen( MapGoal::TRACK_INPROGRESS ) < 1 ) continue; ConstructableState cState = InterfaceFuncs::IsDestroyable( GetClient(), qry.mList[ i ]->GetEntity() ); if ( cState == CONST_DESTROYABLE ) { mMapGoal = qry.mList[ i ]; break; } } } if ( !mMapGoal ) { GoalManager::Query qry( 0xa411a092 /* MOVER */, GetClient() ); System::mInstance->mGoalManager->GetGoals( qry ); for ( uint32_t i = 0; i < qry.mList.size(); ++i ) { if ( BlackboardIsDelayed( qry.mList[ i ]->GetSerialNum() ) ) continue; mMapGoal = qry.mList[ i ]; break; } } } return mMapGoal ? mMapGoal->GetPriorityForClient( GetClient() ) : 0.f; }
void MountMg42::OnTarget() { if ( !GetClient()->HasEntityFlag( ETQW_ENT_FLAG_MOUNTED ) ) GetClient()->PressButton( BOT_BUTTON_USE ); }
BOOL CFtpClientReqSocket::SendCommand( ) { CSourceURL &sourceUrl = (DYNAMIC_DOWNCAST(CFtpClient,GetClient()))->m_SourceURL; CStringA strLine; switch( m_FtpState ) { case ftpUSER:// Sending login { strLine = "USER "; strLine += sourceUrl.m_sLogin; break; } case ftpPASS:// Sending password { strLine = "PASS "; strLine += sourceUrl.m_sPassword; break; } case ftpLIST_PASVPORT:// Selecting passive or active mode { if ( m_bPassive ) { strLine = "PASV"; } break; } case ftpSIZE:// Listing file size { strLine = "SIZE "; int pos = sourceUrl.m_sPath.ReverseFind( _T('/') ); if( pos == -1 ) { pos = sourceUrl.m_sPath.ReverseFind( _T('\\') ); } if( pos == -1 ) { strLine += sourceUrl.m_sPath; } else { strLine += (LPCTSTR(sourceUrl.m_sPath) + pos + 1); } break; } case ftpCWD: { strLine = "CWD "; int pos = sourceUrl.m_sPath.ReverseFind( _T('/') ); if( pos == -1 ) { pos = sourceUrl.m_sPath.ReverseFind( _T('\\') ); } if( pos == -1 ) { this->m_FtpState = ftpSIZE_TYPE; return SendCommand(); } else { CString path( LPCTSTR(sourceUrl.m_sPath) , pos ); strLine += path; } } break; case ftpSIZE_TYPE: case ftpRETR_TYPE:// Selecting BINARY type for transfer { strLine = "TYPE I"; break; } case ftpRETR_PASVPORT: { // Selecting passive or active mode if ( m_bPassive ) { strLine = "PASV"; } break; } case ftpRETR_REST: /// 注意断点续传 { uint64 uiStartPos; (DYNAMIC_DOWNCAST(CFtpClient,GetClient()))->GetUrlStartPosForReq( uiStartPos ); //< 通知Peer层获取下载任务,并计算请求起始点 strLine.Format( "REST %I64u", uiStartPos ); break; } case ftpRETR: // Retrieving file { strLine = _T("RETR "); int pos = sourceUrl.m_sPath.ReverseFind( _T('/') ); if( pos == -1 ) { pos = sourceUrl.m_sPath.ReverseFind( _T('\\') ); } if( pos == -1 ) { strLine += sourceUrl.m_sPath; } else { strLine += (LPCTSTR(sourceUrl.m_sPath) + pos + 1); } break; } case ftpABOR:// Transfer aborting { strLine = _T("ABOR"); break; } default: return TRUE; } if( GetClient() ) GetClient()->AddPeerLog(new CTraceSendMessage((CString)strLine)); strLine += "\r\n"; TRACE( "<< %s", (LPCSTR) strLine ); /* char buffer[1024]; // Convert Unicode String to MutiBytes String int nMulti = WideCharToMultiByte( CP_ACP, 0, (LPCWSTR)strLine.GetBuffer(), strLine.GetLength(), NULL, 0 , NULL, NULL); WideCharToMultiByte(CP_ACP, 0, strLine.GetBuffer(), strLine.GetLength(), buffer, nMulti, NULL, NULL); strLine.ReleaseBuffer(); */ CRawPacket* pFtpCMDPacket = new CRawPacket(strLine); theStats.AddUpDataOverheadFileRequest(pFtpCMDPacket->size); SendPacket(pFtpCMDPacket); return TRUE; }
State::StateStatus PlantMine::Update( float fDt ) { if ( DidPathFail() ) { BlackboardDelay( 10.f, mMapGoal->GetSerialNum() ); return State_Finished; } if ( !mMapGoal->IsAvailable( GetClient()->GetTeam() ) ) return State_Finished; // If it's not destroyable, consider it a success. if ( !InterfaceFuncs::IsDestroyable( GetClient(), mMapGoal->GetEntity() ) ) { return State_Finished; } if ( mLandMineEntity.IsValid() && !IGame::IsEntityValid( mLandMineEntity ) ) return State_Finished; if ( DidPathSucceed() ) { GetClient()->ResetStuckTime(); static float MIN_DIST_TO_TARGETPOS = 32.0f; static float MIN_DIST_TO_MINE = 32.0f; // Have we already thrown out a mine? if ( mLandMineEntity.IsValid() ) { // Is it armed yet? if ( InterfaceFuncs::GetExplosiveState( GetClient(), mLandMineEntity ) == XPLO_ARMED ) return State_Finished; // Disable avoidance for this frame. //.mClient->GetSteeringSystem()->SetNoAvoidTime(IGame::GetTime()); // Not armed yet, keep trying. if ( EngineFuncs::EntityPosition( mLandMineEntity, mLandMinePosition ) && EngineFuncs::EntityVelocity( mLandMineEntity, mLandMineVelocity ) ) { GetClient()->PressButton( BOT_BUTTON_CROUCH ); FINDSTATEIF( Aimer, GetRootState(), AddAimRequest( Priority::Medium, this, GetNameHash() ) ); FINDSTATEIF( WeaponSystem, GetRootState(), AddWeaponRequest( Priority::Medium, GetNameHash(), ETQW_WP_PLIERS ) ); // Do we need to get closer? bool bCloseEnough = ( GetClient()->GetPosition() - mLandMinePosition ).Length() < MIN_DIST_TO_MINE; GetClient()->GetSteeringSystem()->SetTarget( bCloseEnough ? GetClient()->GetPosition() : mLandMinePosition ); } return State_Busy; } // Move closer if necessary. bool bCloseEnough = ( GetClient()->GetPosition() - mTargetPosition ).Length() < MIN_DIST_TO_TARGETPOS; GetClient()->GetSteeringSystem()->SetTarget( bCloseEnough ? GetClient()->GetPosition() : mTargetPosition ); // keep watching the target position. FINDSTATEIF( Aimer, GetRootState(), AddAimRequest( Priority::Medium, this, GetNameHash() ) ); FINDSTATEIF( WeaponSystem, GetRootState(), AddWeaponRequest( Priority::Medium, GetNameHash(), ETQW_WP_LANDMINE ) ); } return State_Busy; }
void OnClientLogin() override { SendAdmins(GetUser()->GetUserName() + " attached (from " + GetClient()->GetRemoteIP() + ")"); }
void SendAdmins(const CString &msg) { CZNC::Get().Broadcast(msg, true, nullptr, GetClient()); }
BOOL vncServer::Authenticated(vncClientId clientid) { vncClientList::iterator i; BOOL authok = TRUE; // vnclog.Print(LL_INTINFO, VNCLOG("Lock2\n")); omni_mutex_lock l1(m_desktopLock); // vnclog.Print(LL_INTINFO, VNCLOG("Lock3\n")); omni_mutex_lock l2(m_clientsLock); // Search the unauthenticated client list for (i = m_unauthClients.begin(); i != m_unauthClients.end(); i++) { // Is this the right client? if ((*i) == clientid) { vncClient *client = GetClient(clientid); // Yes, so remove the client and add it to the auth list m_unauthClients.erase(i); // Create the screen handler if necessary if (m_desktop == NULL) { m_desktop = new vncDesktop(); if (m_desktop == NULL) { client->Kill(); authok = FALSE; break; } if (!m_desktop->Init(this)) { vnclog.Print(LL_INTINFO, VNCLOG("Desktop init failed, unlock in application mode ? \n")); client->Kill(); authok = FALSE; delete m_desktop; m_desktop = NULL; break; } } // Tell the client about this new buffer client->SetBuffer(&(m_desktop->m_buffer)); // Add the client to the auth list m_authClients.push_back(clientid); break; } } // Notify anyone interested of this event DoNotify(WM_SRV_CLIENT_AUTHENTICATED, 0, 0); vnclog.Print(LL_INTINFO, VNCLOG("Authenticated() done\n")); return authok; }
// Execute command from script bool CChar::Player_OnVerb( CScript &s, CTextConsole * pSrc ) { ADDTOCALLSTACK("CChar::Player_OnVerb"); if ( !m_pPlayer || !pSrc ) return false; LPCTSTR pszKey = s.GetKey(); int cpVerb = FindTableSorted( pszKey, CCharPlayer::sm_szVerbKeys, COUNTOF(CCharPlayer::sm_szVerbKeys)-1 ); if ( cpVerb <= -1 ) { if ( ( !strnicmp(pszKey, "GUILD", 5) ) || ( !strnicmp(pszKey, "TOWN", 4) ) ) { bool bIsGuild = !strnicmp(pszKey, "GUILD", 5); pszKey += bIsGuild ? 5 : 4; if ( *pszKey == '.' ) { pszKey += 1; CItemStone *pMyGuild = Guild_Find(bIsGuild ? MEMORY_GUILD : MEMORY_TOWN); if ( pMyGuild ) { CScript sToParse(pszKey, s.GetArgRaw()); return pMyGuild->r_Verb(sToParse, pSrc); } } return false; } } switch ( cpVerb ) { case CPV_KICK: // "KICK" = kick and block the account return (IsClient() && GetClient()->addKick(pSrc)); case CPV_PASSWORD: // "PASSWORD" { // Set/Clear the password if ( pSrc != this ) { if ( pSrc->GetPrivLevel() <= GetPrivLevel() || pSrc->GetPrivLevel() < PLEVEL_Admin ) { pSrc->SysMessage(g_Cfg.GetDefaultMsg(DEFMSG_MSG_ACC_PRIV)); return false; } } CAccount * pAccount = m_pPlayer->GetAccount(); ASSERT(pAccount != NULL); if ( !s.HasArgs() ) { pAccount->ClearPassword(); SysMessage(g_Cfg.GetDefaultMsg(DEFMSG_MSG_ACC_PASSCLEAR)); SysMessage(g_Cfg.GetDefaultMsg(DEFMSG_MSG_ACC_PASSCLEAR_RELOG)); g_Log.Event(LOGM_ACCOUNTS|LOGL_EVENT, "Account '%s', password cleared\n", pAccount->GetName()); } else { if ( pAccount->SetPassword(s.GetArgStr()) ) { SysMessage(g_Cfg.GetDefaultMsg(DEFMSG_MSG_ACC_ACCEPTPASS)); g_Log.Event(LOGM_ACCOUNTS|LOGL_EVENT, "Account '%s', password set to '%s'\n", pAccount->GetName(), s.GetArgStr()); return true; } SysMessage(g_Cfg.GetDefaultMsg(DEFMSG_MSG_ACC_INVALIDPASS)); } break; } default: return false; } return true; }
void CClientConnection::OnRawConnectFailed() { m_nState = CClient::STATE_FAILED; SetErrorCode(CClient::ERRCODE_NETWORK); GetClient()->GetClientApp()->QueueLoginFailed(GetClient()); }
void CClientConnection::ProcessPacket(_U32 len, const _U8* data) { if(m_nState==CClient::STATE_LOGINING) { _U16 code; if(len<sizeof(code)) { SetErrorCode(CClient::ERRCODE_UNKOWN); Disconnect(); return; } code = *data; switch(code) { case 0x0: // login completed m_nState = CClient::STATE_LOGINED; GetClient()->GetClientApp()->QueueLoginDone(GetClient()); break; case 0x1: // redirect if(len<sizeof(code)+sizeof(ASOCK_ADDR)) { SetErrorCode(CClient::ERRCODE_UNKOWN); } else { m_saRedirectAddr = *((const ASOCK_ADDR*)(data+sizeof(code))); m_nLoginDataSize = (_U16)len - sizeof(code) - sizeof(ASOCK_ADDR) + sizeof(_U16); if(m_nLoginDataSize>sizeof(m_LoginData)) { SetErrorCode(CClient::ERRCODE_UNKOWN); } else { *((_U16*)m_LoginData) = (_U16)m_nLoginDataSize - sizeof(_U16); memcpy(m_LoginData+sizeof(_U16), data+sizeof(code)+sizeof(ASOCK_ADDR), (size_t)m_nLoginDataSize); m_bNeedRedirect = true; } } Disconnect(); break; default: ZION_ASSERT(0); SetErrorCode(CClient::ERRCODE_UNKOWN); Disconnect(); break; } } else if(m_nState==CClient::STATE_LOGINED) { _U16 id; if(len<sizeof(id)) { SetErrorCode(CClient::ERRCODE_UNKOWN); Disconnect(); } else { id = *((const _U16*)data); GetClient()->GetClientApp()->QueueData(GetClient(), id&0xff, id>>8, len-sizeof(id), data+sizeof(id)); } }
void CHttpClientReqSocket::OnConnect(int nErrorCode) { CClientReqSocket::OnConnect(nErrorCode); if (GetClient()) GetClient()->OnSocketConnected(nErrorCode); }
void GWindow::Pour() { GRect Cli = GetClient(); if (!Cli.Valid()) return; GRegion Client(Cli); GViewI *MenuView = 0; GRegion Update(Client); bool HasTools = false; GViewI *v; List<GViewI>::I Lst = Children.Start(); { GRegion Tools; for (v = *Lst; v; v = *++Lst) { bool IsMenu = MenuView == v; if (!IsMenu && IsTool(v)) { GRect OldPos = v->GetPos(); Update.Union(&OldPos); if (HasTools) { // 2nd and later toolbars if (v->Pour(Tools)) { if (!v->Visible()) { v->Visible(true); } if (OldPos != v->GetPos()) { // position has changed update... v->Invalidate(); } Tools.Subtract(&v->GetPos()); Update.Subtract(&v->GetPos()); } } else { // First toolbar if (v->Pour(Client)) { HasTools = true; if (!v->Visible()) { v->Visible(true); } if (OldPos != v->GetPos()) { v->Invalidate(); } GRect Bar(v->GetPos()); Bar.x2 = GetClient().x2; Tools = Bar; Tools.Subtract(&v->GetPos()); Client.Subtract(&Bar); Update.Subtract(&Bar); } } } } } Lst = Children.Start(); for (GViewI *v = *Lst; v; v = *++Lst) { bool IsMenu = MenuView == v; if (!IsMenu && !IsTool(v)) { GRect OldPos = v->GetPos(); Update.Union(&OldPos); if (v->Pour(Client)) { GRect p = v->GetPos(); if (!v->Visible()) { v->Visible(true); } v->Invalidate(); Client.Subtract(&v->GetPos()); Update.Subtract(&v->GetPos()); } else { // non-pourable } } } for (int i=0; i<Update.Length(); i++) { Invalidate(Update[i]); } }
void GWindow::Pour() { GRegion Client(GetClient()); GRegion Update; bool HasTools = false; GViewI *v; { GRegion Tools; for (v = Children.First(); v; v = Children.Next()) { GView *k = dynamic_cast<GView*>(v); if (k && k->_IsToolBar) { GRect OldPos = v->GetPos(); Update.Union(&OldPos); if (HasTools) { // 2nd and later toolbars if (v->Pour(Tools)) { if (!v->Visible()) { v->Visible(true); } if (OldPos != v->GetPos()) { // position has changed update... v->Invalidate(); } Tools.Subtract(&v->GetPos()); Update.Subtract(&v->GetPos()); } } else { // First toolbar if (v->Pour(Client)) { HasTools = true; if (!v->Visible()) { v->Visible(true); } if (OldPos != v->GetPos()) { v->Invalidate(); } GRect Bar(v->GetPos()); Bar.x2 = GetClient().x2; Tools = Bar; Tools.Subtract(&v->GetPos()); Client.Subtract(&Bar); Update.Subtract(&Bar); } } } } } for (v = Children.First(); v; v = Children.Next()) { GView *k = dynamic_cast<GView*>(v); if (!(k && k->_IsToolBar)) { GRect OldPos = v->GetPos(); Update.Union(&OldPos); if (v->Pour(Client)) { if (!v->Visible()) { v->Visible(true); } if (OldPos != v->GetPos()) { // position has changed update... v->Invalidate(); } Client.Subtract(&v->GetPos()); Update.Subtract(&v->GetPos()); } else { // make the view not visible // v->Visible(FALSE); } } } for (int i=0; i<Update.Length(); i++) { Invalidate(Update[i]); } }
virtual void OnClientLogin() override { Log("[" + GetUser()->GetUserName() + "] connected to ZNC from " + GetClient()->GetRemoteIP()); }
void CChatChanMember::SendChatMsg(CHATMSG_TYPE iType, LPCTSTR pszName1, LPCTSTR pszName2, CLanguageID lang ) { ADDTOCALLSTACK("CChatChanMember::SendChatMsg"); GetClient()->addChatSystemMessage(iType, pszName1, pszName2, lang ); }
virtual void OnClientDisconnect() override { Log("[" + GetUser()->GetUserName() + "] disconnected from ZNC from " + GetClient()->GetRemoteIP()); }
void CChatChanMember::ToggleReceiving() { ADDTOCALLSTACK("CChatChanMember::ToggleReceiving"); m_fReceiving = !m_fReceiving; GetClient()->addChatSystemMessage((m_fReceiving) ? CHATMSG_ReceivingPrivate : CHATMSG_NoLongerReceivingPrivate); }
void OnClientDisconnect() override { SendAdmins(GetUser()->GetUserName() + " detached (from " + GetClient()->GetRemoteIP() + ")"); }
LPCTSTR CChatChanMember::GetChatName() const { ADDTOCALLSTACK("CChatChanMember::GetChatName"); return( GetClient()->GetAccount()->m_sChatName ); }
/// 收到一个headerLine后对应发下一个Command或连接数据通道( edit code from shareaza ) BOOL CFtpClientReqSocket::OnHeaderLine ( CStringA& strHeader, CStringA& strValue ) { TRACE( ">> %s: %s\n", strHeader, strValue ); m_bDecLaunchTimes = FALSE; m_bServerErr = FALSE; if( strHeader[0]=='4' ) { m_bDecLaunchTimes = TRUE; } else if( strHeader[0]=='5' ) { m_bServerErr = TRUE; } if( strHeader=="450" && m_FtpState==ftpABOR ) { return TRUE; } else if( m_bDecLaunchTimes || m_bServerErr ) { (DYNAMIC_DOWNCAST(CFtpClient,GetClient()))->OnCmdSocketErr(strHeader); return TRUE; } switch( m_FtpState ) { case ftpConnecting: if ( strHeader == "220" ) // Connected { m_FtpState = ftpUSER; return SendCommand(); } break; case ftpUSER: if ( strHeader == "331" ) // Access allowed { m_FtpState = ftpPASS; return SendCommand (); } else if( strHeader == "230" ) { // no need pass m_FtpState = ftpSIZE_TYPE; // ftpSIZE_TYPE return SendCommand(); } // Wrong login or other errors // 530: This FTP server is anonymous only. break; case ftpPASS: if ( strHeader == "230" ) // Logged in { m_FtpState = ftpCWD; // ftpSIZE_TYPE return SendCommand(); } break; case ftpCWD: if ( strHeader == "250" ) // Type I setted { m_FtpState = ftpSIZE_TYPE; return SendCommand(); } break; case ftpSIZE_TYPE: if ( strHeader == "200" ) // Type I setted { m_FtpState = ftpSIZE; return SendCommand(); } break; case ftpSIZE: if ( strHeader == "213" ) // SIZE reply { uint64 ui64FileSize = _atoi64( strValue ); if( (DYNAMIC_DOWNCAST(CFtpClient,GetClient()))->OnFileSizeKnown( ui64FileSize ) ) //can go on { m_FtpState = ftpRETR_PASVPORT; return SendCommand(); } else { m_FtpState = ftpABOR; //< 对应的Peer不参与下载,socket abort 结束! return SendCommand(); } } break; case ftpRETR_TYPE: if ( strHeader == "200" ) // Type I setted { m_FtpState = ftpRETR_PASVPORT; return SendCommand(); } break; case ftpRETR_PASVPORT: if ( strHeader == "227" || strHeader == "200" ) // Entered passive or active mode { if ( m_bPassive ) { SOCKADDR_IN host; if( !ParsePASVArgs( strValue, host ) ) { // Wrong PASV reply format ASSERT( FALSE ); return FALSE; } else { CFtpClientDataSocket *pClientDataSocket = (DYNAMIC_DOWNCAST(CFtpClient,GetClient()))->GetClientDataSocket(false); if( NULL!=pClientDataSocket ) (DYNAMIC_DOWNCAST(CFtpClient,GetClient()))->CloseDataSocket(); pClientDataSocket = (DYNAMIC_DOWNCAST(CFtpClient,GetClient()))->GetClientDataSocket(); if( pClientDataSocket->Create() ) { /// 按ftp服务器给的ip地址和端口开始连通数据通道. pClientDataSocket->Connect( (SOCKADDR*)&host, sizeof host ); return TRUE; } else { m_FtpState = ftpABOR; } //return TRUE; } } else { m_FtpState = ftpABOR; } m_FtpState = ftpRETR_REST; return SendCommand(); } break; case ftpRETR_REST: if ( strHeader == "350" ) // Offset setted { GetClient()->SetDownloadState( DS_DOWNLOADING ); //这时候就应该进入下载阶段了. m_FtpState = ftpRETR; return SendCommand (); /// ok,可以开始向ftp服务器请求要下载的文件了 } break; case ftpRETR: if ( strHeader == "125" || strHeader == "150" ) // Transfer started { //GetClient()->SetDownloadState( DS_DOWNLOADING ); //放在这里可能数据已经来了,但该消息还没来.他们是异步的. m_FtpState = ftpDownloading; return TRUE; // Downloading } else if ( strHeader == "226" || strHeader == "426" ) // Transfer completed { m_FtpState = ftpABOR; // Aborting return FALSE; } break; case ftpABOR: { if( GetClient() && (DYNAMIC_DOWNCAST(CFtpClient,GetClient()))->PendingBlockReqCount()>0 ) { m_FtpState = ftpRETR_REST; //ftpRETR_PASVPORT SendCommand(); } } break; case ftpDownloading: { /// 下载中如果没出错,那就是下完了 } break; case ftpClose: { if( GetClient() && (DYNAMIC_DOWNCAST(CFtpClient,GetClient()))->PendingBlockReqCount()>0 ) { m_FtpState = ftpRETR_PASVPORT; SendCommand(); } } break; default: ASSERT( FALSE ); // Really unexpected errors } return FALSE; }
bool CChar::Use_Key( CItem * pKey, CItem * pItemTarg ) { ADDTOCALLSTACK("CChar::Use_Key"); ASSERT(pKey); ASSERT(pKey->IsType(IT_KEY)); if ( !pItemTarg ) { SysMessageDefault(DEFMSG_MSG_KEY_TARG); return false; } if ( pKey != pItemTarg && pItemTarg->IsType(IT_KEY) ) { // We are trying to copy a key ? if ( !CanUse(pItemTarg, true) ) { SysMessageDefault(DEFMSG_MSG_KEY_TARG_REACH); return false; } if ( !pKey->m_itKey.m_lockUID && !pItemTarg->m_itKey.m_lockUID ) { SysMessageDefault(DEFMSG_MSG_KEY_BLANKS); return false; } if ( pItemTarg->m_itKey.m_lockUID && pKey->m_itKey.m_lockUID ) { SysMessageDefault(DEFMSG_MSG_KEY_NOTBLANKS); return false; } // Need tinkering tools ??? if ( !Skill_UseQuick(SKILL_TINKERING, 30 + Calc_GetRandLLVal(40)) ) { SysMessageDefault(DEFMSG_MSG_KEY_FAILC); return false; } if ( pItemTarg->m_itKey.m_lockUID ) pKey->m_itKey.m_lockUID = pItemTarg->m_itKey.m_lockUID; else pItemTarg->m_itKey.m_lockUID = pKey->m_itKey.m_lockUID; return true; } if ( !pKey->m_itKey.m_lockUID ) { SysMessageDefault(DEFMSG_MSG_KEY_ISBLANK); return false; } if ( pKey == pItemTarg ) // rename the key { if ( IsClient() ) GetClient()->addPromptConsole(CLIMODE_PROMPT_NAME_KEY, g_Cfg.GetDefaultMsg(DEFMSG_MSG_KEY_SETNAME), pKey->GetUID()); return false; } if ( !CanUse(pItemTarg, false) ) { SysMessageDefault(DEFMSG_MSG_KEY_CANTREACH); return false; } if ( m_pArea->GetResourceID() == pKey->m_itKey.m_lockUID ) { if ( Use_MultiLockDown(pItemTarg) ) return true; } if ( !pItemTarg->m_itContainer.m_lockUID ) // or m_itContainer.m_lockUID { SysMessageDefault(DEFMSG_MSG_KEY_NOLOCK); return false; } if ( !pKey->IsKeyLockFit(pItemTarg->m_itContainer.m_lockUID) ) // or m_itKey { SysMessageDefault(DEFMSG_MSG_KEY_WRONGLOCK); return false; } return Use_KeyChange(pItemTarg); }
void CFtpClientReqSocket::DataReceived(const BYTE* pucData, UINT uSize) { if( !IsEntireResponse((const char*)pucData,uSize) ) //先检查是否有一个完整HeaderLine回来了.. return ; CStringA strLine; CStringA strNumber; CStringA strMultiNumber; CStringA strMultiReply; LPCSTR pData=(LPCSTR)pucData; bool bMultiLine = false; while ( uSize>0 ) { LPCSTR pszNl = (LPCSTR)memchr(pData, '\n', uSize); if(!pszNl) return; int iLineLen = pszNl - pData; ASSERT( iLineLen >= 0 ); if (iLineLen > 0) strLine = CStringA(pData, iLineLen - 1); pData += (strLine.GetLength() + 2); uSize -= (strLine.GetLength() + 2); if( GetClient() ) { GetClient()->AddPeerLog(new CTraceServerMessage(CString(strLine))); } BOOL bNumber = ( strLine.GetLength() >= 3 ) && _istdigit( strLine[0] ) && _istdigit( strLine[1] ) && _istdigit( strLine[2] ); if ( bNumber ) strNumber = strLine.Left( 3 ); if ( !bMultiLine && bNumber && strLine[3] == _T('-') ) { // Got first line of multi-line reply bMultiLine = TRUE; strMultiNumber = strNumber; strMultiReply = strLine.Mid( 4 ); } else if ( !bMultiLine && bNumber ) { // Got single-line reply if ( !OnHeaderLine( strNumber, strLine.Mid( 4 ).Trim( " \t\r\n" ) ) ) return ; } else if ( bMultiLine && bNumber && strLine[3] == ' ' && strMultiNumber == strNumber ) { // Got last line of multi-line reply bMultiLine = FALSE; strMultiReply += "\n"; strMultiReply += strLine.Mid( 4 ); if ( ! OnHeaderLine( strNumber, strMultiReply.Trim( " \t\r\n" ) ) ) return ; } else if ( bMultiLine ) { strMultiReply += "\n"; strMultiReply += strLine; } } }
bool CChar::Use_KeyChange( CItem * pItemTarg ) { ADDTOCALLSTACK("CChar::Use_KeyChange"); // Lock or unlock the item. switch ( pItemTarg->GetType() ) { case IT_SIGN_GUMP: // We may rename the sign. if ( IsClient() ) GetClient()->addPromptConsole(CLIMODE_PROMPT_NAME_SIGN, g_Cfg.GetDefaultMsg(DEFMSG_MSG_KEY_TARG_SIGN), pItemTarg->GetUID()); return true; case IT_CONTAINER: pItemTarg->SetType(IT_CONTAINER_LOCKED); SysMessageDefault(DEFMSG_MSG_KEY_TARG_CONT_LOCK); break; case IT_CONTAINER_LOCKED: pItemTarg->SetType(IT_CONTAINER); SysMessageDefault(DEFMSG_MSG_KEY_TARG_CONT_ULOCK); break; case IT_SHIP_HOLD: pItemTarg->SetType(IT_SHIP_HOLD_LOCK); SysMessageDefault(DEFMSG_MSG_KEY_TARG_HOLD_LOCK); break; case IT_SHIP_HOLD_LOCK: pItemTarg->SetType(IT_SHIP_HOLD); SysMessageDefault(DEFMSG_MSG_KEY_TARG_HOLD_ULOCK); break; case IT_DOOR: case IT_DOOR_OPEN: pItemTarg->SetType(IT_DOOR_LOCKED); SysMessageDefault(DEFMSG_MSG_KEY_TARG_DOOR_LOCK); break; case IT_DOOR_LOCKED: pItemTarg->SetType(IT_DOOR); SysMessageDefault(DEFMSG_MSG_KEY_TARG_DOOR_ULOCK); break; case IT_SHIP_TILLER: if ( IsClient() ) GetClient()->addPromptConsole(CLIMODE_PROMPT_NAME_SHIP, g_Cfg.GetDefaultMsg(DEFMSG_MSG_SHIPNAME_PROMT), pItemTarg->GetUID()); return true; case IT_SHIP_PLANK: pItemTarg->Ship_Plank(false); // just close it. if ( pItemTarg->GetType() == IT_SHIP_SIDE_LOCKED ) { pItemTarg->SetType(IT_SHIP_SIDE); SysMessageDefault(DEFMSG_MSG_KEY_TARG_SHIP_ULOCK); break; } // Then fall thru and lock it. case IT_SHIP_SIDE: pItemTarg->SetType(IT_SHIP_SIDE_LOCKED); SysMessageDefault(DEFMSG_MSG_KEY_TARG_SHIP_LOCK); break; case IT_SHIP_SIDE_LOCKED: pItemTarg->SetType(IT_SHIP_SIDE); SysMessageDefault(DEFMSG_MSG_KEY_TARG_SHIP_ULOCK); break; default: SysMessageDefault(DEFMSG_MSG_KEY_TARG_NOLOCK); return false; } pItemTarg->Sound(0x049); return true; }
State::StateStatus BuildConstruction::Update( float fDt ) { if ( DidPathFail() ) { BlackboardDelay( 10.f, mMapGoal->GetSerialNum() ); return State_Finished; } if ( !mMapGoal->IsAvailable( GetClient()->GetTeam() ) ) return State_Finished; ////////////////////////////////////////////////////////////////////////// // Check the construction status ConstructableState cState = InterfaceFuncs::GetConstructableState( GetClient(), mMapGoal->GetEntity() ); switch ( cState ) { case CONST_INVALID: // Invalid constructable, fail return State_Finished; case CONST_BUILT: // It's built, consider it a success. return State_Finished; case CONST_UNBUILT: case CONST_BROKEN: // This is what we want. break; } ////////////////////////////////////////////////////////////////////////// if ( DidPathSucceed() ) { float fDistanceToConstruction = ( mConstructionPos - GetClient()->GetPosition() ).SquaredLength(); if ( fDistanceToConstruction > 4096.0f ) { // check for badly waypointed maps if ( !mAdjustedPosition ) { // use our z value because some trigger entities may be below the ground Vector3f checkPos( mConstructionPos.X(), mConstructionPos.Y(), GetClient()->GetEyePosition().Z() ); obTraceResult tr; EngineFuncs::TraceLine( tr, GetClient()->GetEyePosition(), checkPos, NULL, ( TR_MASK_SOLID | TR_MASK_PLAYERCLIP ), GetClient()->GetGameID(), True ); if ( tr.mFraction != 1.0f && !tr.mHitEntity.IsValid() ) { mMapGoal->SetDeleteMe( true ); return State_Finished; } // do a trace to adjust position EngineFuncs::TraceLine( tr, GetClient()->GetEyePosition(), mConstructionPos, NULL, ( TR_MASK_SOLID | TR_MASK_PLAYERCLIP ), -1, False ); if ( tr.mFraction != 1.0f ) { mConstructionPos = *(Vector3f*)tr.mEndpos; } mAdjustedPosition = true; } } else { FINDSTATEIF( Aimer, GetRootState(), AddAimRequest( Priority::Medium, this, GetNameHash() ) ); FINDSTATEIF( WeaponSystem, GetRootState(), AddWeaponRequest( Priority::Medium, GetNameHash(), ETQW_WP_PLIERS ) ); } GetClient()->GetSteeringSystem()->SetTarget( mConstructionPos, 64.f ); } return State_Busy; }
void GSplitter::CalcRegions(bool Follow) { GRect Rect = GetClient(); d->PosA = Rect; if (Border()) { d->PosA.Size(SPLITER_BORDER, SPLITER_BORDER); } d->PosB = d->PosA; if (d->SplitFollow && Follow) { d->SplitPos = max(1, ((d->Vertical) ? X()-10 : Y()-10) + d->SplitSet); } else if (Rect.Valid()) { int Max = d->Vertical ? X()-10 : Y()-10; if (Max > 0) { d->SplitPos = max(1, d->SplitPos); d->SplitPos = min(Max, d->SplitPos); } } if (d->Vertical) { d->PosA.x2 = d->PosA.x1 + d->SplitPos; d->PosB.x1 = d->PosA.x2 + d->BarSize; } else { d->PosA.y2 = d->PosA.y1 + d->SplitPos; d->PosB.y1 = d->PosA.y2 + d->BarSize; } GRect r = d->PosA; if (d->BorderA) { r.Size(SPLITER_INSET, SPLITER_INSET); } if (d->ViewA) { if (d->ViewA->IsAttached()) { if (r.Valid()) { GRegion Rgn(r); d->ViewA->SetPos(r); d->ViewA->Pour(Rgn); } d->ViewA->Visible(r.Valid()); } else { d->ViewA->SetPos(r); } } r = d->PosB; if (d->BorderB) { r.Size(SPLITER_INSET, SPLITER_INSET); } if (d->ViewB) { if (d->ViewB->IsAttached()) { if (r.Valid()) { GRegion Rgn(r); d->ViewB->SetPos(r); d->ViewB->Pour(Rgn); } d->ViewB->Visible(r.Valid()); } else { d->ViewB->SetPos(r); } } #if 0 if (d->ViewA && !stricmp(d->ViewA->GetClass(), "GTree")) { printf("Split::OnPosChange cli=%s a=%s b=%s\n", GetClient().GetStr(), d->PosA.GetStr(), d->PosB.GetStr()); } #endif // printf("CalcPos Client=%s Value=%i A=%s B=%s\n", GetClient().GetStr(), (int)Value(), d->PosA.GetStr(), d->PosB.GetStr()); }
State::StateStatus PlantExplosive::_UpdateDynamite() { switch ( mGoalState ) { case LAY_EXPLOSIVE: { if ( !InterfaceFuncs::IsWeaponCharged( GetClient(), ETQW_WP_HE_CHARGE, Primary ) ) return State_Finished; /*if(.mClient->IsDebugEnabled(BOT_DEBUG_GOALS)) { RenderBuffer::AddOBB(.mMapGoal->GetWorldBounds(), COLOR::ORANGE); Vector3f vCenter; mMapGoal->GetWorldBounds().CenterPoint(vCenter); RenderBuffer::AddLine(.mClient->GetPosition(), vCenter, COLOR::GREEN, 1.0f); RenderBuffer::AddLine(.mClient->GetPosition(), mMapGoal->GetPosition(), COLOR::RED, 1.0f); }*/ float fDistanceToTarget = ( mTargetPosition - GetClient()->GetPosition() ).SquaredLength(); if ( fDistanceToTarget > 10000.0f ) { // Move toward it. //.mClient->GetSteeringSystem()->SetTarget(.mTargetPosition); // check for badly waypointed maps if ( !mAdjustedPosition ) { mAdjustedPosition = true; // use our z value because some trigger entities may be below the ground Vector3f vCheckPos( mTargetPosition.X(), mTargetPosition.Y(), GetClient()->GetEyePosition().Z() ); /*if(.mClient->IsDebugEnabled(BOT_DEBUG_GOALS)) { RenderBuffer::AddLine(GetClient()->GetEyePosition(), vCheckPos, COLOR::GREEN, 2.0f); }*/ obTraceResult tr; EngineFuncs::TraceLine( tr, GetClient()->GetEyePosition(), vCheckPos, NULL, ( TR_MASK_SOLID | TR_MASK_PLAYERCLIP ), GetClient()->GetGameID(), True ); if ( tr.mFraction != 1.0f && !tr.mHitEntity.IsValid() ) { //.mTargetEntity->SetDeleteMe(true); return State_Finished; } // do a trace to adjust position EngineFuncs::TraceLine( tr, GetClient()->GetEyePosition(), mTargetPosition, NULL, ( TR_MASK_SOLID | TR_MASK_PLAYERCLIP ), -1, False ); if ( tr.mFraction != 1.0f ) { mTargetPosition = Vector3f( tr.mEndpos ); } } } else { // We're within range, so let's start laying. GetClient()->ResetStuckTime(); FINDSTATEIF( Aimer, GetRootState(), AddAimRequest( Priority::Medium, this, GetNameHash() ) ); FINDSTATEIF( WeaponSystem, GetRootState(), AddWeaponRequest( Priority::Medium, GetNameHash(), ETQW_WP_HE_CHARGE ) ); } break; } case ARM_EXPLOSIVE: { if ( InterfaceFuncs::GetExplosiveState( GetClient(), mExplosiveEntity ) == XPLO_ARMED ) { BlackboardDelay( 30.f, mMapGoal->GetSerialNum() ); return State_Finished; } // Disable avoidance for this frame. GetClient()->GetSteeringSystem()->SetNoAvoidTime( IGame::GetTime() ); // update dynamite position EngineFuncs::EntityPosition( mExplosiveEntity, mExplosivePosition ); // move a little bit close if dyno too far away if ( ( mExplosivePosition - GetClient()->GetPosition() ).SquaredLength() > 2500.0f ) { GetClient()->GetSteeringSystem()->SetTarget( mExplosivePosition ); } else { GetClient()->ResetStuckTime(); FINDSTATEIF( Aimer, GetRootState(), AddAimRequest( Priority::Medium, this, GetNameHash() ) ); FINDSTATEIF( WeaponSystem, GetRootState(), AddWeaponRequest( Priority::Medium, GetNameHash(), ETQW_WP_PLIERS ) ); } break; } default: // keep processing break; } return State_Busy; }
void GSplitter::OnPaint(GSurface *pDC) { GRect r = GetClient(); pDC->Colour(LC_MED, 24); if (Border()) { LgiFlatBorder(pDC, r, SPLITER_BORDER); } // bar pDC->Colour(LC_MED, 24); if (d->Vertical) { /* Old Win32 pDC->Rectangle(PosA.x2, PosA.y1, PosB.x1, PosA.y2); pDC->Rectangle(PosA.x1, PosA.y2, PosA.x2, PosB.y1); */ pDC->Rectangle(d->PosA.x2+1, r.y1, d->PosB.x1-1, r.y2); } else { pDC->Rectangle(r.x1, d->PosA.y2+1, r.x2, d->PosB.y1-1); } // PosA region r = d->PosA; if (r.X() > SPLITER_MIN_X && r.Y() > SPLITER_MIN_Y) { if (d->BorderA) { LgiWideBorder(pDC, r, DefaultSunkenEdge); } if (d->ViewA) { #ifdef WIN32 if (!d->ViewA->Handle()) { pDC->SetClient(&d->PosA); d->ViewA->OnPaint(pDC); pDC->SetClient(NULL); } else #endif { // View is real and will paint itself } } else { pDC->Colour(LC_WORKSPACE, 24); pDC->Rectangle(&r); } } else { // too small } r = d->PosB; if (r.X() > SPLITER_MIN_X && r.Y() > SPLITER_MIN_Y) { if (d->BorderB) { LgiWideBorder(pDC, r, DefaultSunkenEdge); } if (d->ViewB) { #ifdef WIN32 if (!d->ViewB->Handle()) { pDC->SetClient(&d->PosB); d->ViewB->OnPaint(pDC); pDC->SetClient(NULL); } else #endif { // View is real and will paint itself } } else { pDC->Colour(LC_WORKSPACE, 24); pDC->Rectangle(&r); } } else { // too small } }
State::StateStatus MountMg42::Update( float fDt ) { if ( DidPathFail() ) { BlackboardDelay( 10.f, mMapGoal->GetSerialNum() ); return State_Finished; } if ( !mMapGoal->IsAvailable( GetClient()->GetTeam() ) ) return State_Finished; ////////////////////////////////////////////////////////////////////////// // Only fail if a friendly player is on this gun or gun has been destroyed in the meantime //int gunHealth = InterfaceFuncs::GetGunHealth(.mClient, mMG42Goal->GetEntity()); GameEntity mounter = InterfaceFuncs::GetMountedPlayerOnMG42( GetClient(), mMapGoal->GetEntity() ); if ( InterfaceFuncs::IsMountableGunRepairable( GetClient(), mMapGoal->GetEntity() ) || ( mounter.IsValid() && ( mounter != GetClient()->GetGameEntity() ) && GetClient()->IsAllied( mounter ) ) ) { return State_Finished; } ////////////////////////////////////////////////////////////////////////// if ( DidPathSucceed() ) { GetClient()->GetSteeringSystem()->SetTarget( mMapGoal->GetPosition() ); FINDSTATEIF( Aimer, GetRootState(), AddAimRequest( Priority::Medium, this, GetNameHash() ) ); if ( GetClient()->HasEntityFlag( ETQW_ENT_FLAG_MOUNTED ) ) { mTargetZone.Update( GetClient() ); if ( !mGotGunProperties ) { mGotGunProperties = true; _GetMG42Properties(); mAimPoint = mMapGoal->GetPosition() + mGunCenterArc * 512.f; } if ( mNextScanTime < IGame::GetTime() ) { mNextScanTime = IGame::GetTime() + (int)Mathf::IntervalRandom( 2000.0f, 7000.0f ); mScanDirection = (int)Mathf::IntervalRandom( 0.0f, (float)NUM_SCAN_TYPES ); // we're mounted, so lets look around mid view. mTargetZone.UpdateAimPosition(); } if ( mTargetZone.HasAim() ) mScanDirection = SCAN_ZONES; switch ( mScanDirection ) { case SCAN_DEFAULT: if ( mMapGoal->GetFacing() != Vector3f::ZERO ) { mAimPoint = mMG42Position + mMapGoal->GetFacing() * 1024.f; break; } case SCAN_MIDDLE: { mAimPoint = mMG42Position + mGunCenterArc * 1024.f; break; } case SCAN_LEFT: if ( mScanLeft != Vector3f::ZERO ) { mAimPoint = mMG42Position + mScanLeft * 1024.f; break; } case SCAN_RIGHT: if ( mScanRight != Vector3f::ZERO ) { mAimPoint = mMG42Position + mScanRight * 1024.f; break; } case SCAN_ZONES: { mAimPoint = mTargetZone.GetAimPosition(); break; } default: break; } } } return State_Busy; }
void CDuiSplitWnd::Relayout(UINT uMode) { CRect rcClient; GetClient(&rcClient); BOOL bRowSplit=!m_bColMode; BOOL bColSplit=m_bColMode; if((uMode & layout_vert) && bColSplit) {//列模式,垂直方向发生变化 for(int i=0;i<m_arrPane.GetCount(); i++) { CRect rcPane; m_arrPane[i]->GetRect(&rcPane); rcPane.top=rcClient.top; rcPane.bottom=rcClient.bottom; m_arrPane[i]->Move(rcPane); } }else if(uMode & layout_horz && bRowSplit) {//行模式,水平方向发生变化 for(int i=0;i<m_arrPane.GetCount(); i++) { CRect rcPane; m_arrPane[i]->GetRect(&rcPane); rcPane.left=rcClient.left; rcPane.right=rcClient.right; m_arrPane[i]->Move(rcPane); } }else if(uMode & layout_pos) {//只是窗口位置发生变化 //获得第一个窗格的原坐标 CRect rcPane1; if(m_arrPane.GetCount()) { m_arrPane[0]->GetRect(&rcPane1); } //与客户区坐标比较计算出偏移量 CPoint ptOffset=rcClient.TopLeft()-rcPane1.TopLeft(); for(int i=0;i<m_arrPane.GetCount(); i++) { CRect rcPane; m_arrPane[i]->GetRect(&rcPane); rcPane.OffsetRect(ptOffset); m_arrPane[i]->Move(rcPane); } } //检查列模式下水平方向有没有变化 或者 行模式下垂直方向上有没有变化 if((bRowSplit && !(uMode & layout_vert)) || ( bColSplit && !(uMode & layout_horz))) return; //计算出理想的及最小的宽度或者高度 int nTotalIdeal=0,nTotalMin=0; for(int i=0; i<m_arrPane.GetCount(); i++) { if (!m_arrPane[i]->IsVisible()) continue; nTotalIdeal+=m_arrPane[i]->m_nSizeIdeal; nTotalMin+=m_arrPane[i]->m_nSizeMin; } int nInter=(GetVisiblePanelCount()-1)*m_nSepSize; int nSize=m_bColMode?rcClient.Width():rcClient.Height(); CRect rcPane=rcClient; if(m_bColMode) rcPane.right=rcPane.left; else rcPane.bottom=rcPane.top; long & nLT= m_bColMode?rcPane.left:rcPane.top; long & nRB= m_bColMode?rcPane.right:rcPane.bottom; if(nTotalMin+nInter > nSize) { //set all pane to minimize size for(int i=0; i<m_arrPane.GetCount(); i++) { if (!m_arrPane[i]->IsVisible()) continue; nRB+=m_arrPane[i]->m_nSizeMin; m_arrPane[i]->Move(&rcPane); nLT=nRB+m_nSepSize; nRB=nLT; } } else if(nTotalIdeal+nInter<nSize) { //set all pane to nIdealSize except the lowest priority one, which will be extent to fill all space int iLowest=0,nPriority=-1; int i; for(i=0; i<m_arrPane.GetCount(); i++) { if (!m_arrPane[i]->IsVisible()) continue; if(m_arrPane[i]->m_nPriority>nPriority) { nPriority=m_arrPane[i]->m_nPriority; iLowest=i; } } for(i=0; i<m_arrPane.GetCount(); i++) { if (!m_arrPane[i]->IsVisible()) continue; if(i!=iLowest) nRB+=m_arrPane[i]->m_nSizeIdeal; else nRB+=m_arrPane[i]->m_nSizeIdeal+nSize-(nTotalIdeal+nInter); m_arrPane[i]->Move(&rcPane); nLT=nRB+m_nSepSize; nRB=nLT; } } else { //set high priority pane size to ideal size and set low pane to remain size PANEORDER *pnPriority=new PANEORDER[m_arrPane.GetCount()]; int *pPaneSize=new int [m_arrPane.GetCount()]; int i; for(i=0; i<m_arrPane.GetCount(); i++) { pnPriority[i].idx=i; pnPriority[i].pPane=m_arrPane[i]; } qsort(pnPriority,m_arrPane.GetCount(),sizeof(PANEORDER),FunComp); //为每一个格子分配空间 int nRemainSize=nSize-nInter; BOOL bMinimize=FALSE; for(i=0; i<m_arrPane.GetCount(); i++) { if (!m_arrPane[i]->IsVisible()) continue; if(!bMinimize) { int nRequiredMin=0; for(int j=i+1; j<m_arrPane.GetCount(); j++) { if (!m_arrPane[j]->IsVisible()) continue; nRequiredMin+=pnPriority[j].pPane->m_nSizeMin; } if(nRequiredMin<nRemainSize-pnPriority[i].pPane->m_nSizeIdeal) pPaneSize[pnPriority[i].idx]=pnPriority[i].pPane->m_nSizeIdeal; else { pPaneSize[pnPriority[i].idx]=nRemainSize-nRequiredMin; bMinimize=TRUE; } } else { pPaneSize[pnPriority[i].idx]=pnPriority[i].pPane->m_nSizeMin; } nRemainSize-=pPaneSize[pnPriority[i].idx]; } //设置格子位置 for(i=0; i<m_arrPane.GetCount(); i++) { if (!m_arrPane[i]->IsVisible()) continue; nRB+=pPaneSize[i]; m_arrPane[i]->Move(&rcPane); nLT=nRB+m_nSepSize; nRB=nLT; } delete [] pPaneSize; delete [] pnPriority; } }