//++ BulliT #include #include #include #include #include #include #include #include #include #include #include "VGUI_ScrollPanel.h" #include "VGUI_TextImage.h" #include #include #include "hud.h" #include "cl_util.h" #include #include "vgui_TeamFortressViewport.h" #include "AgVGuiPassword.h" using namespace vgui; namespace { class TextHandler : public ActionSignal { private: AgVGuiPassword* _AgVGuiPassword; public: TextHandler(AgVGuiPassword* AgVGuiPassword) { _AgVGuiPassword=AgVGuiPassword; } public: virtual void actionPerformed(Panel* panel) { _AgVGuiPassword->doConnect(); } }; class ConnectHandler : public ActionSignal { private: AgVGuiPassword* _AgVGuiPassword; public: ConnectHandler(AgVGuiPassword* AgVGuiPassword) { _AgVGuiPassword=AgVGuiPassword; } public: virtual void actionPerformed(Panel* panel) { _AgVGuiPassword->doConnect(); } }; class TextInput : public vgui::TextEntry { public: TextInput(const char* text,int x,int y,int wide,int tall) : TextEntry(text,x,y,wide,tall) { }; virtual void keyPressed(KeyCode code,Panel* panel) { if (gViewPort->m_pPassword->isVisible()) TextEntry::keyPressed(code,panel); }; virtual void keyTyped(KeyCode code,Panel* panel) { if (gViewPort->m_pPassword->isVisible()) TextEntry::keyTyped(code,panel); }; virtual void keyReleased(KeyCode code,Panel* panel) { if (gViewPort->m_pPassword->isVisible()) TextEntry::keyReleased(code,panel); }; }; } #define VGUIPASSWORD_TITLE_X XRES(16) #define VGUIPASSWORD_TITLE_Y YRES(16) #define TEXT_SIZE_Y YRES(16) AgVGuiPassword::AgVGuiPassword(int x,int y,int wide,int tall) : Panel(x,y,wide,tall) { setBorder( new LineBorder( Color(255 * 0.7,170 * 0.7,0,0)) ); // Get the scheme used for the Titles CSchemeManager *pSchemes = gViewPort->GetSchemeManager(); // schemes SchemeHandle_t hTitleScheme = pSchemes->getSchemeHandle( "Title Font" ); // SchemeHandle_t hVGUIPasswordText = pSchemes->getSchemeHandle( "Briefing Text" ); // color schemes int r, g, b, a; // Create the title m_pLabel = new Label( "", VGUIPASSWORD_TITLE_X, VGUIPASSWORD_TITLE_Y ); m_pLabel->setParent( this ); m_pLabel->setFont( pSchemes->getFont(hTitleScheme) ); m_pLabel->setFont( Scheme::sf_primary1 ); pSchemes->getFgColor( hTitleScheme, r, g, b, a ); m_pLabel->setFgColor( r, g, b, a ); m_pLabel->setFgColor( Scheme::sc_primary1 ); pSchemes->getBgColor( hTitleScheme, r, g, b, a ); m_pLabel->setBgColor( r, g, b, a ); m_pLabel->setContentAlignment( vgui::Label::a_west ); m_pLabel->setText("Enter Password"); int iXSize,iYSize; getSize( iXSize,iYSize ); int iTemp = iYSize - YRES(24) - VGUIPASSWORD_TITLE_Y - BUTTON_SIZE_Y; //Hack to get it to work with Visual 7.0 beta 2 m_pTextEntry = new TextInput("",XRES(16), iTemp, iXSize - 2*XRES(16), TEXT_SIZE_Y); m_pTextEntry->setParent(this); m_pTextEntry->addActionSignal(new TextHandler(this)); m_pConnect = new CommandButton("Connect",XRES(16), iYSize - YRES(16) - BUTTON_SIZE_Y, CMENU_SIZE_X, BUTTON_SIZE_Y); m_pConnect->addActionSignal(new ConnectHandler(this)); m_pConnect->setParent(this); ReadPasswords(); } void AgVGuiPassword::doConnect() { char szPassword[256]; szPassword[0] = '\0'; m_pTextEntry->getText(0,szPassword,sizeof(szPassword)); AgAddressToPasswordMap::iterator itrPasswords = m_mapPasswords.find(m_sAddress.c_str()); if (itrPasswords != m_mapPasswords.end()) (*itrPasswords).second = szPassword; else m_mapPasswords.insert(AgAddressToPasswordMap::value_type(m_sAddress,szPassword)); SavePasswords(); char szCMD[256]; sprintf(szCMD,"password %s\n", szPassword); ClientCmd(szCMD); sprintf(szCMD, "connect %s\n", m_sAddress.c_str() ); ClientCmd(szCMD); gViewPort->HidePassword(); } void AgVGuiPassword::paintBackground() { // Transparent black background drawSetColor( 0,0,0, 100 ); drawFilledRect(0,0,_size[0],_size[1]); } int AgVGuiPassword::KeyInput(int down, int keynum, const char *pszCurrentBinding) { if (!down) return 1; if (!isVisible()) return 1; if (K_ESCAPE == keynum) { gViewPort->HidePassword(); return 0; } if (m_pTextEntry->hasFocus()) return 0; return 1; } void AgVGuiPassword::Connect(const char* pszHostname, const char* pszAddress, bool bPassworded) { m_sAddress = pszAddress; if (!bPassworded) { doConnect(); return; } else { char szMessage[256]; sprintf(szMessage,"Enter password for %s",pszHostname); m_pLabel->setText(szMessage,strlen(szMessage)); AgString sPassword; AgAddressToPasswordMap::iterator itrPasswords = m_mapPasswords.find(pszAddress); if (itrPasswords != m_mapPasswords.end()) sPassword = (*itrPasswords).second; m_pTextEntry->setText(sPassword.c_str(),sPassword.length()); gViewPort->ShowPassword(); } } void AgVGuiPassword::ReadPasswords() { char szData[4096]; char szFile[MAX_PATH]; sprintf(szFile,"%s/passwords.txt",AgGetDirectory()); FILE* pFile = fopen(szFile,"r"); if (!pFile) return; int iRead = fread(szData,sizeof(char),sizeof(szData)-2,pFile); fclose(pFile); if (0 >= iRead) return; szData[iRead] = '\0'; char* pszPasswordString = strtok( szData, "\n"); while (pszPasswordString != NULL) { char szAddress[64],szPassword[64]; szAddress[0] = '\0'; szPassword[0] = '\0'; sscanf(pszPasswordString,"%s %s\n",szAddress,szPassword); AgString sAddress(szAddress); AgString sPassword(szPassword); AgTrim(sAddress); AgTrim(sPassword); m_mapPasswords.insert(AgAddressToPasswordMap::value_type(sAddress,sPassword)); pszPasswordString = strtok( NULL, "\n"); } } void AgVGuiPassword::SavePasswords() { char szFile[MAX_PATH]; sprintf(szFile,"%s/passwords.txt",AgGetDirectory()); FILE* pFile = fopen(szFile,"wb"); if (!pFile) { // file error char szMsg[128]; sprintf(szMsg,"Couldn't create/save password file %s.\n",szFile); ConsolePrint(szMsg); return; } //Loop and write the file. for (AgAddressToPasswordMap::iterator itrPasswords = m_mapPasswords.begin() ;itrPasswords != m_mapPasswords.end(); ++itrPasswords) fprintf(pFile,"%s %s\n",(*itrPasswords).first.c_str(),(*itrPasswords).second.c_str()); fflush(pFile); fclose(pFile); } //-- Martin Webrant