Пример #1
0
        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));
        }
Пример #2
0
        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));
            }
        }
Пример #3
0
        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;
        }