using System;
using System.Collections.Generic;
using System.Text;
using System.IO;
namespace FastReport.Cloud.OAuth
{
///
/// Represents parser for parse OAuth responses.
///
public static class Parser
{
#region Private Methods
private static Dictionary ParseParameters(Stream stream)
{
Dictionary parsedParameters = new Dictionary();
StreamReader reader = new StreamReader(stream);
string data = reader.ReadToEnd();
if (!String.IsNullOrEmpty(data))
{
string[] parameters = data.Split('&');
foreach (string param in parameters)
{
string[] pair = param.Split('=');
parsedParameters.Add(pair[0], pair[1]);
}
}
return parsedParameters;
}
private static string ClearJsonString(string str)
{
str = str.Trim();
int firstIndex = str.IndexOf("\"");
int lastIndex = str.LastIndexOf("\"");
if (firstIndex != -1 && lastIndex != -1)
{
str = str.Substring(firstIndex + 1, lastIndex - firstIndex - 1);
}
return str;
}
private static Dictionary ParseJsonParameters(Stream stream)
{
Dictionary parsedParameters = new Dictionary();
StreamReader reader = new StreamReader(stream);
string data = reader.ReadToEnd();
if (!String.IsNullOrEmpty(data))
{
string[] lines = data.Split("\r\n".ToCharArray(), StringSplitOptions.RemoveEmptyEntries);
for (int i = 0; i < lines.Length; i++)
{
string line = lines[i];
int index = line.IndexOf('{');
if (index > -1)
{
line = line.Remove(index, 1);
}
index = line.IndexOf('}');
if (index > -1)
{
line = line.Remove(index, 1);
}
string[] pairs = line.Split(',');
for (int j = 0; j < pairs.Length; j++)
{
string[] pair = pairs[j].Split(':');
if (pair.Length == 2)
{
string key = ClearJsonString(pair[0]);
string value = ClearJsonString(pair[1]);
parsedParameters.Add(key, value);
}
}
}
}
return parsedParameters;
}
#endregion // Private Methods
#region Public Methods
///
/// Parses token information in stream.
///
/// The stream for parse.
/// The OAuth token.
public static Token ParseToken(Stream stream)
{
Dictionary parameters = ParseParameters(stream);
return new Token(parameters["oauth_token"], parameters["oauth_token_secret"]);
}
///
/// Parses token information in stream for SkyDrive.
///
/// The stream for parse.
/// The SkyDrive access token.
public static string ParseSkyDriveToken(Stream stream)
{
Dictionary parameters = ParseJsonParameters(stream);
return Uri.UnescapeDataString(parameters["access_token"]);
}
///
/// Parses token information in stream for Google Drive.
///
/// The stream for parse.
/// The Google Drive access token.
public static string ParseGoogleDriveToken(Stream stream)
{
Dictionary parameters = ParseJsonParameters(stream);
return Uri.UnescapeDataString(parameters["access_token"]);
}
///
/// Parses token information in stream for FastCloud.
///
/// The stream for parse.
/// The FastCloud access token.
public static string ParseFastCloudToken(Stream stream)
{
Dictionary parameters = ParseJsonParameters(stream);
return Uri.UnescapeDataString(parameters["token"]);
}
#endregion // Public Methods
}
}