Fixed MSVC 11.0 (VS2012) project file.
[LameXP.git] / src / Model_Artwork.cpp
blob733b6fe9e0130a9c708dab1c75b13c8ef9cd90ee
1 ///////////////////////////////////////////////////////////////////////////////
2 // LameXP - Audio Encoder Front-End
3 // Copyright (C) 2004-2014 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.
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.
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.
20 // http://www.gnu.org/licenses/gpl-2.0.txt
21 ///////////////////////////////////////////////////////////////////////////////
23 #include "Model_Artwork.h"
25 #include "Global.h"
27 #include <QFile>
28 #include <QMutex>
29 #include <QMutexLocker>
31 ////////////////////////////////////////////////////////////
32 // Shared data class
33 ////////////////////////////////////////////////////////////
35 class ArtworkModel_SharedData
37 friend ArtworkModel;
39 protected:
40 ArtworkModel_SharedData(const QString &filePath, const bool isOwner)
42 m_isOwner(isOwner),
43 m_filePath(filePath),
44 m_fileHandle(NULL)
46 m_referenceCounter = 1;
48 if(!m_filePath.isEmpty())
50 QFile *file = new QFile(m_filePath);
51 if(file->open(QIODevice::ReadOnly))
53 m_fileHandle = file;
55 else
57 qWarning("[ArtworkModel] Failed to open artwork file!");
58 LAMEXP_DELETE(file);
63 ~ArtworkModel_SharedData(void)
65 if(m_fileHandle)
67 if(m_isOwner)
69 m_fileHandle->remove();
71 m_fileHandle->close();
72 LAMEXP_DELETE(m_fileHandle);
76 static ArtworkModel_SharedData *attach(ArtworkModel_SharedData *ptr)
78 if(ptr)
80 QMutexLocker lock(&s_mutex);
81 ptr->m_referenceCounter = ptr->m_referenceCounter + 1;
82 return ptr;
84 return NULL;
87 static void detach(ArtworkModel_SharedData **ptr)
89 if(*ptr)
91 QMutexLocker lock(&s_mutex);
92 if((*ptr)->m_referenceCounter > 0)
94 (*ptr)->m_referenceCounter = (*ptr)->m_referenceCounter - 1;
95 if((*ptr)->m_referenceCounter < 1)
97 delete (*ptr);
100 else
102 qWarning("[ArtworkModel::detach] Ref counter already zero!");
104 *ptr = NULL;
108 const QString m_filePath;
109 const bool m_isOwner;
110 QFile *m_fileHandle;
111 unsigned int m_referenceCounter;
113 static QMutex s_mutex;
116 QMutex ArtworkModel_SharedData::s_mutex;
118 ////////////////////////////////////////////////////////////
119 // Constructor & Destructor
120 ////////////////////////////////////////////////////////////
122 ArtworkModel::ArtworkModel(void)
124 m_mutex(new QMutex)
126 m_data = NULL;
129 ArtworkModel::ArtworkModel(const QString &fileName, bool isOwner)
131 m_mutex(new QMutex)
133 m_data = new ArtworkModel_SharedData(fileName, isOwner);
136 ArtworkModel::ArtworkModel(const ArtworkModel &model)
138 m_mutex(new QMutex)
140 m_data = ArtworkModel_SharedData::attach(model.m_data);
143 ArtworkModel &ArtworkModel::operator=(const ArtworkModel &model)
145 QMutexLocker lock(m_mutex);
146 if(m_data != model.m_data)
148 ArtworkModel_SharedData::detach(&m_data);
149 m_data = ArtworkModel_SharedData::attach(model.m_data);
151 return (*this);
154 ArtworkModel::~ArtworkModel(void)
156 QMutexLocker lock(m_mutex);
157 ArtworkModel_SharedData::detach(&m_data);
158 lock.unlock();
159 LAMEXP_DELETE(m_mutex);
162 ////////////////////////////////////////////////////////////
163 // Public Functions
164 ////////////////////////////////////////////////////////////
166 const QString &ArtworkModel::filePath(void) const
168 QMutexLocker lock(m_mutex);
169 return (m_data) ? m_data->m_filePath : m_nullString;
172 bool ArtworkModel::isOwner(void) const
174 QMutexLocker lock(m_mutex);
175 return (m_data) ? m_data->m_isOwner : false;
178 void ArtworkModel::setFilePath(const QString &newPath, bool isOwner)
180 QMutexLocker lock(m_mutex);
181 ArtworkModel_SharedData::detach(&m_data);
182 if(!newPath.isEmpty())
184 m_data = new ArtworkModel_SharedData(newPath, isOwner);
188 void ArtworkModel::clear(void)
190 QMutexLocker lock(m_mutex);
191 ArtworkModel_SharedData::detach(&m_data);