protected override bool Setup ()
		{
			string dir_name = summary_info.DirectoryName;
			int imap_start_idx;

			int idx = dir_name.IndexOf (".evolution/mail/imap4/");

			if (idx >= 0) {
				this.backend_type = ImapBackendType.Imap4;
				imap_start_idx = idx + 22;
			} else {
				this.backend_type = ImapBackendType.Imap;
				imap_start_idx = dir_name.IndexOf (".evolution/mail/imap/") + 21;
			}

			string imap_start = dir_name.Substring (imap_start_idx);
			this.imap_name = imap_start.Substring (0, imap_start.IndexOf ('/'));

			ICollection accounts = null;

			try {
				accounts = (ICollection) GConfThreadHelper.Get ("/apps/evolution/mail/accounts");
			} catch (Exception ex) {
				Logger.Log.Warn ("Caught exception in Setup(): " + ex.Message);
				Logger.Log.Warn ("There are no configured evolution accounts, ignoring {0}", this.imap_name);
				return false;
			}

			// This should only happen if we shut down while waiting for the GConf results to come back.
			if (accounts == null)
				return false;

			foreach (string xml in accounts) {
				XmlDocument xmlDoc = new XmlDocument ();

				xmlDoc.LoadXml (xml);
				
				XmlNode account = xmlDoc.SelectSingleNode ("//account");

				if (account == null)
					continue;

				string uid = null;

				foreach (XmlAttribute attr in account.Attributes) {
					if (attr.Name == "uid") {
						uid = attr.InnerText;
						break;
					}
				}

				if (uid == null)
					continue;

				XmlNode imap_url_node = xmlDoc.SelectSingleNode ("//source/url");

				if (imap_url_node == null)
					continue;

				string imap_url = imap_url_node.InnerText;
				// If there is a semicolon in the username part of the URL, it
				// indicates that there's an auth scheme there.  We don't care
				// about that, so remove it.
				int user_end = imap_url.IndexOf ('@');
				int semicolon = imap_url.IndexOf (';', 0, user_end + 1);

				if (semicolon != -1)
					imap_url = imap_url.Substring (0, semicolon) + imap_url.Substring (user_end);

				// Escape backslashes, which frequently appear when using IMAP against Exchange servers
				this.imap_name = this.imap_name.Replace ("\\", "%5c");

				// Escape out additional @s in the name.  I hate the class libs so much.
				int lastIdx = this.imap_name.LastIndexOf ('@');
				if (this.imap_name.IndexOf ('@') != lastIdx) {
					string toEscape = this.imap_name.Substring (0, lastIdx);
					this.imap_name = toEscape.Replace ("@", "%40") + this.imap_name.Substring (lastIdx);
				}

				string backend_url_prefix;
				if (this.backend_type == ImapBackendType.Imap)
					backend_url_prefix = "imap";
				else
					backend_url_prefix = "imap4";

				if (imap_url.StartsWith (backend_url_prefix + "://" + this.imap_name + "/")) {
					this.account_name = uid;
					break;
				}
			}

			if (this.account_name == null) {
				Logger.Log.Info ("Unable to determine account name for {0}", this.imap_name);
				return false;
			}

			// Need to check the directory on disk to see if it's a junk/spam folder,
			// since the folder name will be "foo/spam" and not match the check below.
			DirectoryInfo dir_info = new DirectoryInfo (dir_name);
			if (this.IsSpamFolder (dir_info.Name))
				return false;

			// Check if the folder is listed in the configuration as to be excluded from indexing
			if (this.IgnoreFolder (dir_info.FullName))
				return false;
					
			this.folder_name = GetFolderName (new DirectoryInfo (dir_name));

			return true;
		}
示例#2
0
        protected override bool Setup()
        {
            string dir_name = summary_info.DirectoryName;
            int    imap_start_idx;

            int idx = dir_name.IndexOf(".evolution/mail/imap4/");

            if (idx >= 0)
            {
                this.backend_type = ImapBackendType.Imap4;
                imap_start_idx    = idx + 22;
            }
            else
            {
                this.backend_type = ImapBackendType.Imap;
                imap_start_idx    = dir_name.IndexOf(".evolution/mail/imap/") + 21;
            }

            string imap_start = dir_name.Substring(imap_start_idx);

            this.imap_name = imap_start.Substring(0, imap_start.IndexOf('/'));

            ICollection accounts = null;

            try {
                accounts = (ICollection)GConfThreadHelper.Get("/apps/evolution/mail/accounts");
            } catch (Exception ex) {
                Logger.Log.Warn("Caught exception in Setup(): " + ex.Message);
                Logger.Log.Warn("There are no configured evolution accounts, ignoring {0}", this.imap_name);
                return(false);
            }

            // This should only happen if we shut down while waiting for the GConf results to come back.
            if (accounts == null)
            {
                return(false);
            }

            foreach (string xml in accounts)
            {
                XmlDocument xmlDoc = new XmlDocument();

                xmlDoc.LoadXml(xml);

                XmlNode account = xmlDoc.SelectSingleNode("//account");

                if (account == null)
                {
                    continue;
                }

                string uid = null;

                foreach (XmlAttribute attr in account.Attributes)
                {
                    if (attr.Name == "uid")
                    {
                        uid = attr.InnerText;
                        break;
                    }
                }

                if (uid == null)
                {
                    continue;
                }

                XmlNode imap_url_node = xmlDoc.SelectSingleNode("//source/url");

                if (imap_url_node == null)
                {
                    continue;
                }

                string imap_url = imap_url_node.InnerText;
                // If there is a semicolon in the username part of the URL, it
                // indicates that there's an auth scheme there.  We don't care
                // about that, so remove it.
                int user_end  = imap_url.IndexOf('@');
                int semicolon = imap_url.IndexOf(';', 0, user_end + 1);

                if (semicolon != -1)
                {
                    imap_url = imap_url.Substring(0, semicolon) + imap_url.Substring(user_end);
                }

                // Escape backslashes, which frequently appear when using IMAP against Exchange servers
                this.imap_name = this.imap_name.Replace("\\", "%5c");

                // Escape out additional @s in the name.  I hate the class libs so much.
                int lastIdx = this.imap_name.LastIndexOf('@');
                if (this.imap_name.IndexOf('@') != lastIdx)
                {
                    string toEscape = this.imap_name.Substring(0, lastIdx);
                    this.imap_name = toEscape.Replace("@", "%40") + this.imap_name.Substring(lastIdx);
                }

                string backend_url_prefix;
                if (this.backend_type == ImapBackendType.Imap)
                {
                    backend_url_prefix = "imap";
                }
                else
                {
                    backend_url_prefix = "imap4";
                }

                if (imap_url.StartsWith(backend_url_prefix + "://" + this.imap_name + "/"))
                {
                    this.account_name = uid;
                    break;
                }
            }

            if (this.account_name == null)
            {
                Logger.Log.Info("Unable to determine account name for {0}", this.imap_name);
                return(false);
            }

            // Need to check the directory on disk to see if it's a junk/spam folder,
            // since the folder name will be "foo/spam" and not match the check below.
            DirectoryInfo dir_info = new DirectoryInfo(dir_name);

            if (this.IsSpamFolder(dir_info.Name))
            {
                return(false);
            }

            // Check if the folder is listed in the configuration as to be excluded from indexing
            if (this.IgnoreFolder(dir_info.FullName))
            {
                return(false);
            }

            this.folder_name = GetFolderName(new DirectoryInfo(dir_name));

            return(true);
        }