1
/* This file is part of the KDE project
2
Copyright (C) 2002,2003 Joseph Wenninger <jowenn@kde.org>
4
This library is free software; you can redistribute it and/or
5
modify it under the terms of the GNU Library General Public
6
License as published by the Free Software Foundation; either
7
version 2 of the License, or (at your option) any later version.
9
This library is distributed in the hope that it will be useful,
10
but WITHOUT ANY WARRANTY; without even the implied warranty of
11
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12
Library General Public License for more details.
14
You should have received a copy of the GNU Library General Public License
15
along with this library; see the file COPYING.LIB. If not, write to
16
the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
17
Boston, MA 02111-1307, USA.
20
#include <kio/slavebase.h>
21
#include <kinstance.h>
24
#include <qtextstream.h>
27
#include <dcopclient.h>
28
#include <qdatastream.h>
32
class HelloProtocol : public KIO::SlaveBase
35
HelloProtocol( const QCString& protocol ,const QCString &pool, const QCString &app);
36
virtual ~HelloProtocol();
38
virtual void get( const KURL& url );
40
virtual void stat(const KURL& url);
41
virtual void listDir(const KURL& url);
44
DCOPClient *m_dcopClient;
45
uint mountpointMappingCount();
47
QString deviceNode(uint id);
48
bool deviceMounted(const QString dev);
49
bool deviceMounted(int);
50
QString mountPoint(const QString dev);
51
QString mountPoint(int);
52
QString deviceType(int);
53
QStringList deviceList();
54
QStringList deviceInfo(const QString name);
56
QStringList kmobile_list( QString deviceName );
60
int kdemain( int, char **argv )
62
kdDebug()<<"kdemain for devices"<<endl;
63
KInstance instance( "kio_devices" );
64
HelloProtocol slave(argv[1],argv[2], argv[3]);
72
static void createFileEntry(KIO::UDSEntry& entry, const QString& name, const QString& url, const QString& mime);
73
static void createDirEntry(KIO::UDSEntry& entry, const QString& name, const QString& url, const QString& mime);
75
HelloProtocol::HelloProtocol( const QCString& protocol, const QCString &pool, const QCString &app):
76
SlaveBase(protocol, pool, app )
78
kdDebug()<<"HelloProtocol: Called with slavename:"<<protocol<<endl;
79
if (protocol=="system") fullMode=true; else fullMode=false;
80
m_dcopClient=new DCOPClient();
81
if (!m_dcopClient->attach())
83
kdDebug()<<"ERROR WHILE CONNECTING TO DCOPSERVER"<<endl;
87
HelloProtocol::~HelloProtocol()
92
void HelloProtocol::stat(const KURL& url)
94
QStringList path = QStringList::split('/', url.encodedPathAndQuery(-1), false);
103
createDirEntry(entry, i18n("System"), "system:/", "inode/directory");
105
createDirEntry(entry, i18n("Devices"), "devices:/", "inode/directory");
111
QStringList info=deviceInfo(url.fileName());
115
error(KIO::ERR_SLAVE_DEFINED,i18n("Unknown device: %1").arg(url.fileName()));
120
QStringList::Iterator it=info.begin();
123
QString device=*it; ++it;
129
QString mp=*it; ++it;++it;
132
bool mounted=((*it)=="true");
135
// if (mp=="/") mp="";
141
if (mp.startsWith("file:/"))
143
KProcess *proc = new KProcess;
144
*proc << "kio_devices_mounthelper";
145
*proc << "-m" << url.url();
146
proc->start(KProcess::Block);
153
error(KIO::ERR_SLAVE_DEFINED,i18n("Device not accessible"));
156
// error(KIO::ERR_SLAVE_DEFINED,i18n("Device not mounted"));
163
error(KIO::ERR_SLAVE_DEFINED,i18n("Illegal data received"));
172
void HelloProtocol::listDir(const KURL& url)
174
kdDebug()<<"HELLO PROTOCOLL::listdir: "<<url.url()<<endl;
175
if ((url==KURL("devices:/")) || (url==KURL("system:/")))
179
QStringList info=deviceInfo(url.fileName());
183
error(KIO::ERR_SLAVE_DEFINED,i18n("Unknown device %1").arg(url.fileName()));
188
QStringList::Iterator it=info.begin();
191
QString device=*it; ++it;
197
QString mp=*it; ++it;++it;
200
bool mounted=((*it)=="true");
203
// if (mp=="/") mp="";
209
if (mp.startsWith("file:/"))
211
KProcess *proc = new KProcess;
212
*proc << "kio_devices_mounthelper";
213
*proc << "-m" << url.url();
214
proc->start(KProcess::Block);
216
if (proc->normalExit()) ec=proc->exitStatus();
221
error(KIO::ERR_SLAVE_DEFINED,i18n("Device not mounted"));
231
error(KIO::ERR_SLAVE_DEFINED,i18n("Device not accessible"));
238
error(KIO::ERR_SLAVE_DEFINED,i18n("Illegal data received"));
242
uint HelloProtocol::mountpointMappingCount()
248
if ( m_dcopClient->call( "kded",
249
"mountwatcher", "mountpointMappingCount()", param,retType,data,false ) )
251
QDataStream stream1(data,IO_ReadOnly);
257
QString HelloProtocol::deviceNode(uint id)
263
QDataStream streamout(param,IO_WriteOnly);
265
if ( m_dcopClient->call( "kded",
266
"mountwatcher", "devicenode(int)", param,retType,data,false ) )
268
QDataStream streamin(data,IO_ReadOnly);
275
bool HelloProtocol::deviceMounted(const QString dev)
281
QDataStream streamout(param,IO_WriteOnly);
283
if ( m_dcopClient->call( "kded",
284
"mountwatcher", "mounted(QString)", param,retType,data,false ) )
286
QDataStream streamin(data,IO_ReadOnly);
293
QStringList HelloProtocol::kmobile_list(const QString deviceName)
299
QDataStream streamout(param,IO_WriteOnly);
300
streamout<<deviceName;
301
if ( m_dcopClient->call( "kmobile",
302
"kmobileIface", "kio_devices_deviceInfo(QString)", param,retType,data,false ) )
304
QDataStream streamin(data,IO_ReadOnly);
311
QStringList HelloProtocol::deviceInfo(QString name)
317
QDataStream streamout(param,IO_WriteOnly);
319
if ( m_dcopClient->call( "kded",
320
"mountwatcher", "basicDeviceInfo(QString)", param,retType,data,false ) )
322
QDataStream streamin(data,IO_ReadOnly);
326
if (retVal.isEmpty())
327
retVal = kmobile_list(name);
333
bool HelloProtocol::deviceMounted(int id)
339
QDataStream streamout(param,IO_WriteOnly);
341
if ( m_dcopClient->call( "kded",
342
"mountwatcher", "mounted(int)", param,retType,data,false ) )
344
QDataStream streamin(data,IO_ReadOnly);
351
QStringList HelloProtocol::deviceList()
357
QDataStream streamout(param,IO_WriteOnly);
359
kdDebug()<<"list dir: Fullmode=="<<fullMode<<endl;
360
QString dcopFun=fullMode?"basicSystemList()":"basicList()";
361
if ( m_dcopClient->call( "kded",
362
"mountwatcher", dcopFun.utf8(), param,retType,data,false ) )
364
QDataStream streamin(data,IO_ReadOnly);
369
retVal.append(QString::fromLatin1("!!!ERROR!!!"));
371
// add mobile devices info (kmobile)
372
retVal += kmobile_list(QString::null);
377
QString HelloProtocol::mountPoint(const QString dev)
383
QDataStream streamout(param,IO_WriteOnly);
385
if ( m_dcopClient->call( "kded",
386
"mountwatcher", "mountpoint(QString)", param,retType,data,false ) )
388
QDataStream streamin(data,IO_ReadOnly);
394
QString HelloProtocol::mountPoint(int id)
400
QDataStream streamout(param,IO_WriteOnly);
402
if ( m_dcopClient->call( "kded",
403
"mountwatcher", "mountpoint(int)", param,retType,data,false ) )
405
QDataStream streamin(data,IO_ReadOnly);
413
QString HelloProtocol::deviceType(int id)
419
QDataStream streamout(param,IO_WriteOnly);
421
if ( m_dcopClient->call( "kded",
422
"mountwatcher", "type(int)", param,retType,data,false ) )
424
QDataStream streamin(data,IO_ReadOnly);
432
void HelloProtocol::listRoot()
437
QStringList list=deviceList();
439
for ( QStringList::Iterator it = list.begin(); it != list.end(); ++it )
441
if ((*it)=="!!!ERROR!!!")
443
error(KIO::ERR_SLAVE_DEFINED,i18n("The KDE mountwatcher is not running. Please activate it in Control Center->KDE Components->Service Manager, if you want to use the devices:/ protocol"));
446
// FIXME: look for the real ending
447
QString url="devices:/"+(*it); ++it;
448
QString name=*it; ++it;
450
QString type=*it; ++it; ++it;
451
createFileEntry(entry,name,url,type);
452
listEntry(entry,false);
456
listEntry(entry, true);
466
void HelloProtocol::get( const KURL& url )
468
/* mimeType("application/x-desktop");
470
output.sprintf("[Desktop Action Format]\n"
477
"Icon=3floppy_mount\n"
478
"MountPoint=/media/floppy\n"
481
"UnmountIcon=3floppy_unmount\n"
486
redirection("file:/");
491
void addAtom(KIO::UDSEntry& entry, unsigned int ID, long l, const QString& s = QString::null)
500
static void createFileEntry(KIO::UDSEntry& entry, const QString& name, const QString& url, const QString& mime)
503
addAtom(entry, KIO::UDS_NAME, 0, name);
504
addAtom(entry, KIO::UDS_FILE_TYPE, S_IFDIR);//REG);
505
addAtom(entry, KIO::UDS_URL, 0, url);
506
addAtom(entry, KIO::UDS_ACCESS, 0500);
507
if (mime.startsWith("icon:")) {
508
kdDebug()<<"setting prefered icon:"<<mime.right(mime.length()-5)<<endl;
509
addAtom(entry,KIO::UDS_ICON_NAME,0,mime.right(mime.length()-5));
510
addAtom(entry,KIO::UDS_MIME_TYPE,0,"inode/directory");
513
addAtom(entry, KIO::UDS_MIME_TYPE, 0, mime);
514
addAtom(entry, KIO::UDS_SIZE, 0);
515
addAtom(entry, KIO::UDS_GUESSED_MIME_TYPE, 0, "inode/directory");
516
addAtom(entry, KIO::UDS_CREATION_TIME,1);
517
addAtom(entry, KIO::UDS_MODIFICATION_TIME,time(0));
521
static void createDirEntry(KIO::UDSEntry& entry, const QString& name, const QString& url, const QString& mime)
524
addAtom(entry, KIO::UDS_NAME, 0, name);
525
addAtom(entry, KIO::UDS_FILE_TYPE, S_IFDIR);
526
addAtom(entry, KIO::UDS_ACCESS, 0500);
527
kdDebug()<<"DEVICES: "<<mime<<endl;
528
if (mime.startsWith("icon:")) {
529
kdDebug()<<"setting prefered icon:"<<mime.right(mime.length()-5)<<endl;
530
addAtom(entry,KIO::UDS_ICON_NAME,0,mime.right(mime.length()-5));
531
addAtom(entry,KIO::UDS_MIME_TYPE,0,"inode/directory");
534
addAtom(entry, KIO::UDS_MIME_TYPE, 0, mime);
536
addAtom(entry, KIO::UDS_URL, 0, url);
537
addAtom(entry, KIO::UDS_SIZE, 0);
538
addAtom(entry, KIO::UDS_GUESSED_MIME_TYPE, 0, "inode/directory");
540
// addAtom(entry, KIO::UDS_GUESSED_MIME_TYPE, 0, "application/x-desktop");