private void OnPackageFileDataBeginReceived(PacketMessage packetMessage) { XmlDocument xmlDocument = CreateXmlDocumentFromMessage(packetMessage); //Console.WriteLine("DEBUG: Received S_PACKAGE_FILE_BEGIN: " + xmlDocument.OuterXml); XmlMessagePackageFileBegin message = XmlMessageCreator.CreateXmlMessagePackageFileBegin(xmlDocument); if (PackageFileDataBeginReceived != null) { PackageFileDataBeginReceived(this, message); } }
private void SendPackageFile( ClientConnection clientConnection, ClientRequest clientRequest, FileInfo packageFileInfo) { // send file data const int FILE_CHUNK_SIZE = 32 * 1024 * 1024; // read the file by chunks of 32MB using (FileStream file = File.OpenRead(packageFileInfo.FullName)) { // send file begin XmlMessagePackageFileBegin fileBeginMessage = XmlMessageCreator.CreateXmlMessagePackageFileBegin( packageFileInfo.Name, file.Length, ComputeFileChecksum(packageFileInfo)); SendClientXmlResponse(clientConnection, clientRequest, PacketMessageType.S_PACKAGE_FILE_BEGIN, fileBeginMessage); int part = 0; int bytesRead = 0; byte[] buffer = new byte[FILE_CHUNK_SIZE]; while ((bytesRead = file.Read(buffer, 0, buffer.Length)) > 0) { byte[] dataToSend = buffer; // extract only "bytesRead" number of bytes if (bytesRead < buffer.Length) { dataToSend = new byte[bytesRead]; Array.Copy(buffer, dataToSend, bytesRead); } SendClientRawDataResponse(clientConnection, clientRequest, PacketMessageType.S_PACKAGE_FILE_DATA, dataToSend, part++); } } // send file end SendClientNoDataResponse(clientConnection, clientRequest, PacketMessageType.S_PACKAGE_FILE_END); }
public void OnFileBeginReceive(object sender, XmlMessagePackageFileBegin message) { // verify current state if (_state != PackageBuilderState.WAITING_FOR_FILE_BEGIN) { throw new InvalidOperationException("OnFileHeaderReceive: Invalid internal state - " + _state.ToString()); } // open file stream - must be disposed string filePath = Path.Combine(_fullPackagePath, message.Name); _currentFileStrem = new FileStream(filePath, FileMode.Create); _expectedFileSize = message.Size; _fileChecksum = message.Checksum; // notify observers OnFileReciveBegin(); // goto next state _state = PackageBuilderState.RECEIVE_FILE_DATA; }