libzypp  17.36.7
lazymediahandle.h
Go to the documentation of this file.
1 /*---------------------------------------------------------------------\
2 | ____ _ __ __ ___ |
3 | |__ / \ / / . \ . \ |
4 | / / \ V /| _/ _/ |
5 | / /__ | | | | | | |
6 | /_____||_| |_| |_| |
7 | |
8 \---------------------------------------------------------------------*/
9 #ifndef ZYPP_MEDIA_NG_LAZYMEDIAHANDLE_H
10 #define ZYPP_MEDIA_NG_LAZYMEDIAHANDLE_H
11 
12 #include <zypp-media/ng/ProvideSpec>
13 #include <optional>
14 
15 
16 namespace zyppng
17 {
18  template < class ProvideType >
20  public:
21  using MediaHandle = typename ProvideType::MediaHandle;
23 
24  friend ProvideType;
25 
26  LazyMediaHandle( Ref<ProvideType> provider, std::vector<zypp::Url> urls, ProvideMediaSpec spec )
27  : _sharedData(
28  std::make_shared<Data>(
29  std::move(provider)
30  ,std::move(urls)
31  ,std::move(spec)
32  ))
33  { }
34 
35  LazyMediaHandle(const LazyMediaHandle &) = default;
36  LazyMediaHandle(LazyMediaHandle &&) = default;
37  LazyMediaHandle &operator=(const LazyMediaHandle &) = default;
39 
40  const Ref<ProvideType> &parent () const {
41  return _sharedData->_provider.lock();
42  }
43 
48  const zypp::Url &baseUrl() const {
49  if ( !_sharedData->_mediaHandle ) {
50  static zypp::Url invalidHandle;
51  if ( _sharedData->_urls.empty() )
52  return invalidHandle;
53  return _sharedData->_urls.front();
54  } else {
55  return _sharedData->_mediaHandle->baseUrl();
56  }
57  }
58 
59  const std::vector<zypp::Url> &urls() const {
60  return _sharedData->_urls;
61  }
62 
63  std::optional<MediaHandle> handle () const {
64  return _sharedData->_mediaHandle;
65  }
66 
67  const ProvideMediaSpec &spec() const {
68  return _sharedData->_spec;
69  }
70 
71  const std::optional<zypp::Pathname> &localPath() const
72  {
73  static std::optional<zypp::Pathname> noHandle;
74  if ( !attached() )
75  return noHandle;
76  return _sharedData->_mediaHandle.localPath();
77  }
78 
79  bool attached() const {
80  return _sharedData->_mediaHandle.has_value();
81  }
82 
83  private:
84 
85  struct Data {
86  Data(Ref<ProvideType> &&provider, std::vector<zypp::Url> &&urls,
88  : _provider(std::move(provider)), _urls(std::move(urls)),
89  _spec(std::move(spec)) {}
90 
91  Data(const Data &) = delete;
92  Data(Data &&) = delete;
93  Data &operator=(const Data &) = delete;
94  Data &operator=(Data &&) = delete;
95 
97  std::vector<zypp::Url> _urls;
99  std::optional<MediaHandle> _mediaHandle;
100  };
102  };
103 }
104 
105 #endif // ZYPP_MEDIA_NG_LAZYMEDIAHANDLE_H
LazyMediaHandle(Ref< ProvideType > provider, std::vector< zypp::Url > urls, ProvideMediaSpec spec)
std::shared_ptr< T > Ref
Definition: zyppglobal.h:110
const ProvideMediaSpec & spec() const
std::optional< MediaHandle > _mediaHandle
Definition: Arch.h:363
const std::vector< zypp::Url > & urls() const
const Ref< ProvideType > & parent() const
typename ProvideType::MediaHandle MediaHandle
std::optional< MediaHandle > handle() const
std::weak_ptr< T > WeakRef
Definition: zyppglobal.h:113
Data(Ref< ProvideType > &&provider, std::vector< zypp::Url > &&urls, ProvideMediaSpec &&spec)
Data & operator=(const Data &)=delete
LazyMediaHandle & operator=(const LazyMediaHandle &)=default
std::vector< zypp::Url > _urls
const std::optional< zypp::Pathname > & localPath() const
WeakRef< ProvideType > _provider
const zypp::Url & baseUrl() const
Url manipulation class.
Definition: Url.h:92