Keep a shared_ptr on connected devices during the lifetime of their background processing threads
This commit is contained in:
parent
4e12ef71c8
commit
43a27979dc
|
@ -43,7 +43,8 @@ void AfcDevice::Init() {
|
||||||
InitBackendDirectory(local_path_, first_time_, false);
|
InitBackendDirectory(local_path_, first_time_, false);
|
||||||
model_->Init();
|
model_->Init();
|
||||||
|
|
||||||
transfer_ = new AfcTransfer(url_.host(), local_path_, manager_->task_manager());
|
transfer_ = new AfcTransfer(url_.host(), local_path_, manager_->task_manager(),
|
||||||
|
shared_from_this());
|
||||||
transfer_->moveToThread(loader_thread_);
|
transfer_->moveToThread(loader_thread_);
|
||||||
|
|
||||||
connect(transfer_, SIGNAL(TaskStarted(int)), SIGNAL(TaskStarted(int)));
|
connect(transfer_, SIGNAL(TaskStarted(int)), SIGNAL(TaskStarted(int)));
|
||||||
|
@ -62,7 +63,8 @@ void AfcDevice::CopyFinished(bool success) {
|
||||||
}
|
}
|
||||||
|
|
||||||
// Now load the songs from the local database
|
// Now load the songs from the local database
|
||||||
loader_ = new GPodLoader(local_path_, manager_->task_manager(), backend_);
|
loader_ = new GPodLoader(local_path_, manager_->task_manager(), backend_,
|
||||||
|
shared_from_this());
|
||||||
loader_->set_music_path_prefix("afc://" + url_.host());
|
loader_->set_music_path_prefix("afc://" + url_.host());
|
||||||
loader_->set_song_type(Song::Type_Stream);
|
loader_->set_song_type(Song::Type_Stream);
|
||||||
loader_->moveToThread(loader_thread_);
|
loader_->moveToThread(loader_thread_);
|
||||||
|
@ -139,7 +141,7 @@ void AfcDevice::FinaliseDatabase() {
|
||||||
|
|
||||||
// Copy the files back to the iPod
|
// Copy the files back to the iPod
|
||||||
// No need to start another thread since we're already in the organiser thread
|
// No need to start another thread since we're already in the organiser thread
|
||||||
AfcTransfer transfer(url_.host(), local_path_, NULL);
|
AfcTransfer transfer(url_.host(), local_path_, NULL, shared_from_this());
|
||||||
|
|
||||||
itdb_start_sync(db_);
|
itdb_start_sync(db_);
|
||||||
bool success = transfer.CopyToDevice();
|
bool success = transfer.CopyToDevice();
|
||||||
|
|
|
@ -25,8 +25,9 @@
|
||||||
#include <boost/scoped_ptr.hpp>
|
#include <boost/scoped_ptr.hpp>
|
||||||
|
|
||||||
AfcTransfer::AfcTransfer(const QString& uuid, const QString& local_destination,
|
AfcTransfer::AfcTransfer(const QString& uuid, const QString& local_destination,
|
||||||
TaskManager* task_manager, QObject* parent)
|
TaskManager* task_manager, boost::shared_ptr<ConnectedDevice> device)
|
||||||
: QObject(parent),
|
: QObject(NULL),
|
||||||
|
device_(device),
|
||||||
task_manager_(task_manager),
|
task_manager_(task_manager),
|
||||||
uuid_(uuid),
|
uuid_(uuid),
|
||||||
local_destination_(local_destination)
|
local_destination_(local_destination)
|
||||||
|
@ -38,6 +39,9 @@ AfcTransfer::AfcTransfer(const QString& uuid, const QString& local_destination,
|
||||||
important_directories_ << "/iTunes_Control/iTunes";
|
important_directories_ << "/iTunes_Control/iTunes";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
AfcTransfer::~AfcTransfer() {
|
||||||
|
}
|
||||||
|
|
||||||
void AfcTransfer::CopyFromDevice() {
|
void AfcTransfer::CopyFromDevice() {
|
||||||
int task_id = 0;
|
int task_id = 0;
|
||||||
if (task_manager_) {
|
if (task_manager_) {
|
||||||
|
|
|
@ -20,6 +20,9 @@
|
||||||
#include <QObject>
|
#include <QObject>
|
||||||
#include <QStringList>
|
#include <QStringList>
|
||||||
|
|
||||||
|
#include <boost/shared_ptr.hpp>
|
||||||
|
|
||||||
|
class ConnectedDevice;
|
||||||
class iMobileDeviceConnection;
|
class iMobileDeviceConnection;
|
||||||
class TaskManager;
|
class TaskManager;
|
||||||
|
|
||||||
|
@ -30,7 +33,8 @@ class AfcTransfer : public QObject {
|
||||||
|
|
||||||
public:
|
public:
|
||||||
AfcTransfer(const QString& uuid, const QString& local_destination,
|
AfcTransfer(const QString& uuid, const QString& local_destination,
|
||||||
TaskManager* task_manager, QObject* parent = 0);
|
TaskManager* task_manager, boost::shared_ptr<ConnectedDevice> device);
|
||||||
|
~AfcTransfer();
|
||||||
|
|
||||||
bool CopyToDevice();
|
bool CopyToDevice();
|
||||||
|
|
||||||
|
@ -50,6 +54,7 @@ private:
|
||||||
static bool Copy(QIODevice* source, QIODevice* destination);
|
static bool Copy(QIODevice* source, QIODevice* destination);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
boost::shared_ptr<ConnectedDevice> device_;
|
||||||
QThread* original_thread_;
|
QThread* original_thread_;
|
||||||
|
|
||||||
TaskManager* task_manager_;
|
TaskManager* task_manager_;
|
||||||
|
|
|
@ -23,13 +23,16 @@
|
||||||
#include <QStringList>
|
#include <QStringList>
|
||||||
#include <QUrl>
|
#include <QUrl>
|
||||||
|
|
||||||
|
#include <boost/enable_shared_from_this.hpp>
|
||||||
|
|
||||||
class Database;
|
class Database;
|
||||||
class DeviceLister;
|
class DeviceLister;
|
||||||
class DeviceManager;
|
class DeviceManager;
|
||||||
class LibraryBackend;
|
class LibraryBackend;
|
||||||
class LibraryModel;
|
class LibraryModel;
|
||||||
|
|
||||||
class ConnectedDevice : public QObject, public virtual MusicStorage {
|
class ConnectedDevice : public QObject, public virtual MusicStorage,
|
||||||
|
public boost::enable_shared_from_this<ConnectedDevice> {
|
||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
|
|
@ -40,7 +40,8 @@ void GPodDevice::Init() {
|
||||||
InitBackendDirectory(url_.path(), first_time_);
|
InitBackendDirectory(url_.path(), first_time_);
|
||||||
model_->Init();
|
model_->Init();
|
||||||
|
|
||||||
loader_ = new GPodLoader(url_.path(), manager_->task_manager(), backend_);
|
loader_ = new GPodLoader(url_.path(), manager_->task_manager(), backend_,
|
||||||
|
shared_from_this());
|
||||||
loader_->moveToThread(loader_thread_);
|
loader_->moveToThread(loader_thread_);
|
||||||
|
|
||||||
connect(loader_, SIGNAL(Error(QString)), SIGNAL(Error(QString)));
|
connect(loader_, SIGNAL(Error(QString)), SIGNAL(Error(QString)));
|
||||||
|
|
|
@ -14,6 +14,7 @@
|
||||||
along with Clementine. If not, see <http://www.gnu.org/licenses/>.
|
along with Clementine. If not, see <http://www.gnu.org/licenses/>.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#include "connecteddevice.h"
|
||||||
#include "gpodloader.h"
|
#include "gpodloader.h"
|
||||||
#include "core/song.h"
|
#include "core/song.h"
|
||||||
#include "core/taskmanager.h"
|
#include "core/taskmanager.h"
|
||||||
|
@ -24,8 +25,9 @@
|
||||||
#include <QtDebug>
|
#include <QtDebug>
|
||||||
|
|
||||||
GPodLoader::GPodLoader(const QString& mount_point, TaskManager* task_manager,
|
GPodLoader::GPodLoader(const QString& mount_point, TaskManager* task_manager,
|
||||||
LibraryBackend* backend, QObject *parent)
|
LibraryBackend* backend, boost::shared_ptr<ConnectedDevice> device)
|
||||||
: QObject(parent),
|
: QObject(NULL),
|
||||||
|
device_(device),
|
||||||
mount_point_(mount_point),
|
mount_point_(mount_point),
|
||||||
type_(Song::Type_Unknown),
|
type_(Song::Type_Unknown),
|
||||||
task_manager_(task_manager),
|
task_manager_(task_manager),
|
||||||
|
@ -34,6 +36,9 @@ GPodLoader::GPodLoader(const QString& mount_point, TaskManager* task_manager,
|
||||||
original_thread_ = thread();
|
original_thread_ = thread();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
GPodLoader::~GPodLoader() {
|
||||||
|
}
|
||||||
|
|
||||||
void GPodLoader::LoadDatabase() {
|
void GPodLoader::LoadDatabase() {
|
||||||
int task_id = task_manager_->StartTask(tr("Loading iPod database"));
|
int task_id = task_manager_->StartTask(tr("Loading iPod database"));
|
||||||
emit TaskStarted(task_id);
|
emit TaskStarted(task_id);
|
||||||
|
|
|
@ -24,6 +24,7 @@
|
||||||
|
|
||||||
#include "core/song.h"
|
#include "core/song.h"
|
||||||
|
|
||||||
|
class ConnectedDevice;
|
||||||
class LibraryBackend;
|
class LibraryBackend;
|
||||||
class TaskManager;
|
class TaskManager;
|
||||||
|
|
||||||
|
@ -32,7 +33,8 @@ class GPodLoader : public QObject {
|
||||||
|
|
||||||
public:
|
public:
|
||||||
GPodLoader(const QString& mount_point, TaskManager* task_manager,
|
GPodLoader(const QString& mount_point, TaskManager* task_manager,
|
||||||
LibraryBackend* backend, QObject* parent = 0);
|
LibraryBackend* backend, boost::shared_ptr<ConnectedDevice> device);
|
||||||
|
~GPodLoader();
|
||||||
|
|
||||||
void set_music_path_prefix(const QString& prefix) { path_prefix_ = prefix; }
|
void set_music_path_prefix(const QString& prefix) { path_prefix_ = prefix; }
|
||||||
void set_song_type(Song::FileType type) { type_ = type; }
|
void set_song_type(Song::FileType type) { type_ = type; }
|
||||||
|
@ -46,6 +48,7 @@ signals:
|
||||||
void LoadFinished(Itdb_iTunesDB* db);
|
void LoadFinished(Itdb_iTunesDB* db);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
boost::shared_ptr<ConnectedDevice> device_;
|
||||||
QThread* original_thread_;
|
QThread* original_thread_;
|
||||||
|
|
||||||
QString mount_point_;
|
QString mount_point_;
|
||||||
|
|
Loading…
Reference in New Issue