Imported Upstream version 14.45.0
[platform/upstream/libzypp.git] / zypp / MediaProducts.h
1 /*---------------------------------------------------------------------\
2 |                          ____ _   __ __ ___                          |
3 |                         |__  / \ / / . \ . \                         |
4 |                           / / \ V /|  _/  _/                         |
5 |                          / /__ | | | | | |                           |
6 |                         /_____||_| |_| |_|                           |
7 |                                                                      |
8 \---------------------------------------------------------------------*/
9 /** \file zypp/MediaProducts.h
10  * Functions to find out products in media
11  */
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"
20 #include "zypp/media/MediaManager.h"
21 #include "zypp/base/UserRequestException.h"
22
23 #include "zypp/ProgressData.h"
24
25 namespace zypp
26 {
27   /**
28    * \short Represents an available product in media
29    */
30   struct MediaProductEntry
31   {
32     Pathname    _dir;
33     std::string _name;
34
35     /**
36      * \short Ctor
37      */
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
49   /**
50    * A set of available products in media
51    */
52   typedef std::set<MediaProductEntry> MediaProductSet;
53
54   /**
55    * FIXME: add a comment here...
56    */
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
79   /**
80    * \short Available products in a url location
81    *
82    * \param url_r url to inspect
83    * \param result output iterator where \ref MediaProductEntry
84    * items will be inserted.
85    * \throws MediaException If accessng the media fails
86    */
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
108  /**
109    * \short Available products in a url location
110    *
111    * \param url_r url to inspect
112    * \param set ef MediaProductEntry set where
113    * items will be inserted.
114    * \throws MediaException If accessng the media fails
115    */
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: