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 // -------------------------------------------------------------
49 typedef std::map<MediaId, MediaVerifierRef> MediaVfyMap;
50 typedef std::map<MediaId, MediaAccessRef> MediaAccMap;
53 ////////////////////////////////////////////////////////////////
55 //////////////////////////////////////////////////////////////////
58 // ---------------------------------------------------------------
59 class MediaManager::Impl
64 MountEntries mtab_table;
69 MediaVfyMap mediaVfyMap;
70 MediaAccMap mediaAccMap;
83 return last_mediaid++;
86 bool hasMediaAcc(MediaId mediaId) const
88 return mediaAccMap.find(mediaId) != mediaAccMap.end();
91 bool hasVerifier(MediaId mediaId) const
93 return mediaVfyMap.find(mediaId) != mediaVfyMap.end();
100 if( mtab_mtime == 0 ||
101 mtab_mtime != zypp::PathInfo("/etc/mtab").mtime())
103 mtab_table = Mount::getEntries("/etc/mtab");
111 // ---------------------------------------------------------------
113 zypp::RW_pointer<MediaManager::Impl> MediaManager::m_impl(NULL);
116 // ---------------------------------------------------------------
117 MediaManager::MediaManager()
119 MutexLock lock(g_Mutex);
122 m_impl.reset( new MediaManager::Impl());
126 // ---------------------------------------------------------------
127 MediaManager::~MediaManager()
131 // ---------------------------------------------------------------
133 MediaManager::open(const Url &url, const Pathname &preferred_attach_point)
135 MutexLock lock(g_Mutex);
137 // check if we already have this url
138 MediaAccMap::const_iterator a(m_impl->mediaAccMap.begin());
139 for( ; a != m_impl->mediaAccMap.end(); ++a)
141 // FIXME: not sufficient. each handler should provide
142 // method to compare its type of media url
143 // and MediaAccess to choose right handler...
144 if( a->second->url().asString() == url.asString())
150 // create new access handler for it
151 MediaAccessRef accRef( new MediaAccess());
153 accRef->open(url, preferred_attach_point);
155 MediaId nextId = m_impl->nextMediaId();
157 m_impl->mediaAccMap[nextId] = accRef;
162 // ---------------------------------------------------------------
164 MediaManager::close(MediaId mediaId)
166 MutexLock lock(g_Mutex);
168 if( !m_impl->hasMediaAcc( mediaId))
169 ZYPP_THROW(MediaException("Invalid media id"));
171 if( m_impl->hasVerifier( mediaId))
172 m_impl->mediaVfyMap.erase(mediaId);
174 m_impl->mediaAccMap[mediaId]->close();
175 m_impl->mediaAccMap.erase(mediaId);
178 // ---------------------------------------------------------------
180 MediaManager::isOpen(MediaId mediaId) const
182 MutexLock lock(g_Mutex);
184 return m_impl->hasMediaAcc( mediaId);
187 // ---------------------------------------------------------------
189 MediaManager::protocol(MediaId mediaId) const
191 MutexLock lock(g_Mutex);
193 if( m_impl->hasMediaAcc( mediaId))
194 return m_impl->mediaAccMap[mediaId]->protocol();
196 return std::string("unknown");
199 // ---------------------------------------------------------------
201 MediaManager::url(MediaId mediaId) const
203 MutexLock lock(g_Mutex);
205 if( m_impl->hasMediaAcc( mediaId))
206 return m_impl->mediaAccMap[mediaId]->url();
211 // ---------------------------------------------------------------
213 MediaManager::addVerifier(MediaId mediaId, const MediaVerifierRef &ref)
215 MutexLock lock(g_Mutex);
218 ZYPP_THROW(MediaException("Invalid (empty) verifier reference"));
220 if( !m_impl->hasMediaAcc( mediaId))
221 ZYPP_THROW(MediaException("Invalid media id"));
223 // FIXME: just replace?
224 if( m_impl->hasVerifier( mediaId))
225 ZYPP_THROW(MediaException("Remove verifier first"));
227 m_impl->mediaVfyMap[mediaId] = ref;
230 // ---------------------------------------------------------------
232 MediaManager::delVerifier(MediaId mediaId)
234 MutexLock lock(g_Mutex);
236 if( !m_impl->hasMediaAcc( mediaId))
237 ZYPP_THROW(MediaException("Invalid media id"));
239 if( m_impl->hasVerifier( mediaId))
240 m_impl->mediaVfyMap.erase(mediaId);
243 // ---------------------------------------------------------------
245 MediaManager::attach(MediaId mediaId, bool next)
247 MutexLock lock(g_Mutex);
249 if( !m_impl->hasMediaAcc( mediaId))
251 ZYPP_THROW(MediaNotOpenException(
252 "Invalid media id " + str::numstring(mediaId)
256 if( !m_impl->hasVerifier( mediaId))
257 ZYPP_THROW(MediaException("Add a verifier first"));
259 m_impl->mediaAccMap[mediaId]->attach(next);
262 // ---------------------------------------------------------------
264 MediaManager::release(MediaId mediaId, bool eject)
266 MutexLock lock(g_Mutex);
268 if( !m_impl->hasMediaAcc( mediaId))
270 ZYPP_THROW(MediaNotOpenException(
271 "Invalid media id " + str::numstring(mediaId)
275 m_impl->mediaAccMap[mediaId]->release(eject);
278 // ---------------------------------------------------------------
280 MediaManager::disconnect(MediaId mediaId)
282 MutexLock lock(g_Mutex);
284 if( !m_impl->hasMediaAcc( mediaId))
286 ZYPP_THROW(MediaNotOpenException(
287 "Invalid media id " + str::numstring(mediaId)
290 return m_impl->mediaAccMap[mediaId]->disconnect();
293 // ---------------------------------------------------------------
295 MediaManager::isAttached(MediaId mediaId) const
297 MutexLock lock(g_Mutex);
299 if( !m_impl->hasMediaAcc( mediaId))
301 // FIXME: throw or just return false?
302 ZYPP_THROW(MediaNotOpenException(
303 "Invalid media id " + str::numstring(mediaId)
306 return m_impl->mediaAccMap[mediaId]->isAttached();
309 // ---------------------------------------------------------------
311 MediaManager::isDesiredMedia(MediaId mediaId, MediaNr mediaNr) const
313 MutexLock lock(g_Mutex);
315 if( !isAttached(mediaId))
318 // FIXME: throw or just return false?
319 if( !m_impl->hasVerifier( mediaId))
320 ZYPP_THROW(MediaException("Add a verifier first"));
324 ok = m_impl->mediaVfyMap[mediaId]->isDesiredMedia(
325 m_impl->mediaAccMap[mediaId], mediaNr
328 catch( ... ) { ok = false; }
332 // ---------------------------------------------------------------
334 MediaManager::localRoot(MediaId mediaId) const
336 MutexLock lock(g_Mutex);
338 if( !m_impl->hasMediaAcc( mediaId))
340 ZYPP_THROW(MediaNotOpenException(
341 "Invalid media id " + str::numstring(mediaId)
345 path = m_impl->mediaAccMap[mediaId]->localRoot();
349 // ---------------------------------------------------------------
351 MediaManager::localPath(MediaId mediaId,
352 const Pathname & pathname) const
354 MutexLock lock(g_Mutex);
356 if( !m_impl->hasMediaAcc( mediaId))
358 ZYPP_THROW(MediaNotOpenException(
359 "Invalid media id " + str::numstring(mediaId)
363 path = m_impl->mediaAccMap[mediaId]->localPath(pathname);
367 // ---------------------------------------------------------------
369 MediaManager::provideFile(MediaId mediaId, MediaNr mediaNr,
370 const Pathname &filename,
371 bool cached, bool checkonly) const
373 MutexLock lock(g_Mutex);
375 if( !isDesiredMedia(mediaId, mediaNr))
377 ZYPP_THROW(MediaNotDesiredException(
378 m_impl->mediaAccMap[mediaId]->url(), mediaNr
382 m_impl->mediaAccMap[mediaId]->provideFile(filename, cached, checkonly);
385 // ---------------------------------------------------------------
387 MediaManager::provideDir(MediaId mediaId,
389 const Pathname & dirname ) const
391 MutexLock lock(g_Mutex);
393 if( !isDesiredMedia(mediaId, mediaNr))
395 ZYPP_THROW(MediaNotDesiredException(
396 m_impl->mediaAccMap[mediaId]->url(), mediaNr
400 m_impl->mediaAccMap[mediaId]->provideDir(dirname);
403 // ---------------------------------------------------------------
405 MediaManager::provideDirTree(MediaId mediaId,
407 const Pathname & dirname ) const
409 MutexLock lock(g_Mutex);
411 if( !isDesiredMedia(mediaId, mediaNr))
413 ZYPP_THROW(MediaNotDesiredException(
414 m_impl->mediaAccMap[mediaId]->url(), mediaNr
418 m_impl->mediaAccMap[mediaId]->provideDirTree(dirname);
421 // ---------------------------------------------------------------
423 MediaManager::releaseFile(MediaId mediaId,
424 const Pathname & filename) const
426 MutexLock lock(g_Mutex);
428 if( !m_impl->hasMediaAcc( mediaId))
430 ZYPP_THROW(MediaNotOpenException(
431 "Invalid media id " + str::numstring(mediaId)
435 m_impl->mediaAccMap[mediaId]->releaseFile(filename);
438 // ---------------------------------------------------------------
440 MediaManager::releaseDir(MediaId mediaId,
441 const Pathname & dirname) const
443 MutexLock lock(g_Mutex);
445 if( !m_impl->hasMediaAcc( mediaId))
447 ZYPP_THROW(MediaNotOpenException(
448 "Invalid media id " + str::numstring(mediaId)
452 m_impl->mediaAccMap[mediaId]->releaseDir(dirname);
456 // ---------------------------------------------------------------
458 MediaManager::releasePath(MediaId mediaId,
459 const Pathname & pathname) const
461 MutexLock lock(g_Mutex);
463 if( !m_impl->hasMediaAcc( mediaId))
465 ZYPP_THROW(MediaNotOpenException(
466 "Invalid media id " + str::numstring(mediaId)
470 m_impl->mediaAccMap[mediaId]->releasePath(pathname);
473 // ---------------------------------------------------------------
475 MediaManager::dirInfo(MediaId mediaId,
476 std::list<std::string> & retlist,
477 const Pathname & dirname, bool dots) const
479 MutexLock lock(g_Mutex);
481 if( !m_impl->hasMediaAcc( mediaId))
483 ZYPP_THROW(MediaNotOpenException(
484 "Invalid media id " + str::numstring(mediaId)
488 m_impl->mediaAccMap[mediaId]->dirInfo(retlist, dirname, dots);
491 // ---------------------------------------------------------------
493 MediaManager::dirInfo(MediaId mediaId,
494 filesystem::DirContent & retlist,
495 const Pathname & dirname, bool dots) const
497 MutexLock lock(g_Mutex);
499 if( !m_impl->hasMediaAcc( mediaId))
501 ZYPP_THROW(MediaNotOpenException(
502 "Invalid media id " + str::numstring(mediaId)
506 m_impl->mediaAccMap[mediaId]->dirInfo(retlist, dirname, dots);
509 //////////////////////////////////////////////////////////////////
511 ////////////////////////////////////////////////////////////////////
513 ////////////////////////////////////////////////////////////////////
515 //////////////////////////////////////////////////////////////////////
517 ** vim: set ts=2 sts=2 sw=2 ai et: