#include "zypp/base/Logger.h"
#include "zypp/base/Gettext.h"
#include "zypp/base/UserRequestException.h"
+#include "zypp/base/NonCopyable.h"
#include "zypp/repo/PackageProvider.h"
-#include "zypp/repo/RepoProvideFile.h"
#include "zypp/repo/Applydeltarpm.h"
#include "zypp/repo/PackageDelta.h"
///////////////////////////////////////////////////////////////////
namespace zypp
-{ /////////////////////////////////////////////////////////////////
+{
///////////////////////////////////////////////////////////////////
namespace repo
- { /////////////////////////////////////////////////////////////////
-
+ {
///////////////////////////////////////////////////////////////////
//
// CLASS NAME : PackageProviderPolicy
}
///////////////////////////////////////////////////////////////////
- //
- // CLASS NAME : PackageProvider
- //
+ /// \class PackageProvider::Impl
+ /// \brief PackageProvider implementation.
///////////////////////////////////////////////////////////////////
-
+ class PackageProvider::Impl : private base::NonCopyable
+ {
+ typedef shared_ptr<void> ScopedGuard;
+ typedef callback::SendReport<repo::DownloadResolvableReport> Report;
+
+ typedef packagedelta::DeltaRpm DeltaRpm;
+
+ public:
+ /** Ctor taking the Package to provide. */
+ Impl( RepoMediaAccess &access,
+ const Package::constPtr & package,
+ const DeltaCandidates & deltas,
+ const PackageProviderPolicy & policy_r );
+
+ public:
+ /** Provide the package.
+ * \throws Exception.
+ */
+ ManagedFile providePackage() const;
+
+ private:
+ ManagedFile doProvidePackage() const;
+ ManagedFile tryDelta( const DeltaRpm & delta_r ) const;
+
+ private:
+ ScopedGuard newReport() const;
+ Report & report() const;
+ bool progressDeltaDownload( int value ) const;
+ void progressDeltaApply( int value ) const;
+ bool progressPackageDownload( int value ) const;
+ bool failOnChecksumError() const;
+ bool queryInstalled( const Edition & ed_r = Edition() ) const;
+
+ private:
+ PackageProviderPolicy _policy;
+ Package::constPtr _package;
+ mutable bool _retry;
+ mutable shared_ptr<Report> _report;
+ DeltaCandidates _deltas;
+ RepoMediaAccess & _access;
+ };
///////////////////////////////////////////////////////////////////
- namespace
- { /////////////////////////////////////////////////////////////////
-
- inline std::string defRpmFileName( const Package::constPtr & package )
- {
- std::ostringstream ret;
- ret << package->name() << '-' << package->edition() << '.' << package->arch() << ".rpm";
- return ret.str();
- }
- /////////////////////////////////////////////////////////////////
- } // namespace source
- ///////////////////////////////////////////////////////////////////
- PackageProvider::PackageProvider( RepoMediaAccess &access,
- const Package::constPtr & package,
- const DeltaCandidates & deltas,
- const PackageProviderPolicy & policy_r )
+ PackageProvider::Impl::Impl( RepoMediaAccess &access,
+ const Package::constPtr & package,
+ const DeltaCandidates & deltas,
+ const PackageProviderPolicy & policy_r )
: _policy( policy_r )
, _package( package )
, _retry(false)
, _access(access)
{}
- PackageProvider::~PackageProvider()
- {}
-
- ManagedFile PackageProvider::providePackage() const
+ ManagedFile PackageProvider::Impl::providePackage() const
{
Url url;
RepoInfo info = _package->repoInfo();
return ret;
}
- ManagedFile PackageProvider::doProvidePackage() const
+ ManagedFile PackageProvider::Impl::doProvidePackage() const
{
Url url;
RepoInfo info = _package->repoInfo();
OnMediaLocation loc = _package->location();
ProvideFilePolicy policy;
- policy.progressCB( bind( &PackageProvider::progressPackageDownload, this, _1 ) );
- policy.failOnChecksumErrorCB( bind( &PackageProvider::failOnChecksumError, this ) );
+ policy.progressCB( bind( &PackageProvider::Impl::progressPackageDownload, this, _1 ) );
+ policy.failOnChecksumErrorCB( bind( &PackageProvider::Impl::failOnChecksumError, this ) );
return _access.provideFile( _package->repoInfo(), loc, policy );
}
- ManagedFile PackageProvider::tryDelta( const DeltaRpm & delta_r ) const
+ ManagedFile PackageProvider::Impl::tryDelta( const DeltaRpm & delta_r ) const
{
if ( delta_r.baseversion().edition() != Edition::noedition
&& ! queryInstalled( delta_r.baseversion().edition() ) )
try
{
ProvideFilePolicy policy;
- policy.progressCB( bind( &PackageProvider::progressDeltaDownload, this, _1 ) );
+ policy.progressCB( bind( &PackageProvider::Impl::progressDeltaDownload, this, _1 ) );
delta = _access.provideFile( delta_r.repository().info(), delta_r.location(), policy );
}
catch ( const Exception & excpt )
Pathname destination( _package->repoInfo().packagesPath() / _package->location().filename() );
if ( ! applydeltarpm::provide( delta, destination,
- bind( &PackageProvider::progressDeltaApply, this, _1 ) ) )
+ bind( &PackageProvider::Impl::progressDeltaApply, this, _1 ) ) )
{
report()->problemDeltaApply( _("applydeltarpm failed.") );
return ManagedFile();
return ManagedFile( destination, filesystem::unlink );
}
- PackageProvider::ScopedGuard PackageProvider::newReport() const
+ PackageProvider::Impl::ScopedGuard PackageProvider::Impl::newReport() const
{
_report.reset( new Report );
return shared_ptr<void>( static_cast<void*>(0),
ref(_report) ) );
}
- PackageProvider::Report & PackageProvider::report() const
+ PackageProvider::Impl::Report & PackageProvider::Impl::report() const
{ return *_report; }
- bool PackageProvider::progressDeltaDownload( int value ) const
+ bool PackageProvider::Impl::progressDeltaDownload( int value ) const
{ return report()->progressDeltaDownload( value ); }
- void PackageProvider::progressDeltaApply( int value ) const
+ void PackageProvider::Impl::progressDeltaApply( int value ) const
{ return report()->progressDeltaApply( value ); }
- bool PackageProvider::progressPackageDownload( int value ) const
+ bool PackageProvider::Impl::progressPackageDownload( int value ) const
{ return report()->progress( value, _package ); }
- bool PackageProvider::failOnChecksumError() const
+ bool PackageProvider::Impl::failOnChecksumError() const
{
std::string package_str = _package->name() + "-" + _package->edition().asString();
return true; // anyway a failure
}
- bool PackageProvider::queryInstalled( const Edition & ed_r ) const
+ bool PackageProvider::Impl::queryInstalled( const Edition & ed_r ) const
{ return _policy.queryInstalled( _package->name(), ed_r, _package->arch() ); }
+ ///////////////////////////////////////////////////////////////////
+ // class PackageProvider
+ ///////////////////////////////////////////////////////////////////
+
+ PackageProvider::PackageProvider( RepoMediaAccess & access,
+ const Package::constPtr & package,
+ const DeltaCandidates & deltas,
+ const PackageProviderPolicy & policy_r )
+ : _pimpl( new Impl( access, package, deltas, policy_r ) )
+ {}
+
+ PackageProvider::~PackageProvider()
+ {}
+
+ ManagedFile PackageProvider::providePackage() const
+ { return _pimpl->providePackage(); }
+
- /////////////////////////////////////////////////////////////////
} // namespace repo
///////////////////////////////////////////////////////////////////
- /////////////////////////////////////////////////////////////////
} // namespace zypp
///////////////////////////////////////////////////////////////////
#include <iosfwd>
-#include "zypp/base/NonCopyable.h"
-
#include "zypp/ZYppCallbacks.h"
#include "zypp/Package.h"
#include "zypp/ManagedFile.h"
-#include "zypp/repo/RepoProvideFile.h"
#include "zypp/repo/DeltaCandidates.h"
+#include "zypp/repo/RepoProvideFile.h"
///////////////////////////////////////////////////////////////////
namespace zypp
-{ /////////////////////////////////////////////////////////////////
+{
///////////////////////////////////////////////////////////////////
namespace repo
- { /////////////////////////////////////////////////////////////////
+ {
///////////////////////////////////////////////////////////////////
- //
- // CLASS NAME : PackageProviderPolicy
- //
- /** */
+ /// \class PackageProviderPolicy
+ /// \brief Policies and options for \ref PackageProvider
+ ///////////////////////////////////////////////////////////////////
class PackageProviderPolicy
{
public:
///////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////
- //
- // CLASS NAME : PackageProvider
- //
- /** Provide a package from a Source.
- * Use available deltarpm if apropriate.
- */
- class PackageProvider : private base::NonCopyable
+ /// \class PackageProvider
+ /// \brief Provide a package from a Repo.
+ ///
+ /// Use available deltarpm if apropriate.
+ ///////////////////////////////////////////////////////////////////
+ class PackageProvider
{
- typedef shared_ptr<void> ScopedGuard;
- typedef callback::SendReport<repo::DownloadResolvableReport> Report;
-
- typedef packagedelta::DeltaRpm DeltaRpm;
-
public:
/** Ctor taking the Package to provide. */
- PackageProvider( RepoMediaAccess &access,
+ PackageProvider( RepoMediaAccess & access,
const Package::constPtr & package,
const DeltaCandidates & deltas,
const PackageProviderPolicy & policy_r = PackageProviderPolicy() );
*/
ManagedFile providePackage() const;
+ public:
+ class Impl; ///< Implementation class.
private:
- ManagedFile doProvidePackage() const;
- ManagedFile tryDelta( const DeltaRpm & delta_r ) const;
-
- private:
- ScopedGuard newReport() const;
- Report & report() const;
- bool progressDeltaDownload( int value ) const;
- void progressDeltaApply( int value ) const;
- bool progressPackageDownload( int value ) const;
- bool failOnChecksumError() const;
- bool queryInstalled( const Edition & ed_r = Edition() ) const;
-
- private:
- PackageProviderPolicy _policy;
- Package::constPtr _package;
- mutable bool _retry;
- mutable shared_ptr<Report> _report;
- DeltaCandidates _deltas;
- RepoMediaAccess & _access;
+ RW_pointer<Impl> _pimpl; ///< Pointer to implementation.
};
///////////////////////////////////////////////////////////////////
- /////////////////////////////////////////////////////////////////
} // namespace repo
///////////////////////////////////////////////////////////////////
- /////////////////////////////////////////////////////////////////
} // namespace zypp
///////////////////////////////////////////////////////////////////
#endif // ZYPP_SOURCE_PACKAGEPROVIDER_H