OSDN Git Service

Updated "success" sound.
[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.
9 //
10 // This program is distributed in the hope that it will be useful,
11 // but WITHOUT ANY WARRANTY; without even the implied warranty of
12 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13 // GNU General Public License for more details.
14 //
15 // You should have received a copy of the GNU General Public License along
16 // with this program; if not, write to the Free Software Foundation, Inc.,
17 // 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
18 //
19 // http://www.gnu.org/licenses/gpl-2.0.txt
20 ///////////////////////////////////////////////////////////////////////////////
21
22 #include "Model_Artwork.h"
23
24 #include "Global.h"
25
26 #include <QFile>
27 #include <QMutex>
28 #include <QMutexLocker>
29
30 ////////////////////////////////////////////////////////////
31 // Shared data class
32 ////////////////////////////////////////////////////////////
33
34 class ArtworkModel_SharedData
35 {
36         friend ArtworkModel;
37
38 protected:
39         ArtworkModel_SharedData(const QString &filePath, const bool isOwner)
40         :
41                 m_isOwner(isOwner),
42                 m_filePath(filePath),
43                 m_fileHandle(NULL)
44         {
45                 m_referenceCounter = 1;
46
47                 if(!m_filePath.isEmpty())
48                 {
49                         QFile *file = new QFile(m_filePath);
50                         if(file->open(QIODevice::ReadOnly))
51                         {
52                                 m_fileHandle = file;
53                                 return;
54                         }
55                         LAMEXP_DELETE(file);
56                 }
57         }
58
59         ~ArtworkModel_SharedData(void)
60         {
61                 if(m_fileHandle)
62                 {
63                         if(m_isOwner)
64                         {
65                                 m_fileHandle->remove();
66                         }
67                         m_fileHandle->close();
68                         LAMEXP_DELETE(m_fileHandle);
69                 }
70         }
71
72         static ArtworkModel_SharedData *attach(ArtworkModel_SharedData *ptr)
73         {
74                 if(ptr)
75                 {
76                         QMutexLocker lock(&s_mutex);
77                         ptr->m_referenceCounter = ptr->m_referenceCounter + 1;
78                         return ptr;
79                 }
80                 return NULL;
81         }
82
83         static void detach(ArtworkModel_SharedData **ptr)
84         {
85                 if(*ptr)
86                 {
87                         QMutexLocker lock(&s_mutex);
88                         (*ptr)->m_referenceCounter = (*ptr)->m_referenceCounter - 1;
89                         if((*ptr)->m_referenceCounter < 1)
90                         {
91                                 delete (*ptr);
92                         }
93                         *ptr = NULL;
94                 }
95         }
96
97         const QString m_filePath;
98         const bool m_isOwner;
99         QFile *m_fileHandle;
100         unsigned int m_referenceCounter;
101
102         static QMutex s_mutex;
103 };
104
105 QMutex ArtworkModel_SharedData::s_mutex;
106
107 ////////////////////////////////////////////////////////////
108 // Constructor & Destructor
109 ////////////////////////////////////////////////////////////
110
111 ArtworkModel::ArtworkModel(void)
112 :
113         m_mutex(new QMutex)
114 {
115         m_data = NULL;
116 }
117
118 ArtworkModel::ArtworkModel(const QString &fileName, bool isOwner)
119 :
120         m_mutex(new QMutex)
121 {
122         m_data = new ArtworkModel_SharedData(fileName, isOwner);
123 }
124
125 ArtworkModel::ArtworkModel(const ArtworkModel &model)
126 :
127         m_mutex(new QMutex)
128 {
129         m_data = ArtworkModel_SharedData::attach(model.m_data);
130 }
131
132 ArtworkModel &ArtworkModel::operator=(const ArtworkModel &model)
133 {
134         QMutexLocker lock(m_mutex);
135         ArtworkModel_SharedData::detach(&m_data);
136         m_data = ArtworkModel_SharedData::attach(model.m_data);
137         return (*this);
138 }
139
140 ArtworkModel::~ArtworkModel(void)
141 {
142         QMutexLocker lock(m_mutex);
143         ArtworkModel_SharedData::detach(&m_data);
144         lock.unlock();
145         LAMEXP_DELETE(m_mutex);
146 }
147
148 ////////////////////////////////////////////////////////////
149 // Public Functions
150 ////////////////////////////////////////////////////////////
151
152 const QString &ArtworkModel::filePath(void) const
153 {
154         QMutexLocker lock(m_mutex);
155         return (m_data) ? m_data->m_filePath : m_nullString;
156 }
157
158 bool ArtworkModel::isOwner(void) const
159 {
160         QMutexLocker lock(m_mutex);
161         return (m_data) ? m_data->m_isOwner : false;
162 }
163
164 void ArtworkModel::setFilePath(const QString &newPath, bool isOwner)
165 {
166         QMutexLocker lock(m_mutex);
167         ArtworkModel_SharedData::detach(&m_data);
168         m_data = new ArtworkModel_SharedData(newPath, isOwner);
169 }
170
171 void ArtworkModel::clear(void)
172 {
173         QMutexLocker lock(m_mutex);
174         ArtworkModel_SharedData::detach(&m_data);
175 }