1 /*---------------------------------------------------------------------\
3 | |__ / \ / / . \ . \ |
8 \---------------------------------------------------------------------*/
9 /** \file zypp/PoolItem.cc
13 #include "zypp/base/Logger.h"
15 #include "zypp/PoolItem.h"
16 #include "zypp/Package.h"
17 #include "zypp/SystemResObject.h"
18 #include "zypp/VendorAttr.h"
22 ///////////////////////////////////////////////////////////////////
24 { /////////////////////////////////////////////////////////////////
26 ///////////////////////////////////////////////////////////////////
28 // CLASS NAME : PoolItem_Ref::Impl
30 /** PoolItem_Ref implementation. */
31 struct PoolItem_Ref::Impl
36 Impl( ResObject::constPtr res_r,
37 const ResStatus & status_r = ResStatus() )
39 , _resolvable( res_r )
44 ResStatus & status() const
47 ResStatus & statusReset() const
49 if ( ! autoprotect() )
51 _status.setLock( false, zypp::ResStatus::USER );
52 _status.resetTransact( zypp::ResStatus::USER );
57 ResObject::constPtr resolvable() const
58 { return _resolvable; }
60 bool autoprotect() const;
63 mutable ResStatus _status;
64 ResObject::constPtr _resolvable;
66 /** \name Poor man's save/restore state.
67 * \todo There may be better save/restore state strategies.
71 void saveState() const
72 { _savedStatus = _status; }
73 void restoreState() const
74 { _status = _savedStatus; }
75 bool sameState() const
77 if ( _status.getTransactValue() != _savedStatus.getTransactValue()
78 && !_status.isBySolver() )
80 if ( _status.isLicenceConfirmed() != _savedStatus.isLicenceConfirmed() )
85 mutable ResStatus _savedStatus;
89 /** Offer default Impl. */
90 static shared_ptr<Impl> nullimpl()
92 static shared_ptr<Impl> _nullimpl( new Impl );
96 ///////////////////////////////////////////////////////////////////
98 /** \relates PoolItem_Ref::Impl Stream output */
99 inline std::ostream & operator<<( std::ostream & str, const PoolItem_Ref::Impl & obj )
102 if (obj.resolvable())
103 str << *obj.resolvable();
109 inline bool PoolItem_Ref::Impl::autoprotect() const
111 // always lock System resolvable
112 if ( isKind<SystemResObject>( _resolvable ) )
114 _status.setLock( true, zypp::ResStatus::USER );
118 if ( _status.isInstalled()
119 && isKind<Package>( _resolvable )
120 && VendorAttr::instance().autoProtect( _resolvable->vendor() ) )
122 _status.setLock( true, zypp::ResStatus::USER );
123 MIL << "Protect vendor '" << _resolvable->vendor() << "' " << *this << endl;
129 ///////////////////////////////////////////////////////////////////
131 // CLASS NAME : PoolItem_Ref
133 ///////////////////////////////////////////////////////////////////
135 ///////////////////////////////////////////////////////////////////
137 // METHOD NAME : PoolItem_Ref::PoolItem_Ref
138 // METHOD TYPE : Ctor
140 PoolItem_Ref::PoolItem_Ref()
141 : _pimpl( Impl::nullimpl() )
144 ///////////////////////////////////////////////////////////////////
146 // METHOD NAME : PoolItem_Ref::PoolItem_Ref
147 // METHOD TYPE : Ctor
149 PoolItem_Ref::PoolItem_Ref( ResObject::constPtr res_r )
150 : _pimpl( new Impl( res_r ) )
153 ///////////////////////////////////////////////////////////////////
155 // METHOD NAME : PoolItem_Ref::PoolItem_Ref
156 // METHOD TYPE : Ctor
158 PoolItem_Ref::PoolItem_Ref( ResObject::constPtr res_r, const ResStatus & status_r )
159 : _pimpl( new Impl( res_r, status_r ) )
162 ///////////////////////////////////////////////////////////////////
164 // METHOD NAME : PoolItem_Ref::~PoolItem_Ref
165 // METHOD TYPE : Dtor
167 PoolItem_Ref::~PoolItem_Ref()
170 ///////////////////////////////////////////////////////////////////
174 ///////////////////////////////////////////////////////////////////
176 ResStatus & PoolItem_Ref::status() const
177 { return _pimpl->status(); }
179 ResStatus & PoolItem_Ref::statusReset() const
180 { return _pimpl->statusReset(); }
182 ResObject::constPtr PoolItem_Ref::resolvable() const
183 { return _pimpl->resolvable(); }
185 void PoolItem_Ref::saveState() const
186 { _pimpl->saveState(); }
188 void PoolItem_Ref::restoreState() const
189 { _pimpl->restoreState(); }
191 bool PoolItem_Ref::sameState() const
192 { return _pimpl->sameState(); }
194 /******************************************************************
196 ** FUNCTION NAME : operator<<
197 ** FUNCTION TYPE : std::ostream &
199 std::ostream & operator<<( std::ostream & str, const PoolItem_Ref & obj )
201 return str << *obj._pimpl;
204 /////////////////////////////////////////////////////////////////
206 ///////////////////////////////////////////////////////////////////