/// <summary>
 /// 构造
 /// </summary>
 /// <param name="requestUrl">API请求的URL</param>
 /// <param name="error">API调用失败的错误信息</param>
 public FileSyncRequestResultEventArgs(Uri requestUrl, FileSyncAPIRequestResult result, FileSyncError error)
 {
     RequestUrl = requestUrl;
     Result = result;
     Error = error;
     Response = null;
 }
        private void AuthorizeFinish(object obj, FileSyncRequestResultEventArgs arg)
        {
            switch (arg.Result)
            {
                case FileSyncAPIRequestResult.Success:

                    try
                    {
                        FileSyncAuthorizeInfo authInfo = new FileSyncAuthorizeInfo();

                        string xml = arg.Response;

                        XmlDocument xd = new XmlDocument();
                        xd.LoadXml(xml);

                        authInfo.AuthSid = xd.SelectSingleNode("/QDocRoot/authSid").InnerText;
                        authInfo.UserName = xd.SelectSingleNode("/QDocRoot/username").InnerText;

                        FileSync.CurrentUser.SaveUserSessionInfo(authInfo);

                        if (tempCallback != null)
                        {
                            tempCallback(this, arg);
                        }
                    }
                    catch (Exception ex)
                    {
                        if (tempCallback != null)
                        {
                            FileSyncError error = new FileSyncError();
                            error.error_code = requestErrorDomain;
                            error.error_msg = "An error occurs when parse server response." + ex.Message;

                            tempCallback(this, new FileSyncRequestResultEventArgs(null, FileSyncAPIRequestResult.Fail, error));
                        }
                    }

                    break;
                case FileSyncAPIRequestResult.Fail:
                    if (tempCallback != null)
                    {
                        tempCallback(this, arg);
                    }
                    break;
                default:
                    break;
            }
        }
        /// <summary>
        /// 发起API请求
        /// </summary>
        /// <param name="requestUrl">API请求的url,必须是https的</param>
        /// <param name="httpMethod">API的请求方式</param>
        /// <param name="requestParams">API的请求参数</param>
        public void APIRequest(string requestUrl, string httpMethod, Dictionary<string, object> requestParams)
        {
            if (requestUrl == null || requestUrl == "" /*|| !requestUrl.StartsWith("https")*/)
            {
                FileSyncError error = new FileSyncError();
                error.error_code = requestErrorDomain;
                error.error_msg = "Request url is wrong.";

                if (DownloadStringCompleted != null)
                {
                    DownloadStringCompleted(this, new FileSyncRequestResultEventArgs(null, FileSyncAPIRequestResult.Fail, error));
                }

                return;
            }

            if (requestParams == null)
            {
                requestParams = new Dictionary<string, object>();
            }

            if (!requestParams.ContainsKey("sid"))
            {
                requestParams.Add("sid", FileSync.CurrentUser.SessionID);
            }

            FileSyncAPIRequestFileParam fileParam = IsUploadFile(requestParams);
            if (fileParam != null)
            {
                requestParams.Remove(fileParam.FileKey);
                AsyncRequestAPIWithFile(requestUrl, httpMethod, requestParams, fileParam);
            }
            else
            {
                AsyncRequestAPI(requestUrl, httpMethod, requestParams);
            }
        }
 /// <summary>
 /// 构造
 /// </summary>
 /// <param name="result">授权结果</param>
 /// <param name="error">授权失败的错误信息</param>
 public FileSyncLoginResultEventArgs(FileSyncUserLoginResult result, FileSyncError error)
 {
     Result = result;
     Error = error;
 }
        /// <summary>
        /// 请求上传图片API接口
        /// </summary>
        /// <param name="requestUri">API请求的uri</param>
        /// <param name="httpMethod">API的请求方式</param>
        /// <param name="requestParams">API的请求参数</param>
        /// <param name="imageParam">图片参数</param>
        private void AsyncRequestAPIWithFile(string requestUri, string httpMethod, Dictionary<string, object> requestParams, FileSyncAPIRequestFileParam fileParam)
        {
            HttpWebRequest request = null;
            FileSyncAPIRequestState state = new FileSyncAPIRequestState();
            try
            {
                requestUri = FileSyncUtility.AddParametersToURL(requestUri, requestParams);
                request = (HttpWebRequest)WebRequest.Create(new Uri(requestUri));

                boundary = "----------" + DateTime.Now.Ticks.ToString("x");

                byte[] beginBoundary = Encoding.UTF8.GetBytes(string.Format("--{0}\r\n", boundary));

                string fileTemplate = "Content-Disposition: form-data; name=\"file\"; filename=\"{0}\"\r\nContent-Type: application/octet-stream\r\n\r\n";
                byte[] bfile = Encoding.UTF8.GetBytes(String.Format(fileTemplate, fileParam.FileKey));

                byte[] endBoundary = Encoding.UTF8.GetBytes("\r\n--" + boundary + "--\r\n");

                request.Method = httpMethod;
                request.ContentType = "multipart/form-data; boundary=" + boundary;
                request.ContentLength = beginBoundary.Length + bfile.Length + fileParam.FileData.Length + endBoundary.Length;
                request.AllowWriteStreamBuffering = false;
                request.Timeout = 300000;

                state.request = request;
                state.requestParams = requestParams;
                state.fileParam = fileParam;
                state.beginBoundary = beginBoundary;
                state.bfile = bfile;
                state.endBoundary = endBoundary;

                request.BeginGetRequestStream(new AsyncCallback(RequestReadyWithFile), state);
            }
            catch (Exception ex)
            {
                if (DownloadStringCompleted != null)
                {
                    FileSyncError error = new FileSyncError();
                    error.error_code = requestErrorDomain;
                    error.error_msg = "A Error Occurred While Creating HTTP Web Request. " + ex.Message;
                    //System.Windows.Deployment.Current.Dispatcher.BeginInvoke(delegate()
                    // {
                    if (DownloadStringCompleted != null)
                    {
                        DownloadStringCompleted(this, new FileSyncRequestResultEventArgs(request == null ? null : request.Address, FileSyncAPIRequestResult.Fail, error) { RequestParams = requestParams });
                    }
                    // });
                }
            }
        }
        /// <summary>
        /// 处理API请求返回的信息
        /// </summary>
        /// <param name="asyncResult">异步请求返回的结果</param>
        void ResponseReady(IAsyncResult asyncResult)
        {
            FileSyncAPIRequestState state = asyncResult.AsyncState as FileSyncAPIRequestState;
            HttpWebRequest request = state.request;
            HttpWebResponse response = null;

            try
            {
                response = (HttpWebResponse)request.EndGetResponse(asyncResult);

                string result = string.Empty;
                using (Stream responseStream = response.GetResponseStream())
                {
                    using (StreamReader reader = new StreamReader(responseStream))
                    {
                        result = reader.ReadToEnd();
                    }
                }

                if (DownloadStringCompleted != null)
                {
                    DownloadStringCompleted(this, new FileSyncRequestResultEventArgs(request == null ? null : request.Address, FileSyncAPIRequestResult.Success, result) { RequestParams = state.requestParams });
                }
            }
            catch (Exception ex)
            {
                if (DownloadStringCompleted != null)
                {
                    FileSyncError error = new FileSyncError();
                    error.error_code = requestErrorDomain;
                    error.error_msg = "No response." + ex.Message;

                    if (DownloadStringCompleted != null)
                    {
                        DownloadStringCompleted(this, new FileSyncRequestResultEventArgs(request == null ? null : request.Address, FileSyncAPIRequestResult.Fail, error) { RequestParams = state.requestParams });
                    }
                }
            }
        }
        /// <summary>
        /// 请求普通API接口
        /// </summary>
        /// <param name="requestUri">API请求的uri</param>
        /// <param name="httpMethod">API的请求方式</param>
        /// <param name="requestParams">API的请求参数</param>
        private void AsyncRequestAPI(string requestUri, string httpMethod, Dictionary<string, object> requestParams)
        {
            HttpWebRequest request = null;
            try
            {
                // POST
                if (httpMethod == "POST")
                {
                    requestUri = FileSyncUtility.AddParametersToURL(requestUri, requestParams);
                    FileSyncAPIRequestState state = new FileSyncAPIRequestState();
                    request = (HttpWebRequest)WebRequest.Create(requestUri);
                    request.Method = httpMethod;
                    request.ContentType = "application/x-www-form-urlencoded;charset=utf-8";
                    //平台统计用
                    request.UserAgent = "FileSync Windows SDK " + FileSync.Config.SDKVersion + "(windows; " + Environment.OSVersion.Platform + ")";
                    state.request = request;
                    state.requestParams = requestParams;

                    request.BeginGetRequestStream(new AsyncCallback(RequestReady), state);
                }
                else if (httpMethod == "GET")
                {
                    requestUri = FileSyncUtility.AddParametersToURL(requestUri, requestParams);
                    request = (HttpWebRequest)WebRequest.Create(requestUri);
                    request.Method = httpMethod;

                    FileSyncAPIRequestState state = new FileSyncAPIRequestState();
                    state.request = request;
                    state.requestParams = requestParams;

                    request.BeginGetResponse(ResponseReady, state);
                }
            }
            catch
            {
                if (DownloadStringCompleted != null)
                {
                    FileSyncError error = new FileSyncError();
                    error.error_code = requestErrorDomain;
                    error.error_msg = "A Error Occurred While Creating HTTP Web Request.";
                    if (DownloadStringCompleted != null)
                    {
                        DownloadStringCompleted(this, new FileSyncRequestResultEventArgs(request == null ? null : request.Address, FileSyncAPIRequestResult.Fail, error));
                    }
                }
            }
        }