libzypp  16.22.5
BinHeader.cc
Go to the documentation of this file.
1 /*---------------------------------------------------------------------\
2 | ____ _ __ __ ___ |
3 | |__ / \ / / . \ . \ |
4 | / / \ V /| _/ _/ |
5 | / /__ | | | | | | |
6 | /_____||_| |_| |_| |
7 | |
8 \---------------------------------------------------------------------*/
12 #include "librpm.h"
13 extern "C"
14 {
15 #ifdef _RPM_5
16 #undef RPM_NULL_TYPE
17 #define RPM_NULL_TYPE rpmTagType(0)
18 typedef rpmuint32_t rpm_count_t;
19 #endif
20 }
21 
22 #include <iostream>
23 
24 #include "zypp/base/Logger.h"
25 #include "zypp/base/NonCopyable.h"
26 
28 
29 using namespace std;
30 
31 #undef Y2LOG
32 #define Y2LOG "BinHeader"
33 
34 namespace zypp
35 {
36 namespace target
37 {
38 namespace rpm
39 {
40 
47  {
48  public:
49  HeaderEntryGetter( const Header & h_r, rpmTag & tag_r );
51  rpmTagType type();
52  rpm_count_t cnt();
53  void * val();
54  private:
55 #ifndef _RPM_5
56  ::rpmtd _rpmtd;
57 #else
58  rpmTagType _type;
59  rpm_count_t _cnt;
60  void * _val;
61 #endif //_RPM_5
62  };
63 
64 #ifndef _RPM_5
65  inline HeaderEntryGetter::HeaderEntryGetter( const Header & h_r, rpmTag & tag_r )
66  : _rpmtd( ::rpmtdNew() )
67  { ::headerGet( h_r, tag_r, _rpmtd, HEADERGET_DEFAULT ); }
69  { ::rpmtdFreeData( _rpmtd ); ::rpmtdFree( _rpmtd ); }
70  inline rpmTagType HeaderEntryGetter::type() { return rpmtdType( _rpmtd ); }
71  inline rpm_count_t HeaderEntryGetter::cnt() { return _rpmtd->count; }
72  inline void * HeaderEntryGetter::val() { return _rpmtd->data; }
73 #else
74  inline HeaderEntryGetter::HeaderEntryGetter( const Header & h_r, rpmTag & tag_r )
75  : _type( RPM_NULL_TYPE )
76  , _cnt( 0 )
77  , _val( 0 )
78  { ::headerGetEntry( h_r, tag_r, hTYP_t(&_type), &_val, &_cnt ); }
80  { if ( _val && _type == RPM_STRING_ARRAY_TYPE ) free( _val ); }
81  inline rpmTagType HeaderEntryGetter::type() { return _type; }
82  inline rpm_count_t HeaderEntryGetter::cnt() { return _cnt; }
83  inline void * HeaderEntryGetter::val() { return _val; }
84 #endif //_RPM_5
85 
87 //
88 // CLASS NAME : BinHeader::intList
89 //
91 
92 unsigned BinHeader::intList::set( void * val_r, unsigned cnt_r, rpmTagType type_r )
93 {
94  _type = type_r; // remember the type!
95  if ( val_r )
96  switch ( _type )
97  {
98 #if RPM_CHAR_TYPE != RPM_INT8_TYPE
99  case RPM_CHAR_TYPE:
100  std::vector<long>( (char*)val_r, ((char*)val_r)+cnt_r ).swap( _data );
101  break;
102 #endif
103  case RPM_INT8_TYPE:
104  std::vector<long>( (int8_t*)val_r, ((int8_t*)val_r)+cnt_r ).swap( _data );
105  break;
106  case RPM_INT16_TYPE:
107  std::vector<long>( (int16_t*)val_r, ((int16_t*)val_r)+cnt_r ).swap( _data );
108  break;
109  case RPM_INT32_TYPE:
110  std::vector<long>( (int32_t*)val_r, ((int32_t*)val_r)+cnt_r ).swap( _data );
111  break;
112 #ifndef _RPM_5
113  case RPM_INT64_TYPE:
114  std::vector<long>( (int64_t*)val_r, ((int64_t*)val_r)+cnt_r ).swap( _data );
115  break;
116 #endif
117  default:
118  std::vector<long>( cnt_r, 0L ).swap( _data );
119  break;
120  }
121  else
122  _data.clear();
123  return _data.size();
124 }
125 
127 //
128 // CLASS NAME : BinHeader::stringList
129 //
131 
132 unsigned BinHeader::stringList::set( char ** val_r, unsigned cnt_r )
133 {
134  if ( val_r )
135  std::vector<std::string>( val_r, val_r+cnt_r ).swap( _data );
136  else
137  _data.clear();
138  return _data.size();
139 }
140 
142 //
143 // CLASS NAME : BinHeader
144 //
146 
148 //
149 //
150 // METHOD NAME : BinHeader::BinHeader
151 // METHOD TYPE : Constructor
152 //
153 BinHeader::BinHeader( Header h_r )
154  : _h( h_r )
155 {
156  if ( _h )
157  {
158  headerLink( _h );
159  }
160 }
161 
163 //
164 //
165 // METHOD NAME : BinHeader::BinHeader
166 // METHOD TYPE : Constructor
167 //
169 {
170  INT << "INJECT from " << rhs;
171  if ( ! (rhs && rhs->_h) )
172  {
173  _h = 0;
174  }
175  else
176  {
177  _h = rhs->_h; // ::headerLink already done in rhs
178  rhs->_h = 0;
179  }
180  INT << ": " << *this << " (" << rhs << ")" << endl;
181 }
182 
184 //
185 //
186 // METHOD NAME : BinHeader::~BinHeader
187 // METHOD TYPE : Destructor
188 //
190 {
191  if ( _h )
192  {
193  headerFree( _h );
194  }
195 }
196 
198 //
199 //
200 // METHOD NAME : BinHeader::assertHeader
201 // METHOD TYPE : void
202 //
204 {
205  if ( !_h )
206  {
207  _h = ::headerNew();
208  if ( !_h )
209  {
210  INT << "OOPS: NULL HEADER created!" << endl;
211  return false;
212  }
213  }
214  return true;
215 }
216 
218 //
219 //
220 // METHOD NAME : BinHeader::has_tag
221 // METHOD TYPE : bool
222 //
223 // DESCRIPTION :
224 //
225 bool BinHeader::has_tag( tag tag_r ) const
226 {
227  return( !empty() && ::headerIsEntry( _h, tag_r ) );
228 }
229 
231 //
232 //
233 // METHOD NAME : BinHeader::int_list
234 // METHOD TYPE : unsigned
235 //
236 // DESCRIPTION :
237 //
238 unsigned BinHeader::int_list( tag tag_r, intList & lst_r ) const
239 {
240  if ( !empty() )
241  {
242  HeaderEntryGetter headerget( _h, tag_r );
243 
244  if ( headerget.val() )
245  {
246  switch ( headerget.type() )
247  {
248  case RPM_NULL_TYPE:
249  return lst_r.set( 0, 0, headerget.type() );
250 #if RPM_CHAR_TYPE != RPM_INT8_TYPE
251  case RPM_CHAR_TYPE:
252 #endif
253  case RPM_INT8_TYPE:
254  case RPM_INT16_TYPE:
255  case RPM_INT32_TYPE:
256 #ifndef _RPM_5
257  case RPM_INT64_TYPE:
258 #endif
259  return lst_r.set( headerget.val(), headerget.cnt(), headerget.type() );
260 
261  default:
262  INT << "RPM_TAG MISSMATCH: RPM_INTxx_TYPE " << tag_r << " got type " << headerget.type() << endl;
263  }
264  }
265  }
266  return lst_r.set( 0, 0, RPM_NULL_TYPE );
267 }
268 
270 //
271 //
272 // METHOD NAME : BinHeader::string_list
273 // METHOD TYPE : unsigned
274 //
275 // DESCRIPTION :
276 //
277 unsigned BinHeader::string_list( tag tag_r, stringList & lst_r ) const
278 {
279  if ( !empty() )
280  {
281  HeaderEntryGetter headerget( _h, tag_r );
282 
283  if ( headerget.val() )
284  {
285  switch ( headerget.type() )
286  {
287  case RPM_NULL_TYPE:
288  return lst_r.set( 0, 0 );
289  case RPM_STRING_ARRAY_TYPE:
290  return lst_r.set( (char**)headerget.val(), headerget.cnt() );
291 
292  default:
293  INT << "RPM_TAG MISSMATCH: RPM_STRING_ARRAY_TYPE " << tag_r << " got type " << headerget.type() << endl;
294  }
295  }
296  }
297  return lst_r.set( 0, 0 );
298 }
299 
301 //
302 //
303 // METHOD NAME : BinHeader::int_val
304 // METHOD TYPE : int
305 //
306 // DESCRIPTION :
307 //
308 int BinHeader::int_val( tag tag_r ) const
309 {
310  if ( !empty() )
311  {
312  HeaderEntryGetter headerget( _h, tag_r );
313 
314  if ( headerget.val() )
315  {
316  switch ( headerget.type() )
317  {
318  case RPM_NULL_TYPE:
319  return 0;
320 #if RPM_CHAR_TYPE != RPM_INT8_TYPE
321  case RPM_CHAR_TYPE:
322  return *((char*)headerget.val());
323 #endif
324  case RPM_INT8_TYPE:
325  return *((int8_t*)headerget.val());
326  case RPM_INT16_TYPE:
327  return *((int16_t*)headerget.val());
328  case RPM_INT32_TYPE:
329  return *((int32_t*)headerget.val());
330 #ifndef _RPM_5
331  case RPM_INT64_TYPE:
332  return *((int64_t*)headerget.val());
333 #endif
334 
335  default:
336  INT << "RPM_TAG MISSMATCH: RPM_INTxx_TYPE " << tag_r << " got type " << headerget.type() << endl;
337  }
338  }
339  }
340  return 0;
341 }
342 
344 //
345 //
346 // METHOD NAME : BinHeader::string_val
347 // METHOD TYPE : std::string
348 //
349 // DESCRIPTION :
350 //
351 std::string BinHeader::string_val( tag tag_r ) const
352 {
353  if ( !empty() )
354  {
355  HeaderEntryGetter headerget( _h, tag_r );
356 
357  if ( headerget.val() )
358  {
359  switch ( headerget.type() )
360  {
361  case RPM_NULL_TYPE:
362  return "";
363  case RPM_STRING_TYPE:
364  return (char*)headerget.val();
365 
366  default:
367  INT << "RPM_TAG MISSMATCH: RPM_STRING_TYPE " << tag_r << " got type " << headerget.type() << endl;
368  }
369  }
370  }
371  return "";
372 }
373 
375 //
376 //
377 // METHOD NAME : BinHeader::stringList_val
378 // METHOD TYPE : std::list<std::string>
379 //
380 // DESCRIPTION :
381 //
382 std::list<std::string> BinHeader::stringList_val( tag tag_r ) const
383 {
384  std::list<std::string> ret;
385 
386  if ( !empty() )
387  {
388  stringList lines;
389  unsigned count = string_list( tag_r, lines );
390  for ( unsigned i = 0; i < count; ++i )
391  {
392  ret.push_back( lines[i] );
393  }
394  }
395  return ret;
396 }
397 
399 //
400 //
401 // METHOD NAME : BinHeader::dumpOn
402 // METHOD TYPE : ostream &
403 //
404 // DESCRIPTION :
405 //
406 ostream & BinHeader::dumpOn( ostream & str ) const
407 {
409  return str << '{' << (void*)_h << '}';
410 }
411 
412 } // namespace rpm
413 } // namespace target
414 } // namespace zypp
bool has_tag(tag tag_r) const
Definition: BinHeader.cc:225
virtual std::ostream & dumpOn(std::ostream &str) const
Overload to realize std::ostream & operator<<.
Definition: BinHeader.cc:406
#define INT
Definition: Logger.h:68
std::ostream & dumpOn(std::ostream &str, const zypp::shared_ptr< void > &obj)
Definition: PtrTypes.h:151
intrusive_ptr< BinHeader > Ptr
Definition: BinHeader.h:47
unsigned set(char **val_r, unsigned cnt_r)
Definition: BinHeader.cc:132
int int_val(tag tag_r) const
Definition: BinHeader.cc:308
boost::noncopyable NonCopyable
Ensure derived classes cannot be copied.
Definition: NonCopyable.h:26
std::list< PublicKeyData > _data
Definition: KeyRing.cc:122
std::list< std::string > stringList_val(tag tag_r) const
Definition: BinHeader.cc:382
HeaderEntryGetter(const Header &h_r, rpmTag &tag_r)
Definition: BinHeader.cc:65
unsigned string_list(tag tag_r, stringList &lst_r) const
Definition: BinHeader.cc:277
std::string string_val(tag tag_r) const
Definition: BinHeader.cc:351
unsigned set(void *val_r, unsigned cnt_r, rpmTagType type_r)
Definition: BinHeader.cc:92
Helper for header data retieval.
Definition: BinHeader.cc:46
unsigned int_list(tag tag_r, intList &lst_r) const
Definition: BinHeader.cc:238