rhodes 1.4.1 → 1.4.2

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/CHANGELOG CHANGED
@@ -1,3 +1,13 @@
1
+ == 1.4.2
2
+ * Fix for BB push data
3
+ * Fix issue #2547236 - BB map: incorrect drawing of world bounds (90N/90S, 180W/180E)
4
+ * Fix issue #2539966 - System::get_property('platform') on Android is UNKNOWN
5
+ * Fix issue #2540390 - blackberry map causes exception
6
+ * Fix issue #2547920 - update attributes on new object doesn't call updateobjects
7
+ * Fix issue #2561942 - BB Map: crash in case of wrong input parameters
8
+ * Fix issue #2561958 - iPhone map: crash in case of wrong input parameters
9
+ * Fix issue #2581678 - Android: GPS updates does not work
10
+
1
11
  == 1.4.1
2
12
  * fixed issue with empty cookie check failing
3
13
 
@@ -1,9 +1,9 @@
1
1
  module Rhodes
2
2
  unless defined? Rhodes::VERSION
3
- VERSION = '1.4.1'
3
+ VERSION = '1.4.2'
4
4
  end
5
5
  unless defined? Rhodes::DBVERSION
6
- DBVERSION = '1.4.1'
6
+ DBVERSION = '1.4.2'
7
7
  end
8
8
 
9
9
  end
@@ -1,8 +1,8 @@
1
1
  module RhodesFramework
2
2
  unless defined? RhodesFramework::VERSION
3
- VERSION = '1.4.1'
3
+ VERSION = '1.4.2'
4
4
  end
5
5
  unless defined? RhodesFramework::DBVERSION
6
- DBVERSION = '1.4.1'
6
+ DBVERSION = '1.4.2'
7
7
  end
8
8
  end
data/lib/rhodes.rb CHANGED
@@ -1,9 +1,9 @@
1
1
  module Rhodes
2
2
  unless defined? Rhodes::VERSION
3
- VERSION = '1.4.1'
3
+ VERSION = '1.4.2'
4
4
  end
5
5
  unless defined? Rhodes::DBVERSION
6
- DBVERSION = '1.4.1'
6
+ DBVERSION = '1.4.2'
7
7
  end
8
8
 
9
9
  end
@@ -1,8 +1,8 @@
1
1
  <?xml version="1.0" encoding="utf-8"?>
2
2
  <manifest xmlns:android="http://schemas.android.com/apk/res/android"
3
3
  package="com.rhomobile.rhodes"
4
- android:versionCode="19"
5
- android:versionName="1.4.1">
4
+ android:versionCode="21"
5
+ android:versionName="1.4.2">
6
6
  <uses-sdk android:minSdkVersion="3"></uses-sdk>
7
7
  <application android:icon="@drawable/icon" android:multiprocess="true" android:allowTaskReparenting="true" android:debuggable="true"
8
8
  finishOnTaskLaunch="true" android:label="@string/app_name">
