00001
00002
00003
00004
00005
00006
00007
00008
00009
00011
00012 #ifndef _PACKAGEDEP_H_
00013 #define _PACKAGEDEP_H_
00014
00015
00016 #include "wx/tokenzr.h"
00017 #include "wxp/wxputils.h"
00018 #include "wxp/compiler.h"
00019 #include "wxp/wxbuild.h"
00020 #include "wxp/packageutils.h"
00021
00022 class wxPackageId;
00023 class wxPackageIdArray;
00024 class wxPackageDependency;
00025 class wxPackageDependencyArray;
00026
00027 extern wxPackageDependency wxEmptyPackageDependency;
00028 extern wxPackageDependencyArray wxEmptyPackageDependencyArray;
00029
00030
00031
00032
00033
00034
00036 enum wxPackageDependencyType
00037 {
00038 wxPDT_INVALID = -1,
00039
00040 wxPDT_REQUIRED,
00041 wxPDT_SUGGESTED,
00042
00043 wxPDT_MAX
00044 };
00045
00046 wxDEFINE_STRING2ENUM(PackageDependencyType)
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056 class wxPackageDependency : public wxObject
00057 {
00058 friend class wxPackageDependencyArray;
00059 DECLARE_DYNAMIC_CLASS(wxPackageDependency)
00060
00061 public:
00062 wxPackageDependency() { m_nType=wxPDT_INVALID; }
00063 wxPackageDependency(
00064 const wxString &name,
00065 const wxVersionRange &version,
00066 const wxString &href = wxEmptyString,
00067 wxPackageDependencyType type = wxPDT_REQUIRED,
00068 const wxPackageIdArray &owners = wxEmptyPackageIdArray)
00069 : m_nType(type),
00070 m_strResolutionHref(href),
00071 m_strName(name), m_version(version),
00072 m_owners(owners) {}
00073 virtual ~wxPackageDependency() {}
00074
00075
00076 bool operator==(const wxPackageDependency &dep) const
00077 {
00078 return m_strName.CmpNoCase(dep.m_strName) == 0 &&
00079 m_strResolutionHref == dep.m_strResolutionHref &&
00080 m_nType == dep.m_nType &&
00081 m_version == dep.m_version;
00082 }
00083
00084 bool operator!=(const wxPackageDependency &dep) const
00085 { return !(*this == dep); }
00086
00087
00088 public:
00089
00090 wxString GetName() const
00091 { return m_strName; }
00092 wxVersionRange GetVersion() const
00093 { return m_version; }
00094 wxString GetResolutionHref() const
00095 { return m_strResolutionHref; }
00096
00097 wxPackageDependencyType GetType() const
00098 { return m_nType; }
00099 wxString GetTypeStr() const
00100 { return wxPackageDependencyType2String(GetType()); }
00101
00102 wxPackageIdArray GetOwnersId() const
00103 { return m_owners; }
00104
00105 wxString GetOwnersIdStr() const
00106 {
00107 wxString own;
00108 for (size_t j=0; j<m_owners.GetCount(); j++)
00109 own += m_owners[j].GetName() + wxT(",");
00110 own.RemoveLast();
00111 return own;
00112 }
00113
00114 public:
00115
00116 void SetName(const wxString &name)
00117 { m_strName=name; }
00118 void SetVersion(const wxVersionRange &ver)
00119 { m_version=ver; }
00120 void SetResolutionHref(const wxString &href)
00121 { m_strResolutionHref=href; }
00122 void SetType(wxPackageDependencyType t)
00123 { m_nType=t; }
00124 void SetOwnersId(const wxPackageIdArray &id)
00125 { m_owners=id; }
00126
00127 void AddOwnerId(const wxPackageId &id)
00128 { m_owners.Add(id); }
00129 void SetOwnerId(const wxPackageId &id)
00130 { m_owners.Clear(); m_owners.Add(id); }
00131
00132 public:
00133
00134 bool IsOk() const
00135 {
00136 return m_nType != wxPDT_INVALID &&
00137 !m_strName.IsEmpty() &&
00138 !m_strName.Contains(wxT(' ')) &&
00139 m_version.IsOk();
00140 }
00141
00142 bool IsPartiallySatisfiedBy(const wxString &pkgname) const
00143 { return GetName().CmpNoCase(pkgname) == 0; }
00144
00145 bool IsSatisfiedBy(const wxPackageId &pkg) const;
00146 bool IsSatisfiedByOneOf(const wxPackageArray &arr) const;
00147
00155 int GetBestMatch(const wxPackageArray &arr) const;
00156
00157 protected:
00158
00161 bool DoGetRecursiveDependencies(
00162 wxPackageDependencyArray *ret,
00163 const wxPackageArray &arr,
00164 wxPackageDependencyType type,
00165 wxPackageDependencyArray *notfound,
00166 wxPackageIdArray *alreadyprocessed) const;
00167
00168 protected:
00169 wxPackageDependencyType m_nType;
00170 wxString m_strResolutionHref;
00171
00172
00173 wxString m_strName;
00174 wxVersionRange m_version;
00175
00180 wxPackageIdArray m_owners;
00181 };
00182
00183
00184 WX_DECLARE_OBJARRAY(wxPackageDependency, wxPackageDependencyArrayHelper);
00185
00186
00187
00188
00189
00190
00191
00192 class wxPackageDependencyArray : public wxPackageDependencyArrayHelper
00193 {
00194
00195 friend class wxPackage;
00196
00197 public:
00198
00200 wxPackageDependencyArray() {}
00201
00202 public:
00203
00205 bool IsOk() const
00206 {
00207 for (size_t i=0; i<GetCount(); i++)
00208 if (!Item(i).IsOk())
00209 return false;
00210 return true;
00211 }
00212
00214 int IndexById(const wxPackageId &id) const
00215 {
00216 for (size_t i=0; i<GetCount(); i++)
00217 if (Item(i).IsSatisfiedBy(id))
00218 return i;
00219 return wxNOT_FOUND;
00220 }
00221
00222 wxPackageDependency &ItemById(const wxPackageId &id)
00223 {
00224 int n = IndexById(id);
00225 if (n != wxNOT_FOUND)
00226 return wxPackageDependencyArrayHelper::Item(n);
00227 return wxEmptyPackageDependency;
00228 }
00229
00231 int IndexByName(const wxString &id) const
00232 {
00233 for (size_t i=0; i<GetCount(); i++)
00234 if (Item(i).IsPartiallySatisfiedBy(id))
00235 return i;
00236 return wxNOT_FOUND;
00237 }
00238
00239 wxPackageDependency &ItemByName(const wxString &id)
00240 {
00241 int n = IndexByName(id);
00242 if (n != wxNOT_FOUND)
00243 return wxPackageDependencyArrayHelper::Item(n);
00244 return wxEmptyPackageDependency;
00245 }
00246
00247
00248
00249 int Index(const wxPackageDependency &dep) const
00250 {
00251 for (size_t i=0; i<GetCount(); i++)
00252 if (Item(i) == dep)
00253 return i;
00254 return wxNOT_FOUND;
00255 }
00256
00257 bool Contains(const wxPackageDependency &dep) const
00258 { return Index(dep) != wxNOT_FOUND; }
00259 bool ContainsDependencyFrom(const wxPackageId &id) const
00260 { return IndexById(id) != wxNOT_FOUND; }
00261 bool ContainsDependencyNamed(const wxString &pkgname) const
00262 { return IndexByName(pkgname) != wxNOT_FOUND; }
00263
00264 void Dump()
00265 {
00266 for (size_t i=0; i<GetCount(); i++)
00267 wxLogDebug(wxT("%s %s"), Item(i).GetName().c_str(),
00268 Item(i).GetVersion().GetAsString().c_str());
00269 }
00270
00271
00272
00273
00274
00275
00276
00277
00278
00279
00280
00281
00282
00283
00284
00285
00286 public:
00287
00289 wxPackageDependencyArray GetDependenciesOfType(wxPackageDependencyType) const;
00290
00292 wxPackageDependencyArray GetDependenciesAvailableIn(const wxPackageArray &arr) const;
00293
00295 wxPackageDependencyArray GetDependenciesNotAvailableIn(const wxPackageArray &arr) const;
00296
00298 wxPackageDependencyArray GetConflictingDependencies() const;
00299
00300 protected:
00301
00303 bool DoGetRecursiveDependencies(
00304 wxPackageDependencyArray *ret,
00305 const wxPackageArray &arr,
00306 wxPackageDependencyType type,
00307 wxPackageDependencyArray *notfound,
00308 wxPackageIdArray *alreadyprocessed) const;
00309 };
00310
00311
00312 #endif // _PACKAGEDEP_H_
00313