예제 #1
0
        void PageBrowser_NavigationFailed(object sender, System.Windows.Navigation.NavigationFailedEventArgs e)
        {
            AwfulDebugger.AddLog(this, AwfulDebugger.Level.Debug, "Event: PageBrowser_NavigationFailed");

            try
            {
                // ignore javascript uri navigation failures
                if (e.Uri.AbsoluteUri.Contains("javascript"))
                {
                    return;
                }

                else if (e.Uri.OriginalString.Contains(Constants.THREAD_VIEWER_FILENAME))
                {
                    AwfulDebugger.AddLog(this, AwfulDebugger.Level.Critical, "Thread View Initialization failed.");
                    this.InitializeBrowserForPageView(sender as WebBrowser);
                }

                else
                {
                    this.IsReady = false;
                }
            }

            catch (Exception ex) {
                AwfulDebugger.AddLog(this, AwfulDebugger.Level.Critical, ex);
                this.IsReady = false;
            }
        }
예제 #2
0
        private Uri ReplyToThread(ThreadMetadata thread, string text)
        {
            var             threadID = thread.ThreadID;
            ThreadReplyData?data     = GetReplyData(threadID, text);

            if (data.HasValue)
            {
                AwfulDebugger.AddLog(this, AwfulDebugger.Level.Debug, "ThreadReplyService");
                AwfulDebugger.AddLog(this, AwfulDebugger.Level.Debug, "Begin Reply data...");
                AwfulDebugger.AddLog(this, AwfulDebugger.Level.Debug, "ThreadID: " + data.Value.THREADID);
                AwfulDebugger.AddLog(this, AwfulDebugger.Level.Debug, "Begin Text...");
                AwfulDebugger.AddLog(this, AwfulDebugger.Level.Debug, data.Value.TEXT);
                AwfulDebugger.AddLog(this, AwfulDebugger.Level.Debug, "...End Text.");
                AwfulDebugger.AddLog(this, AwfulDebugger.Level.Debug, "Form key: " + data.Value.FORMKEY);
                AwfulDebugger.AddLog(this, AwfulDebugger.Level.Debug, "Form cookie: " + data.Value.FORMCOOKIE);
                AwfulDebugger.AddLog(this, AwfulDebugger.Level.Debug, "...End reply data.");

                return(InitiateReply(data.Value));
            }

            else
            {
                AwfulDebugger.AddLog(this, AwfulDebugger.Level.Critical, "ThreadReplyService - ReplyAsync failed on null ThreadReplyData.");
                return(null);
            }
        }
예제 #3
0
        public IEnumerable <ForumMetadata> Private_FetchAllForums()
        {
            AwfulDebugger.AddLog(this, AwfulDebugger.Level.Debug, "START FetchAllForums()");
            AwfulDebugger.AddLog(this, AwfulDebugger.Level.Info, "Fetching Forums from SA...");

            string url = string.Format("{0}/{1}?forumid=1", CoreConstants.BASE_URL, CoreConstants.FORUM_PAGE_URI);
            var    web = new AwfulWebClient();
            var    doc = web.FetchHtml(url).ToHtmlDocument();

            AwfulDebugger.AddLog(this, AwfulDebugger.Level.Info, "Forum fetch complete. Parsing...");

            var result = ForumParser.ParseForumList(doc);

            AwfulDebugger.AddLog(this, AwfulDebugger.Level.Info, "Parse complete.");

#if DEBUG
            Debug.WriteLine("Performing Sanitization Check...");
            bool clear = SanitizationCheck(result);
            Debug.WriteLine("Check Result: " + clear);
            foreach (var forum in result)
            {
                Debug.WriteLine(forum);
            }
#endif
            AwfulDebugger.AddLog(this, AwfulDebugger.Level.Debug, "END FetchAllForums()");
            return(result);
        }
예제 #4
0
        private void FetchHtmlStateAsync(string url, Action <FetchHtmlState> callback, int timeout = DefaultTimeoutInMilliseconds)
        {
            AwfulDebugger.AddLog(this, AwfulDebugger.Level.Debug, string.Format("START FetchHtml({0}, {1})", url, timeout));
            AwfulDebugger.AddLog(this, AwfulDebugger.Level.Info, "Performing authentication check...");

            Authenticate();

            AwfulDebugger.AddLog(this, AwfulDebugger.Level.Info, "Authentication check complete.");
            AwfulDebugger.AddLog(this, AwfulDebugger.Level.Info, string.Format("Requesting html from url '{0}'...", url));

            if (!NetworkInterface.GetIsNetworkAvailable())
            {
                throw new Exception("The network is unavailable. Check your network settings and please try again.");
            }

            if (SimulateTimeout)
            {
                AwfulDebugger.AddLog(this, AwfulDebugger.Level.Info, "SimulateTimeout = true.");
                Random random = new Random();
                int    value  = random.Next(1, 101);
                if (value <= SimulateTimeoutChance)
                {
                    AwfulDebugger.AddLog(this, AwfulDebugger.Level.Info, "Timeout generated.");
                    throw new TimeoutException("Artificial timeout generated!");
                }
            }

            FetchHtmlState state = new FetchHtmlState(timeout);

            state.Callback = callback;
            state.Request  = AwfulWebRequest.CreateGetRequest(url);
            state.Request.BeginGetResponse(FetchHtmlAsyncResponse, state);
            state.StartTimer();
        }
예제 #5
0
        private void ManageScriptAction(string action)
        {
            if (IgnoreInteractions)
            {
                return;
            }

            if (this._eventManager.ContainsKey(action))
            {
                this._eventManager[action](null);
            }
            else
            {
                // check for delimiter in action
                var delim  = JS_ARG_DELIMITER.ToCharArray();
                var tokens = action.Split(delim, StringSplitOptions.RemoveEmptyEntries);
                if (this._eventManager.ContainsKey(tokens[0]))
                {
                    this._eventManager[tokens[0]](action);
                }
                else
                {
                    AwfulDebugger.AddLog(this, AwfulDebugger.Level.Debug, action);
#if DEBUG
                    MessageBox.Show(action, "debug: script action", MessageBoxButton.OK);
#endif
                }
            }
        }
예제 #6
0
        private byte[] GetReplyMultipartFormData(ThreadReplyData data)
        {
            Stream        dataStream = new MemoryStream();
            StringBuilder sb         = new StringBuilder();

            AddFormDataString(sb, "action", REPLY_ACTION_REQUEST, REPLY_HEADER);
            AddFormDataString(sb, "threadid", data.THREADID, REPLY_HEADER);
            AddFormDataString(sb, "formkey", data.FORMKEY, REPLY_HEADER);
            AddFormDataString(sb, "form_cookie", data.FORMCOOKIE, REPLY_HEADER);
            AddFormDataString(sb, "message", data.TEXT, REPLY_HEADER);
            AddFormDataString(sb, "parseurl", PARSEURL_REQUEST, REPLY_HEADER);
            AddFormDataString(sb, "submit", SUBMIT_REQUEST, REPLY_HEADER);
            sb.AppendLine(REPLY_FOOTER);

            string content = sb.ToString();

            AwfulDebugger.AddLog(this, AwfulDebugger.Level.Debug, "Begin form data...");
            AwfulDebugger.AddLog(this, AwfulDebugger.Level.Debug, content);
            AwfulDebugger.AddLog(this, AwfulDebugger.Level.Debug, "..End form data.");

            dataStream.Write(encoding.GetBytes(content), 0, content.Length);

            dataStream.Position = 0;
            byte[] formData = new byte[dataStream.Length];
            dataStream.Read(formData, 0, formData.Length);
            dataStream.Close();

            return(formData);
        }
예제 #7
0
        private byte[] GetEditMultipartFormData(PostEditData data)
        {
            Stream        dataStream = new MemoryStream();
            StringBuilder sb         = new StringBuilder();

            AddFormDataString(sb, "action", EDIT_ACTION_REQUEST, EDIT_HEADER);
            AddFormDataString(sb, "postid", data.POSTID, EDIT_HEADER);
            AddFormDataString(sb, "message", data.TEXT, EDIT_HEADER);
            AddFormDataString(sb, "parseurl", PARSEURL_REQUEST, EDIT_HEADER);
            AddFormDataString(sb, "bookmark", BOOKMARK_REQUEST, EDIT_HEADER);
            AddFormDataString(sb, "submit", SUBMIT_REQUEST, EDIT_HEADER);
            sb.AppendLine(EDIT_FOOTER);

            string content = sb.ToString();

            AwfulDebugger.AddLog(this, AwfulDebugger.Level.Debug, "Begin form data...");
            AwfulDebugger.AddLog(this, AwfulDebugger.Level.Debug, content);
            AwfulDebugger.AddLog(this, AwfulDebugger.Level.Debug, "...End form data.");

            dataStream.Write(encoding.GetBytes(content), 0, content.Length);

            dataStream.Position = 0;
            byte[] formData = new byte[dataStream.Length];
            dataStream.Read(formData, 0, formData.Length);
            dataStream.Close();

            return(formData);
        }
예제 #8
0
        private void FetchHtmlAsyncResponse(IAsyncResult result)
        {
            FetchHtmlState state = result.AsyncState as FetchHtmlState;

            state.IgnoreTimeout = true;

            try
            {
                AwfulDebugger.AddLog(this, AwfulDebugger.Level.Debug, "START ProcessResponse()");

                using (var response = state.Request.EndGetResponse(result))
                    using (var stream = new StreamReader(response.GetResponseStream(),
                                                         Encoding.GetEncoding(CoreConstants.WEB_RESPONSE_ENCODING)))
                    {
                        state.Html = stream.ReadToEnd();
                    }

                AwfulDebugger.AddLog(this, AwfulDebugger.Level.Debug, "END ProcessResponse()");

                if (string.IsNullOrEmpty(state.Html))
                {
                    throw new NullReferenceException("fetch html result is null or empty");
                }
            }

            catch (Exception ex) { state.Error = ex; }

            state.Callback(state);
        }
예제 #9
0
        private static ThreadPageMetadata ParsePostTable(this ThreadPageMetadata page, HtmlNode top)
        {
            if (page.Posts == null)
            {
                page.Posts = new List <ThreadPostMetadata>();
            }

            AwfulDebugger.AddLog(top, AwfulDebugger.Level.Debug, "Parsing post data...");

            var postArray = top.Descendants(THREAD_POST_HTML_ELEMENT)
                            .Where(tables => tables.GetAttributeValue(THREAD_POST_HTML_ATTRIBUTE, "").Equals(THREAD_POST_HTML_VALUE))
                            .ToArray();

            int index = 1;

            foreach (var postNode in postArray)
            {
                ThreadPostMetadata post = PostParser.ParsePost(postNode);
                post.PageIndex = index;
                page.Posts.Add(post);
                index++;
            }

            // check if there is at least one post on the page. If not, there was a parsing error.
            if (page.Posts.Count == 0)
            {
                throw new Exception("Parse Error: Could not parse the posts on this page.");
            }

            AwfulDebugger.AddLog(top, AwfulDebugger.Level.Debug, "Thread page parsing complete.");

            return(page);
        }
예제 #10
0
        public static bool SaveBinaryToIsoStore(this byte[] bytes, string filePath,
                                                IsolatedStorageFile storage = null)
        {
            bool success = false;

            try
            {
                if (storage == null)
                {
                    storage = IsolatedStorageFile.GetUserStoreForApplication();
                }

                if (storage.FileExists(filePath))
                {
                    storage.DeleteFile(filePath);
                }

                if (BuildPath(storage, filePath))
                {
                    using (BinaryWriter writer = new BinaryWriter(
                               new IsolatedStorageFileStream(filePath, FileMode.OpenOrCreate, FileAccess.Write, storage)))
                    {
                        writer.Write(bytes);
                        success = true;
                    }
                }
            }
            catch (Exception ex) {
                AwfulDebugger.AddLog(new object(), AwfulDebugger.Level.Critical, ex);
                success = false;
            }
            return(success);
        }
