MediaAccess.h
Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00012 #ifndef ZYPP_MEDIA_MEDIAACCESS_H
00013 #define ZYPP_MEDIA_MEDIAACCESS_H
00014
00015 #include <iosfwd>
00016 #include <map>
00017 #include <list>
00018 #include <string>
00019
00020 #include "zypp/base/ReferenceCounted.h"
00021 #include "zypp/base/NonCopyable.h"
00022 #include "zypp/base/PtrTypes.h"
00023 #include "zypp/base/Deprecated.h"
00024
00025 #include "zypp/Pathname.h"
00026 #include "zypp/PathInfo.h"
00027
00028 #include "zypp/media/MediaException.h"
00029 #include "zypp/media/MediaSource.h"
00030
00031 #include "zypp/Url.h"
00032
00033 namespace zypp {
00034 namespace media {
00035
00036 class MediaHandler;
00037
00039
00040
00050 class MediaAccess : public base::ReferenceCounted, private base::NonCopyable
00051 {
00052 public:
00053 typedef intrusive_ptr<MediaAccess> Ptr;
00054 typedef intrusive_ptr<const MediaAccess> constPtr;
00055
00056 private:
00057
00058 static const Pathname _noPath;
00059
00064 MediaHandler * _handler;
00065
00066 friend class MediaManager;
00067 friend class MediaManager_Impl;
00068
00069 AttachedMedia attachedMedia() const;
00070
00071 bool isSharedMedia() const;
00072
00073 void resetParentId();
00074 bool dependsOnParent() const;
00075
00076 bool dependsOnParent(MediaAccessId parentId,
00077 bool exactIdMatch) const;
00078 public:
00079
00083 MediaAccess();
00084
00095 void open( const Url& url, const Pathname & preferred_attach_point = "" );
00096
00100 bool isOpen() const { return( _handler != 0 ); }
00101
00106 bool downloads() const;
00107
00109 static
00110 ZYPP_DEPRECATED bool downloads(const Url &url)
00111 { return url.schemeIsDownloading(); }
00112
00114 static
00115 ZYPP_DEPRECATED bool canBeVolatile(const Url &url)
00116 { return url.schemeIsVolatile(); }
00117
00121 std::string protocol() const;
00122
00126 Url url() const;
00127
00134 void close();
00135
00136 public:
00137
00148 void attach(bool next = false);
00149
00156 bool isAttached() const;
00157
00158 bool hasMoreDevices() const;
00159
00168 virtual void
00169 getDetectedDevices(std::vector<std::string> & devices,
00170 unsigned int & index) const;
00171
00172
00181 Pathname localRoot() const;
00182
00189 Pathname localPath( const Pathname & pathname ) const;
00190
00204 void disconnect();
00205
00213 void release( const std::string & ejectDev = "" );
00214
00232 void provideFile( const Pathname & filename ) const;
00233
00241 void releaseFile( const Pathname & filename ) const;
00242
00252 void provideDir( const Pathname & dirname ) const;
00253
00263 void provideDirTree( const Pathname & dirname ) const;
00264
00272 void releaseDir( const Pathname & dirname ) const;
00273
00285 void releasePath( const Pathname & pathname ) const;
00286
00290 void setDeltafile( const Pathname & filename ) const;
00291
00292 public:
00293
00307 void dirInfo( std::list<std::string> & retlist,
00308 const Pathname & dirname, bool dots = true ) const;
00309
00322 void dirInfo( filesystem::DirContent & retlist,
00323 const Pathname & dirname, bool dots = true ) const;
00324
00333 bool doesFileExist( const Pathname & filename ) const;
00334
00338 virtual ~MediaAccess();
00339
00340 public:
00341
00342 virtual std::ostream & dumpOn( std::ostream & str ) const;
00343
00344 public:
00355 void getFile( const Url &from, const Pathname &to );
00356
00357 public:
00358
00379 class FileProvider {
00380 FileProvider( const FileProvider & );
00381 FileProvider & operator=( const FileProvider & );
00382 private:
00383 MediaAccess::constPtr _media;
00384 Pathname _file;
00385 Pathname _local_file;
00386 public:
00390 FileProvider( MediaAccess::constPtr media_r, const Pathname & file_r )
00391 : _media( media_r )
00392 , _file( file_r )
00393 , _local_file( "" )
00394 {
00395 if ( _file.empty() ) {
00396 ZYPP_THROW(MediaBadFilenameException(_file.asString()));
00397 } else if ( _media ) {
00398 try {
00399 _media->provideFile( _file );
00400 _local_file = _media->localPath( _file );
00401 }
00402 catch (const MediaException & excpt_r)
00403 {
00404 ZYPP_CAUGHT(excpt_r);
00405 _media = NULL;
00406 ZYPP_RETHROW(excpt_r);
00407 }
00408 }
00409 }
00410
00411 ~FileProvider() {
00412 if ( _media )
00413 {
00414 try {
00415 _media->releaseFile( _file );
00416 }
00417 catch (const MediaException &excpt_r)
00418 {
00419 ZYPP_CAUGHT(excpt_r);
00420 }
00421 catch(...) {}
00422 }
00423 }
00424
00425 public:
00426
00431 Pathname localFile() const { return _local_file; }
00432
00437 Pathname operator()() const {
00438 if ( _media )
00439 return _media->localPath( _file );
00440 return Pathname();
00441 }
00442 };
00443 };
00444
00445 std::ostream & operator<<( std::ostream & str, const MediaAccess & obj );
00446
00448
00449 }
00450 }
00451
00452 #endif // ZYPP_MEDIA_MEDIAACCESS_H
00453