bool FNetworkFileServerClientConnection::ProcessPayload(FArchive& Ar) { FBufferArchive Out; bool Result = true; // first part of the payload is always the command uint32 Cmd; Ar << Cmd; UE_LOG(LogFileServer, Verbose, TEXT("Processing payload with Cmd %d"), Cmd); // what type of message is this? NFS_Messages::Type Msg = NFS_Messages::Type(Cmd); // make sure the first thing is GetFileList which initializes the game/platform checkf(Msg == NFS_Messages::GetFileList || Msg == NFS_Messages::Heartbeat || Sandbox != NULL, TEXT("The first client message MUST be GetFileList, not %d"), (int32)Msg); // process the message! bool bSendUnsolicitedFiles = false; { FScopeLock SocketLock(&SocketCriticalSection); switch (Msg) { case NFS_Messages::OpenRead: ProcessOpenFile(Ar, Out, false); break; case NFS_Messages::OpenWrite: ProcessOpenFile(Ar, Out, true); break; case NFS_Messages::Read: ProcessReadFile(Ar, Out); break; case NFS_Messages::Write: ProcessWriteFile(Ar, Out); break; case NFS_Messages::Seek: ProcessSeekFile(Ar, Out); break; case NFS_Messages::Close: ProcessCloseFile(Ar, Out); break; case NFS_Messages::MoveFile: ProcessMoveFile(Ar, Out); break; case NFS_Messages::DeleteFile: ProcessDeleteFile(Ar, Out); break; case NFS_Messages::GetFileInfo: ProcessGetFileInfo(Ar, Out); break; case NFS_Messages::CopyFile: ProcessCopyFile(Ar, Out); break; case NFS_Messages::SetTimeStamp: ProcessSetTimeStamp(Ar, Out); break; case NFS_Messages::SetReadOnly: ProcessSetReadOnly(Ar, Out); break; case NFS_Messages::CreateDirectory: ProcessCreateDirectory(Ar, Out); break; case NFS_Messages::DeleteDirectory: ProcessDeleteDirectory(Ar, Out); break; case NFS_Messages::DeleteDirectoryRecursively: ProcessDeleteDirectoryRecursively(Ar, Out); break; case NFS_Messages::ToAbsolutePathForRead: ProcessToAbsolutePathForRead(Ar, Out); break; case NFS_Messages::ToAbsolutePathForWrite: ProcessToAbsolutePathForWrite(Ar, Out); break; case NFS_Messages::ReportLocalFiles: ProcessReportLocalFiles(Ar, Out); break; case NFS_Messages::GetFileList: Result = ProcessGetFileList(Ar, Out); break; case NFS_Messages::Heartbeat: ProcessHeartbeat(Ar, Out); break; case NFS_Messages::SyncFile: ProcessSyncFile(Ar, Out); bSendUnsolicitedFiles = true; break; case NFS_Messages::RecompileShaders: ProcessRecompileShaders(Ar, Out); break; default: UE_LOG(LogFileServer, Error, TEXT("Bad incomming message tag (%d)."), (int32)Msg); } } // send back a reply if the command wrote anything back out if (Out.Num() && Result ) { int32 NumUnsolictedFiles = UnsolictedFiles.Num(); if (bSendUnsolicitedFiles) { Out << NumUnsolictedFiles; } UE_LOG(LogFileServer, Verbose, TEXT("Returning payload with %d bytes"), Out.Num()); // send back a reply Result &= SendPayload( Out ); if (bSendUnsolicitedFiles && Result ) { for (int32 Index = 0; Index < NumUnsolictedFiles; Index++) { FBufferArchive OutUnsolicitedFile; PackageFile(UnsolictedFiles[Index], OutUnsolicitedFile); UE_LOG(LogFileServer, Display, TEXT("Returning unsolicited file %s with %d bytes"), *UnsolictedFiles[Index], OutUnsolicitedFile.Num()); Result &= SendPayload(OutUnsolicitedFile); } UnsolictedFiles.Empty(); } } UE_LOG(LogFileServer, Verbose, TEXT("Done Processing payload with Cmd %d Total Size sending %d "), Cmd,Out.TotalSize()); return Result; }