示例#1
0
 private static Plugin CreatePlugin(IPluginDescription plugin, byte[] hash)
 {
     return(new Plugin()
     {
         Name = plugin.Name, Version = plugin.Version, Hash = hash
     });
 }
 public LicenseConfirmationDialog(IPluginDescription plugin)
   : base() {
   InitializeComponent();
   richTextBox.Text = plugin.LicenseText;
   this.Text = plugin.ToString();
   this.DialogResult = DialogResult.Cancel;
 }
 private IEnumerable <ListViewItem> FindItemsForPlugin(IPluginDescription plugin)
 {
     return(from item in pluginsListView.Items.OfType <ListViewItem>()
            let otherPlugin = item.Tag as IPluginDescription
                              where otherPlugin != null && otherPlugin.Name == plugin.Name && otherPlugin.Version == plugin.Version
                              select item);
 }
示例#4
0
        private void UpdateIndex(IPluginDescription description)
        {
            _index.Description = description.Description;
            _index.Id          = description.Id.Value;
            _index.Name        = description.Name;
            _index.Author      = description.Author;
            _index.Website     = description.Website != null?description.Website.ToString() : null;

            _index.Version = description.Version?.ToString();
            _index.ImplementedPluginInterfaces = new List <PluginInterfaceImplementation>();
            foreach (var implementationDescription in description.PluginImplementations)
            {
                _index.ImplementedPluginInterfaces.Add(new PluginInterfaceImplementation
                {
                    InterfaceTypename      = implementationDescription.InterfaceType.FullName,
                    ImplementationTypename = implementationDescription.FullTypeName,
                    InterfaceVersion       = implementationDescription.Version.Value
                });
            }
            _index.SerializableTypes = new List <SerializableTypeDescription>();
            foreach (var pair in description.SerializableTypes)
            {
                _index.SerializableTypes.Add(new SerializableTypeDescription
                {
                    Name     = pair.Key,
                    FullName = pair.Value
                });
            }

            _index.TailviewerApiVersion = description.TailviewerApiVersion?.ToString();
        }
示例#5
0
        protected virtual void UpdateDescription()
        {
            descriptionTextBox.Text = string.Empty;

            if (typesTreeView.SelectedNode != null)
            {
                IPluginDescription plugin = typesTreeView.SelectedNode.Tag as IPluginDescription;
                if (plugin != null)
                {
                    StringBuilder sb = new StringBuilder();
                    sb.Append("Plugin: ").Append(plugin.Name).Append(Environment.NewLine);
                    sb.Append("Version: ").Append(plugin.Version.ToString()).Append(Environment.NewLine);
                    descriptionTextBox.Text = sb.ToString();
                }
                Type type = typesTreeView.SelectedNode.Tag as Type;
                if (type != null)
                {
                    string description = ItemAttribute.GetDescription(type);
                    if (description != null)
                    {
                        descriptionTextBox.Text = description;
                    }
                }
            }
            else if (typesTreeView.Nodes.Count == 0)
            {
                descriptionTextBox.Text = "No types found";
            }
        }
示例#6
0
 public LicenseView(IPluginDescription plugin)
     : base()
 {
     InitializeComponent();
     Name             = "License of: " + plugin;
     richTextBox.Text = plugin.LicenseText;
 }
 public LicenseConfirmationDialog(IPluginDescription plugin)
     : base()
 {
     InitializeComponent();
     richTextBox.Text  = plugin.LicenseText;
     this.Text         = plugin.ToString();
     this.DialogResult = DialogResult.Cancel;
 }
示例#8
0
        private ListViewItem CreateListViewItem(IPluginDescription plugin)
        {
            ListViewItem item = new ListViewItem(new string[] { plugin.Name, plugin.Version.ToString(), plugin.Description });

            item.Tag        = plugin;
            item.ImageIndex = 0;
            return(item);
        }
示例#9
0
    public PluginView(IPluginDescription plugin)
      : base() {
      InitializeComponent();
      PopulateImageList();

      this.plugin = plugin;
      this.Text = "Plugin Details: " + plugin.ToString();
      UpdateControls();
    }
示例#10
0
 internal static IEnumerable<IPluginDescription> GetAllDependents(IPluginDescription plugin, IEnumerable<IPluginDescription> availablePlugins) {
   return from p in availablePlugins
          let matchingEntries = from dep in GetAllDependencies(p)
                                where dep.Name == plugin.Name
                                where dep.Version == plugin.Version
                                select dep
          where matchingEntries.Any()
          select p as IPluginDescription;
 }
示例#11
0
        /// <summary>
        /// Finds all types that are subtypes or equal to the specified type if they are part of the given
        /// <paramref name="pluginDescription"/>.
        /// </summary>
        /// <param name="type">Most general type for which to find matching types.</param>
        /// <param name="pluginDescription">The plugin the subtypes must be part of.</param>
        /// <param name="onlyInstantiable">Return only types that are instantiable
        /// <param name="includeGenericTypeDefinitions">Specifies if generic type definitions shall be included</param>
        /// (interfaces, abstract classes... are not returned)</param>
        /// <returns>Enumerable of the discovered types.</returns>
        internal static IEnumerable <Type> GetTypes(Type type, IPluginDescription pluginDescription, bool onlyInstantiable, bool includeGenericTypeDefinitions)
        {
            PluginDescription pluginDesc = (PluginDescription)pluginDescription;

            return(from asm in AppDomain.CurrentDomain.GetAssemblies()
                   where !asm.IsDynamic && !string.IsNullOrEmpty(asm.Location)
                   where pluginDesc.AssemblyLocations.Any(location => location.Equals(Path.GetFullPath(asm.Location), StringComparison.CurrentCultureIgnoreCase))
                   from t in GetTypes(type, asm, onlyInstantiable, includeGenericTypeDefinitions)
                   select t);
        }
        public ILogSource CreateCustom(CustomDataSourceId id, ICustomDataSourceConfiguration configuration,
                                       out IPluginDescription pluginDescription)
        {
            var pair = _dataSourcePlugins.First(x => x.Plugin.Id == id);

            pluginDescription = pair.Description;
            var logFile = TryCreateCustomWith(pair.Plugin, configuration);

            return(new NoThrowLogSource(logFile, pluginDescription.Name));
        }
 private void remotePluginsListView_ItemChecked(object sender, ItemCheckedEventArgs e) {
   foreach (ListViewItem item in pluginsListView.SelectedItems) {
     IPluginDescription plugin = (IPluginDescription)item.Tag;
     if (e.Item.Checked)
       HandlePluginChecked(plugin);
     else
       HandlePluginUnchecked(plugin);
   }
   installPluginsButton.Enabled = pluginsListView.CheckedItems.Count > 0;
 }
        public PluginView(IPluginDescription plugin)
            : base()
        {
            InitializeComponent();
            PopulateImageList();

            this.plugin = plugin;
            this.Text   = "Plugin Details: " + plugin.ToString();
            UpdateControls();
        }
示例#15
0
 internal static IEnumerable <IPluginDescription> GetAllDependents(IPluginDescription plugin, IEnumerable <IPluginDescription> availablePlugins)
 {
     return(from p in availablePlugins
            let matchingEntries = from dep in GetAllDependencies(p)
                                  where dep.Name == plugin.Name
                                  where dep.Version == plugin.Version
                                  select dep
                                  where matchingEntries.Any()
                                  select p as IPluginDescription);
 }
示例#16
0
 private static byte[] CreateZipPackage(IPluginDescription plugin)
 {
     using (MemoryStream stream = new MemoryStream()) {
         ZipArchive zipFile = new ZipArchive(stream, ZipArchiveMode.Create);
         foreach (var file in plugin.Files)
         {
             zipFile.CreateEntry(file.Name);
         }
         stream.Seek(0, SeekOrigin.Begin);
         return(stream.GetBuffer());
     }
 }
示例#17
0
 private DeploymentService.PluginDescription MakePluginDescription(IPluginDescription plugin, Dictionary <IPluginDescription, DeploymentService.PluginDescription> cachedPluginDescriptions)
 {
     if (!cachedPluginDescriptions.ContainsKey(plugin))
     {
         var dependencies = (from dep in plugin.Dependencies
                             select MakePluginDescription(dep, cachedPluginDescriptions))
                            .ToList();
         cachedPluginDescriptions.Add(plugin,
                                      new DeploymentService.PluginDescription(plugin.Name, plugin.Version, dependencies, plugin.ContactName, plugin.ContactEmail, plugin.LicenseText));
     }
     return(cachedPluginDescriptions[plugin]);
 }
示例#18
0
    public static List<PluginData> CreatePluginDatas(IPluginDescription plugin) {
      List<PluginData> pluginDatas = new List<PluginData>();

      foreach (IPluginFile pf in plugin.Files) {
        PluginData pluginData = new PluginData();

        pluginData.Data = File.ReadAllBytes(pf.Name);
        pluginData.FileName = Path.GetFileName(pf.Name);
        pluginDatas.Add(pluginData);
      }
      return pluginDatas;
    }
        //private readonly DelegateCommand _deleteCommand;

        public InstalledPluginViewModel(IPluginDescription description)
        {
            _description = description;

            // TODO: Deleting requires a bit more care because we store plugins
            //       in Program Files which is (for good reason) protected.
            //       Uninstalling a plugin should probably force the UAC dialog
            //       and thus be performed in a separate process. However in order
            //       for this to succeed, we must make sure that we don't hold anymore
            //       handles to the plugin...
            //_deleteCommand = new DelegateCommand();
        }
示例#20
0
        public static List <PluginData> CreatePluginDatas(IPluginDescription plugin)
        {
            List <PluginData> pluginDatas = new List <PluginData>();

            foreach (IPluginFile pf in plugin.Files)
            {
                PluginData pluginData = new PluginData();

                pluginData.Data     = File.ReadAllBytes(pf.Name);
                pluginData.FileName = Path.GetFileName(pf.Name);
                pluginDatas.Add(pluginData);
            }
            return(pluginDatas);
        }
 private void HandlePluginChecked(IPluginDescription plugin) {
   // also check all dependencies
   List<ListViewItem> modifiedItems = new List<ListViewItem>();
   modifiedItems.AddRange(FindItemsForPlugin(plugin));
   foreach (var dep in Util.GetAllDependencies(plugin)) {
     // there can be multiple entries for a single plugin in different groups
     foreach (ListViewItem item in FindItemsForPlugin(dep)) {
       if (item != null && !item.Checked) {
         if (!modifiedItems.Contains(item))
           modifiedItems.Add(item);
       }
     }
   }
   pluginsListView.CheckItems(modifiedItems);
 }
示例#22
0
        public IPluginStatus GetStatus(IPluginDescription description)
        {
            var id = description?.Id;

            if (id != null && _pluginStati.TryGetValue(id, out var status))
            {
                return(status);
            }

            status = new PluginStatus
            {
                IsInstalled = false
            };
            return(status);
        }
示例#23
0
 internal static IEnumerable<IPluginDescription> GetAllDependencies(IPluginDescription plugin) {
   HashSet<IPluginDescription> yieldedPlugins = new HashSet<IPluginDescription>();
   foreach (var dep in plugin.Dependencies) {
     foreach (var recDep in GetAllDependencies(dep)) {
       if (!yieldedPlugins.Contains(recDep)) {
         yieldedPlugins.Add(recDep);
         yield return recDep;
       }
     }
     if (!yieldedPlugins.Contains(dep)) {
       yieldedPlugins.Add(dep);
       yield return dep;
     }
   }
 }
示例#24
0
        private IFileFormatPlugin FindSupportingPlugin(string filePath, out IPluginDescription pluginDescription)
        {
            var fileName = Path.GetFileName(filePath);

            foreach (var pair in _plugins)
            {
                if (Supports(pair.Plugin, fileName))
                {
                    pluginDescription = pair.Description;
                    return(pair.Plugin);
                }
            }

            pluginDescription = null;
            return(null);
        }
示例#25
0
        /// <inheritdoc />
        public ILogFile Open(string filePath, out IPluginDescription pluginDescription)
        {
            var plugin = FindSupportingPlugin(filePath, out pluginDescription);

            if (plugin != null)
            {
                var logFile = OpenWith(filePath, plugin);
                if (logFile != null)
                {
                    var pluginName = plugin.GetType().Assembly.FullName;
                    return(new NoThrowLogFile(logFile, pluginName));
                }
            }

            return(_services.CreateTextLogFile(filePath));
        }
示例#26
0
        /// <summary>
        /// Creates an instance of all types that are subtypes or the same type of the specified type and declared in <paramref name="plugin"/>
        /// </summary>
        /// <typeparam name="T">Most general type.</typeparam>
        /// <returns>Enumerable of the created instances.</returns>
        internal static IEnumerable <T> GetInstances <T>(IPluginDescription plugin) where T : class
        {
            List <T> instances = new List <T>();

            foreach (Type t in GetTypes(typeof(T), plugin, onlyInstantiable: true, includeGenericTypeDefinitions: false))
            {
                T instance = null;
                try { instance = (T)Activator.CreateInstance(t); }
                catch { }
                if (instance != null)
                {
                    instances.Add(instance);
                }
            }
            return(instances);
        }
示例#27
0
        public IPluginStatus GetStatus(IPluginDescription description)
        {
            foreach (var pluginLoader in _pluginLoaders)
            {
                var status = pluginLoader.GetStatus(description);
                if (status.IsInstalled)
                {
                    return(status);
                }
            }

            return(new PluginStatus
            {
                IsInstalled = false,
                IsLoaded = false
            });
        }
示例#28
0
        /// <inheritdoc />
        public T Load <T>(IPluginDescription description) where T : class, IPlugin
        {
            if (!_archivesByPlugin.TryGetValue(description, out var archive))
            {
                throw new ArgumentException();
            }

            if (!description.Plugins.TryGetValue(typeof(T), out var interfaceImplementation))
            {
                throw new NotImplementedException();
            }

            var plugin       = archive.LoadPlugin();
            var type         = plugin.GetType(interfaceImplementation);
            var pluginObject = Activator.CreateInstance(type);

            return((T)pluginObject);
        }
示例#29
0
        private bool TryFindNewestPlugin(IPluginDescription installedPlugin, IReadOnlyList <PluginIdentifier> allPlugins,
                                         out PluginIdentifier id)
        {
            var candidates = allPlugins.Where(x => x.Id == installedPlugin.Id.Value)
                             .OrderByDescending(x => x.Version)
                             .ToList();

            if (candidates.Count == 0)
            {
                Log.DebugFormat("No newer version for plugin '{0}' available", installedPlugin.Id);

                id = null;
                return(false);
            }

            id = candidates[0];
            return(true);
        }
示例#30
0
        internal static IEnumerable <Type> GetTypes(IEnumerable <Type> types, IPluginDescription pluginDescription, bool onlyInstantiable, bool includeGenericTypeDefinitions, bool assignableToAllTypes)
        {
            IEnumerable <Type> result = GetTypes(types.First(), pluginDescription, onlyInstantiable, includeGenericTypeDefinitions);

            foreach (Type type in types.Skip(1))
            {
                IEnumerable <Type> discoveredTypes = GetTypes(type, pluginDescription, onlyInstantiable, includeGenericTypeDefinitions);
                if (assignableToAllTypes)
                {
                    result = result.Intersect(discoveredTypes);
                }
                else
                {
                    result = result.Union(discoveredTypes);
                }
            }
            return(result);
        }
示例#31
0
        private void UpdateIndex(IPluginDescription description)
        {
            _index.Description = description.Description;
            _index.Id          = description.Id.Value;
            _index.Name        = description.Name;
            _index.Author      = description.Author;
            _index.Website     = description.Website != null?description.Website.ToString() : null;

            _index.Version = description.Version?.ToString();
            _index.ImplementedPluginInterfaces = new List <PluginInterfaceImplementation>();
            foreach (var pair in description.Plugins)
            {
                _index.ImplementedPluginInterfaces.Add(new PluginInterfaceImplementation
                {
                    InterfaceTypename      = pair.Key.FullName,
                    ImplementationTypename = pair.Value
                });
            }
        }
示例#32
0
 private bool TryLoad(string filePath, out IPluginDescription description)
 {
     try
     {
         description = ReflectPlugin(filePath);
         return(true);
     }
     catch (FileLoadException e)
     {
         var error = string.Format("Unable to load plugin '{0}': {1}", filePath, e);
         Log.Error(error);
         description = new PluginDescription
         {
             FilePath = filePath,
             Error    = error
         };
         return(false);
     }
     catch (BadImageFormatException e)
     {
         var error = string.Format("Unable to load plugin '{0}' (plugins must be compiled against AnyCPU): {1}", filePath,
                                   e);
         Log.Error(error);
         description = new PluginDescription
         {
             FilePath = filePath,
             Error    = error
         };
         return(false);
     }
     catch (Exception e)
     {
         var error = string.Format("Caught unexpected exception while trying to load plugin '{0}': {1}",
                                   filePath, e);
         Log.Error(error);
         description = new PluginDescription
         {
             FilePath = filePath,
             Error    = error
         };
         return(false);
     }
 }
示例#33
0
        internal static IEnumerable <IPluginDescription> GetAllDependencies(IPluginDescription plugin)
        {
            HashSet <IPluginDescription> yieldedPlugins = new HashSet <IPluginDescription>();

            foreach (var dep in plugin.Dependencies)
            {
                foreach (var recDep in GetAllDependencies(dep))
                {
                    if (!yieldedPlugins.Contains(recDep))
                    {
                        yieldedPlugins.Add(recDep);
                        yield return(recDep);
                    }
                }
                if (!yieldedPlugins.Contains(dep))
                {
                    yieldedPlugins.Add(dep);
                    yield return(dep);
                }
            }
        }
示例#34
0
        /// <inheritdoc />
        public override T Load <T>(IPluginDescription description)
        {
            if (description == null)
            {
                throw new ArgumentNullException(nameof(description));
            }

            var assembly       = Assembly.LoadFrom(description.FilePath);
            var fullTypeName   = description.Plugins[typeof(T)];
            var implementation = assembly.GetType(fullTypeName);

            if (implementation == null)
            {
                throw new ArgumentException(string.Format("Plugin '{0}' does not define a type named '{1}'",
                                                          description.FilePath,
                                                          fullTypeName));
            }

            var plugin = (T)Activator.CreateInstance(implementation);

            return(plugin);
        }
示例#35
0
        private ListViewItem MakeListViewItem(IPluginDescription plugin)
        {
            ListViewItem item;

            if (localAndServerPlugins[plugin] != null)
            {
                item = new ListViewItem(new string[] { plugin.Name, plugin.Version.ToString(),
                                                       localAndServerPlugins[plugin].Version.ToString(), localAndServerPlugins[plugin].Description });
                if (plugin.Version <= localAndServerPlugins[plugin].Version)
                {
                    item.ForeColor = Color.Gray;
                }
            }
            else
            {
                item = new ListViewItem(new string[] { plugin.Name, plugin.Version.ToString(),
                                                       string.Empty, plugin.Description });
            }
            item.Tag        = plugin;
            item.ImageIndex = 0;
            item.Checked    = false;
            return(item);
        }
示例#36
0
 private static void CollectPluginDependencies(List<IPluginDescription> plugins, IPluginDescription plugin) {
   if (plugin == null) return;
   foreach (var dependency in plugin.Dependencies) {
     if (!plugins.Contains(dependency)) {
       plugins.Add(dependency);
       CollectPluginDependencies(plugins, dependency);
     }
   }
 }
 private ListViewItem FindItemForPlugin(IPluginDescription dep) {
   return (from i in listView.Items.Cast<ListViewItem>()
           where i.Tag == dep
           select i).Single();
 }
