예제 #1
0
        public string Download(string fileURL, string filePath, string msgId = "")
        {
            if (string.IsNullOrWhiteSpace(msgId))
            {
                msgId = TimeStamp.Create();
            }
            FileMessageInfo info = FileMessageInfo.Create(fileURL);

            info.MessageId   = msgId;
            info.ProcessType = FileProcessType.DOWNLOAD;
            info.FilePath    = filePath;
            info.Status      = 1;
            info.Client.DownloadProgressChanged += webClient_DownloadProgressChanged;
            info.Client.DownloadFileCompleted   += Client_DownloadFileCompleted;
            new TaskFactory().StartNew(() =>
            {
                try
                {
                    info.Client.DownloadFileAsync(new Uri(fileURL), filePath, info);
                }
                catch (Exception ex)
                {
                    ProcessError(msgId, ex);
                }
            });
            m_FileMsgQueue.Add(info);
            return(msgId);
        }
예제 #2
0
        /// <summary>
        /// 断点下载,需服务器支持CustomRange
        /// </summary>
        /// <param name="fileURL"></param>
        /// <param name="filePath"></param>
        /// <param name="msgId"></param>
        /// <returns></returns>
        private string Download_BreakPoint(string fileURL, string filePath, string msgId = "")
        {
            if (string.IsNullOrWhiteSpace(msgId))
            {
                msgId = TimeStamp.Create();
            }
            long currentLength = 0;

            if (File.Exists(filePath))
            {
                var fileInfo = new FileInfo(filePath);
                currentLength = fileInfo.Length;
            }
            FileMessageInfo info = FileMessageInfo.Create(fileURL);

            info.Client.Headers.Add("CustomRange", string.Format("bytes={0}-", currentLength));
            info.MessageId   = msgId;
            info.FilePath    = filePath;
            info.ProcessType = FileProcessType.DOWNLOAD;
            info.Status      = 1;
            m_FileMsgQueue.Add(info);
            info.Client.DownloadDataCompleted   += Client_DownloadDataCompleted;
            info.Client.DownloadProgressChanged += webClient_DownloadProgressChanged;
            new TaskFactory().StartNew(() =>
            {
                info.Client.DownloadDataAsync(new Uri(fileURL), info);
            });
            return(msgId);
        }
예제 #3
0
        public void Upload(string msg_id, string upload_url, string path)
        {
            FileMessageInfo info = FileMessageInfo.Create(upload_url);

            info.MessageId   = msg_id;
            info.ProcessType = FileProcessType.UPLOAD;
            info.Client.UploadProgressChanged += UploadProgressChanged;
            info.Client.UploadDataCompleted   += UploadDataCompleted;
            info.Status   = 1;
            info.FilePath = path;
            m_FileMsgQueue.Add(info);

            var    createBytes = new CreateBytes();
            string contentType = createBytes.ContentType;

            info.Client.Headers.Add("Content-Type", contentType);
            //new TaskFactory().StartNew(() =>
            //{

            //});

            new TaskFactory().StartNew(() =>
            {
                // LogOpInfo("upload_begin" ,Thread.CurrentThread.ManagedThreadId.ToString());
                try
                {
                    int leftLength       = (int)GetUploadStartPos(upload_url);
                    byte[] fileData      = File.ReadAllBytes(path).Skip(leftLength).ToArray();
                    info.StartPos        = leftLength;
                    ArrayList bytesArray = new ArrayList();
                    bytesArray.Add(createBytes.CreateFieldData("file", Path.GetFileName(path)
                                                               , "application/octet-stream", fileData));
                    byte[] postData      = createBytes.JoinBytes(bytesArray);
                    info.TotalFileLength = postData.Length + leftLength;
                    info.Client.UploadDataAsync(new Uri(upload_url), "POST", postData, info);

                    //LogOpInfo("upload_end", Thread.CurrentThread.ManagedThreadId.ToString());
                }
                catch (Exception ex)
                {
                    ProcessError(msg_id, ex);
                }
            });
        }
