libzypp  10.5.0
HalContext.cc
Go to the documentation of this file.
00001 /*---------------------------------------------------------------------\
00002 |                          ____ _   __ __ ___                          |
00003 |                         |__  / \ / / . \ . \                         |
00004 |                           / / \ V /|  _/  _/                         |
00005 |                          / /__ | | | | | |                           |
00006 |                         /_____||_| |_| |_|                           |
00007 |                                                                      |
00008 \---------------------------------------------------------------------*/
00013 #include <zypp/target/hal/HalException.h>
00015 namespace zypp
00016 { 
00017 
00018   namespace target
00019   { 
00020 
00021     namespace hal
00022     { 
00023       NoHalException::NoHalException()
00024         : Exception(_("Sorry, but this version of libzypp was built without HAL support."))
00025       {}
00027     } // namespace hal
00030   } // namespace target
00033 } // namespace zypp
00035 
00036 #ifndef NO_HAL // disables zypp's HAL dependency
00037 
00038 #include <zypp/target/hal/HalContext.h>
00039 #include <zypp/thread/Mutex.h>
00040 #include <zypp/thread/MutexLock.h>
00041 #include <zypp/base/NonCopyable.h>
00042 #include <zypp/base/Logger.h>
00043 #include <zypp/base/String.h>
00044 #include <zypp/base/Gettext.h>
00045 
00046 #include <hal/libhal.h>
00047 #include <hal/libhal-storage.h>
00048 
00049 #include <iostream>
00050 
00051 using namespace std;
00052 
00054 namespace zypp
00055 { 
00056 
00057   namespace target
00058   { 
00059 
00060     namespace hal
00061     { 
00062 
00063       using zypp::thread::Mutex;
00064       using zypp::thread::MutexLock;
00065 
00067       namespace // anonymous
00068       { 
00069 
00070 
00072         // STATIC
00076         static Mutex g_Mutex;
00077 
00078 
00080 
00083         class HalError
00084         {
00085         public:
00086           DBusError error;
00087 
00088           HalError()  { dbus_error_init(&error); }
00089           ~HalError() { dbus_error_free(&error); }
00090 
00091           inline bool         isSet() const
00092           {
00093             return dbus_error_is_set(&error);
00094           }
00095 
00096           inline HalException halException(const std::string &msg = std::string()) const
00097           {
00098             if( isSet() && error.name != NULL && error.message != NULL) {
00099               return HalException(error.name, error.message);
00100             }
00101             else if( !msg.empty()) {
00102               return HalException(msg);
00103             }
00104             else {
00105               return HalException();
00106             }
00107           }
00108         };
00109 
00110 
00111         // -----------------------------------------------------------
00112         inline void
00113         VERIFY_CONTEXT(const zypp::RW_pointer<HalContext_Impl> &h)
00114         {
00115           if( !h)
00116           {
00117             ZYPP_THROW(HalException(_("HalContext not connected")));
00118           }
00119         }
00120 
00121         // -----------------------------------------------------------
00122         inline void
00123         VERIFY_DRIVE(const zypp::RW_pointer<HalDrive_Impl> &d)
00124         {
00125           if( !d)
00126           {
00127             ZYPP_THROW(HalException(_("HalDrive not initialized")));
00128           }
00129         }
00130 
00131         // -----------------------------------------------------------
00132         inline void
00133         VERIFY_VOLUME(const zypp::RW_pointer<HalVolume_Impl> &v)
00134         {
00135           if( !v)
00136           {
00137             ZYPP_THROW(HalException(_("HalVolume not initialized")));
00138           }
00139         }
00140 
00142       } // anonymous
00144 
00146       std::ostream &
00147       HalException::dumpOn( std::ostream & str ) const
00148       {
00149         if(!e_name.empty() && !e_msg.empty())
00150           return str << msg() << ": " << e_msg << " (" << e_name << ")";
00151         else if(!e_msg.empty())
00152           return str << msg() << ": " << e_msg;
00153         else
00154           return str << msg();
00155       }
00156 
00158       class HalContext_Impl
00159       {
00160       public:
00161         HalContext_Impl();
00162         ~HalContext_Impl();
00163 
00164         DBusConnection *conn;
00165         LibHalContext  *hctx;
00166         bool            pcon; // private connection
00167       };
00168 
00169 
00171       class HalDrive_Impl
00172       {
00173       public:
00174         zypp::RW_pointer<HalContext_Impl>  hal;
00175         LibHalDrive                       *drv;
00176 
00177         HalDrive_Impl()
00178           : hal(), drv(NULL)
00179         {
00180         }
00181 
00182         HalDrive_Impl(const zypp::RW_pointer<HalContext_Impl> &r,
00183                       LibHalDrive *d)
00184           : hal(r), drv(d)
00185         {
00186         }
00187 
00188         ~HalDrive_Impl()
00189         {
00190           if( drv)
00191             libhal_drive_free(drv);
00192         }
00193       };
00194 
00195 
00197       class HalVolume_Impl
00198       {
00199       public:
00200         LibHalVolume *vol;
00201 
00202         HalVolume_Impl(LibHalVolume *v=NULL)
00203           : vol(v)
00204         {
00205         }
00206 
00207         ~HalVolume_Impl()
00208         {
00209           if( vol)
00210             libhal_volume_free(vol);
00211         }
00212       };
00213 
00214 
00216       HalContext_Impl::HalContext_Impl()
00217         : conn(NULL)
00218         , hctx(NULL)
00219         , pcon(false) // we allways use shared connections at the moment
00220       {
00221         HalError err;
00222 
00223         if( pcon)
00224           conn = dbus_bus_get_private(DBUS_BUS_SYSTEM, &err.error);
00225         else
00226           conn = dbus_bus_get(DBUS_BUS_SYSTEM, &err.error);
00227         if( !conn) {
00228           ZYPP_THROW(err.halException(
00229             _("Unable to create dbus connection")
00230           ));
00231         }
00232 
00233         hctx = libhal_ctx_new();
00234         if( !hctx)
00235         {
00236           if( pcon)
00237               dbus_connection_close(conn);
00238           dbus_connection_unref(conn);
00239           conn = NULL;
00240 
00241           ZYPP_THROW(HalException(
00242             _("libhal_ctx_new: Can't create libhal context")
00243           ));
00244         }
00245 
00246         if( !libhal_ctx_set_dbus_connection(hctx, conn))
00247         {
00248           libhal_ctx_free(hctx);
00249           hctx = NULL;
00250 
00251           if( pcon)
00252             dbus_connection_close(conn);
00253           dbus_connection_unref(conn);
00254           conn = NULL;
00255 
00256           ZYPP_THROW(HalException(
00257             _("libhal_set_dbus_connection: Can't set dbus connection")
00258           ));
00259         }
00260 
00261         if( !libhal_ctx_init(hctx, &err.error))
00262         {
00263           libhal_ctx_free(hctx);
00264           hctx = NULL;
00265 
00266           if( pcon)
00267             dbus_connection_close(conn);
00268           dbus_connection_unref(conn);
00269           conn = NULL;
00270 
00271           ZYPP_THROW(err.halException(
00272             _("Unable to initalize HAL context -- hald not running?")
00273           ));
00274         }
00275       }
00276 
00277       // -------------------------------------------------------------
00278       HalContext_Impl::~HalContext_Impl()
00279       {
00280         if( hctx)
00281         {
00282           HalError err;
00283           libhal_ctx_shutdown(hctx, &err.error);
00284           libhal_ctx_free( hctx);
00285         }
00286         if( conn)
00287         {
00288           if( pcon)
00289             dbus_connection_close(conn);
00290           dbus_connection_unref(conn);
00291         }
00292       }
00293 
00294 
00296       HalContext::HalContext(bool autoconnect)
00297         : h_impl( NULL)
00298       {
00299         MutexLock lock(g_Mutex);
00300 
00301         if( autoconnect)
00302           h_impl.reset( new HalContext_Impl());
00303       }
00304 
00305       // -------------------------------------------------------------
00306       HalContext::HalContext(const HalContext &context)
00307         : h_impl( NULL)
00308       {
00309         MutexLock lock(g_Mutex);
00310 
00311         zypp::RW_pointer<HalContext_Impl>(context.h_impl).swap(h_impl);
00312       }
00313 
00314       // -------------------------------------------------------------
00315       HalContext::~HalContext()
00316       {
00317         MutexLock  lock(g_Mutex);
00318 
00319         h_impl.reset();
00320       }
00321 
00322       // --------------------------------------------------------------
00323       HalContext &
00324       HalContext::operator=(const HalContext &context)
00325       {
00326         MutexLock  lock(g_Mutex);
00327 
00328         if( this == &context)
00329           return *this;
00330 
00331         zypp::RW_pointer<HalContext_Impl>(context.h_impl).swap(h_impl);
00332         return *this;
00333       }
00334 
00335       // --------------------------------------------------------------
00336       HalContext::operator HalContext::bool_type() const
00337       {
00338         MutexLock  lock(g_Mutex);
00339 
00340         return h_impl;
00341       }
00342 
00343       // --------------------------------------------------------------
00344       void
00345       HalContext::connect()
00346       {
00347         MutexLock lock(g_Mutex);
00348 
00349         if( !h_impl)
00350           h_impl.reset( new HalContext_Impl());
00351       }
00352 
00353       // --------------------------------------------------------------
00354       std::vector<std::string>
00355       HalContext::getAllDevices() const
00356       {
00357         MutexLock  lock(g_Mutex);
00358         VERIFY_CONTEXT(h_impl);
00359 
00360         HalError   err;
00361         char     **names;
00362         int        count = 0;
00363 
00364         names = libhal_get_all_devices( h_impl->hctx, &count, &err.error);
00365         if( !names)
00366         {
00367           ZYPP_THROW(err.halException());
00368         }
00369 
00370         std::vector<std::string> ret(names, names + count);
00371         libhal_free_string_array(names);
00372         return ret;
00373       }
00374 
00375       // --------------------------------------------------------------
00376       HalDrive
00377       HalContext::getDriveFromUDI(const std::string &udi) const
00378       {
00379         MutexLock  lock(g_Mutex);
00380         VERIFY_CONTEXT(h_impl);
00381 
00382         LibHalDrive *drv = libhal_drive_from_udi(h_impl->hctx, udi.c_str());
00383         if( drv != NULL)
00384           return HalDrive(new HalDrive_Impl( h_impl, drv));
00385         else
00386           return HalDrive();
00387       }
00388 
00389       // --------------------------------------------------------------
00390       HalVolume
00391       HalContext::getVolumeFromUDI(const std::string &udi) const
00392       {
00393         MutexLock  lock(g_Mutex);
00394         VERIFY_CONTEXT(h_impl);
00395 
00396         LibHalVolume *vol = libhal_volume_from_udi(h_impl->hctx, udi.c_str());
00397         if( vol)
00398           return HalVolume( new HalVolume_Impl(vol));
00399         else
00400           return HalVolume();
00401       }
00402 
00403       // --------------------------------------------------------------
00404       HalVolume
00405       HalContext::getVolumeFromDeviceFile(const std::string &device_file) const
00406       {
00407         MutexLock  lock(g_Mutex);
00408         VERIFY_CONTEXT(h_impl);
00409 
00410         LibHalVolume *vol = libhal_volume_from_device_file(h_impl->hctx,
00411                                                            device_file.c_str());
00412         if( vol)
00413           return HalVolume( new HalVolume_Impl(vol));
00414         else
00415           return HalVolume();
00416       }
00417 
00418       // --------------------------------------------------------------
00419       std::vector<std::string>
00420       HalContext::findDevicesByCapability(const std::string &capability) const
00421       {
00422         MutexLock  lock(g_Mutex);
00423         VERIFY_CONTEXT(h_impl);
00424 
00425         HalError   err;
00426         char     **names;
00427         int        count = 0;
00428 
00429         names = libhal_find_device_by_capability(h_impl->hctx,
00430                                                  capability.c_str(),
00431                                                  &count, &err.error);
00432         if( !names)
00433         {
00434           ZYPP_THROW(err.halException());
00435         }
00436 
00437         std::vector<std::string> ret(names, names + count);
00438         libhal_free_string_array(names);
00439         return ret;
00440       }
00441 
00442       // --------------------------------------------------------------
00443       bool
00444       HalContext::getDevicePropertyBool  (const std::string &udi,
00445                                           const std::string &key) const
00446       {
00447         MutexLock  lock(g_Mutex);
00448         VERIFY_CONTEXT(h_impl);
00449 
00450         HalError      err;
00451         dbus_bool_t   ret;
00452 
00453         ret = libhal_device_get_property_bool  (h_impl->hctx,
00454                                                 udi.c_str(),
00455                                                 key.c_str(),
00456                                                 &err.error);
00457         if( err.isSet())
00458         {
00459           ZYPP_THROW(err.halException());
00460         }
00461         return ret;
00462       }
00463 
00464       // --------------------------------------------------------------
00465       int32_t
00466       HalContext::getDevicePropertyInt32 (const std::string &udi,
00467                                           const std::string &key) const
00468       {
00469         MutexLock  lock(g_Mutex);
00470         VERIFY_CONTEXT(h_impl);
00471 
00472         HalError      err;
00473         dbus_int32_t  ret;
00474 
00475         ret = libhal_device_get_property_int   (h_impl->hctx,
00476                                                 udi.c_str(),
00477                                                 key.c_str(),
00478                                                 &err.error);
00479         if( err.isSet())
00480         {
00481           ZYPP_THROW(err.halException());
00482         }
00483         return ret;
00484       }
00485 
00486       // --------------------------------------------------------------
00487       uint64_t
00488       HalContext::getDevicePropertyUInt64(const std::string &udi,
00489                                           const std::string &key) const
00490       {
00491         MutexLock  lock(g_Mutex);
00492         VERIFY_CONTEXT(h_impl);
00493 
00494         HalError      err;
00495         dbus_uint64_t ret;
00496 
00497         ret = libhal_device_get_property_uint64(h_impl->hctx,
00498                                                 udi.c_str(),
00499                                                 key.c_str(),
00500                                                 &err.error);
00501         if( err.isSet())
00502         {
00503           ZYPP_THROW(err.halException());
00504         }
00505         return ret;
00506       }
00507 
00508       // --------------------------------------------------------------
00509       double
00510       HalContext::getDevicePropertyDouble(const std::string &udi,
00511                                           const std::string &key) const
00512       {
00513         MutexLock  lock(g_Mutex);
00514         VERIFY_CONTEXT(h_impl);
00515 
00516         HalError      err;
00517         double        ret;
00518 
00519         ret = libhal_device_get_property_bool  (h_impl->hctx,
00520                                                 udi.c_str(),
00521                                                 key.c_str(),
00522                                                 &err.error);
00523         if( err.isSet())
00524         {
00525           ZYPP_THROW(err.halException());
00526         }
00527         return ret;
00528       }
00529 
00530 
00531       // --------------------------------------------------------------
00532       std::string
00533       HalContext::getDevicePropertyString(const std::string &udi,
00534                                           const std::string &key) const
00535       {
00536         MutexLock  lock(g_Mutex);
00537         VERIFY_CONTEXT(h_impl);
00538 
00539         HalError      err;
00540         std::string   ret;
00541         char         *ptr;
00542 
00543         ptr = libhal_device_get_property_string(h_impl->hctx,
00544                                                 udi.c_str(),
00545                                                 key.c_str(),
00546                                                 &err.error);
00547         if( err.isSet())
00548         {
00549           ZYPP_THROW(err.halException());
00550         }
00551         if( ptr != NULL)
00552         {
00553           ret = ptr;
00554           free(ptr);
00555         }
00556         return ret;
00557       }
00558 
00559       // --------------------------------------------------------------
00560       void
00561       HalContext::setDevicePropertyBool  (const std::string &udi,
00562                                           const std::string &key,
00563                                           bool               value)
00564       {
00565         MutexLock  lock(g_Mutex);
00566         VERIFY_CONTEXT(h_impl);
00567 
00568         HalError      err;
00569         dbus_bool_t   ret;
00570 
00571         ret = libhal_device_set_property_bool  (h_impl->hctx,
00572                                                 udi.c_str(),
00573                                                 key.c_str(),
00574                                                 value ? 1 : 0,
00575                                                 &err.error);
00576         if( !ret)
00577         {
00578           ZYPP_THROW(err.halException());
00579         }
00580       }
00581 
00582       // --------------------------------------------------------------
00583       void
00584       HalContext::setDevicePropertyInt32 (const std::string &udi,
00585                                           const std::string &key,
00586                                           int32_t            value)
00587       {
00588         MutexLock  lock(g_Mutex);
00589         VERIFY_CONTEXT(h_impl);
00590 
00591         HalError      err;
00592         dbus_bool_t   ret;
00593 
00594         ret = libhal_device_set_property_int   (h_impl->hctx,
00595                                                 udi.c_str(),
00596                                                 key.c_str(),
00597                                                 value,
00598                                                 &err.error);
00599         if( !ret)
00600         {
00601           ZYPP_THROW(err.halException());
00602         }
00603       }
00604 
00605       // --------------------------------------------------------------
00606       void
00607       HalContext::setDevicePropertyUInt64(const std::string &udi,
00608                                           const std::string &key,
00609                                           uint64_t           value)
00610       {
00611         MutexLock  lock(g_Mutex);
00612         VERIFY_CONTEXT(h_impl);
00613 
00614         HalError      err;
00615         dbus_bool_t   ret;
00616 
00617         ret = libhal_device_set_property_uint64(h_impl->hctx,
00618                                                 udi.c_str(),
00619                                                 key.c_str(),
00620                                                 value,
00621                                                 &err.error);
00622         if( !ret)
00623         {
00624           ZYPP_THROW(err.halException());
00625         }
00626       }
00627 
00628       // --------------------------------------------------------------
00629       void
00630       HalContext::setDevicePropertyDouble(const std::string &udi,
00631                                           const std::string &key,
00632                                           double             value)
00633       {
00634         MutexLock  lock(g_Mutex);
00635         VERIFY_CONTEXT(h_impl);
00636 
00637         HalError      err;
00638         dbus_bool_t   ret;
00639 
00640         ret = libhal_device_set_property_double(h_impl->hctx,
00641                                                 udi.c_str(),
00642                                                 key.c_str(),
00643                                                 value,
00644                                                 &err.error);
00645         if( !ret)
00646         {
00647           ZYPP_THROW(err.halException());
00648         }
00649       }
00650 
00651       // --------------------------------------------------------------
00652       void
00653       HalContext::setDevicePropertyString(const std::string &udi,
00654                                           const std::string &key,
00655                                           const std::string &value)
00656       {
00657         MutexLock  lock(g_Mutex);
00658         VERIFY_CONTEXT(h_impl);
00659 
00660         HalError      err;
00661         dbus_bool_t   ret;
00662 
00663         ret = libhal_device_set_property_string(h_impl->hctx,
00664                                                 udi.c_str(),
00665                                                 key.c_str(),
00666                                                 value.c_str(),
00667                                                 &err.error);
00668         if( !ret)
00669         {
00670           ZYPP_THROW(err.halException());
00671         }
00672       }
00673 
00674       // --------------------------------------------------------------
00675       void
00676       HalContext::removeDeviceProperty(const std::string &udi,
00677                                        const std::string &key)
00678       {
00679         MutexLock  lock(g_Mutex);
00680         VERIFY_CONTEXT(h_impl);
00681 
00682         HalError      err;
00683         dbus_bool_t   ret;
00684 
00685         ret = libhal_device_remove_property(h_impl->hctx,
00686                                             udi.c_str(),
00687                                             key.c_str(),
00688                                             &err.error);
00689         if( !ret)
00690         {
00691           ZYPP_THROW(err.halException());
00692         }
00693       }
00694 
00696       HalDrive::HalDrive()
00697         : d_impl( NULL)
00698       {
00699       }
00700 
00701       // --------------------------------------------------------------
00702       HalDrive::HalDrive(HalDrive_Impl *impl)
00703         : d_impl( NULL)
00704       {
00705         MutexLock  lock(g_Mutex);
00706 
00707         d_impl.reset(impl);
00708       }
00709 
00710       // --------------------------------------------------------------
00711       HalDrive::HalDrive(const HalDrive &drive)
00712         : d_impl( NULL)
00713       {
00714         MutexLock  lock(g_Mutex);
00715 
00716         zypp::RW_pointer<HalDrive_Impl>(drive.d_impl).swap(d_impl);
00717       }
00718 
00719       // --------------------------------------------------------------
00720       HalDrive::~HalDrive()
00721       {
00722         MutexLock  lock(g_Mutex);
00723 
00724         d_impl.reset();
00725       }
00726 
00727       // --------------------------------------------------------------
00728       HalDrive &
00729       HalDrive::operator=(const HalDrive &drive)
00730       {
00731         MutexLock  lock(g_Mutex);
00732 
00733         if( this == &drive)
00734           return *this;
00735 
00736         zypp::RW_pointer<HalDrive_Impl>(drive.d_impl).swap(d_impl);
00737         return *this;
00738       }
00739 
00740       // --------------------------------------------------------------
00741       HalDrive::operator HalDrive::bool_type() const
00742       {
00743         MutexLock  lock(g_Mutex);
00744 
00745         return d_impl;
00746       }
00747 
00748       // --------------------------------------------------------------
00749       std::string
00750       HalDrive::getUDI() const
00751       {
00752         MutexLock  lock(g_Mutex);
00753         VERIFY_DRIVE(d_impl);
00754 
00755         const char *ptr = libhal_drive_get_udi(d_impl->drv);
00756         return std::string(ptr ? ptr : "");
00757       }
00758 
00759       // --------------------------------------------------------------
00760       std::string
00761       HalDrive::getTypeName() const
00762       {
00763         MutexLock  lock(g_Mutex);
00764         VERIFY_DRIVE(d_impl);
00765 
00766         const char *ptr = libhal_drive_get_type_textual(d_impl->drv);
00767         return std::string(ptr ? ptr : "");
00768       }
00769 
00770       // --------------------------------------------------------------
00771       std::string
00772       HalDrive::getDeviceFile() const
00773       {
00774         MutexLock  lock(g_Mutex);
00775         VERIFY_DRIVE(d_impl);
00776 
00777         return std::string(libhal_drive_get_device_file(d_impl->drv));
00778       }
00779 
00780       // --------------------------------------------------------------
00781       unsigned int
00782       HalDrive::getDeviceMajor() const
00783       {
00784         MutexLock  lock(g_Mutex);
00785         VERIFY_DRIVE(d_impl);
00786 
00787         return libhal_drive_get_device_major(d_impl->drv);
00788       }
00789 
00790       // --------------------------------------------------------------
00791       unsigned int
00792       HalDrive::getDeviceMinor() const
00793       {
00794         MutexLock  lock(g_Mutex);
00795         VERIFY_DRIVE(d_impl);
00796 
00797         return libhal_drive_get_device_minor(d_impl->drv);
00798       }
00799 
00800       // --------------------------------------------------------------
00801       bool
00802       HalDrive::usesRemovableMedia() const
00803       {
00804         MutexLock  lock(g_Mutex);
00805         VERIFY_DRIVE(d_impl);
00806 
00807         return libhal_drive_uses_removable_media(d_impl->drv);
00808       }
00809 
00810       // --------------------------------------------------------------
00811       std::vector<std::string>
00812       HalDrive::getCdromCapabilityNames() const
00813       {
00814         MutexLock  lock(g_Mutex);
00815         VERIFY_DRIVE(d_impl);
00816 
00817         std::vector<std::string> ret;
00818         LibHalDriveCdromCaps     caps;
00819 
00820         /*
00821         ** FIXME: there is no textual variant :-(
00822         **        using property key names...
00823         */
00824         caps = libhal_drive_get_cdrom_caps(d_impl->drv);
00825 
00826         if(caps & LIBHAL_DRIVE_CDROM_CAPS_CDROM)
00827           ret.push_back("cdrom");
00828         if(caps & LIBHAL_DRIVE_CDROM_CAPS_CDR)
00829           ret.push_back("cdr");
00830         if(caps & LIBHAL_DRIVE_CDROM_CAPS_CDRW)
00831           ret.push_back("cdrw");
00832         if(caps & LIBHAL_DRIVE_CDROM_CAPS_DVDRAM)
00833           ret.push_back("dvdram");
00834         if(caps & LIBHAL_DRIVE_CDROM_CAPS_DVDROM)
00835           ret.push_back("dvd");
00836         if(caps & LIBHAL_DRIVE_CDROM_CAPS_DVDR)
00837           ret.push_back("dvdr");
00838         if(caps & LIBHAL_DRIVE_CDROM_CAPS_DVDRW)
00839           ret.push_back("dvdrw");
00840         if(caps & LIBHAL_DRIVE_CDROM_CAPS_DVDPLUSR)
00841           ret.push_back("dvdplusr");
00842         if(caps & LIBHAL_DRIVE_CDROM_CAPS_DVDPLUSRW)
00843           ret.push_back("dvdplusrw");
00844         if(caps & LIBHAL_DRIVE_CDROM_CAPS_DVDPLUSRDL)
00845           ret.push_back("dvdplusrdl");
00846 
00847         return ret;
00848 
00849 #if 0
00850         if( libhal_drive_get_type(d_impl->drv) != LIBHAL_DRIVE_TYPE_CDROM)
00851           ZYPP_THROW(HalException(_("Not a CDROM drive")));
00852 
00853         /*
00854         ** FIXME: we use property keys matching
00855         **          "storage.cdrom.cd*"
00856         **          "storage.cdrom.dvd*"
00857         ** but this may print other bool keys,
00858         ** that are not CDROM caps.
00859         */
00860         LibHalPropertySet         *props;
00861         HalError                   err;
00862 
00863         props = libhal_device_get_all_properties(d_impl->hal->hctx,
00864                                                  getUDI().c_str(),
00865                                                  &err.error);
00866         if( !props)
00867           ZYPP_THROW(err.halException());
00868 
00869         std::vector<std::string>   ret(1, getTypeName());
00870         std::string                key;
00871         std::string                dvd("storage.cdrom.dvd");
00872         std::string                cd ("storage.cdrom.cd");
00873 
00874         LibHalPropertySetIterator  it;
00875         for(libhal_psi_init(&it, props);
00876             libhal_psi_has_more(&it);
00877             libhal_psi_next(&it))
00878         {
00879           if( libhal_psi_get_type(&it) == LIBHAL_PROPERTY_TYPE_BOOLEAN &&
00880               libhal_psi_get_bool(&it))
00881           {
00882             key = libhal_psi_get_key(&it);
00883             if( key.compare(0, cd.size(), cd) == 0)
00884             {
00885               ret.push_back(key.substr(sizeof("storage.cdrom.")-1));
00886             }
00887             else
00888             if( key.compare(0, dvd.size(), dvd) == 0)
00889             {
00890               ret.push_back(key.substr(sizeof("storage.cdrom.")-1));
00891             }
00892           }
00893         }
00894         libhal_free_property_set(props);
00895 
00896         return ret;
00897 #endif
00898       }
00899 
00900       // --------------------------------------------------------------
00901       std::vector<std::string>
00902       HalDrive::findAllVolumes() const
00903       {
00904         MutexLock  lock(g_Mutex);
00905         VERIFY_DRIVE(d_impl);
00906 
00907         char     **names;
00908         int        count = 0;
00909 
00910         names = libhal_drive_find_all_volumes(d_impl->hal->hctx,
00911                                               d_impl->drv,
00912                                               &count);
00913 
00914         std::vector<std::string> ret;
00915         ret.assign(names, names + count);
00916         libhal_free_string_array(names);
00917         return ret;
00918       }
00919 
00920 
00922       HalVolume::HalVolume()
00923         : v_impl( NULL)
00924       {}
00925 
00926       HalVolume::HalVolume(HalVolume_Impl *impl)
00927         : v_impl( NULL)
00928       {
00929         MutexLock  lock(g_Mutex);
00930 
00931         v_impl.reset(impl);
00932       }
00933 
00934       // --------------------------------------------------------------
00935       HalVolume::HalVolume(const HalVolume &volume)
00936         : v_impl( NULL)
00937       {
00938         MutexLock  lock(g_Mutex);
00939 
00940         zypp::RW_pointer<HalVolume_Impl>(volume.v_impl).swap(v_impl);
00941       }
00942 
00943       // --------------------------------------------------------------
00944       HalVolume::~HalVolume()
00945       {
00946         MutexLock  lock(g_Mutex);
00947 
00948         v_impl.reset();
00949       }
00950 
00951       // --------------------------------------------------------------
00952       HalVolume &
00953       HalVolume::operator=(const HalVolume &volume)
00954       {
00955         MutexLock  lock(g_Mutex);
00956 
00957         if( this == &volume)
00958           return *this;
00959 
00960         zypp::RW_pointer<HalVolume_Impl>(volume.v_impl).swap(v_impl);
00961         return *this;
00962       }
00963 
00964       // --------------------------------------------------------------
00965       HalVolume::operator HalVolume::bool_type() const
00966       {
00967         MutexLock  lock(g_Mutex);
00968 
00969         return v_impl;
00970       }
00971 
00972       // --------------------------------------------------------------
00973       std::string
00974       HalVolume::getUDI() const
00975       {
00976         MutexLock  lock(g_Mutex);
00977         VERIFY_VOLUME(v_impl);
00978 
00979         const char *ptr = libhal_volume_get_udi(v_impl->vol);
00980         return std::string(ptr ? ptr : "");
00981       }
00982 
00983       // --------------------------------------------------------------
00984       std::string
00985       HalVolume::getDeviceFile() const
00986       {
00987         MutexLock  lock(g_Mutex);
00988         VERIFY_VOLUME(v_impl);
00989 
00990         return std::string(libhal_volume_get_device_file(v_impl->vol));
00991       }
00992 
00993       // --------------------------------------------------------------
00994       unsigned int
00995       HalVolume::getDeviceMajor() const
00996       {
00997         MutexLock  lock(g_Mutex);
00998         VERIFY_VOLUME(v_impl);
00999 
01000         return libhal_volume_get_device_major(v_impl->vol);
01001       }
01002 
01003       // --------------------------------------------------------------
01004       unsigned int
01005       HalVolume::getDeviceMinor() const
01006       {
01007         MutexLock  lock(g_Mutex);
01008         VERIFY_VOLUME(v_impl);
01009 
01010         return libhal_volume_get_device_minor(v_impl->vol);
01011       }
01012 
01013       // --------------------------------------------------------------
01014       bool
01015       HalVolume::isDisc() const
01016       {
01017         MutexLock  lock(g_Mutex);
01018         VERIFY_VOLUME(v_impl);
01019 
01020         return libhal_volume_is_disc(v_impl->vol);
01021       }
01022 
01023       // --------------------------------------------------------------
01024       bool
01025       HalVolume::isPartition() const
01026       {
01027         MutexLock  lock(g_Mutex);
01028         VERIFY_VOLUME(v_impl);
01029 
01030         return libhal_volume_is_partition(v_impl->vol);
01031       }
01032 
01033       // --------------------------------------------------------------
01034       bool
01035       HalVolume::isMounted() const
01036       {
01037         MutexLock  lock(g_Mutex);
01038         VERIFY_VOLUME(v_impl);
01039 
01040         return libhal_volume_is_mounted(v_impl->vol);
01041       }
01042 
01043       // --------------------------------------------------------------
01044       std::string
01045       HalVolume::getFSType() const
01046       {
01047         MutexLock  lock(g_Mutex);
01048         VERIFY_VOLUME(v_impl);
01049 
01050         return std::string( libhal_volume_get_fstype(v_impl->vol));
01051       }
01052 
01053       // --------------------------------------------------------------
01054       std::string
01055       HalVolume::getFSUsage() const
01056       {
01057         MutexLock  lock(g_Mutex);
01058         VERIFY_VOLUME(v_impl);
01059 
01060         LibHalVolumeUsage usage( libhal_volume_get_fsusage(v_impl->vol));
01061         std::string       ret;
01062         switch( usage)
01063         {
01064           case  LIBHAL_VOLUME_USAGE_MOUNTABLE_FILESYSTEM:
01065             ret = "filesystem";
01066           break;
01067           case LIBHAL_VOLUME_USAGE_PARTITION_TABLE:
01068             ret = "partitiontable";
01069           break;
01070           case LIBHAL_VOLUME_USAGE_RAID_MEMBER:
01071             return "raid";
01072           break;
01073           case LIBHAL_VOLUME_USAGE_CRYPTO:
01074             ret = "crypto";
01075           break;
01076           case LIBHAL_VOLUME_USAGE_UNKNOWN:
01077           default:
01078           break;
01079         }
01080         return ret;
01081       }
01082 
01083       // --------------------------------------------------------------
01084       std::string
01085       HalVolume::getMountPoint() const
01086       {
01087         VERIFY_VOLUME(v_impl);
01088 
01089         return std::string( libhal_volume_get_mount_point(v_impl->vol));
01090       }
01091 
01092 
01094     } // namespace hal
01097   } // namespace target
01100 } // namespace zypp
01102 #else // NO_HAL
01103 #include <zypp/target/hal/HalContext.h>
01104 #include <zypp/target/hal/HalException.h>
01105 namespace zypp
01106 { 
01107 
01108   namespace target
01109   { 
01110 
01111     namespace hal
01112     { 
01113 
01114       std::ostream &
01115       HalException::dumpOn( std::ostream & str ) const
01116       { return str; }
01117 
01118       // --------------------------------------------------------------
01119       class HalContext_Impl
01120       {};
01121       class HalDrive_Impl
01122       {};
01123       class HalVolume_Impl
01124       {};
01125 
01126       // --------------------------------------------------------------
01127       HalContext::HalContext(bool)
01128       { ZYPP_THROW( NoHalException() ); }
01129       HalContext::~HalContext()
01130       {}
01131       HalContext &
01132       HalContext::operator=(const HalContext &)
01133       { return *this; }
01134       HalContext::operator HalContext::bool_type() const
01135       { return 0; }
01136       void
01137       HalContext::connect()
01138       {}
01139       std::vector<std::string>
01140       HalContext::getAllDevices() const
01141       { return std::vector<std::string>(); }
01142       HalDrive
01143       HalContext::getDriveFromUDI(const std::string &) const
01144       { return HalDrive(); }
01145       HalVolume
01146       HalContext::getVolumeFromUDI(const std::string &) const
01147       { return HalVolume(); }
01148       HalVolume
01149       HalContext::getVolumeFromDeviceFile(const std::string &) const
01150       { return HalVolume(); }
01151       std::vector<std::string>
01152       HalContext::findDevicesByCapability(const std::string &) const
01153       { return std::vector<std::string>(); }
01154       bool
01155       HalContext::getDevicePropertyBool(const std::string &, const std::string &) const
01156       { return false; }
01157       void
01158       HalContext::setDevicePropertyBool  (const std::string &, const std::string &, bool value)
01159       {}
01160       void
01161       HalContext::removeDeviceProperty(const std::string &, const std::string &)
01162       {}
01163       std::string
01164       HalContext::getDevicePropertyString(const std::string &, const std::string &) const
01165       { return ""; }
01166       // --------------------------------------------------------------
01167       HalDrive::HalDrive()
01168       { ZYPP_THROW( NoHalException() ); }
01169       HalDrive::~HalDrive()
01170       {}
01171       HalDrive &
01172       HalDrive::operator=(const HalDrive &)
01173       { return *this; }
01174       HalDrive::operator HalDrive::bool_type() const
01175       { return 0; }
01176       std::string
01177       HalDrive::getUDI() const
01178       { return std::string(); }
01179       std::string
01180       HalDrive::getTypeName() const
01181       { return std::string(); }
01182       std::string
01183       HalDrive::getDeviceFile() const
01184       { return std::string(); }
01185       unsigned int
01186       HalDrive::getDeviceMinor() const
01187       { return 0; }
01188       unsigned int
01189       HalDrive::getDeviceMajor() const
01190       { return 0; }
01191       bool
01192       HalDrive::usesRemovableMedia() const
01193       { return false; }
01194       std::vector<std::string>
01195       HalDrive::getCdromCapabilityNames() const
01196       { return std::vector<std::string>(); }
01197       std::vector<std::string>
01198       HalDrive::findAllVolumes() const
01199       { return std::vector<std::string>(); }
01200 
01201       // --------------------------------------------------------------
01202       HalVolume::HalVolume()
01203       { ZYPP_THROW( NoHalException() ); }
01204       HalVolume::~HalVolume()
01205       {}
01206       HalVolume &
01207       HalVolume::operator=(const HalVolume &)
01208       { return *this; }
01209       HalVolume::operator HalVolume::bool_type() const
01210       { return 0; }
01211       std::string
01212       HalVolume::getUDI() const
01213       { return std::string(); }
01214       std::string
01215       HalVolume::getDeviceFile() const
01216       { return std::string(); }
01217       unsigned int
01218       HalVolume::getDeviceMinor() const
01219       { return 0; }
01220       unsigned int
01221       HalVolume::getDeviceMajor() const
01222       { return 0; }
01223       bool
01224       HalVolume::isDisc() const
01225       { return false; }
01226       bool
01227       HalVolume::isPartition() const
01228       { return false; }
01229       bool
01230       HalVolume::isMounted() const
01231       { return false; }
01232       std::string
01233       HalVolume::getFSType() const
01234       { return std::string(); }
01235       std::string
01236       HalVolume::getFSUsage() const
01237       { return std::string(); }
01238       std::string
01239       HalVolume::getMountPoint() const
01240       { return std::string(); }
01241 
01243     } // namespace hal
01246   } // namespace target
01249 } // namespace zypp
01251 #endif // NO_HAL
01252 
01253 /*
01254 ** vim: set ts=2 sts=2 sw=2 ai et:
01255 */