using System; using System.Collections.Generic; using System.Text; using System.IO; using System.Net; using FastReport.Export; using FastReport.Cloud.OAuth; using FastReport.Utils; namespace FastReport.Cloud.StorageClient.FastCloud { /// /// FastCloud storage client. /// public class FastCloudStorageClient : CloudStorageClient { #region Constants private const string HOST = "https://cloud.fast-report.com"; #endregion // Constants #region Fields private string accessToken; private string reportUrl; #endregion // Fields #region Properties /// /// Gets or sets the access token. /// public string AccessToken { get { return accessToken; } set { accessToken = value; } } /// /// Gets the report URL that can be used to download report from cloud. /// public string ReportUrl { get { return reportUrl; } } #endregion // Properties #region Constructors /// /// Initializes a new instance of the class. /// public FastCloudStorageClient() : base() { accessToken = ""; reportUrl = ""; } #endregion // Constructors #region Private Methods private byte[] BuildGetAccessTokenRequestContent(string email, string password) { Dictionary data = new Dictionary(); data.Add("email", email); data.Add("password", password); return Encoding.UTF8.GetBytes(HttpUtils.UrlDataEncode(data)); } #endregion // Private Methods #region Protected Methods /// protected override void SaveMemoryStream(MemoryStream ms) { try { System.Net.ServicePointManager.SecurityProtocol = (SecurityProtocolType)(0xc0 | 0x300 | 0xc00); string uri = String.Format(HOST + @"/api/v1/reports.json?user_token={0}", accessToken); WebRequest request = WebRequest.Create(uri); request.Method = HttpMethod.Post; RequestUtils.SetProxySettings(request, ProxySettings); request.ContentType = "multipart/form-data; boundary=foo_bar_baz"; List content = new List(); StringBuilder sb = new StringBuilder("--foo_bar_baz\r\n"); sb.Append(String.Format("Content-Disposition: form-data; name=\"report[frx_file]\"; filename=\"{0}\"\r\n", Filename)); sb.Append("Content-Type: application/octet-stream\r\n"); sb.Append("\r\n"); content.AddRange(Encoding.UTF8.GetBytes(sb.ToString())); int msLength = Convert.ToInt32(ms.Length); byte[] msBuffer = new byte[msLength]; ms.Read(msBuffer, 0, msLength); content.AddRange(msBuffer); sb = new StringBuilder("--foo_bar_baz--"); content.AddRange(Encoding.UTF8.GetBytes(sb.ToString())); int length = content.Count; byte[] buffer = new byte[length]; buffer = content.ToArray(); request.ContentLength = buffer.Length; using (Stream rs = request.GetRequestStream()) { rs.Write(buffer, 0, buffer.Length); } string response = new StreamReader(request.GetResponse().GetResponseStream()).ReadToEnd(); if (!String.IsNullOrEmpty(response)) { int startIndex = response.IndexOf("id\":") + 5; int endIndex = response.IndexOf(",", startIndex); string id = response.Substring(startIndex, endIndex - startIndex - 1); reportUrl = HOST + "/reports/" + id; } } catch (Exception ex) { throw new CloudStorageException(ex.Message, ex); } } #endregion // Protected Methods #region Public Methods /// /// Gets the access token. /// /// The access token string. public string GetAccessToken(string email, string password) { System.Net.ServicePointManager.SecurityProtocol = (SecurityProtocolType)(0xc0 | 0x300 | 0xc00); HttpWebRequest request = (HttpWebRequest)WebRequest.Create(HOST + @"/api/v1/tokens.json"); request.Method = HttpMethod.Post; RequestUtils.SetProxySettings(request, ProxySettings); request.ContentType = "application/x-www-form-urlencoded"; byte[] content = BuildGetAccessTokenRequestContent(email, password); request.ContentLength = content.Length; using (Stream rs = request.GetRequestStream()) { rs.Write(content, 0, content.Length); } try { WebResponse response = request.GetResponse(); accessToken = Parser.ParseFastCloudToken(response.GetResponseStream()); } catch (Exception ex) { if (!Config.WebMode) { FRMessageBox.Error(ex.Message); } } return accessToken; } #endregion // Public Methods } }