summaryrefslogtreecommitdiff
path: root/kde/daemon/handler.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'kde/daemon/handler.cpp')
-rw-r--r--kde/daemon/handler.cpp633
1 files changed, 0 insertions, 633 deletions
diff --git a/kde/daemon/handler.cpp b/kde/daemon/handler.cpp
deleted file mode 100644
index cd8c564..0000000
--- a/kde/daemon/handler.cpp
+++ /dev/null
@@ -1,633 +0,0 @@
-#include <config.h>
-
-#include "handler.h"
-#include "handler.moc"
-
-#include "kabchandler.h"
-
-#include <dcopref.h>
-#include <qsocketnotifier.h>
-#include <kapplication.h>
-#include <kdebug.h>
-#include <kglobalsettings.h>
-#include <kio/netaccess.h>
-#include <kprocess.h>
-#include <krun.h>
-#include <stdlib.h>
-#include <ktempfile.h>
-
-#include <X11/Xlib.h>
-#ifdef HAVE_DPMS
-#include <X11/extensions/dpms.h>
-#endif
-
-KDapiHandler::KDapiHandler()
- {
- setupSocket();
- kabchandler = new KABCHandler(this);
- }
-
-KDapiHandler::~KDapiHandler()
- {
- while( !connections.isEmpty())
- closeSocket( *connections.begin());
- }
-
-void KDapiHandler::setupSocket()
- {
- mainsocket = dapi_bindSocket();
- if( mainsocket < 0 )
- return;
- QSocketNotifier* notif = new QSocketNotifier( mainsocket, QSocketNotifier::Read, this );
- connect( notif, SIGNAL( activated( int )), SLOT( processMainSocketData()));
- }
-
-void KDapiHandler::processMainSocketData()
- {
- DapiConnection* conn = dapi_acceptSocket( mainsocket );
- if( conn == NULL )
- return;
- ConnectionData data;
- data.conn = conn;
- data.notifier = new QSocketNotifier( dapi_socket( data.conn ), QSocketNotifier::Read, this );
- connect( data.notifier, SIGNAL( activated( int )), SLOT( processSocketData( int )));
- data.screensaver_suspend = false;
- connections.append( data );
- }
-
-void KDapiHandler::processSocketData( int sock )
- {
- for( ConnectionList::Iterator it = connections.begin();
- it != connections.end();
- ++it )
- if( dapi_socket((*it).conn ) == sock )
- {
- processCommand( *it );
- break;
- }
- }
-
-void KDapiHandler::processCommand( ConnectionData& conn )
- {
- int command;
- int seq;
- if( !dapi_readCommand( conn.conn, &command, &seq ))
- {
- closeSocket( conn );
- return;
- }
- switch( command )
- {
- case DAPI_COMMAND_INIT:
- processCommandInit( conn, seq );
- return;
- case DAPI_COMMAND_CAPABILITIES:
- processCommandCapabilities( conn, seq );
- return;
- case DAPI_COMMAND_OPENURL:
- processCommandOpenUrl( conn, seq );
- return;
- case DAPI_COMMAND_EXECUTEURL:
- processCommandExecuteUrl( conn, seq );
- return;
- case DAPI_COMMAND_BUTTONORDER:
- processCommandButtonOrder( conn, seq );
- return;
- case DAPI_COMMAND_RUNASUSER:
- processCommandRunAsUser( conn, seq );
- return;
- case DAPI_COMMAND_SUSPENDSCREENSAVING:
- processCommandSuspendScreensaving( conn, seq );
- return;
- case DAPI_COMMAND_MAILTO:
- processCommandMailTo( conn, seq );
- return;
- case DAPI_COMMAND_LOCALFILE:
- processCommandLocalFile( conn, seq );
- return;
- case DAPI_COMMAND_UPLOADFILE:
- processCommandUploadFile( conn, seq );
- return;
- case DAPI_COMMAND_REMOVETEMPORARYLOCALFILE:
- processCommandRemoveTemporaryLocalFile( conn, seq );
- return;
- case DAPI_COMMAND_ADDRESSBOOKLIST:
- processCommandAddressBookList( conn, seq );
- return;
- case DAPI_COMMAND_ADDRESSBOOKGETNAME:
- processCommandAddressBookGetName( conn, seq );
- return;
- case DAPI_COMMAND_ADDRESSBOOKGETEMAILS:
- processCommandAddressBookGetEmails( conn, seq );
- return;
- case DAPI_COMMAND_ADDRESSBOOKFINDBYNAME:
- processCommandAddressBookFindByName( conn, seq );
- return;
- case DAPI_COMMAND_ADDRESSBOOKOWNER:
- processCommandAddressBookOwner( conn, seq );
- return;
- case DAPI_COMMAND_ADDRESSBOOKGETVCARD30:
- processCommandAddressBookGetVCard30( conn, seq );
- return;
- }
- }
-
-void KDapiHandler::closeSocket( ConnectionData& conn )
- {
- dapi_close( conn.conn );
- delete conn.notifier;
- for( ConnectionList::Iterator it = connections.begin();
- it != connections.end();
- ++it )
- if( (*it).conn == conn.conn )
- {
- connections.remove( it );
- break;
- }
- updateScreensaving();
- }
-
-void KDapiHandler::processCommandInit( ConnectionData& conn, int seq )
- {
- if( !dapi_readCommandInit( conn.conn ))
- {
- closeSocket( conn );
- return;
- }
- dapi_writeReplyInit( conn.conn, seq, 1 );
- }
-
-/* TODO */
-static int caps[] =
- {
- DAPI_COMMAND_INIT,
- DAPI_COMMAND_CAPABILITIES,
- DAPI_COMMAND_OPENURL,
- DAPI_COMMAND_EXECUTEURL,
- DAPI_COMMAND_BUTTONORDER,
- DAPI_COMMAND_RUNASUSER,
- DAPI_COMMAND_SUSPENDSCREENSAVING,
- DAPI_COMMAND_MAILTO,
- DAPI_COMMAND_LOCALFILE,
- DAPI_COMMAND_UPLOADFILE,
- DAPI_COMMAND_REMOVETEMPORARYLOCALFILE
- };
-
-void KDapiHandler::processCommandCapabilities( ConnectionData& conn, int seq )
- {
- intarr capabilities;
- if( !dapi_readCommandInit( conn.conn ))
- {
- closeSocket( conn );
- return;
- }
- capabilities.count = sizeof( caps ) / sizeof( caps[ 0 ] );
- capabilities.data = caps;
- dapi_writeReplyCapabilities( conn.conn, seq, capabilities, 1 );
- }
-
-void KDapiHandler::processCommandOpenUrl( ConnectionData& conn, int seq )
- {
- char* url;
- DapiWindowInfo winfo;
- if( !dapi_readCommandOpenUrl( conn.conn, &url, &winfo ))
- {
- closeSocket( conn );
- return;
- }
- kapp->invokeBrowser( url, makeStartupInfo( winfo ));
- dapi_writeReplyOpenUrl( conn.conn, seq, 1 );
- free( url );
- dapi_freeWindowInfo( winfo );
- }
-
-void KDapiHandler::processCommandExecuteUrl( ConnectionData& conn, int seq )
- {
- char* url;
- DapiWindowInfo winfo;
- if( !dapi_readCommandExecuteUrl( conn.conn, &url, &winfo ))
- {
- closeSocket( conn );
- return;
- }
- new KRun( url ); // TODO startup info
- dapi_writeReplyExecuteUrl( conn.conn, seq, 1 );
- free( url );
- dapi_freeWindowInfo( winfo );
- }
-
-void KDapiHandler::processCommandButtonOrder( ConnectionData& conn, int seq )
- {
- if( !dapi_readCommandButtonOrder( conn.conn ))
- {
- closeSocket( conn );
- return;
- }
- int order = KGlobalSettings::buttonLayout();
- // TODO KDE has actually more layouts, but I have no idea what they're supposed to mean
- dapi_writeReplyButtonOrder( conn.conn, seq, order == 1 ? 2 : 1 );
- }
-
-void KDapiHandler::processCommandRunAsUser( ConnectionData& conn, int seq )
- {
- char* user;
- char* command;
- DapiWindowInfo winfo;
- if( !dapi_readCommandRunAsUser( conn.conn, &user, &command, &winfo ))
- {
- closeSocket( conn );
- return;
- }
- KProcess proc; // TODO startup info
- proc.setUseShell( true ); // TODO quoting
- proc << "kdesu";
- if( user[ 0 ] != '\0' )
- proc << "-u" << user;
- proc << "--" << command;
- bool ret = proc.start( KProcess::DontCare );
- dapi_writeReplyRunAsUser( conn.conn, seq, ret ? 1 : 0 );
- free( user );
- free( command );
- dapi_freeWindowInfo( winfo );
- }
-
-void KDapiHandler::processCommandSuspendScreensaving( ConnectionData& conn, int seq )
- {
- int suspend;
- if( !dapi_readCommandSuspendScreensaving( conn.conn, &suspend ))
- {
- closeSocket( conn );
- return;
- }
- conn.screensaver_suspend = suspend;
- updateScreensaving();
- dapi_writeReplySuspendScreensaving( conn.conn, seq, 1 );
- }
-
-void KDapiHandler::updateScreensaving()
- {
- bool suspend = false;
- for( ConnectionList::ConstIterator it = connections.begin();
- it != connections.end();
- ++it )
- {
- if( (*it).screensaver_suspend )
- {
- suspend = true;
- break;
- }
- }
-#ifdef HAVE_DPMS
- if( suspend )
- DPMSDisable( qt_xdisplay());
- else
- DPMSEnable( qt_xdisplay());
-#endif
- DCOPRef ref( "kdesktop", "KScreensaverIface" );
- ref.call( "enable", !suspend );
- }
-
-void KDapiHandler::processCommandMailTo( ConnectionData& conn, int seq )
- {
- char* subject;
- char* body;
- char* to;
- char* cc;
- char* bcc;
- stringarr attachments;
- DapiWindowInfo winfo;
- if( !dapi_readCommandMailTo( conn.conn, &subject, &body, &to, &cc, &bcc, &attachments, &winfo ))
- {
- closeSocket( conn );
- return;
- }
- QStringList attachurls;
- for( int i = 0;
- i < attachments.count;
- ++i )
- attachurls.append( QString::fromUtf8( attachments.data[ i ] ));
- kapp->invokeMailer( QString::fromUtf8( to ), QString::fromUtf8( cc ), QString::fromUtf8( bcc ),
- QString::fromUtf8( subject ), QString::fromUtf8( body ), QString(), attachurls, makeStartupInfo( winfo ));
- dapi_writeReplyMailTo( conn.conn, seq, 1 );
- free( subject );
- free( body );
- free( to );
- free( cc );
- free( bcc );
- dapi_freestringarr( attachments );
- dapi_freeWindowInfo( winfo );
- }
-
-static QValueList< KTempFile* > tempfiles;
-
-static void removeTempFile( const QString file )
- {
- for( QValueList< KTempFile* >::Iterator it = tempfiles.begin();
- it != tempfiles.end();
- ++it )
- if( (*it)->name() == file )
- {
- delete *it;
- tempfiles.remove( it );
- return;
- }
- }
-
-void KDapiHandler::processCommandLocalFile( ConnectionData& conn, int seq )
- {
- char* file;
- char* local;
- int allow_download;
- DapiWindowInfo winfo;
- if( !dapi_readCommandLocalFile( conn.conn, &file, &local, &allow_download, &winfo ))
- {
- closeSocket( conn );
- return;
- }
- KURL url = KURL::fromPathOrURL( QString::fromUtf8( file ));
- free( file );
- QString result;
- if( !url.isValid())
- ; // result is empty
- else if( url.isLocalFile())
- result = url.path();
- else if( allow_download )
- {
- QString target = QString::fromUtf8( local );
- KTempFile* tmp = NULL;
- KURL dest;
- if( !target.isEmpty())
- dest.setPath( target );
- else
- {
- tmp = new KTempFile;
- dest.setPath( tmp->name());
- tempfiles.append( tmp );
- }
- KIO::FileCopyJob* job = KIO::file_copy( url, dest, -1, true, false );
- KDapiFakeWidget* widget = winfo.window != 0 ? new KDapiFakeWidget( winfo.window ) : NULL;
- job->setWindow( widget );
- KDapiDownloadJob* upload = new KDapiDownloadJob( job, conn.conn, seq, widget );
- connect( job, SIGNAL( result( KIO::Job* )), upload, SLOT( done()));
- dapi_freeWindowInfo( winfo );
- // will write reply asynchronously
- return;
- }
- dapi_writeReplyLocalFile( conn.conn, seq, result.utf8());
- dapi_freeWindowInfo( winfo );
- }
-
-void KDapiDownloadJob::done()
- {
- if( job->error() == 0 )
- dapi_writeReplyLocalFile( conn, seq, job->destURL().path().utf8());
- else
- dapi_writeReplyLocalFile( conn, seq, NULL );
- delete widget;
- deleteLater();
- }
-
-void KDapiHandler::processCommandUploadFile( ConnectionData& conn, int seq )
- {
- char* local;
- char* file;
- int remove_local;
- DapiWindowInfo winfo;
- if( !dapi_readCommandUploadFile( conn.conn, &local, &file, &remove_local, &winfo ))
- {
- closeSocket( conn );
- return;
- }
- KURL url = KURL::fromPathOrURL( QString::fromUtf8( file ));
- QString localfile = QString::fromUtf8( local );
- free( local );
- free( file );
- int ok = 0;
- if( !url.isValid())
- ok = 0;
- else if( url.isLocalFile() && url.path() == localfile )
- ok = 1; // no-op
- else
- {
- KURL src;
- src.setPath( localfile );
- KIO::FileCopyJob* job = KIO::file_copy( src, url, -1, true, false );
- KDapiFakeWidget* widget = winfo.window != 0 ? new KDapiFakeWidget( winfo.window ) : NULL;
- job->setWindow( widget );
- KDapiUploadJob* upload = new KDapiUploadJob( job, conn.conn, seq, remove_local, widget );
- connect( job, SIGNAL( result( KIO::Job* )), upload, SLOT( done()));
- dapi_freeWindowInfo( winfo );
- // will write reply asynchronously
- return;
- }
- dapi_writeReplyUploadFile( conn.conn, seq, ok );
- dapi_freeWindowInfo( winfo );
- }
-
-void KDapiUploadJob::done()
- {
- // TODO this apparently returns success even with e.g. http - check somehow
- dapi_writeReplyUploadFile( conn, seq, job->error() == 0 );
- if( job->error() == 0 && remove_local )
- removeTempFile( job->srcURL().path());
- delete widget;
- }
-
-void KDapiHandler::processCommandRemoveTemporaryLocalFile( ConnectionData& conn, int seq )
- {
- char* file;
- if( !dapi_readCommandRemoveTemporaryLocalFile( conn.conn, &file ))
- {
- closeSocket( conn );
- return;
- }
- removeTempFile( QString::fromUtf8( file ));
- dapi_writeReplyRemoveTemporaryLocalFile( conn.conn, seq, 1 );
- free( file );
- }
-
-void KDapiHandler::processCommandAddressBookList( ConnectionData& conn, int seq )
- {
- if( !dapi_readCommandAddressBookList( conn.conn ) )
- {
- closeSocket( conn );
- return;
- }
-
- QStringList kabcUIDs = kabchandler->listUIDs();
-
- stringarr idList;
- idList.data = 0;
- idList.count = 0;
- if (kabcUIDs.count() > 0)
- {
- idList.data = (char**) malloc( sizeof( char* ) * (kabcUIDs.count() + 1 ) );
- QStringList::const_iterator it = kabcUIDs.begin();
- QStringList::const_iterator endIt = kabcUIDs.end();
- for ( uint i = 0; it != endIt; ++it, ++i )
- {
- QCString string = (*it).utf8();
- idList.data[i] = strndup( string.data(), string.count() );
- }
- idList.data[kabcUIDs.count()] = NULL;
- idList.count = kabcUIDs.count();
- }
-
- dapi_writeReplyAddressBookList( conn.conn, seq, idList, kabcUIDs.count() );
-
- dapi_freestringarr( idList );
- }
-
-void KDapiHandler::processCommandAddressBookGetName( ConnectionData& conn, int seq )
- {
- char* id;
- if( !dapi_readCommandAddressBookGetName( conn.conn, &id ) )
- {
- closeSocket( conn );
- return;
- }
-
- QCString firstname;
- QCString lastname;
- QCString fullname;
-
- bool ok = kabchandler->getNames( QString::fromUtf8( id ),
- firstname, lastname, fullname );
- free( id );
-
- dapi_writeReplyAddressBookGetName( conn.conn, seq, firstname.data(), lastname.data(),
- fullname.data(), ok );
-
- }
-
-void KDapiHandler::processCommandAddressBookGetEmails( ConnectionData& conn, int seq )
- {
- char* id;
- if( !dapi_readCommandAddressBookGetEmails( conn.conn, &id ) )
- {
- closeSocket( conn );
- return;
- }
-
- QStringList emails;
- bool ok = kabchandler->getEmails( QString::fromUtf8( id ), emails );
-
- free( id );
-
- stringarr emailList;
- emailList.data = 0;
- emailList.count = 0;
- if (emails.count() > 0)
- {
- emailList.data = (char**) malloc( sizeof( char* ) * ( emails.count() + 1 ) );
- QStringList::const_iterator it = emails.begin();
- QStringList::const_iterator endIt = emails.end();
- for ( uint i = 0; it != endIt; ++it, ++i )
- {
- QCString string = (*it).utf8();
- emailList.data[i] = strdup( string.data() );
- }
- emailList.data[emails.count()] = NULL;
- emailList.count = emails.count();
- }
-
- dapi_writeReplyAddressBookGetEmails( conn.conn, seq, emailList, ok );
-
- dapi_freestringarr( emailList );
- }
-
-void KDapiHandler::processCommandAddressBookFindByName( ConnectionData& conn, int seq )
- {
- char* id;
- if( !dapi_readCommandAddressBookFindByName( conn.conn, &id ) )
- {
- closeSocket( conn );
- return;
- }
-
- QStringList kabcUIDs = kabchandler->findByName( QString::fromUtf8( id ) );
-
- free( id );
-
- stringarr idList;
- idList.data = 0;
- idList.count = 0;
- if (kabcUIDs.count() > 0)
- {
- idList.data = (char**) malloc( sizeof( char* ) * (kabcUIDs.count() + 1 ) );
- QStringList::const_iterator it = kabcUIDs.begin();
- QStringList::const_iterator endIt = kabcUIDs.end();
- for ( uint i = 0; it != endIt; ++it, ++i )
- {
- QCString string = (*it).utf8();
- idList.data[i] = strndup( string.data(), string.count() );
- }
- idList.data[kabcUIDs.count()] = NULL;
- idList.count = kabcUIDs.count();
- }
-
- dapi_writeReplyAddressBookFindByName( conn.conn, seq, idList, kabcUIDs.count() );
-
- dapi_freestringarr( idList );
- }
-
-void KDapiHandler::processCommandAddressBookOwner( ConnectionData& conn, int seq )
- {
- if( !dapi_readCommandAddressBookOwner( conn.conn ) )
- {
- closeSocket( conn );
- return;
- }
-
- QString ownerUID = kabchandler->owner();
-
- bool ok = !ownerUID.isEmpty();
-
- dapi_writeReplyAddressBookOwner( conn.conn, seq, (ok ? ownerUID.utf8().data() : 0), ok );
- }
-
-void KDapiHandler::processCommandAddressBookGetVCard30( ConnectionData& conn, int seq )
- {
- char* id;
- if( !dapi_readCommandAddressBookGetVCard30( conn.conn, &id ) )
- {
- closeSocket( conn );
- return;
- }
-
- QString vcard = kabchandler->vcard30( QString::fromUtf8( id ) );
-
- free( id );
-
- bool ok = !vcard.isEmpty();
-
- dapi_writeReplyAddressBookGetVCard30( conn.conn, seq, (ok ? vcard.utf8().data() : 0), ok );
-
- }
-
-QCString KDapiHandler::makeStartupInfo( const DapiWindowInfo& winfo )
- {
- WId window = winfo.window;
- if( window != 0 )
- {
- // TODO for the window !=0 case KStartupInfo API needs to be extended to accept
- // external timestamp for creating new startup info
- kapp->updateUserTimestamp();
- }
- else
- {
- kapp->updateUserTimestamp();
- }
- return KStartupInfo::createNewStartupId();
- }
-
-// some KDE APIs accept only QWidget* instead of WId
-KDapiFakeWidget::KDapiFakeWidget( WId window )
- {
- create( window, false ); // don't init
- }
-
-KDapiFakeWidget::~KDapiFakeWidget()
- {
- destroy( false ); // no cleanup
- }