예제 #11
0
 void PageBrowser_Navigating(object sender, NavigatingEventArgs e)
 {
     AwfulDebugger.AddLog(this, AwfulDebugger.Level.Debug, "Event: PageBrowser_Navigating");
     if (e.Uri.OriginalString.Contains(Constants.THREAD_VIEWER_FILENAME))
     {
         AwfulDebugger.AddLog(this, AwfulDebugger.Level.Debug, "Loading View Html in browser...");
     }
 }
예제 #12
0
        private string BeginGetTextFromWebForm(string webUrl)
        {
            var web = new AwfulWebClient();
            var url = webUrl;
            var doc = web.FetchHtml(url).ToHtmlDocument();

            AwfulDebugger.AddLog(this, AwfulDebugger.Level.Debug, string.Format("ThreadReplyServer - Retrieving text from '{0}'.", url));

            string bodyText = GetFormText(doc.DocumentNode);

            return(HttpUtility.HtmlDecode(bodyText));
        }
예제 #13
0
        private void Authenticate()
        {
            AwfulDebugger.AddLog(this, AwfulDebugger.Level.Debug, "START Authenticate");
            // first, check iso storage for cookies.
            // TODO: the above.

            // else, login using the supplied username and password.
            var login = new AwfulLoginClient();
            int tries = 0;

            while (!AwfulWebRequest.CanAuthenticate && tries < 3)
            {
                AwfulDebugger.AddLog(this, AwfulDebugger.Level.Info, "Authentication failed, attempting to try again...");

                var loginArgs = OnLoginRequired(this);
                if (loginArgs == null)
                {
                    throw new Exception("You need to attach an event listener for login required!");
                }

                loginArgs.Signal.WaitOne();

                if (loginArgs.Ignore)
                {
                    AwfulDebugger.AddLog(this, AwfulDebugger.Level.Info, "Ignoring authentication request. Moving on...");
                    return;
                }

                else if (!loginArgs.Cancel)
                {
                    AwfulDebugger.AddLog(this, AwfulDebugger.Level.Info, "User has input credentials; retrying...");

                    Username = loginArgs.Username;
                    Password = loginArgs.Password;
                    AwfulWebRequest.SetCookieJar(login.Authenticate(Username, Password));
                    tries++;
                }

                // automatically fail on cancel
                else
                {
                    throw new Exception("User cancelled authentication.");
                }
            }

            // after too many tries throw the white flag.
            if (tries > 3)
            {
                throw new Exception("User failed to authenticate.");
            }

            AwfulDebugger.AddLog(this, AwfulDebugger.Level.Debug, "END Authenticate()");
        }
예제 #14
0
        private Uri HandleGetResponse(IAsyncResult result)
        {
            //Logger.AddEntry("ThreadReplyService - GetResponse initiated.");
            HttpWebRequest  webRequest = result.AsyncState as HttpWebRequest;
            HttpWebResponse response   = webRequest.EndGetResponse(result) as HttpWebResponse;
            string          html       = string.Empty;

            using (StreamReader reader = new StreamReader(response.GetResponseStream()))
            {
                string text = reader.ReadToEnd();
                html = text;
            }

            // Check if response was successful - Look for redirect data.

            AwfulDebugger.AddLog(this, AwfulDebugger.Level.Verbose, "Begin server response...");
            AwfulDebugger.AddLog(this, AwfulDebugger.Level.Verbose, html);
            AwfulDebugger.AddLog(this, AwfulDebugger.Level.Verbose, "...End server response.");

            HtmlDocument responseHtml = new HtmlDocument();

            responseHtml.LoadHtml(html);

            HtmlNode responseRedirectMeta = responseHtml.DocumentNode.Descendants("meta")
                                            .Where(meta => meta.GetAttributeValue("http-equiv", "").Equals("Refresh"))
                                            .SingleOrDefault();

            // try to parse redirect url
            AwfulDebugger.AddLog(this, AwfulDebugger.Level.Debug, "Attempting to parse redirect url...");

            Uri redirect = null;

            try
            {
                string delim         = "URL=";
                string contentValue  = responseRedirectMeta.GetAttributeValue("content", "");
                var    tokens        = contentValue.Split(new string[] { delim }, StringSplitOptions.RemoveEmptyEntries);
                string redirectValue = tokens[1];
                redirectValue = HttpUtility.HtmlDecode(redirectValue);
                redirect      = new Uri(string.Format("{0}/{1}", CoreConstants.BASE_URL, redirectValue));

                AwfulDebugger.AddLog(this, AwfulDebugger.Level.Debug, string.Format("Url: '{0}'", redirect.AbsoluteUri));
            }

            catch (Exception ex)
            {
                AwfulDebugger.AddLog(this, AwfulDebugger.Level.Critical, "Redirect parsing failed.");
                AwfulDebugger.AddLog(this, AwfulDebugger.Level.Critical, ex);
            }

            return(redirect);
        }
