static (FileStream fs, DownloadResult res, string url) GetLocalFile(RemoteFileType remoteFileType, string remoteFile) { string localFile = ""; switch (remoteFileType) { case RemoteFileType.Package: localFile = Information.WorkPath.Enter("cache").Enter("download").Enter(remoteFile + ".zip").Path; break; case RemoteFileType.PackageInfo: localFile = Information.WorkPath.Enter("cache").Enter("dependency").Enter(remoteFile + ".json").Path; break; case RemoteFileType.PackageDatabase: localFile = Information.WorkPath.Enter("package.db").Path; break; default: localFile = Information.WorkPath.Enter("package.db").Path; break; } if (File.Exists(localFile) /*&& remoteFileType != RemoteFileType.Package*/) { return(null, DownloadResult.ExistedLocalFile, localFile); } try { var file = new FileStream(localFile, FileMode.Create, FileAccess.Write); return(file, DownloadResult.OK, localFile); } catch (Exception) { return(null, DownloadResult.LocalFileOperationError, localFile); } }
//real function static DownloadResult PreDownload(RemoteFileType remoteFileType, string remoteFile) { var res1 = GetLocalFile(remoteFileType, remoteFile); if (res1.res != DownloadResult.OK) { return(res1.res); } var cache = RealDownload(remoteFileType, remoteFile, res1.fs); if (cache != DownloadResult.OK) { res1.fs.Close(); res1.fs.Dispose(); File.Delete(res1.url); } Console.Write("\n"); return(cache); }
static DownloadResult RealDownload(RemoteFileType remoteFileType, string remoteFile, FileStream fs) { //var res1 = GetLocalFile(RemoteFileType.Package, remoteFile); //if (res1.res != DownloadResult.OK) return res1.res; var remote = GetHostAndPort(); var res2 = GetClient(remote.host, remote.port); if (res2.result != DownloadResult.OK) { return(res2.result); } var rnd = new Random(); var verificationCode = rnd.Next(); try { //send //Package /* * DATA * * Sign code | Transport version | Verification Code | Need resources type | Package name length | Package name */ //PackageDatabase /* * DATA * * Sign code | Transport version | Verification Code | Need resources type */ res2.ns.Write(BitConverter.GetBytes(Transport.SIGN), 0, 4); res2.ns.Write(BitConverter.GetBytes(Transport.TRANSPORT_VER), 0, 4); res2.ns.Write(BitConverter.GetBytes(verificationCode), 0, 4); res2.ns.Write(BitConverter.GetBytes((int)remoteFileType), 0, 4); if (remoteFileType != RemoteFileType.PackageDatabase) { var data = Encoding.UTF8.GetBytes(remoteFile); res2.ns.Write(BitConverter.GetBytes(data.Length), 0, 4); res2.ns.Write(data, 0, data.Length); } //receive /* * DATA * * PackageDatabase * * Version is ok? | Verification Code | Package is existed? | Package Count | Sign is existed? | Sign * * Package * * Version is ok? | Verification Code | Package is existed? | Package Count * * PACKAGE * * Package Size | Data */ var recData = new byte[1]; res2.ns.Read(recData, 0, 1); if (!BitConverter.ToBoolean(recData, 0)) { return(DownloadResult.OutdatedVersion); } recData = new byte[4]; res2.ns.Read(recData, 0, 4); if (BitConverter.ToInt32(recData, 0) != verificationCode) { return(DownloadResult.VerificationError); } recData = new byte[1]; res2.ns.Read(recData, 0, 1); if (!BitConverter.ToBoolean(recData, 0)) { return(DownloadResult.NoPackage); } recData = new byte[4]; res2.ns.Read(recData, 0, 4); var packageCount = BitConverter.ToInt32(recData, 0); var consoleProgress = new DownloadDisplay(packageCount); int packageSize = Transport.SEGMENT_LENGTH; /* * ---------------Send: * * REQUEST: * * Segment index (based on 1)(Send 0 to cut wire) * * ---------------Receive: * * PACKAGE * * Package Size | Data */ byte[] netbuffer = new byte[1024]; int readBytes = 0; for (int i = 0; i < packageCount; i++) { readBytes = 0; //order data res2.ns.Write(BitConverter.GetBytes(i + 1), 0, 4); //read length var circleCount = 0; while (true) { if (circleCount >= READ_TIMEOUT) { throw new SocketException(); } if (!res2.ns.DataAvailable) { circleCount++; System.Threading.Thread.Sleep(READ_INTERVAL); } else { break; } } res2.ns.Read(recData, 0, 4); packageSize = BitConverter.ToInt32(recData, 0); //read body circleCount = 0; while (readBytes < packageSize) { while (true) { if (circleCount >= READ_TIMEOUT) { throw new SocketException(); } if (!res2.ns.DataAvailable) { circleCount++; System.Threading.Thread.Sleep(READ_INTERVAL); } else { break; } } var readedSize = res2.ns.Read(netbuffer, 0, 1024); fs.Write(netbuffer, 0, readedSize); readBytes += readedSize; } consoleProgress.Next(); } res2.ns.Write(BitConverter.GetBytes(0), 0, 4); } catch (Exception) { return(DownloadResult.RemoteServerError); } fs.Close(); res2.ns.Close(); return(DownloadResult.OK); }