Line data Source code
1 : /* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
2 : /* vim: set ts=8 sts=2 et sw=2 tw=80: */
3 : /* This Source Code Form is subject to the terms of the Mozilla Public
4 : * License, v. 2.0. If a copy of the MPL was not distributed with this
5 : * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
6 :
7 : #ifndef nsVersionComparator_h__
8 : #define nsVersionComparator_h__
9 :
10 : #include "nscore.h"
11 : #include <stdlib.h>
12 : #include <string.h>
13 : #include <assert.h>
14 : #if defined(XP_WIN) && !defined(UPDATER_NO_STRING_GLUE_STL)
15 : #include <wchar.h>
16 : #include "nsStringGlue.h"
17 : #endif
18 :
19 : /**
20 : * In order to compare version numbers in Mozilla, you need to use the
21 : * mozilla::Version class. You can construct an object of this type by passing
22 : * in a string version number to the constructor. Objects of this type can be
23 : * compared using the standard comparison operators.
24 : *
25 : * For example, let's say that you want to make sure that a given version
26 : * number is not older than 15.a2. Here's how you would write a function to
27 : * do that.
28 : *
29 : * bool IsVersionValid(const char* version) {
30 : * return mozilla::Version("15.a2") <= mozilla::Version(version);
31 : * }
32 : *
33 : * Or, since Version's constructor is implicit, you can simplify this code:
34 : *
35 : * bool IsVersionValid(const char* version) {
36 : * return mozilla::Version("15.a2") <= version;
37 : * }
38 : *
39 : * On Windows, if your version strings are wide characters, you should use the
40 : * mozilla::VersionW variant instead. The semantics of that class is the same
41 : * as Version.
42 : */
43 :
44 : namespace mozilla {
45 :
46 : int32_t CompareVersions(const char* aStrA, const char* aStrB);
47 :
48 : #ifdef XP_WIN
49 : int32_t CompareVersions(const char16_t* aStrA, const char16_t* aStrB);
50 : #endif
51 :
52 : struct Version
53 : {
54 2838 : explicit Version(const char* aVersionString)
55 2838 : {
56 2838 : versionContent = strdup(aVersionString);
57 2838 : }
58 :
59 0 : const char* ReadContent() const
60 : {
61 0 : return versionContent;
62 : }
63 :
64 2838 : ~Version()
65 2838 : {
66 2838 : free(versionContent);
67 2838 : }
68 :
69 : bool operator<(const Version& aRhs) const
70 : {
71 : return CompareVersions(versionContent, aRhs.ReadContent()) == -1;
72 : }
73 0 : bool operator<=(const Version& aRhs) const
74 : {
75 0 : return CompareVersions(versionContent, aRhs.ReadContent()) < 1;
76 : }
77 0 : bool operator>(const Version& aRhs) const
78 : {
79 0 : return CompareVersions(versionContent, aRhs.ReadContent()) == 1;
80 : }
81 0 : bool operator>=(const Version& aRhs) const
82 : {
83 0 : return CompareVersions(versionContent, aRhs.ReadContent()) > -1;
84 : }
85 : bool operator==(const Version& aRhs) const
86 : {
87 : return CompareVersions(versionContent, aRhs.ReadContent()) == 0;
88 : }
89 : bool operator!=(const Version& aRhs) const
90 : {
91 : return CompareVersions(versionContent, aRhs.ReadContent()) != 0;
92 : }
93 1 : bool operator<(const char* aRhs) const
94 : {
95 1 : return CompareVersions(versionContent, aRhs) == -1;
96 : }
97 2834 : bool operator<=(const char* aRhs) const
98 : {
99 2834 : return CompareVersions(versionContent, aRhs) < 1;
100 : }
101 1 : bool operator>(const char* aRhs) const
102 : {
103 1 : return CompareVersions(versionContent, aRhs) == 1;
104 : }
105 0 : bool operator>=(const char* aRhs) const
106 : {
107 0 : return CompareVersions(versionContent, aRhs) > -1;
108 : }
109 : bool operator==(const char* aRhs) const
110 : {
111 : return CompareVersions(versionContent, aRhs) == 0;
112 : }
113 : bool operator!=(const char* aRhs) const
114 : {
115 : return CompareVersions(versionContent, aRhs) != 0;
116 : }
117 :
118 : private:
119 : char* versionContent;
120 : };
121 :
122 : #ifdef XP_WIN
123 : struct VersionW
124 : {
125 : explicit VersionW(const char16_t* aVersionStringW)
126 : {
127 : versionContentW =
128 : reinterpret_cast<char16_t*>(wcsdup(char16ptr_t(aVersionStringW)));
129 : }
130 :
131 : const char16_t* ReadContentW() const
132 : {
133 : return versionContentW;
134 : }
135 :
136 : ~VersionW()
137 : {
138 : free(versionContentW);
139 : }
140 :
141 : bool operator<(const VersionW& aRhs) const
142 : {
143 : return CompareVersions(versionContentW, aRhs.ReadContentW()) == -1;
144 : }
145 : bool operator<=(const VersionW& aRhs) const
146 : {
147 : return CompareVersions(versionContentW, aRhs.ReadContentW()) < 1;
148 : }
149 : bool operator>(const VersionW& aRhs) const
150 : {
151 : return CompareVersions(versionContentW, aRhs.ReadContentW()) == 1;
152 : }
153 : bool operator>=(const VersionW& aRhs) const
154 : {
155 : return CompareVersions(versionContentW, aRhs.ReadContentW()) > -1;
156 : }
157 : bool operator==(const VersionW& aRhs) const
158 : {
159 : return CompareVersions(versionContentW, aRhs.ReadContentW()) == 0;
160 : }
161 : bool operator!=(const VersionW& aRhs) const
162 : {
163 : return CompareVersions(versionContentW, aRhs.ReadContentW()) != 0;
164 : }
165 :
166 : private:
167 : char16_t* versionContentW;
168 : };
169 : #endif
170 :
171 : } // namespace mozilla
172 :
173 : #endif // nsVersionComparator_h__
174 :
|