예제 #15
0
        /*
         * public static ThreadPageMetadata ParseThreadPage(Uri threadPageUri)
         * {
         *  var client = new AwfulWebClient();
         *  var htmlDoc = client.FetchHtml(threadPageUri.AbsoluteUri);
         *  return ParseThreadPage(htmlDoc);
         * }
         */

        private static ThreadPageMetadata ProcessThreadPage(HtmlNode top)
        {
            AwfulDebugger.AddLog(top, AwfulDebugger.Level.Debug, "Parsing HTML for posts...");

            // first, let's generate data about the thread
            ThreadPageMetadata page = new ThreadPageMetadata()
                                      .ProcessParent(top)
                                      .ParsePageNumberAndMaxPages(top)
                                      .ParsePostTable(top)
                                      .ParseTargetPostIndex();

            return(page);
        }
예제 #16
0
        private void InitThreadTagCache(object state)
        {
            string tagListUrl = state as string;

            // download the tag list
            HttpWebRequest request = HttpWebRequest.CreateHttp(tagListUrl);

            try { request.BeginGetResponse(InitThreadTagCacheResponse, request); }
            catch (Exception ex)
            {
                AwfulDebugger.AddLog(this, AwfulDebugger.Level.Critical, ex);
                ThreadTagNextUpdate = 0;
            }
        }
예제 #17
0
        public static void StopLogging()
        {
            if (Instance.IsInDesignMode)
            {
                return;
            }

            try
            {
                AwfulDebugger.SaveAndDispose();
            }

            catch (Exception) { }
        }
예제 #18
0
 public static byte[] ReadFileFromResourceStore(string filePath)
 {
     byte[] result = null;
     try
     {
         Stream stream = Application.GetResourceStream(new Uri(filePath, UriKind.RelativeOrAbsolute)).Stream;
         using (BinaryReader reader = new BinaryReader(stream))
         {
             result = reader.ReadBytes((int)stream.Length);
         }
     }
     catch (Exception ex) { AwfulDebugger.AddLog(new object(), AwfulDebugger.Level.Critical, ex); }
     return(result);
 }
