using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.ComponentModel.Composition;
using System.Windows.Input;
using System.IO;
using Microsoft.Win32;
using WindowsPhone.Recipes.Push.Messasges;
using WindowsPhone.Recipes.Push.Server.Models;
using WindowsPhone.Recipes.Push.Server.Services;
namespace WindowsPhone.Recipes.Push.Server.ViewModels
{
///
/// Represents the Tile Schedule push notification pattern.
///
///
/// This push pattern is passive. The user schedule a tile image update request,
/// by using the Windows Phone API, and at the time, MPNS fetches the image using
/// the uri provided with the request.
///
[Export(typeof(PushPatternViewModel)), PartCreationPolicy(CreationPolicy.Shared)]
internal sealed class TileSchedulePushPatternViewModel : PushPatternViewModel
{
#region Fields
private string _imageFileName;
#endregion
#region Properties
[Import]
private ImageService ImageService { get; set; }
///
/// Gets or sets a image file name sent by the user.
///
public string ImageFileName
{
get { return _imageFileName; }
set
{
if (_imageFileName != value)
{
_imageFileName = value;
NotifyPropertyChanged("ImageFileName");
}
}
}
#endregion
#region Ctor
///
/// Initialize new instance of this type with defaults.
///
public TileSchedulePushPatternViewModel()
{
InitializeDefaults();
}
#endregion
#region Overrides
protected override void OnActivated()
{
base.OnActivated();
// Register to the PushService.TileUpdateRequest event. This event is raised
// whenever a user asks to update its tile.
PushService.TileUpdateRequest += PushService_TileUpdateRequest;
// Register to the ImageService.ImageRequest event. This event is raised
// whenever ImageService.GetTileImage is called.
ImageService.ImageRequest += Service_ImageRequest;
}
protected override void OnDeactivated()
{
base.OnDeactivated();
PushService.TileUpdateRequest -= PushService_TileUpdateRequest;
ImageService.ImageRequest -= Service_ImageRequest;
}
protected override void OnSend()
{
// Nothing to do here.
}
#endregion
#region Privates
private void PushService_TileUpdateRequest(object sender, TileUpdateRequestEventArgs e)
{
// Send a tile notification message to the relevant device.
var tileMsg = new TilePushNotificationMessage(MessageSendPriority.High)
{
BackgroundImageUri = new Uri(string.Format(ImageService.GetTileImageService, e.Parameter))
};
tileMsg.SendAsync(e.ChannelUri, Log, Log);
}
private void Service_ImageRequest(object sender, Services.ImageRequestEventArgs e)
{
ImageFileName = e.Parameter;
// This event is raised by our local push-service as result of
// the tile msg we've sent to a subscriber. This is the time
// to pick the right tile image for the subscriber.
string imageFile = Path.Combine("Resources/TileImages/Numbers", e.Parameter);
if (File.Exists(imageFile))
{
using (var reader = File.OpenRead(imageFile))
{
byte[] imageBuffer = new byte[reader.Length];
int bytesRead = reader.Read(imageBuffer, 0, imageBuffer.Length);
e.ImageStream.Write(imageBuffer, 0, bytesRead);
}
}
}
private void InitializeDefaults()
{
DisplayName = "Tile Schedule";
Description = "This push pattern is passive. The user schedule a tile image update request, by using the Windows Phone API, and at the time, MPNS fetches the image using the uri provided with the request.";
}
#endregion
}
}