From dacd13ee30aaa9bc2cc989732ed073db54c69166 Mon Sep 17 00:00:00 2001 From: Alekhya Reddy Kommuru Date: Mon, 16 Mar 2020 14:30:38 -0700 Subject: [PATCH 01/12] Added a SearchResult Helper class --- .../Plugins/Wox.Plugin.Indexer/Class1.cs | 12 +++++ .../Properties/AssemblyInfo.cs | 36 +++++++++++++ .../SearchHelper/SearchResult.cs | 14 +++++ .../Wox.Plugin.Indexer.csproj | 54 +++++++++++++++++++ 4 files changed, 116 insertions(+) create mode 100644 src/modules/launcher/Plugins/Wox.Plugin.Indexer/Class1.cs create mode 100644 src/modules/launcher/Plugins/Wox.Plugin.Indexer/Properties/AssemblyInfo.cs create mode 100644 src/modules/launcher/Plugins/Wox.Plugin.Indexer/SearchHelper/SearchResult.cs create mode 100644 src/modules/launcher/Plugins/Wox.Plugin.Indexer/Wox.Plugin.Indexer.csproj diff --git a/src/modules/launcher/Plugins/Wox.Plugin.Indexer/Class1.cs b/src/modules/launcher/Plugins/Wox.Plugin.Indexer/Class1.cs new file mode 100644 index 0000000000..5955ce0204 --- /dev/null +++ b/src/modules/launcher/Plugins/Wox.Plugin.Indexer/Class1.cs @@ -0,0 +1,12 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Wox.Plugin.Indexer +{ + public class Class1 + { + } +} diff --git a/src/modules/launcher/Plugins/Wox.Plugin.Indexer/Properties/AssemblyInfo.cs b/src/modules/launcher/Plugins/Wox.Plugin.Indexer/Properties/AssemblyInfo.cs new file mode 100644 index 0000000000..a6f591220c --- /dev/null +++ b/src/modules/launcher/Plugins/Wox.Plugin.Indexer/Properties/AssemblyInfo.cs @@ -0,0 +1,36 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("Wox.Plugin.Indexer")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("Wox.Plugin.Indexer")] +[assembly: AssemblyCopyright("Copyright © 2020")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid("63c3cea8-51fe-472e-b97c-b58f8b17dd51")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Build and Revision Numbers +// by using the '*' as shown below: +// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/src/modules/launcher/Plugins/Wox.Plugin.Indexer/SearchHelper/SearchResult.cs b/src/modules/launcher/Plugins/Wox.Plugin.Indexer/SearchHelper/SearchResult.cs new file mode 100644 index 0000000000..fc4c0ed770 --- /dev/null +++ b/src/modules/launcher/Plugins/Wox.Plugin.Indexer/SearchHelper/SearchResult.cs @@ -0,0 +1,14 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Wox.Plugin.Indexer.SearchHelper +{ + public class SearchResult + { + // Contains the Path of the file or folder + public string Path { get; set; } + } +} diff --git a/src/modules/launcher/Plugins/Wox.Plugin.Indexer/Wox.Plugin.Indexer.csproj b/src/modules/launcher/Plugins/Wox.Plugin.Indexer/Wox.Plugin.Indexer.csproj new file mode 100644 index 0000000000..d6cd5b2a32 --- /dev/null +++ b/src/modules/launcher/Plugins/Wox.Plugin.Indexer/Wox.Plugin.Indexer.csproj @@ -0,0 +1,54 @@ + + + + + Debug + AnyCPU + 63c3cea8-51fe-472e-b97c-b58f8b17dd51 + Library + Properties + Wox.Plugin.Indexer + Wox.Plugin.Indexer + v4.7.2 + 512 + true + + + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + + + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + + + + + + + + + + + + + + + + + + + + + From 8e45c41f209af77a9c94c8f242bbcc74a6d3d402 Mon Sep 17 00:00:00 2001 From: Alekhya Reddy Kommuru Date: Mon, 16 Mar 2020 14:37:28 -0700 Subject: [PATCH 02/12] Created a helper class to use indexer and return search results --- PowerToys.sln | 11 +++ .../SearchHelper/WindowsSearchAPI.cs | 81 +++++++++++++++++++ .../Wox.Plugin.Indexer.csproj | 37 +++++---- .../Wox.Plugin.Indexer/packages.config | 4 + 4 files changed, 116 insertions(+), 17 deletions(-) create mode 100644 src/modules/launcher/Plugins/Wox.Plugin.Indexer/SearchHelper/WindowsSearchAPI.cs create mode 100644 src/modules/launcher/Plugins/Wox.Plugin.Indexer/packages.config diff --git a/PowerToys.sln b/PowerToys.sln index 6b4e70c89a..396ff8efa7 100644 --- a/PowerToys.sln +++ b/PowerToys.sln @@ -154,6 +154,8 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Wox.Plugin.Folder", "src\mo EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Wox.Launcher", "src\modules\launcher\Wox.Launcher\Wox.Launcher.vcxproj", "{E364F67B-BB12-4E91-B639-355866EBCD8B}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Wox.Plugin.Indexer", "src\modules\launcher\Plugins\Wox.Plugin.Indexer\Wox.Plugin.Indexer.csproj", "{63C3CEA8-51FE-472E-B97C-B58F8B17DD51}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -378,6 +380,14 @@ Global {E364F67B-BB12-4E91-B639-355866EBCD8B}.Release|Any CPU.ActiveCfg = Release|x64 {E364F67B-BB12-4E91-B639-355866EBCD8B}.Release|x64.ActiveCfg = Release|x64 {E364F67B-BB12-4E91-B639-355866EBCD8B}.Release|x64.Build.0 = Release|x64 + {63C3CEA8-51FE-472E-B97C-B58F8B17DD51}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {63C3CEA8-51FE-472E-B97C-B58F8B17DD51}.Debug|Any CPU.Build.0 = Debug|Any CPU + {63C3CEA8-51FE-472E-B97C-B58F8B17DD51}.Debug|x64.ActiveCfg = Debug|Any CPU + {63C3CEA8-51FE-472E-B97C-B58F8B17DD51}.Debug|x64.Build.0 = Debug|Any CPU + {63C3CEA8-51FE-472E-B97C-B58F8B17DD51}.Release|Any CPU.ActiveCfg = Release|Any CPU + {63C3CEA8-51FE-472E-B97C-B58F8B17DD51}.Release|Any CPU.Build.0 = Release|Any CPU + {63C3CEA8-51FE-472E-B97C-B58F8B17DD51}.Release|x64.ActiveCfg = Release|Any CPU + {63C3CEA8-51FE-472E-B97C-B58F8B17DD51}.Release|x64.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -419,6 +429,7 @@ Global {C21BFF9C-2C99-4B5F-B7C9-A5E6DDDB37B0} = {4AFC9975-2456-4C70-94A4-84073C1CED93} {787B8AA6-CA93-4C84-96FE-DF31110AD1C4} = {4AFC9975-2456-4C70-94A4-84073C1CED93} {E364F67B-BB12-4E91-B639-355866EBCD8B} = {C140A3EF-6DBF-4084-9D4C-4EB5A99FEE68} + {63C3CEA8-51FE-472E-B97C-B58F8B17DD51} = {4AFC9975-2456-4C70-94A4-84073C1CED93} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {C3A2F9D1-7930-4EF4-A6FC-7EE0A99821D0} diff --git a/src/modules/launcher/Plugins/Wox.Plugin.Indexer/SearchHelper/WindowsSearchAPI.cs b/src/modules/launcher/Plugins/Wox.Plugin.Indexer/SearchHelper/WindowsSearchAPI.cs new file mode 100644 index 0000000000..a340b99d64 --- /dev/null +++ b/src/modules/launcher/Plugins/Wox.Plugin.Indexer/SearchHelper/WindowsSearchAPI.cs @@ -0,0 +1,81 @@ +using System; +using System.Collections.Generic; +using System.Data.OleDb; +using Microsoft.Search.Interop; + +namespace Wox.Plugin.Indexer.SearchHelper +{ + public class WindowsSearchAPI + { + public IEnumerable Search(string keyword, string pattern = "*", int offset = 0, int maxCount = 100) + { + // This uses the Microsoft.Search.Interop assembly + CSearchManager manager = new CSearchManager(); + + // SystemIndex catalog is the default catalog in Windows + ISearchCatalogManager catalogManager = manager.GetCatalog("SystemIndex"); + + // Get the ISearchQueryHelper which will help us to translate AQS --> SQL necessary to query the indexer + ISearchQueryHelper queryHelper = catalogManager.GetQueryHelper(); + + // Set the number of results we want. Don't set this property if all results are needed. + queryHelper.QueryMaxResults = maxCount; + + // Set list of columns we want to display, getting the path presently + queryHelper.QuerySelectColumns = "System.ItemPathDisplay"; + + // Set additional query restriction + queryHelper.QueryWhereRestrictions = "AND scope='file:'"; + + // convert file pattern if it is not '*'. Don't create restriction for '*' as it includes all files. + if (pattern != "*") + { + pattern = pattern.Replace("*", "%"); + pattern = pattern.Replace("?", "_"); + + if (pattern.Contains("%") || pattern.Contains("_")) + { + queryHelper.QueryWhereRestrictions += " AND System.FileName LIKE '" + pattern + "' "; + } + else + { + // if there are no wildcards we can use a contains which is much faster as it uses the index + queryHelper.QueryWhereRestrictions += " AND Contains(System.FileName, '" + pattern + "') "; + } + } + + // Set sorting order + queryHelper.QuerySorting = "System.DateModified DESC"; + + // Generate SQL from our parameters, converting the userQuery from AQS->WHERE clause + string sqlQuery = queryHelper.GenerateSQLFromUserQuery(keyword); + + // --- Perform the query --- + // create an OleDbConnection object which connects to the indexer provider with the windows application + using (System.Data.OleDb.OleDbConnection conn = new OleDbConnection(queryHelper.ConnectionString)) + { + // open the connection + conn.Open(); + + // now create an OleDB command object with the query we built above and the connection we just opened. + using (OleDbCommand command = new OleDbCommand(sqlQuery, conn)) + { + // execute the command, which returns the results as an OleDbDataReader. + using (OleDbDataReader WDSResults = command.ExecuteReader()) + { + while (WDSResults.Read()) + { + // col 0 is our path in display format + Console.WriteLine("{0}", WDSResults.GetString(0)); + var result = new SearchResult { Path = WDSResults.GetString(0) }; + + yield return result; + } + } + + } + } + + } + } +} diff --git a/src/modules/launcher/Plugins/Wox.Plugin.Indexer/Wox.Plugin.Indexer.csproj b/src/modules/launcher/Plugins/Wox.Plugin.Indexer/Wox.Plugin.Indexer.csproj index d6cd5b2a32..b164c50f57 100644 --- a/src/modules/launcher/Plugins/Wox.Plugin.Indexer/Wox.Plugin.Indexer.csproj +++ b/src/modules/launcher/Plugins/Wox.Plugin.Indexer/Wox.Plugin.Indexer.csproj @@ -1,10 +1,10 @@ - + Debug AnyCPU - 63c3cea8-51fe-472e-b97c-b58f8b17dd51 + {63C3CEA8-51FE-472E-B97C-B58F8B17DD51} Library Properties Wox.Plugin.Indexer @@ -31,24 +31,27 @@ 4 - - - - - - - - - - - - - - + + ..\..\..\..\..\packages\tlbimp-Microsoft.Search.Interop.1.0.0\lib\net45\Microsoft.Search.Interop.dll + True + + + + + + + + + + + + + + - + \ No newline at end of file diff --git a/src/modules/launcher/Plugins/Wox.Plugin.Indexer/packages.config b/src/modules/launcher/Plugins/Wox.Plugin.Indexer/packages.config new file mode 100644 index 0000000000..6b77ac3b21 --- /dev/null +++ b/src/modules/launcher/Plugins/Wox.Plugin.Indexer/packages.config @@ -0,0 +1,4 @@ + + + + \ No newline at end of file From ea75a56d3338f20fab0cbb9630795b608fcfcee9 Mon Sep 17 00:00:00 2001 From: Alekhya Reddy Kommuru Date: Mon, 16 Mar 2020 14:42:40 -0700 Subject: [PATCH 03/12] Added the main and settings file which declare most of the plugin interfaces --- .../Plugins/Wox.Plugin.Indexer/Class1.cs | 12 -- .../Plugins/Wox.Plugin.Indexer/Main.cs | 128 ++++++++++++++++++ .../Plugins/Wox.Plugin.Indexer/Settings.cs | 23 ++++ 3 files changed, 151 insertions(+), 12 deletions(-) delete mode 100644 src/modules/launcher/Plugins/Wox.Plugin.Indexer/Class1.cs create mode 100644 src/modules/launcher/Plugins/Wox.Plugin.Indexer/Main.cs create mode 100644 src/modules/launcher/Plugins/Wox.Plugin.Indexer/Settings.cs diff --git a/src/modules/launcher/Plugins/Wox.Plugin.Indexer/Class1.cs b/src/modules/launcher/Plugins/Wox.Plugin.Indexer/Class1.cs deleted file mode 100644 index 5955ce0204..0000000000 --- a/src/modules/launcher/Plugins/Wox.Plugin.Indexer/Class1.cs +++ /dev/null @@ -1,12 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -namespace Wox.Plugin.Indexer -{ - public class Class1 - { - } -} diff --git a/src/modules/launcher/Plugins/Wox.Plugin.Indexer/Main.cs b/src/modules/launcher/Plugins/Wox.Plugin.Indexer/Main.cs new file mode 100644 index 0000000000..652af40c40 --- /dev/null +++ b/src/modules/launcher/Plugins/Wox.Plugin.Indexer/Main.cs @@ -0,0 +1,128 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Diagnostics; +using System.Text; +using System.Threading.Tasks; +using Wox.Plugin; +using System.IO; +using System.ComponentModel; +using Wox.Infrastructure.Storage; +using Wox.Plugin.Indexer.SearchHelper; +using Microsoft.Search.Interop; + +namespace Wox.Plugin.Indexer +{ + class Main : IPlugin, ISavable, IPluginI18n + { + + // This variable contains metadata about the Plugin + private PluginInitContext _context; + + // This variable contains information about the context menus + private Settings _settings; + + // Contains information about the plugin stored in json format + private PluginJsonStorage _storage; + + // To access Windows Search functionalities + private readonly WindowsSearchAPI _api = new WindowsSearchAPI(); + + // To save the configurations of plugins + public void Save() + { + _storage.Save(); + } + + // This function uses the Windows indexer and returns the list of results obtained + public List Query(Query query) + { + var results = new List(); + if (!string.IsNullOrEmpty(query.Search)) + { + var searchQuery = query.Search; + if (_settings.MaxSearchCount <= 0) + { + _settings.MaxSearchCount = 50; + } + + try + { + var searchResultsList = _api.Search(searchQuery, maxCount: _settings.MaxSearchCount).ToList(); + foreach (var searchResult in searchResultsList) + { + var path = searchResult.Path; + + string workingDir = null; + if (_settings.UseLocationAsWorkingDir) + workingDir = Path.GetDirectoryName(path); + + Result r = new Result(); + r.Title = Path.GetFileName(path); + r.SubTitle = path; + r.IcoPath = path; + r.Action = c => + { + bool hide; + try + { + Process.Start(new ProcessStartInfo + { + FileName = path, + UseShellExecute = true, + WorkingDirectory = workingDir + }); + hide = true; + } + catch (Win32Exception) + { + var name = $"Plugin: {_context.CurrentPluginMetadata.Name}"; + var msg = "Can't Open this file"; + _context.API.ShowMsg(name, msg, string.Empty); + hide = false; + } + return hide; + }; + r.ContextData = searchResult; + results.Add(r); + } + } + catch (Exception ex) + { + results.Add(new Result + { + // TODO: Localize the string + Title = "Windows indexer plugin is not running", + IcoPath = "Images\\WindowsIndexerImg.bmp" + }); + } + } + + return results; + } + + public void Init(PluginInitContext context) + { + // initialize the context of the plugin + _context = context; + _storage = new PluginJsonStorage(); + _settings = _storage.Load(); + } + + // TODO: Localize the strings + // Set the Plugin Title + public string GetTranslatedPluginTitle() + { + return "Windows Indexer Plugin"; + } + + // TODO: Localize the string + // Set the plugin Description + public string GetTranslatedPluginDescription() + { + return "Returns files and folders"; + } + + + } +} diff --git a/src/modules/launcher/Plugins/Wox.Plugin.Indexer/Settings.cs b/src/modules/launcher/Plugins/Wox.Plugin.Indexer/Settings.cs new file mode 100644 index 0000000000..6fc9bbbf94 --- /dev/null +++ b/src/modules/launcher/Plugins/Wox.Plugin.Indexer/Settings.cs @@ -0,0 +1,23 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Wox.Plugin.Indexer +{ + public class Settings + { + public List ContextMenus = new List(); + public int MaxSearchCount { get; set; } = 100; + public bool UseLocationAsWorkingDir { get; set; } = false; + } + + public class ContextMenu + { + public string Name { get; set; } + public string Command { get; set; } + public string Argument { get; set; } + public string ImagePath { get; set; } + } +} From 415b7bf4d1fc006797f1007d9985db608371895e Mon Sep 17 00:00:00 2001 From: Alekhya Reddy Kommuru Date: Mon, 16 Mar 2020 14:45:37 -0700 Subject: [PATCH 04/12] Added references and renamed a class --- .../Wox.Plugin.Indexer/Wox.Plugin.Indexer.csproj | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/src/modules/launcher/Plugins/Wox.Plugin.Indexer/Wox.Plugin.Indexer.csproj b/src/modules/launcher/Plugins/Wox.Plugin.Indexer/Wox.Plugin.Indexer.csproj index b164c50f57..9f5741bec6 100644 --- a/src/modules/launcher/Plugins/Wox.Plugin.Indexer/Wox.Plugin.Indexer.csproj +++ b/src/modules/launcher/Plugins/Wox.Plugin.Indexer/Wox.Plugin.Indexer.csproj @@ -45,13 +45,24 @@ - + + + + + {4fd29318-a8ab-4d8f-aa47-60bc241b8da3} + Wox.Infrastructure + + + {8451ecdd-2ea4-4966-bb0a-7bbc40138e80} + Wox.Plugin + + \ No newline at end of file From 657a1aaed5d0910ebd088e3dab3a14ebb626d93f Mon Sep 17 00:00:00 2001 From: Alekhya Reddy Kommuru Date: Mon, 16 Mar 2020 14:58:25 -0700 Subject: [PATCH 05/12] Added the images folder which contains the windows indexer icon --- .../Images/WindowsIndexerImg.bmp | Bin 0 -> 3772 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 src/modules/launcher/Plugins/Wox.Plugin.Indexer/Images/WindowsIndexerImg.bmp diff --git a/src/modules/launcher/Plugins/Wox.Plugin.Indexer/Images/WindowsIndexerImg.bmp b/src/modules/launcher/Plugins/Wox.Plugin.Indexer/Images/WindowsIndexerImg.bmp new file mode 100644 index 0000000000000000000000000000000000000000..78a015715ed228d84d4a2066a2f42d7e827efbd3 GIT binary patch literal 3772 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 mc0wd{3wPp9e6wQFqW=N1$a(d|v)2s(0000 Date: Mon, 16 Mar 2020 17:25:04 -0700 Subject: [PATCH 06/12] Added the image --- .../Plugins/Wox.Plugin.Indexer/Wox.Plugin.Indexer.csproj | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/modules/launcher/Plugins/Wox.Plugin.Indexer/Wox.Plugin.Indexer.csproj b/src/modules/launcher/Plugins/Wox.Plugin.Indexer/Wox.Plugin.Indexer.csproj index 9f5741bec6..7f738755c1 100644 --- a/src/modules/launcher/Plugins/Wox.Plugin.Indexer/Wox.Plugin.Indexer.csproj +++ b/src/modules/launcher/Plugins/Wox.Plugin.Indexer/Wox.Plugin.Indexer.csproj @@ -64,5 +64,11 @@ Wox.Plugin + + + + PreserveNewest + + \ No newline at end of file From 248a689de2aa163d733dcb31b868fe5115d18d72 Mon Sep 17 00:00:00 2001 From: Alekhya Reddy Date: Tue, 17 Mar 2020 06:01:05 +0530 Subject: [PATCH 07/12] Added the plugin.json file --- .../launcher/Plugins/Wox.Plugin.Indexer/plugin.json | 12 ++++++++++++ 1 file changed, 12 insertions(+) create mode 100644 src/modules/launcher/Plugins/Wox.Plugin.Indexer/plugin.json diff --git a/src/modules/launcher/Plugins/Wox.Plugin.Indexer/plugin.json b/src/modules/launcher/Plugins/Wox.Plugin.Indexer/plugin.json new file mode 100644 index 0000000000..741c57ddcc --- /dev/null +++ b/src/modules/launcher/Plugins/Wox.Plugin.Indexer/plugin.json @@ -0,0 +1,12 @@ +{ + "ID": "2140FC9819AD43A3A616E2735815C27C", + "ActionKeyword": "*", + "Name": "Windows Indexer", + "Description": "Search for files and folders", + "Author": "??", + "Version": "1.0.0", + "Language": "csharp", + "Website": "http://www.wox.one/plugin", + "ExecuteFileName": "Wox.Plugin.Indexer.dll", + "IcoPath": "Images\\WindowsIndexerImg.bmp" +} From 9a84fc5b470e0dd5d6381aa26cdfb1d9f4e6a409 Mon Sep 17 00:00:00 2001 From: Alekhya Reddy Date: Tue, 17 Mar 2020 06:01:34 +0530 Subject: [PATCH 08/12] Minor changes in project files --- .../msi_to_msix_upgrade_lib/msi_to_msix_upgrade_lib.vcxproj | 4 ++-- .../launcher/Wox.Infrastructure/Wox.Infrastructure.csproj | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/common/msi_to_msix_upgrade_lib/msi_to_msix_upgrade_lib.vcxproj b/src/common/msi_to_msix_upgrade_lib/msi_to_msix_upgrade_lib.vcxproj index baa4a66427..767a9d12c0 100644 --- a/src/common/msi_to_msix_upgrade_lib/msi_to_msix_upgrade_lib.vcxproj +++ b/src/common/msi_to_msix_upgrade_lib/msi_to_msix_upgrade_lib.vcxproj @@ -87,7 +87,7 @@ Use - Level4 + Level3 true true true @@ -129,7 +129,7 @@ Use - Level4 + Level3 true _DEBUG;_LIB;%(PreprocessorDefinitions) true diff --git a/src/modules/launcher/Wox.Infrastructure/Wox.Infrastructure.csproj b/src/modules/launcher/Wox.Infrastructure/Wox.Infrastructure.csproj index 158a6848a4..0b0a7db25c 100644 --- a/src/modules/launcher/Wox.Infrastructure/Wox.Infrastructure.csproj +++ b/src/modules/launcher/Wox.Infrastructure/Wox.Infrastructure.csproj @@ -107,8 +107,8 @@ - xcopy /Y $(PkgPinyin4DotNet)\pinyindb\unicode_to_hanyu_pinyin.txt $(TargetDir)pinyindb\ - xcopy /Y $(PkgNLog_Schema)\content\NLog.xsd $(TargetDir) + xcopy /Y "$(PkgPinyin4DotNet)\pinyindb\unicode_to_hanyu_pinyin.txt" "$(TargetDir)pinyindb\" + xcopy /Y "$(PkgNLog_Schema)\content\NLog.xsd" "$(TargetDir)" SQL necessary to query the indexer - ISearchQueryHelper queryHelper = catalogManager.GetQueryHelper(); + queryHelper = catalogManager.GetQueryHelper(); // Set the number of results we want. Don't set this property if all results are needed. queryHelper.QueryMaxResults = maxCount; @@ -85,9 +86,13 @@ namespace Wox.Plugin.Indexer.SearchHelper // Set sorting order queryHelper.QuerySorting = "System.DateModified DESC"; + } - setQueryHelper(ref queryHelper, pattern); - + public IEnumerable Search(string keyword, string pattern = "*", int maxCount = 100) + { + ISearchQueryHelper queryHelper; + InitQueryHelper(out queryHelper, maxCount); + ModifyQueryHelper(ref queryHelper, pattern); return ExecuteQuery(queryHelper, keyword); } } diff --git a/src/modules/launcher/Plugins/Wox.Plugin.Indexer/Wox.Plugin.Indexer.csproj b/src/modules/launcher/Plugins/Wox.Plugin.Indexer/Wox.Plugin.Indexer.csproj index c4c78bf4d4..1a7bdbe8c7 100644 --- a/src/modules/launcher/Plugins/Wox.Plugin.Indexer/Wox.Plugin.Indexer.csproj +++ b/src/modules/launcher/Plugins/Wox.Plugin.Indexer/Wox.Plugin.Indexer.csproj @@ -9,9 +9,10 @@ Properties Wox.Plugin.Indexer Wox.Plugin.Indexer - v4.7.2 + v4.5.2 512 true + true diff --git a/src/modules/launcher/Wox.Test/Plugins/WindowsIndexerTest.cs b/src/modules/launcher/Wox.Test/Plugins/WindowsIndexerTest.cs new file mode 100644 index 0000000000..9df2aa5892 --- /dev/null +++ b/src/modules/launcher/Wox.Test/Plugins/WindowsIndexerTest.cs @@ -0,0 +1,145 @@ +using NUnit.Framework; +using System; +using System.Collections.Generic; +using System.Data.OleDb; +using Microsoft.Search.Interop; +using Wox.Plugin.Indexer.SearchHelper; + +namespace Wox.Test.Plugins +{ + + [TestFixture] + public class WindowsIndexerTest + { + private WindowsSearchAPI _api = new WindowsSearchAPI(); + + [Test] + public void InitQueryHelper_ShouldInitialize_WhenFunctionIsCalled() + { + // Arrange + int maxCount = 10; + ISearchQueryHelper queryHelper = null; + + // Act + _api.InitQueryHelper(out queryHelper, maxCount); + + // Assert + Assert.IsNotNull(queryHelper); + Assert.AreEqual(queryHelper.QueryMaxResults, maxCount); + } + + [Test] + public void ModifyQueryHelper_ShouldSetQueryHelper_WhenPatternIsAsterisk() + { + // Arrange + ISearchQueryHelper queryHelper; + String pattern = "*"; + _api.InitQueryHelper(out queryHelper, 10); + + // Act + _api.ModifyQueryHelper(ref queryHelper, pattern); + + // Assert + Assert.IsFalse(queryHelper.QueryWhereRestrictions.Contains("LIKE")); + Assert.IsFalse(queryHelper.QueryWhereRestrictions.Contains("Contains")); + } + + [Test] + public void ModifyQueryHelper_ShouldSetQueryHelper_WhenPatternContainsAsterisk() + { + // Arrange + ISearchQueryHelper queryHelper; + String pattern = "tt*^&)"; + _api.InitQueryHelper(out queryHelper, 10); + + // Act + _api.ModifyQueryHelper(ref queryHelper, pattern); + + // Assert + Assert.IsTrue(queryHelper.QueryWhereRestrictions.Contains("LIKE")); + Assert.IsFalse(queryHelper.QueryWhereRestrictions.Contains("Contains")); + } + + [Test] + public void ModifyQueryHelper_ShouldSetQueryHelper_WhenPatternContainsPercent() + { + // Arrange + ISearchQueryHelper queryHelper; + String pattern = "tt%^&)"; + _api.InitQueryHelper(out queryHelper, 10); + + // Act + _api.ModifyQueryHelper(ref queryHelper, pattern); + + // Assert + Assert.IsTrue(queryHelper.QueryWhereRestrictions.Contains("LIKE")); + Assert.IsFalse(queryHelper.QueryWhereRestrictions.Contains("Contains")); + } + + [Test] + public void ModifyQueryHelper_ShouldSetQueryHelper_WhenPatternContainsUnderScore() + { + // Arrange + ISearchQueryHelper queryHelper; + String pattern = "tt_^&)"; + _api.InitQueryHelper(out queryHelper, 10); + + // Act + _api.ModifyQueryHelper(ref queryHelper, pattern); + + // Assert + Assert.IsTrue(queryHelper.QueryWhereRestrictions.Contains("LIKE")); + Assert.IsFalse(queryHelper.QueryWhereRestrictions.Contains("Contains")); + } + + [Test] + public void ModifyQueryHelper_ShouldSetQueryHelper_WhenPatternContainsQuestionMark() + { + // Arrange + ISearchQueryHelper queryHelper; + String pattern = "tt?^&)"; + _api.InitQueryHelper(out queryHelper, 10); + + // Act + _api.ModifyQueryHelper(ref queryHelper, pattern); + + // Assert + Assert.IsTrue(queryHelper.QueryWhereRestrictions.Contains("LIKE")); + Assert.IsFalse(queryHelper.QueryWhereRestrictions.Contains("Contains")); + } + + [Test] + public void ModifyQueryHelper_ShouldSetQueryHelper_WhenPatternDoesNotContainSplSymbols() + { + // Arrange + ISearchQueryHelper queryHelper; + String pattern = "tt^&)bc"; + _api.InitQueryHelper(out queryHelper, 10); + + // Act + _api.ModifyQueryHelper(ref queryHelper, pattern); + + // Assert + Assert.IsFalse(queryHelper.QueryWhereRestrictions.Contains("LIKE")); + Assert.IsTrue(queryHelper.QueryWhereRestrictions.Contains("Contains")); + } + + [Test] + public void ExecuteQuery_ShouldDisposeAllConnections_AfterFunctionCall() + { + // Arrange + ISearchQueryHelper queryHelper; + _api.InitQueryHelper(out queryHelper, 10); + _api.ModifyQueryHelper(ref queryHelper, "*"); + string keyword = "test"; + + // Act + _api.ExecuteQuery(queryHelper, keyword); + + // Assert + Assert.IsNull(_api.conn); + Assert.IsNull(_api.command); + Assert.IsNull(_api.WDSResults); + } + } +} diff --git a/src/modules/launcher/Wox.Test/Wox.Test.csproj b/src/modules/launcher/Wox.Test/Wox.Test.csproj index 1de1a7880b..e656fca226 100644 --- a/src/modules/launcher/Wox.Test/Wox.Test.csproj +++ b/src/modules/launcher/Wox.Test/Wox.Test.csproj @@ -38,6 +38,7 @@ + @@ -45,10 +46,15 @@ + + + {63c3cea8-51fe-472e-b97c-b58f8b17dd51} + Wox.Plugin.Indexer + {B749F0DB-8E75-47DB-9E5E-265D16D0C0D2} Wox.Core @@ -72,6 +78,9 @@ 3.15.1 + + 1.0.0 +