internal static async Task <FeedbackThread> OpenFeedbackThreadAsync(HockeyClient client, string threadToken)
        {
            FeedbackThread retVal = null;

            _logger.Info("Try to get thread with ID={0}", new object[] { threadToken });

            var request = WebRequest.CreateHttp(new Uri(client.ApiBaseVersion2 + "apps/" + client.AppIdentifier + "/feedback/" + threadToken + ".json", UriKind.Absolute));

            request.Method = "Get";
            request.SetHeader(HttpRequestHeader.UserAgent.ToString(), client.UserAgentString);

            try
            {
                var response = await request.GetResponseAsync();

                var fbResp = await TaskEx.Run <FeedbackResponseSingle>(() => FeedbackResponseSingle.FromJson(response.GetResponseStream()));

                if (fbResp.Status.Equals("success"))
                {
                    retVal = fbResp.Feedback;
                }
                else
                {
                    throw new Exception("Server error. Server returned status " + fbResp.Status);
                }
            }
            catch (Exception e)
            {
                var webex = e as WebException;
                if (webex != null)
                {
                    if (webex.Response == null || String.IsNullOrWhiteSpace(webex.Response.ContentType))
                    {
                        //Connection error during call
                        throw webex;
                    }
                    else
                    {
                        //404 Response from server => thread got deleted
                        retVal = null;
                    }
                }
                else
                {
                    throw;
                }
            }
            return(retVal);
        }
        /// <summary>
        /// Posts the feedback message asynchronous.
        /// </summary>
        /// <param name="message">The message.</param>
        /// <param name="email">The email.</param>
        /// <param name="subject">The subject.</param>
        /// <param name="name">The name.</param>
        /// <param name="attachments">The attachments.</param>
        /// <returns></returns>
        /// <exception cref="System.Exception">Server error. Server returned status  + fbResp.Status</exception>
        public async Task <IFeedbackMessage> PostFeedbackMessageAsync(string message, string email = null, string subject = null, string name = null, IEnumerable <IFeedbackAttachment> attachments = null)
        {
            IHockeyClientInternal client = HockeyClient.Current.AsInternal();

            var msg = new FeedbackMessage();

            msg.Name    = client.UserID;
            msg.Text    = message;
            msg.Email   = email;
            msg.Name    = name;
            msg.Subject = subject;

            HttpWebRequest request = null;

            if (this.IsNewThread)
            {
                msg.Token      = this.Token;
                request        = WebRequest.CreateHttp(new Uri(client.ApiBaseVersion2 + "apps/" + client.AppIdentifier + "/feedback", UriKind.Absolute));
                request.Method = "Post";
            }
            else
            {
                request        = WebRequest.CreateHttp(new Uri(client.ApiBaseVersion2 + "apps/" + client.AppIdentifier + "/feedback/" + this.Token + "/", UriKind.Absolute));
                request.Method = "Put";
            }

            request.SetHeader(HttpRequestHeader.UserAgent.ToString(), client.UserAgentString);

            byte[] dataStream;

            if (attachments == null || !attachments.Any())
            {
                string data = msg.SerializeToWwwForm();
                dataStream          = Encoding.UTF8.GetBytes(data);
                request.ContentType = "application/x-www-form-urlencoded";
                request.SetHeader(HttpRequestHeader.ContentEncoding.ToString(), Encoding.UTF8.WebName.ToString());

                using (Stream stream = await request.GetRequestStreamAsync())
                {
                    stream.Write(dataStream, 0, dataStream.Length);
                    stream.Flush();
                }
            }
            else
            {
                string boundary      = "---------------------------" + DateTime.Now.Ticks.ToString("x");
                byte[] boundarybytes = System.Text.Encoding.UTF8.GetBytes("\r\n--" + boundary + "\r\n");

                request.ContentType = "multipart/form-data; boundary=" + boundary;
                using (Stream stream = await request.GetRequestStreamAsync())
                {
                    string formdataTemplate = "Content-Disposition: form-data; name=\"{0}\"\r\n\r\n{1}";

                    //write form fields
                    foreach (var keyValue in msg.MessagePartsDict)
                    {
                        stream.Write(boundarybytes, 0, boundarybytes.Length);
                        string formitem      = string.Format(formdataTemplate, keyValue.Key, keyValue.Value);
                        byte[] formitembytes = System.Text.Encoding.UTF8.GetBytes(formitem);
                        stream.Write(formitembytes, 0, formitembytes.Length);
                    }
                    //write images
                    for (int index = 0; index < attachments.Count(); index++)
                    {
                        var attachment = attachments.ElementAt(index);
                        stream.Write(boundarybytes, 0, boundarybytes.Length);
                        string headerTemplate = "Content-Disposition: form-data; name=\"{0}\"; filename=\"{1}\"\r\nContent-Type: {2}\r\n\r\n";
                        string header         = string.Format(headerTemplate, "attachment" + index, attachment.FileName, String.IsNullOrEmpty(attachment.ContentType) ? "application/octet-stream" : attachment.ContentType);
                        byte[] headerbytes    = System.Text.Encoding.UTF8.GetBytes(header);
                        stream.Write(headerbytes, 0, headerbytes.Length);
                        stream.Write(attachment.DataBytes, 0, attachment.DataBytes.Length);
                    }

                    byte[] trailer = System.Text.Encoding.UTF8.GetBytes("\r\n--" + boundary + "--\r\n");
                    stream.Write(trailer, 0, trailer.Length);
                    stream.Flush();
                }
            }

            var response = await request.GetResponseAsync();

            var fbResp = await TaskEx.Run <FeedbackResponseSingle>(() => FeedbackResponseSingle.FromJson(response.GetResponseStream()));

            if (!fbResp.Status.Equals("success"))
            {
                throw new Exception("Server error. Server returned status " + fbResp.Status);
            }

            IFeedbackMessage fbNewMessage = fbResp.Feedback.Messages.Last();

            if (fbNewMessage != null)
            {
                this.messages.Add(fbNewMessage as FeedbackMessage);
            }

            if (this.IsNewThread)
            {
                this.IsNewThread = false;
            }
            return(fbNewMessage);
        }
Exemplo n.º 3
0
 protected void PersistThreadMetaInfos(FeedbackResponseSingle fbResponse, string user, string email)
 {
     IsolatedStorageSettings settings = IsolatedStorageSettings.ApplicationSettings;
     settings.SetValue(Constants.FeedbackThreadKey, fbResponse.token);
     settings.SetValue(Constants.FeedbackThreadSubjectKey, fbResponse.feedback.messages.First().subject);
     settings.SetValue(Constants.FeedbackEmailKey, email);
     settings.SetValue(Constants.FeedbackUsernameKey, user);
     settings.Save();
 }