Files
PowerToys/WinAlfred/PluginLoader/PythonPluginWrapper.cs

75 lines
2.2 KiB
C#
Raw Normal View History

using System;
using System.Collections.Generic;
2013-12-23 19:21:51 +08:00
using System.Runtime.InteropServices;
2014-01-11 00:19:14 +08:00
using System.Windows.Documents;
2013-12-23 23:53:38 +08:00
using Newtonsoft.Json;
2014-01-11 00:19:14 +08:00
using Python.Runtime;
using WinAlfred.Plugin;
namespace WinAlfred.PluginLoader
{
public class PythonPluginWrapper : IPlugin
{
2013-12-23 19:21:51 +08:00
private PluginMetadata metadata;
public PythonPluginWrapper(PluginMetadata metadata)
{
2013-12-23 19:21:51 +08:00
this.metadata = metadata;
}
public List<Result> Query(Query query)
{
2013-12-27 00:39:07 +08:00
try
2013-12-26 20:18:08 +08:00
{
2014-01-11 00:19:14 +08:00
string s = InvokeFunc(metadata.PluginDirecotry, metadata.ExecuteFileName.Replace(".py", ""),"query",query.RawQuery);
2013-12-27 20:06:49 +08:00
if (string.IsNullOrEmpty(s))
{
return new List<Result>();
}
2013-12-27 00:39:07 +08:00
List<PythonResult> o = JsonConvert.DeserializeObject<List<PythonResult>>(s);
List<Result> r = new List<Result>();
foreach (PythonResult pythonResult in o)
{
PythonResult ps = pythonResult;
2013-12-27 20:06:49 +08:00
if (!string.IsNullOrEmpty(ps.ActionName))
{
2014-01-11 00:19:14 +08:00
ps.Action = () => InvokeFunc(metadata.PluginDirecotry, metadata.ExecuteFileName.Replace(".py", ""), ps.ActionName, ps.ActionPara);
2013-12-27 20:06:49 +08:00
}
2013-12-27 00:39:07 +08:00
r.Add(ps);
}
return r;
2013-12-26 20:18:08 +08:00
}
2013-12-27 00:39:07 +08:00
catch (Exception)
{
throw;
}
}
2014-01-11 00:19:14 +08:00
private string InvokeFunc(string path, string moduleName,string func, string para)
{
IntPtr gs = PythonEngine.AcquireLock();
IntPtr pyStrPtr = Runtime.PyString_FromString(path);
IntPtr SysDotPath = Runtime.PySys_GetObject("path");
Runtime.PyList_Append(SysDotPath, pyStrPtr);
PyObject module = PythonEngine.ImportModule(moduleName);
module = PythonEngine.ReloadModule(module);
PyObject res = module.InvokeMethod(func, new PyString(para));
string json = Runtime.GetManagedString(res.Handle);
PythonEngine.ReleaseLock(gs);
return json;
}
2014-01-03 23:52:36 +08:00
public void Init(PluginInitContext context)
{
2014-01-11 00:19:14 +08:00
}
}
}