mirror of
https://github.com/ZuneDev/ZuneShell.dll.git
synced 2026-07-27 13:11:51 -07:00
187 lines
7.2 KiB
C#
187 lines
7.2 KiB
C#
// Decompiled with JetBrains decompiler
|
|
// Type: ZuneXml.InboxImageQuery
|
|
// Assembly: ZuneShell, Version=4.7.0.0, Culture=neutral, PublicKeyToken=ddd0da4d3e678217
|
|
// MVID: FC8028F3-A47B-4FB4-B35B-11D1752D8264
|
|
// Assembly location: C:\Program Files\Zune\ZuneShell.dll
|
|
|
|
using Microsoft.Iris;
|
|
using Microsoft.Zune.Messaging;
|
|
using Microsoft.Zune.Service;
|
|
using System;
|
|
using System.IO;
|
|
using System.Net;
|
|
|
|
namespace ZuneXml
|
|
{
|
|
internal class InboxImageQuery : DataProviderQuery
|
|
{
|
|
public static readonly string PropertyName_Title = "Title";
|
|
public static readonly string PropertyName_CollectionName = "CollectionName";
|
|
public static readonly string PropertyName_URL = "URL";
|
|
private string _title;
|
|
private string _collectionName;
|
|
private string _url;
|
|
|
|
public static DataProviderQuery ConstructQuery(object queryTypeCookie) => new InboxImageQuery(queryTypeCookie);
|
|
|
|
public InboxImageQuery(object queryTypeCookie)
|
|
: base(queryTypeCookie)
|
|
=> this.Result = new InboxImageDataProviderObject(this, this.ResultTypeCookie);
|
|
|
|
public override void SetProperty(string propertyName, object value)
|
|
{
|
|
if (propertyName == PropertyName_Title)
|
|
{
|
|
this._title = (string)value;
|
|
this.UpdateLibraryState();
|
|
}
|
|
else if (propertyName == PropertyName_CollectionName)
|
|
{
|
|
this._collectionName = (string)value;
|
|
this.UpdateLibraryState();
|
|
}
|
|
else
|
|
{
|
|
if (!(propertyName == PropertyName_URL))
|
|
throw new ApplicationException("unexpected property name");
|
|
this._url = (string)value;
|
|
this.BeginExecute();
|
|
}
|
|
}
|
|
|
|
public override object GetProperty(string propertyName)
|
|
{
|
|
if (propertyName == PropertyName_Title)
|
|
return _title;
|
|
if (propertyName == PropertyName_CollectionName)
|
|
return _collectionName;
|
|
return propertyName == PropertyName_URL ? _url : null;
|
|
}
|
|
|
|
protected override void BeginExecute()
|
|
{
|
|
this.DisposeLocalFile();
|
|
if (string.IsNullOrEmpty(this._url) || !(this.Result is InboxImageDataProviderObject result))
|
|
return;
|
|
this.SetWorkerStatus(DataProviderQueryStatus.RequestingData);
|
|
RequestArgs requestArgs = new RequestArgs(this._url, result, Environment.TickCount);
|
|
WebRequestHelper.ConstructWebRequest(this._url, EPassportPolicyId.MBI_SSL, HttpRequestCachePolicy.Default, true, false).GetResponseAsync(new AsyncRequestComplete(this.OnRequestComplete), requestArgs);
|
|
}
|
|
|
|
protected override void OnDispose()
|
|
{
|
|
this.DisposeLocalFile();
|
|
base.OnDispose();
|
|
}
|
|
|
|
private void UpdateLibraryState()
|
|
{
|
|
this.DisposeLocalFile();
|
|
InboxImageDataProviderObject result = this.Result as InboxImageDataProviderObject;
|
|
string inboxPhotoUrl = MessagingService.Instance.GetInboxPhotoUrl(this._title, this._collectionName);
|
|
result.InLibrary = inboxPhotoUrl != null;
|
|
result.ImagePath = inboxPhotoUrl;
|
|
}
|
|
|
|
private void DisposeLocalFile()
|
|
{
|
|
if (!(this.Result is InboxImageDataProviderObject result) || result.InLibrary)
|
|
return;
|
|
string imagePath = result.ImagePath;
|
|
if (string.IsNullOrEmpty(imagePath))
|
|
return;
|
|
try
|
|
{
|
|
File.Delete(imagePath);
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
}
|
|
}
|
|
|
|
private void OnRequestComplete(Microsoft.Zune.Service.HttpWebResponse response, object requestArgs)
|
|
{
|
|
RequestArgs requestArgs1 = (RequestArgs)requestArgs;
|
|
string requestUri = requestArgs1.m_requestUri;
|
|
InboxImageDataProviderObject result = requestArgs1.m_result;
|
|
int tcStart = requestArgs1.m_tcStart;
|
|
Stream stream = null;
|
|
FileStream fileStream = null;
|
|
try
|
|
{
|
|
stream = response.StatusCode == HttpStatusCode.OK ? response.GetResponseStream() : throw new HttpWebException(response);
|
|
int tickCount1 = Environment.TickCount;
|
|
this.SetWorkerStatus(DataProviderQueryStatus.ProcessingData);
|
|
int contentLength = (int)response.ContentLength;
|
|
byte[] buffer = new byte[40960];
|
|
string tempFileName = Path.GetTempFileName();
|
|
fileStream = new FileStream(tempFileName, FileMode.Truncate, FileAccess.Write, FileShare.None, 40960, FileOptions.SequentialScan);
|
|
int count;
|
|
for (; contentLength > 0 && (count = stream.Read(buffer, 0, 40960)) > 0; contentLength -= count)
|
|
fileStream.Write(buffer, 0, count);
|
|
fileStream.Close();
|
|
result.ImagePath = tempFileName;
|
|
Application.DeferredInvoke(new DeferredInvokeHandler(this.DeferredSetResult), new DeferredSetResultArgs(result));
|
|
this.SetWorkerStatus(DataProviderQueryStatus.Complete);
|
|
int tickCount2 = Environment.TickCount;
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
this.SetWorkerStatus(DataProviderQueryStatus.Error);
|
|
}
|
|
finally
|
|
{
|
|
fileStream?.Close();
|
|
stream?.Close();
|
|
}
|
|
}
|
|
|
|
private void SetWorkerStatus(DataProviderQueryStatus eStatus) => Application.DeferredInvoke(new DeferredInvokeHandler(this.DeferredSetStatus), new DeferredSetStatusArgs(eStatus));
|
|
|
|
private void DeferredSetStatus(object args)
|
|
{
|
|
if (!(args is DeferredSetStatusArgs deferredSetStatusArgs))
|
|
return;
|
|
this.Status = deferredSetStatusArgs.m_eStatus;
|
|
}
|
|
|
|
private void DeferredSetResult(object argsObj)
|
|
{
|
|
if (!(argsObj is DeferredSetResultArgs deferredSetResultArgs))
|
|
return;
|
|
deferredSetResultArgs.m_result.TransferToAppThread();
|
|
if (this.Result == deferredSetResultArgs.m_result)
|
|
return;
|
|
this.Result = deferredSetResultArgs.m_result;
|
|
}
|
|
|
|
private class RequestArgs
|
|
{
|
|
public readonly string m_requestUri;
|
|
public readonly InboxImageDataProviderObject m_result;
|
|
public readonly int m_tcStart;
|
|
|
|
public RequestArgs(string requestUri, InboxImageDataProviderObject result, int tcStart)
|
|
{
|
|
this.m_requestUri = requestUri;
|
|
this.m_result = result;
|
|
this.m_tcStart = tcStart;
|
|
}
|
|
}
|
|
|
|
private class DeferredSetStatusArgs
|
|
{
|
|
public readonly DataProviderQueryStatus m_eStatus;
|
|
|
|
public DeferredSetStatusArgs(DataProviderQueryStatus eStatus) => this.m_eStatus = eStatus;
|
|
}
|
|
|
|
private class DeferredSetResultArgs
|
|
{
|
|
public readonly InboxImageDataProviderObject m_result;
|
|
|
|
public DeferredSetResultArgs(InboxImageDataProviderObject result) => this.m_result = result;
|
|
}
|
|
}
|
|
}
|