/// <summary> /// Sends a request to stop a file transfer. /// </summary> private void CancelRequestFileFromServer() { if (FileStreamStatus == FileStreamerStatusEnum.Downloading) { FileRequestPacket packet = new FileRequestPacket { FileRequestType = FileRequestTypeEnum.CancelFileRequest }; FileStreamStatus = FileStreamerStatusEnum.Stopped; WinterEngineService.NetworkClient.SendPacket(packet, NetDeliveryMethod.ReliableSequenced); // Remove partially downloaded file, if it exists. string filePath = DirectoryPaths.ContentPackageDirectoryPath + LastReceivedFile; if (File.Exists(filePath)) { File.Delete(filePath); } FileSize = 0; LastReceivedFile = ""; MissingFiles.Clear(); } }
/// <summary> /// Sends a request to start initiating a specific file's data transfer /// </summary> /// <param name="fileName"></param> private void RequestFileFromServer(string fileName) { FileStreamStatus = FileStreamerStatusEnum.Downloading; FileRequestPacket packet = new FileRequestPacket { FileRequestType = FileRequestTypeEnum.StartFileRequest, FileName = fileName }; WinterEngineService.NetworkClient.SendPacket(packet, NetDeliveryMethod.ReliableSequenced); }
/// <summary> /// Processes a packet containing a list of content package files. /// Files which are not on the client's machine will be added to a list to be downloaded. /// The first file in this list is requested at the end of this method call. /// </summary> /// <param name="packet"></param> private void ProcessContentPackageListPacket(ContentPackageListPacket packet) { if (packet.FileNames != null) { foreach (string fileName in packet.FileNames) { string filePath = DirectoryPaths.ContentPackageDirectoryPath + fileName; if (!File.Exists(filePath)) { MissingFiles.Add(fileName); } } } if (MissingFiles.Count > 0) { RequestFileFromServer(MissingFiles[0]); } else { FileStreamStatus = FileStreamerStatusEnum.Complete; } }
/// <summary> /// Processes a streaming file packet, building a file as bytes are received. /// Files received must be content packages for security reasons. /// </summary> /// <param name="packet"></param> private void ProcessStreamingFilePacket(StreamingFilePacket packet) { if (Path.GetExtension(packet.FileName) == FileExtensionFactory.GetFileExtension(FileTypeEnum.ContentPackage) && FileStreamStatus == FileStreamerStatusEnum.Downloading) { string filePath = DirectoryPaths.ContentPackageDirectoryPath + packet.FileName; if (!File.Exists(filePath)) { File.Create(filePath).Close(); } LastReceivedFile = packet.FileName; using (FileStream fileStream = new FileStream(filePath, FileMode.Append)) { fileStream.Write(packet.FileBytes, 0, (int)packet.FileBytes.Length); } // If this is the end of the file, we need to remove it from the list // and request the next file from the server. if (packet.IsEndOfFile) { MissingFiles.Remove(packet.FileName); if (MissingFiles.Count > 0) { FileStreamStatus = FileStreamerStatusEnum.Stopped; RequestFileFromServer(MissingFiles[0]); } else { FileStreamStatus = FileStreamerStatusEnum.Complete; } } } }