#include "zypp/media/MediaManager.h"
#include "zypp/media/MediaHandler.h"
#include "zypp/media/Mount.h"
-#include "zypp/thread/Mutex.h"
-#include "zypp/thread/MutexLock.h"
#include "zypp/base/String.h"
#include "zypp/base/Logger.h"
namespace media
{ //////////////////////////////////////////////////////////////////
- using zypp::thread::Mutex;
- using zypp::thread::MutexLock;
-
//////////////////////////////////////////////////////////////////
namespace // anonymous
{ ////////////////////////////////////////////////////////////////
-
- // -------------------------------------------------------------
- // STATIC
- static Mutex g_Mutex;
-
-
// -------------------------------------------------------------
struct ManagedMedia
{
}
}
- inline void
- checkDesired(MediaAccessId id)
+ inline void checkDesired( MediaAccessId id )
{
- checkAttached(id);
+ checkAttached( id );
- if( !desired)
+ if ( !desired )
{
try {
desired = verifier->isDesiredMedia(handler);
- }
- catch(const zypp::Exception &e) {
- ZYPP_CAUGHT(e);
- desired = false;
+ } catch ( const zypp::Exception &e ) {
+ ZYPP_CAUGHT( e );
+
+ media::MediaNotDesiredException newEx ( handler->url() );
+ newEx.remember( e );
+ ZYPP_THROW( newEx );
}
- if( !desired)
+ if( !desired )
{
- DBG << "checkDesired(" << id << "): not desired (report by "
- << verifier->info() << ")" << std::endl;
- ZYPP_THROW(MediaNotDesiredException(
- handler->url()
- ));
+ DBG << "checkDesired(" << id << "): not desired (report by " << verifier->info() << ")" << std::endl;
+ ZYPP_THROW( MediaNotDesiredException( handler->url() ) );
}
- DBG << "checkDesired(" << id << "): desired (report by "
- << verifier->info() << ")" << std::endl;
+ DBG << "checkDesired(" << id << "): desired (report by " << verifier->info() << ")" << std::endl;
} else {
DBG << "checkDesired(" << id << "): desired (cached)" << std::endl;
}
public:
~MediaManager_Impl()
{
- MutexLock glock(g_Mutex);
-
try
{
// remove depending (iso) handlers first
static inline MountEntries
getMountEntries()
{
- // use "/etc/mtab" by default,
- // fallback to "/proc/mounts"
- return Mount::getEntries(/* "/etc/mtab" */);
+ return Mount::getEntries();
}
};
//////////////////////////////////////////////////////////////////
// STATIC
- zypp::RW_pointer<MediaManager_Impl> MediaManager::m_impl(NULL);
+ zypp::RW_pointer<MediaManager_Impl> MediaManager::m_impl;
//////////////////////////////////////////////////////////////////
MediaManager::MediaManager()
{
- MutexLock glock(g_Mutex);
if( !m_impl)
{
m_impl.reset( new MediaManager_Impl());
MediaAccessId
MediaManager::open(const Url &url, const Pathname &preferred_attach_point)
{
- MutexLock glock(g_Mutex);
-
// create new access handler for it
MediaAccessRef handler( new MediaAccess());
MediaVerifierRef verifier( new NoVerifier());
void
MediaManager::close(MediaAccessId accessId)
{
- MutexLock glock(g_Mutex);
-
//
// The MediaISO handler internally requests an accessId
// of a "parent" handler providing the iso file.
bool
MediaManager::isOpen(MediaAccessId accessId) const
{
- MutexLock glock(g_Mutex);
-
ManagedMediaMap::iterator it( m_impl->mediaMap.find(accessId));
return it != m_impl->mediaMap.end() &&
it->second.handler->isOpen();
std::string
MediaManager::protocol(MediaAccessId accessId) const
{
- MutexLock glock(g_Mutex);
-
ManagedMedia &ref( m_impl->findMM(accessId));
return ref.handler->protocol();
bool
MediaManager::downloads(MediaAccessId accessId) const
{
- MutexLock glock(g_Mutex);
-
ManagedMedia &ref( m_impl->findMM(accessId));
return ref.handler->downloads();
Url
MediaManager::url(MediaAccessId accessId) const
{
- MutexLock glock(g_Mutex);
-
ManagedMedia &ref( m_impl->findMM(accessId));
return ref.handler->url();
MediaManager::addVerifier(MediaAccessId accessId,
const MediaVerifierRef &verifier)
{
- MutexLock glock(g_Mutex);
-
if( !verifier)
ZYPP_THROW(MediaException("Invalid verifier reference"));
void
MediaManager::delVerifier(MediaAccessId accessId)
{
- MutexLock glock(g_Mutex);
-
ManagedMedia &ref( m_impl->findMM(accessId));
MediaVerifierRef verifier( new NoVerifier());
bool
MediaManager::setAttachPrefix(const Pathname &attach_prefix)
{
- MutexLock glock(g_Mutex);
-
return MediaHandler::setAttachPrefix(attach_prefix);
}
// ---------------------------------------------------------------
void MediaManager::attach(MediaAccessId accessId)
{
- MutexLock glock(g_Mutex);
-
ManagedMedia &ref( m_impl->findMM(accessId));
DBG << "attach(id=" << accessId << ")" << std::endl;
void
MediaManager::release(MediaAccessId accessId, const std::string & ejectDev)
{
- MutexLock glock(g_Mutex);
-
ManagedMedia &ref( m_impl->findMM(accessId));
DBG << "release(id=" << accessId;
void
MediaManager::releaseAll()
{
- MutexLock glock(g_Mutex);
-
MIL << "Releasing all attached media" << std::endl;
ManagedMediaMap::iterator m(m_impl->mediaMap.begin());
void
MediaManager::disconnect(MediaAccessId accessId)
{
- MutexLock glock(g_Mutex);
-
ManagedMedia &ref( m_impl->findMM(accessId));
ref.handler->disconnect();
bool
MediaManager::isAttached(MediaAccessId accessId) const
{
- MutexLock glock(g_Mutex);
-
ManagedMedia &ref( m_impl->findMM(accessId));
return ref.handler->isAttached();
// ---------------------------------------------------------------
bool MediaManager::isSharedMedia(MediaAccessId accessId) const
{
- MutexLock glock(g_Mutex);
-
ManagedMedia &ref( m_impl->findMM(accessId));
return ref.handler->isSharedMedia();
bool
MediaManager::isDesiredMedia(MediaAccessId accessId) const
{
- MutexLock glock(g_Mutex);
-
ManagedMedia &ref( m_impl->findMM(accessId));
if( !ref.handler->isAttached())
MediaManager::isDesiredMedia(MediaAccessId accessId,
const MediaVerifierRef &verifier) const
{
- MutexLock glock(g_Mutex);
-
MediaVerifierRef v(verifier);
if( !v)
ZYPP_THROW(MediaException("Invalid verifier reference"));
Pathname
MediaManager::localRoot(MediaAccessId accessId) const
{
- MutexLock glock(g_Mutex);
-
ManagedMedia &ref( m_impl->findMM(accessId));
Pathname path;
MediaManager::localPath(MediaAccessId accessId,
const Pathname & pathname) const
{
- MutexLock glock(g_Mutex);
-
ManagedMedia &ref( m_impl->findMM(accessId));
Pathname path;
return path;
}
- // ---------------------------------------------------------------
void
MediaManager::provideFile(MediaAccessId accessId,
- const Pathname &filename ) const
+ const Pathname &filename,
+ const ByteCount &expectedFileSize ) const
{
- MutexLock glock(g_Mutex);
-
ManagedMedia &ref( m_impl->findMM(accessId));
ref.checkDesired(accessId);
- ref.handler->provideFile(filename);
+ ref.handler->provideFile(filename, expectedFileSize);
}
// ---------------------------------------------------------------
void
- MediaManager::setDeltafile(MediaAccessId accessId,
+ MediaManager::provideFile(MediaAccessId accessId,
const Pathname &filename ) const
{
- MutexLock glock(g_Mutex);
+ provideFile( accessId, filename, 0);
+ }
+ // ---------------------------------------------------------------
+ void
+ MediaManager::setDeltafile(MediaAccessId accessId,
+ const Pathname &filename ) const
+ {
ManagedMedia &ref( m_impl->findMM(accessId));
ref.checkDesired(accessId);
MediaManager::provideDir(MediaAccessId accessId,
const Pathname &dirname) const
{
- MutexLock glock(g_Mutex);
-
ManagedMedia &ref( m_impl->findMM(accessId));
ref.checkDesired(accessId);
MediaManager::provideDirTree(MediaAccessId accessId,
const Pathname &dirname) const
{
- MutexLock glock(g_Mutex);
-
ManagedMedia &ref( m_impl->findMM(accessId));
ref.checkDesired(accessId);
MediaManager::releaseFile(MediaAccessId accessId,
const Pathname &filename) const
{
- MutexLock glock(g_Mutex);
-
ManagedMedia &ref( m_impl->findMM(accessId));
ref.checkAttached(accessId);
MediaManager::releaseDir(MediaAccessId accessId,
const Pathname &dirname) const
{
- MutexLock glock(g_Mutex);
-
ManagedMedia &ref( m_impl->findMM(accessId));
ref.checkAttached(accessId);
MediaManager::releasePath(MediaAccessId accessId,
const Pathname &pathname) const
{
- MutexLock glock(g_Mutex);
-
ManagedMedia &ref( m_impl->findMM(accessId));
ref.checkAttached(accessId);
const Pathname &dirname,
bool dots) const
{
- MutexLock glock(g_Mutex);
-
ManagedMedia &ref( m_impl->findMM(accessId));
// FIXME: ref.checkDesired(accessId); ???
const Pathname &dirname,
bool dots) const
{
- MutexLock glock(g_Mutex);
-
ManagedMedia &ref( m_impl->findMM(accessId));
// FIXME: ref.checkDesired(accessId); ???
bool
MediaManager::doesFileExist(MediaAccessId accessId, const Pathname & filename ) const
{
- MutexLock glock(g_Mutex);
ManagedMedia &ref( m_impl->findMM(accessId));
// FIXME: ref.checkDesired(accessId); ???
std::vector<std::string> & devices,
unsigned int & index) const
{
- MutexLock glock(g_Mutex);
ManagedMedia &ref( m_impl->findMM(accessId));
return ref.handler->getDetectedDevices(devices, index);
}
time_t
MediaManager::getMountTableMTime()
{
- MutexLock glock(g_Mutex);
return MediaManager_Impl::getMountTableMTime();
}
MountEntries
MediaManager::getMountEntries()
{
- MutexLock glock(g_Mutex);
-
return MediaManager_Impl::getMountEntries();
}
if( path.empty() || path == "/" || !PathInfo(path).isDir())
return false;
- MutexLock glock(g_Mutex);
-
//
// check against our current attach points
//
AttachedMedia
MediaManager::getAttachedMedia(MediaAccessId &accessId) const
{
- MutexLock glock(g_Mutex);
-
ManagedMedia &ref( m_impl->findMM(accessId));
return ref.handler->attachedMedia();
AttachedMedia
MediaManager::findAttachedMedia(const MediaSourceRef &media) const
{
- MutexLock glock(g_Mutex);
-
if( !media || media->type.empty())
return AttachedMedia();
void
MediaManager::forceReleaseShared(const MediaSourceRef &media)
{
- MutexLock glock(g_Mutex);
-
if( !media || media->type.empty())
return;