public async Task PullFilesAsync(string tableName, string itemId) { IEnumerable <MobileServiceFile> files = await this.mobileServiceFilesClient.GetFilesAsync(tableName, itemId); foreach (var file in files) { FileSynchronizationAction syncAction = FileSynchronizationAction.Update; MobileServiceFileMetadata metadata = await this.metadataStore.GetFileMetadataAsync(file.Id); if (metadata == null) { syncAction = FileSynchronizationAction.Create; metadata = MobileServiceFileMetadata.FromFile(file); metadata.ContentMD5 = null; metadata.LastModified = null; } if (string.Compare(metadata.ContentMD5, file.ContentMD5, StringComparison.Ordinal) != 0 || (metadata.LastModified == null || metadata.LastModified.Value.ToUniversalTime() != file.LastModified.Value.ToUniversalTime())) { metadata.LastModified = file.LastModified; metadata.ContentMD5 = file.ContentMD5; await this.metadataStore.CreateOrUpdateAsync(metadata); await this.syncHandler.ProcessFileSynchronizationAction(file, syncAction); NotifyFileOperationCompletion(file, syncAction.ToFileOperationKind(), FileOperationSource.ServerPull); } } var fileMetadata = await this.metadataStore.GetMetadataAsync(tableName, itemId); var deletedItemsMetadata = fileMetadata.Where(m => !files.Any(f => string.Compare(f.Id, m.FileId) == 0)); foreach (var metadata in deletedItemsMetadata) { IMobileServiceFileOperation pendingOperation = await this.operationsQueue.GetOperationByFileIdAsync(metadata.FileId); // TODO: Need to call into the sync handler for conflict resolution here... if (pendingOperation == null || pendingOperation is DeleteMobileServiceFileOperation) { await metadataStore.DeleteAsync(metadata); await this.syncHandler.ProcessFileSynchronizationAction(MobileServiceFile.FromMetadata(metadata), FileSynchronizationAction.Delete); NotifyFileOperationCompletion(MobileServiceFile.FromMetadata(metadata), FileOperationKind.Delete, FileOperationSource.ServerPull); } } }