예제 #1
0
        private async Task ProcessFileReqAck(ReqAck mFileReqAck, Metadata mMetadata)
        {
            //see if received accepted the file transmition request
            bool        acceptedReq = mFileReqAck.AcceptedFile;
            FileSentReq fileSendReq = GetSendFileReqFromMeta(mMetadata);

            if (!acceptedReq)
            {
                //didn't accept request
                sendFileRequests.Remove(fileSendReq);
                return;
            }

            //start sending the file parts
            foreach (FileTransReq fileTrans in fileSendReq.FileTransReqs)
            {
                //for each file
                while (fileSendReq.FileHasMoreParts(fileTrans))
                {
                    //send all its parts
                    FilePartObj filePart = await fileSendReq.GetNextFilePart(fileTrans);

                    await ObjectManager.SendAsyncTCP(fileSendReq.targetIpAddress, filePart);

                    //send update event
                    FileProgUpdate?.Invoke(this, new FileTransferEventArgs(fileTrans, TransDirrection.sending));
                }
            }
        }
예제 #2
0
        private bool ValidFilePart(FilePartObj filePart)
        {
            if (filePart == null)
            {
                return(false);
            }

            //TODO
            return(true);
        }
예제 #3
0
        public async Task WriteFilePartToFile(FilePartObj receivedFilePart)
        {
            FileTransReq fileTrans = GetFileTransReqFromFileMeta(receivedFilePart.FileMetadata);

            //validate packet recieved
            bool isValid = ValidFilePart(receivedFilePart);

            if (!isValid)
            {
                throw new FileTransitionError("file part received is not valided for this peer.");
            }

            //valid file part
            byte[] buffer = receivedFilePart.FileData;
            await fileTrans.WriteBytes(buffer);
        }
예제 #4
0
        //called when a file part is received
        private async Task ProcessFilePart(FilePartObj filePart, Metadata metadata)
        {
            //check if file part is valid
            if (filePart == null)
            {
                throw new Exception("filePart has not been set.");
            }

            //find file recieve request
            FileReceiveReq fileReceived = GetReceivedFileReqFromMeta(metadata);
            FileTransReq   fileTrans    = fileReceived.GetFileTransReqFromFileMeta(filePart.FileMetadata);

            //dump file data to disk
            await fileReceived.WriteFilePartToFile(filePart);

            //log incoming file
            FileProgUpdate?.Invoke(this, new FileTransferEventArgs(fileTrans, TransDirrection.receiving));
        }
예제 #5
0
        public async Task <FilePartObj> GetNextFilePart(FileTransReq mCurFileTrans)
        {
            //set buffer lengths
            int bufferLen = (int)Math.Min(mCurFileTrans.FileDetails.FileSize - mCurFileTrans.BytesProcessed, this.bufferSize);

            if (bufferLen <= 0)
            {
                //nothing more to be sent
                return(null);
            }
            FileMeta fileMetadata = mCurFileTrans.FileDetails;

            byte[] fileData = await mCurFileTrans.ReadBytes(bufferLen);


            //populate File part object
            FilePartObj filePart = new FilePartObj(fileMetadata, fileData, mCurFileTrans.curFilePartNum, mCurFileTrans.TotalPartNum);

            return(filePart);
        }
예제 #6
0
        private async void ObjManager_objReceived(object sender, ObjReceivedEventArgs e)
        {
            BObject  bObj     = e.Obj;
            Metadata metadata = bObj.GetMetadata();

            ObjReceived?.Invoke(this, e);

            string objType = bObj.GetType();

            switch (objType)
            {
            case "FilePartObj":
                FilePartObj filePart = e.Obj.GetObject <FilePartObj>();
                await ProcessFilePart(filePart, metadata);

                break;

            /*
             * case "FileAck":
             * FileAck ackMsg = e.Obj.GetObject<FileAck>();
             * await ProcessAckMessage(ackMsg, metadata);
             * break;
             */
            case "FileReqMeta":
                FileReqMeta fileRequestMetadata = e.Obj.GetObject <FileReqMeta>();
                await ProcessIncomingFilesRequest(fileRequestMetadata, metadata);

                break;

            case "ReqAck":
                ReqAck fileReqAck = e.Obj.GetObject <ReqAck>();
                await ProcessFileReqAck(fileReqAck, metadata);

                break;

            default:
                break;
            }
        }