public Resource(Parser.Resource pObj, int page, bool ix2) { pageId = page; x2 = ix2; data = pObj.data; originalFileName = pObj.originalFileName; titleText = pObj.titleText; isInPesterLog = pObj.isInPesterLog; }
public Text(Parser.Text pObj, int pageno, bool ix2) { pageId = pageno; x2 = ix2; title = pObj.title; promptType = pObj.promptType; altText = pObj.altText; if(pObj.narr != null) narr = new ScriptLine(pObj.narr); if (pObj.lines != null) { lines = new List<ScriptLine>(); foreach (var l in pObj.lines) lines.Add(new ScriptLine(l)); } }
public Page(int no, Parser.Text t, Parser.Resource[] r, Parser.Link[] l) { number = no; meta = t; resources = r; links = l; }
public Link(Parser.Link pObj, int pageno) { pageId = pageno; linkTo = pObj.pageNumber; originalText = pObj.originalText; }
bool SavePage(int currentPage, WrapBGW bgw = null, int currentProgress = 0) { if (Enum.IsDefined(typeof(PagesOfImportance), currentPage)) { try { switch ((PagesOfImportance)currentPage) { case PagesOfImportance.CASCADE: HandleCascade(bgw, currentProgress); break; case PagesOfImportance.CALIBORN_PAGE_SMASH: HandlePageSmash(bgw, currentProgress); break; case PagesOfImportance.CALIBORN_PAGE_SMASH2: HandlePageSmash2(bgw, currentProgress); break; case PagesOfImportance.DOTA: HandleDota(bgw, currentProgress); break; case PagesOfImportance.SHES8ACK: FailToHandleVriska(bgw, currentProgress); break; case PagesOfImportance.GAMEOVER: FailMiserably(bgw, currentProgress); break; case PagesOfImportance.OVERSHINE: HandleOvershine(bgw, currentProgress); break; case PagesOfImportance.JAILBREAK_LAST_PAGE: HandleJailbreakLast(bgw, currentProgress); break; case PagesOfImportance.COLLIDE: case PagesOfImportance.ACT7: HandleYoutubeVideo(bgw, currentProgress, (PagesOfImportance)currentPage == PagesOfImportance.COLLIDE); break; } archivedPages.Add(currentPage); } catch { if (bgw != null && !bgw.bgw.Cancelled()) bgw.ReportProgress(currentProgress, "Error parsing special page " + currentPage); return false; } finally { if (bgw != null) bgw.ReportProgress(currentProgress, ""); } return true; } if (archivedPages.IsPageArchived(currentPage)) return true; if (Parser.IsTrickster(currentPage)) ParseTrickster(); if (Parser.Is2x(currentPage)) Parsex2Header(); if (Enum.IsDefined(typeof(PasswordPages), currentPage + 1)) ParseTerezi(); if(bgw != null && Parser.IsOpenBound(currentPage)) bgw.ReportProgress(currentProgress, "Parsing an Openbound page. There are tons of tiny downloads and this will take a couple minutes..."); using (var parser = new Parser()) { if (parser.LoadPage(currentPage)) { int missedPages = 0; if (!parser.x2Flag) { if (!WritePage(bgw, currentPage, currentProgress, 0, parser)) missedPages++; } else { if (!WritePage(bgw, currentPage, currentProgress, 1, parser)) missedPages += 2; else { parser.Reparse(); if (!WritePage(bgw, currentPage, currentProgress, 2, parser)) missedPages += 2; } } //simple enough, leave it to the reader to decode the multiple pages return missedPages == 0; } else return false; } }
bool WritePage(WrapBGW bgw, int currentPage, int currentProgress, int x2phase, Parser parser) { try { var res = parser.GetResources(); var links = parser.GetLinks(); var text = parser.GetText(); if (bgw != null) bgw.ReportProgress(currentProgress, "Page " + currentPage + ": " + text.title); if (text.narr == null) { if (bgw != null) bgw.ReportProgress(currentProgress, text.promptType); for (int i = 0; i < text.lines.Count(); ++i) { if (!text.lines[i].isImg) { if (bgw != null) bgw.ReportProgress(currentProgress, (text.lines[i].subTexts != null ? text.lines[i].subTexts.Count() : 0) + " special subtexts, Colour: " + text.lines[i].hexColour + ": " + text.lines[i].text); } else if (bgw != null) bgw.ReportProgress(currentProgress, "Imageline"); } } else if(bgw != null) bgw.ReportProgress(currentProgress, "Narrative: " + text.narr.text); if(bgw != null) for (int i = 0; i < links.Count(); ++i) bgw.ReportProgress(currentProgress, "\"" + links[i].originalText + "\" links to " + links[i].pageNumber); for (int i = 0; i < res.Count(); ++i) { var fileSize = res[i].data.Count(); totalMegabytesDownloaded += (float)fileSize / (1024.0f * 1024.0f); if (bgw != null) bgw.ReportProgress(currentProgress, res[i].originalFileName + ": " + fileSize / 1024 + "KB"); } if (bgw != null) bgw.ReportProgress(currentProgress, "Total Data Downloaded: " + (int)totalMegabytesDownloaded + "MB"); if (bgw != null && x2phase != 1) bgw.ReportProgress(currentProgress, ""); var p = new Page(currentPage, text, res, links); p.x2 = x2phase == 2; WritePageToDB(p); if (x2phase != 1) { archivedPages.Add(currentPage); } } catch { Debugger.Break(); if (bgw != null) bgw.ReportProgress(currentProgress, "Error in archiving page: " + currentPage); return false; } return true; }
protected void ParseTrickster() { if (!TricksterParsed()) { if (!wl.TestAndSet()) { using (var parser = new Parser()) { parser.LoadTricksterResources(); WriteResource(parser.GetResources(), (int)SpecialResources.TRICKSTER_HEADER); } } } }
public TricksterShit(Reader p,Parser.Resource[] shit) { parent = p; bytes[0] = new MemoryStream(shit[0].data); bytes[1] = new MemoryStream(shit[2].data); bg = Image.FromStream(bytes[0]); fg = Image.FromStream(bytes[1]); parent.BackgroundImage = bg; parent.mainPanel.BackgroundImage = fg; flashHeader = new WebBrowser(); parent.Controls.Add(flashHeader); flashHeader.Width = 950; flashHeader.Height = 24; parent.InitFlashMovie(flashHeader,shit[1]); FixAlign(); }
public abstract void WriteResource(Parser.Resource[] res, int page);
protected void ParseTerezi() { if (!TereziParsed()) { using (var parser = new Parser()) { parser.GetTerezi(); WriteResource(parser.GetResources(), (int)SpecialResources.TEREZI_PASSWORD); } } }
public bool Initialize(System.ComponentModel.BackgroundWorker bgw) { if (ReadLastIndexedOrCreateDatabase(bgw)) { using (var parser = new Parser()) { bgw.ReportProgress(0, "Checking MSPA for latest page..."); lastPage = parser.GetLatestPage(); if (lastPage == 0) { lastPage = archivedPages.FindHighestPage(); if (lastPage == 0) { MessageBox.Show("The database is empty. Cannot read MSPA."); return false; } } else if (lastPage != (int)StoryBoundaries.HS_END) { var pg = archivedPages.Prune(); if (pg != 0) { bgw.ReportProgress(0, "Reparsing last page... The may take a while if you stopped on a big page"); Prune(pg); SavePage(pg); } } if (!IconsAreParsed()) { bgw.ReportProgress(0, "Downloading header icons..."); try { parser.LoadIcons(); WriteResource(parser.GetResources(), (int)SpecialResources.CANDYCORNS); } catch { MessageBox.Show("Unable to load icons above pages! Parsing failure!"); return false; } } } return true; } MessageBox.Show("Error creating the database!"); return false; }
static void Main() { if (mutex.WaitOne(TimeSpan.Zero, true)) //make sure we're the only instance Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); //must be done before showing message boxes try { string oldUpdatePath = Application.StartupPath + System.IO.Path.DirectorySeparatorChar + System.AppDomain.CurrentDomain.FriendlyName.Replace(" Update.exe", ".exe"); if (oldUpdatePath != Application.StartupPath + System.IO.Path.DirectorySeparatorChar + System.AppDomain.CurrentDomain.FriendlyName) try { if (System.IO.File.Exists(oldUpdatePath)) { MessageBox.Show("Update successful!"); System.IO.File.Delete(oldUpdatePath); //delete the old version } else { oldUpdatePath = oldUpdatePath.Replace(".exe", ""); if (System.IO.File.Exists(oldUpdatePath)) { MessageBox.Show("Update successful!"); System.IO.File.Delete(oldUpdatePath); } } } catch { } try { var tmpParser = new Parser(); var res = tmpParser.CheckIfUpdateIsAvailable(); tmpParser.Dispose(); if (res != 0) { if (MessageBox.Show("Release version "+res+" available. Download now?", "Update Available", MessageBoxButtons.YesNo) == DialogResult.Yes) { try{ string path = (Application.StartupPath + System.IO.Path.DirectorySeparatorChar + System.AppDomain.CurrentDomain.FriendlyName).Replace(".exe", " Update.exe"); if (path == Application.StartupPath + System.IO.Path.DirectorySeparatorChar + System.AppDomain.CurrentDomain.FriendlyName) path += "Update.exe"; System.IO.File.WriteAllBytes(path, Parser.DownloadFile(updateURL)); System.Diagnostics.Process.Start(path); return; } catch { MessageBox.Show("Error downloading/saving the update! You can get it manually at https://github.com/cybnetsurfe3011/MSPA-Reader/releases."); } } } } catch { MessageBox.Show("Unable to check for updates!"); } try { DecryptSavedPassword(); var lastPage = Properties.Settings.Default.lastReadPage; new DatabaseLogin().Show(); Application.Run(); } catch { throw; } finally { EncryptSavedPassword(); Properties.Settings.Default.Save(); } } catch (Exception e){ MessageBox.Show("An unhandled exception occured. Please file a bug report at https://www.github.com/cybnetsurfe3011/MSPA-Reader containing the following: " + Environment.NewLine + Environment.NewLine + e.ToString(), "Critical Error!"); } finally { mutex.ReleaseMutex(); } }
//https://stackoverflow.com/questions/1874077/loading-a-flash-movie-from-a-memory-stream-or-a-byte-array //* private void InitFlashMovie(WebBrowser f, Parser.Resource swfFile, bool setDimensions = true) { if (setDimensions) SetFlashDimensions(); var loc = WriteTempResource(ref swfFile); f.WebBrowserShortcutsEnabled = false; if (page.number == 8848 || page.number == 8850) f.DocumentText = "<style>html, body {{ padding: 0; margin: 0 }}</style><img src=\"" + loc + "\" border=\"0\"></img>"; else f.Navigate(loc); f.Navigating += flash_Navigating; }
public ScriptLine(Parser.Text.ScriptLine sl) { isImg = sl.isImg; hexColour = sl.hexColour; text = sl.text; precedingLineBreaks = sl.precedingLineBreaks; if (sl.subTexts != null) { subTexts = new List<SpecialSubText>(); foreach (var sst in sl.subTexts) subTexts.Add(new SpecialSubText(sst)); } }
protected void Parsex2Header() { if (!x2HeaderParsed()) { using (var parser = new Parser()) { parser.GetX2Header(); WriteResource(parser.GetResources(), (int)SpecialResources.X2_HEADER); } } }
public SpecialSubText(Parser.Text.ScriptLine.SpecialSubText sst) { begin = sst.begin; length = sst.length; isImg = sst.isImg; isLink = sst.isLink; underlined = sst.underlined; colour = sst.colour; }
string WriteTempResource(ref Parser.Resource res, bool findSburbScript = false) { string path = System.IO.Path.GetTempPath() + res.originalFileName; if(Parser.IsOpenBound(page.number)) Directory.CreateDirectory(Path.GetDirectoryName(path)); File.WriteAllBytes(path, res.data); //let the throw fall through and fail the page load (problems beyond our scope) res = null; GC.Collect(); tempFiles.Add(path); if(!findSburbScript || Path.GetFileName(path) == "Sburb.min.js") return path; return null; }