libzypp  11.13.5
MediaProducts.h
Go to the documentation of this file.
1 /*---------------------------------------------------------------------\
2 | ____ _ __ __ ___ |
3 | |__ / \ / / . \ . \ |
4 | / / \ V /| _/ _/ |
5 | / /__ | | | | | | |
6 | /_____||_| |_| |_| |
7 | |
8 \---------------------------------------------------------------------*/
12 #ifndef ZYPP_MEDIAPRODUCTS_H_
13 #define ZYPP_MEDIAPRODUCTS_H_
14 
15 #include <iterator>
16 #include <iostream>
17 #include <fstream>
18 #include "zypp/ZConfig.h"
19 #include "zypp/base/Logger.h"
22 
23 #include "zypp/ProgressData.h"
24 
25 namespace zypp
26 {
31  {
32  Pathname _dir;
33  std::string _name;
34 
38  MediaProductEntry( const Pathname & dir_r = "/", const std::string & name_r = std::string() )
39  : _dir(dir_r), _name(name_r)
40  {
41  }
42 
43  bool operator<( const MediaProductEntry &rhs ) const
44  {
45  return ( _name < rhs._name );
46  }
47  };
48 
52  typedef std::set<MediaProductEntry> MediaProductSet;
53 
57  template <class _OutputIterator>
58  static void scanProductsFile( const Pathname & file_r, _OutputIterator result )
59  {
60  std::ifstream pfile( file_r.asString().c_str() );
61  while ( pfile.good() ) {
62 
63  std::string value = str::getline( pfile, str::TRIM );
64  if ( pfile.bad() ) {
65  ERR << "Error parsing " << file_r << std::endl;
66  ZYPP_THROW(Exception("Error parsing " + file_r.asString()));
67  }
68  if ( pfile.fail() ) {
69  break; // no data on last line
70  }
71  std::string tag = str::stripFirstWord( value, true );
72 
73  if ( tag.size() ) {
74  *result = MediaProductEntry( tag, value );
75  }
76  }
77  }
78 
87  template <class _OutputIterator>
88  void productsInMedia( const Url & url_r, _OutputIterator result )
89  {
90  media::MediaManager media_mgr;
91  // open the media
92  media::MediaId id = media_mgr.open(url_r);
93  media_mgr.attach(id);
94  Pathname products_file = Pathname("media.1/products");
95 
96  try {
97  media_mgr.provideFile (id, products_file);
98  products_file = media_mgr.localPath (id, products_file);
99  scanProductsFile (products_file, result);
100  }
101  catch ( const Exception & excpt ) {
102  ZYPP_CAUGHT(excpt);
103  MIL << "No products description found on the Url" << std::endl;
104  }
105  media_mgr.release(id, "");
106  }
107 
116  void productsInMedia( const Url & url_r, MediaProductSet &set )
117  {
118  productsInMedia(url_r, std::inserter(set, set.end()));
119  }
120 
121 } // ns zypp
122 
123 #endif
124 
125 // vim: set ts=2 sts=2 sw=2 et ai: