summaryrefslogtreecommitdiff
path: root/rbutil/rbutilqt
diff options
context:
space:
mode:
authorDominik Riebeling <Dominik.Riebeling@gmail.com>2009-06-09 21:46:05 +0000
committerDominik Riebeling <Dominik.Riebeling@gmail.com>2009-06-09 21:46:05 +0000
commit86041b1d330dfe933b9114ea0d0e252f27b1be59 (patch)
treec0ea83fe2bd2d1c2ee8af36ca20dcec99daf00a1 /rbutil/rbutilqt
parent0711190db13cebeb526246840d7160551cbfea45 (diff)
downloadrockbox-86041b1d330dfe933b9114ea0d0e252f27b1be59.tar.gz
rockbox-86041b1d330dfe933b9114ea0d0e252f27b1be59.zip
Make labels in generated TTS / Encoder setting dialogs translatable.
Code police: break some long lines, remove trailing spaces. git-svn-id: svn://svn.rockbox.org/rockbox/trunk@21237 a1c6a512-1295-4272-9138-f99709370657
Diffstat (limited to 'rbutil/rbutilqt')
-rw-r--r--rbutil/rbutilqt/base/encoders.cpp64
-rw-r--r--rbutil/rbutilqt/base/tts.cpp483
2 files changed, 283 insertions, 264 deletions
diff --git a/rbutil/rbutilqt/base/encoders.cpp b/rbutil/rbutilqt/base/encoders.cpp
index 59add74a0d..43c43a8a8f 100644
--- a/rbutil/rbutilqt/base/encoders.cpp
+++ b/rbutil/rbutilqt/base/encoders.cpp
@@ -79,20 +79,22 @@ QStringList EncBase::getEncoderList()
79EncExes::EncExes(QString name,QObject *parent) : EncBase(parent) 79EncExes::EncExes(QString name,QObject *parent) : EncBase(parent)
80{ 80{
81 m_name = name; 81 m_name = name;
82 82
83 m_TemplateMap["lame"] = "\"%exe\" %options \"%input\" \"%output\""; 83 m_TemplateMap["lame"] = "\"%exe\" %options \"%input\" \"%output\"";
84 84
85} 85}
86 86
87 87
88 88
89void EncExes::generateSettings() 89void EncExes::generateSettings()
90{ 90{
91 QString exepath =RbSettings::subValue(m_name,RbSettings::EncoderPath).toString(); 91 QString exepath =RbSettings::subValue(m_name,RbSettings::EncoderPath).toString();
92 if(exepath == "") exepath = findExecutable(m_name); 92 if(exepath == "") exepath = findExecutable(m_name);
93 93
94 insertSetting(eEXEPATH,new EncTtsSetting(this,EncTtsSetting::eSTRING,"Path to Encoder:",exepath,EncTtsSetting::eBROWSEBTN)); 94 insertSetting(eEXEPATH,new EncTtsSetting(this,EncTtsSetting::eSTRING,
95 insertSetting(eEXEOPTIONS,new EncTtsSetting(this,EncTtsSetting::eSTRING,"Encoder options:",RbSettings::subValue(m_name,RbSettings::EncoderOptions))); 95 tr("Path to Encoder:"),exepath,EncTtsSetting::eBROWSEBTN));
96 insertSetting(eEXEOPTIONS,new EncTtsSetting(this,EncTtsSetting::eSTRING,
97 tr("Encoder options:"),RbSettings::subValue(m_name,RbSettings::EncoderOptions)));
96} 98}
97 99
98void EncExes::saveSettings() 100void EncExes::saveSettings()
@@ -106,7 +108,7 @@ bool EncExes::start()
106{ 108{
107 m_EncExec = RbSettings::subValue(m_name, RbSettings::EncoderPath).toString(); 109 m_EncExec = RbSettings::subValue(m_name, RbSettings::EncoderPath).toString();
108 m_EncOpts = RbSettings::subValue(m_name, RbSettings::EncoderOptions).toString(); 110 m_EncOpts = RbSettings::subValue(m_name, RbSettings::EncoderOptions).toString();
109 111
110 m_EncTemplate = m_TemplateMap.value(m_name); 112 m_EncTemplate = m_TemplateMap.value(m_name);
111 113
112 QFileInfo enc(m_EncExec); 114 QFileInfo enc(m_EncExec);
@@ -138,10 +140,10 @@ bool EncExes::encode(QString input,QString output)
138bool EncExes::configOk() 140bool EncExes::configOk()
139{ 141{
140 QString path = RbSettings::subValue(m_name, RbSettings::EncoderPath).toString(); 142 QString path = RbSettings::subValue(m_name, RbSettings::EncoderPath).toString();
141 143
142 if (QFileInfo(path).exists()) 144 if (QFileInfo(path).exists())
143 return true; 145 return true;
144 146
145 return false; 147 return false;
146} 148}
147 149
@@ -150,46 +152,54 @@ bool EncExes::configOk()
150**********************************************************************/ 152**********************************************************************/
151EncRbSpeex::EncRbSpeex(QObject *parent) : EncBase(parent) 153EncRbSpeex::EncRbSpeex(QObject *parent) : EncBase(parent)
152{ 154{
153 155
154} 156}
155 157
156void EncRbSpeex::generateSettings() 158void EncRbSpeex::generateSettings()
157{ 159{
158 insertSetting(eVOLUME,new EncTtsSetting(this,EncTtsSetting::eDOUBLE,"Volume:",RbSettings::subValue("rbspeex",RbSettings::EncoderVolume),1.0,10.0)); 160 insertSetting(eVOLUME,new EncTtsSetting(this,EncTtsSetting::eDOUBLE,
159 insertSetting(eQUALITY,new EncTtsSetting(this,EncTtsSetting::eDOUBLE,"Quality:",RbSettings::subValue("rbspeex",RbSettings::EncoderQuality),0,10.0)); 161 tr("Volume:"),RbSettings::subValue("rbspeex",RbSettings::EncoderVolume),1.0,10.0));
160 insertSetting(eCOMPLEXITY,new EncTtsSetting(this,EncTtsSetting::eINT,"Complexity:",RbSettings::subValue("rbspeex",RbSettings::EncoderComplexity),0,10)); 162 insertSetting(eQUALITY,new EncTtsSetting(this,EncTtsSetting::eDOUBLE,
161 insertSetting(eNARROWBAND,new EncTtsSetting(this,EncTtsSetting::eBOOL,"Use Narrowband:",RbSettings::subValue("rbspeex",RbSettings::EncoderNarrowBand))); 163 tr("Quality:"),RbSettings::subValue("rbspeex",RbSettings::EncoderQuality),0,10.0));
164 insertSetting(eCOMPLEXITY,new EncTtsSetting(this,EncTtsSetting::eINT,
165 tr("Complexity:"),RbSettings::subValue("rbspeex",RbSettings::EncoderComplexity),0,10));
166 insertSetting(eNARROWBAND,new EncTtsSetting(this,EncTtsSetting::eBOOL,
167 tr("Use Narrowband:"),RbSettings::subValue("rbspeex",RbSettings::EncoderNarrowBand)));
162} 168}
163 169
164void EncRbSpeex::saveSettings() 170void EncRbSpeex::saveSettings()
165{ 171{
166 //save settings in user config 172 //save settings in user config
167 RbSettings::setSubValue("rbspeex",RbSettings::EncoderVolume,getSetting(eVOLUME)->current().toDouble()); 173 RbSettings::setSubValue("rbspeex",RbSettings::EncoderVolume,
168 RbSettings::setSubValue("rbspeex",RbSettings::EncoderQuality,getSetting(eQUALITY)->current().toDouble()); 174 getSetting(eVOLUME)->current().toDouble());
169 RbSettings::setSubValue("rbspeex",RbSettings::EncoderComplexity,getSetting(eCOMPLEXITY)->current().toInt()); 175 RbSettings::setSubValue("rbspeex",RbSettings::EncoderQuality,
170 RbSettings::setSubValue("rbspeex",RbSettings::EncoderNarrowBand,getSetting(eNARROWBAND)->current().toBool()); 176 getSetting(eQUALITY)->current().toDouble());
171 177 RbSettings::setSubValue("rbspeex",RbSettings::EncoderComplexity,
178 getSetting(eCOMPLEXITY)->current().toInt());
179 RbSettings::setSubValue("rbspeex",RbSettings::EncoderNarrowBand,
180 getSetting(eNARROWBAND)->current().toBool());
181
172 RbSettings::sync(); 182 RbSettings::sync();
173} 183}
174 184
175bool EncRbSpeex::start() 185bool EncRbSpeex::start()
176{ 186{
177 187
178 // try to get config from settings 188 // try to get config from settings
179 quality = RbSettings::subValue("rbspeex", RbSettings::EncoderQuality).toDouble(); 189 quality = RbSettings::subValue("rbspeex", RbSettings::EncoderQuality).toDouble();
180 complexity = RbSettings::subValue("rbspeex", RbSettings::EncoderComplexity).toInt(); 190 complexity = RbSettings::subValue("rbspeex", RbSettings::EncoderComplexity).toInt();
181 volume = RbSettings::subValue("rbspeex", RbSettings::EncoderVolume).toDouble(); 191 volume = RbSettings::subValue("rbspeex", RbSettings::EncoderVolume).toDouble();
182 narrowband = RbSettings::subValue("rbspeex", RbSettings::EncoderNarrowBand).toBool(); 192 narrowband = RbSettings::subValue("rbspeex", RbSettings::EncoderNarrowBand).toBool();
183 193
184 194
185 return true; 195 return true;
186} 196}
187 197
188bool EncRbSpeex::encode(QString input,QString output) 198bool EncRbSpeex::encode(QString input,QString output)
189{ 199{
190 qDebug() << "encoding " << input << " to "<< output; 200 qDebug() << "encoding " << input << " to "<< output;
191 char errstr[512]; 201 char errstr[512];
192 202
193 FILE *fin,*fout; 203 FILE *fin,*fout;
194 if ((fin = fopen(input.toLocal8Bit(), "rb")) == NULL) { 204 if ((fin = fopen(input.toLocal8Bit(), "rb")) == NULL) {
195 qDebug() << "Error: could not open input file\n"; 205 qDebug() << "Error: could not open input file\n";
@@ -219,16 +229,16 @@ bool EncRbSpeex::configOk()
219{ 229{
220 bool result=true; 230 bool result=true;
221 // check config 231 // check config
222 232
223 if(RbSettings::subValue("rbspeex", RbSettings::EncoderVolume).toDouble() <= 0) 233 if(RbSettings::subValue("rbspeex", RbSettings::EncoderVolume).toDouble() <= 0)
224 result =false; 234 result =false;
225 235
226 if(RbSettings::subValue("rbspeex", RbSettings::EncoderQuality).toDouble() <= 0) 236 if(RbSettings::subValue("rbspeex", RbSettings::EncoderQuality).toDouble() <= 0)
227 result =false; 237 result =false;
228 238
229 if(RbSettings::subValue("rbspeex", RbSettings::EncoderComplexity).toInt() <= 0) 239 if(RbSettings::subValue("rbspeex", RbSettings::EncoderComplexity).toInt() <= 0)
230 result =false; 240 result =false;
231 241
232 return result; 242 return result;
233} 243}
234 244
diff --git a/rbutil/rbutilqt/base/tts.cpp b/rbutil/rbutilqt/base/tts.cpp
index 5bc4c058c8..4b0727f78c 100644
--- a/rbutil/rbutilqt/base/tts.cpp
+++ b/rbutil/rbutilqt/base/tts.cpp
@@ -47,7 +47,7 @@ void TTSBase::initTTSList()
47// function to get a specific encoder 47// function to get a specific encoder
48TTSBase* TTSBase::getTTS(QObject* parent,QString ttsName) 48TTSBase* TTSBase::getTTS(QObject* parent,QString ttsName)
49{ 49{
50 50
51 TTSBase* tts; 51 TTSBase* tts;
52#if defined(Q_OS_WIN) 52#if defined(Q_OS_WIN)
53 if(ttsName == "sapi") 53 if(ttsName == "sapi")
@@ -55,13 +55,13 @@ TTSBase* TTSBase::getTTS(QObject* parent,QString ttsName)
55 tts = new TTSSapi(parent); 55 tts = new TTSSapi(parent);
56 return tts; 56 return tts;
57 } 57 }
58 else 58 else
59#endif 59#endif
60#if defined(Q_OS_LINUX) 60#if defined(Q_OS_LINUX)
61 if (ttsName == "festival") 61 if (ttsName == "festival")
62 { 62 {
63 tts = new TTSFestival(parent); 63 tts = new TTSFestival(parent);
64 return tts; 64 return tts;
65 } 65 }
66 else 66 else
67#endif 67#endif
@@ -97,20 +97,22 @@ QString TTSBase::getTTSName(QString tts)
97TTSExes::TTSExes(QString name,QObject* parent) : TTSBase(parent) 97TTSExes::TTSExes(QString name,QObject* parent) : TTSBase(parent)
98{ 98{
99 m_name = name; 99 m_name = name;
100 100
101 m_TemplateMap["espeak"] = "\"%exe\" %options -w \"%wavfile\" \"%text\""; 101 m_TemplateMap["espeak"] = "\"%exe\" %options -w \"%wavfile\" \"%text\"";
102 m_TemplateMap["flite"] = "\"%exe\" %options -o \"%wavfile\" -t \"%text\""; 102 m_TemplateMap["flite"] = "\"%exe\" %options -o \"%wavfile\" -t \"%text\"";
103 m_TemplateMap["swift"] = "\"%exe\" %options -o \"%wavfile\" \"%text\""; 103 m_TemplateMap["swift"] = "\"%exe\" %options -o \"%wavfile\" \"%text\"";
104 104
105} 105}
106 106
107void TTSExes::generateSettings() 107void TTSExes::generateSettings()
108{ 108{
109 QString exepath =RbSettings::subValue(m_name,RbSettings::TtsPath).toString(); 109 QString exepath =RbSettings::subValue(m_name,RbSettings::TtsPath).toString();
110 if(exepath == "") exepath = findExecutable(m_name); 110 if(exepath == "") exepath = findExecutable(m_name);
111 111
112 insertSetting(eEXEPATH,new EncTtsSetting(this,EncTtsSetting::eSTRING,"Path to TTS engine:",exepath,EncTtsSetting::eBROWSEBTN)); 112 insertSetting(eEXEPATH,new EncTtsSetting(this,EncTtsSetting::eSTRING,
113 insertSetting(eOPTIONS,new EncTtsSetting(this,EncTtsSetting::eSTRING,"TTS engine options:",RbSettings::subValue(m_name,RbSettings::TtsOptions))); 113 tr("Path to TTS engine:"),exepath,EncTtsSetting::eBROWSEBTN));
114 insertSetting(eOPTIONS,new EncTtsSetting(this,EncTtsSetting::eSTRING,
115 tr("TTS engine options:"),RbSettings::subValue(m_name,RbSettings::TtsOptions)));
114} 116}
115 117
116void TTSExes::saveSettings() 118void TTSExes::saveSettings()
@@ -124,7 +126,7 @@ bool TTSExes::start(QString *errStr)
124{ 126{
125 m_TTSexec = RbSettings::subValue(m_name,RbSettings::TtsPath).toString(); 127 m_TTSexec = RbSettings::subValue(m_name,RbSettings::TtsPath).toString();
126 m_TTSOpts = RbSettings::subValue(m_name,RbSettings::TtsOptions).toString(); 128 m_TTSOpts = RbSettings::subValue(m_name,RbSettings::TtsOptions).toString();
127 129
128 m_TTSTemplate = m_TemplateMap.value(m_name); 130 m_TTSTemplate = m_TemplateMap.value(m_name);
129 131
130 QFileInfo tts(m_TTSexec); 132 QFileInfo tts(m_TTSexec);
@@ -141,7 +143,7 @@ bool TTSExes::start(QString *errStr)
141 143
142TTSStatus TTSExes::voice(QString text,QString wavfile, QString *errStr) 144TTSStatus TTSExes::voice(QString text,QString wavfile, QString *errStr)
143{ 145{
144 (void) errStr; 146 (void) errStr;
145 QString execstring = m_TTSTemplate; 147 QString execstring = m_TTSTemplate;
146 148
147 execstring.replace("%exe",m_TTSexec); 149 execstring.replace("%exe",m_TTSexec);
@@ -157,10 +159,10 @@ TTSStatus TTSExes::voice(QString text,QString wavfile, QString *errStr)
157bool TTSExes::configOk() 159bool TTSExes::configOk()
158{ 160{
159 QString path = RbSettings::subValue(m_name,RbSettings::TtsPath).toString(); 161 QString path = RbSettings::subValue(m_name,RbSettings::TtsPath).toString();
160 162
161 if (QFileInfo(path).exists()) 163 if (QFileInfo(path).exists())
162 return true; 164 return true;
163 165
164 return false; 166 return false;
165} 167}
166 168
@@ -178,18 +180,22 @@ void TTSSapi::generateSettings()
178{ 180{
179 // language 181 // language
180 QStringList languages = RbSettings::languages(); 182 QStringList languages = RbSettings::languages();
181 languages.sort(); 183 languages.sort();
182 EncTtsSetting* setting =new EncTtsSetting(this,EncTtsSetting::eSTRINGLIST,"Language:",RbSettings::subValue("sapi",RbSettings::TtsLanguage),languages); 184 EncTtsSetting* setting =new EncTtsSetting(this,EncTtsSetting::eSTRINGLIST,
185 tr("Language:"),RbSettings::subValue("sapi",RbSettings::TtsLanguage),languages);
183 connect(setting,SIGNAL(dataChanged()),this,SLOT(updateVoiceList())); 186 connect(setting,SIGNAL(dataChanged()),this,SLOT(updateVoiceList()));
184 insertSetting(eLANGUAGE,setting); 187 insertSetting(eLANGUAGE,setting);
185 // voice 188 // voice
186 setting = new EncTtsSetting(this,EncTtsSetting::eSTRINGLIST,"Voice:",RbSettings::subValue("sapi",RbSettings::TtsVoice),getVoiceList(RbSettings::subValue("sapi",RbSettings::TtsLanguage).toString()),EncTtsSetting::eREFRESHBTN); 189 setting = new EncTtsSetting(this,EncTtsSetting::eSTRINGLIST,
190 tr("Voice:"),RbSettings::subValue("sapi",RbSettings::TtsVoice),getVoiceList(RbSettings::subValue("sapi",RbSettings::TtsLanguage).toString()),EncTtsSetting::eREFRESHBTN);
187 connect(setting,SIGNAL(refresh()),this,SLOT(updateVoiceList())); 191 connect(setting,SIGNAL(refresh()),this,SLOT(updateVoiceList()));
188 insertSetting(eVOICE,setting); 192 insertSetting(eVOICE,setting);
189 //speed 193 //speed
190 insertSetting(eSPEED,new EncTtsSetting(this,EncTtsSetting::eINT,"Speed:",RbSettings::subValue("sapi",RbSettings::TtsSpeed),-10,10)); 194 insertSetting(eSPEED,new EncTtsSetting(this,EncTtsSetting::eINT,
195 tr("Speed:"),RbSettings::subValue("sapi",RbSettings::TtsSpeed),-10,10));
191 // options 196 // options
192 insertSetting(eOPTIONS,new EncTtsSetting(this,EncTtsSetting::eSTRING,"Options:",RbSettings::subValue("sapi",RbSettings::TtsOptions))); 197 insertSetting(eOPTIONS,new EncTtsSetting(this,EncTtsSetting::eSTRING,
198 tr("Options:"),RbSettings::subValue("sapi",RbSettings::TtsOptions)));
193 199
194} 200}
195 201
@@ -200,7 +206,7 @@ void TTSSapi::saveSettings()
200 RbSettings::setSubValue("sapi",RbSettings::TtsVoice,getSetting(eVOICE)->current().toString()); 206 RbSettings::setSubValue("sapi",RbSettings::TtsVoice,getSetting(eVOICE)->current().toString());
201 RbSettings::setSubValue("sapi",RbSettings::TtsSpeed,getSetting(eSPEED)->current().toInt()); 207 RbSettings::setSubValue("sapi",RbSettings::TtsSpeed,getSetting(eSPEED)->current().toInt());
202 RbSettings::setSubValue("sapi",RbSettings::TtsOptions,getSetting(eOPTIONS)->current().toString()); 208 RbSettings::setSubValue("sapi",RbSettings::TtsOptions,getSetting(eOPTIONS)->current().toString());
203 209
204 RbSettings::sync(); 210 RbSettings::sync();
205} 211}
206 212
@@ -210,28 +216,28 @@ void TTSSapi::updateVoiceList()
210 QStringList voiceList = getVoiceList(getSetting(eLANGUAGE)->current().toString()); 216 QStringList voiceList = getVoiceList(getSetting(eLANGUAGE)->current().toString());
211 getSetting(eVOICE)->setList(voiceList); 217 getSetting(eVOICE)->setList(voiceList);
212 if(voiceList.size() > 0) getSetting(eVOICE)->setCurrent(voiceList.at(0)); 218 if(voiceList.size() > 0) getSetting(eVOICE)->setCurrent(voiceList.at(0));
213 else getSetting(eVOICE)->setCurrent(""); 219 else getSetting(eVOICE)->setCurrent("");
214} 220}
215 221
216bool TTSSapi::start(QString *errStr) 222bool TTSSapi::start(QString *errStr)
217{ 223{
218 224
219 m_TTSOpts = RbSettings::subValue("sapi",RbSettings::TtsOptions).toString(); 225 m_TTSOpts = RbSettings::subValue("sapi",RbSettings::TtsOptions).toString();
220 m_TTSLanguage =RbSettings::subValue("sapi",RbSettings::TtsLanguage).toString(); 226 m_TTSLanguage =RbSettings::subValue("sapi",RbSettings::TtsLanguage).toString();
221 m_TTSVoice=RbSettings::subValue("sapi",RbSettings::TtsVoice).toString(); 227 m_TTSVoice=RbSettings::subValue("sapi",RbSettings::TtsVoice).toString();
222 m_TTSSpeed=RbSettings::subValue("sapi",RbSettings::TtsSpeed).toString(); 228 m_TTSSpeed=RbSettings::subValue("sapi",RbSettings::TtsSpeed).toString();
223 m_sapi4 = RbSettings::subValue("sapi",RbSettings::TtsUseSapi4).toBool(); 229 m_sapi4 = RbSettings::subValue("sapi",RbSettings::TtsUseSapi4).toBool();
224 230
225 QFile::remove(QDir::tempPath() +"/sapi_voice.vbs"); 231 QFile::remove(QDir::tempPath() +"/sapi_voice.vbs");
226 QFile::copy(":/builtin/sapi_voice.vbs",QDir::tempPath() + "/sapi_voice.vbs"); 232 QFile::copy(":/builtin/sapi_voice.vbs",QDir::tempPath() + "/sapi_voice.vbs");
227 m_TTSexec = QDir::tempPath() +"/sapi_voice.vbs"; 233 m_TTSexec = QDir::tempPath() +"/sapi_voice.vbs";
228 234
229 QFileInfo tts(m_TTSexec); 235 QFileInfo tts(m_TTSexec);
230 if(!tts.exists()) 236 if(!tts.exists())
231 { 237 {
232 *errStr = tr("Could not copy the Sapi-script"); 238 *errStr = tr("Could not copy the Sapi-script");
233 return false; 239 return false;
234 } 240 }
235 // create the voice process 241 // create the voice process
236 QString execstring = m_TTSTemplate; 242 QString execstring = m_TTSTemplate;
237 execstring.replace("%exe",m_TTSexec); 243 execstring.replace("%exe",m_TTSexec);
@@ -239,31 +245,31 @@ bool TTSSapi::start(QString *errStr)
239 execstring.replace("%lang",m_TTSLanguage); 245 execstring.replace("%lang",m_TTSLanguage);
240 execstring.replace("%voice",m_TTSVoice); 246 execstring.replace("%voice",m_TTSVoice);
241 execstring.replace("%speed",m_TTSSpeed); 247 execstring.replace("%speed",m_TTSSpeed);
242 248
243 if(m_sapi4) 249 if(m_sapi4)
244 execstring.append(" /sapi4 "); 250 execstring.append(" /sapi4 ");
245 251
246 qDebug() << "init" << execstring; 252 qDebug() << "init" << execstring;
247 voicescript = new QProcess(NULL); 253 voicescript = new QProcess(NULL);
248 //connect(voicescript,SIGNAL(readyReadStandardError()),this,SLOT(error())); 254 //connect(voicescript,SIGNAL(readyReadStandardError()),this,SLOT(error()));
249 255
250 voicescript->start(execstring); 256 voicescript->start(execstring);
251 if(!voicescript->waitForStarted()) 257 if(!voicescript->waitForStarted())
252 { 258 {
253 *errStr = tr("Could not start the Sapi-script"); 259 *errStr = tr("Could not start the Sapi-script");
254 return false; 260 return false;
255 } 261 }
256 262
257 if(!voicescript->waitForReadyRead(300)) 263 if(!voicescript->waitForReadyRead(300))
258 { 264 {
259 *errStr = voicescript->readAllStandardError(); 265 *errStr = voicescript->readAllStandardError();
260 if(*errStr != "") 266 if(*errStr != "")
261 return false; 267 return false;
262 } 268 }
263 269
264 voicestream = new QTextStream(voicescript); 270 voicestream = new QTextStream(voicescript);
265 voicestream->setCodec("UTF16-LE"); 271 voicestream->setCodec("UTF16-LE");
266 272
267 return true; 273 return true;
268} 274}
269 275
@@ -271,31 +277,31 @@ bool TTSSapi::start(QString *errStr)
271QStringList TTSSapi::getVoiceList(QString language) 277QStringList TTSSapi::getVoiceList(QString language)
272{ 278{
273 QStringList result; 279 QStringList result;
274 280
275 QFile::copy(":/builtin/sapi_voice.vbs",QDir::tempPath() + "/sapi_voice.vbs"); 281 QFile::copy(":/builtin/sapi_voice.vbs",QDir::tempPath() + "/sapi_voice.vbs");
276 m_TTSexec = QDir::tempPath() +"/sapi_voice.vbs"; 282 m_TTSexec = QDir::tempPath() +"/sapi_voice.vbs";
277 283
278 QFileInfo tts(m_TTSexec); 284 QFileInfo tts(m_TTSexec);
279 if(!tts.exists()) 285 if(!tts.exists())
280 return result; 286 return result;
281 287
282 // create the voice process 288 // create the voice process
283 QString execstring = "cscript //nologo \"%exe\" /language:%lang /listvoices"; 289 QString execstring = "cscript //nologo \"%exe\" /language:%lang /listvoices";
284 execstring.replace("%exe",m_TTSexec); 290 execstring.replace("%exe",m_TTSexec);
285 execstring.replace("%lang",language); 291 execstring.replace("%lang",language);
286 292
287 if(RbSettings::value(RbSettings::TtsUseSapi4).toBool()) 293 if(RbSettings::value(RbSettings::TtsUseSapi4).toBool())
288 execstring.append(" /sapi4 "); 294 execstring.append(" /sapi4 ");
289 295
290 qDebug() << "init" << execstring; 296 qDebug() << "init" << execstring;
291 voicescript = new QProcess(NULL); 297 voicescript = new QProcess(NULL);
292 voicescript->start(execstring); 298 voicescript->start(execstring);
293 qDebug() << "wait for started"; 299 qDebug() << "wait for started";
294 if(!voicescript->waitForStarted()) 300 if(!voicescript->waitForStarted())
295 return result; 301 return result;
296 voicescript->closeWriteChannel(); 302 voicescript->closeWriteChannel();
297 voicescript->waitForReadyRead(); 303 voicescript->waitForReadyRead();
298 304
299 QString dataRaw = voicescript->readAllStandardError().data(); 305 QString dataRaw = voicescript->readAllStandardError().data();
300 result = dataRaw.split(",",QString::SkipEmptyParts); 306 result = dataRaw.split(",",QString::SkipEmptyParts);
301 if(result.size() > 0) 307 if(result.size() > 0)
@@ -306,13 +312,13 @@ QStringList TTSSapi::getVoiceList(QString language)
306 { 312 {
307 result[i] = result.at(i).simplified(); 313 result[i] = result.at(i).simplified();
308 } 314 }
309 } 315 }
310 316
311 delete voicescript; 317 delete voicescript;
312 QFile::setPermissions(QDir::tempPath() +"/sapi_voice.vbs",QFile::ReadOwner |QFile::WriteOwner|QFile::ExeOwner 318 QFile::setPermissions(QDir::tempPath() +"/sapi_voice.vbs",QFile::ReadOwner |QFile::WriteOwner|QFile::ExeOwner
313 |QFile::ReadUser| QFile::WriteUser| QFile::ExeUser 319 |QFile::ReadUser| QFile::WriteUser| QFile::ExeUser
314 |QFile::ReadGroup |QFile::WriteGroup |QFile::ExeGroup 320 |QFile::ReadGroup |QFile::WriteGroup |QFile::ExeGroup
315 |QFile::ReadOther |QFile::WriteOther |QFile::ExeOther ); 321 |QFile::ReadOther |QFile::WriteOther |QFile::ExeOther );
316 QFile::remove(QDir::tempPath() +"/sapi_voice.vbs"); 322 QFile::remove(QDir::tempPath() +"/sapi_voice.vbs");
317 return result; 323 return result;
318} 324}
@@ -321,7 +327,7 @@ QStringList TTSSapi::getVoiceList(QString language)
321 327
322TTSStatus TTSSapi::voice(QString text,QString wavfile, QString *errStr) 328TTSStatus TTSSapi::voice(QString text,QString wavfile, QString *errStr)
323{ 329{
324 (void) errStr; 330 (void) errStr;
325 QString query = "SPEAK\t"+wavfile+"\t"+text+"\r\n"; 331 QString query = "SPEAK\t"+wavfile+"\t"+text+"\r\n";
326 qDebug() << "voicing" << query; 332 qDebug() << "voicing" << query;
327 *voicestream << query; 333 *voicestream << query;
@@ -332,17 +338,17 @@ TTSStatus TTSSapi::voice(QString text,QString wavfile, QString *errStr)
332} 338}
333 339
334bool TTSSapi::stop() 340bool TTSSapi::stop()
335{ 341{
336 342
337 *voicestream << "QUIT\r\n"; 343 *voicestream << "QUIT\r\n";
338 voicestream->flush(); 344 voicestream->flush();
339 voicescript->waitForFinished(); 345 voicescript->waitForFinished();
340 delete voicestream; 346 delete voicestream;
341 delete voicescript; 347 delete voicescript;
342 QFile::setPermissions(QDir::tempPath() +"/sapi_voice.vbs",QFile::ReadOwner |QFile::WriteOwner|QFile::ExeOwner 348 QFile::setPermissions(QDir::tempPath() +"/sapi_voice.vbs",QFile::ReadOwner |QFile::WriteOwner|QFile::ExeOwner
343 |QFile::ReadUser| QFile::WriteUser| QFile::ExeUser 349 |QFile::ReadUser| QFile::WriteUser| QFile::ExeUser
344 |QFile::ReadGroup |QFile::WriteGroup |QFile::ExeGroup 350 |QFile::ReadGroup |QFile::WriteGroup |QFile::ExeGroup
345 |QFile::ReadOther |QFile::WriteOther |QFile::ExeOther ); 351 |QFile::ReadOther |QFile::WriteOther |QFile::ExeOther );
346 QFile::remove(QDir::tempPath() +"/sapi_voice.vbs"); 352 QFile::remove(QDir::tempPath() +"/sapi_voice.vbs");
347 return true; 353 return true;
348} 354}
@@ -358,7 +364,7 @@ bool TTSSapi::configOk()
358 **********************************************************************/ 364 **********************************************************************/
359TTSFestival::~TTSFestival() 365TTSFestival::~TTSFestival()
360{ 366{
361 stop(); 367 stop();
362} 368}
363 369
364void TTSFestival::generateSettings() 370void TTSFestival::generateSettings()
@@ -366,21 +372,24 @@ void TTSFestival::generateSettings()
366 // server path 372 // server path
367 QString exepath = RbSettings::subValue("festival-server",RbSettings::TtsPath).toString(); 373 QString exepath = RbSettings::subValue("festival-server",RbSettings::TtsPath).toString();
368 if(exepath == "" ) exepath = findExecutable("festival"); 374 if(exepath == "" ) exepath = findExecutable("festival");
369 insertSetting(eSERVERPATH,new EncTtsSetting(this,EncTtsSetting::eSTRING,"Path to Festival server:",exepath,EncTtsSetting::eBROWSEBTN)); 375 insertSetting(eSERVERPATH,new EncTtsSetting(this,EncTtsSetting::eSTRING,"Path to Festival server:",exepath,EncTtsSetting::eBROWSEBTN));
370 376
371 // client path 377 // client path
372 QString clientpath = RbSettings::subValue("festival-client",RbSettings::TtsPath).toString(); 378 QString clientpath = RbSettings::subValue("festival-client",RbSettings::TtsPath).toString();
373 if(clientpath == "" ) clientpath = findExecutable("festival_client"); 379 if(clientpath == "" ) clientpath = findExecutable("festival_client");
374 insertSetting(eCLIENTPATH,new EncTtsSetting(this,EncTtsSetting::eSTRING,"Path to Festival client:",clientpath,EncTtsSetting::eBROWSEBTN)); 380 insertSetting(eCLIENTPATH,new EncTtsSetting(this,EncTtsSetting::eSTRING,
375 381 tr("Path to Festival client:"),clientpath,EncTtsSetting::eBROWSEBTN));
382
376 // voice 383 // voice
377 EncTtsSetting* setting = new EncTtsSetting(this,EncTtsSetting::eSTRINGLIST,"Voice:",RbSettings::subValue("festival",RbSettings::TtsVoice),getVoiceList(exepath),EncTtsSetting::eREFRESHBTN); 384 EncTtsSetting* setting = new EncTtsSetting(this,EncTtsSetting::eSTRINGLIST,
385 tr("Voice:"),RbSettings::subValue("festival",RbSettings::TtsVoice),getVoiceList(exepath),EncTtsSetting::eREFRESHBTN);
378 connect(setting,SIGNAL(refresh()),this,SLOT(updateVoiceList())); 386 connect(setting,SIGNAL(refresh()),this,SLOT(updateVoiceList()));
379 connect(setting,SIGNAL(dataChanged()),this,SLOT(clearVoiceDescription())); 387 connect(setting,SIGNAL(dataChanged()),this,SLOT(clearVoiceDescription()));
380 insertSetting(eVOICE,setting); 388 insertSetting(eVOICE,setting);
381 389
382 //voice description 390 //voice description
383 setting = new EncTtsSetting(this,EncTtsSetting::eREADONLYSTRING,"Voice description:","",EncTtsSetting::eREFRESHBTN); 391 setting = new EncTtsSetting(this,EncTtsSetting::eREADONLYSTRING,
392 tr("Voice description:"),"",EncTtsSetting::eREFRESHBTN);
384 connect(setting,SIGNAL(refresh()),this,SLOT(updateVoiceDescription())); 393 connect(setting,SIGNAL(refresh()),this,SLOT(updateVoiceDescription()));
385 insertSetting(eVOICEDESC,setting); 394 insertSetting(eVOICEDESC,setting);
386} 395}
@@ -391,13 +400,13 @@ void TTSFestival::saveSettings()
391 RbSettings::setSubValue("festival-server",RbSettings::TtsPath,getSetting(eSERVERPATH)->current().toString()); 400 RbSettings::setSubValue("festival-server",RbSettings::TtsPath,getSetting(eSERVERPATH)->current().toString());
392 RbSettings::setSubValue("festival-client",RbSettings::TtsPath,getSetting(eCLIENTPATH)->current().toString()); 401 RbSettings::setSubValue("festival-client",RbSettings::TtsPath,getSetting(eCLIENTPATH)->current().toString());
393 RbSettings::setSubValue("festival",RbSettings::TtsVoice,getSetting(eVOICE)->current().toString()); 402 RbSettings::setSubValue("festival",RbSettings::TtsVoice,getSetting(eVOICE)->current().toString());
394 403
395 RbSettings::sync(); 404 RbSettings::sync();
396} 405}
397 406
398void TTSFestival::updateVoiceDescription() 407void TTSFestival::updateVoiceDescription()
399{ 408{
400 // get voice Info with current voice and path 409 // get voice Info with current voice and path
401 QString info = getVoiceInfo(getSetting(eVOICE)->current().toString(),getSetting(eSERVERPATH)->current().toString()); 410 QString info = getVoiceInfo(getSetting(eVOICE)->current().toString(),getSetting(eSERVERPATH)->current().toString());
402 getSetting(eVOICEDESC)->setCurrent(info); 411 getSetting(eVOICEDESC)->setCurrent(info);
403} 412}
@@ -417,241 +426,241 @@ void TTSFestival::updateVoiceList()
417 426
418void TTSFestival::startServer(QString path) 427void TTSFestival::startServer(QString path)
419{ 428{
420 if(!configOk()) 429 if(!configOk())
421 return; 430 return;
422 431
423 if(path == "") 432 if(path == "")
424 path = RbSettings::subValue("festival-server",RbSettings::TtsPath).toString(); 433 path = RbSettings::subValue("festival-server",RbSettings::TtsPath).toString();
425 434
426 serverProcess.start(QString("%1 --server").arg(path)); 435 serverProcess.start(QString("%1 --server").arg(path));
427 serverProcess.waitForStarted(); 436 serverProcess.waitForStarted();
428 437
429 queryServer("(getpid)",300,path); 438 queryServer("(getpid)",300,path);
430 if(serverProcess.state() == QProcess::Running) 439 if(serverProcess.state() == QProcess::Running)
431 qDebug() << "Festival is up and running"; 440 qDebug() << "Festival is up and running";
432 else 441 else
433 qDebug() << "Festival failed to start"; 442 qDebug() << "Festival failed to start";
434} 443}
435 444
436void TTSFestival::ensureServerRunning(QString path) 445void TTSFestival::ensureServerRunning(QString path)
437{ 446{
438 if(serverProcess.state() != QProcess::Running) 447 if(serverProcess.state() != QProcess::Running)
439 { 448 {
440 startServer(path); 449 startServer(path);
441 } 450 }
442} 451}
443 452
444bool TTSFestival::start(QString* errStr) 453bool TTSFestival::start(QString* errStr)
445{ 454{
446 (void) errStr; 455 (void) errStr;
447 ensureServerRunning(); 456 ensureServerRunning();
448 if (!RbSettings::subValue("festival",RbSettings::TtsVoice).toString().isEmpty()) 457 if (!RbSettings::subValue("festival",RbSettings::TtsVoice).toString().isEmpty())
449 queryServer(QString("(voice.select '%1)") 458 queryServer(QString("(voice.select '%1)")
450 .arg(RbSettings::subValue("festival", RbSettings::TtsVoice).toString())); 459 .arg(RbSettings::subValue("festival", RbSettings::TtsVoice).toString()));
451 460
452 return true; 461 return true;
453} 462}
454 463
455bool TTSFestival::stop() 464bool TTSFestival::stop()
456{ 465{
457 serverProcess.terminate(); 466 serverProcess.terminate();
458 serverProcess.kill(); 467 serverProcess.kill();
459 468
460 return true; 469 return true;
461} 470}
462 471
463TTSStatus TTSFestival::voice(QString text, QString wavfile, QString* errStr) 472TTSStatus TTSFestival::voice(QString text, QString wavfile, QString* errStr)
464{ 473{
465 qDebug() << text << "->" << wavfile; 474 qDebug() << text << "->" << wavfile;
466 475
467 QString path = RbSettings::subValue("festival-client",RbSettings::TtsPath).toString(); 476 QString path = RbSettings::subValue("festival-client",RbSettings::TtsPath).toString();
468 QString cmd = QString("%1 --server localhost --otype riff --ttw --withlisp --output \"%2\" - ").arg(path).arg(wavfile); 477 QString cmd = QString("%1 --server localhost --otype riff --ttw --withlisp --output \"%2\" - ").arg(path).arg(wavfile);
469 qDebug() << cmd; 478 qDebug() << cmd;
470 479
471 QProcess clientProcess; 480 QProcess clientProcess;
472 clientProcess.start(cmd); 481 clientProcess.start(cmd);
473 clientProcess.write(QString("%1.\n").arg(text).toAscii()); 482 clientProcess.write(QString("%1.\n").arg(text).toAscii());
474 clientProcess.waitForBytesWritten(); 483 clientProcess.waitForBytesWritten();
475 clientProcess.closeWriteChannel(); 484 clientProcess.closeWriteChannel();
476 clientProcess.waitForReadyRead(); 485 clientProcess.waitForReadyRead();
477 QString response = clientProcess.readAll(); 486 QString response = clientProcess.readAll();
478 response = response.trimmed(); 487 response = response.trimmed();
479 if(!response.contains("Utterance")) 488 if(!response.contains("Utterance"))
480 { 489 {
481 qDebug() << "Could not voice string: " << response; 490 qDebug() << "Could not voice string: " << response;
482 *errStr = tr("engine could not voice string"); 491 *errStr = tr("engine could not voice string");
483 return Warning; 492 return Warning;
484 /* do not stop the voicing process because of a single string 493 /* do not stop the voicing process because of a single string
485 TODO: needs proper settings */ 494 TODO: needs proper settings */
486 } 495 }
487 clientProcess.closeReadChannel(QProcess::StandardError); 496 clientProcess.closeReadChannel(QProcess::StandardError);
488 clientProcess.closeReadChannel(QProcess::StandardOutput); 497 clientProcess.closeReadChannel(QProcess::StandardOutput);
489 clientProcess.terminate(); 498 clientProcess.terminate();
490 clientProcess.kill(); 499 clientProcess.kill();
491 500
492 return NoError; 501 return NoError;
493} 502}
494 503
495bool TTSFestival::configOk() 504bool TTSFestival::configOk()
496{ 505{
497 QString serverPath = RbSettings::subValue("festival-server",RbSettings::TtsPath).toString(); 506 QString serverPath = RbSettings::subValue("festival-server",RbSettings::TtsPath).toString();
498 QString clientPath = RbSettings::subValue("festival-client",RbSettings::TtsVoice).toString(); 507 QString clientPath = RbSettings::subValue("festival-client",RbSettings::TtsVoice).toString();
499 508
500 bool ret = QFileInfo(serverPath).isExecutable() && 509 bool ret = QFileInfo(serverPath).isExecutable() &&
501 QFileInfo(clientPath).isExecutable(); 510 QFileInfo(clientPath).isExecutable();
502 if(RbSettings::subValue("festival",RbSettings::TtsVoice).toString().size() > 0 && voices.size() > 0) 511 if(RbSettings::subValue("festival",RbSettings::TtsVoice).toString().size() > 0 && voices.size() > 0)
503 ret = ret && (voices.indexOf(RbSettings::subValue("festival",RbSettings::TtsVoice).toString()) != -1); 512 ret = ret && (voices.indexOf(RbSettings::subValue("festival",RbSettings::TtsVoice).toString()) != -1);
504 return ret; 513 return ret;
505} 514}
506 515
507QStringList TTSFestival::getVoiceList(QString path) 516QStringList TTSFestival::getVoiceList(QString path)
508{ 517{
509 if(!configOk()) 518 if(!configOk())
510 return QStringList(); 519 return QStringList();
511 520
512 if(voices.size() > 0) 521 if(voices.size() > 0)
513 { 522 {
514 qDebug() << "Using voice cache"; 523 qDebug() << "Using voice cache";
515 return voices; 524 return voices;
516 } 525 }
517
518 QString response = queryServer("(voice.list)",3000,path);
519 526
520 // get the 2nd line. It should be (<voice_name>, <voice_name>) 527 QString response = queryServer("(voice.list)",3000,path);
521 response = response.mid(response.indexOf('\n') + 1, -1);
522 response = response.left(response.indexOf('\n')).trimmed();
523 528
524 voices = response.mid(1, response.size()-2).split(' '); 529 // get the 2nd line. It should be (<voice_name>, <voice_name>)
530 response = response.mid(response.indexOf('\n') + 1, -1);
531 response = response.left(response.indexOf('\n')).trimmed();
525 532
526 voices.sort(); 533 voices = response.mid(1, response.size()-2).split(' ');
527 if (voices.size() == 1 && voices[0].size() == 0) 534
528 voices.removeAt(0); 535 voices.sort();
529 if (voices.size() > 0) 536 if (voices.size() == 1 && voices[0].size() == 0)
530 qDebug() << "Voices: " << voices; 537 voices.removeAt(0);
531 else 538 if (voices.size() > 0)
532 qDebug() << "No voices."; 539 qDebug() << "Voices: " << voices;
533 540 else
534 return voices; 541 qDebug() << "No voices.";
542
543 return voices;
535} 544}
536 545
537QString TTSFestival::getVoiceInfo(QString voice,QString path) 546QString TTSFestival::getVoiceInfo(QString voice,QString path)
538{ 547{
539 if(!configOk()) 548 if(!configOk())
540 return ""; 549 return "";
541 550
542 if(!getVoiceList().contains(voice)) 551 if(!getVoiceList().contains(voice))
543 return ""; 552 return "";
544 553
545 if(voiceDescriptions.contains(voice)) 554 if(voiceDescriptions.contains(voice))
546 return voiceDescriptions[voice]; 555 return voiceDescriptions[voice];
547 556
548 QString response = queryServer(QString("(voice.description '%1)").arg(voice), 3000,path); 557 QString response = queryServer(QString("(voice.description '%1)").arg(voice), 3000,path);
549 558
550 if (response == "") 559 if (response == "")
551 { 560 {
552 voiceDescriptions[voice]=tr("No description available"); 561 voiceDescriptions[voice]=tr("No description available");
553 } 562 }
554 else 563 else
555 { 564 {
556 response = response.remove(QRegExp("(description \"*\")", Qt::CaseInsensitive, QRegExp::Wildcard)); 565 response = response.remove(QRegExp("(description \"*\")", Qt::CaseInsensitive, QRegExp::Wildcard));
557 qDebug() << "voiceInfo w/o descr: " << response; 566 qDebug() << "voiceInfo w/o descr: " << response;
558 response = response.remove(')'); 567 response = response.remove(')');
559 QStringList responseLines = response.split('(', QString::SkipEmptyParts); 568 QStringList responseLines = response.split('(', QString::SkipEmptyParts);
560 responseLines.removeAt(0); // the voice name itself 569 responseLines.removeAt(0); // the voice name itself
561 570
562 QString description; 571 QString description;
563 foreach(QString line, responseLines) 572 foreach(QString line, responseLines)
564 { 573 {
565 line = line.remove('('); 574 line = line.remove('(');
566 line = line.simplified(); 575 line = line.simplified();
567 576
568 line[0] = line[0].toUpper(); // capitalize the key 577 line[0] = line[0].toUpper(); // capitalize the key
569 578
570 int firstSpace = line.indexOf(' '); 579 int firstSpace = line.indexOf(' ');
571 if (firstSpace > 0) 580 if (firstSpace > 0)
572 { 581 {
573 line = line.insert(firstSpace, ':'); // add a colon between the key and the value 582 line = line.insert(firstSpace, ':'); // add a colon between the key and the value
574 line[firstSpace+2] = line[firstSpace+2].toUpper(); // capitalize the value 583 line[firstSpace+2] = line[firstSpace+2].toUpper(); // capitalize the value
575 } 584 }
576 585
577 description += line + "\n"; 586 description += line + "\n";
578 } 587 }
579 voiceDescriptions[voice] = description.trimmed(); 588 voiceDescriptions[voice] = description.trimmed();
580 } 589 }
581 590
582 return voiceDescriptions[voice]; 591 return voiceDescriptions[voice];
583} 592}
584 593
585QString TTSFestival::queryServer(QString query, int timeout,QString path) 594QString TTSFestival::queryServer(QString query, int timeout,QString path)
586{ 595{
587 if(!configOk()) 596 if(!configOk())
588 return ""; 597 return "";
589 598
590 // this operation could take some time 599 // this operation could take some time
591 emit busy(); 600 emit busy();
592 601
593 ensureServerRunning(path); 602 ensureServerRunning(path);
594 603
595 qDebug() << "queryServer with " << query; 604 qDebug() << "queryServer with " << query;
596 QString response; 605 QString response;
597 606
598 QDateTime endTime; 607 QDateTime endTime;
599 if(timeout > 0) 608 if(timeout > 0)
600 endTime = QDateTime::currentDateTime().addMSecs(timeout); 609 endTime = QDateTime::currentDateTime().addMSecs(timeout);
601 610
602 /* Festival is *extremely* unreliable. Although at this 611 /* Festival is *extremely* unreliable. Although at this
603 * point we are sure that SIOD is accepting commands, 612 * point we are sure that SIOD is accepting commands,
604 * we might end up with an empty response. Hence, the loop. 613 * we might end up with an empty response. Hence, the loop.
605 */ 614 */
606 while(true) 615 while(true)
607 { 616 {
608 QCoreApplication::processEvents(QEventLoop::AllEvents, 50); 617 QCoreApplication::processEvents(QEventLoop::AllEvents, 50);
609 QTcpSocket socket; 618 QTcpSocket socket;
610 619
611 socket.connectToHost("localhost", 1314); 620 socket.connectToHost("localhost", 1314);
612 socket.waitForConnected(); 621 socket.waitForConnected();
613 622
614 if(socket.state() == QAbstractSocket::ConnectedState) 623 if(socket.state() == QAbstractSocket::ConnectedState)
615 { 624 {
616 socket.write(QString("%1\n").arg(query).toAscii()); 625 socket.write(QString("%1\n").arg(query).toAscii());
617 socket.waitForBytesWritten(); 626 socket.waitForBytesWritten();
618 socket.waitForReadyRead(); 627 socket.waitForReadyRead();
619 628
620 response = socket.readAll().trimmed(); 629 response = socket.readAll().trimmed();
621 630
622 if (response != "LP" && response != "") 631 if (response != "LP" && response != "")
623 break; 632 break;
624 } 633 }
625 socket.abort(); 634 socket.abort();
626 socket.disconnectFromHost(); 635 socket.disconnectFromHost();
627 636
628 if(timeout > 0 && QDateTime::currentDateTime() >= endTime) 637 if(timeout > 0 && QDateTime::currentDateTime() >= endTime)
629 { 638 {
630 emit busyEnd(); 639 emit busyEnd();
631 return ""; 640 return "";
632 } 641 }
633 /* make sure we wait a little as we don't want to flood the server with requests */ 642 /* make sure we wait a little as we don't want to flood the server with requests */
634 QDateTime tmpEndTime = QDateTime::currentDateTime().addMSecs(500); 643 QDateTime tmpEndTime = QDateTime::currentDateTime().addMSecs(500);
635 while(QDateTime::currentDateTime() < tmpEndTime) 644 while(QDateTime::currentDateTime() < tmpEndTime)
636 QCoreApplication::processEvents(QEventLoop::AllEvents); 645 QCoreApplication::processEvents(QEventLoop::AllEvents);
637 } 646 }
638 if(response == "nil") 647 if(response == "nil")
639 { 648 {
640 emit busyEnd(); 649 emit busyEnd();
641 return ""; 650 return "";
642 } 651 }
643 652
644 QStringList lines = response.split('\n'); 653 QStringList lines = response.split('\n');
645 if(lines.size() > 2) 654 if(lines.size() > 2)
646 { 655 {
647 lines.removeFirst(); 656 lines.removeFirst();
648 lines.removeLast(); 657 lines.removeLast();
649 } 658 }
650 else 659 else
651 qDebug() << "Response too short: " << response; 660 qDebug() << "Response too short: " << response;
652 661
653 emit busyEnd(); 662 emit busyEnd();
654 return lines.join("\n"); 663 return lines.join("\n");
655 664
656} 665}
657 666