public GMailMenuItem (UnreadMessage message, string icon) : base (message.Topic + " - " + Catalog.GetString ("From: ") + message.FromName, icon) { Mnemonic = null; this.message = message; Clicked += delegate { DockServices.System.Open (this.message.Link); }; }
public GMailMenuItem(UnreadMessage message, string icon) : base(message.Topic + " - " + Catalog.GetString("From: ") + message.FromName, icon) { Mnemonic = null; this.message = message; Clicked += delegate { DockServices.System.Open(this.message.Link); }; }
void CheckGMail() { if (!DockServices.System.NetworkConnected) { return; } string password = GMailPreferences.Password; if (string.IsNullOrEmpty(GMailPreferences.User) || string.IsNullOrEmpty(password)) { OnGMailFailed(Catalog.GetString("Click to set username and password.")); return; } checkerThread = DockServices.System.RunOnThread(() => { try { OnGMailChecking(); String[] login = GMailPreferences.User.Split(new char[] { '@' }); string domain = login.Length > 1 ? login[1] : "gmail.com"; string url = "https://mail.google.com/a/" + domain; if (domain.Equals("gmail.com") || domain.Equals("googlemail.com")) { url = "https://mail.google.com/mail"; } // GMail's atom feed prefers to encode labels using '-' url += "/feed/atom/" + HttpUtility.UrlEncode(string.Join("-", CurrentLabel.Split(new char[] { '/', ' ' }))); Log <GMailAtom> .Info("Fetching Atom feed: " + url); HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url); request.Timeout = 60000; request.UserAgent = DockServices.System.UserAgent; request.Credentials = new NetworkCredential(GMailPreferences.User, password); if (DockServices.System.UseProxy) { request.Proxy = DockServices.System.Proxy; } XmlDocument xml = new XmlDocument(); XmlNamespaceManager nsmgr = new XmlNamespaceManager(xml.NameTable); nsmgr.AddNamespace("atom", "http://purl.org/atom/ns#"); using (HttpWebResponse response = (HttpWebResponse)request.GetResponse()) try { xml.Load(response.GetResponseStream()); } finally { response.Close(); } List <UnreadMessage> tmp = new List <UnreadMessage> (); XmlNodeList nodelist = xml.SelectNodes("//atom:entry", nsmgr); for (int i = 0; i < nodelist.Count; i++) { XmlNode item = nodelist.Item(i); UnreadMessage message = new UnreadMessage(); message.Topic = HttpUtility.HtmlDecode(item.SelectSingleNode("atom:title", nsmgr).InnerText); // apparently random mailing lists can have no author information - bug 595530 XmlNode from = item.SelectSingleNode("atom:author/atom:name", nsmgr); if (from != null) { message.FromName = HttpUtility.HtmlDecode(from.InnerText); } from = item.SelectSingleNode("atom:author/atom:email", nsmgr); if (from != null) { message.FromEmail = from.InnerText; } message.From = message.FromName + " <" + message.FromEmail + ">"; try { message.SendDate = DateTime.Parse(item.SelectSingleNode("atom:modified", nsmgr).InnerText); } catch (Exception) {} message.Link = item.SelectSingleNode("atom:link", nsmgr).Attributes ["href"].InnerText; if (message.Topic.Length == 0) { message.Topic = Catalog.GetString("(no subject)"); } tmp.Add(message); } UnreadCount = Convert.ToInt32(xml.SelectSingleNode("//atom:fullcount", nsmgr).InnerText); NewCount = 0; foreach (UnreadMessage message in tmp) { if (message.SendDate > GMailPreferences.LastChecked) { NewCount++; } } if (GMailPreferences.Notify) { if (NewCount > 5) { Log.Notify(CurrentLabel, "gmail", string.Format(Catalog.GetString("You have {0} new, unread messages"), NewCount)); } else { foreach (UnreadMessage message in tmp) { if (message.SendDate > GMailPreferences.LastChecked) { Log.Notify(message.Topic, "gmail", string.Format(Catalog.GetString("From: {0}"), message.From)); } } } } try { GMailPreferences.LastChecked = DateTime.Parse(xml.SelectSingleNode("/atom:feed/atom:modified", nsmgr).InnerText); } catch (Exception) { GMailPreferences.LastChecked = DateTime.Now; } messages = tmp; OnGMailChecked(); } catch (ThreadAbortException) { Log <GMailAtom> .Debug("Stoping Atom thread"); OnGMailChecked(); } catch (NullReferenceException e) { Log <GMailAtom> .Debug(e.Message); OnGMailFailed(Catalog.GetString("Feed Error")); } catch (XmlException e) { Log <GMailAtom> .Error("Error parsing XML: {0}", e.Message); OnGMailFailed(Catalog.GetString("Feed Error")); } catch (WebException e) { Log <GMailAtom> .Error("Network error: {0}", e.Message); if (e.Message.IndexOf("401") != -1) { OnGMailFailed(Catalog.GetString("Invalid Username")); } else { OnGMailFailed(Catalog.GetString("Network Error")); } HttpWebResponse response = (HttpWebResponse)e.Response; if (response != null) { Log <GMailAtom> .Debug("Response status: {0} - {1}", response.StatusCode, response.StatusDescription); } } catch (ObjectDisposedException) { OnGMailFailed(Catalog.GetString("Network Error")); } catch (Exception e) { Log <GMailAtom> .Error(e.Message); Log <GMailAtom> .Debug(e.StackTrace); OnGMailFailed(Catalog.GetString("General Error")); } }); }
void CheckGMail () { if (!DockServices.System.NetworkConnected) return; string password = GMailPreferences.Password; if (string.IsNullOrEmpty (GMailPreferences.User) || string.IsNullOrEmpty (password)) { OnGMailFailed (Catalog.GetString ("Click to set username and password.")); return; } checkerThread = DockServices.System.RunOnThread (() => { try { OnGMailChecking (); String[] login = GMailPreferences.User.Split (new char[] { '@' }); string domain = login.Length > 1 ? login[1] : "gmail.com"; string url = "https://mail.google.com/a/" + domain; if (domain.Equals ("gmail.com") || domain.Equals ("googlemail.com")) url = "https://mail.google.com/mail"; // GMail's atom feed prefers to encode labels using '-' url += "/feed/atom/" + HttpUtility.UrlEncode (string.Join ("-", CurrentLabel.Split (new char[]{'/', ' '}))); Log<GMailAtom>.Info ("Fetching Atom feed: " + url); HttpWebRequest request = (HttpWebRequest) WebRequest.Create (url); request.Timeout = 60000; request.UserAgent = DockServices.System.UserAgent; request.Credentials = new NetworkCredential (GMailPreferences.User, password); if (DockServices.System.UseProxy) request.Proxy = DockServices.System.Proxy; XmlDocument xml = new XmlDocument (); XmlNamespaceManager nsmgr = new XmlNamespaceManager (xml.NameTable); nsmgr.AddNamespace ("atom", "http://purl.org/atom/ns#"); using (HttpWebResponse response = (HttpWebResponse)request.GetResponse ()) try { xml.Load (response.GetResponseStream ()); } finally { response.Close (); } List<UnreadMessage> tmp = new List<UnreadMessage> (); XmlNodeList nodelist = xml.SelectNodes ("//atom:entry", nsmgr); for (int i = 0; i < nodelist.Count; i++) { XmlNode item = nodelist.Item (i); UnreadMessage message = new UnreadMessage (); message.Topic = HttpUtility.HtmlDecode (item.SelectSingleNode ("atom:title", nsmgr).InnerText); // apparently random mailing lists can have no author information - bug 595530 XmlNode from = item.SelectSingleNode ("atom:author/atom:name", nsmgr); if (from != null) message.FromName = HttpUtility.HtmlDecode (from.InnerText); from = item.SelectSingleNode ("atom:author/atom:email", nsmgr); if (from != null) message.FromEmail = from.InnerText; message.From = message.FromName + " <" + message.FromEmail + ">"; try { message.SendDate = DateTime.Parse (item.SelectSingleNode ("atom:modified", nsmgr).InnerText); } catch (Exception) {} message.Link = item.SelectSingleNode ("atom:link", nsmgr).Attributes ["href"].InnerText; if (message.Topic.Length == 0) message.Topic = Catalog.GetString ("(no subject)"); tmp.Add (message); } UnreadCount = Convert.ToInt32 (xml.SelectSingleNode ("//atom:fullcount", nsmgr).InnerText); NewCount = 0; foreach (UnreadMessage message in tmp) if (message.SendDate > GMailPreferences.LastChecked) NewCount++; if (GMailPreferences.Notify) { if (NewCount > 5) Log.Notify (CurrentLabel, "gmail", string.Format (Catalog.GetString ("You have {0} new, unread messages"), NewCount)); else foreach (UnreadMessage message in tmp) if (message.SendDate > GMailPreferences.LastChecked) Log.Notify (message.Topic, "gmail", string.Format (Catalog.GetString ("From: {0}"), message.From)); } try { GMailPreferences.LastChecked = DateTime.Parse (xml.SelectSingleNode ("/atom:feed/atom:modified", nsmgr).InnerText); } catch (Exception) { GMailPreferences.LastChecked = DateTime.Now; } messages = tmp; OnGMailChecked (); } catch (ThreadAbortException) { Log<GMailAtom>.Debug ("Stoping Atom thread"); OnGMailChecked (); } catch (NullReferenceException e) { Log<GMailAtom>.Debug (e.Message); OnGMailFailed (Catalog.GetString ("Feed Error")); } catch (XmlException e) { Log<GMailAtom>.Error ("Error parsing XML: {0}", e.Message); OnGMailFailed (Catalog.GetString ("Feed Error")); } catch (WebException e) { Log<GMailAtom>.Error ("Network error: {0}", e.Message); if (e.Message.IndexOf ("401") != -1) OnGMailFailed (Catalog.GetString ("Invalid Username")); else OnGMailFailed (Catalog.GetString ("Network Error")); HttpWebResponse response = (HttpWebResponse) e.Response; if (response != null) Log<GMailAtom>.Debug ("Response status: {0} - {1}", response.StatusCode, response.StatusDescription); } catch (ObjectDisposedException) { OnGMailFailed (Catalog.GetString ("Network Error")); } catch (Exception e) { Log<GMailAtom>.Error (e.Message); Log<GMailAtom>.Debug (e.StackTrace); OnGMailFailed (Catalog.GetString ("General Error")); } }); }