// 2017/6/16
        void m_loader_Prompt(object sender, MessagePromptEventArgs e)
        {
            MessagePromptEventHandler handler = this.Prompt;

            if (handler != null)
            {
                handler(sender, e);
            }
        }
Beispiel #2
0
        // static CancellationToken _token;

        // 探测 MD5 (用轮询任务法)
        // return:
        //      -1  出错
        //      0   文件没有找到
        //      1   文件找到
        public static int GetServerFileMD5ByTask(
            LibraryChannel channel,
            Stop stop,
            string strServerPath,
            MessagePromptEventHandler prompt,
            CancellationToken token,
            out byte[] md5,
            out string strError)
        {
            strError = "";
            md5      = null;

            // 对于 dp2Kernel 内的资源只能用以前的非 Task 方式
            if (strServerPath.StartsWith("!") == false)
            {
                return(GetServerFileMD5_old(
                           channel,
                           stop,
                           strServerPath,
                           out md5,
                           out strError));
            }

            /*
             * string strStyle = "md5";
             * string strMetadata = "";
             * byte[] baContent = null;
             * string strOutputPath = "";
             */

            TimeSpan old_timeout = channel.Timeout;

            channel.Timeout = TimeSpan.FromSeconds(10);
            try
            {
                // 检查 dp2library 版本号
REDO_GETVERSION:
                long lRet = channel.GetVersion(stop,
                                               out string version,
                                               out string uid,
                                               out strError);
                if (lRet == -1)
                {
                    if (prompt != null &&
                        !(stop != null && stop.IsStopped == true))
                    {
                        MessagePromptEventArgs e = new MessagePromptEventArgs();
                        e.MessageText = $"获得 dp2library 服务器 {channel.Url} 版本号时发生错误: {strError}";
                        e.Actions     = "yes,no,cancel";
                        prompt(null, e);
                        if (e.ResultAction == "yes")
                        {
                            goto REDO_GETVERSION;
                        }
                    }

                    strError = "检查 dp2library 服务器版本号时出错: " + strError;
                    return(-1);
                }

                string base_version = "3.23";
                if (StringUtil.CompareVersion(version, base_version) < 0)
                {
                    // strError = "获得服务器文件 MD5 的功能需要 dp2library 服务器版本为 {base_version} 以上";
                    // return -1;

                    // 改用旧功能
                    return(GetServerFileMD5_old(
                               channel,
                               stop,
                               strServerPath,
                               out md5,
                               out strError));
                }

                // TODO: 如果此请求出现通讯错误,再次重试请求的时候记得 removeTask 前一次的 task
                // 启动任务
                // return:
                //		strStyle	一般设置为"content,data,metadata,timestamp,outputpath";
                //		-1	出错。具体出错原因在this.ErrorCode中。this.ErrorInfo中有出错信息。
                //		0	成功
                lRet = channel.GetRes(
                    stop,
                    strServerPath,
                    0,
                    0,
                    "md5,beginTask",
                    out byte[] baContent,
                    out string strMetadata,
                    out string strOutputPath,
                    out md5,
                    out strError);
                if (lRet == -1)
                {
                    if (channel.ErrorCode == localhost.ErrorCode.NotFound)
                    {
                        return(0);
                    }

                    // TODO: 遇到通讯出错,需要重试操作



                    return(-1);
                }

                string taskID = Encoding.UTF8.GetString(md5);

                // 轮询,获得任务结果
                while (true)
                {
                    if (token.IsCancellationRequested)
                    {
                        strError = "前端请求中断";
                        return(-1);
                    }

                    if (stop != null && stop.IsStopped)
                    {
                        strError = "前端请求中断";
                        return(-1);
                    }

REDO_CHECKTASK:
                    lRet = channel.GetRes(
                        stop,
                        strServerPath,
                        0,
                        0,
                        $"md5,getTaskResult,taskID:{taskID}",
                        out baContent,
                        out strMetadata,
                        out strOutputPath,
                        out md5,
                        out strError);
                    // TODO: 如果遇到通讯出错,需要重试操作
                    if (lRet == -1)
                    {
                        if (prompt != null &&
                            !(stop != null && stop.IsStopped == true))
                        {
                            MessagePromptEventArgs e = new MessagePromptEventArgs();
                            e.MessageText = $"检查文件 {strServerPath} MD5 任务状态时发生错误: {strError}";
                            e.Actions     = "yes,no,cancel";
                            prompt(null, e);
                            if (e.ResultAction == "yes")
                            {
                                goto REDO_CHECKTASK;
                            }
                        }

                        return(-1);
                    }
                    if (lRet == 1)
                    {
                        return(1);
                    }

                    Task.Delay(TimeSpan.FromSeconds(1), token).Wait();
                }
            }
            catch (Exception ex)
            {
                strError = "GetServerFileMD5ByTask() 出现异常: " + ex.Message;
                return(-1);
            }
            finally
            {
                channel.Timeout = old_timeout;
            }
        }