Exemple #1
0
        internal AddinDescription Load(Addin iad)
        {
            ainfo = iad;

            ArrayList plugList = new ArrayList();
            ArrayList asmList  = new ArrayList();

            AddinDescription description = iad.Description;

            id            = description.AddinId;
            baseDirectory = description.BasePath;

            // Load the main modules
            LoadModule(description.MainModule, description.Namespace, plugList, asmList);

            // Load the optional modules, if the dependencies are present
            foreach (ModuleDescription module in description.OptionalModules)
            {
                if (CheckAddinDependencies(module))
                {
                    LoadModule(module, description.Namespace, plugList, asmList);
                }
            }

            depAddins  = (RuntimeAddin[])plugList.ToArray(typeof(RuntimeAddin));
            assemblies = (Assembly[])asmList.ToArray(typeof(Assembly));

            return(description);
        }
        void FillAddin(TreeIter iter, AddinDescription addin)
        {
            foreach (ExtensionPoint ep in addin.ExtensionPoints)
            {
                string name;
                if (ep.Name.Length > 0 && ep.Description.Length > 0)
                {
                    name  = "<b>" + GLib.Markup.EscapeText(ep.Name) + "</b>\n";
                    name += "<small>" + GLib.Markup.EscapeText(ep.Description) + "</small>";
                }
                else if (ep.Name.Length > 0)
                {
                    name = "<b>" + GLib.Markup.EscapeText(ep.Name) + "</b>";
                }
                else if (ep.Description.Length > 0)
                {
                    name = "<b>" + GLib.Markup.EscapeText(ep.Description) + "</b>";
                }
                else
                {
                    name = "<b>" + GLib.Markup.EscapeText(ep.Path) + "</b>";
                }

                TreeIter epIter = store.AppendValues(iter, name, ep, ep, true, selection.Contains(ep), null, false, !showExtensionNodes);
                if (showExtensionNodes)
                {
                    // Add a dummy node to make sure the expand button is shown
                    store.AppendValues(epIter, "", null, null, false, false, null, true, true);
                }
            }
        }
Exemple #3
0
        bool IsAddinCompatible(AddinDescription installedDescription, AddinDescription description, ModuleDescription module)
        {
            string addinId         = Addin.GetFullId(installedDescription.Namespace, installedDescription.LocalId, null);
            string requiredVersion = null;

            for (int n = module.Dependencies.Count - 1; n >= 0; n--)
            {
                AddinDependency adep = module.Dependencies [n] as AddinDependency;
                if (adep != null && Addin.GetFullId(description.Namespace, adep.AddinId, null) == addinId)
                {
                    requiredVersion = adep.Version;
                    break;
                }
            }
            if (requiredVersion == null)
            {
                return(false);
            }

            // Check if the required version is between rep.Description.CompatVersion and rep.Description.Version
            if (Addin.CompareVersions(installedDescription.Version, requiredVersion) > 0)
            {
                return(false);
            }
            if (installedDescription.CompatVersion.Length > 0 && Addin.CompareVersions(installedDescription.CompatVersion, requiredVersion) < 0)
            {
                return(false);
            }

            return(true);
        }
        void ScanAssemblyAddinHeaders(AddinDescription config, Assembly asm, AddinScanResult scanResult)
        {
            // Get basic add-in information
            AddinAttribute att = (AddinAttribute)Attribute.GetCustomAttribute(asm, typeof(AddinAttribute), false);

            if (att != null)
            {
                if (att.Id.Length > 0)
                {
                    config.LocalId = att.Id;
                }
                if (att.Version.Length > 0)
                {
                    config.Version = att.Version;
                }
                if (att.Namespace.Length > 0)
                {
                    config.Namespace = att.Namespace;
                }
                if (att.Category.Length > 0)
                {
                    config.Category = att.Category;
                }
                config.IsRoot = att is AddinRootAttribute;
            }
        }
        void RegisterHostTypeNode(AddinDescription config, Type t, ArrayList assemblies)
        {
            foreach (ExtensionAttribute eatt in t.GetCustomAttributes(typeof(ExtensionAttribute), false))
            {
                if (eatt.Path.Length > 0)
                {
                    continue;
                }

                foreach (ExtensionPoint ep in config.ExtensionPoints)
                {
                    foreach (ExtensionNodeType nt in ep.NodeSet.NodeTypes)
                    {
                        if (nt.ObjectTypeName.Length == 0)
                        {
                            continue;
                        }
                        Type etype = FindAddinType(nt.ObjectTypeName, assemblies);
                        if (etype != null && etype.IsAssignableFrom(t))
                        {
                            RegisterTypeNode(config, eatt, ep.Path, nt.Id, t);
                            return;
                        }
                    }
                }
            }
        }
Exemple #6
0
        public SelectNodeSetDialog(DotNetProject project, AddinRegistry registry, AddinDescription desc)
        {
            this.Build();
            this.project  = project;
            this.registry = registry;
            this.desc     = desc;

            foreach (AddinDependency adep in desc.MainModule.Dependencies)
            {
                Addin addin = registry.GetAddin(adep.FullAddinId);
                if (addin != null && addin.Description != null)
                {
                    foreach (ExtensionNodeSet ns in addin.Description.ExtensionNodeSets)
                    {
                        combo.AppendText(ns.Id);
                        sets [ns.Id] = ns;
                    }
                }
            }

            foreach (ExtensionNodeSet ns in desc.ExtensionNodeSets)
            {
                combo.AppendText(ns.Id);
                sets [ns.Id] = ns;
            }

            nodeseteditor.AllowEditing = false;
            buttonOk.Sensitive         = false;
        }
Exemple #7
0
        /// <summary>
        /// Loads an add-in description
        /// </summary>
        /// <param name="progressStatus">
        /// Progress tracker.
        /// </param>
        /// <param name="file">
        /// Name of the file to load
        /// </param>
        /// <returns>
        /// An add-in description
        /// </returns>
        /// <remarks>
        /// This method loads an add-in description from a file. The file can be an XML manifest or an
        /// assembly that implements an add-in.
        /// </remarks>
        public AddinDescription GetAddinDescription(IProgressStatus progressStatus, string file)
        {
            if (currentDomain == AddinDatabase.UnknownDomain)
            {
                return(null);
            }
            string outFile = Path.GetTempFileName();

            try {
                database.ParseAddin(progressStatus, currentDomain, file, outFile, false);
            }
            catch {
                File.Delete(outFile);
                throw;
            }

            try {
                AddinDescription desc = AddinDescription.Read(outFile);
                if (desc != null)
                {
                    desc.AddinFile     = file;
                    desc.OwnerDatabase = database;
                }
                return(desc);
            }
            catch {
                // Errors are already reported using the progress status object
                return(null);
            }
            finally {
                File.Delete(outFile);
            }
        }
Exemple #8
0
        public void ApplyFeature(SolutionFolder parentCombine, SolutionItem entry, Widget ed)
        {
            AddinFeatureWidget editor = (AddinFeatureWidget)ed;
            AddinData          data   = AddinData.EnableAddinAuthoringSupport((DotNetProject)entry);

            DotNetProject project = (DotNetProject)entry;

            if (editor.HasRegistryInfo)
            {
                project.GetAddinData().ApplicationName = editor.ApplicationName;
            }

            AddinDescription desc = data.LoadAddinManifest();

            if (editor.AddinId.Length > 0)
            {
                desc.LocalId = editor.AddinId;
            }
            if (editor.AddinName.Length > 0)
            {
                desc.Name = editor.AddinName;
            }
            desc.Namespace = editor.AddinNamespace;
            desc.IsRoot    = project.CompileTarget != CompileTarget.Library || editor.IsRoot;
            desc.Version   = "1.0";
            desc.Save();
            data.NotifyChanged();
        }
Exemple #9
0
        public override void BuildNode(ITreeBuilder treeBuilder, object dataObject, ref string label, ref Gdk.Pixbuf icon, ref Gdk.Pixbuf closedIcon)
        {
            AddinDescription ad = (AddinDescription)dataObject;

            label = Util.GetDisplayName(ad);
            icon  = Context.GetIcon("md-addin");
        }
 AddinDescription DescFromResource(string res)
 {
     using (Stream s = GetType().Assembly.GetManifestResourceStream(res))
     {
         return(AddinDescription.Read(s, "."));
     }
 }
 public void Reload()
 {
     adesc = data.AddinRegistry.ReadAddinManifestFile(data.AddinManifestFileName);
     descWidget.Fill(adesc, data);
     IsDirty       = false;
     descTimestamp = File.GetLastWriteTime(data.AddinManifestFileName);
 }
Exemple #12
0
        public void Fill(AddinDescription desc)
        {
            string name = desc.Name;

            if (string.IsNullOrEmpty(name))
            {
                name = desc.LocalId;
            }
            labelName.Markup = "<small>Add-in</small>\n<big><b>" + GLib.Markup.EscapeText(name) + "</b></big>";

            if (!string.IsNullOrEmpty(desc.Description))
            {
                labelDesc.Text = desc.Description;
            }
            else
            {
                labelDesc.Hide();
            }

            labelId.Text        = desc.LocalId;
            labelNamespace.Text = desc.Namespace;
            labelVersion.Text   = desc.Version;
            labelAuthor.Text    = desc.Author;
            labelCopyright.Text = desc.Copyright;
        }
Exemple #13
0
 void CollectExtensions(AddinDescription desc, string path, List <Extension> extensions, List <ExtensionNodeDescription> nodes)
 {
     foreach (Extension ext in desc.MainModule.Extensions)
     {
         if (ext.Path == path || ext.Path.StartsWith(path + "/"))
         {
             extensions.Add(ext);
         }
         else if (path.StartsWith(ext.Path + "/"))
         {
             string subp = path.Substring(ext.Path.Length);
             ExtensionNodeDescription           foundNode = null;
             ExtensionNodeDescriptionCollection list      = ext.ExtensionNodes;
             foreach (string p in subp.Split('/'))
             {
                 if (p.Length == 0)
                 {
                     continue;
                 }
                 foundNode = list [p];
                 if (foundNode == null)
                 {
                     break;
                 }
             }
             if (foundNode != null)
             {
                 foreach (ExtensionNodeDescription n in foundNode.ChildNodes)
                 {
                     nodes.Add(n);
                 }
             }
         }
     }
 }
Exemple #14
0
        internal override void CommitUninstall(IProgressMonitor monitor, AddinStore service)
        {
            if (tempFolder == null)
            {
                return;
            }

            monitor.Log.WriteLine("Uninstalling " + info.Name + " v" + info.Version);

            AddinDescription conf     = iaddin.Description;
            string           basePath = Path.GetDirectoryName(conf.AddinFile);

            foreach (string relPath in conf.AllFiles)
            {
                string path = Path.Combine(basePath, relPath);
                if (!File.Exists(path))
                {
                    continue;
                }
                File.Delete(path);
            }

            File.Delete(iaddin.AddinFile);

            RecDeleteDir(monitor, basePath);

            monitor.Log.WriteLine("Done");
        }
        bool IsAddinCompatible(AddinDescription installedDescription, AddinDescription description, ModuleDescription module)
        {
            if (installedDescription == description)
            {
                return(true);
            }
            if (installedDescription.Domain != AddinDatabase.GlobalDomain)
            {
                if (description.Domain != AddinDatabase.GlobalDomain && description.Domain != installedDescription.Domain)
                {
                    return(false);
                }
            }
            else if (description.Domain != AddinDatabase.GlobalDomain)
            {
                return(false);
            }

            string addinId         = Addin.GetFullId(installedDescription.Namespace, installedDescription.LocalId, null);
            string requiredVersion = null;

            IEnumerable deps;

            if (module == description.MainModule)
            {
                deps = module.Dependencies;
            }
            else
            {
                ArrayList list = new ArrayList();
                list.AddRange(module.Dependencies);
                list.AddRange(description.MainModule.Dependencies);
                deps = list;
            }
            foreach (object dep in deps)
            {
                AddinDependency adep = dep as AddinDependency;
                if (adep != null && Addin.GetFullId(description.Namespace, adep.AddinId, null) == addinId)
                {
                    requiredVersion = adep.Version;
                    break;
                }
            }
            if (requiredVersion == null)
            {
                return(false);
            }

            // Check if the required version is between rep.Description.CompatVersion and rep.Description.Version
            if (Addin.CompareVersions(installedDescription.Version, requiredVersion) > 0)
            {
                return(false);
            }
            if (installedDescription.CompatVersion.Length > 0 && Addin.CompareVersions(installedDescription.CompatVersion, requiredVersion) < 0)
            {
                return(false);
            }

            return(true);
        }
Exemple #16
0
        public override void BuildChildNodes(ITreeBuilder treeBuilder, object dataObject)
        {
            AddinDescription ad          = (AddinDescription)dataObject;
            HashSet <string> localPoints = new HashSet <string> ();

            foreach (ExtensionPoint ep in ad.ExtensionPoints)
            {
                treeBuilder.AddChild(ep);
                localPoints.Add(ep.Path);
            }
            foreach (Extension ex in ad.MainModule.Extensions)
            {
                if (!localPoints.Contains(ex.Path))
                {
                    treeBuilder.AddChild(ex);
                }
            }
            treeBuilder.AddChild(new TreeViewItem(GettextCatalog.GetString("Dependencies"), MonoDevelop.Ide.Gui.Stock.ClosedReferenceFolder), true);
            foreach (Dependency dep in ad.MainModule.Dependencies)
            {
                AddinDependency adep = dep as AddinDependency;
                if (adep != null)
                {
                    treeBuilder.AddChild(new TreeViewItem(adep.FullAddinId, "md-addin-reference"));
                }
            }
        }
        public void RegisterNodeSet(AddinDescription description, ExtensionNodeSet nset)
        {
            List <RootExtensionPoint> extensions;

            if (nodeSetHash.TryGetValue(nset.Id, out extensions))
            {
                // Extension point already registered
                List <ExtensionPoint> compatExtensions = GetCompatibleExtensionPoints(nset.Id, description, description.MainModule, extensions);
                if (compatExtensions.Count > 0)
                {
                    foreach (ExtensionPoint einfo in compatExtensions)
                    {
                        einfo.NodeSet.MergeWith(null, nset);
                    }
                    return;
                }
            }
            // Create a new extension set
            RootExtensionPoint rep = new RootExtensionPoint();

            rep.ExtensionPoint = new ExtensionPoint();
            rep.ExtensionPoint.SetNodeSet(nset);
            rep.ExtensionPoint.RootAddin = description.AddinId;
            rep.ExtensionPoint.Path      = nset.Id;
            rep.Description = description;
            if (extensions == null)
            {
                extensions            = new List <RootExtensionPoint> ();
                nodeSetHash [nset.Id] = extensions;
            }
            extensions.Add(rep);
        }
Exemple #18
0
        internal static void RemoveReferences(AddinData data, string[] fullIds)
        {
            AddinDescription     desc = data.LoadAddinManifest();
            AddinDescriptionView view = FindLoadedDescription(data);

            foreach (string ad in fullIds)
            {
                RemoveReference(desc, ad);
                if (view != null)
                {
                    RemoveReference(view.AddinDescription, ad);
                }
            }
            if (view != null)
            {
                view.Update();
                view.BeginInternalUpdate();
            }

            try {
                desc.Save();
                data.NotifyChanged(true);
            } finally {
                if (view != null)
                {
                    view.EndInternalUpdate();
                }
            }
        }
Exemple #19
0
        public AddinDescription ReadAddinManifestFile(string file)
        {
            AddinDescription desc = AddinDescription.Read(file);

            desc.OwnerDatabase = database;
            return(desc);
        }
Exemple #20
0
        public static void SaveFormatted(AddinDescription adesc)
        {
            XmlDocument  doc       = adesc.SaveToXml();
            XmlFormatter formatter = new XmlFormatter();

            TextStylePolicy     textPolicy = new TextStylePolicy(80, 4, false, false, true, EolMarker.Unix);
            XmlFormattingPolicy xmlPolicy  = new XmlFormattingPolicy();

            XmlFormatingSettings f = new XmlFormatingSettings();

            f.ScopeXPath.Add("*/*");
            f.EmptyLinesBeforeStart = 1;
            f.EmptyLinesAfterEnd    = 1;
            xmlPolicy.Formats.Add(f);

            f = new XmlFormatingSettings();
            f.ScopeXPath.Add("Addin");
            f.AttributesInNewLine = true;
            f.AlignAttributes     = true;
            f.AttributesInNewLine = false;
            xmlPolicy.Formats.Add(f);

            string xml = formatter.FormatXml(textPolicy, xmlPolicy, doc.OuterXml);

            File.WriteAllText(adesc.FileName, xml);
        }
Exemple #21
0
        internal static AddinInfo ReadFromDescription(AddinDescription description)
        {
            AddinInfo info = new AddinInfo();

            info.id          = description.LocalId;
            info.namspace    = description.Namespace;
            info.name        = description.Name;
            info.version     = description.Version;
            info.author      = description.Author;
            info.copyright   = description.Copyright;
            info.url         = description.Url;
            info.description = description.Description;
            info.category    = description.Category;
            info.baseVersion = description.CompatVersion;
            info.properties  = new AddinPropertyCollectionImpl(description.Properties);

            foreach (Dependency dep in description.MainModule.Dependencies)
            {
                info.Dependencies.Add(dep);
            }

            foreach (ModuleDescription mod in description.OptionalModules)
            {
                foreach (Dependency dep in mod.Dependencies)
                {
                    info.OptionalDependencies.Add(dep);
                }
            }
            return(info);
        }
Exemple #22
0
        IEnumerable <string> GetInstalledFiles(AddinDescription conf)
        {
            string basePath = Path.GetDirectoryName(conf.AddinFile);

            foreach (string relPath in conf.AllFiles)
            {
                string afile = Path.Combine(basePath, relPath);
                if (File.Exists(afile))
                {
                    yield return(afile);
                }
            }
            foreach (var p in conf.Properties)
            {
                string file;
                try {
                    file = Path.Combine(basePath, p.Value);
                    if (!File.Exists(file))
                    {
                        file = null;
                    }
                } catch {
                    file = null;
                }
                if (file != null)
                {
                    yield return(file);
                }
            }
        }
 void ScanNodeSet(AddinDescription config, ExtensionNodeSet nset, ArrayList assemblies, Hashtable internalNodeSets)
 {
     foreach (ExtensionNodeType nt in nset.NodeTypes)
     {
         ScanNodeType(config, nt, assemblies, internalNodeSets);
     }
 }
Exemple #24
0
 public void RegisterExtension(AddinDescription description, ModuleDescription module, Extension extension)
 {
     if (extension.Path.StartsWith("$"))
     {
         string[] objectTypes = extension.Path.Substring(1).Split(',');
         bool     found       = false;
         foreach (string s in objectTypes)
         {
             ArrayList list = (ArrayList)objectTypeExtensions [s];
             if (list != null)
             {
                 found = true;
                 foreach (ExtensionPoint ep in list)
                 {
                     if (IsAddinCompatible(ep.ParentAddinDescription, description, module))
                     {
                         extension.Path = ep.Path;
                         RegisterExtension(description, module, ep.Path);
                     }
                 }
             }
         }
         if (!found)
         {
             monitor.ReportWarning("The add-in '" + description.AddinId + "' is trying to register the class '" + extension.Path.Substring(1) + "', but there isn't any add-in defining a suitable extension point");
         }
     }
 }
        void GetNodes(AddinDescription desc, ExtensionNodeSet nset, ArrayList list, Hashtable visited)
        {
            if (visited.Contains(nset))
            {
                return;
            }
            visited.Add(nset, nset);

            foreach (ExtensionNodeType nt in nset.NodeTypes)
            {
                if (!visited.Contains(nt.Id + " " + nt.TypeName))
                {
                    list.Add(nt);
                    visited.Add(nt.Id + " " + nt.TypeName, nt);
                }
            }

            foreach (string nsid in nset.NodeSets)
            {
                ExtensionNodeSet rset = desc.ExtensionNodeSets [nsid];
                if (rset != null)
                {
                    GetNodes(desc, rset, list, visited);
                }
            }
        }
