~thopiekar/zypper/libzypp-manual-import

« back to all changes in this revision

Viewing changes to zypp/MediaProducts.h

  • Committer: Thomas-Karl Pietrowski
  • Date: 2014-01-29 22:44:28 UTC
  • Revision ID: thopiekar@googlemail.com-20140129224428-gpcqnsdakby362n8
firstĀ import

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
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: