ruboto-core 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/COPYING +19 -0
- data/README.md +192 -0
- data/Rakefile +144 -0
- data/assets/Rakefile +94 -0
- data/assets/assets/scripts/ruboto.rb +313 -0
- data/assets/samples/sample_activity.rb +21 -0
- data/assets/samples/sample_broadcast_receiver.rb +7 -0
- data/assets/samples/sample_service.rb +13 -0
- data/assets/src/InheritingActivity.java +10 -0
- data/assets/src/InheritingBroadcastReceiver.java +10 -0
- data/assets/src/InheritingService.java +10 -0
- data/assets/src/org/ruboto/RubotoActivity.java +1406 -0
- data/assets/src/org/ruboto/RubotoBroadcastReceiver.java +126 -0
- data/assets/src/org/ruboto/RubotoService.java +233 -0
- data/assets/src/org/ruboto/RubotoView.java +30 -0
- data/assets/src/org/ruboto/Script.java +231 -0
- data/bin/ruboto +191 -0
- data/lib/java_class_gen/InheritingClass.java.erb +11 -0
- data/lib/java_class_gen/RubotoClass.java.erb +197 -0
- data/lib/java_class_gen/callback_reflection.rb +109 -0
- data/lib/java_class_gen/interfaces.txt +1 -0
- metadata +120 -0
@@ -0,0 +1,126 @@
|
|
1
|
+
/**********************************************************************************************
|
2
|
+
*
|
3
|
+
* RubotoBroadcastReceiver.java is generated from RubotoClass.java.erb. Any changes needed in should be
|
4
|
+
* made within the erb template or they will be lost.
|
5
|
+
*
|
6
|
+
*/
|
7
|
+
|
8
|
+
package org.ruboto;
|
9
|
+
|
10
|
+
import java.io.IOException;
|
11
|
+
import android.content.BroadcastReceiver;
|
12
|
+
import android.os.Handler;
|
13
|
+
import android.os.Bundle;
|
14
|
+
|
15
|
+
import org.jruby.Ruby;
|
16
|
+
import org.jruby.javasupport.util.RuntimeHelpers;
|
17
|
+
import org.jruby.runtime.builtin.IRubyObject;
|
18
|
+
import org.jruby.javasupport.JavaUtil;
|
19
|
+
import org.jruby.exceptions.RaiseException;
|
20
|
+
|
21
|
+
public abstract class RubotoBroadcastReceiver extends BroadcastReceiver
|
22
|
+
|
23
|
+
{
|
24
|
+
public static final int CB_CHECK_SYNCHRONOUS_HINT = 0;
|
25
|
+
public static final int CB_PEEK_SERVICE = 1;
|
26
|
+
public static final int CB_LAST = 2;
|
27
|
+
|
28
|
+
private boolean[] callbackOptions = new boolean [CB_LAST];
|
29
|
+
|
30
|
+
private String remoteVariable = "";
|
31
|
+
|
32
|
+
private final Handler loadingHandler = new Handler();
|
33
|
+
private IRubyObject __this__;
|
34
|
+
private Ruby __ruby__;
|
35
|
+
private String scriptName;
|
36
|
+
public Object[] args;
|
37
|
+
|
38
|
+
public RubotoBroadcastReceiver setRemoteVariable(String var) {
|
39
|
+
remoteVariable = ((var == null) ? "" : (var + "."));
|
40
|
+
return this;
|
41
|
+
}
|
42
|
+
|
43
|
+
/**********************************************************************************
|
44
|
+
*
|
45
|
+
* Callback management
|
46
|
+
*/
|
47
|
+
|
48
|
+
public void requestCallback(int id) {
|
49
|
+
callbackOptions[id] = true;
|
50
|
+
}
|
51
|
+
|
52
|
+
public void removeCallback(int id) {
|
53
|
+
callbackOptions[id] = false;
|
54
|
+
}
|
55
|
+
|
56
|
+
/*
|
57
|
+
* Activity Lifecycle: onCreate
|
58
|
+
*/
|
59
|
+
|
60
|
+
@Override
|
61
|
+
public void onReceive(android.content.Context arg0, android.content.Intent arg1) {
|
62
|
+
|
63
|
+
args = new Object[2];
|
64
|
+
args[0] = arg0;
|
65
|
+
args[1] = arg1;
|
66
|
+
|
67
|
+
|
68
|
+
if (Script.getRuby() == null){
|
69
|
+
Script.setUpJRuby(null);
|
70
|
+
}
|
71
|
+
Script.defineGlobalVariable("$broadcast_receiver", this);
|
72
|
+
|
73
|
+
|
74
|
+
__ruby__ = Script.getRuby();
|
75
|
+
__this__ = JavaUtil.convertJavaToRuby(__ruby__, RubotoBroadcastReceiver.this);
|
76
|
+
|
77
|
+
try {
|
78
|
+
new Script(scriptName).execute();
|
79
|
+
}
|
80
|
+
catch(IOException e){
|
81
|
+
|
82
|
+
}
|
83
|
+
}
|
84
|
+
|
85
|
+
public void setScriptName(String name){
|
86
|
+
scriptName = name;
|
87
|
+
}
|
88
|
+
|
89
|
+
|
90
|
+
|
91
|
+
/*********************************************************************************
|
92
|
+
*
|
93
|
+
* Ruby Generated Callback Methods
|
94
|
+
*/
|
95
|
+
|
96
|
+
/*
|
97
|
+
* android.content.BroadcastReceiver
|
98
|
+
*/
|
99
|
+
|
100
|
+
public void checkSynchronousHint() {
|
101
|
+
if (callbackOptions[CB_CHECK_SYNCHRONOUS_HINT]) {
|
102
|
+
|
103
|
+
try {
|
104
|
+
RuntimeHelpers.invoke(__ruby__.getCurrentContext(), __this__, "check_synchronous_hint");
|
105
|
+
} catch (RaiseException re) {
|
106
|
+
re.printStackTrace(__ruby__.getErrorStream());
|
107
|
+
|
108
|
+
}
|
109
|
+
}
|
110
|
+
}
|
111
|
+
|
112
|
+
public android.os.IBinder peekService(android.content.Context arg0, android.content.Intent arg1) {
|
113
|
+
if (callbackOptions[CB_PEEK_SERVICE]) {
|
114
|
+
|
115
|
+
try {
|
116
|
+
return (android.os.IBinder)RuntimeHelpers.invoke(__ruby__.getCurrentContext(), __this__, "peek_service", JavaUtil.convertJavaToRuby(__ruby__, arg0), JavaUtil.convertJavaToRuby(__ruby__, arg1)).toJava(android.os.IBinder.class);
|
117
|
+
} catch (RaiseException re) {
|
118
|
+
re.printStackTrace(__ruby__.getErrorStream());
|
119
|
+
return null;
|
120
|
+
}
|
121
|
+
} else {
|
122
|
+
return null;
|
123
|
+
}
|
124
|
+
}
|
125
|
+
|
126
|
+
}
|
@@ -0,0 +1,233 @@
|
|
1
|
+
/**********************************************************************************************
|
2
|
+
*
|
3
|
+
* RubotoService.java is generated from RubotoClass.java.erb. Any changes needed in should be
|
4
|
+
* made within the erb template or they will be lost.
|
5
|
+
*
|
6
|
+
*/
|
7
|
+
|
8
|
+
package org.ruboto;
|
9
|
+
|
10
|
+
import java.io.IOException;
|
11
|
+
import android.app.Service;
|
12
|
+
import android.os.Handler;
|
13
|
+
import android.os.Bundle;
|
14
|
+
|
15
|
+
import org.jruby.Ruby;
|
16
|
+
import org.jruby.javasupport.util.RuntimeHelpers;
|
17
|
+
import org.jruby.runtime.builtin.IRubyObject;
|
18
|
+
import org.jruby.javasupport.JavaUtil;
|
19
|
+
import org.jruby.exceptions.RaiseException;
|
20
|
+
|
21
|
+
public abstract class RubotoService extends Service
|
22
|
+
|
23
|
+
{
|
24
|
+
public static final int CB_LOW_MEMORY = 0;
|
25
|
+
public static final int CB_DUMP = 1;
|
26
|
+
public static final int CB_UNBIND = 2;
|
27
|
+
public static final int CB_START_COMMAND = 3;
|
28
|
+
public static final int CB_FINALIZE = 4;
|
29
|
+
public static final int CB_START = 5;
|
30
|
+
public static final int CB_DESTROY = 6;
|
31
|
+
public static final int CB_REBIND = 7;
|
32
|
+
public static final int CB_CONFIGURATION_CHANGED = 8;
|
33
|
+
public static final int CB_BIND = 9;
|
34
|
+
public static final int CB_LAST = 10;
|
35
|
+
|
36
|
+
private boolean[] callbackOptions = new boolean [CB_LAST];
|
37
|
+
|
38
|
+
private String remoteVariable = "";
|
39
|
+
|
40
|
+
private final Handler loadingHandler = new Handler();
|
41
|
+
private IRubyObject __this__;
|
42
|
+
private Ruby __ruby__;
|
43
|
+
private String scriptName;
|
44
|
+
public Object[] args;
|
45
|
+
|
46
|
+
public RubotoService setRemoteVariable(String var) {
|
47
|
+
remoteVariable = ((var == null) ? "" : (var + "."));
|
48
|
+
return this;
|
49
|
+
}
|
50
|
+
|
51
|
+
/**********************************************************************************
|
52
|
+
*
|
53
|
+
* Callback management
|
54
|
+
*/
|
55
|
+
|
56
|
+
public void requestCallback(int id) {
|
57
|
+
callbackOptions[id] = true;
|
58
|
+
}
|
59
|
+
|
60
|
+
public void removeCallback(int id) {
|
61
|
+
callbackOptions[id] = false;
|
62
|
+
}
|
63
|
+
|
64
|
+
/*
|
65
|
+
* Activity Lifecycle: onCreate
|
66
|
+
*/
|
67
|
+
|
68
|
+
@Override
|
69
|
+
public void onCreate() {
|
70
|
+
|
71
|
+
args = new Object[0];
|
72
|
+
super.onCreate();
|
73
|
+
|
74
|
+
|
75
|
+
if (Script.getRuby() == null){
|
76
|
+
Script.setUpJRuby(null);
|
77
|
+
}
|
78
|
+
Script.defineGlobalVariable("$service", this);
|
79
|
+
|
80
|
+
|
81
|
+
__ruby__ = Script.getRuby();
|
82
|
+
__this__ = JavaUtil.convertJavaToRuby(__ruby__, RubotoService.this);
|
83
|
+
|
84
|
+
try {
|
85
|
+
new Script(scriptName).execute();
|
86
|
+
}
|
87
|
+
catch(IOException e){
|
88
|
+
|
89
|
+
}
|
90
|
+
}
|
91
|
+
|
92
|
+
public void setScriptName(String name){
|
93
|
+
scriptName = name;
|
94
|
+
}
|
95
|
+
|
96
|
+
|
97
|
+
|
98
|
+
/*********************************************************************************
|
99
|
+
*
|
100
|
+
* Ruby Generated Callback Methods
|
101
|
+
*/
|
102
|
+
|
103
|
+
/*
|
104
|
+
* android.app.Service
|
105
|
+
*/
|
106
|
+
|
107
|
+
public void onLowMemory() {
|
108
|
+
if (callbackOptions[CB_LOW_MEMORY]) {
|
109
|
+
|
110
|
+
try {
|
111
|
+
RuntimeHelpers.invoke(__ruby__.getCurrentContext(), __this__, "on_low_memory");
|
112
|
+
} catch (RaiseException re) {
|
113
|
+
re.printStackTrace(__ruby__.getErrorStream());
|
114
|
+
|
115
|
+
}
|
116
|
+
}
|
117
|
+
}
|
118
|
+
|
119
|
+
public void dump(java.io.FileDescriptor arg0, java.io.PrintWriter arg1, java.lang.String[] arg2) {
|
120
|
+
if (callbackOptions[CB_DUMP]) {
|
121
|
+
|
122
|
+
try {
|
123
|
+
RuntimeHelpers.invoke(__ruby__.getCurrentContext(), __this__, "dump", JavaUtil.convertJavaToRuby(__ruby__, arg0), JavaUtil.convertJavaToRuby(__ruby__, arg1), JavaUtil.convertJavaToRuby(__ruby__, arg2));
|
124
|
+
} catch (RaiseException re) {
|
125
|
+
re.printStackTrace(__ruby__.getErrorStream());
|
126
|
+
|
127
|
+
}
|
128
|
+
}
|
129
|
+
}
|
130
|
+
|
131
|
+
public boolean onUnbind(android.content.Intent arg0) {
|
132
|
+
if (callbackOptions[CB_UNBIND]) {
|
133
|
+
|
134
|
+
try {
|
135
|
+
return (Boolean)RuntimeHelpers.invoke(__ruby__.getCurrentContext(), __this__, "on_unbind", JavaUtil.convertJavaToRuby(__ruby__, arg0)).toJava(boolean.class);
|
136
|
+
} catch (RaiseException re) {
|
137
|
+
re.printStackTrace(__ruby__.getErrorStream());
|
138
|
+
return false;
|
139
|
+
}
|
140
|
+
} else {
|
141
|
+
return false;
|
142
|
+
}
|
143
|
+
}
|
144
|
+
|
145
|
+
public int onStartCommand(android.content.Intent arg0, int arg1, int arg2) {
|
146
|
+
if (callbackOptions[CB_START_COMMAND]) {
|
147
|
+
|
148
|
+
try {
|
149
|
+
return (Integer)RuntimeHelpers.invoke(__ruby__.getCurrentContext(), __this__, "on_start_command", JavaUtil.convertJavaToRuby(__ruby__, arg0), JavaUtil.convertJavaToRuby(__ruby__, arg1), JavaUtil.convertJavaToRuby(__ruby__, arg2)).toJava(int.class);
|
150
|
+
} catch (RaiseException re) {
|
151
|
+
re.printStackTrace(__ruby__.getErrorStream());
|
152
|
+
return 0;
|
153
|
+
}
|
154
|
+
} else {
|
155
|
+
return 0;
|
156
|
+
}
|
157
|
+
}
|
158
|
+
|
159
|
+
public void finalize() {
|
160
|
+
if (callbackOptions[CB_FINALIZE]) {
|
161
|
+
|
162
|
+
try {
|
163
|
+
RuntimeHelpers.invoke(__ruby__.getCurrentContext(), __this__, "finalize");
|
164
|
+
} catch (RaiseException re) {
|
165
|
+
re.printStackTrace(__ruby__.getErrorStream());
|
166
|
+
|
167
|
+
}
|
168
|
+
}
|
169
|
+
}
|
170
|
+
|
171
|
+
public void onStart(android.content.Intent arg0, int arg1) {
|
172
|
+
if (callbackOptions[CB_START]) {
|
173
|
+
|
174
|
+
try {
|
175
|
+
RuntimeHelpers.invoke(__ruby__.getCurrentContext(), __this__, "on_start", JavaUtil.convertJavaToRuby(__ruby__, arg0), JavaUtil.convertJavaToRuby(__ruby__, arg1));
|
176
|
+
} catch (RaiseException re) {
|
177
|
+
re.printStackTrace(__ruby__.getErrorStream());
|
178
|
+
|
179
|
+
}
|
180
|
+
}
|
181
|
+
}
|
182
|
+
|
183
|
+
public void onDestroy() {
|
184
|
+
if (callbackOptions[CB_DESTROY]) {
|
185
|
+
|
186
|
+
try {
|
187
|
+
RuntimeHelpers.invoke(__ruby__.getCurrentContext(), __this__, "on_destroy");
|
188
|
+
} catch (RaiseException re) {
|
189
|
+
re.printStackTrace(__ruby__.getErrorStream());
|
190
|
+
|
191
|
+
}
|
192
|
+
}
|
193
|
+
}
|
194
|
+
|
195
|
+
public void onRebind(android.content.Intent arg0) {
|
196
|
+
if (callbackOptions[CB_REBIND]) {
|
197
|
+
|
198
|
+
try {
|
199
|
+
RuntimeHelpers.invoke(__ruby__.getCurrentContext(), __this__, "on_rebind", JavaUtil.convertJavaToRuby(__ruby__, arg0));
|
200
|
+
} catch (RaiseException re) {
|
201
|
+
re.printStackTrace(__ruby__.getErrorStream());
|
202
|
+
|
203
|
+
}
|
204
|
+
}
|
205
|
+
}
|
206
|
+
|
207
|
+
public void onConfigurationChanged(android.content.res.Configuration arg0) {
|
208
|
+
if (callbackOptions[CB_CONFIGURATION_CHANGED]) {
|
209
|
+
|
210
|
+
try {
|
211
|
+
RuntimeHelpers.invoke(__ruby__.getCurrentContext(), __this__, "on_configuration_changed", JavaUtil.convertJavaToRuby(__ruby__, arg0));
|
212
|
+
} catch (RaiseException re) {
|
213
|
+
re.printStackTrace(__ruby__.getErrorStream());
|
214
|
+
|
215
|
+
}
|
216
|
+
}
|
217
|
+
}
|
218
|
+
|
219
|
+
public android.os.IBinder onBind(android.content.Intent arg0) {
|
220
|
+
if (callbackOptions[CB_BIND]) {
|
221
|
+
|
222
|
+
try {
|
223
|
+
return (android.os.IBinder)RuntimeHelpers.invoke(__ruby__.getCurrentContext(), __this__, "on_bind", JavaUtil.convertJavaToRuby(__ruby__, arg0)).toJava(android.os.IBinder.class);
|
224
|
+
} catch (RaiseException re) {
|
225
|
+
re.printStackTrace(__ruby__.getErrorStream());
|
226
|
+
return null;
|
227
|
+
}
|
228
|
+
} else {
|
229
|
+
return null;
|
230
|
+
}
|
231
|
+
}
|
232
|
+
|
233
|
+
}
|
@@ -0,0 +1,30 @@
|
|
1
|
+
package org.ruboto;
|
2
|
+
|
3
|
+
import android.content.Context;
|
4
|
+
import android.graphics.Canvas;
|
5
|
+
import android.util.AttributeSet;
|
6
|
+
import android.view.View;
|
7
|
+
|
8
|
+
public class RubotoView extends View {
|
9
|
+
public RubotoView(Context context) {
|
10
|
+
super(context);
|
11
|
+
}
|
12
|
+
|
13
|
+
public RubotoView(Context context, AttributeSet attrs) {
|
14
|
+
super(context, attrs);
|
15
|
+
}
|
16
|
+
|
17
|
+
public RubotoView(Context context, AttributeSet attrs, int defStyle) {
|
18
|
+
super(context, attrs, defStyle);
|
19
|
+
}
|
20
|
+
|
21
|
+
@Override
|
22
|
+
protected void onDraw(Canvas canvas) {
|
23
|
+
((RubotoActivity) getContext()).onDraw(this, canvas);
|
24
|
+
}
|
25
|
+
|
26
|
+
@Override
|
27
|
+
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
|
28
|
+
((RubotoActivity) getContext()).onSizeChanged(this, w, h, oldw, oldh);
|
29
|
+
}
|
30
|
+
}
|
@@ -0,0 +1,231 @@
|
|
1
|
+
package org.ruboto;
|
2
|
+
|
3
|
+
import java.io.BufferedReader;
|
4
|
+
import java.io.BufferedWriter;
|
5
|
+
import java.io.BufferedOutputStream;
|
6
|
+
import java.io.File;
|
7
|
+
import java.io.FileReader;
|
8
|
+
import java.io.FileWriter;
|
9
|
+
import java.io.FilenameFilter;
|
10
|
+
import java.io.FileOutputStream;
|
11
|
+
import java.io.IOException;
|
12
|
+
import java.io.PrintStream;
|
13
|
+
import java.io.InputStream;
|
14
|
+
import java.io.OutputStream;
|
15
|
+
import java.util.ArrayList;
|
16
|
+
import java.util.Arrays;
|
17
|
+
import java.util.List;
|
18
|
+
|
19
|
+
import org.jruby.Ruby;
|
20
|
+
import org.jruby.RubyInstanceConfig;
|
21
|
+
import org.jruby.exceptions.RaiseException;
|
22
|
+
import org.jruby.javasupport.JavaUtil;
|
23
|
+
import org.jruby.parser.EvalStaticScope;
|
24
|
+
import org.jruby.runtime.DynamicScope;
|
25
|
+
import org.jruby.runtime.ThreadContext;
|
26
|
+
import org.jruby.runtime.scope.ManyVarsDynamicScope;
|
27
|
+
|
28
|
+
import android.os.Environment;
|
29
|
+
import android.util.Log;
|
30
|
+
import android.content.res.AssetManager;
|
31
|
+
import org.apache.http.client.methods.HttpGet;
|
32
|
+
import org.apache.http.impl.client.BasicResponseHandler;
|
33
|
+
import org.apache.http.impl.client.DefaultHttpClient;
|
34
|
+
|
35
|
+
public class Script {
|
36
|
+
private static String scriptsDir = "scripts";
|
37
|
+
private static File scriptsDirFile = null;
|
38
|
+
|
39
|
+
private String name = null;
|
40
|
+
private static Ruby ruby;
|
41
|
+
private static DynamicScope scope;
|
42
|
+
private static boolean initialized = false;
|
43
|
+
|
44
|
+
private String contents = null;
|
45
|
+
|
46
|
+
public static final String TAG = "RUBOTO"; //for logging
|
47
|
+
|
48
|
+
/*************************************************************************************************
|
49
|
+
*
|
50
|
+
* Static Methods: JRuby Execution
|
51
|
+
*/
|
52
|
+
|
53
|
+
public static final FilenameFilter RUBY_FILES = new FilenameFilter() {
|
54
|
+
public boolean accept(File dir, String fname) {
|
55
|
+
return fname.endsWith(".rb");
|
56
|
+
}
|
57
|
+
};
|
58
|
+
|
59
|
+
public static boolean initialized() {
|
60
|
+
return initialized;
|
61
|
+
}
|
62
|
+
|
63
|
+
public static synchronized Ruby setUpJRuby(PrintStream out) {
|
64
|
+
if (ruby == null) {
|
65
|
+
RubyInstanceConfig config = new RubyInstanceConfig();
|
66
|
+
config.setCompileMode(RubyInstanceConfig.CompileMode.OFF);
|
67
|
+
|
68
|
+
config.setLoader(Script.class.getClassLoader());
|
69
|
+
if (scriptsDir != null) config.setCurrentDirectory(scriptsDir);
|
70
|
+
|
71
|
+
if (out != null) {
|
72
|
+
config.setOutput(out);
|
73
|
+
config.setError(out);
|
74
|
+
}
|
75
|
+
|
76
|
+
/* Set up Ruby environment */
|
77
|
+
ruby = Ruby.newInstance(config);
|
78
|
+
|
79
|
+
ThreadContext context = ruby.getCurrentContext();
|
80
|
+
DynamicScope currentScope = context.getCurrentScope();
|
81
|
+
scope = new ManyVarsDynamicScope(new EvalStaticScope(currentScope.getStaticScope()), currentScope);
|
82
|
+
|
83
|
+
initialized = true;
|
84
|
+
}
|
85
|
+
|
86
|
+
return ruby;
|
87
|
+
}
|
88
|
+
|
89
|
+
public static String execute(String code) {
|
90
|
+
if (!initialized) return null;
|
91
|
+
try {
|
92
|
+
return ruby.evalScriptlet(code, scope).inspect().asJavaString();
|
93
|
+
} catch (RaiseException re) {
|
94
|
+
re.printStackTrace(ruby.getErrorStream());
|
95
|
+
return null;
|
96
|
+
}
|
97
|
+
}
|
98
|
+
|
99
|
+
public static void defineGlobalConstant(String name, Object object) {
|
100
|
+
ruby.defineGlobalConstant(name, JavaUtil.convertJavaToRuby(ruby, object));
|
101
|
+
}
|
102
|
+
|
103
|
+
public static void defineGlobalVariable(String name, Object object) {
|
104
|
+
ruby.getGlobalVariables().set(name, JavaUtil.convertJavaToRuby(ruby, object));
|
105
|
+
}
|
106
|
+
|
107
|
+
public static Ruby getRuby() {
|
108
|
+
return ruby;
|
109
|
+
}
|
110
|
+
|
111
|
+
/*************************************************************************************************
|
112
|
+
*
|
113
|
+
* Static Methods: Scripts Directory
|
114
|
+
*/
|
115
|
+
|
116
|
+
public static void setDir(String dir) {
|
117
|
+
scriptsDir = dir;
|
118
|
+
scriptsDirFile = new File(dir);
|
119
|
+
if (ruby != null) ruby.setCurrentDirectory(scriptsDir);
|
120
|
+
}
|
121
|
+
|
122
|
+
public static String getDir() {
|
123
|
+
return scriptsDir;
|
124
|
+
}
|
125
|
+
|
126
|
+
public static File getDirFile() {
|
127
|
+
return scriptsDirFile;
|
128
|
+
}
|
129
|
+
|
130
|
+
public static Boolean configDir(String noSdcard) {
|
131
|
+
setDir(noSdcard);
|
132
|
+
|
133
|
+
/* Create directory if it doesn't exist */
|
134
|
+
if (!scriptsDirFile.exists()) {
|
135
|
+
// TODO check return code
|
136
|
+
scriptsDirFile.mkdir();
|
137
|
+
return true;
|
138
|
+
}
|
139
|
+
|
140
|
+
return false;
|
141
|
+
}
|
142
|
+
|
143
|
+
private static void copyScripts(String from, File to, AssetManager assets) {
|
144
|
+
try {
|
145
|
+
byte[] buffer = new byte[8192];
|
146
|
+
for (String f : assets.list(from)) {
|
147
|
+
File dest = new File(to, f);
|
148
|
+
|
149
|
+
if (dest.exists())
|
150
|
+
continue;
|
151
|
+
|
152
|
+
Log.d(TAG, "copying file " + f);
|
153
|
+
|
154
|
+
InputStream is = assets.open(from+ "/" +f);
|
155
|
+
OutputStream fos = new BufferedOutputStream(new FileOutputStream(dest));
|
156
|
+
|
157
|
+
int n;
|
158
|
+
while ((n = is.read(buffer, 0, buffer.length)) != -1)
|
159
|
+
fos.write(buffer, 0, n);
|
160
|
+
|
161
|
+
is.close();
|
162
|
+
fos.close();
|
163
|
+
}
|
164
|
+
} catch (IOException iox) {
|
165
|
+
Log.e(TAG, "error copying demo scripts", iox);
|
166
|
+
}
|
167
|
+
}
|
168
|
+
|
169
|
+
public static void copyScriptsIfNeeded(String to, AssetManager assets) {
|
170
|
+
/* the if makes sure we only do this the first time */
|
171
|
+
if (configDir(to))
|
172
|
+
copyScripts("scripts", scriptsDirFile, assets);
|
173
|
+
}
|
174
|
+
|
175
|
+
|
176
|
+
/*************************************************************************************************
|
177
|
+
*
|
178
|
+
* Constructors
|
179
|
+
*/
|
180
|
+
|
181
|
+
public Script(String name) {
|
182
|
+
this(name, null);
|
183
|
+
}
|
184
|
+
|
185
|
+
public Script(String name, String contents) {
|
186
|
+
this.name = name;
|
187
|
+
this.contents = contents;
|
188
|
+
File file = getFile();
|
189
|
+
}
|
190
|
+
|
191
|
+
/*************************************************************************************************
|
192
|
+
*
|
193
|
+
* Attribute Access
|
194
|
+
*/
|
195
|
+
|
196
|
+
public String getName() {
|
197
|
+
return name;
|
198
|
+
}
|
199
|
+
|
200
|
+
public File getFile() {
|
201
|
+
return new File(getDir(), name);
|
202
|
+
}
|
203
|
+
|
204
|
+
public Script setName(String name) {
|
205
|
+
this.name = name;
|
206
|
+
// TODO: Other states possible
|
207
|
+
return this;
|
208
|
+
}
|
209
|
+
|
210
|
+
public String getContents() throws IOException {
|
211
|
+
BufferedReader buffer = new BufferedReader(new FileReader(getFile()));
|
212
|
+
StringBuilder source = new StringBuilder();
|
213
|
+
while (true) {
|
214
|
+
String line = buffer.readLine();
|
215
|
+
if (line == null) break;
|
216
|
+
source.append(line).append("\n");
|
217
|
+
}
|
218
|
+
buffer.close();
|
219
|
+
contents = source.toString();
|
220
|
+
return contents;
|
221
|
+
}
|
222
|
+
|
223
|
+
/*************************************************************************************************
|
224
|
+
*
|
225
|
+
* Script Actions
|
226
|
+
*/
|
227
|
+
|
228
|
+
public String execute() throws IOException {
|
229
|
+
return Script.execute(getContents());
|
230
|
+
}
|
231
|
+
}
|