+/*** Core Setup ***/
+
+QString Core::setupCore(const QVariant &setupData_) {
+ QVariantMap setupData = setupData_.toMap();
+ QString user = setupData.take("AdminUser").toString();
+ QString password = setupData.take("AdminPasswd").toString();
+ if(user.isEmpty() || password.isEmpty()) {
+ return tr("Admin user or password not set.");
+ }
+ if(!initStorage(setupData, true)) {
+ return tr("Could not setup storage!");
+ }
+ CoreSettings s;
+ s.setStorageSettings(setupData);
+ qDebug() << qPrintable(tr("Creating admin user..."));
+ mutex.lock();
+ storage->addUser(user, password);
+ mutex.unlock();
+ startListening(); // TODO check when we need this
+ return QString();
+}
+
+/*** Storage Handling ***/
+
+bool Core::registerStorageBackend(Storage *backend) {
+ if(backend->isAvailable()) {
+ _storageBackends[backend->displayName()] = backend;
+ return true;
+ } else {
+ backend->deleteLater();
+ return false;
+ }
+}
+
+void Core::unregisterStorageBackend(Storage *backend) {
+ _storageBackends.remove(backend->displayName());
+ backend->deleteLater();
+}
+
+// old db settings:
+// "Type" => "sqlite"
+bool Core::initStorage(QVariantMap dbSettings, bool setup) {
+ QString backend = dbSettings["Backend"].toString();
+ if(backend.isEmpty()) {
+ //qWarning() << "No storage backend selected!";
+ return configured = false;
+ }
+
+ if(_storageBackends.contains(backend)) {
+ storage = _storageBackends[backend];
+ } else {
+ qWarning() << "Selected storage backend is not available:" << backend;
+ return configured = false;
+ }
+ if(!storage->init(dbSettings)) {
+ if(!setup || !(storage->setup(dbSettings) && storage->init(dbSettings))) {
+ qWarning() << "Could not init storage!";
+ storage = 0;
+ return configured = false;
+ }
+ }
+ // delete all other backends
+ foreach(Storage *s, _storageBackends.values()) {
+ if(s != storage) s->deleteLater();
+ }
+ _storageBackends.clear();
+
+ connect(storage, SIGNAL(bufferInfoUpdated(UserId, const BufferInfo &)), this, SIGNAL(bufferInfoUpdated(UserId, const BufferInfo &)));
+ return configured = true;
+}
+
+void Core::syncStorage() {
+ QMutexLocker locker(&mutex);
+ if(storage) storage->sync();
+}
+
+/*** Storage Access ***/
+void Core::setUserSetting(UserId userId, const QString &settingName, const QVariant &data) {
+ QMutexLocker locker(&mutex);
+ instance()->storage->setUserSetting(userId, settingName, data);
+}
+
+QVariant Core::getUserSetting(UserId userId, const QString &settingName, const QVariant &data) {
+ QMutexLocker locker(&mutex);
+ return instance()->storage->getUserSetting(userId, settingName, data);
+}
+
+bool Core::createNetwork(UserId user, NetworkInfo &info) {
+ QMutexLocker locker(&mutex);
+ NetworkId networkId = instance()->storage->createNetwork(user, info);
+ if(!networkId.isValid())
+ return false;
+
+ info.networkId = networkId;
+ return true;
+}
+
+bool Core::updateNetwork(UserId user, const NetworkInfo &info) {
+ QMutexLocker locker(&mutex);
+ return instance()->storage->updateNetwork(user, info);
+}
+
+bool Core::removeNetwork(UserId user, const NetworkId &networkId) {
+ QMutexLocker locker(&mutex);
+ return instance()->storage->removeNetwork(user, networkId);
+}
+
+QList<NetworkInfo> Core::networks(UserId user) {
+ QMutexLocker locker(&mutex);
+ return instance()->storage->networks(user);
+}
+
+NetworkId Core::networkId(UserId user, const QString &network) {
+ QMutexLocker locker(&mutex);
+ return instance()->storage->getNetworkId(user, network);
+}
+
+QList<NetworkId> Core::connectedNetworks(UserId user) {
+ QMutexLocker locker(&mutex);
+ return instance()->storage->connectedNetworks(user);
+}
+
+void Core::setNetworkConnected(UserId user, const NetworkId &networkId, bool isConnected) {
+ QMutexLocker locker(&mutex);
+ return instance()->storage->setNetworkConnected(user, networkId, isConnected);
+}
+
+QHash<QString, QString> Core::persistentChannels(UserId user, const NetworkId &networkId) {
+ QMutexLocker locker(&mutex);
+ return instance()->storage->persistentChannels(user, networkId);
+}
+
+void Core::setChannelPersistent(UserId user, const NetworkId &networkId, const QString &channel, bool isJoined) {
+ QMutexLocker locker(&mutex);
+ return instance()->storage->setChannelPersistent(user, networkId, channel, isJoined);
+}
+
+void Core::setPersistentChannelKey(UserId user, const NetworkId &networkId, const QString &channel, const QString &key) {
+ QMutexLocker locker(&mutex);
+ return instance()->storage->setPersistentChannelKey(user, networkId, channel, key);