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);
|
||||
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_);
|
||||
|
||||
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
|
||||
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_song_type(Song::Type_Stream);
|
||||
loader_->moveToThread(loader_thread_);
|
||||
|
@ -139,7 +141,7 @@ void AfcDevice::FinaliseDatabase() {
|
|||
|
||||
// Copy the files back to the iPod
|
||||
// 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_);
|
||||
bool success = transfer.CopyToDevice();
|
||||
|
|
|
@ -25,8 +25,9 @@
|
|||
#include <boost/scoped_ptr.hpp>
|
||||
|
||||
AfcTransfer::AfcTransfer(const QString& uuid, const QString& local_destination,
|
||||
TaskManager* task_manager, QObject* parent)
|
||||
: QObject(parent),
|
||||
TaskManager* task_manager, boost::shared_ptr<ConnectedDevice> device)
|
||||
: QObject(NULL),
|
||||
device_(device),
|
||||
task_manager_(task_manager),
|
||||
uuid_(uuid),
|
||||
local_destination_(local_destination)
|
||||
|
@ -38,6 +39,9 @@ AfcTransfer::AfcTransfer(const QString& uuid, const QString& local_destination,
|
|||
important_directories_ << "/iTunes_Control/iTunes";
|
||||
}
|
||||
|
||||
AfcTransfer::~AfcTransfer() {
|
||||
}
|
||||
|
||||
void AfcTransfer::CopyFromDevice() {
|
||||
int task_id = 0;
|
||||
if (task_manager_) {
|
||||
|
|
|
@ -20,6 +20,9 @@
|
|||
#include <QObject>
|
||||
#include <QStringList>
|
||||
|
||||
#include <boost/shared_ptr.hpp>
|
||||
|
||||
class ConnectedDevice;
|
||||
class iMobileDeviceConnection;
|
||||
class TaskManager;
|
||||
|
||||
|
@ -30,7 +33,8 @@ class AfcTransfer : public QObject {
|
|||
|
||||
public:
|
||||
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();
|
||||
|
||||
|
@ -50,6 +54,7 @@ private:
|
|||
static bool Copy(QIODevice* source, QIODevice* destination);
|
||||
|
||||
private:
|
||||
boost::shared_ptr<ConnectedDevice> device_;
|
||||
QThread* original_thread_;
|
||||
|
||||
TaskManager* task_manager_;
|
||||
|
|
|
@ -23,13 +23,16 @@
|
|||
#include <QStringList>
|
||||
#include <QUrl>
|
||||
|
||||
#include <boost/enable_shared_from_this.hpp>
|
||||
|
||||
class Database;
|
||||
class DeviceLister;
|
||||
class DeviceManager;
|
||||
class LibraryBackend;
|
||||
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
|
||||
|
||||
public:
|
||||
|
|
|
@ -40,7 +40,8 @@ void GPodDevice::Init() {
|
|||
InitBackendDirectory(url_.path(), first_time_);
|
||||
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_);
|
||||
|
||||
connect(loader_, SIGNAL(Error(QString)), SIGNAL(Error(QString)));
|
||||
|
|
|
@ -14,6 +14,7 @@
|
|||
along with Clementine. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#include "connecteddevice.h"
|
||||
#include "gpodloader.h"
|
||||
#include "core/song.h"
|
||||
#include "core/taskmanager.h"
|
||||
|
@ -24,8 +25,9 @@
|
|||
#include <QtDebug>
|
||||
|
||||
GPodLoader::GPodLoader(const QString& mount_point, TaskManager* task_manager,
|
||||
LibraryBackend* backend, QObject *parent)
|
||||
: QObject(parent),
|
||||
LibraryBackend* backend, boost::shared_ptr<ConnectedDevice> device)
|
||||
: QObject(NULL),
|
||||
device_(device),
|
||||
mount_point_(mount_point),
|
||||
type_(Song::Type_Unknown),
|
||||
task_manager_(task_manager),
|
||||
|
@ -34,6 +36,9 @@ GPodLoader::GPodLoader(const QString& mount_point, TaskManager* task_manager,
|
|||
original_thread_ = thread();
|
||||
}
|
||||
|
||||
GPodLoader::~GPodLoader() {
|
||||
}
|
||||
|
||||
void GPodLoader::LoadDatabase() {
|
||||
int task_id = task_manager_->StartTask(tr("Loading iPod database"));
|
||||
emit TaskStarted(task_id);
|
||||
|
|
|
@ -24,6 +24,7 @@
|
|||
|
||||
#include "core/song.h"
|
||||
|
||||
class ConnectedDevice;
|
||||
class LibraryBackend;
|
||||
class TaskManager;
|
||||
|
||||
|
@ -32,7 +33,8 @@ class GPodLoader : public QObject {
|
|||
|
||||
public:
|
||||
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_song_type(Song::FileType type) { type_ = type; }
|
||||
|
@ -46,6 +48,7 @@ signals:
|
|||
void LoadFinished(Itdb_iTunesDB* db);
|
||||
|
||||
private:
|
||||
boost::shared_ptr<ConnectedDevice> device_;
|
||||
QThread* original_thread_;
|
||||
|
||||
QString mount_point_;
|
||||
|
|
Loading…
Reference in New Issue