using System;
using System.IO;
using System.IO.IsolatedStorage;
using System.Collections;
namespace FlickrNet
{
///
/// Internal class providing certain utility functions to other classes.
///
public sealed class Utils
{
private static readonly DateTime unixStartDate = new DateTime(1970, 1, 1, 0, 0, 0);
private Utils()
{
}
internal static string UrlEncode(string oldString)
{
if( oldString == null ) return null;
string a = System.Web.HttpUtility.UrlEncode(oldString);
a = a.Replace("&", "%26");
a = a.Replace("=", "%3D");
a = a.Replace(" ", "%20");
return a;
}
///
/// Converts a object into a unix timestamp number.
///
/// The date to convert.
/// A long for the number of seconds since 1st January 1970, as per unix specification.
public static long DateToUnixTimestamp(DateTime date)
{
TimeSpan ts = date - unixStartDate;
return (long)ts.TotalSeconds;
}
///
/// Converts a string, representing a unix timestamp number into a object.
///
/// The timestamp, as a string.
/// The object the time represents.
public static DateTime UnixTimestampToDate(string timestamp)
{
if( timestamp == null || timestamp.Length == 0 ) return DateTime.MinValue;
return UnixTimestampToDate(long.Parse(timestamp));
}
///
/// Converts a , representing a unix timestamp number into a object.
///
/// The unix timestamp.
/// The object the time represents.
public static DateTime UnixTimestampToDate(long timestamp)
{
return unixStartDate.AddSeconds(timestamp);
}
///
/// Utility method to convert the enum to a string.
///
///
///
/// PhotoSearchExtras extras = PhotoSearchExtras.DateTaken & PhotoSearchExtras.IconServer;
/// string val = Utils.ExtrasToString(extras);
/// Console.WriteLine(val);
///
/// outputs: "date_taken,icon_server";
///
///
///
public static string ExtrasToString(PhotoSearchExtras extras)
{
System.Text.StringBuilder sb = new System.Text.StringBuilder();
if( (extras & PhotoSearchExtras.DateTaken) == PhotoSearchExtras.DateTaken )
sb.Append("date_taken");
if( (extras & PhotoSearchExtras.DateUploaded) == PhotoSearchExtras.DateUploaded )
{
if( sb.Length>0 ) sb.Append(",");
sb.Append("date_upload");
}
if( (extras & PhotoSearchExtras.IconServer) == PhotoSearchExtras.IconServer )
{
if( sb.Length>0 ) sb.Append(",");
sb.Append("icon_server");
}
if( (extras & PhotoSearchExtras.License) == PhotoSearchExtras.License )
{
if( sb.Length>0 ) sb.Append(",");
sb.Append("license");
}
if( (extras & PhotoSearchExtras.OwnerName) == PhotoSearchExtras.OwnerName )
{
if( sb.Length>0 ) sb.Append(",");
sb.Append("owner_name");
}
if( (extras & PhotoSearchExtras.OriginalFormat) == PhotoSearchExtras.OriginalFormat )
{
if( sb.Length>0 ) sb.Append(",");
sb.Append("original_format");
}
if( (extras & PhotoSearchExtras.LastUpdated) == PhotoSearchExtras.LastUpdated )
{
if( sb.Length>0 ) sb.Append(",");
sb.Append("last_update");
}
if( (extras & PhotoSearchExtras.Tags) == PhotoSearchExtras.Tags )
{
if( sb.Length>0 ) sb.Append(",");
sb.Append("tags");
}
if( (extras & PhotoSearchExtras.Geo) == PhotoSearchExtras.Geo )
{
if( sb.Length>0 ) sb.Append(",");
sb.Append("geo");
}
return sb.ToString();
}
internal static string SortOrderToString(PhotoSearchSortOrder order)
{
switch(order)
{
case PhotoSearchSortOrder.DatePostedAsc:
return "date-posted-asc";
case PhotoSearchSortOrder.DatePostedDesc:
return "date-posted-desc";
case PhotoSearchSortOrder.DateTakenAsc:
return "date-taken-asc";
case PhotoSearchSortOrder.DateTakenDesc:
return "date-taken-desc";
case PhotoSearchSortOrder.InterestingnessAsc:
return "interestingness-asc";
case PhotoSearchSortOrder.InterestingnessDesc:
return "interestingness-desc";
case PhotoSearchSortOrder.Relevance:
return "relevance";
default:
return null;
}
}
internal static void PartialOptionsIntoArray(PartialSearchOptions options, Hashtable parameters)
{
if( options.MinUploadDate != DateTime.MinValue ) parameters.Add("min_uploaded_date", Utils.DateToUnixTimestamp(options.MinUploadDate).ToString());
if( options.MaxUploadDate != DateTime.MinValue ) parameters.Add("max_uploaded_date", Utils.DateToUnixTimestamp(options.MaxUploadDate).ToString());
if( options.MinTakenDate != DateTime.MinValue ) parameters.Add("min_taken_date", options.MinTakenDate.ToString("yyyy-MM-dd HH:mm:ss"));
if( options.MaxTakenDate != DateTime.MinValue ) parameters.Add("max_taken_date", options.MaxTakenDate.ToString("yyyy-MM-dd HH:mm:ss"));
if( options.Extras != PhotoSearchExtras.None ) parameters.Add("extras", options.ExtrasString);
if( options.SortOrder != PhotoSearchSortOrder.None ) parameters.Add("sort", options.SortOrderString);
if( options.PerPage > 0 ) parameters.Add("per_page", options.PerPage.ToString());
if( options.Page > 0 ) parameters.Add("page", options.Page.ToString());
if( options.PrivacyFilter != PrivacyFilter.None ) parameters.Add("privacy_filter", options.PrivacyFilter.ToString("d"));
}
internal static void WriteInt32(Stream s, int i)
{
s.WriteByte((byte) (i & 0xFF));
s.WriteByte((byte) ((i >> 8) & 0xFF));
s.WriteByte((byte) ((i >> 16) & 0xFF));
s.WriteByte((byte) ((i >> 24) & 0xFF));
}
internal static void WriteString(Stream s, string str)
{
WriteInt32(s, str.Length);
foreach (char c in str)
{
s.WriteByte((byte) (c & 0xFF));
s.WriteByte((byte) ((c >> 8) & 0xFF));
}
}
internal static void WriteAsciiString(Stream s, string str)
{
WriteInt32(s, str.Length);
foreach (char c in str)
{
s.WriteByte((byte) (c & 0x7F));
}
}
internal static int ReadInt32(Stream s)
{
int i = 0, b;
for (int j = 0; j < 4; j++)
{
b = s.ReadByte();
if (b == -1)
throw new IOException("Unexpected EOF encountered");
i |= (b << (j * 8));
}
return i;
}
internal static string ReadString(Stream s)
{
int len = ReadInt32(s);
char[] chars = new char[len];
for (int i = 0; i < len; i++)
{
int hi, lo;
lo = s.ReadByte();
hi = s.ReadByte();
if (lo == -1 || hi == -1)
throw new IOException("Unexpected EOF encountered");
chars[i] = (char) (lo | (hi << 8));
}
return new string(chars);
}
internal static string ReadAsciiString(Stream s)
{
int len = ReadInt32(s);
char[] chars = new char[len];
for (int i = 0; i < len; i++)
{
int c = s.ReadByte();
if (c == -1)
throw new IOException("Unexpected EOF encountered");
chars[i] = (char) (c & 0x7F);
}
return new string(chars);
}
}
}