@@ -13,15 +13,13 @@ import android.os.Looper;
13
13
  public class GeoLocationImpl implements LocationListener {
14
14
 
15
15
  private static final String TAG = "GeoLocationImpl";
16
+ private static final String PROVIDER = LocationManager.GPS_PROVIDER;
16
17
  private LocationManager locationManager;
17
18
  private double longitude = 0;
18
19
  private double latitude = 0;
19
20
  private boolean determined = false;
20
-
21
+
21
22
  public GeoLocationImpl() {
22
-
23
- Looper.prepare();
24
-
25
23
  setCurrentGpsLocation(null);
26
24
  }
27
25
 
@@ -29,13 +27,10 @@ public class GeoLocationImpl implements LocationListener {
29
27
  Logger.T(TAG, "GeoLocationImpl.setCurrentGpsLocation");
30
28
  try {
31
29
  if (location == null) {
32
- locationManager = (LocationManager) RhodesInstance
33
- .getInstance().getSystemService(
34
- Context.LOCATION_SERVICE);
35
- locationManager.requestLocationUpdates(
36
- LocationManager.GPS_PROVIDER, 0, 0, this);
37
- location = locationManager
38
- .getLastKnownLocation(LocationManager.GPS_PROVIDER);
30
+ locationManager = (LocationManager) RhodesInstance.getInstance()
31
+ .getSystemService(Context.LOCATION_SERVICE);
32
+ locationManager.requestLocationUpdates(PROVIDER, 0, 0, this, Looper.getMainLooper());
33
+ location = locationManager.getLastKnownLocation(PROVIDER);
39
34
  }
40
35
  if (location != null) {
41
36
  longitude = location.getLongitude();
@@ -45,8 +40,7 @@ public class GeoLocationImpl implements LocationListener {
45
40
  determined = false;
46
41
  }
47
42
 
48
- Logger.T(TAG, "gps enabled: " + new Boolean(locationManager.isProviderEnabled(
49
- LocationManager.GPS_PROVIDER)).toString());
43
+ Logger.T(TAG, "gps enabled: " + new Boolean(locationManager.isProviderEnabled(PROVIDER)).toString());
50
44
  Logger.T(TAG, "determined: " + new Boolean(determined).toString());
51
45
  if (determined) {
52
46
  Logger.T(TAG, "longitude: " + new Double(longitude).toString());
@@ -93,7 +93,7 @@ public class PushListeningThread extends Thread {
93
93
  }
94
94
 
95
95
  try{
96
- processPushMessage(data);
96
+ processPushMessage(data, db.getLength());
97
97
  }catch(Exception exc)
98
98
  {
99
99
  LOG.ERROR("processPushMessage failed.Data: " + new String(data), exc);
@@ -219,14 +219,14 @@ public class PushListeningThread extends Thread {
219
219
  RhodesApplication.getInstance().play_file(file_name, media_type);
220
220
  }
221
221
 
222
- private void processPushMessage(final byte[] data)
222
+ private void processPushMessage(final byte[] data, int nLen)
223
223
  {
224
224
  /* Application.getApplication().invokeLater(new Runnable()
225
225
  {
226
226
  public void run()
227
227
  {*/
228
- String msg = new String(data);
229
- LOG.INFO("Triger sync on PUSH message [" + msg + " ]\n");
228
+ String msg = new String(data, 0, nLen);
229
+ LOG.INFO("Triger sync on PUSH message [" + msg + " ]");
230
230
 
231
231
  String[] op;
232
232
  String[] ops = split(msg,"\n");
@@ -60,7 +60,8 @@ public class GoogleMapField extends Field implements RhoMapField {
60
60
 
61
61
  // Mode of decoding EncodedImage to bitmap
62
62
  private static final int DECODE_MODE = EncodedImage.DECODE_NATIVE |
63
- EncodedImage.DECODE_NO_DITHER | EncodedImage.DECODE_READONLY;
63
+ EncodedImage.DECODE_NO_DITHER | EncodedImage.DECODE_READONLY |
64
+ EncodedImage.DECODE_ALPHA;
64
65
 
65
66
  // Static google parameters
66
67
  private static final int MIN_ZOOM = 0;
@@ -69,6 +70,7 @@ public class GoogleMapField extends Field implements RhoMapField {
69
70
  private static final int MAX_GOOGLE_TILE_SIZE = 640;
70
71
 
71
72
  // Constants required to coordinates calculations
73
+ private static final long MIN_LATITUDE = degreesToPixelsY(90, MAX_ZOOM);
72
74
  private static final long MAX_LATITUDE = degreesToPixelsY(-90, MAX_ZOOM);
73
75
  private static final long MAX_LONGITUDE = degreesToPixelsX(180, MAX_ZOOM);
74
76
 
@@ -81,8 +83,8 @@ public class GoogleMapField extends Field implements RhoMapField {
81
83
 
82
84
  //===============================================================================
83
85
  // Coordinates of center in pixels of maximum zoom level
84
- private long latitude = 0;
85
- private long longitude = 0;
86
+ private long latitude = degreesToPixelsY(0, MAX_ZOOM);
87
+ private long longitude = degreesToPixelsX(0, MAX_ZOOM);
86
88
  private int zoom = 0;
87
89
 
88
90
  private int tileSize;
@@ -343,7 +345,8 @@ public class GoogleMapField extends Field implements RhoMapField {
343
345
  url.append("&zoom=" + cmd.zoom);
344
346
  url.append("&size=" + cmd.width + "x" + cmd.height);
345
347
  url.append("&maptype=" + cmd.maptype);
346
- url.append("&format=png&mobile=true&sensor=false");
348
+ url.append("&format=png&sensor=false");
349
+ url.append("&mobile=" + (cmd.maptype.equals("roadmap") ? "true" : "false"));
347
350
  url.append("&key=" + mapkey);
348
351
  if (!cmd.annotations.isEmpty()) {
349
352
  url.append("&markers=color:blue");
@@ -682,6 +685,8 @@ public class GoogleMapField extends Field implements RhoMapField {
682
685
  }
683
686
 
684
687
  private String makeCacheKey(long lat, long lon, int z) {
688
+ while (lon < 0) lon += MAX_LONGITUDE;
689
+ while (lon > MAX_LONGITUDE) lon -= MAX_LONGITUDE;
685
690
  long x = lon/tileSize;
686
691
  long y = lat/tileSize;
687
692
  StringBuffer buf = new StringBuffer();
@@ -835,15 +840,8 @@ public class GoogleMapField extends Field implements RhoMapField {
835
840
  }
836
841
 
837
842
  private void validateCoordinates() {
838
- if (latitude < 0) latitude = 0;
843
+ if (latitude < MIN_LATITUDE) latitude = MIN_LATITUDE;
839
844
  if (latitude > MAX_LATITUDE) latitude = MAX_LATITUDE;
840
- if (longitude < 0) longitude = 0;
841
- if (longitude > MAX_LONGITUDE) longitude = MAX_LONGITUDE;
842
- }
843
-
844
- private void validateZoom() {
845
- if (zoom < MIN_ZOOM) zoom = MIN_ZOOM;
846
- if (zoom > MAX_ZOOM) zoom = MAX_ZOOM;
847
845
  }
848
846
 
849
847
  public void moveTo(double lat, double lon) {
@@ -876,8 +874,9 @@ public class GoogleMapField extends Field implements RhoMapField {
876
874
 
877
875
  public void setZoom(int z) {
878
876
  zoom = z;
879
- validateZoom();
880
- lastFetchCommandSent = 0;
877
+ if (zoom < MIN_ZOOM) zoom = MIN_ZOOM;
878
+ if (zoom > MAX_ZOOM) zoom = MAX_ZOOM;
879
+ lastFetchCommandSent = System.currentTimeMillis() + CACHE_UPDATE_INTERVAL;
881
880
  }
882
881
 
883
882
  public int calculateZoom(double latDelta, double lonDelta) {
@@ -892,6 +891,8 @@ public class GoogleMapField extends Field implements RhoMapField {
892
891
  }
893
892
 
894
893
  public void addAnnotation(Annotation ann) {
894
+ if (ann.street_address == null && ann.coordinates == null)
895
+ return;
895
896
  if (ann.coordinates != null) {
896
897
  long nlat = degreesToPixelsY(ann.coordinates.latitude, MAX_ZOOM);
897
898
  long nlon = degreesToPixelsX(ann.coordinates.longitude, MAX_ZOOM);
@@ -936,8 +937,8 @@ public class GoogleMapField extends Field implements RhoMapField {
936
937
  }
937
938
 
938
939
  private static long degreesToPixelsX(double n, int z) {
939
- if (n < -180.0) n = -180.0;
940
- if (n > 180.0) n = 180.0;
940
+ while (n < -180.0) n += 360.0;
941
+ while (n > 180.0) n -= 360.0;
941
942
  double angleRatio = 360/math_pow(2, z);
942
943
  double val = (n + 180)*GOOGLE_TILE_SIZE/angleRatio;
943
944
  return (long)val;
@@ -957,16 +958,14 @@ public class GoogleMapField extends Field implements RhoMapField {
957
958
  }
958
959
 
959
960
  private static double pixelsToDegreesX(long n, int z) {
960
- if (n < 0) n = 0;
961
- if (n > MAX_LONGITUDE) n = MAX_LONGITUDE;
961
+ while (n < 0) n += MAX_LONGITUDE;
962
+ while (n > MAX_LONGITUDE) n -= MAX_LONGITUDE;
962
963
  double angleRatio = 360/math_pow(2, z);
963
964
  double val = n*angleRatio/GOOGLE_TILE_SIZE - 180.0;
964
965
  return val;
965
966
  }
966
967
 
967
968
  private static double pixelsToDegreesY(long n, int z) {
968
- if (n < 0) n = 0;
969
- if (n > MAX_LATITUDE) n = MAX_LATITUDE;
970
969
  // Revert calculation of Merkator projection
971
970
  double ath = PI - 2*PI*n/(GOOGLE_TILE_SIZE*math_pow(2, z));
972
971
  double th = math_tanh(ath);
@@ -16,6 +16,7 @@ import com.xruby.runtime.lang.RubyConstant;
16
16
  import com.xruby.runtime.lang.RubyException;
17
17
  import com.xruby.runtime.lang.RubyOneArgMethod;
18
18
  import com.xruby.runtime.lang.RubyRuntime;
19
+ import com.xruby.runtime.lang.RubySymbol;
19
20
  import com.xruby.runtime.lang.RubyTwoArgMethod;
20
21
  import com.xruby.runtime.lang.RubyValue;
21
22
  import com.xruby.runtime.lang.RubyVarArgMethod;
@@ -72,11 +73,23 @@ public class MapView extends RubyBasic {
72
73
  RubyArray arKeys = hash.keys();
73
74
  RubyArray arValues = hash.values();
74
75
  for (int i = 0; i != arKeys.size(); ++i) {
75
- String strKey = arKeys.get(i).toString();
76
- if (strKey.equals("settings"))
77
- settingsHash = (RubyHash)arValues.get(i);
78
- else if (strKey.equals("annotations"))
79
- annotationsArray = (RubyArray)arValues.get(i);
76
+ RubyValue key = arKeys.get(i);
77
+ RubyValue value = arValues.get(i);
78
+ if (key == null || value == null)
79
+ continue;
80
+ String strKey = key.toString();
81
+ if (strKey.equals("settings")) {
82
+ if (!(value instanceof RubyHash))
83
+ throw new RubyException(RubyRuntime.ArgumentErrorClass,
84
+ "Wrong 'settings' type, should be Hash");
85
+ settingsHash = (RubyHash)value;
86
+ }
87
+ else if (strKey.equals("annotations")) {
88
+ if (!(value instanceof RubyArray))
89
+ throw new RubyException(RubyRuntime.ArgumentErrorClass,
90
+ "Wrong 'annotations' type, should be Array");
91
+ annotationsArray = (RubyArray)value;
92
+ }
80
93
  }
81
94
  }
82
95
 
@@ -84,24 +97,47 @@ public class MapView extends RubyBasic {
84
97
  RubyArray arKeys = settingsHash.keys();
85
98
  RubyArray arValues = settingsHash.values();
86
99
  for (int i = 0; i != arKeys.size(); ++i) {
87
- String strKey = arKeys.get(i).toString();
100
+ RubyValue key = arKeys.get(i);
88
101
  RubyValue value = arValues.get(i);
89
- if (strKey.equals("map_type"))
90
- settings.put(strKey, value.toString());
102
+ if (key == null || value == null)
103
+ continue;
104
+ String strKey = key.toString();
105
+ if (strKey.equals("map_type")) {
106
+ String strValue = value.toString();
107
+ if (!strValue.equals("roadmap") && !strValue.equals("satellite")
108
+ && !strValue.equals("terrain") && !strValue.equals("hybrid"))
109
+ throw new RubyException(RubyRuntime.ArgumentErrorClass,
110
+ "Wrong 'map_type' value: " + strValue);
111
+ settings.put(strKey, strValue);
112
+ }
91
113
  else if (strKey.equals("zoom_enabled"))
92
- settings.put(strKey, new Boolean(((RubyConstant)value).isTrue()));
114
+ settings.put(strKey, new Boolean(value.toString().equalsIgnoreCase("true")));
93
115
  else if (strKey.equals("scroll_enabled"))
94
- settings.put(strKey, new Boolean(((RubyConstant)value).isTrue()));
116
+ settings.put(strKey, new Boolean(value.toString().equalsIgnoreCase("true")));
95
117
  else if (strKey.equals("shows_user_location"))
96
- settings.put(strKey, new Boolean(((RubyConstant)value).isTrue()));
118
+ settings.put(strKey, new Boolean(value.toString().equalsIgnoreCase("true")));
97
119
  else if (strKey.equals("region")) {
120
+ if (!(value instanceof RubyArray))
121
+ throw new RubyException(RubyRuntime.ArgumentErrorClass,
122
+ "Wrong 'region' type, should be Array");
98
123
  RubyArray arr = (RubyArray)value;
99
124
  if (arr.size() == 4) {
100
125
  Hashtable region = new Hashtable();
101
- region.put("latitude", new Double(arr.get(0).toFloat()));
102
- region.put("longitude", new Double(arr.get(1).toFloat()));
103
- region.put("latDelta", new Double(arr.get(2).toFloat()));
104
- region.put("lonDelta", new Double(arr.get(3).toFloat()));
126
+ double[] cs = {0.0, 0.0, 0.0, 0.0};
127
+ for (int k = 0; k != 4; ++k) {
128
+ String v = arr.get(k).toString();
129
+ try {
130
+ cs[k] = Double.parseDouble(v);
131
+ }
132
+ catch (NumberFormatException e) {
133
+ throw new RubyException(RubyRuntime.ArgumentErrorClass,
134
+ "Wrong region value: " + v + ", should be Float");
135
+ }
136
+ }
137
+ region.put("latitude", new Double(cs[0]));
138
+ region.put("longitude", new Double(cs[1]));
139
+ region.put("latDelta", new Double(cs[2]));
140
+ region.put("lonDelta", new Double(cs[3]));
105
141
  settings.put(strKey, region);
106
142
  }
107
143
  }
@@ -111,34 +147,60 @@ public class MapView extends RubyBasic {
111
147
  if (annotationsArray != null) {
112
148
  for (int i = 0; i != annotationsArray.size(); ++i) {
113
149
  Annotation annotation = new Annotation();
114
- RubyHash ann = (RubyHash)annotationsArray.get(i);
150
+ RubyValue val = annotationsArray.get(i);
151
+ if (!(val instanceof RubyHash))
152
+ throw new RubyException(RubyRuntime.ArgumentErrorClass,
153
+ "Wrong annotation value type, should be Hash");
154
+ RubyHash ann = (RubyHash)val;
115
155
  RubyArray arKeys = ann.keys();
116
156
  RubyArray arValues = ann.values();
117
157
  for (int j = 0, lim = arKeys.size(); j < lim; ++j) {
118
- String strKey = arKeys.get(j).toString();
158
+ RubyValue key = arKeys.get(j);
119
159
  RubyValue value = arValues.get(j);
160
+ if (key == null || value == null ||
161
+ key.equals(RubyConstant.QNIL) ||
162
+ value.equals(RubyConstant.QNIL))
163
+ continue;
164
+ String strKey = key.toString();
165
+ String strValue = value.toString();
120
166
  if (strKey.equals("latitude")) {
167
+ double v;
168
+ try {
169
+ v = Double.parseDouble(strValue);
170
+ }
171
+ catch (NumberFormatException e) {
172
+ throw new RubyException(RubyRuntime.ArgumentErrorClass,
173
+ "Wrong 'latitude' parameter: " + strValue + ", should be Float");
174
+ }
121
175
  if (annotation.coordinates == null)
122
- annotation.coordinates = new Annotation.Coordinates(value.toFloat(), 0);
176
+ annotation.coordinates = new Annotation.Coordinates(v, 0);
123
177
  else
124
- annotation.coordinates.latitude = value.toFloat();
178
+ annotation.coordinates.latitude = v;
125
179
  }
126
180
  else if (strKey.equals("longitude")) {
181
+ double v;
182
+ try {
183
+ v = Double.parseDouble(strValue);
184
+ }
185
+ catch (NumberFormatException e) {
186
+ throw new RubyException(RubyRuntime.ArgumentErrorClass,
187
+ "Wrong 'longitude' parameter: " + strValue + ", should be Float");
188
+ }
127
189
  if (annotation.coordinates == null)
128
- annotation.coordinates = new Annotation.Coordinates(0, value.toFloat());
190
+ annotation.coordinates = new Annotation.Coordinates(0, v);
129
191
  else
130
- annotation.coordinates.longitude = value.toFloat();
192
+ annotation.coordinates.longitude = v;
131
193
  }
132
194
  else if (strKey.equals("title"))
133
- annotation.title = value.toString();
195
+ annotation.title = strValue;
134
196
  else if (strKey.equals("subtitle"))
135
- annotation.subtitle = value.toString();
197
+ annotation.subtitle = strValue;
136
198
  else if (strKey.equals("street_address"))
137
- annotation.street_address = value.toString();
199
+ annotation.street_address = strValue;
138
200
  else if (strKey.equals("resolved_address"))
139
- annotation.resolved_address = value.toString();
201
+ annotation.resolved_address = strValue;
140
202
  else if (strKey.equals("url"))
141
- annotation.url = value.toString();
203
+ annotation.url = strValue;
142
204
  }
143
205
  annotations.addElement(annotation);
144
206
  }
@@ -242,38 +242,39 @@ NSMutableArray* parse_annotations(int nannotations, char** annotation) {
242
242
  }
243
243
 
244
244
  NSMutableArray* parse_settings(int nparams, char** params) {
245
- if (nparams <= 0) return [NSMutableArray arrayWithCapacity:0];
246
- NSMutableArray *settings = [NSMutableArray arrayWithCapacity:nparams];
247
- BOOL array_flag = FALSE;
248
- for(int i = 0; i < nparams; i++) {
249
- if (params[i]) {
250
- if (array_flag) {
251
- NSMutableArray *arr = [NSMutableArray arrayWithCapacity:1];
252
- char **array = (char**)params[i];
253
- while(*array) {
254
- [arr addObject:[NSString stringWithCString:*array]];
255
- array++;
256
- }
257
- array_flag = FALSE;
258
- [settings addObject:arr];
259
- } else {
260
- if (strcmp(params[i],"region")==0) {
261
- array_flag = TRUE;
262
- }
263
- [settings addObject:[NSString stringWithCString:params[i]]];
264
- printf("param %s\n", params[i]);
265
- }
266
- } else {
267
- if (array_flag) {
268
- array_flag = FALSE;
269
- NSMutableArray *arr = [NSMutableArray arrayWithCapacity:1];
270
- [settings addObject:arr];
271
- } else {
272
- [settings addObject:@""];
273
- }
274
- }
275
- }
276
- return settings;
245
+ if (nparams <= 0) return [NSMutableArray arrayWithCapacity:0];
246
+ NSMutableArray *settings = [NSMutableArray arrayWithCapacity:nparams];
247
+ BOOL array_flag = FALSE;
248
+ for(int i = 0; i < nparams; i++) {
249
+ if (params[i]) {
250
+ if (array_flag) {
251
+ NSMutableArray *arr = [NSMutableArray arrayWithCapacity:4];
252
+ char **array = (char**)params[i];
253
+ while(*array) {
254
+ char const *s = *array;
255
+ [arr addObject:[NSString stringWithCString:*array]];
256
+ array++;
257
+ printf("param %s\n", s);
258
+ }
259
+ array_flag = FALSE;
260
+ [settings addObject:arr];
261
+ } else {
262
+ if (strcmp(params[i],"region")==0)
263
+ array_flag = TRUE;
264
+ [settings addObject:[NSString stringWithCString:params[i]]];
265
+ printf("param %s\n", params[i]);
266
+ }
267
+ } else {
268
+ if (array_flag) {
269
+ array_flag = FALSE;
270
+ NSMutableArray *arr = [NSMutableArray arrayWithCapacity:1];
271
+ [settings addObject:arr];
272
+ } else {
273
+ [settings addObject:@""];
274
+ }
275
+ }
276
+ }
277
+ return settings;
277
278
  }
278
279
 
279
280
  #endif
@@ -97,8 +97,10 @@ char* get_current_location() {
97
97
 
98
98
  -(void)navigateRedirect:(NSString*)url {
99
99
  //RAWLOG_INFO1("Navigate (redirect) to: %s", [url cStringUsingEncoding:[NSString defaultCStringEncoding]]);
100
- NSString* escapedUrl = [url stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
101
- NSString* redirector = [@"http://localhost:8080/system/redirect_to?url=" stringByAppendingString:escapedUrl];
100
+ NSString* escapedUrl = [url stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
101
+ NSString* homeurl = [NSString stringWithCString:rho_rhodesapp_gethomeurl() encoding:[NSString defaultCStringEncoding]];
102
+ NSString* redirector1 = [@"/system/redirect_to?url=" stringByAppendingString:escapedUrl];
103
+ NSString* redirector = [homeurl stringByAppendingString:redirector1];
102
104
  [webView loadRequest:[NSURLRequest requestWithURL: [NSURL URLWithString:redirector]]];
103
105
  }
104
106
 
@@ -21,7 +21,7 @@
21
21
  <key>CFBundleSignature</key>
22
22
  <string>????</string>
23
23
  <key>CFBundleVersion</key>
24
- <string>1.4.1</string>
24
+ <string>1.4.2</string>
25
25
  <key>LSRequiresIPhoneOS</key>
26
26
  <true/>
27
27
  <key>NSMainNibFile</key>