private void OnUploadProgress(object sender, UploadProgressEventArgs e)
        {
            Dispatcher.BeginInvoke(() => {
                if (e.SessionId != sessionId)
                    return;

                if (statusView == null)
                    return;

                statusView.ProgressView.Value = (float)e.UploadedBytes / (float)e.TotalBytes;
            });
        }
        private async Task<HttpWebResponse> UploadDataAsync(string sessionId, string fileName, Stream imageStream, Dictionary<string, string> parameters)
        {
            string boundary = "FLICKR_MIME_" + DateTime.Now.ToString("yyyyMMddhhmmss", System.Globalization.DateTimeFormatInfo.InvariantInfo);

            string authHeader = AnacondaCore.OAuthCalculateAuthHeader(parameters);
            byte[] dataBuffer = CreateUploadData(imageStream, fileName, parameters, boundary);

            HttpWebRequest req = (HttpWebRequest)HttpWebRequest.Create(new Uri("https://api.flickr.com/services/upload/"));
            req.Method = "POST";
            req.ContentType = "multipart/form-data; boundary=" + boundary;           
            if (!String.IsNullOrEmpty(authHeader))
            {
                req.Headers["Authorization"] = authHeader;
            }

            req.ContentLength = dataBuffer.Length;

            using (Stream reqStream = await req.GetRequestStreamAsync().ConfigureAwait(false))
            {
                int bufferSize = 32 * 1024;
                if (dataBuffer.Length / 100 > bufferSize) bufferSize = bufferSize * 2;

                int uploadedSoFar = 0;

                while (uploadedSoFar < dataBuffer.Length)
                {
                    reqStream.Write(dataBuffer, uploadedSoFar, Math.Min(bufferSize, dataBuffer.Length - uploadedSoFar));
                    uploadedSoFar += bufferSize;

                    if (PhotoUploadProgress != null)
                    {
                        UploadProgressEventArgs args = new UploadProgressEventArgs(sessionId, uploadedSoFar, dataBuffer.Length);
                        PhotoUploadProgress(this, args);
                    }
                }
                reqStream.Close();
            }

            // Invoke the API
            try
            {
                HttpWebResponse response = (HttpWebResponse)await req.GetResponseAsync().ConfigureAwait(false);
                return response;
            }
            catch (Exception e)
            {
                var we = e.InnerException as WebException;
                if (we != null)
                {
                    var resp = we.Response as HttpWebResponse;
                    var code = resp.StatusCode;
                    Debug.WriteLine("Status:{0}", we.Status);

                    return resp;
                }
                else
                    throw;
            }
        }