summaryrefslogtreecommitdiffstats
path: root/kmobile/kioslave
diff options
context:
space:
mode:
authortoma <toma@283d02a7-25f6-0310-bc7c-ecb5cbfe19da>2009-11-25 17:56:58 +0000
committertoma <toma@283d02a7-25f6-0310-bc7c-ecb5cbfe19da>2009-11-25 17:56:58 +0000
commit460c52653ab0dcca6f19a4f492ed2c5e4e963ab0 (patch)
tree67208f7c145782a7e90b123b982ca78d88cc2c87 /kmobile/kioslave
downloadtdepim-460c52653ab0dcca6f19a4f492ed2c5e4e963ab0.tar.gz
tdepim-460c52653ab0dcca6f19a4f492ed2c5e4e963ab0.zip
Copy the KDE 3.5 branch to branches/trinity for new KDE 3.5 features.
BUG:215923 git-svn-id: svn://anonsvn.kde.org/home/kde/branches/trinity/kdepim@1054174 283d02a7-25f6-0310-bc7c-ecb5cbfe19da
Diffstat (limited to 'kmobile/kioslave')
-rw-r--r--kmobile/kioslave/Makefile.am18
-rw-r--r--kmobile/kioslave/cellphone.protocol18
-rw-r--r--kmobile/kioslave/kio_mobile.cpp636
-rw-r--r--kmobile/kioslave/kio_mobile.h70
-rw-r--r--kmobile/kioslave/mimetypes/Makefile.am4
-rw-r--r--kmobile/kioslave/mimetypes/mobile_addressbook.desktop61
-rw-r--r--kmobile/kioslave/mimetypes/mobile_calendar.desktop61
-rw-r--r--kmobile/kioslave/mimetypes/mobile_device.desktop65
-rw-r--r--kmobile/kioslave/mimetypes/mobile_notes.desktop59
-rw-r--r--kmobile/kioslave/mobile.protocol18
-rw-r--r--kmobile/kioslave/organizer.protocol18
-rw-r--r--kmobile/kioslave/pda.protocol18
-rw-r--r--kmobile/kioslave/phonecamera.protocol18
13 files changed, 1064 insertions, 0 deletions
diff --git a/kmobile/kioslave/Makefile.am b/kmobile/kioslave/Makefile.am
new file mode 100644
index 000000000..6f9d24201
--- /dev/null
+++ b/kmobile/kioslave/Makefile.am
@@ -0,0 +1,18 @@
+SUBDIRS = mimetypes
+
+INCLUDES = -I$(top_srcdir)/kmobile -I$(top_srcdir) $(all_includes)
+
+kde_module_LTLIBRARIES = kio_mobile.la
+
+kio_mobile_la_SOURCES = kio_mobile.cpp
+kio_mobile_la_LIBADD = $(LIB_KIO) ../libkmobileclient.la
+kio_mobile_la_LDFLAGS = $(all_libraries) $(KDE_RPATH) -module $(KDE_PLUGIN)
+
+kde_services_DATA = mobile.protocol cellphone.protocol \
+ organizer.protocol pda.protocol
+# do not install the camera protocol now - we already have a
+# camera kioslave !!
+# phonecamera.protocol
+
+messages:
+ $(XGETTEXT) *.cpp -o $(podir)/kio_mobile.pot
diff --git a/kmobile/kioslave/cellphone.protocol b/kmobile/kioslave/cellphone.protocol
new file mode 100644
index 000000000..5f37df784
--- /dev/null
+++ b/kmobile/kioslave/cellphone.protocol
@@ -0,0 +1,18 @@
+[Protocol]
+exec=kio_mobile
+protocol=cellphone
+input=none
+output=filesystem
+# listing=Name
+listing=Name,Type,URL,MimeType
+reading=true
+source=true
+writing=true
+makedir=true
+deleting=true
+# linking=true
+# moving=true
+# mimetype=text/plain
+# determineMimetypeFromExtension=true
+DocPath=kioslave/mobile.html
+Icon=mobile_phone
diff --git a/kmobile/kioslave/kio_mobile.cpp b/kmobile/kioslave/kio_mobile.cpp
new file mode 100644
index 000000000..ec987fb06
--- /dev/null
+++ b/kmobile/kioslave/kio_mobile.cpp
@@ -0,0 +1,636 @@
+/* This file is part of the KDE KMobile library
+ Copyright (C) 2003 Helge Deller <deller@kde.org>
+
+ 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 <sys/types.h>
+#include <sys/stat.h>
+
+#include <sys/types.h>
+#include <unistd.h>
+#include <time.h>
+
+#include <qregexp.h>
+
+#include <kdebug.h>
+#include <klocale.h>
+#include <kinstance.h>
+#include <kabc/vcardconverter.h>
+
+#include "kio_mobile.h"
+
+#include <kdepimmacros.h>
+
+using namespace KIO;
+
+#define KIO_MOBILE_DEBUG_AREA 7126
+#define PRINT_DEBUG kdDebug(KIO_MOBILE_DEBUG_AREA) << "kio_mobile: "
+
+extern "C" { KDE_EXPORT int kdemain(int argc, char **argv); }
+
+/**
+ * The main program.
+ */
+int kdemain(int argc, char **argv)
+{
+ KInstance instance( "kio_mobile" );
+
+ PRINT_DEBUG << "Starting " << getpid() << endl;
+
+ if (argc != 4) {
+ fprintf(stderr, "Usage kio_mobile protocol pool app\n");
+ return -1;
+ }
+ // let the protocol class do its work
+ KMobileProtocol slave(argv[2], argv[3]);
+
+ slave.dispatchLoop();
+
+ PRINT_DEBUG << "Done" << endl;
+ return 0;
+}
+
+
+/**
+ * Initialize the mobile slave
+ */
+KMobileProtocol::KMobileProtocol(const QCString &pool, const QCString &app)
+ : SlaveBase( "mobile", pool, app)
+{
+}
+
+KMobileProtocol::~KMobileProtocol()
+{
+}
+
+/*
+ * getDeviceAndRessource("mobile:/<devicename>/<resource>/...") - split
+ */
+int KMobileProtocol::getDeviceAndRessource(const QString &_path,
+ QString &devName, QString &resource, QString &devPath,
+ KMobileDevice::Capabilities &devCaps)
+{
+// PRINT_DEBUG << QString("###getDeviceAndRessource### %1\n").arg(_path);
+ QStringList path = QStringList::split('/', _path, false);
+
+ devName = resource = devPath = QString::null;
+ devCaps = KMobileDevice::hasNothing;
+
+ if (path.count() >= 1) { devName = path[0]; path.pop_front(); };
+ if (path.count() >= 1) { resource = path[0]; path.pop_front(); };
+ if (path.count() >= 1) devPath = path.join("/");
+
+ if (devName.isEmpty())
+ return 0;
+
+ int _caps = m_dev.capabilities(devName);
+
+ if (resource.isEmpty()) {
+ devCaps = (KMobileDevice::Capabilities) _caps;
+ return 0;
+ }
+
+ for (int i=0; i<31; i++) {
+ int cap = 1UL << i;
+ if ((_caps & cap) == 0)
+ continue;
+ QString capname = m_dev.nameForCap(devName,cap);
+ if (capname != resource)
+ continue;
+ devCaps = (KMobileDevice::Capabilities) cap;
+ return 0;
+ }
+
+ return KIO::ERR_DOES_NOT_EXIST;
+}
+
+
+static
+void addAtom(KIO::UDSEntry& entry, unsigned int ID, long l, const QString& s = QString::null)
+{
+ KIO::UDSAtom atom;
+ atom.m_uds = ID;
+ atom.m_long = l;
+ atom.m_str = s;
+ entry.append(atom);
+}
+
+static
+void createDirEntry(KIO::UDSEntry& entry, const QString& name, const QString& url, const QString& mime)
+{
+ entry.clear();
+ addAtom(entry, KIO::UDS_NAME, 0, name);
+ addAtom(entry, KIO::UDS_FILE_TYPE, S_IFDIR);
+ addAtom(entry, KIO::UDS_ACCESS, 0500);
+ addAtom(entry, KIO::UDS_MIME_TYPE, 0, mime);
+ addAtom(entry, KIO::UDS_URL, 0, url);
+ addAtom(entry, KIO::UDS_USER, 0, getenv("USER"));
+ addAtom(entry, KIO::UDS_GROUP, 0, getenv("USER"));
+ PRINT_DEBUG << QString("createDirEntry: File: %1 MIME: %2 URL: %3\n").arg(name).arg(mime).arg(url);
+// addAtom(entry, KIO::UDS_SIZE, 0);
+ addAtom(entry, KIO::UDS_GUESSED_MIME_TYPE, 0, mime);
+}
+
+static
+void createFileEntry(KIO::UDSEntry& entry, const QString& name, const QString& url, const QString& mime,
+ const unsigned long size = 0)
+{
+ entry.clear();
+ addAtom(entry, KIO::UDS_NAME, 0, name);
+ addAtom(entry, KIO::UDS_FILE_TYPE, S_IFREG);
+ addAtom(entry, KIO::UDS_URL, 0, url);
+ addAtom(entry, KIO::UDS_ACCESS, 0400);
+ addAtom(entry, KIO::UDS_USER, 0, getenv("USER"));
+ addAtom(entry, KIO::UDS_GROUP, 0, getenv("USER"));
+ addAtom(entry, KIO::UDS_MIME_TYPE, 0, mime);
+ if (size) addAtom(entry, KIO::UDS_SIZE, size);
+ addAtom(entry, KIO::UDS_GUESSED_MIME_TYPE, 0, mime);
+ PRINT_DEBUG << QString("createFileEntry: File: %1, Size: %2, MIME: %3\n").arg(name).arg(size).arg(mime);
+}
+
+
+/**
+ * Get the information contained in the URL.
+ */
+void KMobileProtocol::get(const KURL &url)
+{
+ PRINT_DEBUG << "###############################\n";
+ PRINT_DEBUG << QString("get(%1)\n").arg(url.path());
+
+ KMobileDevice::Capabilities devCaps;
+ QString devName, resource, devPath;
+
+ int err = getDeviceAndRessource(url.path(), devName, resource, devPath, devCaps);
+ if (err) {
+ error(err, url.path());
+ return;
+ }
+
+ if (devName.isEmpty() || resource.isEmpty()) {
+ error(KIO::ERR_DOES_NOT_EXIST, url.path());
+ return;
+ }
+
+ // collect the result
+ QCString result;
+ QString mime;
+ switch (devCaps) {
+ case KMobileDevice::hasAddressBook: err = getVCard(devName, result, mime, devPath);
+ break;
+ case KMobileDevice::hasCalendar: err = getCalendar(devName, result, mime, devPath);
+ break;
+ case KMobileDevice::hasNotes: err = getNote(devName, result, mime, devPath);
+ break;
+ case KMobileDevice::hasFileStorage: err = getFileStorage(devName, result, mime, devPath);
+ break;
+ default: err = KIO::ERR_CANNOT_ENTER_DIRECTORY; /* TODO */
+ }
+
+ if (err) {
+ error(err, url.path());
+ return;
+ }
+
+ // tell the mimetype
+ mimeType(mime);
+
+ // tell the length
+ KIO::filesize_t processed_size = result.length();
+ totalSize(processed_size);
+
+ // tell the contents of the URL
+ QByteArray array;
+ array.setRawData( result.data(), result.length() );
+ data(array);
+ array.resetRawData( result.data(), result.length() );
+ processedSize( processed_size );
+ // tell we are finished
+ data(QByteArray());
+
+ // tell we are finished
+ finished();
+}
+
+
+/*
+ * listRoot() - gives listing of all devices
+ */
+void KMobileProtocol::listRoot(const KURL& url)
+{
+ PRINT_DEBUG << QString("########## listRoot(%1) for %2:/\n").arg(url.path()).arg(url.protocol());
+
+ KIO::UDSEntry entry;
+
+ QStringList deviceNames = m_dev.deviceNames();
+ unsigned int dirs = deviceNames.count();
+ totalSize(dirs);
+
+ int classMask = KMobileDevice::Unclassified;
+ /* handle all possible protocols here and just add a <protocol>.protocol file */
+ if (url.protocol() == "cellphone") // cellphone:/
+ classMask = KMobileDevice::Phone;
+ if (url.protocol() == "organizer" || // organizer:/
+ url.protocol() == "pda") // pda:/
+ classMask = KMobileDevice::Organizer;
+ if (url.protocol() == "phonecamera") // camera:/
+ classMask = KMobileDevice::Camera;
+
+ for (unsigned int i=0; i<dirs; i++) {
+
+ QString devName = deviceNames[i];
+
+ if (classMask != KMobileDevice::Unclassified &&
+ m_dev.classType(devName) != classMask)
+ continue;
+
+ createDirEntry(entry, devName, "mobile:/"+devName,
+ KMOBILE_MIMETYPE_DEVICE_KONQUEROR(devName));
+ listEntry(entry, false);
+
+ processedSize(i+1);
+ }
+ listEntry(entry, true);
+ finished();
+}
+
+
+/*
+ * folderMimeType() - returns mimetype of the folder itself
+ */
+QString KMobileProtocol::folderMimeType(int cap)
+{
+ QString mimetype;
+ switch (cap) {
+ case KMobileDevice::hasAddressBook: mimetype = KMOBILE_MIMETYPE_INODE "addressbook";
+ break;
+ case KMobileDevice::hasCalendar: mimetype = KMOBILE_MIMETYPE_INODE "calendar";
+ break;
+ case KMobileDevice::hasNotes: mimetype = KMOBILE_MIMETYPE_INODE "notes";
+ break;
+ case KMobileDevice::hasFileStorage:
+ default: mimetype = "inode/directory";
+ }
+ return mimetype;
+}
+
+/*
+ * entryMimeType() - returns mimetype of the entries in the given folder
+ */
+QString KMobileProtocol::entryMimeType(int cap)
+{
+ QString mimetype;
+ switch (cap) {
+ case KMobileDevice::hasAddressBook: mimetype = "text/x-vcard";
+ break;
+ case KMobileDevice::hasCalendar: mimetype = "text/x-vcalendar";
+ break;
+ case KMobileDevice::hasNotes: mimetype = "text/plain";
+ break;
+ case KMobileDevice::hasFileStorage:
+ default: mimetype = "text/plain";
+ }
+ return mimetype;
+}
+
+/*
+ * listTopDeviceDir("mobile:/<devicename>") - sub-directory of a devices
+ */
+
+void KMobileProtocol::listTopDeviceDir(const QString &devName)
+{
+ PRINT_DEBUG << QString("listTopDeviceDir(%1)\n").arg(devName);
+
+ KIO::UDSEntry entry;
+ unsigned int caps = m_dev.capabilities(devName);
+
+ for (int i=0; i<31; i++) {
+ unsigned int cap = 1UL<<i;
+ if ((caps & cap) == 0)
+ continue;
+
+ QString filename = m_dev.nameForCap(devName, cap);
+ QString mimetype = folderMimeType(cap);
+
+ createDirEntry(entry, filename, QString("mobile:/%1/%2/").arg(devName).arg(filename), mimetype);
+ listEntry(entry, false);
+ }
+ listEntry(entry, true);
+ finished();
+}
+
+
+/*
+ * listEntries("mobile:/<devicename>/<resource>") - resources of a device
+ */
+void KMobileProtocol::listEntries(const QString &devName,
+ const QString &resource, const QString &devPath,
+ const KMobileDevice::Capabilities devCaps)
+{
+ PRINT_DEBUG << QString("listEntries(%1,%2,%3)\n").arg(devName).arg(resource).arg(devPath);
+ switch (devCaps) {
+ case KMobileDevice::hasAddressBook: listAddressBook(devName, resource);
+ break;
+ case KMobileDevice::hasCalendar: listCalendar(devName, resource);
+ break;
+ case KMobileDevice::hasNotes: listNotes(devName, resource);
+ break;
+ case KMobileDevice::hasFileStorage: listFileStorage(devName, resource, devPath);
+ break;
+ default: error( ERR_CANNOT_ENTER_DIRECTORY,
+ QString("/%1/%2").arg(devName).arg(resource) );
+ }
+}
+
+/*
+ * listAddressBook("mobile:/<devicename>/Addressbook) - list the addressbook
+ */
+void KMobileProtocol::listAddressBook(const QString &devName, const QString &resource)
+{
+ PRINT_DEBUG << QString("listAddressBook(%1)\n").arg(devName);
+
+ KIO::UDSEntry entry;
+
+ int fieldwidth;
+ int entries = m_dev.numAddresses(devName);
+ if (entries>=1000) fieldwidth=4; else
+ if (entries>=100) fieldwidth=3; else
+ if (entries>=10) fieldwidth=2; else fieldwidth=1;
+ totalSize(entries);
+// QRegExp rx; rx.setPattern( ".*FN:([\\w\\s]*)[\\n\\r]{2}.*" );
+ QString name;
+ for (int i=0; i<entries; i++) {
+
+#if 0
+ QString content = m_dev.readAddress(devName, i);
+ if ( rx.search( content ) < 0 )
+ name = QString::null;
+ else
+ name = "_" + rx.cap(1);
+#endif
+
+ QString filename = QString("%1%2.vcf").arg(i,fieldwidth).arg(name);
+ for (int p=0; p<fieldwidth; p++) {
+ if (filename[p]==' ') filename[p]='0'; else break;
+ }
+ QString url = QString("mobile:/%1/%2/%3").arg(devName).arg(resource).arg(filename);
+
+ createFileEntry(entry, filename, url, entryMimeType(KMobileDevice::hasAddressBook),
+ 400 /*content.utf8().length()*/ );
+ listEntry(entry, false);
+
+ processedSize(i+1);
+ }
+ listEntry(entry, true);
+ finished();
+}
+
+/*
+ * getVCard() - gives the vCard of the given file
+ */
+int KMobileProtocol::getVCard( const QString &devName, QCString &result, QString &mime, const QString &path )
+{
+ PRINT_DEBUG << QString("getVCard(%1)\n").arg(path);
+
+ int index = path.find('.');
+ if (index>0)
+ index = path.left(index).toInt();
+ if (index<0 || index>=m_dev.numAddresses(devName))
+ return KIO::ERR_DOES_NOT_EXIST;
+
+ QString str = m_dev.readAddress(devName, index);
+ if (str.isEmpty())
+ return KIO::ERR_INTERNAL;
+ result = str.utf8();
+ mime = entryMimeType(KMobileDevice::hasAddressBook);
+// setMetaData("plugin", "const QString &key, const QString &value);
+ return 0;
+}
+
+/*
+ * listCalendar("mobile:/<devicename>/Calendar) - list the calendar entries
+ */
+void KMobileProtocol::listCalendar( const QString &devName, const QString &resource)
+{
+ PRINT_DEBUG << QString("listCalendar(%1)\n").arg(devName);
+
+ KIO::UDSEntry entry;
+
+ int entries = m_dev.numCalendarEntries(devName);
+ totalSize(entries);
+ for (int i=0; i<entries; i++) {
+
+ QString filename = QString("%1_%2.vcs").arg(i).arg(i18n("calendar"));
+ QString url = QString("mobile:/%1/%2/%3").arg(devName).arg(resource).arg(filename);
+
+ createFileEntry(entry, filename, url, entryMimeType(KMobileDevice::hasCalendar));
+ listEntry(entry, false);
+
+ processedSize(i+1);
+ }
+ listEntry(entry, true);
+ finished();
+}
+
+/*
+ * getCalendar() - reads a calendar entry
+ */
+int KMobileProtocol::getCalendar( const QString &devName, QCString &result, QString &mime, const QString &path)
+{
+ PRINT_DEBUG << QString("getCalendar(%1, #%2)\n").arg(devName).arg(path);
+
+ /* TODO */
+ Q_UNUSED(result);
+ Q_UNUSED(mime);
+ return KIO::ERR_CANNOT_ENTER_DIRECTORY;
+}
+
+
+/*
+ * listNotes("mobile:/<devicename>/Notes) - list the notes
+ */
+void KMobileProtocol::listNotes( const QString &devName, const QString &resource)
+{
+ PRINT_DEBUG << QString("listNotes(%1)\n").arg(devName);
+
+ KIO::UDSEntry entry;
+
+ int entries = m_dev.numNotes(devName);
+ totalSize(entries);
+ for (int i=0; i<entries; i++) {
+
+ QString note /*= m_dev.readNote(devName, i)*/;
+
+ QString filename = QString("%1_%2.txt").arg(i).arg(i18n("note"));
+ QString url = QString("mobile:/%1/%2/%3").arg(devName).arg(resource).arg(filename);
+
+ createFileEntry(entry, filename, url, entryMimeType(KMobileDevice::hasNotes),
+ 0 /*note.utf8().length()*/);
+ listEntry(entry, false);
+
+ processedSize(i+1);
+ }
+ listEntry(entry, true);
+ finished();
+}
+
+/*
+ * getNote() - gives the Note of the given file
+ */
+int KMobileProtocol::getNote( const QString &devName, QCString &result, QString &mime, const QString &path )
+{
+ PRINT_DEBUG << QString("getNote(%1)\n").arg(path);
+
+ int index = path.find('_');
+ if (index>0)
+ index = path.left(index).toInt();
+ if (index<0 || index>=m_dev.numNotes(devName))
+ return KIO::ERR_DOES_NOT_EXIST;
+
+ QString note = m_dev.readNote(devName, index);
+ if (note.isEmpty())
+ return KIO::ERR_DOES_NOT_EXIST;
+
+ result = note.utf8();
+ mime = entryMimeType(KMobileDevice::hasNotes);
+ return 0;
+}
+
+/*
+ * listFileStorage("mobile:/<devicename>/Files) - list the files on the device
+ */
+void KMobileProtocol::listFileStorage(const QString &devName, const QString &resource, const QString &devPath)
+{
+ PRINT_DEBUG << QString("listFileStorage(%1,%2)\n").arg(devName).arg(devPath);
+
+ /* TODO */
+ error( KIO::ERR_DOES_NOT_EXIST, QString("/%1/%2/%3").arg(devName).arg(resource).arg(devPath) );
+}
+
+/*
+ * getFileStorage() - gives the file contents of the given file
+ */
+int KMobileProtocol::getFileStorage(const QString &devName, QCString &result, QString &mime, const QString &path)
+{
+ PRINT_DEBUG << QString("getFileStorage(%1)\n").arg(path);
+
+ /* TODO */
+ Q_UNUSED(devName);
+ Q_UNUSED(result);
+ Q_UNUSED(mime);
+ return KIO::ERR_CANNOT_ENTER_DIRECTORY;
+}
+
+
+/**
+ * Test if the url contains a directory or a file.
+ */
+void KMobileProtocol::stat( const KURL &url )
+{
+ PRINT_DEBUG << "###############################\n";
+ PRINT_DEBUG << QString("stat(%1)\n").arg(url.path());
+
+ KMobileDevice::Capabilities devCaps;
+ QString devName, resource, devPath;
+
+ int err = getDeviceAndRessource(url.path(), devName, resource, devPath, devCaps);
+ if (err) {
+ error(err, url.path());
+ return;
+ }
+
+ QStringList path = QStringList::split('/', url.path(), false);
+ QString filename = (path.count()>0) ? path[path.count()-1] : "/";
+ QString fullPath = path.join("/");
+ QString fullUrl = QString("mobile:/%1").arg(fullPath);
+
+ UDSEntry entry;
+
+ bool isDir = devPath.isEmpty();
+
+ if (isDir) {
+ createDirEntry(entry, filename, fullUrl, folderMimeType(devCaps));
+ } else {
+ createFileEntry(entry, filename, fullUrl, entryMimeType(devCaps));
+ }
+
+ statEntry(entry);
+ finished();
+}
+
+/**
+ * Get the mimetype.
+ */
+void KMobileProtocol::mimetype(const KURL &url)
+{
+ PRINT_DEBUG << "###############################\n";
+ PRINT_DEBUG << QString("mimetype(%1)\n").arg(url.path());
+
+ KMobileDevice::Capabilities devCaps;
+ QString devName, resource, devPath;
+
+ int err = getDeviceAndRessource(url.path(), devName, resource, devPath, devCaps);
+ if (err) {
+ error(err, url.path());
+ return;
+ }
+
+ // tell the mimetype
+ mimeType(entryMimeType(devCaps));
+ finished();
+}
+
+/**
+ * List the contents of a directory.
+ */
+void KMobileProtocol::listDir(const KURL &url)
+{
+ PRINT_DEBUG << "###############################\n";
+ PRINT_DEBUG << QString("listDir(%1)\n").arg(url.path());
+
+ if (!m_dev.isKMobileAvailable()) {
+ error( KIO::ERR_CONNECTION_BROKEN, i18n("KDE Mobile Device Manager") );
+ return;
+ }
+
+ KMobileDevice::Capabilities devCaps;
+ QString devName, resource, devPath;
+
+ int err = getDeviceAndRessource(url.path(), devName, resource, devPath, devCaps);
+ if (err) {
+ error(err, url.path());
+ return;
+ }
+
+ if (devName.isEmpty()) {
+ listRoot(url);
+ return;
+ }
+
+#if 0
+ if (!dev) {
+ error( KIO::ERR_DOES_NOT_EXIST, QString("/%1").arg(devName) );
+ return;
+ }
+#endif
+
+ if (resource.isEmpty()) {
+ listTopDeviceDir(devName);
+ return;
+ }
+
+ listEntries(devName, resource, devPath, devCaps);
+}
diff --git a/kmobile/kioslave/kio_mobile.h b/kmobile/kioslave/kio_mobile.h
new file mode 100644
index 000000000..8094f514b
--- /dev/null
+++ b/kmobile/kioslave/kio_mobile.h
@@ -0,0 +1,70 @@
+/* This file is part of the KDE mobile library.
+ Copyright (C) 2004 Helge Deller <deller@kde.org>
+
+ 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.
+*/
+
+#ifndef __KIO_MOBILE_H__
+#define __KIO_MOBILE_H__
+
+#include <qstring.h>
+#include <qvaluelist.h>
+
+#include <kio/slavebase.h>
+#include <kmobiledevice.h>
+#include <kmobileclient.h>
+
+class KMobileProtocol : public KIO::SlaveBase
+{
+public:
+ KMobileProtocol( const QCString &pool, const QCString &app );
+ ~KMobileProtocol();
+
+ void get( const KURL& url );
+ void stat( const KURL& url );
+ void mimetype( const KURL& url );
+ void listDir( const KURL& url );
+
+protected:
+ int getDeviceAndRessource(const QString &_path,
+ QString &devName, QString &resource, QString &devPath,
+ KMobileDevice::Capabilities &devCaps);
+
+ QString folderMimeType(int cap);
+ QString entryMimeType(int cap);
+
+ void listRoot(const KURL& url);
+ void listTopDeviceDir(const QString &devName);
+ void listEntries(const QString &devName,
+ const QString &resource, const QString &devPath,
+ const KMobileDevice::Capabilities devCaps);
+
+ void listAddressBook(const QString &devName, const QString &resource);
+ int getVCard( const QString &devName, QCString &result, QString &mime, const QString &path );
+
+ void listCalendar(const QString &devName, const QString &resource);
+ int getCalendar( const QString &devName, QCString &result, QString &mime, const QString &path );
+
+ void listNotes(const QString &devName, const QString &resource);
+ int getNote( const QString &devName, QCString &result, QString &mime, const QString &path );
+
+ void listFileStorage(const QString &devName, const QString &resource, const QString &devPath);
+ int getFileStorage( const QString &devName, QCString &result, QString &mime, const QString &path );
+
+private:
+ KMobileClient m_dev;
+};
+
+#endif
diff --git a/kmobile/kioslave/mimetypes/Makefile.am b/kmobile/kioslave/mimetypes/Makefile.am
new file mode 100644
index 000000000..5105c51bf
--- /dev/null
+++ b/kmobile/kioslave/mimetypes/Makefile.am
@@ -0,0 +1,4 @@
+mimetype_DATA = \
+ mobile_addressbook.desktop mobile_calendar.desktop mobile_notes.desktop \
+ mobile_device.desktop
+mimetypedir = $(kde_mimedir)/inode
diff --git a/kmobile/kioslave/mimetypes/mobile_addressbook.desktop b/kmobile/kioslave/mimetypes/mobile_addressbook.desktop
new file mode 100644
index 000000000..53a041c1f
--- /dev/null
+++ b/kmobile/kioslave/mimetypes/mobile_addressbook.desktop
@@ -0,0 +1,61 @@
+[Desktop Entry]
+Comment=Contacts in Mobile Device
+Comment[af]=Kontakte op die draagbare toestel
+Comment[ar]=المراسلون في الجهاز النقّال
+Comment[be]=Кантакты ў мабільнай прыладзе
+Comment[bg]=Контакти в мобилни устройства
+Comment[bs]=Kontakti u mobilnom uređaju
+Comment[ca]=Contactes en el dispositiu mòbil
+Comment[cs]=Kontakty na mobilním zařízení
+Comment[cy]=Cysylltau yn y Dyfais Symudol
+Comment[da]=Kontakter i mobil-enhed
+Comment[de]=Kontakte im Mobilgerät
+Comment[el]=Επαφές στη φορητή συσκευή
+Comment[es]=Contactos del dispositivo móvil
+Comment[et]=Mobiili kontaktid
+Comment[eu]=Kontaktuak dispositibo mugikorrean
+Comment[fa]=تماسها در دستگاه تلفن همراه
+Comment[fi]=Mobiililaitteen yhteystiedot
+Comment[fr]=Contacts dans le périphérique mobile
+Comment[fy]=Kontaktpersoanen yn mobyl apparaat
+Comment[ga]=Teagmhálacha i nGléas Móibíleach
+Comment[gl]=Contactos no dispositivo móbil
+Comment[he]=אנשי קשר בהתקן הנייד
+Comment[hi]=मोबाइल उपकरण में सम्पर्क
+Comment[hu]=Címbejegyzések a mobiltelefonon
+Comment[is]=Tengiliðir í farsíma eða lófatölvu
+Comment[it]=Contatti nel dispositivo portatile
+Comment[ja]=モバイル機器内の連絡先
+Comment[ka]=კონტაქტები მობილურ მოწყობილობაზ
+Comment[kk]=Қалта құрылғыдағы контакттар
+Comment[km]=ទំនាក់​ទំនង​ក្នុង​ឧបករណ៍​ចល័ត
+Comment[lt]=Kontaktai mobiliajame įrenginyje
+Comment[mk]=Контакти од мобилен уред
+Comment[ms]=Orang hubungan di dalam Peranti Mudah Alih
+Comment[nb]=Kontaktliste i mobil enhet
+Comment[nds]=Kontakten op de Mobilreedschap
+Comment[ne]=मोबाइल यन्त्रमा सम्पर्क गर्छ
+Comment[nl]=Contactpersonen in mobiel apparaat
+Comment[nn]=Kontaktar i mobileiningar
+Comment[pl]=Wizytówki w urządzeniu przenośnym
+Comment[pt]=Contactos no Dispositivo Móvel
+Comment[pt_BR]=Contatos em Dispositivo Móvel
+Comment[ro]=Contacte în dispozitiv mobil
+Comment[ru]=Контакты на мобильном устройстве
+Comment[sk]=Kontakty v prenosnom zariadení
+Comment[sl]=Stiki v prenosni napravi
+Comment[sr]=Контакти у мобилном уређају
+Comment[sr@Latn]=Kontakti u mobilnom uređaju
+Comment[sv]=Kontakter i mobilenhet
+Comment[ta]=நடமாடும் சாதனத்தின் தொடர்ப்புகள்
+Comment[tg]=Алоқот дар дастгоҳи мобилӣ
+Comment[tr]=Taşınabilir Aygıt Bağlantıları
+Comment[uk]=Контакти у мобільному пристрої
+Comment[zh_CN]=移动设备中的联系人
+Comment[zh_TW]=行動裝置中的聯絡人
+Icon=kaddressbook
+Type=MimeType
+MimeType=inode/addressbook
+Patterns=
+
+X-KDE-AutoEmbed=true
diff --git a/kmobile/kioslave/mimetypes/mobile_calendar.desktop b/kmobile/kioslave/mimetypes/mobile_calendar.desktop
new file mode 100644
index 000000000..35fa7b9ba
--- /dev/null
+++ b/kmobile/kioslave/mimetypes/mobile_calendar.desktop
@@ -0,0 +1,61 @@
+[Desktop Entry]
+Comment=Calendar in Mobile Device
+Comment[af]=Kalender op die draagbare toestel
+Comment[be]=Каляндар у мабільнай прыладзе
+Comment[bg]=Календар в мобилни устройства
+Comment[bs]=Kalendar u mobilnom uređaju
+Comment[ca]=Calendari en el dispositiu mòbil
+Comment[cs]=Kalendář na mobilním zařízení
+Comment[cy]=Calendr yn y Dyfais Symudol
+Comment[da]=Kalender i mobil-enhed
+Comment[de]=Kalender für Mobiltelefon
+Comment[el]=Ημερολόγιο στη φορητή συσκευή
+Comment[eo]=Kalendaro en mobila aparato
+Comment[es]=Calendario del dispositivo móvil
+Comment[et]=Mobiili kalender
+Comment[eu]=Egutegia dispositibo mugikorrean
+Comment[fa]=تقویم در دستگاه تلفن همراه
+Comment[fi]=Mobiililaitteen kalenteri
+Comment[fr]=Calendrier dans un périphérique mobile
+Comment[fy]=Aginda yn mobyl apparaat
+Comment[ga]=Féilire i nGléas Móibíleach
+Comment[gl]=Calendario no Dispositivo Móbil
+Comment[he]=לוח שנה בהתקן הנייד
+Comment[hi]=मोबाइल उपकरण में कैलेन्डर
+Comment[hu]=Naptár a mobiltelefonon
+Comment[is]=Dagatal í farsíma eða lófatölvu
+Comment[it]=Calendari nel dispositivo portatile
+Comment[ja]=モバイル機器内のカレンダー
+Comment[ka]=კალენდარი მობილურ მოწყობილობაზე
+Comment[kk]=Қалта құрылғыдағы күнтізбе
+Comment[km]=ប្រតិទិន​ក្នុង​ឧបករណ៍​ចល័ត
+Comment[lt]=Kalendorius mobiliajame įrenginyje
+Comment[mk]=Календар од мобилен уред
+Comment[ms]=Kalendar dalam Peranti Mudah Alih
+Comment[nb]=Kalender i mobil enhet
+Comment[nds]=Kalenner op Mobilreedschap
+Comment[ne]=मोबाइल यन्त्रको क्यालेन्डर
+Comment[nl]=Agenda in mobiel apparaat
+Comment[nn]=Kalender i mobileiningar
+Comment[pl]=Kalendarz w urządzeniu przenośnym
+Comment[pt]=Calendário no Dispositivo Móvel
+Comment[pt_BR]=Calendário em Dispositivo Móvel
+Comment[ro]=Calendar în dispozitiv mobil
+Comment[ru]=Календарь на мобильном устройстве
+Comment[sk]=Kalendár v prenosnom zariadení
+Comment[sl]=Koledar v prenosni napravi
+Comment[sr]=Календар у мобилном уређају
+Comment[sr@Latn]=Kalendar u mobilnom uređaju
+Comment[sv]=Kalender i mobilenhet
+Comment[ta]=நடமாடும் சாதனத்தில் உள்ள நாள்காட்டி
+Comment[tg]=Тақвим дар дастгоҳи мобилӣ
+Comment[tr]=Cep Telefonu Takvimi
+Comment[uk]=Календар у мобільному пристрої
+Comment[zh_CN]=移动设备中的日历
+Comment[zh_TW]=行動裝置中的行事曆
+Icon=korganizer
+Type=MimeType
+MimeType=inode/calendar
+Patterns=
+
+X-KDE-AutoEmbed=true
diff --git a/kmobile/kioslave/mimetypes/mobile_device.desktop b/kmobile/kioslave/mimetypes/mobile_device.desktop
new file mode 100644
index 000000000..025d5d5d8
--- /dev/null
+++ b/kmobile/kioslave/mimetypes/mobile_device.desktop
@@ -0,0 +1,65 @@
+[Desktop Entry]
+Comment=Mobile Device
+Comment[af]=Draagbare Toestel
+Comment[ar]=الجهاز النقّال
+Comment[be]=Мабільная прылада
+Comment[bg]=Мобилни устройства
+Comment[br]=Trobarzhell lem-laka
+Comment[bs]=Mobilni uređaj
+Comment[ca]=Dispositiu mòbil
+Comment[cs]=Mobilní zařízení
+Comment[cy]=Dyfais Symudol
+Comment[da]=Mobil-enhed
+Comment[de]=Mobilgerät
+Comment[el]=Φορητή συσκευή
+Comment[eo]=Mobila aparato
+Comment[es]=Dispositivo móvil
+Comment[et]=Mobiil
+Comment[eu]=Dispositibo mugikorra
+Comment[fa]=دستگاه تلفن همراه
+Comment[fi]=Mobiililaite
+Comment[fr]=Périphérique mobile
+Comment[fy]=Mobyl apparaat
+Comment[ga]=Gléas Móibíleach
+Comment[gl]=Dispositivo Móbil
+Comment[he]=התקן נייד
+Comment[hi]=मोबाइल उपकरण
+Comment[hu]=Mobil eszköz
+Comment[is]=Farsími eða lófatölva
+Comment[it]=Dispositivo portatile
+Comment[ja]=モバイル機器
+Comment[ka]=მობილური მოწყობილობა
+Comment[kk]=Қалта құрылғысы
+Comment[km]=ឧបករណ៍​ចល័ត
+Comment[lt]=Mobilusis įrenginys
+Comment[mk]=Мобилен уред
+Comment[ms]=Peranti Mudah Alih
+Comment[nb]=Mobil enhet
+Comment[nds]=Mobilreedschap
+Comment[ne]=मोबाइल यन्त्र
+Comment[nl]=Mobiel apparaat
+Comment[nn]=Mobileining
+Comment[pa]=ਮੋਬਾਇਲ ਜੰਤਰ
+Comment[pl]=Urządzenie przenośne
+Comment[pt]=Dispositivo Móvel
+Comment[pt_BR]=Dispositivo Móvel
+Comment[ro]=Dispozitiv mobil
+Comment[ru]=Мобильное устройство
+Comment[se]=Mobilovttadat
+Comment[sk]=Prenosné zariadenie
+Comment[sl]=Mobilna naprava
+Comment[sr]=Мобилни уређај
+Comment[sr@Latn]=Mobilni uređaj
+Comment[sv]=Mobilenhet
+Comment[ta]= நடமாடும் சாதனம்
+Comment[tg]=Дастгоҳи мобилӣ
+Comment[tr]=Taşınabilir Aygıt
+Comment[uk]=Мобільний пристрій
+Comment[zh_CN]=移动设备
+Comment[zh_TW]=行動裝置
+Icon=kmobile
+Type=MimeType
+MimeType=kdedevice/mobiledevice
+Patterns=
+
+X-KDE-AutoEmbed=true
diff --git a/kmobile/kioslave/mimetypes/mobile_notes.desktop b/kmobile/kioslave/mimetypes/mobile_notes.desktop
new file mode 100644
index 000000000..12dc25c0c
--- /dev/null
+++ b/kmobile/kioslave/mimetypes/mobile_notes.desktop
@@ -0,0 +1,59 @@
+[Desktop Entry]
+Comment=Notes in Mobile Device
+Comment[af]=Notas op die draagbare toestel
+Comment[be]=Нататкі ў мабільнай прыладзе
+Comment[bg]=Бележки в мобилни устройства
+Comment[bs]=Bilješke u mobilnom uređaju
+Comment[ca]=Notes en el dispositiu mòbil
+Comment[cs]=Poznámky na mobilním zařízení
+Comment[cy]=Nodiadau yn y Dyfais Symudol
+Comment[da]=Noter i mobil-enhed
+Comment[de]=Notizen im Mobilgerät
+Comment[el]=Σημειώσεις στη φορητή συσκευή
+Comment[es]=Notas del dispositivo móvil
+Comment[et]=Mobiili märkmed (Notes)
+Comment[eu]=Oharrak dispositibo mugikorrean
+Comment[fa]=یادداشتها در دستگاه تلفن همراه
+Comment[fi]=Mobiililaitteen muistio
+Comment[fr]=Notes dans un périphérique mobile
+Comment[fy]=Notysjes yn mobyl apparaat
+Comment[ga]=Nótaí i nGléas Móibíleach
+Comment[gl]=Notas no Dispositivo Móbil
+Comment[he]=פתקים בהתקן הנייד
+Comment[hi]=मोबाइल उपकरण में टीप
+Comment[hu]=Feljegyzések a mobiltelefonon
+Comment[is]=Áminningar í farsíma eða lófatölvu
+Comment[it]=Note nel dispositivo portatile
+Comment[ja]=モバイル機器内のメモ
+Comment[ka]=ჩანიშვნები მობილურ ტელეფონზე
+Comment[kk]=Қалта құрылғыдағы жазбалар
+Comment[km]=ចំណាំ​ក្នុង​ឧបករណ៍​ចល័ត
+Comment[lt]=Užrašai mobiliajame įrenginyje
+Comment[mk]=Белешки од мобилен уред
+Comment[ms]=Nota dalam Peranti Mudah Alih
+Comment[nb]=Notater i mobil enhet
+Comment[nds]=Notizen op Mobilreedschap
+Comment[ne]=मोबाइल यन्त्र भित्रका टिपोट
+Comment[nl]=Notities in mobiel apparaat
+Comment[nn]=Notat i mobileiningar
+Comment[pl]=Notatki w urządzeniu przenośnym
+Comment[pt]=Notas no Dispositivo Móvel
+Comment[pt_BR]=Notas em Dispositivo Móvel
+Comment[ru]=Заметки на мобильном устройстве
+Comment[sk]=Poznámky v prenosnom zariadení
+Comment[sl]=Notice v prenosni napravi
+Comment[sr]=Белешке у мобилном уређају
+Comment[sr@Latn]=Beleške u mobilnom uređaju
+Comment[sv]=Anteckning i mobilenhet
+Comment[ta]=நடமாடும் சாதனத்தின் குறிப்புகள்
+Comment[tg]=Хабарҳо дар дастгоҳи мобилӣ
+Comment[tr]=Cep Telefonu Notları
+Comment[uk]=Нотатки у мобільному пристрої
+Comment[zh_CN]=移动电话中的便笺
+Comment[zh_TW]=行動裝置中的備忘錄
+Icon=knotes
+Type=MimeType
+MimeType=inode/notes
+Patterns=
+
+X-KDE-AutoEmbed=true
diff --git a/kmobile/kioslave/mobile.protocol b/kmobile/kioslave/mobile.protocol
new file mode 100644
index 000000000..7b8385f86
--- /dev/null
+++ b/kmobile/kioslave/mobile.protocol
@@ -0,0 +1,18 @@
+[Protocol]
+exec=kio_mobile
+protocol=mobile
+input=none
+output=filesystem
+# listing=Name
+listing=Name,Type,Size,Date,AccessDate,Access,URL,MimeType
+reading=true
+source=true
+writing=true
+makedir=true
+deleting=true
+# linking=true
+# moving=true
+# mimetype=text/plain
+# determineMimetypeFromExtension=true
+DocPath=kioslave/mobile.html
+Icon=kaddressbook
diff --git a/kmobile/kioslave/organizer.protocol b/kmobile/kioslave/organizer.protocol
new file mode 100644
index 000000000..b211a74f9
--- /dev/null
+++ b/kmobile/kioslave/organizer.protocol
@@ -0,0 +1,18 @@
+[Protocol]
+exec=kio_mobile
+protocol=organizer
+input=none
+output=filesystem
+# listing=Name
+listing=Name,Type,Size,Date,AccessDate,Access,URL,MimeType
+reading=true
+source=true
+writing=true
+makedir=true
+deleting=true
+# linking=true
+# moving=true
+# mimetype=text/plain
+# determineMimetypeFromExtension=true
+DocPath=kioslave/mobile.html
+Icon=mobile_organizer
diff --git a/kmobile/kioslave/pda.protocol b/kmobile/kioslave/pda.protocol
new file mode 100644
index 000000000..cbab2e03a
--- /dev/null
+++ b/kmobile/kioslave/pda.protocol
@@ -0,0 +1,18 @@
+[Protocol]
+exec=kio_mobile
+protocol=pda
+input=none
+output=filesystem
+# listing=Name
+listing=Name,Type,Size,Date,AccessDate,Access,URL,MimeType
+reading=true
+source=true
+writing=true
+makedir=true
+deleting=true
+# linking=true
+# moving=true
+# mimetype=text/plain
+# determineMimetypeFromExtension=true
+DocPath=kioslave/mobile.html
+Icon=mobile_organizer
diff --git a/kmobile/kioslave/phonecamera.protocol b/kmobile/kioslave/phonecamera.protocol
new file mode 100644
index 000000000..7a0b341f2
--- /dev/null
+++ b/kmobile/kioslave/phonecamera.protocol
@@ -0,0 +1,18 @@
+[Protocol]
+exec=kio_mobile
+protocol=camera
+input=none
+output=filesystem
+# listing=Name
+listing=Name,Type,URL,MimeType
+reading=true
+source=true
+writing=true
+makedir=true
+deleting=true
+# linking=true
+# moving=true
+# mimetype=text/plain
+# determineMimetypeFromExtension=true
+DocPath=kioslave/mobile.html
+Icon=mobile_camera