Пример #1
0
		/// <summary>
		/// Create a simple search folder. Once the appropiate parameters are set, 
		/// the search folder can be enumerated to get the search results.
		/// </summary>
		/// <param name="searchCondition">Specific condition on which to perform the search (property and expected value)</param>
		/// <param name="searchScopePath">List of folders/paths to perform the search on. These locations need to be indexed by the system.</param>
		public ShellSearchFolder(SearchCondition searchCondition, params string[] searchScopePath) {
			CoreHelpers.ThrowIfNotVista();

			NativeSearchFolderItemFactory = (ISearchFolderItemFactory)new SearchFolderItemFactoryCoClass();

			if (searchScopePath != null && searchScopePath.Length > 0 && searchScopePath[0] != null) {
				this.SearchScopePaths = searchScopePath;
			}

			this.SearchCondition = searchCondition;
		}
Пример #2
0
		/// <summary>
		/// Create a simple search folder. Once the appropriate parameters are set, 
		/// the search folder can be enumerated to get the search results.
		/// </summary>
		/// <param name="searchCondition">Specific condition on which to perform the search (property and expected value)</param>
		/// <param name="searchScopePath">List of folders/paths to perform the search on. These locations need to be indexed by the system.</param>
		public ShellSearchFolder(SearchCondition searchCondition, params ShellContainer[] searchScopePath) {
			CoreHelpers.ThrowIfNotVista();

			NativeSearchFolderItemFactory = (ISearchFolderItemFactory)new SearchFolderItemFactoryCoClass();

			this.SearchCondition = searchCondition;

			if (searchScopePath != null && searchScopePath.Length > 0 && searchScopePath[0] != null) {
				this.SearchScopePaths = searchScopePath.Select(cont => cont.ParsingName);
			}
		}
Пример #3
0
		/// <summary>
		/// Creates a condition node that is a logical negation (NOT) of another condition 
		/// (a subnode of this node). 
		/// </summary>
		/// <param name="conditionToBeNegated">SearchCondition node to be negated.</param>
		/// <param name="simplify">True to logically simplify the result if possible; False otherwise. 
		/// In a query builder scenario, simplyfy should typically be set to false.</param>
		/// <returns>New SearchCondition</returns>
		public static SearchCondition CreateNotCondition(SearchCondition conditionToBeNegated, bool simplify) {
			if (conditionToBeNegated == null) {
				throw new ArgumentNullException("conditionToBeNegated");
			}

			// Same as the native "IConditionFactory:MakeNot" method
			IConditionFactory nativeConditionFactory = (IConditionFactory)new ConditionFactoryCoClass();
			ICondition result;

			try {
				HResult hr = nativeConditionFactory.MakeNot(conditionToBeNegated.NativeSearchCondition, simplify, out result);

				if (!CoreErrorHelper.Succeeded(hr)) { throw new ShellException(hr); }
			} finally {
				if (nativeConditionFactory != null) {
					Marshal.ReleaseComObject(nativeConditionFactory);
				}
			}

			return new SearchCondition(result);
		}
Пример #4
0
		/// <summary>
		/// Parses an input string that contains Structured Query keywords (using Advanced Query Syntax 
		/// or Natural Query Syntax) and produces a SearchCondition object.
		/// </summary>
		/// <param name="query">The query to be parsed</param>
		/// <param name="cultureInfo">The culture used to select the localized language for keywords.</param>
		/// <returns>Search condition resulting from the query</returns>
		/// <remarks>For more information on structured query syntax, visit http://msdn.microsoft.com/en-us/library/bb233500.aspx and
		/// http://www.microsoft.com/windows/products/winfamily/desktopsearch/technicalresources/advquery.mspx</remarks>
		public static SearchCondition ParseStructuredQuery(string query, CultureInfo cultureInfo) {
			if (string.IsNullOrEmpty(query)) {
				throw new ArgumentNullException("query");
			}

			IQueryParserManager nativeQueryParserManager = (IQueryParserManager)new QueryParserManagerCoClass();
			IQueryParser queryParser = null;
			IQuerySolution querySolution = null;
			ICondition result = null;

			IEntity mainType = null;
			SearchCondition searchCondition = null;
			try {
				// First, try to create a new IQueryParser using IQueryParserManager
				Guid guid = new Guid(ShellIIDGuid.IQueryParser);
				HResult hr = nativeQueryParserManager.CreateLoadedParser(
					"SystemIndex",
					cultureInfo == null ? (ushort)0 : (ushort)cultureInfo.LCID,
					ref guid,
					out queryParser);

				if (!CoreErrorHelper.Succeeded(hr)) { throw new ShellException(hr); }

				if (queryParser != null) {
					// If user specified natural query, set the option on the query parser
					using (PropVariant optionValue = new PropVariant(true)) {
						hr = queryParser.SetOption(StructuredQuerySingleOption.NaturalSyntax, optionValue);
					}

					if (!CoreErrorHelper.Succeeded(hr)) { throw new ShellException(hr); }

					// Next, try to parse the query.
					// Result would be IQuerySolution that we can use for getting the ICondition and other
					// details about the parsed query.
					hr = queryParser.Parse(query, null, out querySolution);

					if (!CoreErrorHelper.Succeeded(hr)) { throw new ShellException(hr); }

					if (querySolution != null) {
						// Lastly, try to get the ICondition from this parsed query
						hr = querySolution.GetQuery(out result, out mainType);

						if (!CoreErrorHelper.Succeeded(hr)) { throw new ShellException(hr); }
					}
				}

				searchCondition = new SearchCondition(result);
				return searchCondition;
			} catch {
				if (searchCondition != null) { searchCondition.Dispose(); }
				throw;
			} finally {
				if (nativeQueryParserManager != null) {
					Marshal.ReleaseComObject(nativeQueryParserManager);
				}

				if (queryParser != null) {
					Marshal.ReleaseComObject(queryParser);
				}

				if (querySolution != null) {
					Marshal.ReleaseComObject(querySolution);
				}

				if (mainType != null) {
					Marshal.ReleaseComObject(mainType);
				}
			}
		}
Пример #5
0
		private static SearchCondition CreateLeafCondition(string propertyName, PropVariant propVar, string valueType, SearchConditionOperation operation) {
			IConditionFactory nativeConditionFactory = null;
			SearchCondition condition = null;

			try {
				// Same as the native "IConditionFactory:MakeLeaf" method
				nativeConditionFactory = (IConditionFactory)new ConditionFactoryCoClass();

				ICondition nativeCondition = null;

				if (string.IsNullOrEmpty(propertyName) || propertyName.ToUpperInvariant() == "SYSTEM.NULL") {
					propertyName = null;
				}

				HResult hr = HResult.Fail;

				hr = nativeConditionFactory.MakeLeaf(propertyName, operation, valueType,
					propVar, null, null, null, false, out nativeCondition);

				if (!CoreErrorHelper.Succeeded(hr)) {
					throw new ShellException(hr);
				}

				// Create our search condition and set the various properties.
				condition = new SearchCondition(nativeCondition);
			} finally {
				if (nativeConditionFactory != null) {
					Marshal.ReleaseComObject(nativeConditionFactory);
				}
			}

			return condition;
		}