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);
            }
        }
Example #2
0
        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;
        }