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());
152 MediaId nextId( m_impl->nextMediaId());
154 m_impl->mediaAccMap[nextId] = accRef;
156 accRef->open(url, preferred_attach_point);
161 // ---------------------------------------------------------------
163 MediaManager::close(MediaId mediaId)
165 MutexLock lock(g_Mutex);
167 if( !m_impl->hasMediaAcc( mediaId))
168 ZYPP_THROW(MediaException("Invalid media id"));
170 if( m_impl->hasVerifier( mediaId))
171 m_impl->mediaVfyMap.erase(mediaId);
173 m_impl->mediaAccMap[mediaId]->close();
174 m_impl->mediaAccMap.erase(mediaId);
177 // ---------------------------------------------------------------
179 MediaManager::isOpen(MediaId mediaId) const
181 MutexLock lock(g_Mutex);
183 return m_impl->hasMediaAcc( mediaId);
186 // ---------------------------------------------------------------
188 MediaManager::protocol(MediaId mediaId) const
190 MutexLock lock(g_Mutex);
192 if( m_impl->hasMediaAcc( mediaId))
193 return m_impl->mediaAccMap[mediaId]->protocol();
195 return std::string("unknown");
198 // ---------------------------------------------------------------
200 MediaManager::url(MediaId mediaId) const
202 MutexLock lock(g_Mutex);
204 if( m_impl->hasMediaAcc( mediaId))
205 return m_impl->mediaAccMap[mediaId]->url();
210 // ---------------------------------------------------------------
212 MediaManager::addVerifier(MediaId mediaId, const MediaVerifierRef &ref)
214 MutexLock lock(g_Mutex);
217 ZYPP_THROW(MediaException("Invalid (empty) verifier reference"));
219 if( !m_impl->hasMediaAcc( mediaId))
220 ZYPP_THROW(MediaException("Invalid media id"));
222 // FIXME: just replace?
223 if( m_impl->hasVerifier( mediaId))
224 ZYPP_THROW(MediaException("Remove verifier first"));
226 m_impl->mediaVfyMap[mediaId] = ref;
229 // ---------------------------------------------------------------
231 MediaManager::delVerifier(MediaId mediaId)
233 MutexLock lock(g_Mutex);
235 if( !m_impl->hasMediaAcc( mediaId))
236 ZYPP_THROW(MediaException("Invalid media id"));
238 if( m_impl->hasVerifier( mediaId))
239 m_impl->mediaVfyMap.erase(mediaId);
242 // ---------------------------------------------------------------
244 MediaManager::attach(MediaId mediaId, bool next)
246 MutexLock lock(g_Mutex);
248 if( !m_impl->hasMediaAcc( mediaId))
250 ZYPP_THROW(MediaNotOpenException(
251 "Invalid media id " + str::numstring(mediaId)
255 if( !m_impl->hasVerifier( mediaId))
256 ZYPP_THROW(MediaException("Add a verifier first"));
258 m_impl->mediaAccMap[mediaId]->attach(next);
261 // ---------------------------------------------------------------
263 MediaManager::release(MediaId mediaId, bool eject)
265 MutexLock lock(g_Mutex);
267 if( !m_impl->hasMediaAcc( mediaId))
269 ZYPP_THROW(MediaNotOpenException(
270 "Invalid media id " + str::numstring(mediaId)
274 m_impl->mediaAccMap[mediaId]->release(eject);
277 // ---------------------------------------------------------------
279 MediaManager::disconnect(MediaId mediaId)
281 MutexLock lock(g_Mutex);
283 if( !m_impl->hasMediaAcc( mediaId))
285 ZYPP_THROW(MediaNotOpenException(
286 "Invalid media id " + str::numstring(mediaId)
289 return m_impl->mediaAccMap[mediaId]->disconnect();
292 // ---------------------------------------------------------------
294 MediaManager::isAttached(MediaId mediaId) const
296 MutexLock lock(g_Mutex);
298 if( !m_impl->hasMediaAcc( mediaId))
300 // FIXME: throw or just return false?
301 ZYPP_THROW(MediaNotOpenException(
302 "Invalid media id " + str::numstring(mediaId)
305 return m_impl->mediaAccMap[mediaId]->isAttached();
308 // ---------------------------------------------------------------
310 MediaManager::isDesiredMedia(MediaId mediaId, MediaNr mediaNr) const
312 MutexLock lock(g_Mutex);
314 if( !isAttached(mediaId))
317 // FIXME: throw or just return false?
318 if( !m_impl->hasVerifier( mediaId))
319 ZYPP_THROW(MediaException("Add a verifier first"));
323 ok = m_impl->mediaVfyMap[mediaId]->isDesiredMedia(
324 m_impl->mediaAccMap[mediaId], mediaNr
327 catch( ... ) { ok = false; }
331 // ---------------------------------------------------------------
333 MediaManager::localRoot(MediaId mediaId) const
335 MutexLock lock(g_Mutex);
337 if( !m_impl->hasMediaAcc( mediaId))
339 ZYPP_THROW(MediaNotOpenException(
340 "Invalid media id " + str::numstring(mediaId)
344 path = m_impl->mediaAccMap[mediaId]->localRoot();
348 // ---------------------------------------------------------------
350 MediaManager::localPath(MediaId mediaId,
351 const Pathname & pathname) const
353 MutexLock lock(g_Mutex);
355 if( !m_impl->hasMediaAcc( mediaId))
357 ZYPP_THROW(MediaNotOpenException(
358 "Invalid media id " + str::numstring(mediaId)
362 path = m_impl->mediaAccMap[mediaId]->localPath(pathname);
366 // ---------------------------------------------------------------
368 MediaManager::provideFile(MediaId mediaId, MediaNr mediaNr,
369 const Pathname &filename,
370 bool cached, bool checkonly) const
372 MutexLock lock(g_Mutex);
374 if( !isDesiredMedia(mediaId, mediaNr))
376 ZYPP_THROW(MediaNotDesiredException(
377 m_impl->mediaAccMap[mediaId]->url(), mediaNr
381 m_impl->mediaAccMap[mediaId]->provideFile(filename, cached, checkonly);
384 // ---------------------------------------------------------------
386 MediaManager::provideDir(MediaId mediaId,
388 const Pathname & dirname ) const
390 MutexLock lock(g_Mutex);
392 if( !isDesiredMedia(mediaId, mediaNr))
394 ZYPP_THROW(MediaNotDesiredException(
395 m_impl->mediaAccMap[mediaId]->url(), mediaNr
399 m_impl->mediaAccMap[mediaId]->provideDir(dirname);
402 // ---------------------------------------------------------------
404 MediaManager::provideDirTree(MediaId mediaId,
406 const Pathname & dirname ) const
408 MutexLock lock(g_Mutex);
410 if( !isDesiredMedia(mediaId, mediaNr))
412 ZYPP_THROW(MediaNotDesiredException(
413 m_impl->mediaAccMap[mediaId]->url(), mediaNr
417 m_impl->mediaAccMap[mediaId]->provideDirTree(dirname);
420 // ---------------------------------------------------------------
422 MediaManager::releaseFile(MediaId mediaId,
423 const Pathname & filename) const
425 MutexLock lock(g_Mutex);
427 if( !m_impl->hasMediaAcc( mediaId))
429 ZYPP_THROW(MediaNotOpenException(
430 "Invalid media id " + str::numstring(mediaId)
434 m_impl->mediaAccMap[mediaId]->releaseFile(filename);
437 // ---------------------------------------------------------------
439 MediaManager::releaseDir(MediaId mediaId,
440 const Pathname & dirname) const
442 MutexLock lock(g_Mutex);
444 if( !m_impl->hasMediaAcc( mediaId))
446 ZYPP_THROW(MediaNotOpenException(
447 "Invalid media id " + str::numstring(mediaId)
451 m_impl->mediaAccMap[mediaId]->releaseDir(dirname);
455 // ---------------------------------------------------------------
457 MediaManager::releasePath(MediaId mediaId,
458 const Pathname & pathname) const
460 MutexLock lock(g_Mutex);
462 if( !m_impl->hasMediaAcc( mediaId))
464 ZYPP_THROW(MediaNotOpenException(
465 "Invalid media id " + str::numstring(mediaId)
469 m_impl->mediaAccMap[mediaId]->releasePath(pathname);
472 // ---------------------------------------------------------------
474 MediaManager::dirInfo(MediaId mediaId,
475 std::list<std::string> & retlist,
476 const Pathname & dirname, bool dots) const
478 MutexLock lock(g_Mutex);
480 if( !m_impl->hasMediaAcc( mediaId))
482 ZYPP_THROW(MediaNotOpenException(
483 "Invalid media id " + str::numstring(mediaId)
487 m_impl->mediaAccMap[mediaId]->dirInfo(retlist, dirname, dots);
490 // ---------------------------------------------------------------
492 MediaManager::dirInfo(MediaId mediaId,
493 filesystem::DirContent & retlist,
494 const Pathname & dirname, bool dots) const
496 MutexLock lock(g_Mutex);
498 if( !m_impl->hasMediaAcc( mediaId))
500 ZYPP_THROW(MediaNotOpenException(
501 "Invalid media id " + str::numstring(mediaId)
505 m_impl->mediaAccMap[mediaId]->dirInfo(retlist, dirname, dots);
508 //////////////////////////////////////////////////////////////////
510 ////////////////////////////////////////////////////////////////////
512 ////////////////////////////////////////////////////////////////////
514 //////////////////////////////////////////////////////////////////////
516 ** vim: set ts=2 sts=2 sw=2 ai et: