/***************************************************************************
                          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 <tqstring.h>
#include <tqvaluelist.h>
#include <tqvaluestack.h>
#include <tqstringlist.h>
#include <tqregexp.h>
#include <tqtextcodec.h>
#include <tqfile.h>
#include <kdebug.h>
#include <kmacroexpander.h>

Speech::Speech() {
}

Speech::~Speech() {
}

TQString Speech::prepareCommand (TQString command, const TQString &text,
                          const TQString &filename, const TQString &language) {
   TQMap<TQChar,TQString> 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"
