はじめに
前回に引き続き、
本記事中のコードは前回同様VB.
デバイスの取得
最初にMeshに接続されているデバイス一覧を取得してみましょう。Mesh上のデバイスは、

デバイスの取得は、

コードはLINQを使用して次のように書くことができます。コードでは各デバイスの名前を表示しています。
' Imports Microsoft.LiveFX.Client
' Imports System.Net
Dim loe = New LiveOperatingEnvironment
loe.Connect(New NetworkCredential("userid", "password"), New LiveItemAccessOptions(True))
' デバイス一覧表示
For Each d In loe.Mesh.Devices.Entries
Console.WriteLine(d.Resource.Title)
Next
クラウド上のLive Operating Environment(LOE)
If loe.IsLocalConnection Then
' クライアント上のLOEに接続している場合
' デバイスの取得
Dim device = loe.Mesh.LocalDevice
End If
クラウド上のLOEに接続している場合は、
変更の通知を受信
Live Frameworkでは、
Mapping
変更通知を受け取るには、
Mesh Objectがどのデバイスと同期対象として関連付けられているかは、

ひとつのMesh ObjectはMappingのコレクションを参照しています。ひとつのMappingには、
Mesh Objectにデバイスを関連付ける、
' Live Mesh フォルダの取得
Dim mos = From mo In loe.Mesh.MeshObjects.Entries _
Where mo.Resource.Type = "LiveMeshFolder" _
Take 1
Dim meshObject = mos.SingleOrDefault
' すべてのデバイスを関連付け
For Each d In loe.Mesh.Devices.Entries
Dim map = New Mapping ' Mapping オブジェクト作成
map.Device = d ' デバイスの指定
meshObject.Mappings.Add(map) ' Mapping コレクションに追加
Next
上記のコードでは、
For Each d In loe.Mesh.Devices.Entries
' 既にデバイスが関連付けられているかチェック
Dim id = d.Resource.Id
If meshObject.Mappings.Entries.Any(Function(m) m.Device.Resource.Id = id) Then
Continue For
End If
Dim map = New Mapping ' Mapping オブジェクト作成
map.Device = d ' デバイスの指定
meshObject.Mappings.Add(map) ' Mapping コレクションに追加
Next
上記コードではすべてのリソース
Live Mesh Betaサービスを思い出してみてください。デバイスがWindows PCの場合、
ChangeNotificationReceived
それでは変更通知を受け取ってみましょう。変更を知るだけであれば非常に簡単です。Mesh Objectや、
Mesh Object、
' Live Mesh フォルダの取得
Dim mos = From mo In loe.Mesh.MeshObjects.Entries _
Where mo.Resource.Type = "LiveMeshFolder" _
Take 1
Dim meshObject = mos.SingleOrDefault
' Mesh Object に対する変更通知
AddHandler meshObject.ChangeNotificationReceived, AddressOf MeshObject_ChangeNotificationReceived
' Mesh Object 内の Data Feed コレクションに対する変更通知
AddHandler meshObject.DataFeeds.ChangeNotificationReceived, AddressOf DataFeeds_ChangeNotificationReceived
' Data Feed 内の Data Entry コレクションに対する変更通知
For Each df In meshObject.DataFeeds.Entries
AddHandler df.DataEntries.LiveItemCollectionChanged, AddressOf DataEntries_LiveItemCollectionChanged
Next
Private Sub MeshObject_ChangeNotificationReceived(ByVal sender As Object, ByVal e As EventArgs)
Console.WriteLine("MeshObject_ChangeNotificationReceived")
End Sub
Private Sub DataFeeds_ChangeNotificationReceived(ByVal sender As Object, ByVal e As EventArgs)
Console.WriteLine("DataFeeds_ChangeNotificationReceived")
End Sub
Private Sub DataEntries_ChangeNotificationReceived(ByVal sender As Object, ByVal e As EventArgs)
Console.WriteLine("DataEntries_ChangeNotificationReceived")
End Sub
変更を受信した場合、
現在のところ、
同期と衝突
さて、
Live Meshフォルダ内のファイルが衝突した場合は、

衝突はData Entryに対して起こります。前回に既に紹介した方法でData Entryを参照している限りでは、
衝突の検知
それでは、
Data Entryを列挙する際に これまで使用していたDataEntriesプロパティではなくSyncEntriesプロパティを使用します。SyncEntries.
' Live Mesh フォルダの取得
Dim mos = From mo In loe.Mesh.MeshObjects.Entries _
Where mo.Resource.Type = "LiveMeshFolder" _
Take 1
' Data Feed 取得
Dim dataFeed = mos.SingleOrDefault.DataFeeds.Entries.First
' これまでの方法で Data Entry を参照する場合
'For Each de In dataFeed.DataEntries.Entries
' Console.WriteLine(de.Resource.Title)
'Next
' Sync Entry
For Each se In dataFeed.SyncEntries.Entries
If se.Resource.Sync.Conflicts.Count > 0 Then
' 衝突している Data Entry がある
Console.WriteLine(se.Resource.Title)
End If
Next
アプリケーションからData Entryを区別するにはResource.
既に削除されいてるData Entryは、
衝突の解決
続いて衝突したData Entryを解決、
' Sync Entry
For Each se In dataFeed.SyncEntries.Entries
If se.Resource.Sync.Conflicts.Count > 0 Then
' 衝突している Data Entry がある
se.ResolveAllConflicts()
End If
Next
dataFeed.SyncEntries.Synchronize()
このコードを実行後に対象SyncEntryのResource.
より詳しくData Entryの内容を確認してどのData Entryのバージョンを選択するかは、
For Each se In dataFeed.SyncEntries.Entries
If se.Resource.Sync.Conflicts.Count > 0 Then
' 衝突している Data Entry の別バージョンの参照
For Each s As DataEntryResource In de.Resource.Sync.Conflicts
' 比較に利用できる値の例
Dim title = s.Title
Dim publishDate = s.PublishDate
Dim fistAuthor = s.Authors.First.Name
Next
End If
Next
Data Entryを含む全リソースには基本的な情報としてタイトルや更新日時、
Resource.
' Sync Entry
For Each se In dataFeed.SyncEntries.Entries
If se.Resource.Sync.Conflicts.Count > 0 Then
' 衝突している Data Entry がある
' Data Entryの選択
se.SetConflictingItemAsWinner(de.Resource.Sync.Conflicts.First)
End If
Next
dataFeed.SyncEntries.Synchronize()
おわりに
今回はここまでです。簡単ではありますが、
さて、