16
16
* Authored by: Ken VanDine <ken.vandine@canonical.com>
19
20
#include "registry.h"
20
22
#include <upstart-app-launch.h>
22
24
Registry::Registry() :
23
m_defaultPeers(new QGSettings("com.ubuntu.content.hub.default",
25
m_defaultSources(new QGSettings("com.ubuntu.content.hub.default",
24
26
"/com/ubuntu/content/hub/peers/")),
25
m_peers(new QGSettings("com.ubuntu.content.hub.all",
26
"/com/ubuntu/content/hub/peers/"))
27
m_sources(new QGSettings("com.ubuntu.content.hub.source",
28
"/com/ubuntu/content/hub/source/")),
29
m_dests(new QGSettings("com.ubuntu.content.hub.destination",
30
"/com/ubuntu/content/hub/destination/")),
31
m_shares(new QGSettings("com.ubuntu.content.hub.share",
32
"/com/ubuntu/content/hub/share/"))
34
/* ensure all default sources are registered as available sources */
35
QList<cuc::Type> types = known_types();
36
Q_FOREACH (cuc::Type type, types)
38
if (m_defaultSources->keys().contains(type.id()))
40
QString peer_id = m_defaultSources->get(type.id()).toString();
41
QStringList as(m_defaultSources->get(type.id()).toStringList());
44
std::string pkg = as[0].toStdString();
45
std::string app = as[1].toStdString();
46
std::string ver = as[2].toStdString();
48
if (app.empty() || ver.empty())
49
peer = QString::fromStdString(pkg);
51
peer = QString::fromLocal8Bit(upstart_app_launch_triplet_to_app_id(pkg.c_str(), app.c_str(), ver.c_str()));
52
install_source_for_type(type, cuc::Peer{peer.id(), true});
30
58
Registry::~Registry() {}
32
cuc::Peer Registry::default_peer_for_type(cuc::Type type)
34
qDebug() << Q_FUNC_INFO << type.id();
35
if (m_defaultPeers->keys().contains(type.id()))
37
QStringList as(m_defaultPeers->get(type.id()).toStringList());
38
std::string pkg = as[0].toStdString();
39
std::string app = as[1].toStdString();
40
std::string ver = as[2].toStdString();
41
return cuc::Peer(QString::fromLocal8Bit(upstart_app_launch_triplet_to_app_id(pkg.c_str(), app.c_str(), ver.c_str())));
47
void Registry::enumerate_known_peers_for_type(cuc::Type type, const std::function<void(const cuc::Peer&)>&for_each)
49
qDebug() << Q_FUNC_INFO << type.id();
51
Q_FOREACH (QString k, m_peers->get(type.id()).toStringList())
53
qDebug() << Q_FUNC_INFO << k;
60
cuc::Peer Registry::default_source_for_type(cuc::Type type)
62
TRACE() << Q_FUNC_INFO << type.id();
63
if (m_defaultSources->keys().contains(type.id()))
65
QStringList as(m_defaultSources->get(type.id()).toStringList());
68
std::string pkg = as[0].toStdString();
69
std::string app = as[1].toStdString();
70
std::string ver = as[2].toStdString();
72
if (app.empty() || ver.empty())
73
return cuc::Peer(QString::fromStdString(pkg));
74
return cuc::Peer(QString::fromLocal8Bit(upstart_app_launch_triplet_to_app_id(pkg.c_str(), app.c_str(), ver.c_str())), true);
58
81
void Registry::enumerate_known_peers(const std::function<void(const cuc::Peer&)>&for_each)
60
qDebug() << Q_FUNC_INFO;
62
Q_FOREACH (QString type_id, m_peers->keys())
64
qDebug() << Q_FUNC_INFO << type_id;
65
Q_FOREACH (QString k, m_peers->get(type_id).toStringList())
67
qDebug() << Q_FUNC_INFO << k;
73
bool Registry::install_default_peer_for_type(cuc::Type type, cuc::Peer peer)
75
qDebug() << Q_FUNC_INFO << "type:" << type.id() << "peer:" << peer.id();
76
if (m_defaultPeers->keys().contains(type.id()))
78
qDebug() << Q_FUNC_INFO << "Default peer for" << type.id() << "already installed.";
83
TRACE() << Q_FUNC_INFO;
85
Q_FOREACH (QString type_id, m_sources->keys())
87
TRACE() << Q_FUNC_INFO << type_id;
88
Q_FOREACH (QString k, m_sources->get(type_id).toStringList())
90
TRACE() << Q_FUNC_INFO << k;
91
for_each(cuc::Peer{k});
94
Q_FOREACH (QString type_id, m_dests->keys())
96
TRACE() << Q_FUNC_INFO << type_id;
97
Q_FOREACH (QString k, m_dests->get(type_id).toStringList())
99
TRACE() << Q_FUNC_INFO << k;
100
for_each(cuc::Peer{k});
103
Q_FOREACH (QString type_id, m_shares->keys())
105
TRACE() << Q_FUNC_INFO << type_id;
106
Q_FOREACH (QString k, m_shares->get(type_id).toStringList())
108
TRACE() << Q_FUNC_INFO << k;
109
for_each(cuc::Peer{k});
114
void Registry::enumerate_known_sources_for_type(cuc::Type type, const std::function<void(const cuc::Peer&)>&for_each)
116
TRACE() << Q_FUNC_INFO << type.id();
118
if (type == cuc::Type::unknown())
121
Q_FOREACH (QString k, m_sources->get(type.id()).toStringList())
123
TRACE() << Q_FUNC_INFO << k;
124
bool defaultPeer = false;
125
QStringList as(m_defaultSources->get(type.id()).toStringList());
128
std::string pkg = as[0].toStdString();
129
std::string app = as[1].toStdString();
130
std::string ver = as[2].toStdString();
131
if (app.empty() || ver.empty())
132
defaultPeer = QString::fromStdString(pkg) == k;
134
defaultPeer = QString::fromLocal8Bit(upstart_app_launch_triplet_to_app_id(pkg.c_str(), app.c_str(), ver.c_str())) == k;
136
for_each(cuc::Peer{k, defaultPeer});
140
void Registry::enumerate_known_destinations_for_type(cuc::Type type, const std::function<void(const cuc::Peer&)>&for_each)
142
TRACE() << Q_FUNC_INFO << type.id();
143
Q_FOREACH (QString k, m_dests->get(type.id()).toStringList())
145
TRACE() << Q_FUNC_INFO << k;
146
for_each(cuc::Peer{k});
150
void Registry::enumerate_known_shares_for_type(cuc::Type type, const std::function<void(const cuc::Peer&)>&for_each)
152
TRACE() << Q_FUNC_INFO << type.id();
154
Q_FOREACH (QString k, m_shares->get(type.id()).toStringList())
156
TRACE() << Q_FUNC_INFO << k;
157
for_each(cuc::Peer{k});
161
bool Registry::install_default_source_for_type(cuc::Type type, cuc::Peer peer)
163
TRACE() << Q_FUNC_INFO << "type:" << type.id() << "peer:" << peer.id();
164
if (m_defaultSources->keys().contains(type.id()))
166
TRACE() << Q_FUNC_INFO << "Default peer for" << type.id() << "already installed.";
82
this->install_peer_for_type(type, peer);
83
return m_defaultPeers->trySet(type.id(), QVariant(peer.id()));
86
bool Registry::install_peer_for_type(cuc::Type type, cuc::Peer peer)
88
qDebug() << Q_FUNC_INFO << "type:" << type.id() << "peer:" << peer.id();
89
QStringList l = m_peers->get(type.id()).toStringList();
90
if (not l.contains(peer.id()))
93
return m_peers->trySet(type.id(), QVariant(l));
170
this->install_source_for_type(type, peer);
171
return m_defaultSources->trySet(type.id(), QVariant(peer.id()));
174
bool Registry::install_source_for_type(cuc::Type type, cuc::Peer peer)
176
TRACE() << Q_FUNC_INFO << "type:" << type.id() << "peer:" << peer.id();
177
QStringList l = m_sources->get(type.id()).toStringList();
178
if (not l.contains(peer.id()))
181
return m_sources->trySet(type.id(), QVariant(l));
186
bool Registry::install_destination_for_type(cuc::Type type, cuc::Peer peer)
188
TRACE() << Q_FUNC_INFO << "type:" << type.id() << "peer:" << peer.id();
189
QStringList l = m_dests->get(type.id()).toStringList();
190
if (not l.contains(peer.id()))
193
return m_dests->trySet(type.id(), QVariant(l));
198
bool Registry::install_share_for_type(cuc::Type type, cuc::Peer peer)
200
TRACE() << Q_FUNC_INFO << "type:" << type.id() << "peer:" << peer.id();
201
QStringList l = m_shares->get(type.id()).toStringList();
202
if (not l.contains(peer.id()))
205
return m_shares->trySet(type.id(), QVariant(l));
98
210
bool Registry::remove_peer(cuc::Peer peer)
100
qDebug() << Q_FUNC_INFO << "peer:" << peer.id();
212
TRACE() << Q_FUNC_INFO << "peer:" << peer.id();
101
213
bool ret = false;
102
Q_FOREACH (QString type_id, m_peers->keys())
104
QStringList l = m_peers->get(type_id).toStringList();
105
if (l.contains(peer.id()))
107
l.removeAll(peer.id());
108
ret = m_peers->trySet(type_id, QVariant(l));
214
Q_FOREACH (QString type_id, m_sources->keys())
216
QStringList l = m_sources->get(type_id).toStringList();
217
if (l.contains(peer.id()))
219
l.removeAll(peer.id());
220
ret = m_sources->trySet(type_id, QVariant(l));
223
Q_FOREACH (QString type_id, m_dests->keys())
225
QStringList l = m_dests->get(type_id).toStringList();
226
if (l.contains(peer.id()))
228
l.removeAll(peer.id());
229
ret = m_dests->trySet(type_id, QVariant(l));
232
Q_FOREACH (QString type_id, m_shares->keys())
234
QStringList l = m_shares->get(type_id).toStringList();
235
if (l.contains(peer.id()))
237
l.removeAll(peer.id());
238
ret = m_shares->trySet(type_id, QVariant(l));