/* * StartFileRequest * This method Creates FileRequest packet, and Enqueues it in Send Queue * fileName shouldn't be longer than 256 bytes ( throws ArgumentException if filename is too long, or '0') * This method will call ReadFilePackets after execution * Data0: userID LSB * Data1: userID MSB * Data2: userID * Data3: userID * Data4: fileNameArray Length * Data5~Data(3+fileNameArray Length) : fileNameArray */ internal override void StartFileRequest(string fileName, FileType fileType) { byte[] fileNameArray = Encoding.ASCII.GetBytes(fileName); uint userId = UserToken.UserId; if (fileNameArray.Length > 256 || fileNameArray.Length == 0) { throw new ArgumentException("Filename is too long"); } Packet fileRequestpacket = new Packet { RequestType = (byte)PacketType.FileRequest, FileType = (byte)fileType, MorePackets = false, PacketNumber = 0, DataSize = (byte)(fileNameArray.Length + 5), // Additional 3 for userID and fileName length ProcessId = Pid }; fileRequestpacket.Data = new byte[fileRequestpacket.DataSize]; MakePacketHeader(fileRequestpacket); //Sets packet Header fileRequestpacket.Data[0] = (byte)(userId & 0xFF); // first and second bytes are for user ID fileRequestpacket.Data[1] = (byte)((userId >> 8) & 0xFF); fileRequestpacket.Data[2] = (byte)((userId >> 16) & 0xFF); fileRequestpacket.Data[3] = (byte)((userId >> 24) & 0xFF); fileRequestpacket.Data[4] = (byte)fileNameArray.Length; // File length Array.Copy(fileNameArray, 0, fileRequestpacket.Data, 5, fileNameArray.Length); // Copy file name to packet Data (from index 5) UserToken.EnqueueSend(fileRequestpacket); // Enqueue the Request packet to Sender ReadFilePackets(); // Start reading packets }
internal override void StartIdRequest() { Packet requestIdPacket = new Packet() { Data = new byte[1], DataSize = 1, FileType = (byte)FileType.NoFile, MorePackets = false, PacketNumber = 0, ProcessId = Pid, RequestType = (byte)PacketType.IdRequest }; MakePacketHeader(requestIdPacket); requestIdPacket.Data[0] = (byte)PacketType.IdRequest; UserToken.EnqueueSend(requestIdPacket); ReceiveId(); }
internal override void StartFileSend(string fileName, FileType fileType, byte[] fileData) { int fileSize = fileData.Length; int sourceOffset = 0; Packet fileInfoPacket = new Packet { PacketNumber = 0, RequestType = (byte)PacketType.FileInfo, FileType = (byte)fileType, MorePackets = true, ProcessId = Pid }; fileInfoPacket.DataSize = (uint)MakeFileDataInfo(fileInfoPacket, (uint)fileSize, fileName, UserToken.UserId); MakePacketHeader(fileInfoPacket); UserToken.EnqueueSend(fileInfoPacket); ushort packetNum = 1; while (sourceOffset < fileSize) { int copySize = PacketConsts.ReceiverBufferSize; Packet packet = new Packet { PacketNumber = packetNum, RequestType = (byte)PacketType.File, FileType = (byte)fileType, MorePackets = true, ProcessId = Pid }; packetNum += 1; if (copySize > fileSize - sourceOffset) { copySize = fileSize - sourceOffset; packet.MorePackets = false; } packet.DataSize = (uint)copySize; MakePacketHeader(packet); packet.Data = new byte[copySize]; Array.Copy(fileData, sourceOffset, packet.Data, 0, copySize); UserToken.EnqueueSend(packet); sourceOffset += copySize; } Packet replyPacket = DequeueProcessQueue(); if (replyPacket.RequestType == (byte)PacketType.Suspend) { EventCapsule terminateCapsule = new FileSaveCapsule(UserToken.UserId, Pid, NetworkEvent.FileSaveFailed, ErrorType.SocketClosed); EventQueue.Add(terminateCapsule); } if (replyPacket.RequestType == (byte)PacketType.FileSaveDone) { EventCapsule capsule = new FileSaveCapsule(UserToken.UserId, Pid, NetworkEvent.FileSaveDone, ErrorType.Success); EventQueue.Add(capsule); } if (replyPacket.RequestType == (byte)PacketType.Error) { EventCapsule capsule = new FileSaveCapsule(UserToken.UserId, Pid, NetworkEvent.FileSaveFailed, (ErrorType)replyPacket.Data[0]); EventQueue.Add(capsule); } TerminateProcess(this); }