public void NavigateGopherScheme(string fullQuery, System.Windows.Navigation.NavigatingCancelEventArgs e, SiteIdentity siteIdentity) { var sessionPath = Session.Instance.SessionPath; var appDir = System.AppDomain.CurrentDomain.BaseDirectory; //check if it is a query selector without a parameter if (!e.Uri.OriginalString.Contains("%09") && e.Uri.PathAndQuery.StartsWith("/7/")) { NavigateGopherWithInput(e); mMainWindow.ToggleContainerControlsForBrowser(true); //no further navigation right now e.Cancel = true; return; } var proc = new ExecuteProcess(); var finder = new ResourceFinder(); //use local or dev binary for gemget var gopherClient = finder.LocalOrDevFile(appDir, "GopherGet", "..\\..\\..\\GopherGet", "gopher-get.exe"); string hash; hash = HashService.GetMd5Hash(fullQuery); //uses .txt as extension so content loaded as text/plain not interpreted by the browser //if user requests a view-source. var gopherFile = sessionPath + "\\" + hash + ".txt"; var gmiFile = sessionPath + "\\" + hash + ".gmi"; var htmlFile = sessionPath + "\\" + hash + ".htm"; //delete txt file as GemGet seems to sometimes overwrite not create afresh File.Delete(gopherFile); //delete any existing html file to encourage webbrowser to reload it File.Delete(gmiFile); //save to the file var command = string.Format("\"{0}\" \"{1}\" \"{2}\"", gopherClient, fullQuery, gopherFile); var result = proc.ExecuteCommand(command, true, true); var exitCode = result.Item1; var stdOut = result.Item2; if (exitCode != 0) { mMainWindow.ToastNotify(result.Item3, ToastMessageStyles.Error); mMainWindow.ToggleContainerControlsForBrowser(true); //reenable browser e.Cancel = true; return; } if (File.Exists(gopherFile)) { string parseFile; if (stdOut.Contains("DIR") || stdOut.Contains("QRY")) { //convert gophermap to text/gemini //ToastNotify("Converting gophermap to " + gmiFile); result = ConverterService.GophertoGmi(gopherFile, gmiFile, fullQuery, GopherParseTypes.Map); parseFile = gmiFile; } else if (stdOut.Contains("TXT")) { result = ConverterService.GophertoGmi(gopherFile, gmiFile, fullQuery, GopherParseTypes.Text); parseFile = gmiFile; } else { //a download //copy to a file having its source extension var pathFragment = (new UriBuilder(fullQuery)).Path; var ext = Path.GetExtension(pathFragment); var binFile = gopherFile + (ext ?? ""); File.Copy(gopherFile, binFile, true); //rename overwriting if (stdOut.Contains("IMG") || stdOut.Contains("GIF")) { //show the image mMainWindow.ShowImage(fullQuery, binFile, e); } else { //show a save as dialog SaveFileDialog saveFileDialog = new SaveFileDialog(); saveFileDialog.FileName = Path.GetFileName(pathFragment); if (saveFileDialog.ShowDialog() == true) { try { //save the file var savePath = saveFileDialog.FileName; File.Copy(binFile, savePath, true); //rename overwriting mMainWindow.ToastNotify("File saved to " + savePath, ToastMessageStyles.Success); } catch (SystemException err) { mMainWindow.ToastNotify("Could not save the file due to: " + err.Message, ToastMessageStyles.Error); } } mMainWindow.ToggleContainerControlsForBrowser(true); e.Cancel = true; } return; } if (!File.Exists(gmiFile)) { mMainWindow.ToastNotify("Did not create expected GMI file for " + fullQuery + " in " + gmiFile, ToastMessageStyles.Error); mMainWindow.ToggleContainerControlsForBrowser(true); e.Cancel = true; } else { var settings = new Settings(); var userThemesFolder = finder.LocalOrDevFolder(appDir, @"GmiConverters\themes", @"..\..\GmiConverters\themes"); var userThemeBase = Path.Combine(userThemesFolder, settings.Theme); mMainWindow.ShowUrl(fullQuery, parseFile, htmlFile, userThemeBase, siteIdentity, e); } } }
public void NavigateGopherScheme(string fullQuery, System.Windows.Navigation.NavigatingCancelEventArgs e, SiteIdentity siteIdentity) { var sessionPath = Session.Instance.SessionPath; var appDir = AppDomain.CurrentDomain.BaseDirectory; //check if it is a query selector without a parameter if (!e.Uri.OriginalString.Contains("%09") && e.Uri.PathAndQuery.StartsWith("/7/")) { NavigateGopherWithInput(e); mMainWindow.ToggleContainerControlsForBrowser(true); //no further navigation right now e.Cancel = true; return; } var settings = new UserSettings(); var hash = HashService.GetMd5Hash(fullQuery); //uses .txt as extension so content loaded as text/plain not interpreted by the browser //if user requests a view-source. var gopherFile = sessionPath + "\\" + hash + ".txt"; var gmiFile = sessionPath + "\\" + hash + ".gmi"; var htmlFile = sessionPath + "\\" + hash + ".htm"; //delete txt file as GemGet seems to sometimes overwrite not create afresh File.Delete(gopherFile); //delete any existing html file to encourage webbrowser to reload it File.Delete(gmiFile); //get the content from Gopher using SmolNetSharp IResponse response; try { response = Gopher.Fetch(new Uri(fullQuery), settings.MaxDownloadSizeMb * 1024, settings.MaxDownloadTimeSeconds); File.WriteAllBytes(gopherFile, response.bytes.ToArray()); } catch (Exception err) { mMainWindow.ToastNotify(err.Message, ToastMessageStyles.Error); mMainWindow.ToggleContainerControlsForBrowser(true); //reenable browser e.Cancel = true; return; } var mime = response.mime; Tuple <int, string, string> result; if (File.Exists(gopherFile)) { string parseFile; if (mime == "application/gopher-menu") { //convert gophermap to text/gemini //ToastNotify("Converting gophermap to " + gmiFile); result = ConverterService.GophertoGmi(gopherFile, gmiFile, fullQuery, GopherParseTypes.Map); parseFile = gmiFile; } else if (mime == "text/plain") { result = ConverterService.GophertoGmi(gopherFile, gmiFile, fullQuery, GopherParseTypes.Text); parseFile = gmiFile; } else { //a download //copy to a file having its source extension var pathFragment = (new UriBuilder(fullQuery)).Path; var ext = Path.GetExtension(pathFragment); var binFile = gopherFile + (ext ?? ""); File.Copy(gopherFile, binFile, true); //rename overwriting if (mime == "image/png" || mime == "image/gif" || mime == "image/jpeg") { //show the image mMainWindow.ShowImage(fullQuery, binFile, e); } else { //show a save as dialog SaveFileDialog saveFileDialog = new SaveFileDialog(); saveFileDialog.FileName = Path.GetFileName(pathFragment); if (saveFileDialog.ShowDialog() == true) { try { //save the file var savePath = saveFileDialog.FileName; File.Copy(binFile, savePath, true); //rename overwriting mMainWindow.ToastNotify("File saved to " + savePath, ToastMessageStyles.Success); } catch (SystemException err) { mMainWindow.ToastNotify("Could not save the file due to: " + err.Message, ToastMessageStyles.Error); } } mMainWindow.ToggleContainerControlsForBrowser(true); e.Cancel = true; } return; } if (!File.Exists(gmiFile) || result.Item1 != 0) { mMainWindow.ToastNotify("Did not create expected GMI file for " + fullQuery + " in " + gmiFile, ToastMessageStyles.Error); mMainWindow.ToggleContainerControlsForBrowser(true); e.Cancel = true; } else { var userThemesFolder = ResourceFinder.LocalOrDevFolder(appDir, @"GmiConverters\themes", @"..\..\..\GmiConverters\themes"); var userThemeBase = Path.Combine(userThemesFolder, settings.Theme); mMainWindow.ShowUrl(fullQuery, parseFile, htmlFile, userThemeBase, siteIdentity, e); } } }