예제 #19
0
        private static ThreadPageMetadata ParsePageNumberAndMaxPages(this ThreadPageMetadata page, HtmlNode top)
        {
            // now, let's parse page number
            AwfulDebugger.AddLog(top, AwfulDebugger.Level.Debug, "Parsing page number...");

            int pageNumber = -1;
            int lastPage   = -1;

            var currentPageNode = top.Descendants(THREAD_PAGE_NUMBER_ELEMENT_1)
                                  .Where(node => node.GetAttributeValue(THREAD_PAGE_NUMBER_ATTRIBUTE_1, "").Contains(THREAD_PAGE_NUMBER_VALUE_1))
                                  .FirstOrDefault();

            if (currentPageNode != null)
            {
                var currentPageOptions = currentPageNode.Descendants(THREAD_PAGE_NUMBER_ELEMENT_2);

                var currentPageOption = currentPageOptions
                                        .Where(node => node.GetAttributeValue(THREAD_PAGE_NUMBER_ATTRIBUTE_2, "").Equals(THREAD_PAGE_NUMBER_VALUE_2))
                                        .FirstOrDefault();

                AwfulDebugger.AddLog(top, AwfulDebugger.Level.Debug, "Parsing total number of pages...");

                var lastPageOption = currentPageOptions.LastOrDefault();

                if (currentPageOption != null)
                {
                    int.TryParse(currentPageOption.GetAttributeValue(THREAD_PAGE_NUMBER_ATTRIBUTE_3, ""), out pageNumber);
                }

                if (lastPageOption != null)
                {
                    int.TryParse(lastPageOption.GetAttributeValue(THREAD_PAGE_NUMBER_ATTRIBUTE_3, ""), out lastPage);
                }

                page.PageNumber = pageNumber;
                page.LastPage   = lastPage;
            }

            else
            {
                AwfulDebugger.AddLog(top, AwfulDebugger.Level.Debug, "Page number parsing failed.");
                // set page number
                page.PageNumber = 1;
                page.LastPage   = 1;
            }



            return(page);
        }
예제 #20
0
        private Uri InitiateReply(ThreadReplyData data, int timeout = DEFAULT_TIMEOUT)
        {
            // create request
            AwfulDebugger.AddLog(this, AwfulDebugger.Level.Debug, "Creating Reply Request...");

            string url     = "http://forums.somethingawful.com/newreply.php";
            var    request = AwfulWebRequest.CreateFormDataPostRequest(url, REPLY_CONTENT_TYPE);

            if (request == null)
            {
                throw new NullReferenceException("request is not an http request.");
            }

            request.AllowAutoRedirect = true;

            // begin request stream
            AwfulDebugger.AddLog(this, AwfulDebugger.Level.Debug, "Beginning Request Stream...");

            var signal = new AutoResetEvent(false);
            var result = request.BeginGetRequestStream(callback => { signal.Set(); }, request);

            signal.WaitOne();

            // process request
            AwfulDebugger.AddLog(this, AwfulDebugger.Level.Debug, "Creating Form Data...");

            FormDataDelegate replyFormData = () => { return(GetReplyMultipartFormData(data)); };
            var success = ProcessReplyRequest(result, replyFormData);

            // begin response
            AwfulDebugger.AddLog(this, AwfulDebugger.Level.Debug, "Waiting for response...");

            request = result.AsyncState as HttpWebRequest;
            result  = request.BeginGetResponse(callback => { signal.Set(); }, request);
            signal.WaitOne(timeout);

            if (!result.IsCompleted)
            {
                throw new TimeoutException("Thread Reply: timeout reached");
            }

            // process response and return status value
            AwfulDebugger.AddLog(this, AwfulDebugger.Level.Debug, "Processing response...");

            Uri redirect = HandleGetResponse(result);

            return(redirect);
        }
예제 #21
0
        public static bool CopyResourceFileToIsoStore(string source, string destination)
        {
            bool success = false;

            try
            {
                var bytes = ReadFileFromResourceStore(source);
                success = bytes.SaveBinaryToIsoStore(destination);
            }
            catch (Exception ex)
            {
                AwfulDebugger.AddLog(new object(), AwfulDebugger.Level.Critical, ex);
                success = false;
            }
            return(success);
        }
예제 #22
0
        protected virtual string ParseNode(HtmlNode node)
        {
            StringBuilder builder = new StringBuilder();

            while (node != null)
            {
                try { ProcessNode(node, builder); }
                catch (Exception ex)
                {
                    AwfulDebugger.AddLog(this, AwfulDebugger.Level.Critical, ex);
                }

                node = node.NextSibling;
            }
            return(builder.ToString());
        }
