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)); } } }
private bool ValidFilePart(FilePartObj filePart) { if (filePart == null) { return(false); } //TODO return(true); }
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); }
//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)); }
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); }
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; } }