使ってみよう! Live Framework

第6回 .NET Kit(3)―― ホワイトボードアプリケーション

この記事を読むのに必要な時間:およそ 6 分

ユーザー定義のデータ

さて,ここで前回までに紹介してきたLive FrameworkのMesh Objectについて,ユーザー定義のデータを読み書きする方法について紹介します。Mesh ObjectはMeshサービス上で同期する単位でリソースのひとつでした。Mesh Objectは,Data Feedというコレクションを持ち,さらにData Feedは,Data Entryというデータを表す最少単位のリソースのコレクションを指し示すことが可能です。

Mesh上へファイルを追加する方法は,第4回で少し紹介しています。この方法を使用するとData Entryへバイナリデータを追加することが可能です。

アプリケーションでバイナリデータを扱う場合はファイル追加のときと同様に処理すればよいですが,アプリケーションで使用する独自のクラスオブジェクトなどの保存には,もう少し便利なメソッドが用意されています。それが,SetUserDataメソッドとGetUserDataメソッドです。

SetUserDataとGetUserDataメソッドは,MeshObject.ResourceとDataEntry.Resourceにあるジェネリックメソッドです。Mesh ObjectまたはData Entryに対して型引数を指定して,クラスオブジェクトやプリミティブな値(StringやIntegerなど)の設定と取得ができます。

コード例を以下に示します。単純にString型の値をMesh Objectに設定および取得するには次のようになります。

' Imports Microsoft.LiveFX.Client
' Imports System.Net

Dim loe = New LiveOperatingEnvironment
loe.Connect(New NetworkCredential("userid", "password"), New LiveItemAccessOptions(True))

' Mesh Object に文字列データの設定
Dim meshObject = New MeshObject("Sample")
meshObject.Resource.SetUserData(Of String)("文字列データ")

loe.Mesh.MeshObjects.Add(meshObject) ' Mesh へ追加

' Mesh Object から文字列データの取得
Dim str = meshObject.Resource.GetUserData(Of String)()
MessageBox.Show(str)

続いて独自のクラスを設定する場合です。クラスオブジェクトの場合は,シリアラズ可能なもの(具体的には文字列や数値として表せるもの)に限られます。クラスオブジェクトを設定・取得する例を次に示します。以下のようなクラスを設定するものとします。

Public Class UserDataClass
    ' メンバ1
    Public Foo As String

    ' メンバ2
    Private _bar As Integer
    Public Property Bar() As Integer
        Get
            Return _bar
        End Get
        Set(ByVal value As Integer)
            _bar = value
        End Set
    End Property
End Class

先ほどと同じようにこのクラスオブジェクトをMesh Objectのデータとして設定・取得するコードは次のようになります。

' Mesh Object に文字列データの設定
Dim meshObject = New MeshObject("UserDataClass")
Dim userData1 = New UserDataClass With {.Foo = "hoge", .Bar = 123}
meshObject.Resource.SetUserData(Of UserDataClass)(userData)

' Mesh Object から文字列データの取得
Dim userData2 = meshObject.Resource.GetUserData(Of UserDataClass)()
MessageBox.Show(userData2.Foo & userData2.Bar.ToString)

シリアライズ可能なものに限られますが,Live Frameworkを利用してアプリケーションのデータを保存や共有する場合,これらのメソッドは有用でしょう。本記事でもこのメソッドを使用してホワイトボードアプリケーションのデータを保存します。

Live Frameworkの利用

それでは,Live Frameworkを利用してホワイトボードアプリケーションへ入力されたStrokeオブジェクトをMesh上へ追加できるようにしてみましょう。今回作成するアプリケーションでは,InkCanvasへStrokeオブジェクトが追加されるたびに すべてのStroke情報をユーザー定義データとしてMesh Objectへ設定・更新するようにします。

LOEへ接続とMesh Objectの作成

最初にLive Operating Environment(LOE)の接続と,Stroke情報を保存するMesh Objectの作成を行います。いずれもウィンドウのLoadイベントで処理することにします。以下にコードを示します。

Private Const WhiteboardResourceType As String = "GihyoJp.SampleApplication.Whiteboard"
Private LOE As New LiveOperatingEnvironment ' LOE
Private WithEvents WhiteboardObject As MeshObject ' Mesh Object

Private Sub Window1_Loaded(ByVal sender As Object, ByVal e As System.Windows.RoutedEventArgs) Handles Me.Loaded
    ' LOEへ接続
    LOE.Connect(New NetworkCredential("userid", "password"), New LiveItemAccessOptions(True))

    ' Mesh Objectの取得
    Dim whiteboards = From mo In LOE.Mesh.MeshObjects.Entries _
                      Where mo.Resource.Type = WhiteboardResourceType
    If whiteboards.Count > 0 Then
        ' Mesh 内に既にホワイトボードアプリケーション用の Mesh Object がある場合
        WhiteboardObject = whiteboards.First
    Else
        ' Mesh 内にホワイトボードアプリケーション用の Mesh Object がない場合,作成
        WhiteboardObject = New MeshObject
        WhiteboardObject.Resource.Type = WhiteboardResourceType
        WhiteboardObject.Resource.Title = "whiteboard app"
        LOE.Mesh.MeshObjects.Add(WhiteboardObject)
    End If
End Sub

実用的なアプリケーションにするためには,ユーザーIDとパスワードの入力のためサインインウィンドウなどを用意する必要があるでしょうが,ここではコードに直接記述して済ませています。

上記コードでは,LOEに接続後,ホワイトボードアプリケーションのStroke情報を格納するためのMesh ObjectをMeshから取得しています。ない場合は新たにMesh Objectを作成しています。このときMesh ObjectとのResource.Typeには ほかのアプリケーションと重ならないような適当な値を指定しています。

著者プロフィール

松江祐輔(まつえゆうすけ)

日本システムウエア株式会社 勤務。現在,ハードウェア設計・検証業務を担当。大学生・大学院生時代はベンチャー企業 有限会社ミレニアムシステムズにプログラマーとして従事。趣味はプログラミング。好きな言語はVisual Basic。Microsoft MVP for Windows Live Platform(Jul 2010 - Jun 2011),Windows Live(Jul 2011 - Jun 2013)。

URL:http://katamari.jp