📄 puttyappui.cpp
字号:
/* puttyappui.cpp * * Putty UI Application UI class * * Copyright 2002,2003,2005 Petteri Kangaslampi * * See license.txt for full copyright and license information.*/#include <eikenv.h>#include <eikon.hrh>#include <ckninfo.h>#include <cknconf.h>#include <es_sock.h>#include <eikmenup.h>#include <eikdoc.h>#include <ckndgopn.h>#include <ckndgsve.h>#include <eikmisdg.h>#include <eikapp.h>#include <apgwgnam.h>#include <apgtask.h>#include <eikbtgpc.h>#include <txtetext.h>#include <baclipb.h>#include "puttyappui.h"#include "puttyappview.h"#include "puttyengine.h"#include "puttyui.hrh"#include "connectiondialog.h"#include "settingsdialog.h"#include "authdialog.h"#include <putty.rsg>extern "C" {#include "putty.h"}const TInt KInitAudioLength = 32000;const TInt KExitReason = -1;_LIT(KAssertPanic, "puttyappui.cpp");#define assert(x) __ASSERT_ALWAYS(x, User::Panic(KAssertPanic, __LINE__))_LIT(KRandomFile,"random.dat");_LIT(KDefaultSettingsFile, "defaults");#ifdef __WINS___LIT(KPuttyEngine, "puttyengine.dll");_LIT(KTempParamFile, "c:\\puttystarttemp");#else_LIT(KPuttyEngine, "puttyengine.exe");#endif_LIT8(KSmallFontName, "small");_LIT8(KLargeFontName, "large");static const TInt KNormalSmallWidth = 80;static const TInt KNormalSmallHeight = 24;static const TInt KNormalLargeWidth = 74;static const TInt KNormalLargeHeight = 14;static const TInt KFullSmallWidth = 106;static const TInt KFullSmallHeight = 25;static const TInt KFullLargeWidth = 91;static const TInt KFullLargeHeight = 14;static const TInt KSelectButtonPos = 1;static const TInt KMarkButtonPos = 2;//#include <e32svr.h>//#define DEBUGPRINT(x) RDebug::Print x#define DEBUGPRINT(x)CPuttyAppUi::CPuttyAppUi() : iAudioRecordDes(NULL, 0, 0) { iTermWidth = 80; iTermHeight = 24; iLargeFont = EFalse;}void CPuttyAppUi::ConstructL() { CEikonEnv::Static()->DisableExitChecks(ETrue); BaseConstructL(); iFatalErrorPanic = CEikonEnv::Static()->AllocReadResourceL(R_STR_FATAL_ERROR); iDialler = CDialler::NewL(this); iRecorder = CAudioRecorder::NewL(this); iAppView = new (ELeave) CPuttyAppView(this, this); iAppView->ConstructL(ClientRect()); AddToStackL(iAppView); iAppView->Terminal()->SetGrayed(ETrue); // Determine application installation path HBufC *appDll = HBufC::NewLC(KMaxFileName); *appDll = iDocument->Application()->AppFullName(); TParse parsa; User::LeaveIfError(parsa.SetNoWild(*appDll, NULL, NULL)); iDataPath = parsa.DriveAndPath(); // If the application is in ROM (drive Z:), put settings on C: if ( (iDataPath[0] == 'Z') || (iDataPath[0] == 'z') ) { iDataPath[0] = 'C'; } // Make sure the path ends with a backslash if ( iDataPath[iDataPath.Length()-1] != '\\' ) { iDataPath.Append('\\'); } DEBUGPRINT((_L("ProcessCommandParametersL: iDataPath = %S"), &iDataPath)); // Check if the random seed already exists. If not, we are probably running // PuTTY for the first time and the generator should be seeded // We'll need to check this before initializing the engine, since it will // create the file at startup. HBufC *seedFileBuf = HBufC::NewLC(KMaxFileName); TPtr seedFile = seedFileBuf->Des(); seedFile = iDataPath; seedFile.Append(KRandomFile); TBool randomExists = EFalse; TEntry dummy; if ( CEikonEnv::Static()->FsSession().Entry(seedFile, dummy) == KErrNone ) { randomExists = ETrue; } // Create and initialize the engine iEngine = CPuttyEngine::NewL(this, iDataPath); iEngine->SetTerminalSize(iTermWidth, iTermHeight); // Check if the default settings file exists. If yes, read it, otherwise // create one HBufC *settingsFileBuf = HBufC::NewLC(KMaxFileName); TPtr settingsFile = settingsFileBuf->Des(); settingsFile = iDataPath; settingsFile.Append(KDefaultSettingsFile); if ( CEikonEnv::Static()->FsSession().Entry(settingsFile, dummy) == KErrNone ) { iEngine->ReadConfigFileL(settingsFile); ReadUiSettingsL(iEngine->GetConfig()); } else { iEngine->SetDefaults(); iEngine->WriteConfigFileL(settingsFile); } // Initialize the random number generator if necessary if ( !randomExists ) { DEBUGPRINT((_L("ProcessCommandParametersL: Initializing random number generator"))); if ( CCknConfirmationDialog::RunDlgLD(R_STR_INITIAL_RANDOM_TITLE, R_STR_INITIAL_RANDOM_TEXT, NULL, R_STR_OK_CONFIRM) ) { HandleCommandL(ECmdInitRandomGenerator); } } CleanupStack::PopAndDestroy(3); // appDll, settingsFileBuf, seedFileBuf}CPuttyAppUi::~CPuttyAppUi() { if ( iAppView ) { RemoveFromStack(iAppView); } delete iAppView; delete iRecorder; delete iAudio; delete iDialler; delete iEngine; delete iFatalErrorPanic;}TBool CPuttyAppUi::ProcessCommandParametersL(TApaCommand aCommand, TFileName & aDocumentName, const TDesC8 &aTail) { // If we got a config file as a parameter, read it if ( aCommand == EApaCommandOpen ) { DEBUGPRINT((_L("ProcessCommandParametersL: Reading config file"))); iEngine->ReadConfigFileL(aDocumentName); } else { // Try to load default settings } // Final hack, keep the system happy. This is necessary since we aren't // really a proper file-based application. DEBUGPRINT((_L("ProcessCommandParametersL: Init done"))); return CEikAppUi::ProcessCommandParametersL(aCommand, aDocumentName, aTail);}void CPuttyAppUi::HandleCommandL(TInt aCommand) { switch (aCommand) { case ECmdConnect: { if ( iState != EStateNone ) { break; } assert(iEngine); Config *cfg = iEngine->GetConfig(); THostName hostName; char *c = cfg->host; while ( *c ) { hostName.Append(*c++); } CConnectionDialog *dlg = new (ELeave) CConnectionDialog(hostName); if ( dlg->ExecuteLD(R_CONNECTION_DIALOG)) { c = cfg->host; for ( TInt i = 0; i < hostName.Length(); i++ ) { *c++ = (char) hostName[i]; } *c++ = 0; TRAPD(error, CEikonEnv::Static()->BusyMsgL(R_STR_DIALING)); iState = EStateDialing; iDialler->DialL(); } break; } case ECmdLargeFont: { if ( iLargeFont ) { iLargeFont = EFalse; } else { iLargeFont = ETrue; } iAppView->SetFontL(iLargeFont); break; } case ECmdFullScreen: { if ( iFullScreen ) { iFullScreen = EFalse; } else { iFullScreen = ETrue; } iAppView->SetFullScreenL(iFullScreen); break; } case ECmdInitRandomGenerator: { if ( iRecording ) { break; } if ( CCknConfirmationDialog::RunDlgLD(R_STR_RECORD_CONFIRM_TITLE, R_STR_RECORD_CONFIRM_TEXT, NULL, R_STR_OK_CONFIRM) ) { delete iAudio; iAudio = NULL; iAudio = HBufC8::NewL(KInitAudioLength); iAudioRecordDes.Set(iAudio->Des()); iRecorder->RecordL(iAudioRecordDes); iRecording = ETrue; CEikonEnv::Static()->BusyMsgL(R_STR_RECORDING); } break; } case ECmdSettings: { assert(iState == EStateNone); CSettingsDialog *dlg = new (ELeave) CSettingsDialog(iEngine->GetConfig()); dlg->ExecuteLD(R_SETTINGS_DIALOG); break; } case ECmdLoadSettings: { assert(iState == EStateNone); TFileName fileName; TUid uid = { 0x101f9075 }; if ( CCknOpenFileDialog::RunDlgLD( fileName, R_STR_SHOW_PUTTY_CONFIG_FILES, CCknFileListDialogBase::EShowAllDrives, uid) ) { iEngine->ReadConfigFileL(fileName); ReadUiSettingsL(iEngine->GetConfig()); } break; } case ECmdSaveSettings: { assert(iState == EStateNone); TFileName fileName; if ( CCknSaveAsFileDialog::RunDlgLD(fileName) ) { WriteUiSettingsL(iEngine->GetConfig()); iEngine->WriteConfigFileL(fileName); } break; } case ECmdSendSpecialCharacter: if ( iState == EStateConnected ) { CEikCharMapDialog::RunDlgLD(iAppView->Terminal()); } break; case ECmdSendPipe: if ( iState == EStateConnected ) { iEngine->SendKeypress((TKeyCode)'|', 0); } break; case ECmdSendBackquote: if ( iState == EStateConnected ) { iEngine->SendKeypress((TKeyCode)'`', 0); } break; case ECmdSendLessThan: if ( iState == EStateConnected ) { iEngine->SendKeypress((TKeyCode)'<', 0); } break; case ECmdSendGreaterThan: if ( iState == EStateConnected ) { iEngine->SendKeypress((TKeyCode)'>', 0); } break; case ECmdSendF1: case ECmdSendF2: case ECmdSendF3: case ECmdSendF4: case ECmdSendF5: case ECmdSendF6: case ECmdSendF7: case ECmdSendF8: case ECmdSendF9: case ECmdSendF10: if ( iState == EStateConnected ) { iEngine->SendKeypress( (TKeyCode) (EKeyF1 + (aCommand - ECmdSendF1)), 0); } break; case ECmdSelect: if ( iSelectMode ) { HandleCommandL(ECmdUnselect); break; } if ( iState == EStateConnected ) { iAppView->Terminal()->SetSelectMode(ETrue); CEikButtonGroupContainer *cba = CEikonEnv::Static()->AppUiFactory()->ToolBar(); cba->SetCommandL(KSelectButtonPos, R_PUTTY_UNSELECT_CBA); cba->SetCommandL(KMarkButtonPos, R_PUTTY_MARK_CBA); cba->DrawDeferred(); iSelectMode = ETrue; iHaveMark = EFalse; } break; case ECmdUnselect: if ( iState == EStateConnected ) { iAppView->Terminal()->SetSelectMode(EFalse); CEikButtonGroupContainer *cba = CEikonEnv::Static()->AppUiFactory()->ToolBar(); cba->SetCommandL(KSelectButtonPos, R_PUTTY_SELECT_CBA); cba->SetCommandL(KMarkButtonPos, R_PUTTY_BLANK_CBA); cba->DrawDeferred(); iSelectMode = EFalse; iHaveMark = EFalse; } break; case ECmdMark: if ( iState == EStateConnected ) { iAppView->Terminal()->SetMark(); CEikButtonGroupContainer *cba = CEikonEnv::Static()->AppUiFactory()->ToolBar(); cba->SetCommandL(KMarkButtonPos, R_PUTTY_COPY_CBA); cba->DrawDeferred(); iHaveMark = ETrue; } break; case ECmdCopy: if ( iState == EStateConnected ) { // Get selection from the terminal and copy it to the clipboard // Thanks to Adam Boardman for the clipboard code const HBufC *buf = iAppView->Terminal()->CopySelectionLC(); if ( buf->Length() > 0 ) { CPlainText *plainText = CPlainText::NewL(); CleanupStack::PushL(plainText); plainText->InsertL(0, *buf); CClipboard *cb = CClipboard::NewForWritingLC( CEikonEnv::Static()->FsSession()); plainText->CopyToStoreL(cb->Store(), cb->StreamDictionary(), 0, buf->Length()); cb->CommitL(); CleanupStack::PopAndDestroy(2); //cb, plainText } CleanupStack::PopAndDestroy(); //buf HandleCommandL(ECmdUnselect); } break; case ECmdPaste: if ( iState == EStateConnected ) { // Thanks to Adam Boardman for the clipboard code CPlainText *plainText = CPlainText::NewL(); CleanupStack::PushL(plainText); CClipboard* cb = CClipboard::NewForReadingLC( CEikonEnv::Static()->FsSession()); plainText->PasteFromStoreL(cb->Store(), cb->StreamDictionary(), 0); TInt len = plainText->DocumentLength(); // FIXME: Could optimize, this may create a lot of packets for ( TInt i = 0; i < len; i++ ) { TKeyCode key = (TKeyCode)plainText->Read(i,1)[0]; if ( (key == (TKeyCode)CEditableText::ELineBreak) || (key == (TKeyCode)CEditableText::EParagraphDelimiter) ) { iEngine->SendKeypress(EKeyEnter, 0); } else { iEngine->SendKeypress(key, 0); } } CleanupStack::PopAndDestroy(2); //cb, plainText } break; case ECmdSaveSettingsAsDefault: { TFileName fileName; fileName = iDataPath; fileName.Append(KDefaultSettingsFile); WriteUiSettingsL(iEngine->GetConfig()); iEngine->WriteConfigFileL(fileName); break; } case ECmdResetDefaultSettings: { iEngine->SetDefaults(); ReadUiSettingsL(iEngine->GetConfig()); HandleCommandL(ECmdSaveSettingsAsDefault); break; } case ECmdAbout: { CCknInfoDialog::RunDlgLD( *CEikonEnv::Static()->AllocReadResourceLC(R_STR_ABOUT_TITLE), *CEikonEnv::Static()->AllocReadResourceLC(R_STR_ABOUT_TEXT)); CleanupStack::PopAndDestroy(2); // title, text break; } case EEikCmdExit: Exit(); break; } }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -