using System; using System.Collections.Generic; using System.Reflection; using System.Text.RegularExpressions; namespace Gaia { public class GaiaExtensionManager { private Dictionary m_extensions = new Dictionary(); public void ScanForExtensions() { m_extensions.Clear(); string text = ""; string text2 = ""; string packageImageName = ""; string packageDescription = ""; string packageURL = ""; List typesInNamespace = GetTypesInNamespace("Gaia.GX."); for (int i = 0; i < typesInNamespace.Count; i++) { string[] array = typesInNamespace[i].FullName.Split('.'); text = Regex.Replace(array[2], "(\\B[A-Z])", " $1"); text2 = Regex.Replace(array[3], "(\\B[A-Z])", " $1"); MethodInfo[] methods = typesInNamespace[i].GetMethods(BindingFlags.Static | BindingFlags.Public); List list = new List(); foreach (MethodInfo methodInfo in methods) { if (methodInfo.Name.StartsWith("GX_")) { list.Add(methodInfo); } else if (methodInfo.Name == "GetPublisherName") { text = (string)methodInfo.Invoke(null, null); } else if (methodInfo.Name == "GetPackageName") { text2 = (string)methodInfo.Invoke(null, null); } } GaiaCompatiblePublisher value = null; if (!m_extensions.TryGetValue(text, out value)) { value = new GaiaCompatiblePublisher(); value.m_publisherName = text; value.m_compatibleFoldedOut = false; value.m_installedFoldedOut = false; m_extensions.Add(text, value); } GaiaCompatiblePackage gaiaCompatiblePackage = value.GetPackage(text2); if (gaiaCompatiblePackage == null) { gaiaCompatiblePackage = new GaiaCompatiblePackage(); gaiaCompatiblePackage.m_compatibleFoldedOut = false; gaiaCompatiblePackage.m_installedFoldedOut = false; gaiaCompatiblePackage.m_packageName = text2; value.AddPackage(gaiaCompatiblePackage); } if (list.Count > 0) { gaiaCompatiblePackage.m_isInstalled = true; } else { gaiaCompatiblePackage.m_isInstalled = false; } gaiaCompatiblePackage.m_methods = new List(list); } typesInNamespace = GetTypesInNamespace("Gaia.GXC."); for (int k = 0; k < typesInNamespace.Count; k++) { string[] array2 = typesInNamespace[k].FullName.Split('.'); text = Regex.Replace(array2[2], "(\\B[A-Z])", " $1"); text2 = Regex.Replace(array2[3], "(\\B[A-Z])", " $1"); MethodInfo[] methods = typesInNamespace[k].GetMethods(BindingFlags.Static | BindingFlags.Public); foreach (MethodInfo methodInfo in methods) { if (methodInfo.Name == "GetPublisherName") { text = (string)methodInfo.Invoke(null, null); } else if (methodInfo.Name == "GetPackageName") { text2 = (string)methodInfo.Invoke(null, null); } else if (methodInfo.Name == "GetPackageImage") { packageImageName = (string)methodInfo.Invoke(null, null); } else if (methodInfo.Name == "GetPackageDescription") { packageDescription = (string)methodInfo.Invoke(null, null); } else if (methodInfo.Name == "GetPackageURL") { packageURL = (string)methodInfo.Invoke(null, null); } } GaiaCompatiblePublisher value2 = null; if (!m_extensions.TryGetValue(text, out value2)) { value2 = new GaiaCompatiblePublisher(); value2.m_publisherName = text; value2.m_compatibleFoldedOut = false; value2.m_installedFoldedOut = false; m_extensions.Add(text, value2); } GaiaCompatiblePackage gaiaCompatiblePackage2 = value2.GetPackage(text2); if (gaiaCompatiblePackage2 == null) { gaiaCompatiblePackage2 = new GaiaCompatiblePackage(); gaiaCompatiblePackage2.m_compatibleFoldedOut = false; gaiaCompatiblePackage2.m_installedFoldedOut = false; gaiaCompatiblePackage2.m_packageName = text2; value2.AddPackage(gaiaCompatiblePackage2); } gaiaCompatiblePackage2.m_isCompatible = true; gaiaCompatiblePackage2.m_packageDescription = packageDescription; gaiaCompatiblePackage2.m_packageImageName = packageImageName; gaiaCompatiblePackage2.m_packageURL = packageURL; } } public int GetInstalledExtensionCount() { int num = 0; foreach (GaiaCompatiblePublisher value in m_extensions.Values) { num += value.InstalledPackages(); } return num; } public List GetPublishers() { List list = new List(m_extensions.Values); list.Sort((GaiaCompatiblePublisher a, GaiaCompatiblePublisher b) => a.m_publisherName.CompareTo(b.m_publisherName)); return list; } public List GetTypesInNamespace(string nameSpace) { List list = new List(); Assembly[] assemblies = AppDomain.CurrentDomain.GetAssemblies(); for (int i = 0; i < assemblies.Length; i++) { if (!assemblies[i].FullName.StartsWith("Assembly")) { continue; } Type[] types = assemblies[i].GetTypes(); for (int j = 0; j < types.Length; j++) { if (!string.IsNullOrEmpty(types[j].Namespace) && types[j].Namespace.StartsWith(nameSpace)) { list.Add(types[j]); } } } return list; } } }