1 /*---------------------------------------------------------------------\
3 | |__ / \ / / . \ . \ |
8 \---------------------------------------------------------------------*/
9 /** \file zypp/media/MediaManager.cc
12 #include <zypp/media/MediaException.h>
13 #include <zypp/media/MediaManager.h>
14 #include <zypp/media/Mount.h>
15 //#include <zypp/media/Hal.h>
16 #include <zypp/thread/Mutex.h>
17 #include <zypp/thread/MutexLock.h>
19 #include <zypp/base/String.h>
20 #include <zypp/base/Logger.h>
21 #include <zypp/Pathname.h>
22 #include <zypp/PathInfo.h>
29 //////////////////////////////////////////////////////////////////////
31 { ////////////////////////////////////////////////////////////////////
33 ////////////////////////////////////////////////////////////////////
35 { //////////////////////////////////////////////////////////////////
37 using zypp::thread::Mutex;
38 using zypp::thread::MutexLock;
40 //////////////////////////////////////////////////////////////////
41 namespace // anonymous
42 { ////////////////////////////////////////////////////////////////
45 // -------------------------------------------------------------
50 // -------------------------------------------------------------
60 ManagedMedia(const ManagedMedia &m)
63 , verifier(m.verifier)
66 ManagedMedia(const MediaAccessRef &h, const MediaVerifierRef &v)
75 if( !handler->isAttached())
78 ZYPP_THROW(MediaNotAttachedException(
92 desired = verifier->isDesiredMedia(handler);
94 catch(const zypp::Exception &e) {
101 ZYPP_THROW(MediaNotDesiredException(
106 DBG << "checkDesired(): desired (report)" << std::endl;
108 DBG << "checkDesired(): desired (cached)" << std::endl;
113 MediaAccessRef handler;
114 MediaVerifierRef verifier;
118 // -------------------------------------------------------------
119 typedef std::map<MediaAccessId, ManagedMedia> ManagedMediaMap;
122 ////////////////////////////////////////////////////////////////
124 //////////////////////////////////////////////////////////////////
127 //////////////////////////////////////////////////////////////////
128 class MediaManager::Impl
132 MountEntries mtab_table;
133 MediaAccessId last_accessid;
136 ManagedMediaMap mediaMap;
158 return ++last_accessid;
162 hasId(MediaAccessId accessId) const
164 return mediaMap.find(accessId) != mediaMap.end();
167 inline ManagedMedia &
168 findMM(MediaAccessId accessId)
170 ManagedMediaMap::iterator it( mediaMap.find(accessId));
171 if( it == mediaMap.end())
173 ZYPP_THROW(MediaNotOpenException(
174 "Invalid media access id " + str::numstring(accessId)
181 getMountTableMTime() const
183 return zypp::PathInfo("/etc/mtab").mtime();
189 time_t old = mtab_mtime;
190 mtab_mtime = getMountTableMTime();
191 if( old <= 0 || mtab_mtime != old)
193 mtab_table = Mount::getEntries("/etc/mtab");
201 //////////////////////////////////////////////////////////////////
203 zypp::RW_pointer<MediaManager::Impl> MediaManager::m_impl(NULL);
206 //////////////////////////////////////////////////////////////////
207 MediaManager::MediaManager()
209 MutexLock glock(g_Mutex);
212 m_impl.reset( new MediaManager::Impl());
216 // ---------------------------------------------------------------
217 MediaManager::~MediaManager()
221 // ---------------------------------------------------------------
223 MediaManager::open(const Url &url, const Pathname &preferred_attach_point)
225 MutexLock glock(g_Mutex);
227 // create new access handler for it
228 MediaAccessRef handler( new MediaAccess());
229 MediaVerifierRef verifier( new NoVerifier());
230 ManagedMedia tmp( handler, verifier);
232 tmp.handler->open(url, preferred_attach_point);
234 MediaAccessId nextId = m_impl->nextAccessId();
236 m_impl->mediaMap[nextId] = tmp;
238 DBG << "Opened new media access using id " << nextId
239 << " to " << url.asString() << std::endl;
243 // ---------------------------------------------------------------
245 MediaManager::close(MediaAccessId accessId)
247 MutexLock glock(g_Mutex);
249 ManagedMedia &ref( m_impl->findMM(accessId));
251 ref.handler->close();
252 m_impl->mediaMap.erase(accessId);
255 // ---------------------------------------------------------------
257 MediaManager::isOpen(MediaAccessId accessId) const
259 MutexLock glock(g_Mutex);
261 ManagedMediaMap::iterator it( m_impl->mediaMap.find(accessId));
262 return it != m_impl->mediaMap.end() &&
263 it->second.handler->isOpen();
266 // ---------------------------------------------------------------
268 MediaManager::protocol(MediaAccessId accessId) const
270 MutexLock glock(g_Mutex);
272 ManagedMedia &ref( m_impl->findMM(accessId));
274 return ref.handler->protocol();
277 // ---------------------------------------------------------------
279 MediaManager::url(MediaAccessId accessId) const
281 MutexLock glock(g_Mutex);
283 ManagedMedia &ref( m_impl->findMM(accessId));
285 return ref.handler->url();
288 // ---------------------------------------------------------------
290 MediaManager::addVerifier(MediaAccessId accessId,
291 const MediaVerifierRef &verifier)
293 MutexLock glock(g_Mutex);
296 ZYPP_THROW(MediaException("Invalid verifier reference"));
298 ManagedMedia &ref( m_impl->findMM(accessId));
300 MediaVerifierRef(verifier).swap(ref.verifier);
304 // ---------------------------------------------------------------
306 MediaManager::delVerifier(MediaAccessId accessId)
308 MutexLock glock(g_Mutex);
310 ManagedMedia &ref( m_impl->findMM(accessId));
312 MediaVerifierRef verifier( new NoVerifier());
313 ref.verifier.swap(verifier);
317 // ---------------------------------------------------------------
319 MediaManager::attach(MediaAccessId accessId, bool next)
321 MutexLock glock(g_Mutex);
323 ManagedMedia &ref( m_impl->findMM(accessId));
325 return ref.handler->attach(next);
328 // ---------------------------------------------------------------
330 MediaManager::release(MediaAccessId accessId, bool eject)
332 MutexLock glock(g_Mutex);
334 ManagedMedia &ref( m_impl->findMM(accessId));
336 ref.handler->release(eject);
340 // ---------------------------------------------------------------
342 MediaManager::disconnect(MediaAccessId accessId)
344 MutexLock glock(g_Mutex);
346 ManagedMedia &ref( m_impl->findMM(accessId));
348 ref.handler->disconnect();
351 // ---------------------------------------------------------------
353 MediaManager::isAttached(MediaAccessId accessId) const
355 MutexLock glock(g_Mutex);
357 ManagedMedia &ref( m_impl->findMM(accessId));
359 return ref.handler->isAttached();
362 // ---------------------------------------------------------------
364 MediaManager::isDesiredMedia(MediaAccessId accessId) const
366 MutexLock glock(g_Mutex);
368 ManagedMedia &ref( m_impl->findMM(accessId));
370 if( !ref.handler->isAttached())
377 ref.desired = ref.verifier->isDesiredMedia(ref.handler);
379 catch(const zypp::Exception &e) {
387 // ---------------------------------------------------------------
389 MediaManager::isDesiredMedia(MediaAccessId accessId,
390 const MediaVerifierRef &verifier) const
392 MutexLock glock(g_Mutex);
394 MediaVerifierRef v(verifier);
396 ZYPP_THROW(MediaException("Invalid verifier reference"));
398 ManagedMedia &ref( m_impl->findMM(accessId));
400 bool desired = false;
401 if( ref.handler->isAttached())
404 desired = v->isDesiredMedia(ref.handler);
406 catch(const zypp::Exception &e) {
414 // ---------------------------------------------------------------
416 MediaManager::localRoot(MediaAccessId accessId) const
418 MutexLock glock(g_Mutex);
420 ManagedMedia &ref( m_impl->findMM(accessId));
423 path = ref.handler->localRoot();
427 // ---------------------------------------------------------------
429 MediaManager::localPath(MediaAccessId accessId,
430 const Pathname & pathname) const
432 MutexLock glock(g_Mutex);
434 ManagedMedia &ref( m_impl->findMM(accessId));
437 path = ref.handler->localPath(pathname);
441 // ---------------------------------------------------------------
443 MediaManager::provideFile(MediaAccessId accessId,
444 const Pathname &filename,
446 bool checkonly) const
448 MutexLock glock(g_Mutex);
450 ManagedMedia &ref( m_impl->findMM(accessId));
454 ref.handler->provideFile(filename, cached, checkonly);
457 // ---------------------------------------------------------------
459 MediaManager::provideDir(MediaAccessId accessId,
460 const Pathname &dirname) const
462 MutexLock glock(g_Mutex);
464 ManagedMedia &ref( m_impl->findMM(accessId));
468 ref.handler->provideDir(dirname);
471 // ---------------------------------------------------------------
473 MediaManager::provideDirTree(MediaAccessId accessId,
474 const Pathname &dirname) const
476 MutexLock glock(g_Mutex);
478 ManagedMedia &ref( m_impl->findMM(accessId));
482 ref.handler->provideDirTree(dirname);
485 // ---------------------------------------------------------------
487 MediaManager::releaseFile(MediaAccessId accessId,
488 const Pathname &filename) const
490 MutexLock glock(g_Mutex);
492 ManagedMedia &ref( m_impl->findMM(accessId));
496 ref.handler->releaseFile(filename);
499 // ---------------------------------------------------------------
501 MediaManager::releaseDir(MediaAccessId accessId,
502 const Pathname &dirname) const
504 MutexLock glock(g_Mutex);
506 ManagedMedia &ref( m_impl->findMM(accessId));
510 ref.handler->releaseDir(dirname);
514 // ---------------------------------------------------------------
516 MediaManager::releasePath(MediaAccessId accessId,
517 const Pathname &pathname) const
519 MutexLock glock(g_Mutex);
521 ManagedMedia &ref( m_impl->findMM(accessId));
525 ref.handler->releasePath(pathname);
528 // ---------------------------------------------------------------
530 MediaManager::dirInfo(MediaAccessId accessId,
531 std::list<std::string> &retlist,
532 const Pathname &dirname,
535 MutexLock glock(g_Mutex);
537 ManagedMedia &ref( m_impl->findMM(accessId));
539 // FIXME: ref.checkDesired(); ???
542 ref.handler->dirInfo(retlist, dirname, dots);
545 // ---------------------------------------------------------------
547 MediaManager::dirInfo(MediaAccessId accessId,
548 filesystem::DirContent &retlist,
549 const Pathname &dirname,
552 MutexLock glock(g_Mutex);
554 ManagedMedia &ref( m_impl->findMM(accessId));
556 // FIXME: ref.checkDesired(); ???
559 ref.handler->dirInfo(retlist, dirname, dots);
562 // ---------------------------------------------------------------
564 MediaManager::getMountTableMTime() const
566 MutexLock glock(g_Mutex);
568 return m_impl->getMountTableMTime();
571 // ---------------------------------------------------------------
573 MediaManager::getMountEntries() const
575 MutexLock glock(g_Mutex);
577 return m_impl->getMountEntries();
580 // ---------------------------------------------------------------
582 MediaManager::findAttachedMedia(const MediaSourceRef &media) const
584 MutexLock glock(g_Mutex);
586 if( !media || media->type.empty())
587 return AttachedMedia();
589 ManagedMediaMap::const_iterator m(m_impl->mediaMap.begin());
590 for( ; m != m_impl->mediaMap.end(); ++m)
592 if( !m->second.handler->isAttached())
595 AttachedMedia ret = m->second.handler->attachedMedia();
596 if( ret.mediaSource && ret.mediaSource->equals( *media))
599 return AttachedMedia();
602 // ---------------------------------------------------------------
604 MediaManager::forceMediaRelease(const MediaSourceRef &media)
606 MutexLock glock(g_Mutex);
608 if( !media || media->type.empty())
611 ManagedMediaMap::iterator m(m_impl->mediaMap.begin());
612 for( ; m != m_impl->mediaMap.end(); ++m)
614 if( !m->second.handler->isAttached())
617 AttachedMedia ret = m->second.handler->attachedMedia();
618 if( ret.mediaSource && ret.mediaSource->equals( *media))
620 m->second.handler->release(false);
621 m->second.desired = false;
626 //////////////////////////////////////////////////////////////////
628 ////////////////////////////////////////////////////////////////////
630 ////////////////////////////////////////////////////////////////////
632 //////////////////////////////////////////////////////////////////////
634 ** vim: set ts=2 sts=2 sw=2 ai et: