1 /***************************************************************************
3 * Open \______ \ ____ ____ | | _\_ |__ _______ ___
4 * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
5 * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
6 * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
9 * Copyright (C) 2007 by Dominik Wenger
12 * All files in this archive are subject to the GNU General Public License.
13 * See the file COPYING in the source tree root for full license agreement.
15 * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
16 * KIND, either express or implied.
18 ****************************************************************************/
21 #include "rbsettings.h"
23 TalkFileCreator::TalkFileCreator(QObject
* parent
): QObject(parent
)
28 //! \brief Creates Talkfiles.
30 //! \param logger A pointer to a Loggerobject
31 bool TalkFileCreator::createTalkFiles()
36 emit
logItem(tr("Starting Talk file generation"),LOGINFO
);
37 emit
logProgress(0,0);
38 QCoreApplication::processEvents();
40 // read in Maps of paths - file/dirnames
41 emit
logItem(tr("Reading Filelist..."),LOGINFO
);
42 if(createTalkList(m_dir
) == false)
44 emit
logItem(tr("Talk file creation aborted"),LOGERROR
);
48 QCoreApplication::processEvents();
52 TalkGenerator
generator(this);
53 connect(&generator
,SIGNAL(done(bool)),this,SIGNAL(done(bool)));
54 connect(&generator
,SIGNAL(logItem(QString
,int)),this,SIGNAL(logItem(QString
,int)));
55 connect(&generator
,SIGNAL(logProgress(int,int)),this,SIGNAL(logProgress(int,int)));
56 connect(this,SIGNAL(aborted()),&generator
,SLOT(abort()));
58 if(generator
.process(&m_talkList
) == TalkGenerator::eERROR
)
66 emit
logItem(tr("Copying Talkfiles..."),LOGINFO
);
67 if(copyTalkFiles(&errStr
) == false)
69 emit
logItem(errStr
,LOGERROR
);
74 // Deleting left overs
78 emit
logItem(tr("Finished creating Talk files"),LOGOK
);
79 emit
logProgress(1,1);
85 //! \brief Strips everything after and including the last dot in a string. If there is no dot, nothing is changed
87 //! \param filename The filename from which to strip the Extension
88 //! \returns the modified string
89 QString
TalkFileCreator::stripExtension(QString filename
)
91 if(filename
.lastIndexOf(".") != -1)
92 return filename
.left(filename
.lastIndexOf("."));
97 //! \brief Does needed Tasks when we need to abort. Cleans up Files. Stops the Logger, Stops TTS and Encoder
99 void TalkFileCreator::doAbort()
102 emit
logProgress(0,1);
105 //! \brief creates a list of what to generate
107 //! \param startDir The directory from which to start scanning
108 bool TalkFileCreator::createTalkList(QDir startDir
)
113 QDirIterator::IteratorFlags flags
= QDirIterator::NoIteratorFlags
;
115 flags
= QDirIterator::Subdirectories
;
117 QDirIterator
it(startDir
,flags
);
119 //create temp directory
120 QDir
tempDir(QDir::tempPath()+ "/talkfiles/");
121 if(!tempDir
.exists())
122 tempDir
.mkpath(QDir::tempPath()+ "/talkfiles/");
124 // read in Maps of paths - file/dirnames
133 QFileInfo fileInf
= it
.fileInfo();
138 QDir dir
= fileInf
.dir();
141 if(!dir
.dirName().isEmpty() && m_talkFolders
)
143 TalkGenerator::TalkEntry entry
;
144 entry
.toSpeak
= dir
.dirName();
145 entry
.wavfilename
= QDir::tempPath()+ "/talkfiles/" + QCryptographicHash::hash(entry
.toSpeak
.toUtf8(),
146 QCryptographicHash::Md5
).toHex() + ".wav";
147 entry
.talkfilename
= QDir::tempPath()+ "/talkfiles/" + QCryptographicHash::hash(entry
.toSpeak
.toUtf8(),
148 QCryptographicHash::Md5
).toHex() + ".talk";
149 entry
.target
= dir
.path() + "/_dirname.talk";
150 entry
.voiced
= false;
151 entry
.encoded
= false;
152 qDebug() << "toSpeak: " << entry
.toSpeak
<< " target: " << entry
.target
<< " intermediates: " <<
153 entry
.wavfilename
<< entry
.talkfilename
;
154 m_talkList
.append(entry
);
160 if( !fileInf
.fileName().isEmpty() && !fileInf
.fileName().endsWith(".talk") && m_talkFiles
)
162 TalkGenerator::TalkEntry entry
;
163 if(m_stripExtensions
)
164 entry
.toSpeak
= stripExtension(fileInf
.fileName());
166 entry
.toSpeak
= fileInf
.fileName();
167 entry
.wavfilename
= QDir::tempPath()+ "/talkfiles/" + QCryptographicHash::hash(entry
.toSpeak
.toUtf8(),
168 QCryptographicHash::Md5
).toHex() + ".wav";
169 entry
.talkfilename
= QDir::tempPath()+ "/talkfiles/" + QCryptographicHash::hash(entry
.toSpeak
.toUtf8(),
170 QCryptographicHash::Md5
).toHex() + ".talk";
171 entry
.target
= fileInf
.path() + "/" + fileInf
.fileName() + ".talk";
172 entry
.voiced
= false;
173 entry
.encoded
= false;
174 qDebug() << "toSpeak: " << entry
.toSpeak
<< " target: " << entry
.target
<< " intermediates: " <<
175 entry
.wavfilename
<< entry
.talkfilename
;
176 m_talkList
.append(entry
);
179 QCoreApplication::processEvents();
185 //! \brief copys Talkfiles from the temp dir to the target. Progress and installlog is handled inside
187 //! \param errString Pointer to a QString where the error cause is written.
188 //! \returns true on success, false on error or user abort
189 bool TalkFileCreator::copyTalkFiles(QString
* errString
)
191 int progressMax
= m_talkList
.size();
193 emit
logProgress(m_progress
,progressMax
);
195 QSettings
installlog(m_mountpoint
+ "/.rockbox/rbutil.log", QSettings::IniFormat
, 0);
196 installlog
.beginGroup("talkfiles");
198 for(int i
=0; i
< m_talkList
.size(); i
++)
202 *errString
= tr("File copy aborted");
206 // skip not encoded files
207 if(m_talkList
[i
].encoded
== false)
209 emit
logProgress(++m_progress
,progressMax
);
210 continue; // this file was skipped in one of the previous steps
212 // remove target if it exists, and if we should overwrite it
213 if(m_overwriteTalk
&& QFile::exists(m_talkList
[i
].target
))
214 QFile::remove(m_talkList
[i
].target
);
217 qDebug() << "copying " << m_talkList
[i
].talkfilename
<< "to" << m_talkList
[i
].target
;
218 if(!QFile::copy(m_talkList
[i
].talkfilename
,m_talkList
[i
].target
))
220 *errString
= tr("Copying of %1 to %2 failed").arg(m_talkList
[i
].talkfilename
).arg(m_talkList
[i
].target
);
225 QString now
= QDate::currentDate().toString("yyyyMMdd");
226 installlog
.setValue(m_talkList
[i
].target
.remove(0,m_mountpoint
.length()),now
);
228 emit
logProgress(++m_progress
,progressMax
);
229 QCoreApplication::processEvents();
231 installlog
.endGroup();
237 //! \brief Cleans up Files potentially left in the temp dir
239 bool TalkFileCreator::cleanup()
241 emit
logItem(tr("Cleaning up.."),LOGINFO
);
243 for(int i
=0; i
< m_talkList
.size(); i
++)
245 if(QFile::exists(m_talkList
[i
].wavfilename
))
246 QFile::remove(m_talkList
[i
].wavfilename
);
247 if(QFile::exists(m_talkList
[i
].talkfilename
))
248 QFile::remove(m_talkList
[i
].talkfilename
);
250 QCoreApplication::processEvents();
252 emit
logItem(tr("Finished"),LOGINFO
);
256 //! \brief slot, which is connected to the abort of the Logger. Sets a flag, so Creating Talkfiles ends at the next possible position
258 void TalkFileCreator::abort()