/*************************************************************************** speech.cpp - description ------------------- begin : Son Sep 8 2002 copyright : (C) 2002 by Gunnar Schmi Dt email : kmouth@schmi-dt.de ***************************************************************************/ /*************************************************************************** * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * ***************************************************************************/ #include "speech.h" #include #include #include #include #include #include #include #include #include Speech::Speech() { } Speech::~Speech() { } TQString Speech::prepareCommand (TQString command, const TQString &text, const TQString &filename, const TQString &language) { TQMap map; map['t'] = text; map['f'] = filename; map['l'] = language; return KMacroExpander::expandMacrosShellQuote (command, map); } void Speech::speak(TQString command, bool stdIn, const TQString &text, const TQString &language, int encoding, TQTextCodec *codec) { if (text.length () > 0) { // 1. prepare the text: // 1.a) encode the text TQTextStream ts (encText, IO_WriteOnly); if (encoding == Local) ts.setEncoding (TQTextStream::Locale); else if (encoding == Latin1) ts.setEncoding (TQTextStream::Latin1); else if (encoding == Unicode) ts.setEncoding (TQTextStream::Unicode); else ts.setCodec (codec); ts << text; // 1.b) create a temporary file for the text tempFile.setAutoDelete(true); TQTextStream* fs = tempFile.textStream(); if (encoding == Local) fs->setEncoding (TQTextStream::Locale); else if (encoding == Latin1) fs->setEncoding (TQTextStream::Latin1); else if (encoding == Unicode) fs->setEncoding (TQTextStream::Unicode); else fs->setCodec (codec); *fs << text; *fs << endl; TQString filename = tempFile.file()->name(); tempFile.close(); // 2. prepare the command: command = prepareCommand (command, encText, filename, language); // 3. create a new process process << command; connect(&process, TQ_SIGNAL(processExited(TDEProcess *)), this, TQ_SLOT(processExited(TDEProcess *))); connect(&process, TQ_SIGNAL(wroteStdin(TDEProcess *)), this, TQ_SLOT(wroteStdin(TDEProcess *))); connect(&process, TQ_SIGNAL(receivedStdout(TDEProcess *, char *, int)), this, TQ_SLOT(receivedStdout(TDEProcess *, char *, int))); connect(&process, TQ_SIGNAL(receivedStderr(TDEProcess *, char *, int)), this, TQ_SLOT(receivedStderr(TDEProcess *, char *, int))); // 4. start the process if (stdIn) { process.start(TDEProcess::NotifyOnExit, TDEProcess::All); if (encText.size() > 0) process.writeStdin(encText, encText.size()); else process.closeStdin(); } else process.start(TDEProcess::NotifyOnExit, TDEProcess::AllOutput); } } void Speech::receivedStdout (TDEProcess *, char *buffer, int buflen) { kdDebug() << TQString::fromLatin1(buffer, buflen) + "\n"; } void Speech::receivedStderr (TDEProcess *, char *buffer, int buflen) { kdDebug() << TQString::fromLatin1(buffer, buflen) + "\n"; } void Speech::wroteStdin(TDEProcess *) { process.closeStdin(); } void Speech::processExited(TDEProcess *) { delete this; } #include "speech.moc"