Ejemplo n.º 1
0
		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);
			};
		}
Ejemplo n.º 2
0
 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);
     };
 }
Ejemplo n.º 3
0
        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"));
                }
            });
        }
Ejemplo n.º 4
0
		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"));
				}
			});
		}