blob: bfee15f2280716db88d2d23666d031aaa006f509 [file] [log] [blame]
// Copyright 2015 The Vanadium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
import 'dart:async';
import '../models/all.dart' as model;
import 'keyutil.dart' as keyutil;
import 'state.dart';
import 'store.dart';
// A memory-based implementation of Store.
class MemoryStore implements Store {
StreamController _onDecksChangeEmitter;
Map<String, String> _decksMap;
Map<String, String> _slidesMap;
Map<String, int> _currSlideNumMap;
Map<String, StreamController> _currSlideNumChangeEmitterMap;
State _state = new State();
StreamController _stateChangeEmitter = new StreamController.broadcast();
MemoryStore()
: _onDecksChangeEmitter = new StreamController.broadcast(),
_decksMap = new Map(),
_slidesMap = new Map(),
_currSlideNumMap = new Map(),
_currSlideNumChangeEmitterMap = new Map(),
_state = new State(),
_stateChangeEmitter = new StreamController.broadcast();
//////////////////////////////////////
// State
State get state => _state;
Stream get onStateChange => _stateChangeEmitter.stream;
//////////////////////////////////////
// Decks
Future<List<model.Deck>> getAllDecks() async {
var decks = [];
_decksMap.forEach((String key, String value) {
decks.add(new model.Deck.fromJson(key, value));
});
return decks;
}
Future<model.Deck> getDeck(String key) async {
return new model.Deck.fromJson(key, _decksMap[key]);
}
Future addDeck(model.Deck deck) async {
var json = deck.toJson();
_decksMap[deck.key] = json;
getAllDecks().then(_onDecksChangeEmitter.add);
}
Future removeDeck(String deckKey) async {
_decksMap.remove(deckKey);
_slidesMap.keys
.where((slideKey) =>
slideKey.startsWith(keyutil.getDeckKeyPrefix(deckKey)))
.toList()
.forEach(_slidesMap.remove);
getAllDecks().then(_onDecksChangeEmitter.add);
}
Stream<List<model.Deck>> get onDecksChange => _onDecksChangeEmitter.stream;
//////////////////////////////////////
// Slides
Future<List<model.Slide>> getAllSlides(String deckKey) async {
var slides = [];
_slidesMap.keys
.where((slideKey) =>
slideKey.startsWith(keyutil.getDeckKeyPrefix(deckKey)))
.forEach((String key) {
slides.add(new model.Slide.fromJson(_slidesMap[key]));
});
return slides;
}
Future setSlides(String deckKey, List<model.Slide> slides) async {
List<String> jsonSlides = slides.map((slide) => slide.toJson()).toList();
for (int i = 0; i < jsonSlides.length; i++) {
_slidesMap[keyutil.getSlideKey(deckKey, i)] = jsonSlides[i];
}
}
//////////////////////////////////////
// Slideshow
Future<int> getCurrSlideNum(String deckId) async {
return _currSlideNumMap[deckId] ?? 0;
}
Future setCurrSlideNum(String deckId, int slideNum) async {
var slides = await getAllSlides(deckId);
if (slideNum >= 0 && slideNum < slides.length) {
_currSlideNumMap[deckId] = slideNum;
_getCurrSlideNumChangeEmitter(deckId).add(slideNum);
}
}
Stream<int> onCurrSlideNumChange(String deckId) {
return _getCurrSlideNumChangeEmitter(deckId).stream;
}
StreamController _getCurrSlideNumChangeEmitter(String deckId) {
_currSlideNumChangeEmitterMap.putIfAbsent(
deckId, () => new StreamController.broadcast());
return _currSlideNumChangeEmitterMap[deckId];
}
//////////////////////////////////////
// Presentation
static final Error noPresentationSupportError =
new UnsupportedError('MemoryStore does not support presentation.');
Future<model.PresentationAdvertisement> startPresentation(String deckId) {
throw noPresentationSupportError;
}
Future stopPresentation(String presentationId) {
throw noPresentationSupportError;
}
Future stopAllPresentations() {
throw noPresentationSupportError;
}
}