/// <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; }
/// <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); } }
/// <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); }
/// <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); } } }
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; }