Exemple #26
0
        public void RegisterExtension(AddinDescription description, ModuleDescription module, string path)
        {
            ArrayList extensions = (ArrayList)pathHash [path];

            if (extensions == null)
            {
                // Root add-in extension points are registered before any other kind of extension,
                // so we should find it now.
                extensions = GetParentExtensionInfo(path);
            }
            if (extensions == null)
            {
                monitor.ReportWarning("The add-in '" + description.AddinId + "' is trying to extend '" + path + "', but there isn't any add-in defining this extension point");
                return;
            }

            bool found = false;

            foreach (RootExtensionPoint einfo in extensions)
            {
                if (IsAddinCompatible(einfo.Description, description, module))
                {
                    if (!einfo.ExtensionPoint.Addins.Contains(description.AddinId))
                    {
                        einfo.ExtensionPoint.Addins.Add(description.AddinId);
                    }
                    found = true;
                }
            }
            if (!found)
            {
                monitor.ReportWarning("The add-in '" + description.AddinId + "' is trying to extend '" + path + "', but there isn't any compatible add-in defining this extension point");
            }
        }
Exemple #27
0
        IEnumerable GetExtensionInfo(Hashtable hash, string path, AddinDescription description, ModuleDescription module, bool lookInParents)
        {
            ArrayList list = new ArrayList();

            object data = hash [path];

            if (data == null && lookInParents)
            {
                // Root add-in extension points are registered before any other kind of extension,
                // so we should find it now.
                data = GetParentExtensionInfo(path);
            }

            if (data is ArrayList)
            {
                // Extension point which belongs to a root assembly.
                list.AddRange(GetRootExtensionInfo(hash, path, description, module, (ArrayList)data));
            }
            else
            {
                ExtensionPoint info = (ExtensionPoint)data;
                if (info == null)
                {
                    info        = new ExtensionPoint();
                    info.Path   = path;
                    hash [path] = info;
                }
                list.Add(info);
            }
            return(list);
        }
        public void RegisterExtensionPoint(AddinDescription description, ExtensionPoint ep)
        {
            List <RootExtensionPoint> extensions;

            if (pathHash.TryGetValue(ep.Path, out extensions))
            {
                // Extension point already registered
                List <ExtensionPoint> compatExtensions = GetCompatibleExtensionPoints(ep.Path, description, description.MainModule, extensions);
                if (compatExtensions.Count > 0)
                {
                    foreach (ExtensionPoint einfo in compatExtensions)
                    {
                        einfo.MergeWith(null, ep);
                    }
                    RegisterObjectTypes(ep);
                    return;
                }
            }
            // Create a new extension
            RootExtensionPoint rep = new RootExtensionPoint();

            rep.ExtensionPoint           = ep;
            rep.ExtensionPoint.RootAddin = description.AddinId;
            rep.Description = description;
            if (extensions == null)
            {
                extensions         = new List <RootExtensionPoint> ();
                pathHash [ep.Path] = extensions;
            }
            extensions.Add(rep);
            RegisterObjectTypes(ep);
        }
        TreeIter AddAddin(AddinDescription adesc)
        {
            TreeIter it;

            if (store.GetIterFirst(out it))
            {
                do
                {
                    if ((string)store.GetValue(it, ColAddin) == adesc.AddinId)
                    {
                        return(it);
                    }
                }while (store.IterNext(ref it));
            }
            if (adesc != this.adesc)
            {
                string txt = GLib.Markup.EscapeText(adesc.Name);
                return(store.AppendValues(txt, adesc.AddinId, null, null, pixAddin, true, null));
            }
            else
            {
                string txt = AddinManager.CurrentLocalizer.GetString("Local extension points");
                return(store.AppendValues(txt, adesc.AddinId, null, null, pixLocalAddin, true, null));
            }
        }
        internal override void CommitUninstall(IProgressMonitor monitor, AddinStore service)
        {
            if (tempFolder == null)
            {
                return;
            }

            monitor.Log.WriteLine("Uninstalling " + info.Name + " v" + info.Version);

            AddinDescription conf     = iaddin.Description;
            string           basePath = Path.GetDirectoryName(conf.AddinFile);

            foreach (string relPath in conf.AllFiles)
            {
                string path = Path.Combine(basePath, relPath);
                if (!File.Exists(path))
                {
                    continue;
                }
                File.Delete(path);
            }

            File.Delete(iaddin.AddinFile);

            if (Directory.GetFiles(basePath).Length == 0)
            {
                try {
                    Directory.Delete(basePath);
                } catch {
                    monitor.ReportWarning("Directory " + basePath + " could not be deleted.");
                }
            }

            monitor.Log.WriteLine("Done");
        }