//--------------------------------------------------------------------------- void __fastcall TGenerateUrlDialog::Execute() { int Components = WinConfiguration->GenerateUrlComponents; if (Components < 0) { Components = UserNameCheck->Tag | RemoteDirectoryCheck->Tag; } for (int Index = 0; Index < OptionsGroup->ControlCount; Index++) { TCheckBox * CheckBox = dynamic_cast<TCheckBox *>(OptionsGroup->Controls[Index]); if (ALWAYS_TRUE((CheckBox != NULL) && (CheckBox->Tag != 0))) { CheckBox->Checked = FLAGSET(Components, CheckBox->Tag); } } UpdateControls(); ShowModal(); Components = 0; for (int Index = 0; Index < OptionsGroup->ControlCount; Index++) { TCheckBox * CheckBox = dynamic_cast<TCheckBox *>(OptionsGroup->Controls[Index]); if (ALWAYS_TRUE((CheckBox != NULL) && (CheckBox->Tag != 0)) && CheckBox->Checked) { Components |= CheckBox->Tag; } } WinConfiguration->GenerateUrlComponents = Components; }
//--------------------------------------------------------------------------- static void __fastcall DoApplicationMinimizeRestore(bool Minimize) { // WORKAROUND // When main window is hidden (command-line operation), // we do not want it to be shown by TApplication.Restore, // so we temporarily detach it from an application. // Probably not really necessary for minimizing phase, // but we do it for consistency anyway. TForm * MainForm = Application->MainForm; bool RestoreMainForm = false; if (ALWAYS_TRUE(MainForm != NULL) && !MainForm->Visible) { SetAppMainForm(NULL); RestoreMainForm = true; } try { if (Minimize) { Application->Minimize(); } else { Application->Restore(); } } __finally { if (RestoreMainForm) { SetAppMainForm(MainForm); } } }
//--------------------------------------------------------------------------- void __fastcall CallGlobalMinimizeHandler(TObject * Sender) { Configuration->Usage->Inc(L"OperationMinimizations"); if (ALWAYS_TRUE(GlobalOnMinimize != NULL)) { GlobalOnMinimize(Sender); } }
bool TOptions::WasSwitchAdded(UnicodeString & Switch) const { bool Result = ALWAYS_TRUE(FOptions.size() > 0) && (FOptions.back().Type == otSwitch); if (Result) { Switch = FOptions.back().Name; } return Result; }
//--------------------------------------------------------------------------- bool __fastcall CopyParamListPopupClick(TObject * Sender, TCopyParamType & Param, UnicodeString & Preset, int CopyParamAttrs, bool * SaveSettings) { TComponent * Item = dynamic_cast<TComponent *>(Sender); assert(Item != NULL); assert((Item->Tag >= cpiSaveSettings) && (Item->Tag < GUIConfiguration->CopyParamList->Count)); bool Result; if (Item->Tag == cpiConfigure) { bool MatchedPreset = (GUIConfiguration->CopyParamPreset[Preset] == Param); DoPreferencesDialog(pmPresets); Result = (MatchedPreset && GUIConfiguration->HasCopyParamPreset[Preset]); if (Result) { Param = GUIConfiguration->CopyParamPreset[Preset]; } } else if (Item->Tag == cpiCustom) { Result = DoCopyParamCustomDialog(Param, CopyParamAttrs); } else if (Item->Tag == cpiSaveSettings) { if (ALWAYS_TRUE(SaveSettings != NULL)) { *SaveSettings = !*SaveSettings; } Result = false; } else { Preset = (Item->Tag >= 0) ? GUIConfiguration->CopyParamList->Names[Item->Tag] : UnicodeString(); Param = GUIConfiguration->CopyParamPreset[Preset]; Result = true; } return Result; }
//--------------------------------------------------------------------------- static void __fastcall DoExceptNotify(TObject * ExceptObj, void * ExceptAddr, bool OSException, void * BaseOfStack) { if (ExceptObj != NULL) { Exception * E = dynamic_cast<Exception *>(ExceptObj); if ((E != NULL) && IsInternalException(E)) // optimization { DoExceptionStackTrace(ExceptObj, ExceptAddr, OSException, BaseOfStack); TJclStackInfoList * StackInfoList = JclLastExceptStackList(); if (ALWAYS_TRUE(StackInfoList != NULL)) { std::unique_ptr<TStrings> StackTrace(StackInfoListToStrings(StackInfoList)); DWORD ThreadID = GetCurrentThreadId(); TGuard Guard(StackTraceCriticalSection.get()); TStackTraceMap::iterator Iterator = StackTraceMap.find(ThreadID); if (Iterator != StackTraceMap.end()) { Iterator->second->Add(L""); Iterator->second->AddStrings(StackTrace.get()); } else { StackTraceMap.insert(std::make_pair(ThreadID, StackTrace.release())); } // this chains so that JclLastExceptStackList() returns NULL the next time // for the current thread delete StackInfoList; } } } }
//--------------------------------------------------------------------------- __fastcall ::TTrayIcon::TTrayIcon(unsigned int Id) { FVisible = false; FOnClick = NULL; FOnBalloonClick = NULL; FBalloonUserData = NULL; FTrayIcon = new NOTIFYICONDATA; memset(FTrayIcon, 0, sizeof(*FTrayIcon)); FTrayIcon->cbSize = sizeof(*FTrayIcon); FTrayIcon->uFlags = NIF_MESSAGE | NIF_ICON | NIF_TIP; // LoadIconMetric is available from Windows Vista only HMODULE ComCtl32Dll = GetModuleHandle(comctl32); if (ALWAYS_TRUE(ComCtl32Dll)) { typedef HRESULT WINAPI (* TLoadIconMetric)(HINSTANCE hinst, PCWSTR pszName, int lims, __out HICON *phico); TLoadIconMetric LoadIconMetric = (TLoadIconMetric)GetProcAddress(ComCtl32Dll, "LoadIconMetric"); if (LoadIconMetric != NULL) { // Prefer not to use Application->Icon->Handle as that shows 32x32 scaled down to 16x16 for some reason LoadIconMetric(MainInstance, L"MAINICON", LIM_SMALL, &FTrayIcon->hIcon); } } if (FTrayIcon->hIcon == 0) { FTrayIcon->hIcon = Application->Icon->Handle; } FTrayIcon->uID = Id; FTrayIcon->hWnd = AllocateHWnd(WndProc); FTrayIcon->uCallbackMessage = WM_TRAY_ICON; FTaskbarCreatedMsg = RegisterWindowMessage(L"TaskbarCreated"); }
//--------------------------------------------------------------------------- bool __fastcall TAuthenticateForm::PromptUser(TPromptKind Kind, UnicodeString Name, UnicodeString Instructions, TStrings * Prompts, TStrings * Results, bool ForceLog, bool StoredCredentialsTried) { bool Result; TList * Edits = GeneratePrompt(Instructions, Prompts); try { bool ShowSessionRememberPasswordPanel = false; bool ShowSavePasswordPanel = false; TSessionData * Data = NULL; bool PasswordPrompt = ((Kind == pkPassword) || (Kind == pkTIS) || (Kind == pkCryptoCard) || (Kind == pkKeybInteractive)) && (Prompts->Count == 1) && FLAGCLEAR(int(Prompts->Objects[0]), pupEcho); if (PasswordPrompt && StoredCredentialsTried) { Data = StoredSessions->FindSame(FSessionData); ShowSavePasswordPanel = (Data != NULL) && !Data->Password.IsEmpty(); } // do not offer to rememeber password, // if we are offering to save the password to stored session if (!ShowSavePasswordPanel && (Prompts->Count == 1) && FLAGSET(int(Prompts->Objects[0]), pupRemember) && ALWAYS_TRUE(PasswordPrompt)) { ShowSessionRememberPasswordPanel = true; } SavePasswordCheck->Checked = false; SavePasswordPanel->Visible = ShowSavePasswordPanel; SessionRememberPasswordCheck->Checked = false; SessionRememberPasswordPanel->Visible = ShowSessionRememberPasswordPanel; if (PasswordPanel->AutoSize) { PasswordPanel->AutoSize = false; PasswordPanel->AutoSize = true; } PasswordPanel->Realign(); assert(Results->Count == Edits->Count); for (int Index = 0; Index < Edits->Count; Index++) { TCustomEdit * Edit = reinterpret_cast<TCustomEdit *>(Edits->Items[Index]); Edit->Text = Results->Strings[Index]; } Result = Execute(Name, PasswordPanel, ((Edits->Count > 0) ? reinterpret_cast<TWinControl *>(Edits->Items[0]) : static_cast<TWinControl *>(PasswordOKButton)), PasswordOKButton, PasswordCancelButton, true, false, ForceLog); if (Result) { for (int Index = 0; Index < Edits->Count; Index++) { TCustomEdit * Edit = reinterpret_cast<TCustomEdit *>(Edits->Items[Index]); Results->Strings[Index] = Edit->Text; Prompts->Objects[Index] = (TObject *) ((int(Prompts->Objects[Index]) & ~pupRemember) | FLAGMASK(((Index == 0) && SessionRememberPasswordCheck->Checked), pupRemember)); } if (SavePasswordCheck->Checked) { assert(Data != NULL); assert(Results->Count >= 1); FSessionData->Password = Results->Strings[0]; Data->Password = Results->Strings[0]; // modified only, explicit StoredSessions->Save(false, true); } } } __finally { delete Edits; } return Result; }
//--------------------------------------------------------------------------- TForm * __fastcall CreateMessageDialogEx(const UnicodeString Msg, TStrings * MoreMessages, TQueryType Type, unsigned int Answers, UnicodeString HelpKeyword, const TMessageParams * Params, TButton *& TimeoutButton) { TMsgDlgType DlgType; switch (Type) { case qtConfirmation: DlgType = mtConfirmation; break; case qtInformation: DlgType = mtInformation; break; case qtError: DlgType = mtError; break; case qtWarning: DlgType = mtWarning; break; default: FAIL; } unsigned int TimeoutAnswer = (Params != NULL) ? Params->TimeoutAnswer : 0; unsigned int ActualAnswers = Answers; if ((Params == NULL) || Params->AllowHelp) { Answers = Answers | qaHelp; } if (IsInternalErrorHelpKeyword(HelpKeyword)) { Answers = Answers | qaReport; } if ((MoreMessages != NULL) && (MoreMessages->Count == 0)) { MoreMessages = NULL; } UnicodeString ImageName; UnicodeString MoreMessagesUrl; TSize MoreMessagesSize; if (Params != NULL) { ImageName = Params->ImageName; MoreMessagesUrl = Params->MoreMessagesUrl; MoreMessagesSize = Params->MoreMessagesSize; } const TQueryButtonAlias * Aliases = (Params != NULL) ? Params->Aliases : NULL; unsigned int AliasesCount = (Params != NULL) ? Params->AliasesCount : 0; UnicodeString NeverAskAgainCaption; bool HasNeverAskAgain = (Params != NULL) && FLAGSET(Params->Params, mpNeverAskAgainCheck); if (HasNeverAskAgain) { NeverAskAgainCaption = !Params->NeverAskAgainTitle.IsEmpty() ? (UnicodeString)Params->NeverAskAgainTitle : // qaOK | qaIgnore is used, when custom "non-answer" button is required LoadStr(((ActualAnswers == qaOK) || (ActualAnswers == (qaOK | qaIgnore))) ? NEVER_SHOW_AGAIN : NEVER_ASK_AGAIN); } TForm * Dialog = CreateMoreMessageDialog(Msg, MoreMessages, DlgType, Answers, Aliases, AliasesCount, TimeoutAnswer, &TimeoutButton, ImageName, NeverAskAgainCaption, MoreMessagesUrl, MoreMessagesSize); try { if (HasNeverAskAgain && ALWAYS_TRUE(Params != NULL)) { TCheckBox * NeverAskAgainCheck = FindNeverAskAgainCheck(Dialog); NeverAskAgainCheck->Checked = Params->NeverAskAgainCheckedInitially; if (Params->NeverAskAgainAnswer > 0) { NeverAskAgainCheck->Tag = Params->NeverAskAgainAnswer; } TNotifyEvent OnClick; ((TMethod*)&OnClick)->Code = NeverAskAgainCheckClick; NeverAskAgainCheck->OnClick = OnClick; } Dialog->HelpKeyword = HelpKeyword; if (FLAGSET(Answers, qaHelp)) { Dialog->BorderIcons = Dialog->BorderIcons << biHelp; } ResetSystemSettings(Dialog); } catch(...) { delete Dialog; throw; } return Dialog; }
//--------------------------------------------------------------------------- bool __stdcall TRichEdit20::StreamLoad( TRichEditStreamInfo * StreamInfo, unsigned char * Buff, long Read, long & WasRead) { WasRead = 0; bool Result; try { if (StreamInfo->Converter != NULL) { TBytes Buffer; Buffer.Length = Read + 1; Read = Read / 2; if ((Read % 2) > 0) { Read--; } WasRead = StreamInfo->Converter->ConvertReadStream(StreamInfo->Stream, Buffer, Read); if (WasRead > 0) { Buffer[WasRead] = 0; if (Buffer[WasRead - 1] == 13) { Buffer[WasRead - 1] = 0; WasRead--; } int StartIndex = 0; // Convert from desired Encoding to Unicode if (StreamInfo->PlainText) { if (StreamInfo->Encoding == NULL) { Buffer = TEncoding::Convert(TEncoding::Default, TEncoding::Unicode, Buffer, 0, WasRead); WasRead = Buffer.Length; } else { if (!TEncoding::Unicode->Equals(StreamInfo->Encoding)) { int MaxTries = StreamInfo->Encoding->GetMaxByteCount(1); while ((WasRead > 0) && (StreamInfo->Encoding->GetCharCount(Buffer, 0, WasRead) == 0)) { WasRead--; StreamInfo->Stream->Seek(-1, soFromCurrent); MaxTries--; if ((MaxTries == 0) || (WasRead == 0)) { FStreamLoadEncodingError = true; Abort(); } } Buffer = TEncoding::Convert(StreamInfo->Encoding, TEncoding::Unicode, Buffer, 0, WasRead); WasRead = Buffer.Length; } // If Unicode preamble is present, set StartIndex to skip over it TBytes Preamble = TEncoding::Unicode->GetPreamble(); if (ALWAYS_TRUE(Preamble.Length == 2) && (WasRead >= 2) && (Buffer[0] == Preamble[0]) && (Buffer[1] == Preamble[1])) { StartIndex = 2; // beware that this is also called from CreateWnd with some // dummy contents that always have BOM, so FLoadedWithPreamble // is true, unless overriden by LoadFromStream FLoadedWithPreamble = true; } } } WasRead = AdjustLineBreaks(Buff, Buffer, StartIndex, WasRead); } } Result = true; } catch (EEncodingError & E) { FStreamLoadError = true; FStreamLoadEncodingError = true; Result = false; } catch (Exception & E) { FStreamLoadError = true; Result = false; } return Result; }
//--------------------------------------------------------------------------- void __fastcall TAboutDialog::LoadThirdParty() { TWebBrowserEx * ThirdPartyWebBrowser = CreateBrowserViewer(ThirdPartyPanel, L""); reinterpret_cast<TLabel *>(ThirdPartyWebBrowser)->Color = clBtnFace; ThirdPartyWebBrowser->Navigate(L"about:blank"); while (ThirdPartyWebBrowser->ReadyState < ::READYSTATE_INTERACTIVE) { Application->ProcessMessages(); } std::unique_ptr<TFont> DefaultFont(new TFont()); UnicodeString ThirdParty; ThirdParty += L"<!DOCTYPE html>\n" L"<meta charset=\"utf-8\">\n" L"<html>\n" L"<head>\n" L"<style>\n" L"\n" L"body\n" L"{\n" L" font-family: '" + DefaultFont->Name + L"';\n" L" margin: 0.5em;\n" L" background-color: " + ColorToWebColorStr(Color) + L";\n" L"}\n" L"\n" L"body\n" L"{\n" L" font-size: " + IntToStr(DefaultFont->Size) + L"pt;\n" L"}\n" L"\n" L"p\n" L"{\n" L" margin-top: 0;\n" L" margin-bottom: 1em;\n" L"}\n" L"\n" L"a, a:visited, a:hover, a:visited, a:current\n" L"{\n" L" color: " + ColorToWebColorStr(LinkColor) + L";\n" L"}\n" L"</style>\n" L"</head>\n" L"<body>\n"; UnicodeString Br = "<br/>\n"; AddPara(ThirdParty, LoadStr(ABOUT_THIRDPARTY_HEADER)); AddPara(ThirdParty, FMTLOAD(PUTTY_BASED_ON, (LoadStr(PUTTY_VERSION))) + Br + LoadStr(PUTTY_COPYRIGHT) + Br + CreateLink(LoadStr(PUTTY_LICENSE_URL), LoadStr(ABOUT_THIRDPARTY_LICENSE)) + Br + CreateLink(LoadStr(PUTTY_URL))); #ifndef NO_FILEZILLA UnicodeString OpenSSLVersionText = GetOpenSSLVersionText(); CutToChar(OpenSSLVersionText, L' ', true); // "OpenSSL" UnicodeString OpenSSLVersion = CutToChar(OpenSSLVersionText, L' ', true); CutToChar(OpenSSLVersionText, L' ', true); // day CutToChar(OpenSSLVersionText, L' ', true); // month UnicodeString OpenSSLYear = CutToChar(OpenSSLVersionText, L' ', true); AddPara(ThirdParty, FMTLOAD(OPENSSL_BASED_ON, (OpenSSLVersion)) + Br + FMTLOAD(OPENSSL_COPYRIGHT2, (OpenSSLYear)) + Br + CreateLink(LoadStr(OPENSSL_URL))); AddPara(ThirdParty, LoadStr(FILEZILLA_BASED_ON2) + Br + LoadStr(FILEZILLA_COPYRIGHT2) + Br + CreateLink(LoadStr(FILEZILLA_URL))); #endif AddPara(ThirdParty, FMTLOAD(NEON_BASED_ON, (NeonVersion())) + Br + LoadStr(NEON_COPYRIGHT) + Br + CreateLink(LoadStr(NEON_URL))); #define EXPAT_LICENSE_URL L"license:expat" AddPara(ThirdParty, FMTLOAD(EXPAT_BASED_ON, (ExpatVersion())) + Br + CreateLink(EXPAT_LICENSE_URL, LoadStr(ABOUT_THIRDPARTY_LICENSE)) + Br + CreateLink(LoadStr(EXPAT_URL))); AddBrowserLinkHandler(ThirdPartyWebBrowser, EXPAT_LICENSE_URL, ExpatLicenceHandler); #ifndef NO_COMPONENTS AddPara(ThirdParty, FMTLOAD(ABOUT_TOOLBAR2000, (Toolbar2000Version)) + Br + LoadStr(ABOUT_TOOLBAR2000_COPYRIGHT) + Br + CreateLink(LoadStr(ABOUT_TOOLBAR2000_URL))); AddPara(ThirdParty, FMTLOAD(ABOUT_TBX, (TBXVersionString)) + Br + LoadStr(ABOUT_TBX_COPYRIGHT) + Br + CreateLink(LoadStr(ABOUT_TBX_URL))); AddPara(ThirdParty, LoadStr(ABOUT_FILEMANAGER) + Br + LoadStr(ABOUT_FILEMANAGER_COPYRIGHT)); #endif UnicodeString JclVersion = FormatVersion(JclVersionMajor, JclVersionMinor, JclVersionRelease); AddPara(ThirdParty, FMTLOAD(ABOUT_JCL, (JclVersion)) + Br + CreateLink(LoadStr(ABOUT_JCL_URL))); AddPara(ThirdParty, LoadStr(ABOUT_PNG) + Br + LoadStr(ABOUT_PNG_COPYRIGHT) + Br + CreateLink(LoadStr(ABOUT_PNG_URL))); ThirdParty += L"</body>\n" L"</html>\n"; std::unique_ptr<TMemoryStream> ThirdPartyStream(new TMemoryStream()); UTF8String ThirdPartyUTF8 = UTF8String(ThirdParty); ThirdPartyStream->Write(ThirdPartyUTF8.c_str(), ThirdPartyUTF8.Length()); ThirdPartyStream->Seek(0, 0); // For stream-loaded document, when set only after loading from OnDocumentComplete, // browser stops working SetBrowserDesignModeOff(ThirdPartyWebBrowser); TStreamAdapter * ThirdPartyStreamAdapter = new TStreamAdapter(ThirdPartyStream.get(), soReference); IPersistStreamInit * PersistStreamInit = NULL; if (ALWAYS_TRUE(ThirdPartyWebBrowser->Document != NULL) && SUCCEEDED(ThirdPartyWebBrowser->Document->QueryInterface(IID_IPersistStreamInit, (void **)&PersistStreamInit)) && ALWAYS_TRUE(PersistStreamInit != NULL)) { PersistStreamInit->Load(static_cast<_di_IStream>(*ThirdPartyStreamAdapter)); } }