/dotnet/Api/ActivityInfoService.cs

http://sigma-h.googlecode.com/ · C# · 131 lines · 111 code · 20 blank · 0 comment · 5 complexity · 009732ed1148dede2e2978566518a9c8 MD5 · raw file

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Collections.Specialized;
  4. using System.Linq;
  5. using System.Text;
  6. using System.Net;
  7. using System.IO;
  8. using System.Web;
  9. using JsonExSerializer;
  10. using JsonExSerializer.MetaData;
  11. namespace ActivityInfo.Api
  12. {
  13. public class ActivityInfoService
  14. {
  15. private string baseUrl;
  16. private string authToken;
  17. public ActivityInfoService(string baseUrl, string email, string password)
  18. {
  19. this.baseUrl = baseUrl;
  20. login(email, password);
  21. }
  22. public ActivityInfoService(string email, string password)
  23. {
  24. this.baseUrl = "http://www.activityinfo.org/";
  25. login(email, password);
  26. }
  27. public SyncRegions GetSyncRegions()
  28. {
  29. Serializer serializer = new Serializer(typeof(SyncRegions));
  30. serializer.Config.TypeHandlerFactory.SetPropertyNamingStrategy(new CamelCaseNamingStrategy());
  31. return (SyncRegions)doGet("SyncRegions", new NameValueCollection(), serializer);
  32. }
  33. public SyncRegionUpdates GetSyncRegionUpdates(string regionId, string localVersion) {
  34. NameValueCollection parameters = new NameValueCollection();
  35. parameters.Add("regionId", regionId);
  36. if (localVersion != null)
  37. {
  38. parameters.Add("localVersion", localVersion);
  39. }
  40. Serializer serializer = new Serializer(typeof(SyncRegionUpdates));
  41. serializer.Config.TypeHandlerFactory.SetPropertyNamingStrategy(new CamelCaseNamingStrategy());
  42. return (SyncRegionUpdates)doGet("SyncRegionUpdates", parameters, serializer);
  43. }
  44. private void login(String email, String password)
  45. {
  46. Uri uri = new Uri(baseUrl + "Login/service");
  47. String postData = "email=" + email + "&password=" + password;
  48. HttpWebRequest request = (HttpWebRequest)WebRequest.Create(uri);
  49. request.Method = "POST";
  50. request.ContentType = "application/x-www-form-urlencoded";
  51. request.ContentLength = postData.Length;
  52. request.CookieContainer = new CookieContainer();
  53. using (Stream writeStream = request.GetRequestStream())
  54. {
  55. UTF8Encoding encoding = new UTF8Encoding();
  56. byte[] bytes = encoding.GetBytes(postData);
  57. writeStream.Write(bytes, 0, bytes.Length);
  58. }
  59. String result;
  60. using (HttpWebResponse response = (HttpWebResponse)request.GetResponse())
  61. {
  62. using (Stream responseStream = response.GetResponseStream())
  63. {
  64. using (StreamReader readStream = new StreamReader(responseStream, Encoding.UTF8))
  65. {
  66. result = readStream.ReadToEnd();
  67. }
  68. }
  69. if (result.Contains("OK"))
  70. {
  71. authToken = response.Cookies["authToken"].Value;
  72. }
  73. else
  74. {
  75. throw new AuthenticationException();
  76. }
  77. }
  78. }
  79. private object doGet(String commandName, NameValueCollection parameters, Serializer serializer)
  80. {
  81. Uri uri = new Uri(baseUrl + "api/" + commandName + ToQueryString(parameters));
  82. HttpWebRequest request = (HttpWebRequest)WebRequest.Create(uri);
  83. request.Method = "GET";
  84. request.Headers.Add("X-ActivityInfo-AuthToken", authToken);
  85. using (HttpWebResponse response = (HttpWebResponse)request.GetResponse())
  86. {
  87. using (Stream responseStream = response.GetResponseStream())
  88. {
  89. using (StreamReader readStream = new StreamReader(responseStream, Encoding.UTF8))
  90. {
  91. string json = readStream.ReadToEnd();
  92. return serializer.Deserialize(json);
  93. }
  94. }
  95. }
  96. }
  97. private string ToQueryString(NameValueCollection nvc)
  98. {
  99. if (nvc.Count == 0)
  100. {
  101. return "";
  102. }
  103. else
  104. {
  105. return "?" + string.Join("&", Array.ConvertAll(nvc.AllKeys,
  106. key => string.Format("{0}={1}", HttpUtility.UrlEncode(key),
  107. HttpUtility.UrlEncode(nvc[key]))));
  108. }
  109. }
  110. }
  111. }