--- /dev/null
+/*---------------------------------------------------------------------\
+| ____ _ __ __ ___ |
+| |__ / \ / / . \ . \ |
+| / / \ V /| _/ _/ |
+| / /__ | | | | | | |
+| /_____||_| |_| |_| |
+| |
+\---------------------------------------------------------------------*/
+/** \file zypp/target/hal/HalContext.cc
+ *
+ * \brief Hardware abstaction layer library wrapper implementation.
+ */
+#include <zypp/target/hal/HalException.h>
+//////////////////////////////////////////////////////////////////////
+namespace zypp
+{ ////////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////
+ namespace target
+ { //////////////////////////////////////////////////////////////////
+ //////////////////////////////////////////////////////////////////
+ namespace hal
+ { ////////////////////////////////////////////////////////////////
+ NoHalException::NoHalException()
+ : Exception(_("Sorry, but this version of libzypp was built without HAL support."))
+ {}
+ ////////////////////////////////////////////////////////////////
+ } // namespace hal
+ //////////////////////////////////////////////////////////////////
+ //////////////////////////////////////////////////////////////////
+ } // namespace target
+ ////////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////
+} // namespace zypp
+//////////////////////////////////////////////////////////////////////
+
+#ifndef NO_HAL // disables zypp's HAL dependency
+
+#include <zypp/target/hal/HalContext.h>
+#include <zypp/thread/Mutex.h>
+#include <zypp/thread/MutexLock.h>
+#include <zypp/base/NonCopyable.h>
+#include <zypp/base/Logger.h>
+#include <zypp/base/String.h>
+#include <zypp/base/Gettext.h>
+
+#include <hal/libhal.h>
+#include <hal/libhal-storage.h>
+
+#include <iostream>
+
+using namespace std;
+
+//////////////////////////////////////////////////////////////////////
+namespace zypp
+{ ////////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////
+ namespace target
+ { //////////////////////////////////////////////////////////////////
+ //////////////////////////////////////////////////////////////////
+ namespace hal
+ { ////////////////////////////////////////////////////////////////
+
+ using zypp::thread::Mutex;
+ using zypp::thread::MutexLock;
+
+ ////////////////////////////////////////////////////////////////
+ namespace // anonymous
+ { //////////////////////////////////////////////////////////////
+
+
+ //////////////////////////////////////////////////////////////
+ // STATIC
+ /**
+ ** hmm... currently a global one..
+ */
+ static Mutex g_Mutex;
+
+
+ //////////////////////////////////////////////////////////////
+ /**
+ * Internal hal (dbus ) error helper class.
+ */
+ class HalError
+ {
+ public:
+ DBusError error;
+
+ HalError() { dbus_error_init(&error); }
+ ~HalError() { dbus_error_free(&error); }
+
+ inline bool isSet() const
+ {
+ return dbus_error_is_set(&error);
+ }
+
+ inline HalException halException(const std::string &msg = std::string()) const
+ {
+ if( isSet() && error.name != NULL && error.message != NULL) {
+ return HalException(error.name, error.message);
+ }
+ else if( !msg.empty()) {
+ return HalException(msg);
+ }
+ else {
+ return HalException();
+ }
+ }
+ };
+
+
+ // -----------------------------------------------------------
+ inline void
+ VERIFY_CONTEXT(const zypp::RW_pointer<HalContext_Impl> &h)
+ {
+ if( !h)
+ {
+ ZYPP_THROW(HalException(_("HalContext not connected")));
+ }
+ }
+
+ // -----------------------------------------------------------
+ inline void
+ VERIFY_DRIVE(const zypp::RW_pointer<HalDrive_Impl> &d)
+ {
+ if( !d)
+ {
+ ZYPP_THROW(HalException(_("HalDrive not initialized")));
+ }
+ }
+
+ // -----------------------------------------------------------
+ inline void
+ VERIFY_VOLUME(const zypp::RW_pointer<HalVolume_Impl> &v)
+ {
+ if( !v)
+ {
+ ZYPP_THROW(HalException(_("HalVolume not initialized")));
+ }
+ }
+
+ //////////////////////////////////////////////////////////////
+ } // anonymous
+ ////////////////////////////////////////////////////////////////
+
+ ////////////////////////////////////////////////////////////////
+ std::ostream &
+ HalException::dumpOn( std::ostream & str ) const
+ {
+ if(!e_name.empty() && !e_msg.empty())
+ return str << msg() << ": " << e_msg << " (" << e_name << ")";
+ else if(!e_msg.empty())
+ return str << msg() << ": " << e_msg;
+ else
+ return str << msg();
+ }
+
+ ////////////////////////////////////////////////////////////////
+ class HalContext_Impl
+ {
+ public:
+ HalContext_Impl();
+ ~HalContext_Impl();
+
+ DBusConnection *conn;
+ LibHalContext *hctx;
+ bool pcon; // private connection
+ };
+
+
+ ////////////////////////////////////////////////////////////////
+ class HalDrive_Impl
+ {
+ public:
+ zypp::RW_pointer<HalContext_Impl> hal;
+ LibHalDrive *drv;
+
+ HalDrive_Impl()
+ : hal(), drv(NULL)
+ {
+ }
+
+ HalDrive_Impl(const zypp::RW_pointer<HalContext_Impl> &r,
+ LibHalDrive *d)
+ : hal(r), drv(d)
+ {
+ }
+
+ ~HalDrive_Impl()
+ {
+ if( drv)
+ libhal_drive_free(drv);
+ }
+ };
+
+
+ ////////////////////////////////////////////////////////////////
+ class HalVolume_Impl
+ {
+ public:
+ LibHalVolume *vol;
+
+ HalVolume_Impl(LibHalVolume *v=NULL)
+ : vol(v)
+ {
+ }
+
+ ~HalVolume_Impl()
+ {
+ if( vol)
+ libhal_volume_free(vol);
+ }
+ };
+
+
+ ////////////////////////////////////////////////////////////////
+ HalContext_Impl::HalContext_Impl()
+ : conn(NULL)
+ , hctx(NULL)
+ , pcon(false) // we allways use shared connections at the moment
+ {
+ HalError err;
+
+ if( pcon)
+ conn = dbus_bus_get_private(DBUS_BUS_SYSTEM, &err.error);
+ else
+ conn = dbus_bus_get(DBUS_BUS_SYSTEM, &err.error);
+ if( !conn) {
+ ZYPP_THROW(err.halException(
+ _("Unable to create dbus connection")
+ ));
+ }
+
+ hctx = libhal_ctx_new();
+ if( !hctx)
+ {
+ if( pcon)
+ dbus_connection_close(conn);
+ dbus_connection_unref(conn);
+ conn = NULL;
+
+ ZYPP_THROW(HalException(
+ _("libhal_ctx_new: Can't create libhal context")
+ ));
+ }
+
+ if( !libhal_ctx_set_dbus_connection(hctx, conn))
+ {
+ libhal_ctx_free(hctx);
+ hctx = NULL;
+
+ if( pcon)
+ dbus_connection_close(conn);
+ dbus_connection_unref(conn);
+ conn = NULL;
+
+ ZYPP_THROW(HalException(
+ _("libhal_set_dbus_connection: Can't set dbus connection")
+ ));
+ }
+
+ if( !libhal_ctx_init(hctx, &err.error))
+ {
+ libhal_ctx_free(hctx);
+ hctx = NULL;
+
+ if( pcon)
+ dbus_connection_close(conn);
+ dbus_connection_unref(conn);
+ conn = NULL;
+
+ ZYPP_THROW(err.halException(
+ _("Unable to initalize HAL context -- hald not running?")
+ ));
+ }
+ }
+
+ // -------------------------------------------------------------
+ HalContext_Impl::~HalContext_Impl()
+ {
+ if( hctx)
+ {
+ HalError err;
+ libhal_ctx_shutdown(hctx, &err.error);
+ libhal_ctx_free( hctx);
+ }
+ if( conn)
+ {
+ if( pcon)
+ dbus_connection_close(conn);
+ dbus_connection_unref(conn);
+ }
+ }
+
+
+ ////////////////////////////////////////////////////////////////
+ HalContext::HalContext(bool autoconnect)
+ : h_impl( NULL)
+ {
+ MutexLock lock(g_Mutex);
+
+ if( autoconnect)
+ h_impl.reset( new HalContext_Impl());
+ }
+
+ // -------------------------------------------------------------
+ HalContext::HalContext(const HalContext &context)
+ : h_impl( NULL)
+ {
+ MutexLock lock(g_Mutex);
+
+ zypp::RW_pointer<HalContext_Impl>(context.h_impl).swap(h_impl);
+ }
+
+ // -------------------------------------------------------------
+ HalContext::~HalContext()
+ {
+ MutexLock lock(g_Mutex);
+
+ h_impl.reset();
+ }
+
+ // --------------------------------------------------------------
+ HalContext &
+ HalContext::operator=(const HalContext &context)
+ {
+ MutexLock lock(g_Mutex);
+
+ if( this == &context)
+ return *this;
+
+ zypp::RW_pointer<HalContext_Impl>(context.h_impl).swap(h_impl);
+ return *this;
+ }
+
+ // --------------------------------------------------------------
+ HalContext::operator HalContext::bool_type() const
+ {
+ MutexLock lock(g_Mutex);
+
+ return h_impl;
+ }
+
+ // --------------------------------------------------------------
+ void
+ HalContext::connect()
+ {
+ MutexLock lock(g_Mutex);
+
+ if( !h_impl)
+ h_impl.reset( new HalContext_Impl());
+ }
+
+ // --------------------------------------------------------------
+ std::vector<std::string>
+ HalContext::getAllDevices() const
+ {
+ MutexLock lock(g_Mutex);
+ VERIFY_CONTEXT(h_impl);
+
+ HalError err;
+ char **names;
+ int count = 0;
+
+ names = libhal_get_all_devices( h_impl->hctx, &count, &err.error);
+ if( !names)
+ {
+ ZYPP_THROW(err.halException());
+ }
+
+ std::vector<std::string> ret(names, names + count);
+ libhal_free_string_array(names);
+ return ret;
+ }
+
+ // --------------------------------------------------------------
+ HalDrive
+ HalContext::getDriveFromUDI(const std::string &udi) const
+ {
+ MutexLock lock(g_Mutex);
+ VERIFY_CONTEXT(h_impl);
+
+ LibHalDrive *drv = libhal_drive_from_udi(h_impl->hctx, udi.c_str());
+ if( drv != NULL)
+ return HalDrive(new HalDrive_Impl( h_impl, drv));
+ else
+ return HalDrive();
+ }
+
+ // --------------------------------------------------------------
+ HalVolume
+ HalContext::getVolumeFromUDI(const std::string &udi) const
+ {
+ MutexLock lock(g_Mutex);
+ VERIFY_CONTEXT(h_impl);
+
+ LibHalVolume *vol = libhal_volume_from_udi(h_impl->hctx, udi.c_str());
+ if( vol)
+ return HalVolume( new HalVolume_Impl(vol));
+ else
+ return HalVolume();
+ }
+
+ // --------------------------------------------------------------
+ HalVolume
+ HalContext::getVolumeFromDeviceFile(const std::string &device_file) const
+ {
+ MutexLock lock(g_Mutex);
+ VERIFY_CONTEXT(h_impl);
+
+ LibHalVolume *vol = libhal_volume_from_device_file(h_impl->hctx,
+ device_file.c_str());
+ if( vol)
+ return HalVolume( new HalVolume_Impl(vol));
+ else
+ return HalVolume();
+ }
+
+ // --------------------------------------------------------------
+ std::vector<std::string>
+ HalContext::findDevicesByCapability(const std::string &capability) const
+ {
+ MutexLock lock(g_Mutex);
+ VERIFY_CONTEXT(h_impl);
+
+ HalError err;
+ char **names;
+ int count = 0;
+
+ names = libhal_find_device_by_capability(h_impl->hctx,
+ capability.c_str(),
+ &count, &err.error);
+ if( !names)
+ {
+ ZYPP_THROW(err.halException());
+ }
+
+ std::vector<std::string> ret(names, names + count);
+ libhal_free_string_array(names);
+ return ret;
+ }
+
+ // --------------------------------------------------------------
+ bool
+ HalContext::getDevicePropertyBool (const std::string &udi,
+ const std::string &key) const
+ {
+ MutexLock lock(g_Mutex);
+ VERIFY_CONTEXT(h_impl);
+
+ HalError err;
+ dbus_bool_t ret;
+
+ ret = libhal_device_get_property_bool (h_impl->hctx,
+ udi.c_str(),
+ key.c_str(),
+ &err.error);
+ if( err.isSet())
+ {
+ ZYPP_THROW(err.halException());
+ }
+ return ret;
+ }
+
+ // --------------------------------------------------------------
+ int32_t
+ HalContext::getDevicePropertyInt32 (const std::string &udi,
+ const std::string &key) const
+ {
+ MutexLock lock(g_Mutex);
+ VERIFY_CONTEXT(h_impl);
+
+ HalError err;
+ dbus_int32_t ret;
+
+ ret = libhal_device_get_property_int (h_impl->hctx,
+ udi.c_str(),
+ key.c_str(),
+ &err.error);
+ if( err.isSet())
+ {
+ ZYPP_THROW(err.halException());
+ }
+ return ret;
+ }
+
+ // --------------------------------------------------------------
+ uint64_t
+ HalContext::getDevicePropertyUInt64(const std::string &udi,
+ const std::string &key) const
+ {
+ MutexLock lock(g_Mutex);
+ VERIFY_CONTEXT(h_impl);
+
+ HalError err;
+ dbus_uint64_t ret;
+
+ ret = libhal_device_get_property_uint64(h_impl->hctx,
+ udi.c_str(),
+ key.c_str(),
+ &err.error);
+ if( err.isSet())
+ {
+ ZYPP_THROW(err.halException());
+ }
+ return ret;
+ }
+
+ // --------------------------------------------------------------
+ double
+ HalContext::getDevicePropertyDouble(const std::string &udi,
+ const std::string &key) const
+ {
+ MutexLock lock(g_Mutex);
+ VERIFY_CONTEXT(h_impl);
+
+ HalError err;
+ double ret;
+
+ ret = libhal_device_get_property_bool (h_impl->hctx,
+ udi.c_str(),
+ key.c_str(),
+ &err.error);
+ if( err.isSet())
+ {
+ ZYPP_THROW(err.halException());
+ }
+ return ret;
+ }
+
+
+ // --------------------------------------------------------------
+ std::string
+ HalContext::getDevicePropertyString(const std::string &udi,
+ const std::string &key) const
+ {
+ MutexLock lock(g_Mutex);
+ VERIFY_CONTEXT(h_impl);
+
+ HalError err;
+ std::string ret;
+ char *ptr;
+
+ ptr = libhal_device_get_property_string(h_impl->hctx,
+ udi.c_str(),
+ key.c_str(),
+ &err.error);
+ if( err.isSet())
+ {
+ ZYPP_THROW(err.halException());
+ }
+ if( ptr != NULL)
+ {
+ ret = ptr;
+ free(ptr);
+ }
+ return ret;
+ }
+
+ // --------------------------------------------------------------
+ void
+ HalContext::setDevicePropertyBool (const std::string &udi,
+ const std::string &key,
+ bool value)
+ {
+ MutexLock lock(g_Mutex);
+ VERIFY_CONTEXT(h_impl);
+
+ HalError err;
+ dbus_bool_t ret;
+
+ ret = libhal_device_set_property_bool (h_impl->hctx,
+ udi.c_str(),
+ key.c_str(),
+ value ? 1 : 0,
+ &err.error);
+ if( !ret)
+ {
+ ZYPP_THROW(err.halException());
+ }
+ }
+
+ // --------------------------------------------------------------
+ void
+ HalContext::setDevicePropertyInt32 (const std::string &udi,
+ const std::string &key,
+ int32_t value)
+ {
+ MutexLock lock(g_Mutex);
+ VERIFY_CONTEXT(h_impl);
+
+ HalError err;
+ dbus_bool_t ret;
+
+ ret = libhal_device_set_property_int (h_impl->hctx,
+ udi.c_str(),
+ key.c_str(),
+ value,
+ &err.error);
+ if( !ret)
+ {
+ ZYPP_THROW(err.halException());
+ }
+ }
+
+ // --------------------------------------------------------------
+ void
+ HalContext::setDevicePropertyUInt64(const std::string &udi,
+ const std::string &key,
+ uint64_t value)
+ {
+ MutexLock lock(g_Mutex);
+ VERIFY_CONTEXT(h_impl);
+
+ HalError err;
+ dbus_bool_t ret;
+
+ ret = libhal_device_set_property_uint64(h_impl->hctx,
+ udi.c_str(),
+ key.c_str(),
+ value,
+ &err.error);
+ if( !ret)
+ {
+ ZYPP_THROW(err.halException());
+ }
+ }
+
+ // --------------------------------------------------------------
+ void
+ HalContext::setDevicePropertyDouble(const std::string &udi,
+ const std::string &key,
+ double value)
+ {
+ MutexLock lock(g_Mutex);
+ VERIFY_CONTEXT(h_impl);
+
+ HalError err;
+ dbus_bool_t ret;
+
+ ret = libhal_device_set_property_double(h_impl->hctx,
+ udi.c_str(),
+ key.c_str(),
+ value,
+ &err.error);
+ if( !ret)
+ {
+ ZYPP_THROW(err.halException());
+ }
+ }
+
+ // --------------------------------------------------------------
+ void
+ HalContext::setDevicePropertyString(const std::string &udi,
+ const std::string &key,
+ const std::string &value)
+ {
+ MutexLock lock(g_Mutex);
+ VERIFY_CONTEXT(h_impl);
+
+ HalError err;
+ dbus_bool_t ret;
+
+ ret = libhal_device_set_property_string(h_impl->hctx,
+ udi.c_str(),
+ key.c_str(),
+ value.c_str(),
+ &err.error);
+ if( !ret)
+ {
+ ZYPP_THROW(err.halException());
+ }
+ }
+
+ // --------------------------------------------------------------
+ void
+ HalContext::removeDeviceProperty(const std::string &udi,
+ const std::string &key)
+ {
+ MutexLock lock(g_Mutex);
+ VERIFY_CONTEXT(h_impl);
+
+ HalError err;
+ dbus_bool_t ret;
+
+ ret = libhal_device_remove_property(h_impl->hctx,
+ udi.c_str(),
+ key.c_str(),
+ &err.error);
+ if( !ret)
+ {
+ ZYPP_THROW(err.halException());
+ }
+ }
+
+ ////////////////////////////////////////////////////////////////
+ HalDrive::HalDrive()
+ : d_impl( NULL)
+ {
+ }
+
+ // --------------------------------------------------------------
+ HalDrive::HalDrive(HalDrive_Impl *impl)
+ : d_impl( NULL)
+ {
+ MutexLock lock(g_Mutex);
+
+ d_impl.reset(impl);
+ }
+
+ // --------------------------------------------------------------
+ HalDrive::HalDrive(const HalDrive &drive)
+ : d_impl( NULL)
+ {
+ MutexLock lock(g_Mutex);
+
+ zypp::RW_pointer<HalDrive_Impl>(drive.d_impl).swap(d_impl);
+ }
+
+ // --------------------------------------------------------------
+ HalDrive::~HalDrive()
+ {
+ MutexLock lock(g_Mutex);
+
+ d_impl.reset();
+ }
+
+ // --------------------------------------------------------------
+ HalDrive &
+ HalDrive::operator=(const HalDrive &drive)
+ {
+ MutexLock lock(g_Mutex);
+
+ if( this == &drive)
+ return *this;
+
+ zypp::RW_pointer<HalDrive_Impl>(drive.d_impl).swap(d_impl);
+ return *this;
+ }
+
+ // --------------------------------------------------------------
+ HalDrive::operator HalDrive::bool_type() const
+ {
+ MutexLock lock(g_Mutex);
+
+ return d_impl;
+ }
+
+ // --------------------------------------------------------------
+ std::string
+ HalDrive::getUDI() const
+ {
+ MutexLock lock(g_Mutex);
+ VERIFY_DRIVE(d_impl);
+
+ const char *ptr = libhal_drive_get_udi(d_impl->drv);
+ return std::string(ptr ? ptr : "");
+ }
+
+ // --------------------------------------------------------------
+ std::string
+ HalDrive::getTypeName() const
+ {
+ MutexLock lock(g_Mutex);
+ VERIFY_DRIVE(d_impl);
+
+ const char *ptr = libhal_drive_get_type_textual(d_impl->drv);
+ return std::string(ptr ? ptr : "");
+ }
+
+ // --------------------------------------------------------------
+ std::string
+ HalDrive::getDeviceFile() const
+ {
+ MutexLock lock(g_Mutex);
+ VERIFY_DRIVE(d_impl);
+
+ return std::string(libhal_drive_get_device_file(d_impl->drv));
+ }
+
+ // --------------------------------------------------------------
+ unsigned int
+ HalDrive::getDeviceMajor() const
+ {
+ MutexLock lock(g_Mutex);
+ VERIFY_DRIVE(d_impl);
+
+ return libhal_drive_get_device_major(d_impl->drv);
+ }
+
+ // --------------------------------------------------------------
+ unsigned int
+ HalDrive::getDeviceMinor() const
+ {
+ MutexLock lock(g_Mutex);
+ VERIFY_DRIVE(d_impl);
+
+ return libhal_drive_get_device_minor(d_impl->drv);
+ }
+
+ // --------------------------------------------------------------
+ bool
+ HalDrive::usesRemovableMedia() const
+ {
+ MutexLock lock(g_Mutex);
+ VERIFY_DRIVE(d_impl);
+
+ return libhal_drive_uses_removable_media(d_impl->drv);
+ }
+
+ // --------------------------------------------------------------
+ std::vector<std::string>
+ HalDrive::getCdromCapabilityNames() const
+ {
+ MutexLock lock(g_Mutex);
+ VERIFY_DRIVE(d_impl);
+
+ std::vector<std::string> ret;
+ LibHalDriveCdromCaps caps;
+
+ /*
+ ** FIXME: there is no textual variant :-(
+ ** using property key names...
+ */
+ caps = libhal_drive_get_cdrom_caps(d_impl->drv);
+
+ if(caps & LIBHAL_DRIVE_CDROM_CAPS_CDROM)
+ ret.push_back("cdrom");
+ if(caps & LIBHAL_DRIVE_CDROM_CAPS_CDR)
+ ret.push_back("cdr");
+ if(caps & LIBHAL_DRIVE_CDROM_CAPS_CDRW)
+ ret.push_back("cdrw");
+ if(caps & LIBHAL_DRIVE_CDROM_CAPS_DVDRAM)
+ ret.push_back("dvdram");
+ if(caps & LIBHAL_DRIVE_CDROM_CAPS_DVDROM)
+ ret.push_back("dvd");
+ if(caps & LIBHAL_DRIVE_CDROM_CAPS_DVDR)
+ ret.push_back("dvdr");
+ if(caps & LIBHAL_DRIVE_CDROM_CAPS_DVDRW)
+ ret.push_back("dvdrw");
+ if(caps & LIBHAL_DRIVE_CDROM_CAPS_DVDPLUSR)
+ ret.push_back("dvdplusr");
+ if(caps & LIBHAL_DRIVE_CDROM_CAPS_DVDPLUSRW)
+ ret.push_back("dvdplusrw");
+ if(caps & LIBHAL_DRIVE_CDROM_CAPS_DVDPLUSRDL)
+ ret.push_back("dvdplusrdl");
+
+ return ret;
+
+#if 0
+ if( libhal_drive_get_type(d_impl->drv) != LIBHAL_DRIVE_TYPE_CDROM)
+ ZYPP_THROW(HalException(_("Not a CDROM drive")));
+
+ /*
+ ** FIXME: we use property keys matching
+ ** "storage.cdrom.cd*"
+ ** "storage.cdrom.dvd*"
+ ** but this may print other bool keys,
+ ** that are not CDROM caps.
+ */
+ LibHalPropertySet *props;
+ HalError err;
+
+ props = libhal_device_get_all_properties(d_impl->hal->hctx,
+ getUDI().c_str(),
+ &err.error);
+ if( !props)
+ ZYPP_THROW(err.halException());
+
+ std::vector<std::string> ret(1, getTypeName());
+ std::string key;
+ std::string dvd("storage.cdrom.dvd");
+ std::string cd ("storage.cdrom.cd");
+
+ LibHalPropertySetIterator it;
+ for(libhal_psi_init(&it, props);
+ libhal_psi_has_more(&it);
+ libhal_psi_next(&it))
+ {
+ if( libhal_psi_get_type(&it) == LIBHAL_PROPERTY_TYPE_BOOLEAN &&
+ libhal_psi_get_bool(&it))
+ {
+ key = libhal_psi_get_key(&it);
+ if( key.compare(0, cd.size(), cd) == 0)
+ {
+ ret.push_back(key.substr(sizeof("storage.cdrom.")-1));
+ }
+ else
+ if( key.compare(0, dvd.size(), dvd) == 0)
+ {
+ ret.push_back(key.substr(sizeof("storage.cdrom.")-1));
+ }
+ }
+ }
+ libhal_free_property_set(props);
+
+ return ret;
+#endif
+ }
+
+ // --------------------------------------------------------------
+ std::vector<std::string>
+ HalDrive::findAllVolumes() const
+ {
+ MutexLock lock(g_Mutex);
+ VERIFY_DRIVE(d_impl);
+
+ char **names;
+ int count = 0;
+
+ names = libhal_drive_find_all_volumes(d_impl->hal->hctx,
+ d_impl->drv,
+ &count);
+
+ std::vector<std::string> ret;
+ ret.assign(names, names + count);
+ libhal_free_string_array(names);
+ return ret;
+ }
+
+
+ ////////////////////////////////////////////////////////////////
+ HalVolume::HalVolume()
+ : v_impl( NULL)
+ {}
+
+ HalVolume::HalVolume(HalVolume_Impl *impl)
+ : v_impl( NULL)
+ {
+ MutexLock lock(g_Mutex);
+
+ v_impl.reset(impl);
+ }
+
+ // --------------------------------------------------------------
+ HalVolume::HalVolume(const HalVolume &volume)
+ : v_impl( NULL)
+ {
+ MutexLock lock(g_Mutex);
+
+ zypp::RW_pointer<HalVolume_Impl>(volume.v_impl).swap(v_impl);
+ }
+
+ // --------------------------------------------------------------
+ HalVolume::~HalVolume()
+ {
+ MutexLock lock(g_Mutex);
+
+ v_impl.reset();
+ }
+
+ // --------------------------------------------------------------
+ HalVolume &
+ HalVolume::operator=(const HalVolume &volume)
+ {
+ MutexLock lock(g_Mutex);
+
+ if( this == &volume)
+ return *this;
+
+ zypp::RW_pointer<HalVolume_Impl>(volume.v_impl).swap(v_impl);
+ return *this;
+ }
+
+ // --------------------------------------------------------------
+ HalVolume::operator HalVolume::bool_type() const
+ {
+ MutexLock lock(g_Mutex);
+
+ return v_impl;
+ }
+
+ // --------------------------------------------------------------
+ std::string
+ HalVolume::getUDI() const
+ {
+ MutexLock lock(g_Mutex);
+ VERIFY_VOLUME(v_impl);
+
+ const char *ptr = libhal_volume_get_udi(v_impl->vol);
+ return std::string(ptr ? ptr : "");
+ }
+
+ // --------------------------------------------------------------
+ std::string
+ HalVolume::getDeviceFile() const
+ {
+ MutexLock lock(g_Mutex);
+ VERIFY_VOLUME(v_impl);
+
+ return std::string(libhal_volume_get_device_file(v_impl->vol));
+ }
+
+ // --------------------------------------------------------------
+ unsigned int
+ HalVolume::getDeviceMajor() const
+ {
+ MutexLock lock(g_Mutex);
+ VERIFY_VOLUME(v_impl);
+
+ return libhal_volume_get_device_major(v_impl->vol);
+ }
+
+ // --------------------------------------------------------------
+ unsigned int
+ HalVolume::getDeviceMinor() const
+ {
+ MutexLock lock(g_Mutex);
+ VERIFY_VOLUME(v_impl);
+
+ return libhal_volume_get_device_minor(v_impl->vol);
+ }
+
+ // --------------------------------------------------------------
+ bool
+ HalVolume::isDisc() const
+ {
+ MutexLock lock(g_Mutex);
+ VERIFY_VOLUME(v_impl);
+
+ return libhal_volume_is_disc(v_impl->vol);
+ }
+
+ // --------------------------------------------------------------
+ bool
+ HalVolume::isPartition() const
+ {
+ MutexLock lock(g_Mutex);
+ VERIFY_VOLUME(v_impl);
+
+ return libhal_volume_is_partition(v_impl->vol);
+ }
+
+ // --------------------------------------------------------------
+ bool
+ HalVolume::isMounted() const
+ {
+ MutexLock lock(g_Mutex);
+ VERIFY_VOLUME(v_impl);
+
+ return libhal_volume_is_mounted(v_impl->vol);
+ }
+
+ // --------------------------------------------------------------
+ std::string
+ HalVolume::getFSType() const
+ {
+ MutexLock lock(g_Mutex);
+ VERIFY_VOLUME(v_impl);
+
+ return std::string( libhal_volume_get_fstype(v_impl->vol));
+ }
+
+ // --------------------------------------------------------------
+ std::string
+ HalVolume::getFSUsage() const
+ {
+ MutexLock lock(g_Mutex);
+ VERIFY_VOLUME(v_impl);
+
+ LibHalVolumeUsage usage( libhal_volume_get_fsusage(v_impl->vol));
+ std::string ret;
+ switch( usage)
+ {
+ case LIBHAL_VOLUME_USAGE_MOUNTABLE_FILESYSTEM:
+ ret = "filesystem";
+ break;
+ case LIBHAL_VOLUME_USAGE_PARTITION_TABLE:
+ ret = "partitiontable";
+ break;
+ case LIBHAL_VOLUME_USAGE_RAID_MEMBER:
+ return "raid";
+ break;
+ case LIBHAL_VOLUME_USAGE_CRYPTO:
+ ret = "crypto";
+ break;
+ case LIBHAL_VOLUME_USAGE_UNKNOWN:
+ default:
+ break;
+ }
+ return ret;
+ }
+
+ // --------------------------------------------------------------
+ std::string
+ HalVolume::getMountPoint() const
+ {
+ VERIFY_VOLUME(v_impl);
+
+ return std::string( libhal_volume_get_mount_point(v_impl->vol));
+ }
+
+
+ ////////////////////////////////////////////////////////////////
+ } // namespace hal
+ //////////////////////////////////////////////////////////////////
+ //////////////////////////////////////////////////////////////////
+ } // namespace target
+ ////////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////
+} // namespace zypp
+//////////////////////////////////////////////////////////////////////
+#else // NO_HAL
+#include <zypp/target/hal/HalContext.h>
+#include <zypp/target/hal/HalException.h>
+namespace zypp
+{ ////////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////
+ namespace target
+ { //////////////////////////////////////////////////////////////////
+ //////////////////////////////////////////////////////////////////
+ namespace hal
+ { ////////////////////////////////////////////////////////////////
+
+ std::ostream &
+ HalException::dumpOn( std::ostream & str ) const
+ { return str; }
+
+ // --------------------------------------------------------------
+ class HalContext_Impl
+ {};
+ class HalDrive_Impl
+ {};
+ class HalVolume_Impl
+ {};
+
+ // --------------------------------------------------------------
+ HalContext::HalContext(bool)
+ { ZYPP_THROW( NoHalException() ); }
+ HalContext::~HalContext()
+ {}
+ HalContext &
+ HalContext::operator=(const HalContext &)
+ { return *this; }
+ HalContext::operator HalContext::bool_type() const
+ { return 0; }
+ void
+ HalContext::connect()
+ {}
+ std::vector<std::string>
+ HalContext::getAllDevices() const
+ { return std::vector<std::string>(); }
+ HalDrive
+ HalContext::getDriveFromUDI(const std::string &) const
+ { return HalDrive(); }
+ HalVolume
+ HalContext::getVolumeFromUDI(const std::string &) const
+ { return HalVolume(); }
+ HalVolume
+ HalContext::getVolumeFromDeviceFile(const std::string &) const
+ { return HalVolume(); }
+ std::vector<std::string>
+ HalContext::findDevicesByCapability(const std::string &) const
+ { return std::vector<std::string>(); }
+ bool
+ HalContext::getDevicePropertyBool(const std::string &, const std::string &) const
+ { return false; }
+ void
+ HalContext::setDevicePropertyBool (const std::string &, const std::string &, bool value)
+ {}
+ void
+ HalContext::removeDeviceProperty(const std::string &, const std::string &)
+ {}
+ std::string
+ HalContext::getDevicePropertyString(const std::string &, const std::string &) const
+ { return ""; }
+ // --------------------------------------------------------------
+ HalDrive::HalDrive()
+ { ZYPP_THROW( NoHalException() ); }
+ HalDrive::~HalDrive()
+ {}
+ HalDrive &
+ HalDrive::operator=(const HalDrive &)
+ { return *this; }
+ HalDrive::operator HalDrive::bool_type() const
+ { return 0; }
+ std::string
+ HalDrive::getUDI() const
+ { return std::string(); }
+ std::string
+ HalDrive::getTypeName() const
+ { return std::string(); }
+ std::string
+ HalDrive::getDeviceFile() const
+ { return std::string(); }
+ unsigned int
+ HalDrive::getDeviceMinor() const
+ { return 0; }
+ unsigned int
+ HalDrive::getDeviceMajor() const
+ { return 0; }
+ bool
+ HalDrive::usesRemovableMedia() const
+ { return false; }
+ std::vector<std::string>
+ HalDrive::getCdromCapabilityNames() const
+ { return std::vector<std::string>(); }
+ std::vector<std::string>
+ HalDrive::findAllVolumes() const
+ { return std::vector<std::string>(); }
+
+ // --------------------------------------------------------------
+ HalVolume::HalVolume()
+ { ZYPP_THROW( NoHalException() ); }
+ HalVolume::~HalVolume()
+ {}
+ HalVolume &
+ HalVolume::operator=(const HalVolume &)
+ { return *this; }
+ HalVolume::operator HalVolume::bool_type() const
+ { return 0; }
+ std::string
+ HalVolume::getUDI() const
+ { return std::string(); }
+ std::string
+ HalVolume::getDeviceFile() const
+ { return std::string(); }
+ unsigned int
+ HalVolume::getDeviceMinor() const
+ { return 0; }
+ unsigned int
+ HalVolume::getDeviceMajor() const
+ { return 0; }
+ bool
+ HalVolume::isDisc() const
+ { return false; }
+ bool
+ HalVolume::isPartition() const
+ { return false; }
+ bool
+ HalVolume::isMounted() const
+ { return false; }
+ std::string
+ HalVolume::getFSType() const
+ { return std::string(); }
+ std::string
+ HalVolume::getFSUsage() const
+ { return std::string(); }
+ std::string
+ HalVolume::getMountPoint() const
+ { return std::string(); }
+
+ ////////////////////////////////////////////////////////////////
+ } // namespace hal
+ //////////////////////////////////////////////////////////////////
+ //////////////////////////////////////////////////////////////////
+ } // namespace target
+ ////////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////
+} // namespace zypp
+//////////////////////////////////////////////////////////////////////
+#endif // NO_HAL
+
+/*
+** vim: set ts=2 sts=2 sw=2 ai et:
+*/
--- /dev/null
+/*---------------------------------------------------------------------\
+| ____ _ __ __ ___ |
+| |__ / \ / / . \ . \ |
+| / / \ V /| _/ _/ |
+| / /__ | | | | | | |
+| /_____||_| |_| |_| |
+| |
+\---------------------------------------------------------------------*/
+/** \file zypp/target/hal/HalContext.h
+ *
+ * \brief Hardware abstaction layer library wrapper.
+ */
+#ifndef ZYPP_TARGET_HAL_HALCONTEXT_H
+#define ZYPP_TARGET_HAL_HALCONTEXT_H
+
+#include <zypp/target/hal/HalException.h>
+#include <zypp/base/PtrTypes.h>
+#include <string>
+#include <vector>
+#include <stdint.h>
+
+//////////////////////////////////////////////////////////////////////
+namespace zypp
+{ ////////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////
+ namespace target
+ { //////////////////////////////////////////////////////////////////
+ //////////////////////////////////////////////////////////////////
+ namespace hal
+ { ////////////////////////////////////////////////////////////////
+
+
+ // -------------------------------------------------------------
+ /** @{
+ * Forward declarations.
+ */
+ class HalDrive;
+ class HalVolume;
+
+ class HalDrive_Impl;
+ class HalVolume_Impl;
+ class HalContext_Impl;
+ /** }@ */
+
+
+ ////////////////////////////////////////////////////////////////
+ //
+ // CLASS NAME : HalContext
+ //
+ /** Hardware abstaction layer context.
+ *
+ * Hal context wrapper. It manages the dbus connection and is
+ * the entry point to query drives, volumes and other information.
+ *
+ * @todo: wrap more functions.
+ */
+ class HalContext
+ {
+ public:
+ typedef
+ zypp::RW_pointer<HalContext_Impl>::unspecified_bool_type bool_type;
+
+ HalContext(bool autoconnect=false);
+ HalContext(const HalContext &context);
+ ~HalContext();
+
+ HalContext&
+ operator=(const HalContext &context);
+
+ /**
+ * Verifies if the context is initialized.
+ */
+ operator bool_type() const;
+
+ /**
+ */
+ void
+ connect();
+
+ /**
+ * Retrieve UDI's of all devices.
+ * \return Vector with device UDI's.
+ */
+ std::vector<std::string>
+ getAllDevices() const;
+
+ /**
+ * Construct a HalDrive object for the specified UDI.
+ * \param The \p udi of the drive.
+ * \return The HalDrive object.
+ */
+ HalDrive
+ getDriveFromUDI(const std::string &udi) const;
+
+ /**
+ * Construct a HalVolume object for the specified UDI.
+ * \param The \p udi of the volume.
+ * \return The HalVolume object.
+ */
+ HalVolume
+ getVolumeFromUDI(const std::string &udi) const;
+
+ HalVolume
+ getVolumeFromDeviceFile(const std::string &device_file) const;
+
+ /**
+ * Retrieve UDI's of all devices with a capability.
+ * \param The \p capability name
+ * \return Vector with device UDI's.
+ */
+ std::vector<std::string>
+ findDevicesByCapability(const std::string &capability) const;
+
+ bool
+ getDevicePropertyBool (const std::string &udi,
+ const std::string &key) const;
+
+ int32_t
+ getDevicePropertyInt32 (const std::string &udi,
+ const std::string &key) const;
+
+ uint64_t
+ getDevicePropertyUInt64(const std::string &udi,
+ const std::string &key) const;
+
+ double
+ getDevicePropertyDouble(const std::string &udi,
+ const std::string &key) const;
+
+ std::string
+ getDevicePropertyString(const std::string &udi,
+ const std::string &key) const;
+
+ void
+ setDevicePropertyBool (const std::string &udi,
+ const std::string &key,
+ bool value);
+
+ void
+ setDevicePropertyInt32 (const std::string &udi,
+ const std::string &key,
+ int32_t value);
+
+ void
+ setDevicePropertyUInt64(const std::string &udi,
+ const std::string &key,
+ uint64_t value);
+
+ void
+ setDevicePropertyDouble(const std::string &udi,
+ const std::string &key,
+ double value);
+
+ void
+ setDevicePropertyString(const std::string &udi,
+ const std::string &key,
+ const std::string &value);
+
+ void
+ removeDeviceProperty(const std::string &udi,
+ const std::string &key);
+
+ private:
+
+ zypp::RW_pointer<HalContext_Impl> h_impl;
+ };
+
+
+ ////////////////////////////////////////////////////////////////
+ //
+ // CLASS NAME : HalDrive
+ //
+ /** Hardware abstaction layer storage drive object.
+ *
+ * @todo: wrap more functions.
+ */
+ class HalDrive
+ {
+ public:
+ typedef
+ zypp::RW_pointer<HalDrive_Impl>::unspecified_bool_type bool_type;
+
+ HalDrive();
+ HalDrive(const HalDrive &drive);
+ ~HalDrive();
+
+ HalDrive&
+ operator=(const HalDrive &drive);
+
+ operator bool_type() const;
+
+ std::string
+ getUDI() const;
+
+ std::string
+ getTypeName() const;
+
+ /**
+ * \return The drive's device file name.
+ */
+ std::string
+ getDeviceFile() const;
+
+ /**
+ * \return The drive's device file major number.
+ */
+ unsigned int
+ getDeviceMajor() const;
+
+ /**
+ * \return The drive's device minor number.
+ */
+ unsigned int
+ getDeviceMinor() const;
+
+ /**
+ * \return True, if drive uses removable media.
+ */
+ bool
+ usesRemovableMedia() const;
+
+ /*
+ ** Returns the media type names supported by the drive.
+ **
+ ** Since hal does not implement a textual form here, we
+ ** are using the drive type and property names from
+ ** "storage.cdrom.*" namespace:
+ ** cdrom, cdr, cdrw, dvd, dvdr, dvdrw, dvdram,
+ ** dvdplusr, dvdplusrw, dvdplusrdl
+ **
+ ** FIXME: Should we provide own LibHalDriveCdromCaps?
+ */
+ std::vector<std::string>
+ getCdromCapabilityNames() const;
+
+ /**
+ * Retrieve UDI's of all volumes of this drive.
+ * \return Vector with volume UDI's.
+ */
+ std::vector<std::string>
+ findAllVolumes() const;
+
+ private:
+ friend class HalContext;
+
+ HalDrive(HalDrive_Impl *impl);
+
+ zypp::RW_pointer<HalDrive_Impl> d_impl;
+ };
+
+
+ ////////////////////////////////////////////////////////////////
+ //
+ // CLASS NAME : HalVolume
+ //
+ /** Hardware abstaction layer storage volume object.
+ *
+ * @todo: wrap more functions.
+ */
+ class HalVolume
+ {
+ public:
+ typedef
+ zypp::RW_pointer<HalVolume_Impl>::unspecified_bool_type bool_type;
+
+ HalVolume();
+ HalVolume(const HalVolume &volume);
+ ~HalVolume();
+
+ HalVolume&
+ operator=(const HalVolume &volume);
+
+ operator bool_type() const;
+
+ std::string
+ getUDI() const;
+
+ /**
+ * \return The Volume drive's device file name.
+ */
+ std::string
+ getDeviceFile() const;
+
+ /**
+ * \return The Volume drive's device major number.
+ */
+ unsigned int
+ getDeviceMajor() const;
+
+ /**
+ * \return The Volume drive's device minor number.
+ */
+ unsigned int
+ getDeviceMinor() const;
+
+ bool
+ isDisc() const;
+
+ bool
+ isPartition() const;
+
+ bool
+ isMounted() const;
+
+ /**
+ * \return The filesystem name on the volume.
+ */
+ std::string
+ getFSType() const;
+
+ /**
+ * \return The filesystem usage purpose.
+ */
+ std::string
+ getFSUsage() const;
+
+ /**
+ * \return The mount point of the volume.
+ */
+ std::string
+ getMountPoint() const;
+
+ private:
+ friend class HalContext;
+ friend class HalDrive;
+ HalVolume(HalVolume_Impl *impl);
+
+ zypp::RW_pointer<HalVolume_Impl> v_impl;
+ };
+
+
+ ////////////////////////////////////////////////////////////////
+ } // namespace hal
+ //////////////////////////////////////////////////////////////////
+ //////////////////////////////////////////////////////////////////
+ } // namespace target
+ ////////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////
+} // namespace zypp
+//////////////////////////////////////////////////////////////////////
+
+#endif // ZYPP_TARGET_HAL_HALCONTEXT_H
+
+/*
+** vim: set ts=2 sts=2 sw=2 ai et:
+*/