internal object PrepareBatchRequest(FacebookBatchParameter[] batchParameters, object parameters)
{
if (batchParameters == null)
throw new ArgumentNullException("batchParameters");
if (batchParameters.Length == 0)
throw new ArgumentNullException("batchParameters", AtLeastOneBatchParameterRequried);
IDictionary<string, object> actualBatchParameter = new Dictionary<string, object>();
IList<object> flatnedBatchParameters = new List<object>();
actualBatchParameter["batch"] = flatnedBatchParameters;
IDictionary<string, FacebookMediaObject> mediaObjects;
IDictionary<string, FacebookMediaStream> mediaStreams;
foreach (var batchParameter in batchParameters)
{
var data = ToDictionary(batchParameter.Data, out mediaObjects, out mediaStreams);
if (mediaObjects.Count + mediaStreams.Count > 0)
throw new ArgumentException("Attachments (FacebookMediaObject/FacebookMediaStream) are only allowed in FacebookBatchParameter.Parameters");
if (data == null)
data = new Dictionary<string, object>();
if (!data.ContainsKey("method"))
{
switch (batchParameter.HttpMethod)
{
case HttpMethod.Get:
data["method"] = "GET";
break;
case HttpMethod.Post:
data["method"] = "POST";
break;
case HttpMethod.Delete:
data["method"] = "DELETE";
break;
default:
throw new ArgumentOutOfRangeException();
}
}
IList<string> attachedFiles = new List<string>();
var pars = ToDictionary(batchParameter.Parameters, out mediaObjects, out mediaStreams) ?? new Dictionary<string, object>();
bool containsEtag = false;
string etag = null;
if (pars.ContainsKey(ETagKey))
{
etag = (string)pars[ETagKey];
containsEtag = true;
pars.Remove(ETagKey);
}
bool hasAttachmentInBatchParameter = false;
foreach (var attachment in mediaObjects)
{
if (hasAttachmentInBatchParameter)
throw new ArgumentException(OnlyOneAttachmentAllowedPerBatchRequest, "batchParameters");
if (actualBatchParameter.ContainsKey(attachment.Key))
throw new ArgumentException(string.Format(CultureInfo.InvariantCulture, "Attachment (FacebookMediaObject/FacebookMediaStream) with key '{0}' already exists", attachment.Key));
attachedFiles.Add(HttpHelper.UrlEncode(attachment.Key));
actualBatchParameter.Add(attachment.Key, attachment.Value);
hasAttachmentInBatchParameter = true;
}
foreach (var attachment in mediaStreams)
{
if (hasAttachmentInBatchParameter)
throw new ArgumentException(OnlyOneAttachmentAllowedPerBatchRequest, "batchParameters");
if (actualBatchParameter.ContainsKey(attachment.Key))
throw new ArgumentException(string.Format(CultureInfo.InvariantCulture, "Attachment (FacebookMediaObject/FacebookMediaStream) with key '{0}' already exists", attachment.Key));
attachedFiles.Add(HttpHelper.UrlEncode(attachment.Key));
actualBatchParameter.Add(attachment.Key, attachment.Value);
hasAttachmentInBatchParameter = true;
}
if (attachedFiles.Count > 0 && !data.ContainsKey("attached_files"))
data["attached_files"] = string.Join(",", attachedFiles.ToArray());
string path;
if (!data["method"].ToString().Equals("POST", StringComparison.OrdinalIgnoreCase))
{
if (!data.ContainsKey("relative_url"))
{
path = ParseUrlQueryString(batchParameter.Path, pars, false);
SerializeParameters(pars);
var relativeUrl = new StringBuilder();
relativeUrl.Append(path).Append("?");
foreach (var kvp in pars)
relativeUrl.AppendFormat("{0}={1}&", HttpHelper.UrlEncode(kvp.Key), HttpHelper.UrlEncode(BuildHttpQuery(kvp.Value, HttpHelper.UrlEncode)));
if (relativeUrl.Length > 0)
relativeUrl.Length--;
data["relative_url"] = relativeUrl.ToString();
}
}
else
{
path = ParseUrlQueryString(batchParameter.Path, pars, false);
SerializeParameters(pars);
if (!data.ContainsKey("relative_url"))
{
if (path.Length > 0)
data["relative_url"] = path;
}
if (!data.ContainsKey("body"))
{
var sb = new StringBuilder();
foreach (var kvp in pars)
sb.AppendFormat("{0}={1}&", HttpHelper.UrlEncode(kvp.Key), HttpHelper.UrlEncode(BuildHttpQuery(kvp.Value, HttpHelper.UrlEncode)));
if (sb.Length > 0)
{
sb.Length--;
data["body"] = sb.ToString();
}
}
}
if (containsEtag)
data[ETagKey] = etag;
flatnedBatchParameters.Add(data);
}
var parametersAsDictionary = ToDictionary(parameters, out mediaObjects, out mediaStreams);
if (parametersAsDictionary != null)
{
foreach (var parameter in parametersAsDictionary)
{
actualBatchParameter[parameter.Key] = parameter.Value;
}
}
foreach (var mediaObject in mediaObjects)
{
actualBatchParameter[mediaObject.Key] = mediaObject.Value;
}
foreach (var mediaStream in mediaStreams)
{
actualBatchParameter[mediaStream.Key] = mediaStream.Value;
}
return actualBatchParameter;
}