summaryrefslogtreecommitdiffstats
path: root/tdeio/tdeio/observer.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'tdeio/tdeio/observer.cpp')
-rw-r--r--tdeio/tdeio/observer.cpp417
1 files changed, 417 insertions, 0 deletions
diff --git a/tdeio/tdeio/observer.cpp b/tdeio/tdeio/observer.cpp
new file mode 100644
index 000000000..5e4e7aa87
--- /dev/null
+++ b/tdeio/tdeio/observer.cpp
@@ -0,0 +1,417 @@
+/* This file is part of the KDE libraries
+ Copyright (C) 2000 Matej Koss <koss@miesto.sk>
+ David Faure <faure@kde.org>
+
+ $Id$
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Library General Public
+ License version 2 as published by the Free Software Foundation.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public License
+ along with this library; see the file COPYING.LIB. If not, write to
+ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#include <assert.h>
+
+#include <kdebug.h>
+#include <kapplication.h>
+#include <dcopclient.h>
+#include <kurl.h>
+
+#include "jobclasses.h"
+#include "observer.h"
+
+#include "uiserver_stub.h"
+
+#include "passdlg.h"
+#include "slavebase.h"
+#include "observer_stub.h"
+#include <kmessagebox.h>
+#include <ksslinfodlg.h>
+#include <ksslcertdlg.h>
+#include <ksslcertificate.h>
+#include <ksslcertchain.h>
+#include <klocale.h>
+
+using namespace TDEIO;
+
+template class TQIntDict<TDEIO::Job>;
+
+Observer * Observer::s_pObserver = 0L;
+
+const int KDEBUG_OBSERVER = 7007; // Should be 7028
+
+Observer::Observer() : DCOPObject("TDEIO::Observer")
+{
+ // Register app as able to receive DCOP messages
+ if (kapp && !kapp->dcopClient()->isAttached())
+ {
+ kapp->dcopClient()->attach();
+ }
+
+ if ( !kapp->dcopClient()->isApplicationRegistered( "tdeio_uiserver" ) )
+ {
+ kdDebug(KDEBUG_OBSERVER) << "Starting tdeio_uiserver" << endl;
+ TQString error;
+ int ret = TDEApplication::startServiceByDesktopPath( "tdeio_uiserver.desktop",
+ TQStringList(), &error );
+ if ( ret > 0 )
+ {
+ kdError() << "Couldn't start tdeio_uiserver from tdeio_uiserver.desktop: " << error << endl;
+ } else
+ kdDebug(KDEBUG_OBSERVER) << "startServiceByDesktopPath returned " << ret << endl;
+
+ }
+ if ( !kapp->dcopClient()->isApplicationRegistered( "tdeio_uiserver" ) )
+ kdDebug(KDEBUG_OBSERVER) << "The application tdeio_uiserver is STILL NOT REGISTERED" << endl;
+ else
+ kdDebug(KDEBUG_OBSERVER) << "tdeio_uiserver registered" << endl;
+
+ m_uiserver = new UIServer_stub( "tdeio_uiserver", "UIServer" );
+}
+
+int Observer::newJob( TDEIO::Job * job, bool showProgress )
+{
+ // Tell the UI Server about this new job, and give it the application id
+ // at the same time
+ int progressId = m_uiserver->newJob( kapp->dcopClient()->appId(), showProgress );
+
+ // Keep the result in a dict
+ m_dctJobs.insert( progressId, job );
+
+ return progressId;
+}
+
+void Observer::jobFinished( int progressId )
+{
+ m_uiserver->jobFinished( progressId );
+ m_dctJobs.remove( progressId );
+}
+
+void Observer::killJob( int progressId )
+{
+ TDEIO::Job * job = m_dctJobs[ progressId ];
+ if (!job)
+ {
+ kdWarning() << "Can't find job to kill ! There is no job with progressId=" << progressId << " in this process" << endl;
+ return;
+ }
+ job->kill( false /* not quietly */ );
+}
+
+MetaData Observer::metadata( int progressId )
+{
+ TDEIO::Job * job = m_dctJobs[ progressId ];
+ assert(job);
+ return job->metaData();
+}
+
+void Observer::slotTotalSize( TDEIO::Job* job, TDEIO::filesize_t size )
+{
+ //kdDebug(KDEBUG_OBSERVER) << "** Observer::slotTotalSize " << job << " " << TDEIO::number(size) << endl;
+ m_uiserver->totalSize64( job->progressId(), size );
+}
+
+void Observer::slotTotalFiles( TDEIO::Job* job, unsigned long files )
+{
+ //kdDebug(KDEBUG_OBSERVER) << "** Observer::slotTotalFiles " << job << " " << files << endl;
+ m_uiserver->totalFiles( job->progressId(), files );
+}
+
+void Observer::slotTotalDirs( TDEIO::Job* job, unsigned long dirs )
+{
+ //kdDebug(KDEBUG_OBSERVER) << "** Observer::slotTotalDirs " << job << " " << dirs << endl;
+ m_uiserver->totalDirs( job->progressId(), dirs );
+}
+
+void Observer::slotProcessedSize( TDEIO::Job* job, TDEIO::filesize_t size )
+{
+ //kdDebug(KDEBUG_OBSERVER) << "** Observer::slotProcessedSize " << job << " " << job->progressId() << " " << TDEIO::number(size) << endl;
+ m_uiserver->processedSize64( job->progressId(), size );
+}
+
+void Observer::slotProcessedFiles( TDEIO::Job* job, unsigned long files )
+{
+ //kdDebug(KDEBUG_OBSERVER) << "** Observer::slotProcessedFiles " << job << " " << files << endl;
+ m_uiserver->processedFiles( job->progressId(), files );
+}
+
+void Observer::slotProcessedDirs( TDEIO::Job* job, unsigned long dirs )
+{
+ //kdDebug(KDEBUG_OBSERVER) << "** Observer::slotProcessedDirs " << job << " " << dirs << endl;
+ m_uiserver->processedDirs( job->progressId(), dirs );
+}
+
+void Observer::slotSpeed( TDEIO::Job* job, unsigned long speed )
+{
+ //kdDebug(KDEBUG_OBSERVER) << "** Observer::slotSpeed " << job << " " << speed << endl;
+ m_uiserver->speed( job->progressId(), speed );
+}
+
+void Observer::slotPercent( TDEIO::Job* job, unsigned long percent )
+{
+ //kdDebug(KDEBUG_OBSERVER) << "** Observer::slotPercent " << job << " " << percent << endl;
+ m_uiserver->percent( job->progressId(), percent );
+}
+
+void Observer::slotInfoMessage( TDEIO::Job* job, const TQString & msg )
+{
+ m_uiserver->infoMessage( job->progressId(), msg );
+}
+
+void Observer::slotCopying( TDEIO::Job* job, const KURL& from, const KURL& to )
+{
+ //kdDebug(KDEBUG_OBSERVER) << "** Observer::slotCopying " << job << " " << from.url() << " " << to.url() << endl;
+ m_uiserver->copying( job->progressId(), from, to );
+}
+
+void Observer::slotMoving( TDEIO::Job* job, const KURL& from, const KURL& to )
+{
+ //kdDebug(KDEBUG_OBSERVER) << "** Observer::slotMoving " << job << " " << from.url() << " " << to.url() << endl;
+ m_uiserver->moving( job->progressId(), from, to );
+}
+
+void Observer::slotDeleting( TDEIO::Job* job, const KURL& url )
+{
+ //kdDebug(KDEBUG_OBSERVER) << "** Observer::slotDeleting " << job << " " << url.url() << endl;
+ m_uiserver->deleting( job->progressId(), url );
+}
+
+void Observer::slotTransferring( TDEIO::Job* job, const KURL& url )
+{
+ //kdDebug(KDEBUG_OBSERVER) << "** Observer::slotTransferring " << job << " " << url.url() << endl;
+ m_uiserver->transferring( job->progressId(), url );
+}
+
+void Observer::slotCreatingDir( TDEIO::Job* job, const KURL& dir )
+{
+ //kdDebug(KDEBUG_OBSERVER) << "** Observer::slotCreatingDir " << job << " " << dir.url() << endl;
+ m_uiserver->creatingDir( job->progressId(), dir );
+}
+
+void Observer::slotCanResume( TDEIO::Job* job, TDEIO::filesize_t offset )
+{
+ //kdDebug(KDEBUG_OBSERVER) << "** Observer::slotCanResume " << job << " " << TDEIO::number(offset) << endl;
+ m_uiserver->canResume64( job->progressId(), offset );
+}
+
+void Observer::stating( TDEIO::Job* job, const KURL& url )
+{
+ m_uiserver->stating( job->progressId(), url );
+}
+
+void Observer::mounting( TDEIO::Job* job, const TQString & dev, const TQString & point )
+{
+ m_uiserver->mounting( job->progressId(), dev, point );
+}
+
+void Observer::unmounting( TDEIO::Job* job, const TQString & point )
+{
+ m_uiserver->unmounting( job->progressId(), point );
+}
+
+bool Observer::openPassDlg( const TQString& prompt, TQString& user,
+ TQString& pass, bool readOnly )
+{
+ AuthInfo info;
+ info.prompt = prompt;
+ info.username = user;
+ info.password = pass;
+ info.readOnly = readOnly;
+ bool result = openPassDlg ( info );
+ if ( result )
+ {
+ user = info.username;
+ pass = info.password;
+ }
+ return result;
+}
+
+bool Observer::openPassDlg( TDEIO::AuthInfo& info )
+{
+ kdDebug(KDEBUG_OBSERVER) << "Observer::openPassDlg: User= " << info.username
+ << ", Message= " << info.prompt << endl;
+ int result = TDEIO::PasswordDialog::getNameAndPassword( info.username, info.password,
+ &info.keepPassword, info.prompt,
+ info.readOnly, info.caption,
+ info.comment, info.commentLabel );
+ if ( result == TQDialog::Accepted )
+ {
+ info.setModified( true );
+ return true;
+ }
+ return false;
+}
+
+int Observer::messageBox( int progressId, int type, const TQString &text,
+ const TQString &caption, const TQString &buttonYes,
+ const TQString &buttonNo )
+{
+ return messageBox( progressId, type, text, caption, buttonYes, buttonNo, TQString::null );
+}
+
+int Observer::messageBox( int progressId, int type, const TQString &text,
+ const TQString &caption, const TQString &buttonYes,
+ const TQString &buttonNo, const TQString &dontAskAgainName )
+{
+ kdDebug() << "Observer::messageBox " << type << " " << text << " - " << caption << endl;
+ int result = -1;
+ TDEConfig *config = new TDEConfig("tdeioslaverc");
+ KMessageBox::setDontShowAskAgainConfig(config);
+
+ switch (type) {
+ case TDEIO::SlaveBase::QuestionYesNo:
+ result = KMessageBox::questionYesNo( 0L, // parent ?
+ text, caption, buttonYes, buttonNo, dontAskAgainName );
+ break;
+ case TDEIO::SlaveBase::WarningYesNo:
+ result = KMessageBox::warningYesNo( 0L, // parent ?
+ text, caption, buttonYes, buttonNo, dontAskAgainName );
+ break;
+ case TDEIO::SlaveBase::WarningContinueCancel:
+ result = KMessageBox::warningContinueCancel( 0L, // parent ?
+ text, caption, buttonYes, dontAskAgainName );
+ break;
+ case TDEIO::SlaveBase::WarningYesNoCancel:
+ result = KMessageBox::warningYesNoCancel( 0L, // parent ?
+ text, caption, buttonYes, buttonNo, dontAskAgainName );
+ break;
+ case TDEIO::SlaveBase::Information:
+ KMessageBox::information( 0L, // parent ?
+ text, caption, dontAskAgainName );
+ result = 1; // whatever
+ break;
+ case TDEIO::SlaveBase::SSLMessageBox:
+ {
+ TQCString observerAppId = caption.utf8(); // hack, see slaveinterface.cpp
+ // Contact the object "TDEIO::Observer" in the application <appId>
+ // Yes, this could be the same application we are, but not necessarily.
+ Observer_stub observer( observerAppId, "TDEIO::Observer" );
+
+ TDEIO::MetaData meta = observer.metadata( progressId );
+ KSSLInfoDlg *kid = new KSSLInfoDlg(meta["ssl_in_use"].upper()=="TRUE", 0L /*parent?*/, 0L, true);
+ KSSLCertificate *x = KSSLCertificate::fromString(meta["ssl_peer_certificate"].local8Bit());
+ if (x) {
+ // Set the chain back onto the certificate
+ TQStringList cl =
+ TQStringList::split(TQString("\n"), meta["ssl_peer_chain"]);
+ TQPtrList<KSSLCertificate> ncl;
+
+ ncl.setAutoDelete(true);
+ for (TQStringList::Iterator it = cl.begin(); it != cl.end(); ++it) {
+ KSSLCertificate *y = KSSLCertificate::fromString((*it).local8Bit());
+ if (y) ncl.append(y);
+ }
+
+ if (ncl.count() > 0)
+ x->chain().setChain(ncl);
+
+ kid->setup( x,
+ meta["ssl_peer_ip"],
+ text, // the URL
+ meta["ssl_cipher"],
+ meta["ssl_cipher_desc"],
+ meta["ssl_cipher_version"],
+ meta["ssl_cipher_used_bits"].toInt(),
+ meta["ssl_cipher_bits"].toInt(),
+ KSSLCertificate::KSSLValidation(meta["ssl_cert_state"].toInt()));
+ kdDebug(7024) << "Showing SSL Info dialog" << endl;
+ kid->exec();
+ delete x;
+ kdDebug(7024) << "SSL Info dialog closed" << endl;
+ } else {
+ KMessageBox::information( 0L, // parent ?
+ i18n("The peer SSL certificate appears to be corrupt."), i18n("SSL") );
+ }
+ // This doesn't have to get deleted. It deletes on it's own.
+ result = 1; // whatever
+ break;
+ }
+ default:
+ kdWarning() << "Observer::messageBox: unknown type " << type << endl;
+ result = 0;
+ break;
+ }
+ KMessageBox::setDontShowAskAgainConfig(0);
+ delete config;
+ return result;
+#if 0
+ TQByteArray data, replyData;
+ TQCString replyType;
+ TQDataStream arg( data, IO_WriteOnly );
+ arg << progressId;
+ arg << type;
+ arg << text;
+ arg << caption;
+ arg << buttonYes;
+ arg << buttonNo;
+ if ( kapp->dcopClient()->call( "tdeio_uiserver", "UIServer", "messageBox(int,int,TQString,TQString,TQString,TQString)", data, replyType, replyData, true )
+ && replyType == "int" )
+ {
+ int result;
+ TQDataStream _reply_stream( replyData, IO_ReadOnly );
+ _reply_stream >> result;
+ kdDebug(KDEBUG_OBSERVER) << "Observer::messageBox got result " << result << endl;
+ return result;
+ }
+ kdDebug(KDEBUG_OBSERVER) << "Observer::messageBox call failed" << endl;
+ return 0;
+#endif
+}
+
+RenameDlg_Result Observer::open_RenameDlg( TDEIO::Job* job,
+ const TQString & caption,
+ const TQString& src, const TQString & dest,
+ RenameDlg_Mode mode, TQString& newDest,
+ TDEIO::filesize_t sizeSrc,
+ TDEIO::filesize_t sizeDest,
+ time_t ctimeSrc,
+ time_t ctimeDest,
+ time_t mtimeSrc,
+ time_t mtimeDest
+ )
+{
+ kdDebug(KDEBUG_OBSERVER) << "Observer::open_RenameDlg job=" << job << endl;
+ if (job)
+ kdDebug(KDEBUG_OBSERVER) << " progressId=" << job->progressId() << endl;
+ // Hide existing dialog box if any
+ if (job && job->progressId())
+ m_uiserver->setJobVisible( job->progressId(), false );
+ // We now do it in process => KDE4: move this code out of Observer (back to job.cpp), so that
+ // opening the rename dialog doesn't start uiserver for nothing if progressId=0 (e.g. F2 in konq)
+ RenameDlg_Result res = TDEIO::open_RenameDlg( caption, src, dest, mode,
+ newDest, sizeSrc, sizeDest,
+ ctimeSrc, ctimeDest, mtimeSrc,
+ mtimeDest );
+ if (job && job->progressId())
+ m_uiserver->setJobVisible( job->progressId(), true );
+ return res;
+}
+
+SkipDlg_Result Observer::open_SkipDlg( TDEIO::Job* job,
+ bool _multi,
+ const TQString& _error_text )
+{
+ kdDebug(KDEBUG_OBSERVER) << "Observer::open_SkipDlg job=" << job << " progressId=" << job->progressId() << endl;
+ // Hide existing dialog box if any
+ if (job && job->progressId())
+ m_uiserver->setJobVisible( job->progressId(), false );
+ // We now do it in process. So this method is a useless wrapper around TDEIO::open_RenameDlg.
+ SkipDlg_Result res = TDEIO::open_SkipDlg( _multi, _error_text );
+ if (job && job->progressId())
+ m_uiserver->setJobVisible( job->progressId(), true );
+ return res;
+}
+
+void Observer::virtual_hook( int id, void* data )
+{ DCOPObject::virtual_hook( id, data ); }
+
+#include "observer.moc"