diff options
author | András Fuchs <andras.fuchs@gmail.com> | 2013-05-26 07:54:53 -0700 |
---|---|---|
committer | Andrew Arnott <andrewarnott@gmail.com> | 2013-05-26 07:54:53 -0700 |
commit | 2a4da5e544a22d30d5b54a2696194d814d9a442f (patch) | |
tree | ed76c7421e9669bbf263381139a29afb8eb23433 /samples/DotNetOpenAuth.ApplicationBlock/OAuth2/WindowsLive/WindowsLiveGraph.cs | |
parent | 85c21ae12f04cc50a0478cf69c82d441da23d002 (diff) | |
download | DotNetOpenAuth-2a4da5e544a22d30d5b54a2696194d814d9a442f.zip DotNetOpenAuth-2a4da5e544a22d30d5b54a2696194d814d9a442f.tar.gz DotNetOpenAuth-2a4da5e544a22d30d5b54a2696194d814d9a442f.tar.bz2 |
Samples improvements
The part which I needed
to improve is the ApplicationBlock where I changed the OAuth2 classes'
structure a little and extended them with a lot of useful
functionality, like adding many Facebook and WindowsLive scopes,
fields, structures including the asked-by-many easy to use birthdate
and avatar url getters. I have also implemented the Google OAuth2
authentication and created one common interface for all 3 Graphs in
the code (which has the common properties like Id, FirstName,
LastName, etc.), so the authentication code became really simple if
you use my version of your ApplicationBlock.
Diffstat (limited to 'samples/DotNetOpenAuth.ApplicationBlock/OAuth2/WindowsLive/WindowsLiveGraph.cs')
-rw-r--r-- | samples/DotNetOpenAuth.ApplicationBlock/OAuth2/WindowsLive/WindowsLiveGraph.cs | 299 |
1 files changed, 299 insertions, 0 deletions
diff --git a/samples/DotNetOpenAuth.ApplicationBlock/OAuth2/WindowsLive/WindowsLiveGraph.cs b/samples/DotNetOpenAuth.ApplicationBlock/OAuth2/WindowsLive/WindowsLiveGraph.cs new file mode 100644 index 0000000..38095a5 --- /dev/null +++ b/samples/DotNetOpenAuth.ApplicationBlock/OAuth2/WindowsLive/WindowsLiveGraph.cs @@ -0,0 +1,299 @@ +//----------------------------------------------------------------------- +// <copyright file="WindowsLiveGraph.cs" company="Andrew Arnott"> +// Copyright (c) Andrew Arnott. All rights reserved. +// </copyright> +//----------------------------------------------------------------------- + +namespace DotNetOpenAuth.ApplicationBlock { + using System; + using System.Collections.Generic; + using System.IO; + using System.Linq; + using System.Runtime.Serialization; + using System.Runtime.Serialization.Json; + using System.Text; + + //// Documentation: http://msdn.microsoft.com/en-us/library/live/hh243648.aspx#user + + [DataContract] + public class WindowsLiveGraph : IOAuth2Graph { + private static DataContractJsonSerializer jsonSerializer = new DataContractJsonSerializer(typeof(WindowsLiveGraph)); + + /// <summary> + /// The user's ID. + /// </summary> + [DataMember(Name = "id", IsRequired = true)] + public string Id { get; set; } + + /// <summary> + /// The user's full name. + /// </summary> + [DataMember(Name = "name", IsRequired = true)] + public string Name { get; set; } + + /// <summary> + /// The user's first name. + /// </summary> + [DataMember(Name = "first_name")] + public string FirstName { get; set; } + + /// <summary> + /// The user's last name. + /// </summary> + [DataMember(Name = "last_name")] + public string LastName { get; set; } + + /// <summary> + /// The URL of the user's profile page. + /// </summary> + [DataMember(Name = "link")] + public Uri Link { get; set; } + + /// <summary> + /// The day of the user's birth date, or null if no birth date is specified. + /// </summary> + [DataMember(Name = "birth_day")] + public int? BirthDay { get; set; } + + /// <summary> + /// The month of the user's birth date, or null if no birth date is specified. + /// </summary> + [DataMember(Name = "birth_month")] + public int? BirthMonth { get; set; } + + /// <summary> + /// The year of the user's birth date, or null if no birth date is specified. + /// </summary> + [DataMember(Name = "birth_year")] + public int? BirthYear { get; set; } + + /// <summary> + /// An array that contains the user's work info. + /// </summary> + [DataMember(Name = "work")] + public WindowsLiveWorkProfile[] Work { get; set; } + + /// <summary> + /// The user's gender. Valid values are "male", "female", or null if the user's gender is not specified. + /// </summary> + [DataMember(Name = "gender")] + public string Gender { get; set; } + + /// <summary> + /// The user's email addresses. + /// </summary> + [DataMember(Name = "emails")] + public WindowsLiveEmails Emails { get; set; } + + /// <summary> + /// The user's postal addresses. + /// </summary> + [DataMember(Name = "addresses")] + public WindowsLiveAddresses Addresses { get; set; } + + /// <summary> + /// The user's phone numbers. + /// </summary> + [DataMember(Name = "phones")] + public WindowsLivePhones Phones { get; set; } + + /// <summary> + /// The user's locale code. + /// </summary> + [DataMember(Name = "locale", IsRequired = true)] + public string Locale { get; set; } + + /// <summary> + /// The time, in ISO 8601 format, at which the user last updated the object. + /// </summary> + [DataMember(Name = "updated_time")] + public string UpdatedTime { get; set; } + + public string Email { + get { + return this.Emails.Account; + } + } + + public Uri AvatarUrl { get; set; } + + public DateTime? BirthdayDT { + get { + if (this.BirthYear.HasValue && this.BirthMonth.HasValue && this.BirthDay.HasValue) { + return new DateTime(this.BirthYear.Value, this.BirthMonth.Value, this.BirthDay.Value); + } + + return null; + } + } + + public HumanGender GenderEnum { + get { + if (this.Gender == "male") { + return HumanGender.Male; + } else if (this.Gender == "female") { + return HumanGender.Female; + } + + return HumanGender.Unknown; + } + } + + public static WindowsLiveGraph Deserialize(string json) { + if (string.IsNullOrEmpty(json)) { + throw new ArgumentNullException("json"); + } + + return Deserialize(new MemoryStream(Encoding.UTF8.GetBytes(json))); + } + + public static WindowsLiveGraph Deserialize(Stream jsonStream) { + if (jsonStream == null) { + throw new ArgumentNullException("jsonStream"); + } + + return (WindowsLiveGraph)jsonSerializer.ReadObject(jsonStream); + } + + [DataContract] + public class WindowsLiveEmails { + /// <summary> + /// The user's preferred email address, or null if one is not specified. + /// </summary> + [DataMember(Name = "preferred")] + public string Preferred { get; set; } + + /// <summary> + /// The email address that is associated with the account. + /// </summary> + [DataMember(Name = "account", IsRequired = true)] + public string Account { get; set; } + + /// <summary> + /// The user's personal email address, or null if one is not specified. + /// </summary> + [DataMember(Name = "personal")] + public string Personal { get; set; } + + /// <summary> + /// The user's business email address, or null if one is not specified. + /// </summary> + [DataMember(Name = "business")] + public string Business { get; set; } + + /// <summary> + /// The user's "alternate" email address, or null if one is not specified. + /// </summary> + [DataMember(Name = "other")] + public string Other { get; set; } + } + + [DataContract] + public class WindowsLivePhones { + /// <summary> + /// The user's personal phone number, or null if one is not specified. + /// </summary> + [DataMember(Name = "personal")] + public string Personal { get; set; } + + /// <summary> + /// The user's business phone number, or null if one is not specified. + /// </summary> + [DataMember(Name = "business")] + public string Business { get; set; } + + /// <summary> + /// The user's mobile phone number, or null if one is not specified. + /// </summary> + [DataMember(Name = "mobile")] + public string Mobile { get; set; } + } + + [DataContract] + public class WindowsLiveAddress { + /// <summary> + /// The street address, or null if one is not specified. + /// </summary> + [DataMember(Name = "street")] + public string Street { get; set; } + + /// <summary> + /// The second line of the street address, or null if one is not specified. + /// </summary> + [DataMember(Name = "street_2")] + public string Street2 { get; set; } + + /// <summary> + /// The city of the address, or null if one is not specified. + /// </summary> + [DataMember(Name = "city")] + public string City { get; set; } + + /// <summary> + /// The state of the address, or null if one is not specified. + /// </summary> + [DataMember(Name = "state")] + public string State { get; set; } + + /// <summary> + /// The postal code of the address, or null if one is not specified. + /// </summary> + [DataMember(Name = "postal_code")] + public string PostalCode { get; set; } + + /// <summary> + /// The region of the address, or null if one is not specified. + /// </summary> + [DataMember(Name = "region")] + public string Region { get; set; } + } + + [DataContract] + public class WindowsLiveAddresses { + /// <summary> + /// The user's personal postal address. + /// </summary> + [DataMember(Name = "personal")] + public WindowsLiveAddress Personal { get; set; } + + /// <summary> + /// The user's business postal address. + /// </summary> + [DataMember(Name = "business")] + public WindowsLiveAddress Business { get; set; } + } + + [DataContract] + public class WindowsLiveWorkProfile { + /// <summary> + /// Info about the user's employer. + /// </summary> + [DataMember(Name = "employer")] + public WindowsLiveEmployer Employer { get; set; } + + /// <summary> + /// Info about the user's employer. + /// </summary> + [DataMember(Name = "position")] + public WindowsLivePosition Position { get; set; } + } + + [DataContract] + public class WindowsLiveEmployer { + /// <summary> + /// The name of the user's employer, or null if the employer's name is not specified. + /// </summary> + [DataMember(Name = "name")] + public string Name { get; set; } + } + + [DataContract] + public class WindowsLivePosition { + /// <summary> + /// The name of the user's work position, or null if the name of the work position is not specified. + /// </summary> + [DataMember(Name = "name")] + public string Name { get; set; } + } + } +} |