.NET Kit
今回からは実際にコードを書いてLive Frameworkの世界に入っていきます。Live Frameworkは特定のプログラミング言語やOSに依存してせんが、今回から数回に渡っては、.NET Framework用のライブラリを使用して開発を行います。ライブラリを使用すると、Liveサービスへのアクセスが抽象化され、HTTPとXML(またはJSON)を使用するよりも、簡単にLiveサービスを利用することができます。
開発ではLive Framework SDK内の.NET Kitを使用します。ダウンロードして使用してください。Live Framework CTPの利用についての各種登録作業は前回 紹介していますので、併せて参照してください。ただし前回 の記事からSDK等のアップデートがありました。SDKは新しくDownload Center からダウンロードおよびインストールしてください。Live Framework Clientも新しくダウンロードする必要があります(今回の内容に必須ではありません) 。
プロジェクトの作成
本連載ではVisual Studio 2008を使用します。言語はVB.NETを使用したものを紹介します。無償のVisual Basic 2008 Express Editionでも作成可能です。
まずはWindows用のプロジェクトを作成します。今回作成するプロジェクトの種類はWPF、Windowsフォーム、コンソールアプリケーションのどれでも構いません。
プロジェクトを作成したらLive Frameworkのライブラリの参照を追加します。ソリューションエクスプローラのプロジェクト名を右クリックし、参照の追加を選択してください。参照するアセンブリは以下のファイルです(図1 ) 。ファイルはLive Framework SDKのインストールフォルダ(%ProgramFiles%\Microsoft SDKs\Live Framework\v0.91\API Toolkits\.Net Library)にあります。
図1 参照の追加
Meshへ接続
さっそくMeshサービスへアクセスしてみましょう。アクセスはLiveサービスへのアクセスを仲介しデータの同期・共有処理を担うコンポーネント、Live Operating Environment(LOE)へ行います。
LiveOperatingEnvironmentクラスをインスタンス化してConnectメソッドを呼びます。コードは次のようになります。
Dim loe = New LiveOperatingEnvironment
loe.Connect(New NetworkCredential("userid" , "password" ), New LiveItemAccessOptions(True ))
クラウド上のLOEへの接続には認証が必要です。useridとpasswordにはWindows Live IDアカウント(メールアドレス)とパスワードを設定します。IDとパスワードからNetworkCredentialオブジェクトを作成しConnectメソッドの引数に渡しています。2番目の引数、LiveItemAccessOptionsオブジェクトはリソースへアクセスする際に必要になったとき自動でリソースをロードするかなどのオプション設定です。ここではコードの通りに記述してください。
上記の場合、クライアント上のLOE(http://localhost:2048/)が利用できればクライアントへまず接続します。接続できなければ、クラウド上のLOE(http://user-ctp.windows.net/)にアクセスします。
クラウド上のLOEへ接続する場合は時間を多少要します。そのため非同期で処理するメソッドも用意されています(ConnectAsyncメソッド) 。また、CookieまたはWindows Liveの認証トークンを使用しても接続が可能です。以下にあまり意味はないかもしれませんがNetworkCredentialオブジェクトから認証トークンを作成しLOEへ接続する例を示します。この場合LOEのURLを指定できます。認証トークンはLive ID Client SDKなどを使用して取得できます。
Dim serviceUrl = "https://user-ctp.windows.net"
Dim token = New NetworkCredential("userid" , "password" , serviceUrl).GetWindowsLiveAuthenticationToken()
Dim accessOptions = New LiveItemAccessOptions(True )
Dim loe = New LiveOperatingEnvironment
loe.Connect(token, AuthenticationTokenType.UserToken, New Uri(serviceUrl), accessOptions)
リソースモデル
ここで今回登場するLive Frameworkのリソースモデルについて紹介します。図2 はLive Frameworkのリソースモデルの一部分を示したものです。Live Frameworkで扱うさまざまなリソースは、単体の要素とそのコレクション、そしてリソース同士の関係から成り立っています。
図2 リソースモデル
Data Entry
Data Entryは写真や文書などひとつのデータを表す要素です。Live Meshサービスでは主にData Entryはファイルということになりますが、Live Frameworkを利用したアプリケーションでは自由にData Entryの内容を定義できます。Data Entry自体はそれ自身の名前などテキスト情報のみを持ち、画像などのバイナリデータはMedia ResourceとしてData Entryからのリンクとして関連付いています。
Data Feed
Data Entryのコレクションを指し示すのがData Feedです。コレクション内のData Entryの種類は特に決まりはなく、作成するアプリケーションの用途にあわせて自由にData Entryのコレクションをデザインします。
Mesh Object
アプリケーション定義したデータのコンテナとなるのがMesh Objectと呼ばれている要素です。このMesh ObjectがMesh上で同期・共有する対象の単位となります。Mesh ObjectはData Feedのコレクションを含んでいます。Live MeshサービスではLive MeshフォルダがこのMesh Objectにあたります。アプリケーションでデータを同期したい場合はこのMesh Objectを作成しMeshへ追加することになります。
これら3個のリソースを含むすべてのリソースは、単体の要素はResourceクラス、コレクションはResourceCollectionクラスを継承し、リソースとしての基本情報を持っています[1] 。
Mesh Objectの上の階層にはMeshサービスを表しMesh Objectのコレクションを持つMeshがあり、その上がルート要素のLOEとなっています。
[1]
.NET Libraryでは「クラス」と「継承」ですが、.NET LibraryだけでなくLive Frameworkとしてこのリソースモデルの概念は共通ですので、クラスという表現は適切でないかもしれません。
Mesh Objectの参照
それでは、Mesh Objectを参照してみましょう。アクセスできるLive Meshサービスは、CTPのDeveloper Sandbox にあるデータです。何もデータを追加していない場合は参照しても情報がありませんので、Live Desktopから適当にフォルダやファイル、アプリケーションを追加しておきましょう(図3 ) 。
図3 Developer SandboxのLive Desktop
コードはLiveOperatingEnvironmentオブジェクトのConnectメソッドを実行した後のものです。Mesh内にあるMesh Objectの名前を表示します。
For Each mo As MeshObject In loe.Mesh.MeshObjects.Entries
Console.WriteLine(mo.Resource.Title)
Next
実行結果は、筆者の場合、以下のようになりました。フォルダ名やアプリケーション名が取得できていることがわかります。
Crowd Vote
Mesh Lists
Corkboard
Sample folder
ここでコードに注目してください。MeshObjectを取得するのにloe.Mesh.MeshObjectsではなくloe.Mesh.MeshObjects.Entriesとなっています。MeshObjectsはコレクションを表すリソースの型で、実際のMesh ObjectはEntriesプロパティから参照し取得します。また、リソースの名前はResource.Titleプロパティを参照します。
同様に、Mesh Objectの各Data Feedの名前、Data Feedの各Data Entryの名前を取得してみましょう。コードは次のようになります。
For Each mo As MeshObject In loe.Mesh.MeshObjects.Entries
Console.WriteLine(mo.Resource.Title)
For Each df As DataFeed In mo.DataFeeds.Entries
Console.WriteLine(vbTab & df.Resource.Title)
For Each de As DataEntry In df.DataEntries.Entries
Console.WriteLine(vbTab & vbTab & de.Resource.Title)
Next
Next
Next
実行結果は以下のようになりました。皆さんの環境でもアクセスしたMesh内の情報が取得できたでしょうか。
Crowd Vote
feed1
DataEntryResource
schema1
Mesh Lists
feed1
DataEntryResource
schema1
DataEntryResource
DataEntryResource
Corkboard
feed1
Note 1
Note 2
Sample folder
LiveMeshFiles
photo.png
Sub Folder
foo.png
ちなみに、この結果にあるSample folderはLive Meshフォルダのものです。その中にあるSub FolderはLive Meshフォルダ内のフォルダです。このSub FolderはData Entryとして存在していることがわかります。
LOEへ接続時に「New LiveItemAccessOptions(False )」としてオプションを指定した場合は、各リソースを明示的にロードしてからアクセスする必要があります。
loe.Mesh.MeshObjects.Load()
For Each mo As MeshObject In loe.Mesh.MeshObjects.Entries
Console.WriteLine(mo.Resource.Title)
mo.DataFeeds.Load()
For Each df As DataFeed In mo.DataFeeds.Entries
Console.WriteLine(vbTab & df.Resource.Title)
df.DataEntries.Load()
For Each de As DataEntry In df.DataEntries.Entries
Console.WriteLine(vbTab & vbTab & de.Resource.Title)
Next
Next
Next
Mesh Objectの追加
次はMesh ObjectをMeshへ追加してみましょう。ここではLive Meshフォルダとファイルを追加します。少し変更を加えるだけでアプリケーション独自のデータとしてMesh Objectを追加するようにもできます。
Live Meshフォルダの作成
Live Meshフォルダ、つまりMesh Objectの作成は次の通りです。
Dim folder = New MeshObject
folder.Resource.Title = "新しいフォルダ"
folder.Resource.Type = "LiveMeshFolder"
loe.Mesh.MeshObjects.Add(folder)
ここで、新しいResource.Typeというものが出てきました。これはリソースの種類を文字列で指定します。設定する内容は自由です。Live Frameworkを利用するアプリケーションが独自に付けて構いません。ただし、ほかのアプリケーションとの衝突をさけるため、GUIDや企業名などを含めた名前空間の命名規則等を利用するとよいでしょう。Live MeshサービスのLive Meshフォルダには「LiveMeshFolder」という文字列が使用されていますので、これを指定します。
作成したMesh ObjectはMeshObjects.Addメソッドを使用してMeshへ追加しています。
これだけではまだLive Meshフォルダとしては認識されません。Mesh Object内に特定のData Feedを追加する必要があります。Mesh Objectに続いてData Feedを追加しましょう。コードは以下の通りです。
Dim fileSystem = New DataFeed
fileSystem.Resource.Title = "LiveMeshFiles"
fileSystem.Resource.Type = "LiveMeshFiles"
fileSystem.Resource.HandlerType = "FileSystem"
folder.DataFeeds.Add(fileSystem)
Live Meshフォルダとして認識されるためには、Resource.Typeに「LiveMeshFiles」を指定します。Resource.Titleはユーザーからは通常見ることができません。適当な名前で構いませんが、実際のLive MeshサービスではTypeと同じ値にしているようです。
また新しく登場したResource.HandlerTypeは、Live Meshフォルダを作成する以外ではあまり必要ないかもしれません。同期時の手助けになる情報としてLive Meshフォルダを作成する場合「FileSystem」を指定する必要があります。
最後に、先に作成したMesh ObjectのData Feedコレクションに新しく作成したData Feedを追加します。
以上までを実行するとLive Meshフォルダが作成されます。Live Desktopを確認してみましょう。新しいフォルダが作成されたでしょうか(図4 ) 。
図4 Live Meshフォルダの作成
ファイルの追加
作成したフォルダにファイル、つまりData Entryを追加してみましょう。コードは次のようになります。コード内に直接記述されたパスにphoto.pngというPNG画像があるものとします。
Dim fs = New System.IO.FileStream("C:\Users\UserName\Pictures\photo.png" , IO.FileMode.Open)
fileSystem.DataEntries.Add(fs, "photo.png" , "image/png" )
ファイルなどのストリームデータを追加する場合、DataFeedのDataEntries.Addメソッドが利用できますので今回はこれを使います。Streamオブジェクトとファイル名(Resource.Title) 、MIMEタイプを指定するとData Feed内にData Entryが作成されます。
実行後Live Desktop内のフォルダを確認してみましょう。画像ファイアルが追加されたでしょうか(図5 )
図5 ファイルの作成
先に作成したMesh Object参照のコードを再度実行することでもData Entryが追加されていることがわかります。
今回はここまでです。次回もMesh Objectsの操作などの基本事項を紹介し、その後に簡単なアプリケーションを作成してみたいと思います。