Keep a shared_ptr on connected devices during the lifetime of their background processing threads

This commit is contained in:
David Sansome 2010-08-09 21:32:25 +00:00
parent 4e12ef71c8
commit 43a27979dc
7 changed files with 34 additions and 11 deletions

View File

@ -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();

View File

@ -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_) {

View File

@ -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_;

View File

@ -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:

View File

@ -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)));

View File

@ -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);

View File

@ -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_;