static void ActivatePlugins() { var blobReader = new PluginBlobReader("plugins.blob"); var md = blobReader.ReadMetadata(); var pluginList = new List <IClientPluginHost>(); foreach (var plugin in md.PluginTable) { pluginList.AddRange(blobReader.GetPluginHost(plugin.Key)); } blobReader.Dispose(); pluginList.ForEach(lp => { lp.Plugins.ForEach(lpp => { if (lpp.PluginPackets != null) { lpp.PluginPackets.ForEach(lppp => { try { Globals.Client.PacketProcessor.PacketTable.Add(lppp.PacketId, lppp.GetType()); } catch {} }); } if (lpp.SocketOperations != null) { lpp.SocketOperations.ForEach(lppso => { try { Globals.Client.RegisterOperation(lppso.GetType()); } catch {} }); } }); }); Globals.Client.OnClientConnected += (o, e) => { pluginList.ForEach(lp => { lp.Plugins.ForEach(lpp => { lpp.OnClientConnected(); }); }); }; Globals.Client.OnPacketReceived += (o, e) => { pluginList.ForEach(lp => { lp.Plugins.ForEach(lpp => { lpp.OnPacketReceived(o, e); }); }); }; }
public override void PacketReceived(IDataPacket packet, IChannel sender) { if (packet is FetchPluginMetadataPacket) { var retPacket = new FetchPluginMetadataPacket(); // Send empty list if there are no plugins if (!File.Exists("plugins.blob")) { SendPacket(retPacket); } else { var blobReader = new PluginBlobReader("plugins.blob"); var md = blobReader.ReadMetadata(); blobReader.Dispose(); foreach (var plugin in md.PluginTable) { retPacket.PluginList.Add(new PluginIntegrityPair(plugin.Key, plugin.Value.Hash)); } SendPacket(retPacket); } } else if (packet is PluginActionPacket) { var actionPacket = packet as PluginActionPacket; var blobWriter = new PluginBlobWriter("plugins.blob"); foreach (var action in actionPacket.Actions) { switch (action.Action) { case PluginActionPacket.PluginAction.Add: blobWriter.AppendPlugin(new BlobClientPlugin { Data = action.PluginData, Hash = action.IntegrityHash, Size = action.PluginData.Length, PluginGuid = action.PluginGuid }); break; case PluginActionPacket.PluginAction.Replace: blobWriter.ReplacePlugin(action.PluginGuid, new BlobClientPlugin { Data = action.PluginData, Hash = action.IntegrityHash, Size = action.PluginData.Length, PluginGuid = action.PluginGuid }); break; case PluginActionPacket.PluginAction.Remove: blobWriter.RemovePlugin(action.PluginGuid); break; } } blobWriter.WriteBlob(); blobWriter.Dispose(); } else if (packet is SynchronizationFinalizationPacket) { ActivatePlugins(); SendPacket(new SynchronizationFinalizationPacket()); } }