2 * Copyright (c) 2001, Robert Collins.
4 * This program is free software; you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License as published by
6 * the Free Software Foundation; either version 2 of the License, or
7 * (at your option) any later version.
9 * A copy of the GNU General Public License can be found at
12 * Written by Robert Collins <rbtcollins@hotmail.com>
16 /* this is the parent class for all package operations.
20 static const char *cvsid
=
24 #include "package_version.h"
25 #include "package_db.h"
26 #include "package_meta.h"
30 /* a default class to avoid special casing empty packageversions */
32 /* TODO place into the class header */
33 class _defaultversion
: public _packageversion
38 // never try to free me!
41 String
const Name(){return String();}
42 String
const Vendor_version() {return String();}
43 String
const Package_version() {return String();}
44 String
const Canonical_version() {return String();}
45 void setCanonicalVersion (String
const &) {}
46 package_status_t
Status (){return package_notinstalled
;}
47 package_type_t
Type () {return package_binary
;}
48 String
const getfirstfile () {return String();}
49 String
const getnextfile () {return String();}
50 String
const SDesc () {return String();}
51 void set_sdesc (String
const &) {}
52 String
const LDesc () {return String();}
53 void set_ldesc (String
const &) {}
56 static _defaultversion defaultversion
;
58 /* the wrapper class */
59 packageversion::packageversion() : data (&defaultversion
)
64 /* Create from an actual package */
65 packageversion::packageversion (_packageversion
*pkg
)
70 data
= &defaultversion
;
74 packageversion::packageversion (packageversion
const &existing
) :
80 packageversion::~packageversion()
82 if (--data
->references
== 0)
87 packageversion::operator= (packageversion
const &rhs
)
89 ++rhs
.data
->references
;
90 if (--data
->references
== 0)
97 packageversion::operator ! () const
99 return !data
->Name().size();
102 packageversion::operator bool () const
104 return data
->Name().size();
108 packageversion::operator == (packageversion
const &rhs
) const
110 if (this == &rhs
|| data
== rhs
.data
)
113 return data
->Name () == rhs
.data
->Name() && data
->Canonical_version () == rhs
.data
->Canonical_version();
117 packageversion::operator != (packageversion
const &rhs
) const
119 return ! (*this == rhs
);
123 packageversion::operator < (packageversion
const &rhs
) const
125 int t
= data
->Name ().casecompare (rhs
.data
->Name());
130 else if (data
->Canonical_version().casecompare (rhs
.data
->Canonical_version()) < 0)
136 packageversion::Name () const
138 return data
->Name ();
142 packageversion::Canonical_version() const
144 return data
->Canonical_version();
148 packageversion::setCanonicalVersion (String
const &ver
)
150 data
->setCanonicalVersion (ver
);
154 packageversion::getfirstfile ()
156 return data
->getfirstfile ();
160 packageversion::getnextfile ()
162 return data
->getnextfile ();
166 packageversion::SDesc () const
168 return data
->SDesc ();
172 packageversion::set_sdesc (String
const &sdesc
)
174 data
->set_sdesc (sdesc
);
178 packageversion::LDesc () const
180 return data
->LDesc ();
184 packageversion::set_ldesc (String
const &ldesc
)
186 data
->set_ldesc (ldesc
);
190 packageversion::sourcePackage()
192 return data
->sourcePackage();
195 PackageSpecification
&
196 packageversion::sourcePackageSpecification ()
198 return data
->sourcePackageSpecification ();
202 packageversion::setSourcePackageSpecification (PackageSpecification
const &spec
)
204 data
->setSourcePackageSpecification(spec
);
207 vector
<vector
<PackageSpecification
*> *> *
208 packageversion::depends()
210 return &data
->depends
;
213 vector
<vector
<PackageSpecification
*> *> *
214 packageversion::predepends()
216 return &data
->predepends
;
219 vector
<vector
<PackageSpecification
*> *> *
220 packageversion::recommends()
222 return &data
->recommends
;
225 vector
<vector
<PackageSpecification
*> *> *
226 packageversion::suggests()
228 return &data
->suggests
;
231 vector
<vector
<PackageSpecification
*> *> *
232 packageversion::replaces()
234 return &data
->replaces
;
237 vector
<vector
<PackageSpecification
*> *> *
238 packageversion::conflicts()
240 return &data
->conflicts
;
243 vector
<vector
<PackageSpecification
*> *> *
244 packageversion::provides()
246 return &data
->provides
;
249 vector
<vector
<PackageSpecification
*> *> *
250 packageversion::binaries()
252 return &data
->binaries
;
256 packageversion::picked () const
262 packageversion::pick (bool aBool
)
264 data
->picked
= aBool
;
268 packageversion::changeRequested () const
270 return data
->changeRequested ();
274 packageversion::uninstall ()
280 packageversion::source ()
282 return &data
->source
;
286 packageversion::accessible() const
288 return data
->accessible();
291 /* the parent data class */
293 _packageversion::_packageversion ():picked (false), references (0)
297 _packageversion::~_packageversion ()
301 PackageSpecification
&
302 _packageversion::sourcePackageSpecification ()
304 return _sourcePackage
;
308 _packageversion::setSourcePackageSpecification (PackageSpecification
const &spec
)
310 _sourcePackage
= spec
;
314 _packageversion::sourcePackage ()
320 pkg
= db
.findSource (_sourcePackage
);
321 /* no valid source meta available, just return the default
322 (blank) package version
325 return sourceVersion
;
326 set
<packageversion
>::iterator i
=pkg
->versions
.begin();
327 while (i
!= pkg
->versions
.end())
329 packageversion
const & ver
= * i
;
330 if (_sourcePackage
.satisfies (ver
))
335 return sourceVersion
;
339 _packageversion::accessible() const
341 return ((::source
!= IDC_SOURCE_CWD
) && source
.sites
.size()) ||
346 _packageversion::changeRequested ()
348 return (picked
|| sourcePackage().picked());