00001
00002
00003
00004
00005
00006
00007
00008
00009
00011
00012
00013
00014 #include "wx/wxprec.h"
00015
00016 #ifdef __BORLANDC__
00017 #pragma hdrstop
00018 #endif
00019
00020 #ifndef WX_PRECOMP
00021 #include "wx/wx.h"
00022 #endif
00023
00024
00025 #include "wxp/version.h"
00026
00027
00028
00029 IMPLEMENT_DYNAMIC_CLASS(wxVersion, wxObject)
00030 IMPLEMENT_DYNAMIC_CLASS(wxVersionRange, wxObject)
00031
00032
00033
00034 #include <wx/arrimpl.cpp> // this is a magic incantation which must be done!
00035 WX_DEFINE_OBJARRAY(wxVersionRangeArray);
00036
00037
00038 wxVersion wxEmptyVersion;
00039 wxVersionRange wxEmptyVersionRange;
00040
00041
00042
00043
00044
00045
00046
00047 bool wxVersion::operator >(const wxVersion &v) const
00048 {
00049 if (m_nMajor > v.m_nMajor)
00050 return true;
00051 if (m_nMajor == v.m_nMajor && m_nMinor > v.m_nMinor)
00052 return true;
00053 if (m_nMajor == v.m_nMajor && m_nMinor == v.m_nMinor && m_nRelease > v.m_nRelease)
00054 return true;
00055 return false;
00056 }
00057
00058 bool wxVersion::operator <(const wxVersion &v) const
00059 {
00060 if (m_nMajor < v.m_nMajor)
00061 return true;
00062 if (m_nMajor == v.m_nMajor && m_nMinor < v.m_nMinor)
00063 return true;
00064 if (m_nMajor == v.m_nMajor && m_nMinor == v.m_nMinor && m_nRelease < v.m_nRelease)
00065 return true;
00066 return false;
00067 }
00068
00069 bool wxVersion::operator ==(const wxVersion &ver) const
00070 {
00071 return m_nMajor==ver.m_nMajor &&
00072 m_nMinor==ver.m_nMinor &&
00073 m_nRelease==ver.m_nRelease;
00074 }
00075
00076 bool wxVersion::Set(const wxString &str)
00077 {
00078
00079
00080 m_nMajor = m_nMinor = m_nRelease = 0;
00081
00082
00083 wxString major = str.BeforeFirst(wxT('.'));
00084 wxString minor = str.AfterFirst(wxT('.')).BeforeFirst(wxT('.'));
00085 wxString release = str.AfterFirst(wxT('.')).AfterFirst(wxT('.'));
00086
00087 if (major.IsEmpty() || !major.IsNumber() ||
00088 (!minor.IsEmpty() && !minor.IsNumber()) ||
00089 (!release.IsEmpty() && !release.IsNumber()))
00090 return false;
00091 if (minor.IsEmpty())
00092 minor = wxT("0");
00093 if (release.IsEmpty())
00094 release = wxT("0");
00095
00096
00097 major.ToULong((unsigned long *)&m_nMajor);
00098 minor.ToULong((unsigned long *)&m_nMinor);
00099 release.ToULong((unsigned long *)&m_nRelease);
00100
00101 return IsOk();
00102 }
00103
00104
00105
00106
00107
00108
00109
00110 bool wxVersionRange::Set(const wxString &str)
00111 {
00112
00113
00114 m_start.Set(0, 0, 0);
00115 m_end.Set(0, 0, 0);
00116
00117 if (str.IsEmpty())
00118 return false;
00119
00120
00121
00122 if (str.Contains(wxT('-')))
00123 {
00124
00125 if (str.Contains(wxT('x')))
00126 return false;
00127
00128
00129
00130 wxString start(str.BeforeFirst(wxT('-'))),
00131 end(str.AfterFirst(wxT('-')));
00132 if (start.Freq(wxT('.')) < 2)
00133 start += wxT(".0");
00134 if (end.Freq(wxT('.')) < 2)
00135 end += wxT(".9");
00136
00137 m_start.Set(start);
00138 m_end.Set(end);
00139 }
00140 else if (str.Contains(wxT('x')))
00141 {
00142
00143 if (str.Contains(wxT('-')))
00144 return false;
00145
00146
00147
00148 wxString ver(str);
00149 if (ver.Freq(wxT('.')) < 2)
00150 ver += wxT(".x");
00151
00152 wxString start(ver), end(ver);
00153 start.Replace(wxT("x"), wxT("0"));
00154 end.Replace(wxT("x"), wxT("9"));
00155
00156 m_start.Set(start);
00157 m_end.Set(end);
00158 }
00159 else
00160 {
00161 wxString op(str), ver(str);
00162
00163 op = op.Remove(2).MakeLower().Trim();
00164 ver = ver.Mid(2).Trim(false);
00165
00166 if (op == wxT("lt"))
00167 {
00168
00169 m_start.Set(0,0,1);
00170 m_end.Set(ver);
00171 m_end.Set(m_end.GetMajor(), m_end.GetMinor(), m_end.GetRelease()-1);
00172 }
00173 else if (op == wxT("le"))
00174 {
00175
00176 m_start.Set(0,0,1);
00177 m_end.Set(ver);
00178 }
00179 else if (op == wxT("eq"))
00180 {
00181
00182 m_start.Set(ver);
00183 m_end.Set(ver);
00184 }
00185 else if (op == wxT("ge"))
00186 {
00187
00188 m_start.Set(ver);
00189 m_end.Set(9,9,9);
00190 }
00191 else if (op == wxT("gt"))
00192 {
00193
00194 m_start.Set(ver);
00195 m_start.Set(m_start.GetMajor(), m_start.GetMinor(), m_start.GetRelease()+1);
00196 m_end.Set(9,9,9);
00197 }
00198 else
00199 {
00200
00201 m_start.Set(str);
00202 m_end.Set(str);
00203 }
00204 }
00205
00206 return IsOk();
00207 }
00208
00209 wxString wxVersionRange::GetAsString() const
00210 {
00211 if (m_start == m_end)
00212 return m_start.GetAsString();
00213
00214
00215 bool canUseXforRelease = m_start.GetRelease() == 0 && m_end.GetRelease() == 9;
00216 bool canUseXforMinor = m_start.GetMinor() == 0 && m_end.GetMinor() == 9;
00217 bool canUseXforMajor = m_start.GetMajor() == 0 && m_end.GetMajor() == 9;
00218 bool eqRelease = m_start.GetRelease() == m_end.GetRelease();
00219 bool eqMinor = m_start.GetMinor() == m_end.GetMinor();
00220 bool eqMajor = m_start.GetMajor() == m_end.GetMajor();
00221
00222
00223
00224 if (!(canUseXforRelease || eqRelease) ||
00225 !(canUseXforMinor || eqMinor) ||
00226 !(canUseXforMajor || eqMajor))
00227 {
00228
00229 return wxString::Format(wxT("%s-%s"),
00230 m_start.GetAsString().c_str(),
00231 m_end.GetAsString().c_str());
00232 }
00233
00234 #define APPEND_DIGIT(n) \
00235 if (canUseXfor##n) \
00236 str += wxT("x."); \
00237 else \
00238 str += wxString::Format(wxT("%d."), m_start.Get##n());
00239
00240 wxString str;
00241 APPEND_DIGIT(Major);
00242 APPEND_DIGIT(Minor);
00243 APPEND_DIGIT(Release);
00244 return str.RemoveLast();
00245 }
00246
00247 bool wxVersionRange::Contains(const wxVersion &ver) const
00248 {
00249 if (m_start <= ver && m_end >= ver)
00250 return true;
00251 return false;
00252 }
00253
00254 bool wxVersionRange::OverlapsWith(const wxVersionRange &ver) const
00255 {
00256 if (ver.Contains(m_start) || ver.Contains(m_end))
00257 return true;
00258 return false;
00259 }
00260
00261
00262