示例#38
0
 private IEnumerable<ListViewItem> FindItemsForPlugin(IPluginDescription plugin) {
   return (from item in pluginsListView.Items.OfType<ListViewItem>()
           let otherPlugin = item.Tag as IPluginDescription
           where otherPlugin != null && otherPlugin.Name == plugin.Name && otherPlugin.Version == plugin.Version
           select item);
 }
示例#39
0
 private IEnumerable<ListViewItem> FindItemsForPlugin(IPluginDescription plugin) {
   return from item in pluginListView.Items.OfType<ListViewItem>()
          let p = item.Tag as IPluginDescription
          where p.Name == plugin.Name
          where p.Version == plugin.Version
          select item;
 }
示例#40
0
 private ListViewItem CreateListViewItem(IPluginDescription plugin) {
   ListViewItem item = new ListViewItem(new string[] { plugin.Name, plugin.Version.ToString(), 
       string.Empty, plugin.Description });
   item.Tag = plugin;
   item.ImageIndex = 0;
   item.Checked = false;
   return item;
 }
示例#41
0
 // compares for two plugins with same major and minor version if plugin1 is newer than plugin2
 internal static bool IsNewerThan(IPluginDescription plugin1, IPluginDescription plugin2) {
   // newer: build version is higher, or if build version is the same revision is higher
   return plugin1.Version.Build > plugin2.Version.Build ||
     (plugin1.Version.Build == plugin2.Version.Build && plugin1.Version.Revision > plugin2.Version.Revision);
 }
示例#42
0
 public LicenseView(IPluginDescription plugin)
   : base() {
   InitializeComponent();
   Name = "License of: " + plugin;
   richTextBox.Text = plugin.LicenseText;
 }
 private DeploymentService.PluginDescription MakePluginDescription(IPluginDescription plugin, Dictionary<IPluginDescription, DeploymentService.PluginDescription> cachedPluginDescriptions) {
   if (!cachedPluginDescriptions.ContainsKey(plugin)) {
     var dependencies = (from dep in plugin.Dependencies
                         select MakePluginDescription(dep, cachedPluginDescriptions))
                        .ToList();
     cachedPluginDescriptions.Add(plugin,
       new DeploymentService.PluginDescription(plugin.Name, plugin.Version, dependencies, plugin.ContactName, plugin.ContactEmail, plugin.LicenseText));
   }
   return cachedPluginDescriptions[plugin];
 }
示例#44
0
 private static Plugin CreatePlugin(IPluginDescription plugin, byte[] hash) {
   return new Plugin() { Name = plugin.Name, Version = plugin.Version, Hash = hash };
 }
 private ListViewItem MakeListViewItem(IPluginDescription plugin) {
   ListViewItem item;
   if (localAndServerPlugins[plugin] != null) {
     item = new ListViewItem(new string[] { plugin.Name, plugin.Version.ToString(), 
       localAndServerPlugins[plugin].Version.ToString(), localAndServerPlugins[plugin].Description });
     if (plugin.Version <= localAndServerPlugins[plugin].Version)
       item.ForeColor = Color.Gray;
   } else {
     item = new ListViewItem(new string[] { plugin.Name, plugin.Version.ToString(), 
       string.Empty, plugin.Description });
   }
   item.Tag = plugin;
   item.ImageIndex = 0;
   item.Checked = false;
   return item;
 }
 private static byte[] CreateZipPackage(IPluginDescription plugin) {
   using (MemoryStream stream = new MemoryStream()) {
     ZipArchive zipFile = new ZipArchive(stream, ZipArchiveMode.Create);
     foreach (var file in plugin.Files) {
       zipFile.CreateEntry(file.Name);
     }
     stream.Seek(0, SeekOrigin.Begin);
     return stream.GetBuffer();
   }
 }