예제 #4
0
        public void Deserialize(Stream input)
        {
            var header = input.ReadStructure <FileHeader>();

            if (header.Version != 7)
            {
                throw new FormatException("version");
            }

            if (header.EndOfFile != input.Length)
            {
                throw new FormatException();
            }

            if (header.Magic != 0x3147534D)
            {
                throw new FormatException();
            }

            if (header.Unknown0C != 0)
            {
                throw new FormatException();
            }

            if (header.EndOfData + header.ExtraSize != input.Length)
            {
                throw new FormatException();
            }

            var messageInfos = new FileMessageInfo[header.MessageCount];

            for (int i = 0; i < messageInfos.Length; i++)
            {
                messageInfos[i] = input.ReadStructure <FileMessageInfo>();
            }

            var stringTableInfo = input.ReadStructure <FileBlockInfo>();
            var unknownInfo     = input.ReadStructure <FileBlockInfo>();

            if (unknownInfo.Offset != 0 ||
                unknownInfo.Count != 0)
            {
                throw new FormatException();
            }

            this.Messages = new List <Message>();
            foreach (var messageInfo in messageInfos)
            {
                input.Seek(0x20 + messageInfo.Offset, SeekOrigin.Begin);

                switch (messageInfo.Type)
                {
                case 0:
                {
                    string name      = input.ReadString(24, true, Encoding.ASCII);
                    short  pageCount = input.ReadValueS16();
                    short  unknown   = input.ReadValueS16();

                    uint[] pageOffsets = new uint[pageCount];
                    for (int i = 0; i < pageOffsets.Length; i++)
                    {
                        pageOffsets[i] = input.ReadValueU32();
                    }

                    uint size = input.ReadValueU32();

                    for (int i = 0; i < pageOffsets.Length; i++)
                    {
                        pageOffsets[i] -= (uint)input.Position;
                    }

                    var memory = input.ReadToMemoryStream(size);

                    var dialogue = new Dialogue();
                    dialogue.Name    = name;
                    dialogue.Unknown = unknown;
                    dialogue.PageOffsets.AddRange(pageOffsets);
                    dialogue.Data = memory;

                    this.Messages.Add(dialogue);

                    break;
                }

                case 1:
                {
                    string name        = input.ReadString(24, true, Encoding.ASCII);
                    short  unknown     = input.ReadValueS16();
                    short  choiceCount = input.ReadValueS16();
                    uint   unknown2    = input.ReadValueU32();

                    if (unknown != 0)
                    {
                        throw new FormatException();
                    }

                    uint[] choiceOffsets = new uint[choiceCount];
                    for (int i = 0; i < choiceOffsets.Length; i++)
                    {
                        choiceOffsets[i] = input.ReadValueU32();
                    }

                    uint size = input.ReadValueU32();

                    for (int i = 0; i < choiceOffsets.Length; i++)
                    {
                        choiceOffsets[i] -= (uint)input.Position;
                    }

                    var memory = input.ReadToMemoryStream(size);

                    var dialogue = new Choices();
                    dialogue.Name = name;
                    dialogue.ChoiceOffsets.AddRange(choiceOffsets);
                    dialogue.Data = memory;

                    this.Messages.Add(dialogue);

                    break;
                }

                default:
                {
                    throw new FormatException();
                }
                }
            }

            input.Seek(0x20 + stringTableInfo.Offset, SeekOrigin.Begin);
            uint[] stringOffsets = new uint[stringTableInfo.Count];
            for (int i = 0; i < stringOffsets.Length; i++)
            {
                stringOffsets[i] = input.ReadValueU32();
            }

            this.Strings = new List <string>(stringOffsets.Length);
            for (int i = 0; i < stringOffsets.Length; i++)
            {
                input.Seek(0x20 + stringOffsets[i], SeekOrigin.Begin);

                /* this really should read the string as an
                 * array of bytes but for now, since it's not really
                 * ASCII, but I'm lazy and it's not necessary to
                 * retain it at the moment */
                //this.Strings.Add(input.ReadStringASCIIZ());
                this.Strings.Add(input.ReadStringGameZ());
            }
        }