1 #pragma once
2 
3 #include <QStringListModel>
4 #include <QtSql>
5 #include <QFuture>
6 #include <QtConcurrentRun>
7 #include <QFutureWatcher>
8 #include <QPointer>
9 
10 #include "library/baseexternallibraryfeature.h"
11 #include "library/trackcollection.h"
12 #include "library/treeitemmodel.h"
13 #include "library/treeitem.h"
14 
15 class BaseExternalTrackModel;
16 class BaseExternalPlaylistModel;
17 class WLibrarySidebar;
18 
19 class ITunesFeature : public BaseExternalLibraryFeature {
20     Q_OBJECT
21  public:
22     ITunesFeature(Library* pLibrary, UserSettingsPointer pConfig);
23     virtual ~ITunesFeature();
24     static bool isSupported();
25 
26     QVariant title() override;
27     QIcon getIcon() override;
28     void bindSidebarWidget(WLibrarySidebar* pSidebarWidget) override;
29 
30     TreeItemModel* getChildModel() override;
31 
32   public slots:
33     void activate() override;
34     void activate(bool forceReload);
35     void activateChild(const QModelIndex& index) override;
36     void onRightClick(const QPoint& globalPos) override;
37     void onTrackCollectionLoaded();
38 
39   private:
40     BaseSqlTableModel* getPlaylistModelForPlaylist(const QString& playlist) override;
41     static QString getiTunesMusicPath();
42     // returns the invisible rootItem for the sidebar model
43     TreeItem* importLibrary();
44     void guessMusicLibraryMountpoint(QXmlStreamReader& xml);
45     void parseTracks(QXmlStreamReader& xml);
46     void parseTrack(QXmlStreamReader& xml, QSqlQuery& query);
47     TreeItem* parsePlaylists(QXmlStreamReader &xml);
48     void parsePlaylist(QXmlStreamReader& xml, QSqlQuery& query1,
49                        QSqlQuery &query2, TreeItem*);
50     void clearTable(const QString& table_name);
51     bool readNextStartElement(QXmlStreamReader& xml);
52 
53     BaseExternalTrackModel* m_pITunesTrackModel;
54     BaseExternalPlaylistModel* m_pITunesPlaylistModel;
55     TreeItemModel m_childModel;
56     QStringList m_playlists;
57     // a new DB connection for the worker thread
58     QSqlDatabase m_database;
59     bool m_cancelImport;
60     bool m_isActivated;
61     QString m_dbfile;
62 
63     QFutureWatcher<TreeItem*> m_future_watcher;
64     QFuture<TreeItem*> m_future;
65     QString m_title;
66 
67     QString m_dbItunesRoot;
68     QString m_mixxxItunesRoot;
69 
70     QSharedPointer<BaseTrackCache> m_trackSource;
71     QPointer<WLibrarySidebar> m_pSidebarWidget;
72     QIcon m_icon;
73 };
74