Beispiel #1
0
        /*
         * 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
        }
Beispiel #2
0
        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();
        }
Beispiel #3
0
        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);
        }