Ubuntu Download Manager  0.6.0
A session-wide downloading service
 All Classes Namespaces Files Functions Typedefs Enumerations Enumerator
manager_impl.cpp
Go to the documentation of this file.
1 /*
2  * Copyright 2013-2014 Canonical Ltd.
3  *
4  * This library is free software; you can redistribute it and/or
5  * modify it under the terms of version 3 of the GNU Lesser General Public
6  * License as published by the Free Software Foundation.
7  *
8  * This program is distributed in the hope that it will be useful,
9  * but WITHOUT ANY WARRANTY; without even the implied warranty of
10  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
11  * General Public License for more details.
12  *
13  * You should have received a copy of the GNU Lesser General Public
14  * License along with this library; if not, write to the
15  * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
16  * Boston, MA 02110-1301, USA.
17  */
18 
22 
23 #include "manager_impl.h"
24 
25 
26 namespace {
27  const QString MANAGER_PATH = "/";
28 }
29 
30 namespace Ubuntu {
31 
32 namespace DownloadManager {
33 
34 using namespace Logging;
35 
36 ManagerImpl::ManagerImpl(const QDBusConnection& conn,
37  const QString& path,
38  QObject* parent)
39  : Manager(parent),
40  _conn(conn),
41  _servicePath(path) {
42  _dbusInterface = new ManagerInterface(path, MANAGER_PATH, conn);
43  init();
44 }
45 
46 // used for testing purposes
47 ManagerImpl::ManagerImpl(const QDBusConnection& conn,
48  const QString& path,
49  ManagerInterface* interface,
50  QObject* parent)
51  : Manager(parent),
52  _conn(conn),
53  _servicePath(path),
54  _dbusInterface(interface) {
55  init();
56 }
57 
58 ManagerImpl::~ManagerImpl() {
59  delete _lastError;
60  delete _dbusInterface;
61 }
62 
63 void
64 ManagerImpl::init() {
65  qRegisterMetaType<Download*>("Download*");
66  qRegisterMetaType<GroupDownload*>("GroupDownload*");
67  qRegisterMetaType<Error*>("Error*");
68  qRegisterMetaType<DBusError*>("DBusError*");
69  qRegisterMetaType<HttpError*>("HttpError*");
70  qRegisterMetaType<NetworkError*>("NetworkError*");
71  qRegisterMetaType<AuthError*>("AuthError*");
72  qRegisterMetaType<ProcessError*>("ProcessError*");
73  qRegisterMetaType<DownloadsList*>("DownloadsList*");
74  qDBusRegisterMetaType<StringMap>();
75  qDBusRegisterMetaType<DownloadStruct>();
76  qDBusRegisterMetaType<GroupDownloadStruct>();
77  qDBusRegisterMetaType<StructList>();
78  qDBusRegisterMetaType<AuthErrorStruct>();
79  qDBusRegisterMetaType<HttpErrorStruct>();
80  qDBusRegisterMetaType<NetworkErrorStruct>();
81  qDBusRegisterMetaType<ProcessErrorStruct>();
82 }
83 
84 Download*
85 ManagerImpl::getDownloadForId(const QString& id) {
86  Logger::log(Logger::Debug, QString("Manager getDownloadForId(%1)").arg(id));
87  auto down = new DownloadImpl(_conn, _servicePath, QDBusObjectPath(id));
88  return down;
89 }
90 
91 void
92 ManagerImpl::createDownload(DownloadStruct downStruct) {
93  Logger::log(Logger::Debug, "Manager createDownload(%1)", downStruct);
94  DownloadCb cb = [](Download*) {};
95  createDownload(downStruct, cb, cb);
96 }
97 
98 void
99 ManagerImpl::createDownload(DownloadStruct downStruct,
100  DownloadCb cb,
101  DownloadCb errCb) {
102  QDBusPendingCall call =
103  _dbusInterface->createDownload(downStruct);
104  auto watcher = new DownloadManagerPCW(_conn,
105  _servicePath, call, cb, errCb, this);
106  auto connected = connect(watcher, &DownloadManagerPCW::callbackExecuted,
107  this, &ManagerImpl::onWatcherDone);
108  if (!connected) {
109  Logger::log(Logger::Critical,
110  "Could not connect to signal &DownloadManagerPCW::callbackExecuted,");
111  }
112 }
113 
114 void
115 ManagerImpl::createDownload(StructList downs,
116  const QString& algorithm,
117  bool allowed3G,
118  const QVariantMap& metadata,
119  StringMap headers) {
120  GroupCb cb = [](GroupDownload*) {};
121  createDownload(downs, algorithm, allowed3G, metadata, headers, cb, cb);
122 }
123 
124 void
125 ManagerImpl::createDownload(StructList downs,
126  const QString& algorithm,
127  bool allowed3G,
128  const QVariantMap& metadata,
129  StringMap headers,
130  GroupCb cb,
131  GroupCb errCb) {
132  QDBusPendingCall call =
133  _dbusInterface->createDownloadGroup(downs,
134  algorithm, allowed3G, metadata, headers);
135  auto watcher = new GroupManagerPCW(_conn, _servicePath,
136  call, cb, errCb, this);
137  auto connected = connect(watcher, &GroupManagerPCW::callbackExecuted,
138  this, &ManagerImpl::onWatcherDone);
139  if (!connected) {
140  Logger::log(Logger::Critical,
141  "Could not connect to signal &GroupManagerPCW::callbackExecuted");
142  }
143 }
144 
145 void
146 ManagerImpl::getAllDownloads() {
147  Logger::log(Logger::Debug, "Manager getAllDownloads()");
148  DownloadsListCb cb = [](DownloadsList*){};
149  getAllDownloads(cb, cb);
150 }
151 
152 void
153 ManagerImpl::getAllDownloads(DownloadsListCb cb, DownloadsListCb errCb) {
154  Logger::log(Logger::Debug, "Manager getAllDownloads()");
155  QDBusPendingCall call = _dbusInterface->getAllDownloads();
156  auto watcher = new DownloadsListManagerPCW(
157  _conn, _servicePath, call, cb, errCb, this);
158  auto connected = connect(watcher, &GroupManagerPCW::callbackExecuted,
159  this, &ManagerImpl::onWatcherDone);
160  if (!connected) {
161  Logger::log(Logger::Critical,
162  "Could not connect to signal");
163  }
164 }
165 
166 void
167 ManagerImpl::getAllDownloadsWithMetadata(const QString &name,
168  const QString &value) {
169  Logger::log(Logger::Debug,
170  QString("Manager getAllDownloadsWithMetadata(%1, %2)").arg(name).arg(value));
172  [](const QString&, const QString&, DownloadsList*){};
173  getAllDownloadsWithMetadata(name, value, cb, cb);
174 }
175 
176 void
177 ManagerImpl::getAllDownloadsWithMetadata(const QString &name,
178  const QString &value,
180  MetadataDownloadsListCb errCb) {
181  Logger::log(Logger::Debug,
182  QString("Manager getAllDownloadsWithMetadata(%1, %2)").arg(name).arg(value));
183  QDBusPendingCall call = _dbusInterface->getAllDownloadsWithMetadata(
184  name, value);
185  auto watcher = new MetadataDownloadsListManagerPCW(
186  _conn, _servicePath, call, name, value, cb, errCb, this);
187  auto connected = connect(watcher, &GroupManagerPCW::callbackExecuted,
188  this, &ManagerImpl::onWatcherDone);
189  if (!connected) {
190  Logger::log(Logger::Critical, "Could not connect to signal");
191  }
192 }
193 
194 bool
195 ManagerImpl::isError() const {
196  return _isError;
197 }
198 
199 Error*
200 ManagerImpl::lastError() const {
201  return _lastError;
202 }
203 
204 void
205 ManagerImpl::setLastError(const QDBusError& err) {
206  // delete the last if error if present to keep mem to a minimum
207  if (_lastError != nullptr) {
208  delete _lastError;
209  }
210  _lastError = new DBusError(err);
211  _isError = true;
212 }
213 
214 void
215 ManagerImpl::allowMobileDataDownload(bool allowed) {
216  Logger::log(Logger::Debug,
217  QString("Manager allowMobileDataDownload(%1)").arg(allowed));
218  QDBusPendingReply<> reply =
219  _dbusInterface->allowGSMDownload(allowed);
220  // we block but because we expect it to be fast
221  reply.waitForFinished();
222  if (reply.isError()) {
223  auto err = reply.error();
224  Logger::log(Logger::Critical, "Error setting mobile data");
225  setLastError(err);
226  }
227 }
228 
229 bool
230 ManagerImpl::isMobileDataDownload() {
231  Logger::log(Logger::Debug, "Manager isMobileDataDownload()");
232  QDBusPendingReply<bool> reply =
233  _dbusInterface->isGSMDownloadAllowed();
234  // we block but because we expect it to be fast
235  reply.waitForFinished();
236  if (reply.isError()) {
237  auto err = reply.error();
238  Logger::log(Logger::Error, "Error getting if mobile data is enabled");
239  setLastError(err);
240  return false;
241  } else {
242  return reply.value();
243  }
244 }
245 
246 qulonglong
247 ManagerImpl::defaultThrottle() {
248  Logger::log(Logger::Debug, "Manager defaultThrottle()");
249  QDBusPendingReply<qulonglong> reply =
250  _dbusInterface->defaultThrottle();
251  // we block but because we expect it to be fast
252  reply.waitForFinished();
253  if (reply.isError()) {
254  auto err = reply.error();
255  Logger::log(Logger::Error, "Error getting the default throttle");
256  setLastError(err);
257  return 0;
258  } else {
259  return reply.value();
260  }
261 }
262 
263 void
264 ManagerImpl::setDefaultThrottle(qulonglong speed) {
265  Logger::log(Logger::Debug,
266  QString("Manager setDefaultThrottle(%1)").arg(speed));
267  QDBusPendingReply<> reply =
268  _dbusInterface->setDefaultThrottle(speed);
269  // we block but because we expect it to be fast
270  reply.waitForFinished();
271  if (reply.isError()) {
272  auto err = reply.error();
273  Logger::log(Logger::Error, "Error setting default throttle");
274  setLastError(err);
275  }
276 }
277 
278 void
279 ManagerImpl::exit() {
280  Logger::log(Logger::Debug, "Manager exit()");
281  QDBusPendingReply<> reply =
282  _dbusInterface->exit();
283  // we block but because we expect it to be fast
284  reply.waitForFinished();
285  if (reply.isError()) {
286  auto err = reply.error();
287  Logger::log(Logger::Error, "Error setting killing the daemon");
288  setLastError(err);
289  }
290 }
291 
292 void
293 ManagerImpl::onWatcherDone() {
294  auto senderObj = sender();
295  senderObj->deleteLater();
296 }
297 
298 } // DownloadManager
299 
300 } // Ubuntu
std::function< void(Download *)> DownloadCb
Definition: manager.h:36
std::function< void(const QString &, const QString &, DownloadsList *)> MetadataDownloadsListCb
Definition: manager.h:54
std::function< void(GroupDownload *)> GroupCb
Definition: manager.h:60
std::function< void(DownloadsList *)> DownloadsListCb
Definition: manager.h:48