[prev in list] [next in list] [prev in thread] [next in thread] 

List:       kde-commits
Subject:    Re: kdeadmin/ksysv
From:       Toshitaka Fujioka <toshitaka () crux ! ocn ! ne ! jp>
Date:       2003-07-22 16:10:27
[Download RAW message or body]

Hello,

On Tuesday 22 July 2003 18:01, Oswald Buddenhagen wrote:
> anyway, you did the same mistake i commented about two days ago:
> calling fromLocal8Bit on separate chunks from kprocess is _evil_.
> first concatenate, then split the lines and convert (the order of the
> latter two does not matter; but it usually makes sense to convert a line
> as soon as it becomes complete).

Hmm.... I see. But I was not able to understand a bit.
I attached a patch. This patch is OK ?

Regards,
Toshitaka



["kdeadmin-ksysv-fix-kprocess-20030723.diff" (text/x-diff)]

diff -ur kdeadmin.orig/ksysv/OldView.cpp kdeadmin/ksysv/OldView.cpp
--- kdeadmin.orig/ksysv/OldView.cpp	2003-07-21 23:08:38.000000000 +0900
+++ kdeadmin/ksysv/OldView.cpp	2003-07-23 00:49:59.000000000 +0900
@@ -82,7 +82,7 @@
 	mScriptBox (0L),
     mRunlevels (new QVBox*[ksv::runlevelNumber]),
 	mOrigin (0L),
-    mOpenWithMenu (openWithMenu)
+    mOpenWithMenu (openWithMenu), m_buffer( QCString() )
 {
   setOpaqueResize (true);
 
@@ -611,8 +611,8 @@
   *_proc << path << "stop";
 
   connect(_proc, SIGNAL(processExited(KProcess*)), this, \
                SLOT(slotExitedProcess(KProcess*)));
-  connect(_proc, SIGNAL(receivedStdout(KProcess*, char*, int)), this, \
                SLOT(slotOutput(KProcess*, char*, int)));
-  connect(_proc, SIGNAL(receivedStderr(KProcess*, char*, int)), this, \
SLOT(slotErr(KProcess*, char*, int))); +  connect(_proc, \
SIGNAL(receivedStdout(KProcess*, char*, int)), this, \
SLOT(slotOutputOrError(KProcess*, char*, int))); +  connect(_proc, \
SIGNAL(receivedStderr(KProcess*, char*, int)), this, \
SLOT(slotOutputOrError(KProcess*, char*, int)));  
   // refresh textDisplay
   appendLog(i18n("** <stop>Stopping</stop> <cmd>%1</cmd> **<br/>").arg(path),
@@ -637,8 +637,8 @@
   *_proc << path << "start";
 
   connect(_proc, SIGNAL(processExited(KProcess*)), this, \
                SLOT(slotExitedProcess(KProcess*)));
-  connect(_proc, SIGNAL(receivedStdout(KProcess*, char*, int)), this, \
                SLOT(slotOutput(KProcess*, char*, int)));
-  connect(_proc, SIGNAL(receivedStderr(KProcess*, char*, int)), this, \
SLOT(slotErr(KProcess*, char*, int))); +  connect(_proc, \
SIGNAL(receivedStdout(KProcess*, char*, int)), this, \
SLOT(slotOutputOrError(KProcess*, char*, int))); +  connect(_proc, \
SIGNAL(receivedStderr(KProcess*, char*, int)), this, \
SLOT(slotOutputOrError(KProcess*, char*, int)));  
   // refresh textDisplay
   appendLog(i18n("** <start>Starting</start> <cmd>%1</cmd> **<br/>").arg(path),
@@ -677,8 +677,8 @@
   *_proc << path << "restart";
 
   connect(_proc, SIGNAL(processExited(KProcess*)), this, \
                SLOT(slotExitDuringRestart(KProcess*)));
-  connect(_proc, SIGNAL(receivedStdout(KProcess*, char*, int)), this, \
                SLOT(slotOutput(KProcess*, char*, int)));
-  connect(_proc, SIGNAL(receivedStderr(KProcess*, char*, int)), this, \
SLOT(slotErr(KProcess*, char*, int))); +  connect(_proc, \
SIGNAL(receivedStdout(KProcess*, char*, int)), this, \
SLOT(slotOutputOrError(KProcess*, char*, int))); +  connect(_proc, \
SIGNAL(receivedStderr(KProcess*, char*, int)), this, \
SLOT(slotOutputOrError(KProcess*, char*, int)));  
   // refresh textDisplay
   appendLog(i18n("** Re-starting <cmd>%1</cmd> **</br>").arg(path),
@@ -690,19 +690,10 @@
   emit sigRun(path + i18n(" restart"));
 }
 
-void KSVContent::slotOutput( KProcess*, char* _buffer, int _buflen) {
+void KSVContent::slotOutputOrError( KProcess*, char* _buffer, int _buflen) {
   if (_buflen > 0) {
-    QCString buffer = QCString( _buffer, _buflen + 1 );
-    buffer[_buflen]='\0';
-    appendLog( QString::fromLocal8Bit( buffer ), QString::fromLocal8Bit( buffer ) );
-  }
-}
-
-void KSVContent::slotErr( KProcess*, char* _buffer, int _buflen) {
-  if (_buflen > 0) {
-    QCString buffer = QCString( _buffer, _buflen + 1);
-    buffer[_buflen]='\0';
-    appendLog( QString::fromLocal8Bit( buffer ), QString::fromLocal8Bit( buffer ) );
+    m_buffer += QCString( _buffer, _buflen + 1 );
+    appendLog( m_buffer );
   }
 }
 
@@ -749,8 +740,8 @@
   proc->clearArguments();
 
   connect(proc, SIGNAL(processExited(KProcess*)), this, \
                SLOT(slotExitedProcess(KProcess*)));
-  connect(proc, SIGNAL(receivedStdout(KProcess*, char*, int)), this, \
                SLOT(slotOutput(KProcess*, char*, int)));
-  connect(proc, SIGNAL(receivedStderr(KProcess*, char*, int)), this, \
SLOT(slotErr(KProcess*, char*, int))); +  connect(proc, \
SIGNAL(receivedStdout(KProcess*, char*, int)), this, \
SLOT(slotOutputOrError(KProcess*, char*, int))); +  connect(proc, \
SIGNAL(receivedStderr(KProcess*, char*, int)), this, \
SLOT(slotOutputOrError(KProcess*, char*, int)));  
   proc->start(KProcess::NotifyOnExit, KProcess::AllOutput);
 }
@@ -809,6 +800,15 @@
   textDisplay->append (rich);
 }
 
+void KSVContent::appendLog(const QCString& _buffer)
+{
+    QStringList _lines = QStringList::split( "\n", QString::fromLocal8Bit( _buffer ) \
); +    for ( QStringList::Iterator it = _lines.begin(); it != _lines.end(); ++it )
+        appendLog( *it, *it );
+
+    m_buffer = QCString();
+}
+
 const QString& KSVContent::log () const
 {
   return mLogText;
diff -ur kdeadmin.orig/ksysv/OldView.h kdeadmin/ksysv/OldView.h
--- kdeadmin.orig/ksysv/OldView.h	2003-07-21 23:08:38.000000000 +0900
+++ kdeadmin/ksysv/OldView.h	2003-07-23 00:49:59.000000000 +0900
@@ -94,13 +94,13 @@
   void restartService (const QString& path);
   void editService();
   void editService (const QString& path);
-  void slotOutput( KProcess* _p, char* _buffer, int _buflen );
-  void slotErr( KProcess* _p, char* _buffer, int _buflen );
+  void slotOutputOrError( KProcess* _p, char* _buffer, int _buflen );
   void slotExitedProcess(KProcess* proc);
   void slotScriptsNotRemovable();
   void slotDoubleClick (QListViewItem*);
   void slotExitDuringRestart(KProcess* proc);
   void appendLog(const QString& rich, const QString& plain);
+  void appendLog(const QCString& _buffer);
   void fwdCannotGenerateNumber();
   void fwdOrigin();
   void reSortRL();
@@ -174,6 +174,8 @@
 
   KPopupMenu* mOpenWithMenu;
   KTrader::OfferList mOpenWithOffers;
+
+  QCString m_buffer;
 };
 
 #endif



[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic