public Warehouse RetrieveWarehouse(long timestamp)
        {
            FindCommand.Parameters["@time"].Value = timestamp;
            var result = FindCommand.ExecuteReader();

            if (!result.Read())
            {
                result.Close();
                return(null);
            }

            var scope = result["scope"] as byte[];

            result.Close();

            if (scope == null)
            {
                return(null);
            }

            // Decompress the binary data
            byte[] data;
            using (var inputStream = new MemoryStream(scope))
                using (var zlibStream = new GZipInputStream(inputStream))
                    using (var outputStream = new MemoryStream())
                    {
                        zlibStream.CopyTo(outputStream);
                        data = outputStream.ToArray();
                    }

            var warehouse    = new Warehouse();
            var fromProtobuf = new FromProtobuf(warehouse);

            lock (_lock) {
                foreach (var stringDeclaration in StringDeclarations)
                {
                    fromProtobuf.StringDeclarations [stringDeclaration.Value] = stringDeclaration.Key;
                }
            }

            fromProtobuf.Convert(data);

            return(warehouse);
        }
        public BroadcastService(Channel channel, object uglyLock, bool strictServer)
        {
            LiveWarehouse = channel.Warehouse;
            TimeMachine   = channel.TimeMachine;

            _strictServer = strictServer;
            _channel      = channel;

            _protoModelObserver = channel.Observer;

            _toProtobuf   = new ToProtobuf();
            _fromProtobuf = new FromProtobuf(LiveWarehouse);
            _lock         = uglyLock;

            CurrentWarehouse           = null;
            _currentProtoModelObserver = new ProtoModelObserver();

            channel.RegisterService(this);
        }