Refactoring to make Picasa work, added Upload to the IBinaryContainer.

git-svn-id: http://svn.code.sf.net/p/greenshot/code/trunk@2135 7dccd23d-a4a3-4e1f-8c07-b4c1b4018ab4
This commit is contained in:
RKrom 2012-10-10 18:21:09 +00:00
parent 03b4b17ea4
commit 756c8d9403
5 changed files with 66 additions and 23 deletions

View file

@ -169,7 +169,7 @@ namespace GreenshotImgurPlugin {
uploadParameters.Add("name", filename); uploadParameters.Add("name", filename);
} }
uploadParameters.Add("image", new ImageContainer(image, outputSettings, filename)); uploadParameters.Add("image", new ImageContainer(image, outputSettings, filename));
responseString = oAuth.MakeRequest(HTTPMethod.POST, apiUrl, uploadParameters, null, null); responseString = oAuth.MakeRequest(HTTPMethod.POST, apiUrl, uploadParameters, null);
} catch (Exception ex) { } catch (Exception ex) {
LOG.Error("Upload to imgur gave an exeption: ", ex); LOG.Error("Upload to imgur gave an exeption: ", ex);
throw ex; throw ex;

View file

@ -84,6 +84,7 @@ namespace GreenshotPlugin.Controls {
if (browser.Url.ToString().StartsWith(callbackUrl)) { if (browser.Url.ToString().StartsWith(callbackUrl)) {
string queryParams = browser.Url.Query; string queryParams = browser.Url.Query;
if (queryParams.Length > 0) { if (queryParams.Length > 0) {
queryParams = NetworkHelper.UrlDecode(queryParams);
//Store the Token and Token Secret //Store the Token and Token Secret
IDictionary<string, string> qs = NetworkHelper.ParseQueryString(queryParams); IDictionary<string, string> qs = NetworkHelper.ParseQueryString(queryParams);
if (qs.ContainsKey("oauth_token") && qs["oauth_token"] != null) { if (qs.ContainsKey("oauth_token") && qs["oauth_token"] != null) {

View file

@ -99,9 +99,13 @@ namespace GreenshotPlugin.Core {
default: default:
// Problem with non-seekable streams most likely doesn't happen with Windows 7 (OS Version 6.1 and later) // Problem with non-seekable streams most likely doesn't happen with Windows 7 (OS Version 6.1 and later)
// http://stackoverflow.com/questions/8349260/generic-gdi-error-on-one-machine-but-not-the-other // http://stackoverflow.com/questions/8349260/generic-gdi-error-on-one-machine-but-not-the-other
if (!stream.CanSeek && (Environment.OSVersion.Version.Major < 6 || (Environment.OSVersion.Version.Major == 6 && Environment.OSVersion.Version.Minor == 1))) { if (!stream.CanSeek) {
useMemoryStream = true; int majorVersion = Environment.OSVersion.Version.Major;
LOG.Warn("Using memorystream prevent an issue with saving to a non seekable stream."); int minorVersion = Environment.OSVersion.Version.Minor;
if (majorVersion < 6 || (majorVersion == 6 && minorVersion == 0)) {
useMemoryStream = true;
LOG.Warn("Using memorystream prevent an issue with saving to a non seekable stream.");
}
} }
imageFormat = ImageFormat.Png; imageFormat = ImageFormat.Png;
break; break;

View file

@ -291,6 +291,7 @@ namespace GreenshotPlugin.Core {
void WriteToStream(Stream formDataStream); void WriteToStream(Stream formDataStream);
string ToBase64String(Base64FormattingOptions formattingOptions); string ToBase64String(Base64FormattingOptions formattingOptions);
byte[] ToByteArray(); byte[] ToByteArray();
void Upload(HttpWebRequest webRequest);
} }
/// <summary> /// <summary>
@ -361,6 +362,17 @@ namespace GreenshotPlugin.Core {
// Write the file data directly to the Stream, rather than serializing it to a string. // Write the file data directly to the Stream, rather than serializing it to a string.
dataStream.Write(file, 0, fileSize); dataStream.Write(file, 0, fileSize);
} }
/// <summary>
/// Upload the file to the webrequest
/// </summary>
/// <param name="webRequest"></param>
public void Upload(HttpWebRequest webRequest) {
webRequest.ContentType = contentType;
using (var requestStream = webRequest.GetRequestStream()) {
WriteToStream(requestStream);
}
}
} }
/// <summary> /// <summary>
@ -426,5 +438,16 @@ namespace GreenshotPlugin.Core {
// Write the file data directly to the Stream, rather than serializing it to a string. // Write the file data directly to the Stream, rather than serializing it to a string.
ImageOutput.SaveToStream(image, dataStream, outputSettings); ImageOutput.SaveToStream(image, dataStream, outputSettings);
} }
/// <summary>
/// Upload the image to the webrequest
/// </summary>
/// <param name="webRequest"></param>
public void Upload(HttpWebRequest webRequest) {
webRequest.ContentType = "image/" + outputSettings.Format.ToString();
using (var requestStream = webRequest.GetRequestStream()) {
WriteToStream(requestStream);
}
}
} }
} }

View file

@ -76,7 +76,12 @@ namespace GreenshotPlugin.Core {
private bool useHTTPHeadersForAuthorization = true; private bool useHTTPHeadersForAuthorization = true;
private IDictionary<string, string> accessTokenResponseParameters = null; private IDictionary<string, string> accessTokenResponseParameters = null;
private IDictionary<string, string> requestTokenResponseParameters = null; private IDictionary<string, string> requestTokenResponseParameters = null;
private IDictionary<string, object> requestTokenParameters = new Dictionary<string, object>();
public IDictionary<string, object> RequestTokenParameters {
get { return requestTokenParameters; }
}
/// <summary> /// <summary>
/// Parameters of the last called getAccessToken /// Parameters of the last called getAccessToken
/// </summary> /// </summary>
@ -100,7 +105,7 @@ namespace GreenshotPlugin.Core {
private Size _browserSize = new Size(864, 587); private Size _browserSize = new Size(864, 587);
private string loginTitle = "Authorize Greenshot access"; private string loginTitle = "Authorize Greenshot access";
#region PublicPropertiies #region PublicProperties
public string RequestTokenUrl { get; set; } public string RequestTokenUrl { get; set; }
public string AuthorizeUrl { get; set; } public string AuthorizeUrl { get; set; }
public string AccessTokenUrl { get; set; } public string AccessTokenUrl { get; set; }
@ -260,10 +265,14 @@ namespace GreenshotPlugin.Core {
private String getRequestToken() { private String getRequestToken() {
string ret = null; string ret = null;
IDictionary<string, object> parameters = new Dictionary<string, object>(); IDictionary<string, object> parameters = new Dictionary<string, object>();
foreach(var value in requestTokenParameters) {
parameters.Add(value);
}
Sign(HTTPMethod.POST, RequestTokenUrl, parameters); Sign(HTTPMethod.POST, RequestTokenUrl, parameters);
string response = MakeRequest(HTTPMethod.POST, RequestTokenUrl, parameters, null, null); string response = MakeRequest(HTTPMethod.POST, RequestTokenUrl, parameters, null);
LOG.DebugFormat("Request token response: {0}", response);
if (response.Length > 0) { if (response.Length > 0) {
response = NetworkHelper.UrlDecode(response);
LOG.DebugFormat("Request token response: {0}", response);
requestTokenResponseParameters = NetworkHelper.ParseQueryString(response); requestTokenResponseParameters = NetworkHelper.ParseQueryString(response);
if (requestTokenResponseParameters.ContainsKey(OAUTH_TOKEN_KEY)) { if (requestTokenResponseParameters.ContainsKey(OAUTH_TOKEN_KEY)) {
this.Token = requestTokenResponseParameters[OAUTH_TOKEN_KEY]; this.Token = requestTokenResponseParameters[OAUTH_TOKEN_KEY];
@ -311,9 +320,10 @@ namespace GreenshotPlugin.Core {
IDictionary<string, object> parameters = new Dictionary<string, object>(); IDictionary<string, object> parameters = new Dictionary<string, object>();
Sign(HTTPMethod.POST, AccessTokenUrl, parameters); Sign(HTTPMethod.POST, AccessTokenUrl, parameters);
string response = MakeRequest(HTTPMethod.POST, AccessTokenUrl, parameters, null, null); string response = MakeRequest(HTTPMethod.POST, AccessTokenUrl, parameters, null);
LOG.DebugFormat("Access token response: {0}", response);
if (response.Length > 0) { if (response.Length > 0) {
response = NetworkHelper.UrlDecode(response);
LOG.DebugFormat("Access token response: {0}", response);
accessTokenResponseParameters = NetworkHelper.ParseQueryString(response); accessTokenResponseParameters = NetworkHelper.ParseQueryString(response);
if (accessTokenResponseParameters.ContainsKey(OAUTH_TOKEN_KEY) && accessTokenResponseParameters[OAUTH_TOKEN_KEY] != null) { if (accessTokenResponseParameters.ContainsKey(OAUTH_TOKEN_KEY) && accessTokenResponseParameters[OAUTH_TOKEN_KEY] != null) {
this.Token = accessTokenResponseParameters[OAUTH_TOKEN_KEY]; this.Token = accessTokenResponseParameters[OAUTH_TOKEN_KEY];
@ -345,7 +355,13 @@ namespace GreenshotPlugin.Core {
LOG.Debug("User didn't authenticate!"); LOG.Debug("User didn't authenticate!");
return false; return false;
} }
return getAccessToken() != null; try {
System.Threading.Thread.Sleep(1000);
return getAccessToken() != null;
} catch (Exception ex) {
LOG.Error(ex);
throw ex;
}
} }
/// <summary> /// <summary>
@ -366,7 +382,7 @@ namespace GreenshotPlugin.Core {
/// <param name="parameters"></param> /// <param name="parameters"></param>
/// <returns></returns> /// <returns></returns>
public string MakeOAuthRequest(HTTPMethod method, string requestURL, IDictionary<string, object> parameters) { public string MakeOAuthRequest(HTTPMethod method, string requestURL, IDictionary<string, object> parameters) {
return MakeOAuthRequest(method, requestURL, parameters, null, null); return MakeOAuthRequest(method, requestURL, parameters, null);
} }
/// <summary> /// <summary>
@ -375,10 +391,9 @@ namespace GreenshotPlugin.Core {
/// <param name="method">GET or POST</param> /// <param name="method">GET or POST</param>
/// <param name="requestURL">The full url, including the querystring.</param> /// <param name="requestURL">The full url, including the querystring.</param>
/// <param name="parameters">Parameters for the request</param> /// <param name="parameters">Parameters for the request</param>
/// <param name="contentType">contenttype for the postdata</param>
/// <param name="postData">Data to post (MemoryStream)</param> /// <param name="postData">Data to post (MemoryStream)</param>
/// <returns>The web server response.</returns> /// <returns>The web server response.</returns>
public string MakeOAuthRequest(HTTPMethod method, string requestURL, IDictionary<string, object> parameters, string contentType, IBinaryContainer postData) { public string MakeOAuthRequest(HTTPMethod method, string requestURL, IDictionary<string, object> parameters, IBinaryContainer postData) {
if (parameters == null) { if (parameters == null) {
parameters = new Dictionary<string, object>(); parameters = new Dictionary<string, object>();
} }
@ -393,7 +408,7 @@ namespace GreenshotPlugin.Core {
} }
try { try {
Sign(method, requestURL, parameters); Sign(method, requestURL, parameters);
return MakeRequest(method, requestURL, parameters, contentType, postData); return MakeRequest(method, requestURL, parameters, postData);
} catch (WebException wEx) { } catch (WebException wEx) {
lastException = wEx; lastException = wEx;
if (wEx.Response != null) { if (wEx.Response != null) {
@ -479,10 +494,9 @@ namespace GreenshotPlugin.Core {
/// <param name="method"></param> /// <param name="method"></param>
/// <param name="requestURL"></param> /// <param name="requestURL"></param>
/// <param name="parameters"></param> /// <param name="parameters"></param>
/// <param name="contentType"></param>
/// <param name="postData">IBinaryParameter</param> /// <param name="postData">IBinaryParameter</param>
/// <returns>Response from server</returns> /// <returns>Response from server</returns>
public string MakeRequest(HTTPMethod method, string requestURL, IDictionary<string, object> parameters, string contentType, IBinaryContainer postData) { public string MakeRequest(HTTPMethod method, string requestURL, IDictionary<string, object> parameters, IBinaryContainer postData) {
if (parameters == null) { if (parameters == null) {
throw new ArgumentNullException("parameters"); throw new ArgumentNullException("parameters");
} }
@ -546,13 +560,10 @@ namespace GreenshotPlugin.Core {
requestStream.Write(data, 0, data.Length); requestStream.Write(data, 0, data.Length);
} }
} }
} else if (postData != null) {
postData.Upload(webRequest);
} else { } else {
webRequest.ContentType = contentType; webRequest.ContentLength = 0;
if (postData != null) {
using (var requestStream = webRequest.GetRequestStream()) {
postData.WriteToStream(requestStream);
}
}
} }
string responseData = WebResponseGet(webRequest); string responseData = WebResponseGet(webRequest);
@ -574,7 +585,11 @@ namespace GreenshotPlugin.Core {
using (StreamReader reader = new StreamReader(webRequest.GetResponse().GetResponseStream(), true)) { using (StreamReader reader = new StreamReader(webRequest.GetResponse().GetResponseStream(), true)) {
responseData = reader.ReadToEnd(); responseData = reader.ReadToEnd();
} }
} catch (Exception e) { } catch (WebException e) {
HttpWebResponse response = (HttpWebResponse)e.Response;
using (Stream responseStream = response.GetResponseStream()) {
LOG.ErrorFormat("HTTP error {0} with content: {1}", response.StatusCode, new StreamReader(responseStream).ReadToEnd());
}
throw e; throw e;
} }