Line data Source code
1 0 : /*
2 :
3 : OOJSOolite.h
4 :
5 : JavaScript proxy for Oolite (for version checking and similar).
6 :
7 :
8 : Oolite
9 : Copyright (C) 2004-2013 Giles C Williams and contributors
10 :
11 : This program is free software; you can redistribute it and/or
12 : modify it under the terms of the GNU General Public License
13 : as published by the Free Software Foundation; either version 2
14 : of the License, or (at your option) any later version.
15 :
16 : This program is distributed in the hope that it will be useful,
17 : but WITHOUT ANY WARRANTY; without even the implied warranty of
18 : MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19 : GNU General Public License for more details.
20 :
21 : You should have received a copy of the GNU General Public License
22 : along with this program; if not, write to the Free Software
23 : Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
24 : MA 02110-1301, USA.
25 :
26 : */
27 :
28 : #import "OOJSOolite.h"
29 : #import "OOJavaScriptEngine.h"
30 : #import "OOStringParsing.h"
31 : #import "OOJSPlayer.h"
32 : #import "ResourceManager.h"
33 :
34 :
35 : static JSBool OoliteGetProperty(JSContext *context, JSObject *this, jsid propID, jsval *value);
36 :
37 : static NSString *VersionString(void);
38 : static NSArray *VersionComponents(void);
39 :
40 : static JSBool OoliteCompareVersion(JSContext *context, uintN argc, jsval *vp);
41 :
42 :
43 0 : static JSClass sOoliteClass =
44 : {
45 : "Oolite",
46 : 0,
47 :
48 : JS_PropertyStub,
49 : JS_PropertyStub,
50 : OoliteGetProperty,
51 : JS_StrictPropertyStub,
52 : JS_EnumerateStub,
53 : JS_ResolveStub,
54 : JS_ConvertStub,
55 : JS_FinalizeStub
56 : };
57 :
58 :
59 0 : enum
60 : {
61 : // Property IDs
62 : kOolite_version, // version number components, array, read-only
63 : kOolite_versionString, // version number as string, string, read-only
64 : kOolite_jsVersion, // JavaScript version, integer, read-only
65 : kOolite_jsVersionString, // JavaScript version as string, string, read-only
66 : kOolite_gameSettings, // Various game settings, object, read-only
67 : kOolite_resourcePaths, // Paths containing resources, built-in plus oxp/oxz, read-only
68 : };
69 :
70 :
71 0 : static JSPropertySpec sOoliteProperties[] =
72 : {
73 : // JS name ID flags
74 : { "gameSettings", kOolite_gameSettings, OOJS_PROP_READONLY_CB },
75 : { "jsVersion", kOolite_jsVersion, OOJS_PROP_READONLY_CB },
76 : { "jsVersionString", kOolite_jsVersionString, OOJS_PROP_READONLY_CB },
77 : { "version", kOolite_version, OOJS_PROP_READONLY_CB },
78 : { "versionString", kOolite_versionString, OOJS_PROP_READONLY_CB },
79 : { "resourcePaths", kOolite_resourcePaths, OOJS_PROP_READONLY_CB },
80 : { 0 }
81 : };
82 :
83 :
84 0 : static JSFunctionSpec sOoliteMethods[] =
85 : {
86 : // JS name Function min args
87 : { "compareVersion", OoliteCompareVersion, 1 },
88 : { 0 }
89 : };
90 :
91 :
92 0 : void InitOOJSOolite(JSContext *context, JSObject *global)
93 : {
94 : JSObject *oolitePrototype = JS_InitClass(context, global, NULL, &sOoliteClass, OOJSUnconstructableConstruct, 0, sOoliteProperties, sOoliteMethods, NULL, NULL);
95 : JS_DefineObject(context, global, "oolite", &sOoliteClass, oolitePrototype, OOJS_PROP_READONLY);
96 : }
97 :
98 :
99 0 : static JSBool OoliteGetProperty(JSContext *context, JSObject *this, jsid propID, jsval *value)
100 : {
101 : if (!JSID_IS_INT(propID)) return YES;
102 :
103 : OOJS_NATIVE_ENTER(context)
104 :
105 : id result = nil;
106 :
107 : switch (JSID_TO_INT(propID))
108 : {
109 : case kOolite_version:
110 : result = VersionComponents();
111 : break;
112 :
113 : case kOolite_versionString:
114 : result = VersionString();
115 : break;
116 :
117 : case kOolite_jsVersion:
118 : *value = INT_TO_JSVAL(JS_GetVersion(context));
119 : return YES;
120 :
121 : case kOolite_jsVersionString:
122 : *value = STRING_TO_JSVAL(JS_NewStringCopyZ(context, JS_VersionToString(JS_GetVersion(context))));
123 : return YES;
124 :
125 : case kOolite_gameSettings:
126 : result = [UNIVERSE gameSettings];
127 : break;
128 :
129 : case kOolite_resourcePaths:
130 : result = [ResourceManager paths];
131 : break;
132 :
133 : default:
134 : OOJSReportBadPropertySelector(context, this, propID, sOoliteProperties);
135 : return NO;
136 : }
137 :
138 : *value = OOJSValueFromNativeObject(context, result);
139 : return YES;
140 :
141 : OOJS_NATIVE_EXIT
142 : }
143 :
144 :
145 0 : static NSString *VersionString(void)
146 : {
147 : return [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleVersion"];
148 : }
149 :
150 :
151 0 : static NSArray *VersionComponents(void)
152 : {
153 : return ComponentsFromVersionString(VersionString());
154 : }
155 :
156 :
157 : /* oolite.compareVersion(versionSpec) : Number
158 : returns -1 if the current version of Oolite is less than versionSpec, 0 if
159 : they are equal, and 1 if the current version is newer. versionSpec may be
160 : a string or an array. Example:
161 : if (0 < oolite.compareVersion("1.70")) log("Old version of Oolite!")
162 : else this.doStuffThatRequires170()
163 : */
164 0 : static JSBool OoliteCompareVersion(JSContext *context, uintN argc, jsval *vp)
165 : {
166 : OOJS_NATIVE_ENTER(context)
167 :
168 : id components = nil;
169 : NSEnumerator *componentEnum = nil;
170 : id component = nil;
171 :
172 : if (argc == 0) OOJS_RETURN_VOID; // Backwards-compatibility: be overly lenient.
173 :
174 : components = OOJSNativeObjectFromJSValue(context, OOJS_ARGV[0]);
175 : if ([components isKindOfClass:[NSArray class]])
176 : {
177 : // Require each element to be a number
178 : for (componentEnum = [components objectEnumerator]; (component = [componentEnum nextObject]); )
179 : {
180 : if (![component isKindOfClass:[NSNumber class]])
181 : {
182 : components = nil;
183 : break;
184 : }
185 : }
186 : }
187 : else if ([components isKindOfClass:[NSString class]])
188 : {
189 : components = ComponentsFromVersionString(components);
190 : }
191 : else components = nil;
192 :
193 : if (components != nil)
194 : {
195 : OOJS_RETURN_INT((int32_t)CompareVersions(components, VersionComponents()));
196 : }
197 : else
198 : {
199 : OOJS_RETURN_VOID;
200 : }
201 :
202 : OOJS_NATIVE_EXIT
203 : }
|