private async Task <Solution> LoadAsync(CancellationToken cancellationToken) { var adhocWorkspace = new AdhocWorkspace(); var serializer = adhocWorkspace.Services.GetService <ISerializerService>(); var solutionChecksum = default(Checksum); var map = new Dictionary <Checksum, object>(); using (var stream = new FileStream(_fileName, FileMode.Open)) using (var compressed = new DeflateStream(stream, CompressionMode.Decompress)) using (var reader = ObjectReader.TryGetReader(compressed, cancellationToken)) { // save root checksum and number of entries solutionChecksum = Checksum.ReadFrom(reader); // number of items in the package var count = reader.ReadInt32(); for (var i = 0; i < count; i++) { var itemChecksum = Checksum.ReadFrom(reader); var kind = (WellKnownSynchronizationKind)reader.ReadInt32(); // in service hub, cancellation means simply closed stream var @object = serializer.Deserialize <object>(kind, reader, cancellationToken); Debug.Assert(itemChecksum == serializer.CreateChecksum(@object, cancellationToken)); map.Add(itemChecksum, @object); } } var assetSource = new SimpleAssetSource(AssetStorage.Default, map); var assetService = new AssetService(scopeId: 0, AssetStorage.Default, serializer); var solutionCreator = new SolutionCreator(assetService, _solution, cancellationToken); // check whether solution is update to the given base solution if (await solutionCreator.IsIncrementalUpdateAsync(solutionChecksum).ConfigureAwait(false)) { // create updated solution off the baseSolution return(await solutionCreator.CreateSolutionAsync(solutionChecksum).ConfigureAwait(false)); } // get new solution info var solutionInfo = await solutionCreator.CreateSolutionInfoAsync(solutionChecksum).ConfigureAwait(false); // otherwise, just return new solution return(adhocWorkspace.AddSolution(solutionInfo)); }
public async Task UpdatePrimaryWorkspaceAsync(Checksum solutionChecksum, CancellationToken cancellationToken) { var currentSolution = s_primaryWorkspace.CurrentSolution; var primarySolutionChecksum = await currentSolution.State.GetChecksumAsync(cancellationToken).ConfigureAwait(false); if (primarySolutionChecksum == solutionChecksum) { // nothing changed return; } using (await s_gate.DisposableWaitAsync(cancellationToken).ConfigureAwait(false)) { var updater = new SolutionCreator(_assetService, currentSolution, cancellationToken); if (await updater.IsIncrementalUpdateAsync(solutionChecksum).ConfigureAwait(false)) { // solution has updated s_primaryWorkspace.UpdateSolution(await updater.CreateSolutionAsync(solutionChecksum).ConfigureAwait(false)); return; } // new solution. bulk sync all asset for the solution await _assetService.SynchronizeSolutionAssetsAsync(solutionChecksum, cancellationToken).ConfigureAwait(false); s_primaryWorkspace.ClearSolution(); s_primaryWorkspace.AddSolution(await updater.CreateSolutionInfoAsync(solutionChecksum).ConfigureAwait(false)); } }
private async Task<Solution> CreateSolution_NoLockAsync(Checksum solutionChecksum, Solution baseSolution, CancellationToken cancellationToken) { var updater = new SolutionCreator(_assetService, baseSolution, cancellationToken); if (await updater.IsIncrementalUpdateAsync(solutionChecksum).ConfigureAwait(false)) { // solution has updated return await updater.CreateSolutionAsync(solutionChecksum).ConfigureAwait(false); } // new solution. bulk sync all asset for the solution await _assetService.SynchronizeSolutionAssetsAsync(solutionChecksum, cancellationToken).ConfigureAwait(false); var workspace = new TemporaryWorkspace(await updater.CreateSolutionInfoAsync(solutionChecksum).ConfigureAwait(false)); return workspace.CurrentSolution; }