Files
ZuneShell.dll/ZuneImpl/Service/CommunityCommerce.cs
T

95 lines
3.2 KiB
C#

using System.Globalization;
using System.IO;
using System.Net.Http;
using System.Reflection;
using System.Threading.Tasks;
using System.Xml.Serialization;
using Zune.Xml.Commerce;
using ZuneUI;
namespace Microsoft.Zune.Service
{
internal static partial class CommunityCommerce
{
static readonly XmlSerializer _signInRequestSerializer = new(typeof(SignInRequest));
static readonly XmlSerializer _signInResponseSerializer = new(typeof(SignInResponse));
static readonly HttpClient _client = Escargot._client;
static SignInResponse _memberInfo;
public static SignInResponse MemberInfo
{
get => _memberInfo;
private set
{
_memberInfo = value;
Culture = new CultureInfo(value.AccountInfo.Locale);
}
}
public static CultureInfo Culture { get; private set; } = CultureInfo.CurrentCulture;
public static bool IsSignedIn => Escargot.HasToken && MemberInfo != null;
public static void SignOut() => MemberInfo = null;
public static HRESULT TrySignIn()
{
if (!Escargot.HasToken)
return HRESULT._NS_E_SUBSCRIPTIONSERVICE_LOGIN_FAILED;
try
{
string url = Service2.Instance.GetEndPointUri(EServiceEndpointId.SEID_Commerce) + $"/account/signin";
HttpRequestMessage request = new(HttpMethod.Post, url);
request.Headers.UserAgent.ParseAdd(CommunityService.AppUserAgent);
var contentStream = GetSignInRequestBody();
request.Content = new StreamContent(contentStream);
request.Content.Headers.ContentType = new(Atom.Constants.ATOM_MIMETYPE);
request.Content.Headers.ContentLength = contentStream.Length;
Escargot.AuthenticateRequest(request);
var response = _client.Send(request);
response.EnsureSuccessStatusCode();
Stream responseStream = response.Content.ReadAsStream();
var responseObj = ReadSignInResponse(responseStream);
uint? errorCode = responseObj?.AccountState?.SignInErrorCode;
if (errorCode != 0)
return new HRESULT(unchecked((int)errorCode));
MemberInfo = responseObj;
return HRESULT._S_OK;
}
catch
{
return HRESULT._NS_E_SUBSCRIPTIONSERVICE_LOGIN_FAILED;
}
}
private static Stream GetSignInRequestBody()
{
var requestObj = new SignInRequest
{
TunerInfo = new TunerInfo
{
Version = Assembly.GetEntryAssembly()?.GetName()?.Version?.ToString()
}
};
var contentStream = new MemoryStream();
_signInRequestSerializer.Serialize(contentStream, requestObj);
contentStream.Position = 0;
return contentStream;
}
private static SignInResponse ReadSignInResponse(Stream stream)
{
return _signInResponseSerializer.Deserialize(stream) as SignInResponse;
}
}
}