Exemplo n.º 1
0
        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);
            }
        }
Exemplo n.º 2
0
        //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);
        }
Exemplo n.º 3
0
        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);
        }