/* This file is part of the KDE Project Copyright (c) 2004 Kévin Ottens 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 "removablebackend.h" #include #include #include #include #include #ifdef _OS_SOLARIS_ #define MTAB "/etc/mnttab" #else #define MTAB "/etc/mtab" #endif RemovableBackend::RemovableBackend(MediaList &list) : TQObject(), BackendBase(list) { KDirWatch::self()->addFile(MTAB); connect( KDirWatch::self(), TQT_SIGNAL( dirty(const TQString&) ), this, TQT_SLOT( slotDirty(const TQString&) ) ); KDirWatch::self()->startScan(); } RemovableBackend::~RemovableBackend() { TQStringList::iterator it = m_removableIds.begin(); TQStringList::iterator end = m_removableIds.end(); for (; it!=end; ++it) { m_mediaList.removeMedium(*it, false); } KDirWatch::self()->removeFile(MTAB); } bool RemovableBackend::plug(const TQString &devNode, const TQString &label) { TQString name = generateName(devNode); TQString id = generateId(devNode); if (!m_removableIds.tqcontains(id)) { Medium *medium = new Medium(id, name); medium->mountableState(devNode, TQString::null, TQString::null, false); TQStringList words = TQStringList::split(" ", label); TQStringList::iterator it = words.begin(); TQStringList::iterator end = words.end(); TQString tmp = (*it).lower(); tmp[0] = tmp[0].upper(); TQString new_label = tmp; ++it; for (; it!=end; ++it) { tmp = (*it).lower(); tmp[0] = tmp[0].upper(); new_label+= " "+tmp; } medium->setLabel(new_label); medium->setMimeType("media/removable_unmounted"); m_removableIds.append(id); return !m_mediaList.addMedium(medium).isNull(); } return false; } bool RemovableBackend::unplug(const TQString &devNode) { TQString id = generateId(devNode); if (m_removableIds.tqcontains(id)) { m_removableIds.remove(id); return m_mediaList.removeMedium(id); } return false; } bool RemovableBackend::camera(const TQString &devNode) { TQString id = generateId(devNode); if (m_removableIds.tqcontains(id)) { return m_mediaList.changeMediumState(id, TQString("camera:/"), false, "media/gphoto2camera"); } return false; } void RemovableBackend::slotDirty(const TQString &path) { if (path==MTAB) { handleMtabChange(); } } void RemovableBackend::handleMtabChange() { TQStringList new_mtabIds; KMountPoint::List mtab = KMountPoint::currentMountPoints(); KMountPoint::List::iterator it = mtab.begin(); KMountPoint::List::iterator end = mtab.end(); for (; it!=end; ++it) { TQString dev = (*it)->mountedFrom(); TQString mp = (*it)->mountPoint(); TQString fs = (*it)->mountType(); TQString id = generateId(dev); new_mtabIds+=id; if ( !m_mtabIds.tqcontains(id) && m_removableIds.tqcontains(id) ) { m_mediaList.changeMediumState(id, dev, mp, fs, true, false, "media/removable_mounted"); } } TQStringList::iterator it2 = m_mtabIds.begin(); TQStringList::iterator end2 = m_mtabIds.end(); for (; it2!=end2; ++it2) { if ( !new_mtabIds.tqcontains(*it2) && m_removableIds.tqcontains(*it2) ) { m_mediaList.changeMediumState(*it2, false, false, "media/removable_unmounted"); } } m_mtabIds = new_mtabIds; } TQString RemovableBackend::generateId(const TQString &devNode) { TQString dev = KStandardDirs::realFilePath(devNode); return "/org/kde/mediamanager/removable/" +dev.tqreplace("/", ""); } TQString RemovableBackend::generateName(const TQString &devNode) { return KURL(devNode).fileName(); } #include "removablebackend.moc"