예제 #23
0
        public void SaveStateToIsoStorage()
        {
            try
            {
                MainDataSource.Instance.Pins.SaveToFile("pins.xml");
                MainDataSource.Instance.Bookmarks.SaveToFile("bookmarks.xml");
                MainDataSource.Instance.ThreadTable.SaveToFile("threads.xml");
                MainDataSource.Instance.Forums.SaveToFile("forums.xml");
            }

            catch (Exception ex) { AwfulDebugger.AddLog(this, AwfulDebugger.Level.Critical, ex); }
            finally
            {
                AwfulDebugger.SaveAndDispose();
            }
        }
예제 #24
0
        private Uri InitiateEditRequest(PostEditData data, int timeout = CoreConstants.DEFAULT_TIMEOUT_IN_MILLISECONDS)
        {
            AwfulDebugger.AddLog(this, AwfulDebugger.Level.Debug, "Begin Edit Request...");

            string url     = "http://forums.somethingawful.com/editpost.php";
            var    request = AwfulWebRequest.CreateFormDataPostRequest(url, EDIT_CONTENT_TYPE);

            if (request == null)
            {
                throw new NullReferenceException("request is not an http request.");
            }

            request.AllowAutoRedirect = true;

            // begin request stream
            AwfulDebugger.AddLog(this, AwfulDebugger.Level.Debug, "Processing request stream...");

            var signal = new AutoResetEvent(false);
            var result = request.BeginGetRequestStream(callback => { signal.Set(); }, request);

            signal.WaitOne();

            // process request
            AwfulDebugger.AddLog(this, AwfulDebugger.Level.Debug, "Creating form data...");

            FormDataDelegate editFormData = () => { return(GetEditMultipartFormData(data)); };
            var success = ProcessReplyRequest(result, editFormData);

            // begin response
            AwfulDebugger.AddLog(this, AwfulDebugger.Level.Debug, "Waiting for server response...");

            request = result.AsyncState as HttpWebRequest;
            result  = request.BeginGetResponse(callback => { signal.Set(); }, request);
            signal.WaitOne(timeout);

            if (!result.IsCompleted)
            {
                throw new TimeoutException("The timeout was reached while trying to send an edit request.");
            }

            // process response and return status value
            AwfulDebugger.AddLog(this, AwfulDebugger.Level.Debug, "Processing server response...");

            Uri redirect = HandleGetResponse(result);

            return(redirect);
        }
예제 #25
0
        public static bool DeleteFileFromStorage(string filepath)
        {
            bool deleted = false;

            try
            {
                IsolatedStorageFile storage = IsolatedStorageFile.GetUserStoreForApplication();

                if (storage.FileExists(filepath))
                {
                    storage.DeleteFile(filepath);
                    deleted = true;
                }
            }
            catch (Exception ex) { AwfulDebugger.AddLog(new object(), AwfulDebugger.Level.Critical, ex); }
            return(deleted);
        }
예제 #26
0
        // Code to execute on Unhandled Exceptions
        private void Application_UnhandledException(object sender, ApplicationUnhandledExceptionEventArgs e)
        {
            string stackTrace = e.ExceptionObject.StackTrace == null
                ? e.ExceptionObject.InnerException.StackTrace.ToString()
                : e.ExceptionObject.StackTrace.ToString();

            string message = e.ExceptionObject.Message == null
                ? e.ExceptionObject.InnerException.Message
                : e.ExceptionObject.Message;

            AwfulDebugger.AddLog(sender, AwfulDebugger.Level.Critical, e.ExceptionObject);
            MessageBox.Show(stackTrace, message, MessageBoxButton.OK);
            if (System.Diagnostics.Debugger.IsAttached)
            {
                // An unhandled exception has occurred; break into the debugger
                System.Diagnostics.Debugger.Break();
            }
        }
예제 #27
0
        private void LoadFromQuery()
        {
            var query = NavigationContext.QueryString;

            if (query.ContainsKey("link"))
            {
                string value = query["link"];
                try
                {
                    this.threadSlideView.ControlViewModel.LoadPageFromUri(new Uri(value));
                }
                catch (Exception ex)
                {
                    AwfulDebugger.AddLog(this, AwfulDebugger.Level.Critical, ex);
                    NavigationService.GoBack();
                }
            }

            else if (query.ContainsKey("id") && query.ContainsKey("nav"))
            {
                string         ThreadID = query["id"];
                ThreadMetadata thread   = new ThreadMetadata()
                {
                    ThreadID = ThreadID
                };

                switch (query["nav"])
                {
                case "unread":
                    this.threadSlideView.ControlViewModel.LoadFirstUnreadPost(thread);
                    break;

                case "last":
                    this.threadSlideView.ControlViewModel.LoadLastPost(thread);
                    break;

                case "page":
                    int pageNumber = -1;
                    int.TryParse(query["pagenumber"], out pageNumber);
                    this.threadSlideView.ControlViewModel.LoadPageNumber(thread, pageNumber);
                    break;
                }
            }
        }
예제 #28
0
        public static bool SaveToFile <T>(this T item, string filePath)
        {
            AwfulDebugger.AddLog(item, AwfulDebugger.Level.Debug, "START SaveToFile()");
            AwfulDebugger.AddLog(item, AwfulDebugger.Level.Debug, "Filepath: " + filePath);

            bool result = false;

            try
            {
                AwfulDebugger.AddLog(item, AwfulDebugger.Level.Debug, "Getting application user store...");
                var storage = IsolatedStorageFile.GetUserStoreForApplication();
                if (storage.BuildPath(filePath))
                {
                    AwfulDebugger.AddLog(item, AwfulDebugger.Level.Debug, "Creating DataContractSerializer...");
                    DataContractSerializer dcs = new DataContractSerializer(item.GetType());
                    using (IsolatedStorageFileStream fileStream = new IsolatedStorageFileStream(filePath,
                                                                                                System.IO.FileMode.Create, System.IO.FileAccess.Write, storage))
                    {
                        AwfulDebugger.AddLog(item, AwfulDebugger.Level.Debug, "Writing serlialized object to filestream...");
                        dcs.WriteObject(fileStream, item);
                        result = true;
                        AwfulDebugger.AddLog(item, AwfulDebugger.Level.Debug, "Write complete.");
                        AwfulDebugger.AddLog(item, AwfulDebugger.Level.Info, "Save successful!");
                    }
                }
            }
            catch (Exception ex)
            {
                AwfulDebugger.AddLog(item, AwfulDebugger.Level.Info, "Save failed.");
                AwfulDebugger.AddLog(item, AwfulDebugger.Level.Critical, ex);
                result = false;
#if DEBUG
                throw ex;
#endif
            }

            AwfulDebugger.AddLog(item, AwfulDebugger.Level.Debug, "END SaveToFile()");
            return(result);
        }
예제 #29
0
        private static bool BuildPath(this IsolatedStorageFile storage, string path)
        {
            bool success = false;

            try
            {
                var folders = path.Split('/');
                for (int i = 0; i < folders.Length - 1; i++)
                {
                    if (!storage.DirectoryExists(folders[i]))
                    {
                        storage.CreateDirectory(folders[i]);
                    }
                }
                success = true;
            }
            catch (Exception ex) {
                AwfulDebugger.AddLog(new object(), AwfulDebugger.Level.Critical, ex);
                success = false;
            }
            return(success);
        }
예제 #30
0
        private static ThreadMetadata ParseColorCategory(this ThreadMetadata thread, HtmlNode node)
        {
            // code block example: <td class="star bm0">
            var colorNode = node.Descendants("td").Where(aNode => aNode.GetAttributeValue("class", "")
                                                         .Contains("star")).FirstOrDefault();

            if (colorNode != null)
            {
                try
                {
                    string colorValue    = colorNode.GetAttributeValue("class", "");
                    string categoryToken = colorValue.Split(new char[] { ' ' })[1];
                    thread.ColorCategory = ConvertColorValueToBookmarkCategory(categoryToken);
                }
                catch (Exception ex)
                {
                    AwfulDebugger.AddLog(thread, AwfulDebugger.Level.Info, ex);
                    thread.ColorCategory = BookmarkColorCategory.Unknown;
                }
            }

            return(thread);
        }