OSDN Git Service

Do not set Title or Cover Art for the global meta info object, when assigning the...
[lamexp/LameXP.git] / src / Model_Artwork.cpp
1 ///////////////////////////////////////////////////////////////////////////////
2 // LameXP - Audio Encoder Front-End
3 // Copyright (C) 2004-2013 LoRd_MuldeR <MuldeR2@GMX.de>
4 //
5 // This program is free software; you can redistribute it and/or modify
6 // it under the terms of the GNU General Public License as published by
7 // the Free Software Foundation; either version 2 of the License, or
8 // (at your option) any later version, but always including the *additional*
9 // restrictions defined in the "License.txt" file.
10 //
11 // This program is distributed in the hope that it will be useful,
12 // but WITHOUT ANY WARRANTY; without even the implied warranty of
13 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14 // GNU General Public License for more details.
15 //
16 // You should have received a copy of the GNU General Public License along
17 // with this program; if not, write to the Free Software Foundation, Inc.,
18 // 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
19 //
20 // http://www.gnu.org/licenses/gpl-2.0.txt
21 ///////////////////////////////////////////////////////////////////////////////
22
23 #include "Model_Artwork.h"
24
25 #include "Global.h"
26
27 #include <QFile>
28 #include <QMutex>
29 #include <QMutexLocker>
30
31 ////////////////////////////////////////////////////////////
32 // Shared data class
33 ////////////////////////////////////////////////////////////
34
35 class ArtworkModel_SharedData
36 {
37         friend ArtworkModel;
38
39 protected:
40         ArtworkModel_SharedData(const QString &filePath, const bool isOwner)
41         :
42                 m_isOwner(isOwner),
43                 m_filePath(filePath),
44                 m_fileHandle(NULL)
45         {
46                 m_referenceCounter = 1;
47
48                 if(!m_filePath.isEmpty())
49                 {
50                         QFile *file = new QFile(m_filePath);
51                         if(file->open(QIODevice::ReadOnly))
52                         {
53                                 m_fileHandle = file;
54                         }
55                         else
56                         {
57                                 qWarning("[ArtworkModel] Failed to open artwork file!");
58                                 LAMEXP_DELETE(file);
59                         }
60                 }
61         }
62
63         ~ArtworkModel_SharedData(void)
64         {
65                 if(m_fileHandle)
66                 {
67                         if(m_isOwner)
68                         {
69                                 m_fileHandle->remove();
70                         }
71                         m_fileHandle->close();
72                         LAMEXP_DELETE(m_fileHandle);
73                 }
74         }
75
76         static ArtworkModel_SharedData *attach(ArtworkModel_SharedData *ptr)
77         {
78                 if(ptr)
79                 {
80                         QMutexLocker lock(&s_mutex);
81                         ptr->m_referenceCounter = ptr->m_referenceCounter + 1;
82                         return ptr;
83                 }
84                 return NULL;
85         }
86
87         static void detach(ArtworkModel_SharedData **ptr)
88         {
89                 if(*ptr)
90                 {
91                         QMutexLocker lock(&s_mutex);
92                         if((*ptr)->m_referenceCounter > 0)
93                         {
94                                 (*ptr)->m_referenceCounter = (*ptr)->m_referenceCounter - 1;
95                                 if((*ptr)->m_referenceCounter < 1)
96                                 {
97                                         delete (*ptr);
98                                 }
99                         }
100                         else
101                         {
102                                 qWarning("[ArtworkModel::detach] Ref counter already zero!");
103                         }
104                         *ptr = NULL;
105                 }
106         }
107
108         const QString m_filePath;
109         const bool m_isOwner;
110         QFile *m_fileHandle;
111         unsigned int m_referenceCounter;
112
113         static QMutex s_mutex;
114 };
115
116 QMutex ArtworkModel_SharedData::s_mutex;
117
118 ////////////////////////////////////////////////////////////
119 // Constructor & Destructor
120 ////////////////////////////////////////////////////////////
121
122 ArtworkModel::ArtworkModel(void)
123 :
124         m_mutex(new QMutex)
125 {
126         m_data = NULL;
127 }
128
129 ArtworkModel::ArtworkModel(const QString &fileName, bool isOwner)
130 :
131         m_mutex(new QMutex)
132 {
133         m_data = new ArtworkModel_SharedData(fileName, isOwner);
134 }
135
136 ArtworkModel::ArtworkModel(const ArtworkModel &model)
137 :
138         m_mutex(new QMutex)
139 {
140         m_data = ArtworkModel_SharedData::attach(model.m_data);
141 }
142
143 ArtworkModel &ArtworkModel::operator=(const ArtworkModel &model)
144 {
145         QMutexLocker lock(m_mutex);
146         if(m_data != model.m_data)
147         {
148                 ArtworkModel_SharedData::detach(&m_data);
149                 m_data = ArtworkModel_SharedData::attach(model.m_data);
150         }
151         return (*this);
152 }
153
154 ArtworkModel::~ArtworkModel(void)
155 {
156         QMutexLocker lock(m_mutex);
157         ArtworkModel_SharedData::detach(&m_data);
158         lock.unlock();
159         LAMEXP_DELETE(m_mutex);
160 }
161
162 ////////////////////////////////////////////////////////////
163 // Public Functions
164 ////////////////////////////////////////////////////////////
165
166 const QString &ArtworkModel::filePath(void) const
167 {
168         QMutexLocker lock(m_mutex);
169         return (m_data) ? m_data->m_filePath : m_nullString;
170 }
171
172 bool ArtworkModel::isOwner(void) const
173 {
174         QMutexLocker lock(m_mutex);
175         return (m_data) ? m_data->m_isOwner : false;
176 }
177
178 void ArtworkModel::setFilePath(const QString &newPath, bool isOwner)
179 {
180         QMutexLocker lock(m_mutex);
181         ArtworkModel_SharedData::detach(&m_data);
182         if(!newPath.isEmpty())
183         {
184                 m_data = new ArtworkModel_SharedData(newPath, isOwner);
185         }
186 }
187
188 void ArtworkModel::clear(void)
189 {
190         QMutexLocker lock(m_mutex);
191         ArtworkModel_SharedData::detach(&m_data);
192 }