rhodes 5.5.0.7 → 5.5.0.22

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.
Files changed (113) hide show
  1. checksums.yaml +4 -4
  2. data/CONTRIBUTING.md +1 -1
  3. data/CREDITS +3 -3
  4. data/Rakefile +24 -0
  5. data/extensions/instrumentation/ext/platform/android/src/com/rho/instrumentation/Instrumentation.java +5 -0
  6. data/extensions/rhoconnect-push/ext/rhoconnect-push/platform/android/Rakefile +1 -1
  7. data/lib/build/jake.rb +5 -0
  8. data/lib/commonAPI/clipboard/ext.yml +17 -0
  9. data/lib/commonAPI/clipboard/ext/Clipboard.xml +49 -0
  10. data/lib/commonAPI/clipboard/ext/build +19 -0
  11. data/lib/commonAPI/clipboard/ext/build.bat +29 -0
  12. data/lib/commonAPI/clipboard/ext/platform/android/Rakefile +141 -0
  13. data/lib/commonAPI/clipboard/ext/platform/android/ext_java.files +9 -0
  14. data/lib/commonAPI/clipboard/ext/platform/android/ext_native.files +7 -0
  15. data/lib/commonAPI/clipboard/ext/platform/android/jni/Clipboard_impl.cpp +61 -0
  16. data/lib/commonAPI/clipboard/ext/platform/android/src/com/rho/clipboard/Clipboard.java +15 -0
  17. data/lib/commonAPI/clipboard/ext/platform/android/src/com/rho/clipboard/ClipboardFactory.java +18 -0
  18. data/lib/commonAPI/clipboard/ext/platform/android/src/com/rho/clipboard/ClipboardSingleton.java +146 -0
  19. data/lib/commonAPI/clipboard/ext/platform/iphone/Clipboard.xcodeproj/project.pbxproj +368 -0
  20. data/lib/commonAPI/clipboard/ext/platform/iphone/Clipboard_Prefix.pch +7 -0
  21. data/lib/commonAPI/clipboard/ext/platform/iphone/Rakefile +73 -0
  22. data/lib/commonAPI/clipboard/ext/platform/iphone/impl/Clipboard.h +11 -0
  23. data/lib/commonAPI/clipboard/ext/platform/iphone/impl/Clipboard.m +12 -0
  24. data/lib/commonAPI/clipboard/ext/platform/iphone/impl/ClipboardFactorySingleton.m +16 -0
  25. data/lib/commonAPI/clipboard/ext/platform/iphone/impl/ClipboardSetup.m +9 -0
  26. data/lib/commonAPI/clipboard/ext/platform/iphone/impl/ClipboardSingleton.h +18 -0
  27. data/lib/commonAPI/clipboard/ext/platform/iphone/impl/ClipboardSingleton.m +43 -0
  28. data/lib/commonAPI/clipboard/ext/platform/iphone/impl/readme.txt +7 -0
  29. data/lib/commonAPI/coreapi/ext/NativeTabbar.xml +3 -3
  30. data/lib/commonAPI/coreapi/ext/shared/TimerImpl.cpp +36 -27
  31. data/lib/commonAPI/coreapi/public/api/rhoapi-force.ajax.js +3 -1
  32. data/lib/commonAPI/coreapi/public/api/rhoapi.js +2 -1
  33. data/lib/commonAPI/devicesecurity/ext.yml +11 -0
  34. data/lib/commonAPI/devicesecurity/ext/DeviceSecurity.xml +91 -0
  35. data/lib/commonAPI/devicesecurity/ext/build +19 -0
  36. data/lib/commonAPI/devicesecurity/ext/build.bat +29 -0
  37. data/lib/commonAPI/devicesecurity/ext/platform/android/InbuiltValues.erb +16 -0
  38. data/lib/commonAPI/devicesecurity/ext/platform/android/Rakefile +166 -0
  39. data/lib/commonAPI/devicesecurity/ext/platform/android/ext_java.files +10 -0
  40. data/lib/commonAPI/devicesecurity/ext/platform/android/ext_native.files +7 -0
  41. data/lib/commonAPI/devicesecurity/ext/platform/android/jni/DeviceSecurity_impl.cpp +61 -0
  42. data/lib/commonAPI/devicesecurity/ext/platform/android/src/com/rho/devicesecurity/DeviceSecurity.java +14 -0
  43. data/lib/commonAPI/devicesecurity/ext/platform/android/src/com/rho/devicesecurity/DeviceSecurityFactory.java +18 -0
  44. data/lib/commonAPI/devicesecurity/ext/platform/android/src/com/rho/devicesecurity/DeviceSecuritySingleton.java +412 -0
  45. data/lib/commonAPI/devicesecurity/ext/platform/iphone/DeviceSecurity.xcodeproj/project.pbxproj +368 -0
  46. data/lib/commonAPI/devicesecurity/ext/platform/iphone/DeviceSecurity_Prefix.pch +7 -0
  47. data/lib/commonAPI/devicesecurity/ext/platform/iphone/Rakefile +73 -0
  48. data/lib/commonAPI/devicesecurity/ext/platform/iphone/impl/DeviceSecurity.h +11 -0
  49. data/lib/commonAPI/devicesecurity/ext/platform/iphone/impl/DeviceSecurity.m +12 -0
  50. data/lib/commonAPI/devicesecurity/ext/platform/iphone/impl/DeviceSecurityFactorySingleton.m +16 -0
  51. data/lib/commonAPI/devicesecurity/ext/platform/iphone/impl/DeviceSecuritySetup.m +9 -0
  52. data/lib/commonAPI/devicesecurity/ext/platform/iphone/impl/DeviceSecuritySingleton.h +19 -0
  53. data/lib/commonAPI/devicesecurity/ext/platform/iphone/impl/DeviceSecuritySingleton.m +106 -0
  54. data/lib/commonAPI/devicesecurity/ext/platform/iphone/impl/readme.txt +7 -0
  55. data/platform/android/Rhodes/src/com/rhomobile/rhodes/LocalFileProvider.java +5 -1
  56. data/platform/android/Rhodes/src/com/rhomobile/rhodes/util/Utils.java +9 -0
  57. data/platform/android/build/android.rake +42 -1
  58. data/platform/android/build/androidcommon.rb +4 -2
  59. data/platform/iphone/Classes/RhoWKWebView.m +4 -0
  60. data/platform/iphone/Classes/URLProtocol/CRhoURLProtocol.h +2 -0
  61. data/platform/iphone/Classes/URLProtocol/CRhoURLProtocol.m +195 -30
  62. data/platform/iphone/Classes/rho/net/IPhoneNetRequest.mm +91 -4
  63. data/platform/iphone/rbuild/iphone.rake +297 -231
  64. data/platform/iphone/rbuild/putsOverride.rake +8 -0
  65. data/platform/shared/common/RhoTime.cpp +81 -40
  66. data/platform/shared/common/RhodesApp.cpp +16 -18
  67. data/platform/shared/db/DBAdapter.cpp +33 -0
  68. data/platform/shared/db/DBAdapter.h +5 -0
  69. data/platform/shared/net/HttpServer.cpp +27 -1
  70. data/platform/shared/net/INetRequest.cpp +33 -6
  71. data/platform/shared/qt/rhodes/qkineticscroller.cpp +2 -2
  72. data/platform/shared/qt/rhodes/qkineticscroller_p.h +1 -1
  73. data/platform/shared/qt/rhodes/qtscrollerfilter.cpp +3 -3
  74. data/platform/shared/qt/rhodes/qtscrollevent.cpp +2 -2
  75. data/platform/shared/qt/rhodes/qwebviewkineticscroller.cpp +1 -1
  76. data/platform/shared/qt/rhodes/qwebviewkineticscroller.h +1 -1
  77. data/platform/wm/build/wm.rake +7 -3
  78. data/platform/wm/rhodes/browser/BrowserFactory.cpp +4 -6
  79. data/platform/wm/rhodes/browser/stubs.cpp +5 -0
  80. data/platform/wm/rhodes/rhodes.vcproj +31 -2
  81. data/rakefile.rb +24 -0
  82. data/res/generators/templates/application/app/Settings/home.erb +1 -1
  83. data/res/generators/templates/application/build.yml +61 -4
  84. data/res/generators/templates/application/icon/icon.png +0 -0
  85. data/res/generators/templates/application/icon/icon114.png +0 -0
  86. data/res/generators/templates/application/icon/icon120.png +0 -0
  87. data/res/generators/templates/application/icon/icon144.png +0 -0
  88. data/res/generators/templates/application/icon/icon152.png +0 -0
  89. data/res/generators/templates/application/icon/icon180.png +0 -0
  90. data/res/generators/templates/application/icon/icon57.png +0 -0
  91. data/res/generators/templates/application/icon/icon60.png +0 -0
  92. data/res/generators/templates/application/icon/icon72.png +0 -0
  93. data/res/generators/templates/application/icon/icon76.png +0 -0
  94. data/res/generators/templates/application/production/iTunesArtwork.png +0 -0
  95. data/res/generators/templates/application/production/iTunesArtwork@2x.png +0 -0
  96. data/res/generators/templates/iphone_project/Bremen7.xcodeproj/project.pbxproj +1 -0
  97. data/res/generators/templates/iphone_project/buildRhoBundle +23 -7
  98. data/res/generators/templates/iphone_project/root/Info.plist +0 -2
  99. data/res/generators/templates/iphone_project/root/iTunesArtwork +0 -0
  100. data/res/generators/templates/iphone_project/root/iTunesArtwork@2x +0 -0
  101. data/res/generators/templates/iphone_project/root/icon114.png +0 -0
  102. data/res/generators/templates/iphone_project/root/icon120.png +0 -0
  103. data/res/generators/templates/iphone_project/root/icon144.png +0 -0
  104. data/res/generators/templates/iphone_project/root/icon152.png +0 -0
  105. data/res/generators/templates/iphone_project/root/icon180.png +0 -0
  106. data/res/generators/templates/iphone_project/root/icon57.png +0 -0
  107. data/res/generators/templates/iphone_project/root/icon60.png +0 -0
  108. data/res/generators/templates/iphone_project/root/icon72.png +0 -0
  109. data/res/generators/templates/iphone_project/root/icon76.png +0 -0
  110. data/res/generators/templates/iphone_project/root/rhorunner_development.entitlements +6 -0
  111. data/rhodes.gemspec +19 -17
  112. data/version +1 -1
  113. metadata +118 -44
@@ -0,0 +1,11 @@
1
+
2
+ #import "IDeviceSecurity.h"
3
+ #import "DeviceSecurityBase.h"
4
+
5
+ @interface DeviceSecurity : DeviceSecurityBase<IDeviceSecurity> {
6
+ }
7
+
8
+
9
+
10
+
11
+ @end
@@ -0,0 +1,12 @@
1
+
2
+ #import "DeviceSecurity.h"
3
+
4
+
5
+ @implementation DeviceSecurity
6
+
7
+
8
+
9
+
10
+
11
+
12
+ @end
@@ -0,0 +1,16 @@
1
+
2
+ #import "IDeviceSecurity.h"
3
+ #import "DeviceSecurityFactoryBase.h"
4
+
5
+ static DeviceSecurityFactoryBase* ourDeviceSecurityFactory = nil;
6
+
7
+ @implementation DeviceSecurityFactorySingleton
8
+
9
+ +(id<IDeviceSecurityFactory>) getDeviceSecurityFactoryInstance {
10
+ if (ourDeviceSecurityFactory == nil) {
11
+ ourDeviceSecurityFactory = [[DeviceSecurityFactoryBase alloc] init];
12
+ }
13
+ return ourDeviceSecurityFactory;
14
+ }
15
+
16
+ @end
@@ -0,0 +1,9 @@
1
+ #import <Foundation/Foundation.h>
2
+ #include "common/app_build_capabilities.h"
3
+
4
+ extern void Init_DeviceSecurity_API();
5
+
6
+ void Init_DeviceSecurity_extension()
7
+ {
8
+ Init_DeviceSecurity_API();
9
+ }
@@ -0,0 +1,19 @@
1
+
2
+ #import "IDeviceSecurity.h"
3
+ #import "DeviceSecuritySingletonBase.h"
4
+
5
+ @interface DeviceSecuritySingleton : DeviceSecuritySingletonBase<IDeviceSecuritySingleton> {
6
+ }
7
+
8
+
9
+
10
+ -(void) isDeviceSecured:(id<IMethodResult>)methodResult;
11
+ -(void) isDeviceJailbroken:(id<IMethodResult>)methodResult;
12
+ -(void) isDeviceRooted:(id<IMethodResult>)methodResult;
13
+ -(void) isRunOnSimulator:(id<IMethodResult>)methodResult;
14
+ -(void) isDebugMode:(id<IMethodResult>)methodResult;
15
+
16
+
17
+
18
+
19
+ @end
@@ -0,0 +1,106 @@
1
+
2
+ #import "DeviceSecuritySingleton.h"
3
+ #import <UIKit/UIKit.h>
4
+
5
+ @implementation DeviceSecuritySingleton
6
+
7
+ -(BOOL) isJailbroken
8
+ {
9
+ #if !(TARGET_IPHONE_SIMULATOR)
10
+
11
+ if ([[NSFileManager defaultManager] fileExistsAtPath:@"/Applications/Cydia.app"] ||
12
+ [[NSFileManager defaultManager] fileExistsAtPath:@"/Library/MobileSubstrate/MobileSubstrate.dylib"] ||
13
+ [[NSFileManager defaultManager] fileExistsAtPath:@"/bin/bash"] ||
14
+ [[NSFileManager defaultManager] fileExistsAtPath:@"/usr/sbin/sshd"] ||
15
+ [[NSFileManager defaultManager] fileExistsAtPath:@"/etc/apt"] ||
16
+ [[NSFileManager defaultManager] fileExistsAtPath:@"/private/var/lib/apt/"] ||
17
+ [[UIApplication sharedApplication] canOpenURL:[NSURL URLWithString:@"cydia://package/com.example.package"]])
18
+ {
19
+ return YES;
20
+ }
21
+
22
+ FILE *f = NULL ;
23
+ if ((f = fopen("/bin/bash", "r")) ||
24
+ (f = fopen("/Applications/Cydia.app", "r")) ||
25
+ (f = fopen("/Library/MobileSubstrate/MobileSubstrate.dylib", "r")) ||
26
+ (f = fopen("/usr/sbin/sshd", "r")) ||
27
+ (f = fopen("/etc/apt", "r")))
28
+ {
29
+ fclose(f);
30
+ return YES;
31
+ }
32
+ fclose(f);
33
+
34
+ NSError *error;
35
+ NSString *stringToBeWritten = @"This is a test.";
36
+ [stringToBeWritten writeToFile:@"/private/jailbreak.txt" atomically:YES encoding:NSUTF8StringEncoding error:&error];
37
+ [[NSFileManager defaultManager] removeItemAtPath:@"/private/jailbreak.txt" error:nil];
38
+ if(error == nil)
39
+ {
40
+ return YES;
41
+ }
42
+
43
+ #endif
44
+
45
+ return NO;
46
+ }
47
+
48
+ -(BOOL) isSimulator {
49
+ #if !(TARGET_IPHONE_SIMULATOR)
50
+ return NO;
51
+ #else
52
+ return YES;
53
+ #endif
54
+ }
55
+
56
+ -(void) isDeviceSecured:(id<IMethodResult>)methodResult {
57
+ [methodResult setResult:[NSNumber numberWithBool:!([self isJailbroken] || [self isSimulator])]];
58
+ }
59
+
60
+ -(void) isDeviceJailbroken:(id<IMethodResult>)methodResult {
61
+ [methodResult setResult:[NSNumber numberWithBool:[self isJailbroken]]];
62
+ }
63
+
64
+ -(void) isDeviceRooted:(id<IMethodResult>)methodResult {
65
+ [methodResult setResult:[NSNumber numberWithBool:NO]];
66
+ }
67
+
68
+ -(void) isRunOnSimulator:(id<IMethodResult>)methodResult {
69
+ [methodResult setResult:[NSNumber numberWithBool:[self isSimulator]]];
70
+ }
71
+
72
+ -(void) isDebugMode:(id<IMethodResult>)methodResult {
73
+ [methodResult setResult:[NSNumber numberWithBool:NO]];
74
+ }
75
+
76
+ -(void) getAppCertificateSignatures:(id<IMethodResult>)methodResult {
77
+ NSMutableArray *arr = [[NSMutableArray alloc] initWithCapacity:1];
78
+ [methodResult setResult:arr];
79
+ }
80
+
81
+ -(void) getAllowedCertificateSignatures:(id<IMethodResult>)methodResult {
82
+ NSMutableArray *arr = [[NSMutableArray alloc] initWithCapacity:1];
83
+ [methodResult setResult:arr];
84
+ }
85
+
86
+ -(void) getInstallerPackageName:(id<IMethodResult>)methodResult {
87
+ NSMutableArray *arr = [[NSMutableArray alloc] initWithCapacity:1];
88
+ [methodResult setResult:@""];
89
+ }
90
+
91
+ -(void) getAllowedInstallerPackages:(id<IMethodResult>)methodResult {
92
+ NSMutableArray *arr = [[NSMutableArray alloc] initWithCapacity:1];
93
+ [methodResult setResult:arr];
94
+ }
95
+
96
+ -(void) haveAnySignatureIssues:(id<IMethodResult>)methodResult {
97
+ [methodResult setResult:[NSNumber numberWithBool:NO]];
98
+ }
99
+
100
+
101
+ -(void) haveAnyInstallerIssues:(id<IMethodResult>)methodResult {
102
+ [methodResult setResult:[NSNumber numberWithBool:NO]];
103
+ }
104
+
105
+
106
+ @end
@@ -0,0 +1,7 @@
1
+ contains files with module API Implementation.
2
+
3
+ Developer should create it - after first generation this folder is empty and this folder do not changed with next generation processes !!!.
4
+
5
+ Developer should make at least <ModuleName>FactorySingleton.m with acees to <ModuleName>Factory interface!
6
+ All other files include base_impl can be removed from project if it wants by developer.
7
+ Default stub generated code placed in stub_impl folder - you can just copy all files from /generated/stub_impl to this folder and implement unemplemented methods.
@@ -137,7 +137,7 @@ public class LocalFileProvider extends ContentProvider
137
137
  }
138
138
 
139
139
  @Override
140
- public AssetFileDescriptor openAssetFile(Uri uri, String mode) {
140
+ public AssetFileDescriptor openAssetFile(Uri uri, String mode) throws FileNotFoundException {
141
141
  Logger.T(TAG, "Opening asset: " + uri);
142
142
 
143
143
  if(mode.compareTo("r") != 0)
@@ -148,6 +148,10 @@ public class LocalFileProvider extends ContentProvider
148
148
  File path = fileFromUri(uri);
149
149
 
150
150
  AssetFileDescriptor fd = RhoFileApi.openAssetFd(path.getPath());
151
+
152
+ if ( null == fd ) {
153
+ return super.openAssetFile( uri, mode );
154
+ }
151
155
 
152
156
  return fd;
153
157
  }
@@ -33,6 +33,8 @@ import java.io.FileOutputStream;
33
33
  import java.io.IOException;
34
34
  import java.io.InputStream;
35
35
  import java.io.OutputStream;
36
+ import java.io.StringWriter;
37
+ import java.io.PrintWriter;
36
38
 
37
39
  import android.content.res.AssetManager;
38
40
 
@@ -221,5 +223,12 @@ public class Utils {
221
223
  s.append(message);
222
224
  android.util.Log.v(tag, s.toString());
223
225
  }
226
+
227
+ public static String getExceptionDetails( Exception e ) {
228
+ StringWriter sw = new StringWriter();
229
+ PrintWriter pw = new PrintWriter(sw);
230
+ e.printStackTrace(pw);
231
+ return (e.toString() + "\n" + sw.toString());
232
+ }
224
233
 
225
234
  }
@@ -256,6 +256,30 @@ def find_file(file_name, path_array)
256
256
  result
257
257
  end
258
258
 
259
+ def setup_ext_env( extpath, extname )
260
+ env = {}
261
+ env['RHO_PLATFORM'] = 'android'
262
+ env["RHO_APP_DIR"] = $app_path
263
+ env["ANDROID_SDK"] = $androidsdkpath
264
+ env["ANDROID_NDK"] = $androidndkpath
265
+ env["ANDROID_API_LEVEL"] = $found_api_level.to_s
266
+ env["RHO_ROOT"] = $startdir
267
+ env["BUILD_DIR"] ||= $startdir + "/platform/android/build"
268
+ env["RHO_INC"] = $appincdir
269
+ env["RHO_RES"] = $appres
270
+ env["RHO_ANDROID_TMP_DIR"] = $tmpdir
271
+ env["RHO_DEBUG"] = $debug.to_s
272
+ env['SOURCEPATH'] = extpath
273
+ sourcelist = Dir.glob(File.join(extpath,'**','android','ext_native.files'))
274
+ env['SOURCELIST'] = sourcelist.size == 1 ? sourcelist.first : File.join(extpath,'ext_native.files')
275
+ env["TARGET_TEMP_DIR"] = File.join($app_builddir, 'extensions', extname)
276
+ env['TARGETPATH'] = File.join($app_builddir, 'extensions', extname)
277
+ env['TARGETLIB'] = "lib#{extname}.a"
278
+ env['TEMP_FILES_DIR'] = File.join($tmpdir, extname)
279
+
280
+ env
281
+ end
282
+
259
283
  namespace "config" do
260
284
  task :set_android_platform do
261
285
  $current_platform = "android"
@@ -709,6 +733,8 @@ namespace "config" do
709
733
  manifest_changes = extconf["android_manifest_changes"]
710
734
  manifest_changes = extconf_android['manifest_changes'] if manifest_changes.nil? and extconf_android
711
735
 
736
+ prebuild_rake_task = extconf_android['prebuild_rake_task'] if extconf_android
737
+
712
738
  if manifest_changes
713
739
  manifest_changes = [manifest_changes] unless manifest_changes.is_a? Array
714
740
  manifest_changes.map! { |path| File.join(extpath,path) }
@@ -855,6 +881,13 @@ namespace "config" do
855
881
  rakepath = extpath
856
882
  end
857
883
  $ext_android_build_scripts[ext] = [rakepath, 'rake']
884
+
885
+ if prebuild_rake_task
886
+ args = [ prebuild_rake_task ]
887
+ args << '--trace' if USE_TRACES
888
+ cc_run( 'rake', args, rakepath, true, setup_ext_env( extpath, ext ) ) or raise "Extension prebuild failed: #{extpath}"
889
+ end
890
+
858
891
  elsif exttype != 'prebuilt'
859
892
  build_script = File.join(extpath,'ext','build'+$bat_ext)
860
893
  if File.exists? build_script
@@ -2245,11 +2278,19 @@ namespace "package" do
2245
2278
  end
2246
2279
 
2247
2280
  # Workaround: manually add files starting with '_' because aapt silently ignore such files when creating package
2281
+ args = [ USE_TRACES ? "uvf" : "uf", resourcepkg]
2282
+
2283
+ skip_underscores = true
2284
+
2248
2285
  Dir.glob(File.join($appassets, "**/*")).each do |f|
2249
2286
  next unless File.basename(f) =~ /^_/
2250
2287
  relpath = Pathname.new(f).relative_path_from(Pathname.new($tmpdir)).to_s
2251
2288
  puts "Add #{relpath} to #{resourcepkg}..."
2252
- args = ["uf", resourcepkg, relpath]
2289
+ args << relpath
2290
+ skip_underscores = false
2291
+ end
2292
+
2293
+ unless skip_underscores
2253
2294
  Jake.run($jarbin, args, $tmpdir)
2254
2295
  unless $?.success?
2255
2296
  raise "Error packaging assets"
@@ -313,7 +313,7 @@ def cc_deps(filename, objdir, additional)
313
313
  out.split(/\s+/)
314
314
  end
315
315
 
316
- def cc_run(command, args, chdir = nil, coloring = true)
316
+ def cc_run(command, args, chdir = nil, coloring = true, env = nil)
317
317
  save_cwd = FileUtils.pwd
318
318
  FileUtils.cd chdir unless chdir.nil?
319
319
  argv = [command]
@@ -325,6 +325,8 @@ def cc_run(command, args, chdir = nil, coloring = true)
325
325
  winName = `WMIC OS get Name`
326
326
  isWinXP = true if winName =~ /Windows XP/
327
327
  end
328
+
329
+ env = ENV unless env
328
330
 
329
331
  if isWinXP
330
332
  puts '-' * 80
@@ -332,7 +334,7 @@ def cc_run(command, args, chdir = nil, coloring = true)
332
334
  else
333
335
  out = StringIO.new
334
336
  ret = nil
335
- Open3.popen2e(cmdstr) do |i,f,t|
337
+ Open3.popen2e(env, cmdstr) do |i,f,t|
336
338
  warning = false
337
339
  error = false
338
340
  while data = f.gets
@@ -176,6 +176,10 @@
176
176
  }
177
177
 
178
178
  - (void)webView:(WKWebView *)webView didFinishNavigation:(null_unspecified WKNavigation *)navigation {
179
+ // force Ajax CommonAPI calls
180
+ NSString* jscode = @"window['__rho_nativeBridgeType']='ajax'";
181
+ [self stringByEvaluatingJavaScriptFromString:jscode];
182
+
179
183
  [delegate webViewDidFinishLoad:self];
180
184
  }
181
185
 
@@ -15,4 +15,6 @@
15
15
  @property (retain) NSMutableDictionary* httpHeaders;
16
16
  @property (retain) NSData* httpBody;
17
17
 
18
+ @property (nonatomic) BOOL isStopped;
19
+
18
20
  @end
@@ -6,6 +6,25 @@
6
6
 
7
7
  #import "common/RhoConf.h"
8
8
 
9
+
10
+ #import "logging/RhoLog.h"
11
+ #undef DEFAULT_LOGCATEGORY
12
+ #define DEFAULT_LOGCATEGORY "RhoURLProtocol"
13
+
14
+ static bool is_net_trace() {
15
+ static int res = -1;
16
+ if (res == -1) {
17
+ if (rho_conf_getBool("net_trace") ) {
18
+ res = 1;
19
+ }
20
+ else {
21
+ res = 0;
22
+ }
23
+ }
24
+ return res == 1;
25
+ }
26
+
27
+
9
28
  extern int rho_http_started();
10
29
  extern int rho_http_get_port();
11
30
 
@@ -28,6 +47,7 @@ int on_http_data_cb(http_parser* parser, const char *at, size_t length) { return
28
47
  int on_http_cb(http_parser* parser) { return 0; }
29
48
 
30
49
 
50
+
31
51
  @interface CRhoURLResponse : NSHTTPURLResponse {
32
52
 
33
53
  }
@@ -39,6 +59,16 @@ int on_http_cb(http_parser* parser) { return 0; }
39
59
 
40
60
  @implementation CRhoURLProtocol
41
61
 
62
+
63
+ -(const char*)selfIDstring {
64
+ return [[NSString stringWithFormat:@"<%p>", self] UTF8String];
65
+ }
66
+
67
+ + (const char*)requestInfo:(NSURLRequest*)req {
68
+ return [[NSString stringWithFormat:@"<NSURLRequest:<%p>, URL:[ %@ ], Headers:[ %@ ]", req, req.URL, req.allHTTPHeaderFields] UTF8String];
69
+ }
70
+
71
+
42
72
  - (void)dealloc
43
73
  {
44
74
  [httpBody release];
@@ -59,17 +89,27 @@ int on_http_cb(http_parser* parser) { return 0; }
59
89
 
60
90
  + (BOOL)canInitWithRequest:(NSURLRequest*)theRequest
61
91
  {
92
+ if (is_net_trace()) {
93
+ RAWTRACE1("$NetRequestProcess$ canInitWithRequest BEGIN: { %s }", [CRhoURLProtocol requestInfo:theRequest]);
94
+ }
95
+
62
96
  NSURL* theUrl = [theRequest URL];
63
97
  if ([[theUrl path] isEqualToString:@"/!__rhoNativeApi"]) {
64
98
 
65
99
  NSString* jsonRequestTest = [theRequest valueForHTTPHeaderField:@"__rhoNativeApiCall"];
66
100
  if (jsonRequestTest != nil) {
67
101
  //NSLog(@"$$$ process Request: [%@:%@]", [theUrl absoluteString], jsonRequestTest);
102
+ if (is_net_trace()) {
103
+ RAWTRACE("$NetRequestProcess$ canInitWithRequest END: return YES by !__rhoNativeApi prefix");
104
+ }
68
105
  return YES;
69
106
  }
70
107
  }
71
108
  #if defined(RHO_NO_RUBY_API) && defined(RHO_NO_HTTP_SERVER)
72
109
  if ([theRequest.URL.scheme isEqualToString:@"file"]) {
110
+ if (is_net_trace()) {
111
+ RAWTRACE("$NetRequestProcess$ canInitWithRequest END: return YES by file scheme when no Ruby API server");
112
+ }
73
113
  return YES;
74
114
  }
75
115
  #endif
@@ -79,10 +119,21 @@ int on_http_cb(http_parser* parser) { return 0; }
79
119
  canHandle = rho_conf_getBool("ios_direct_local_requests")!=0;
80
120
  }
81
121
 
82
- if ( canHandle && [CRhoURLProtocol isLocalURL:theUrl] ) {
83
- return YES;
122
+ if ( canHandle ) {
123
+ if (is_net_trace()) {
124
+ RAWTRACE("$NetRequestProcess$ canInitWithRequest: ios_direct_local_requests = true !");
125
+ }
126
+ if ([CRhoURLProtocol isLocalURL:theUrl]) {
127
+ if (is_net_trace()) {
128
+ RAWTRACE("$NetRequestProcess$ canInitWithRequest END: return YES URL is local !");
129
+ }
130
+ return YES;
131
+ }
84
132
  }
85
133
 
134
+ if (is_net_trace()) {
135
+ RAWTRACE("$NetRequestProcess$ canInitWithRequest END: return NO");
136
+ }
86
137
  return NO;
87
138
  }
88
139
 
@@ -91,19 +142,27 @@ int on_http_cb(http_parser* parser) { return 0; }
91
142
  return request;
92
143
  }
93
144
 
94
- - (void)startLoading
145
+ - (void)startLoadingInThread
95
146
  {
147
+ if (is_net_trace()) {
148
+ RAWTRACE2("$NetRequestProcess$ CRhoURLProtocol %s :: startLoadingInThread BEGIN: { %s }", [self selfIDstring], [CRhoURLProtocol requestInfo:[self request]]);
149
+ }
96
150
  NSURL* theUrl = [[self request] URL];
97
151
 
98
152
 
99
153
  if ([[theUrl path] isEqualToString:@"/!__rhoNativeApi"]) {
100
-
154
+ if (is_net_trace()) {
155
+ RAWTRACE1("$NetRequestProcess$ CRhoURLProtocol %s :: startLoading URL has !__rhoNativeApi", [self selfIDstring]);
156
+ }
101
157
  NSString* jsonRequestTest = [[self request] valueForHTTPHeaderField:@"__rhoNativeApiCall"];
102
158
  if (jsonRequestTest != nil) {
103
159
  NSString* responseStr = [CJSEntryPoint js_entry_point:jsonRequestTest];
104
160
  if (responseStr != nil) {
105
161
  //NSLog(@"$$$ send responce for[%@:%@] = [%@]", [theUrl absoluteString], jsonRequestTest, responseStr);
106
162
  [self sendResponseWithResponseCode:200 data:[responseStr dataUsingEncoding:NSUTF8StringEncoding]];
163
+ if (is_net_trace()) {
164
+ RAWTRACE1("$NetRequestProcess$ CRhoURLProtocol %s :: startLoading END", [self selfIDstring]);
165
+ }
107
166
  return;
108
167
  }
109
168
  }
@@ -133,12 +192,13 @@ int on_http_cb(http_parser* parser) { return 0; }
133
192
  textEncodingName:@"UTF-8"];
134
193
  response.statusCode = 200;
135
194
 
136
- [[self client] URLProtocol:self didReceiveResponse:response cacheStoragePolicy:NSURLCacheStorageNotAllowed];
137
- if (data != nil) {
138
- [[self client] URLProtocol:self didLoadData:data];
195
+ if (!self.isStopped) {
196
+ [[self client] URLProtocol:self didReceiveResponse:response cacheStoragePolicy:NSURLCacheStorageNotAllowed];
197
+ if (data != nil) {
198
+ [[self client] URLProtocol:self didLoadData:data];
199
+ }
200
+ [[self client] URLProtocolDidFinishLoading:self];
139
201
  }
140
- [[self client] URLProtocolDidFinishLoading:self];
141
-
142
202
 
143
203
  return;
144
204
  }
@@ -147,6 +207,9 @@ int on_http_cb(http_parser* parser) { return 0; }
147
207
 
148
208
  if ( [CRhoURLProtocol isLocalURL:theUrl] )
149
209
  {
210
+ if (is_net_trace()) {
211
+ RAWTRACE1("$NetRequestProcess$ CRhoURLProtocol %s :: URL is local !", [self selfIDstring]);
212
+ }
150
213
  NSURL* url = theUrl;
151
214
  CRhoURLResponse* resp = nil;
152
215
 
@@ -154,7 +217,14 @@ int on_http_cb(http_parser* parser) { return 0; }
154
217
 
155
218
  if ( resp != nil )
156
219
  {
220
+ if (is_net_trace()) {
221
+ RAWTRACE1("$NetRequestProcess$ CRhoURLProtocol %s :: startLoading has Responce from local server", [self selfIDstring]);
222
+ }
157
223
  if ( ((self.httpStatusCode==301)||(self.httpStatusCode==302)) && ( [self.httpHeaders objectForKey:@"location"] != nil ) ) {
224
+
225
+ if (is_net_trace()) {
226
+ RAWTRACE1("$NetRequestProcess$ CRhoURLProtocol %s :: startLoading we have REDIRECT from local server !", [self selfIDstring]);
227
+ }
158
228
  NSString* loc = [self.httpHeaders objectForKey:@"location"];
159
229
 
160
230
  NSString* escaped = [loc stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
@@ -172,18 +242,25 @@ int on_http_cb(http_parser* parser) { return 0; }
172
242
  if (rho_conf_is_property_exists("ios_https_local_server")!=0) {
173
243
  force_https = rho_conf_getBool("ios_https_local_server")!=0;
174
244
  }
245
+
246
+ NSString* spath = [url path];
247
+ spath = [spath stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
248
+
249
+
175
250
  if (force_https) {
176
- s = [NSMutableString stringWithFormat:@"https://127.0.0.1:%d%@",rho_http_get_port(),[url path]];
251
+ s = [NSMutableString stringWithFormat:@"https://127.0.0.1:%d%@",rho_http_get_port(),spath];
177
252
  }
178
253
  else {
179
- s = [NSMutableString stringWithFormat:@"http://127.0.0.1:%d%@",rho_http_get_port(),[url path]];
254
+ s = [NSMutableString stringWithFormat:@"http://127.0.0.1:%d%@",rho_http_get_port(),spath];
180
255
  }
181
256
 
182
257
 
183
- if ( [url query] != nil )
258
+ NSString* squery = [url query];
259
+ if ( squery != nil )
184
260
  {
185
- // decode query back to original state
186
- [s appendFormat:@"?%@", [[url query] stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding]];
261
+ // decode query back to original state
262
+ squery = [squery stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
263
+ [s appendFormat:@"?%@", squery];
187
264
  }
188
265
 
189
266
  if ( [url fragment] != nil )
@@ -195,34 +272,89 @@ int on_http_cb(http_parser* parser) { return 0; }
195
272
  }
196
273
 
197
274
 
198
- NSURLRequest* redirReq = [NSURLRequest requestWithURL:url];
199
- [[self client] URLProtocol:self wasRedirectedToRequest:redirReq redirectResponse:resp];
275
+ NSMutableURLRequest* redirReq = [NSMutableURLRequest requestWithURL:url];
276
+
277
+ // clone headers from original request to redirect request
278
+ NSDictionary* headers = [[self request] allHTTPHeaderFields];
279
+ for (NSString* key in headers) {
280
+ NSString* value = [headers objectForKey:key];
281
+ [redirReq setValue:value forHTTPHeaderField:key];
282
+ }
283
+
284
+ if (is_net_trace()) {
285
+ RAWTRACE2("$NetRequestProcess$ CRhoURLProtocol %s :: startLoading wasRedirectedToRequest with Request { %s }", [self selfIDstring], [CRhoURLProtocol requestInfo:redirReq]);
286
+ }
287
+ if (!self.isStopped) {
288
+
289
+ [[self client] URLProtocol:self wasRedirectedToRequest:redirReq redirectResponse:resp];
290
+ }
291
+ if (is_net_trace()) {
292
+ RAWTRACE1("$NetRequestProcess$ CRhoURLProtocol %s :: startLoading END", [self selfIDstring]);
293
+ }
200
294
  return;
201
295
  }
296
+ else {
297
+ RAWLOG_ERROR2("$NetRequestProcess$ CRhoURLProtocol %s :: startLoading Redirect response has no URL ! Initial request: { %s }", [self selfIDstring], [CRhoURLProtocol requestInfo:[self request]]);
298
+ }
202
299
  }
203
300
  else
204
301
  {
205
- [[self client] URLProtocol:self didReceiveResponse:resp cacheStoragePolicy:NSURLCacheStorageNotAllowed];
206
-
207
- if (self.httpBody != nil) {
208
- [[self client] URLProtocol:self didLoadData:self.httpBody];
302
+ if (is_net_trace()) {
303
+ RAWTRACE1("$NetRequestProcess$ CRhoURLProtocol %s :: startLoading just request - no redirection", [self selfIDstring]);
304
+ }
305
+ if (!self.isStopped) {
306
+
307
+ [[self client] URLProtocol:self didReceiveResponse:resp cacheStoragePolicy:NSURLCacheStorageNotAllowed];
308
+ }
309
+ if (self.httpBody != nil) {
310
+ if (!self.isStopped) {
311
+ [[self client] URLProtocol:self didLoadData:self.httpBody];
312
+ }
313
+ }
314
+ if (!self.isStopped) {
315
+ [[self client] URLProtocolDidFinishLoading:self];
316
+ }
317
+
318
+ if (is_net_trace()) {
319
+ RAWTRACE1("$NetRequestProcess$ CRhoURLProtocol %s :: startLoading END", [self selfIDstring]);
209
320
  }
210
-
211
- [[self client] URLProtocolDidFinishLoading:self];
212
321
  return;
213
322
  }
214
323
  }
324
+ else {
325
+ RAWLOG_ERROR2("$NetRequestProcess$ CRhoURLProtocol %s :: startLoading has NO Responce from local server !!! Initial request: { %s }", [self selfIDstring], [CRhoURLProtocol requestInfo:[self request]]);
326
+ }
215
327
  }
216
328
 
217
329
  //NSLog(@"$$$ responce ERROR: [%@]", [theUrl absoluteString]);
218
330
  NSString* body = @"error";
219
331
  [self sendResponseWithResponseCode:401 data:[body dataUsingEncoding:NSUTF8StringEncoding]];
220
-
332
+ if (is_net_trace()) {
333
+ RAWTRACE1("$NetRequestProcess$ CRhoURLProtocol %s :: startLoadingInThread END", [self selfIDstring]);
334
+ }
221
335
  }
222
336
 
337
+ - (void)startLoading
338
+ {
339
+ self.isStopped = NO;
340
+ if (is_net_trace()) {
341
+ RAWTRACE1("$NetRequestProcess$ CRhoURLProtocol %s :: startLoading()", [self selfIDstring]);
342
+ }
343
+
344
+ dispatch_async( dispatch_get_global_queue( DISPATCH_QUEUE_PRIORITY_DEFAULT, 0 ), ^{
345
+ [self startLoadingInThread];
346
+ });
347
+ }
348
+
349
+
223
350
  - (CRhoURLResponse*) makeDirectHttpRequest:(NSURL*)theUrl
224
351
  {
225
- //NSLog(@"Will make local request to %@", [theUrl absoluteString]);
352
+
353
+ if (is_net_trace()) {
354
+ RAWTRACE2("$NetRequestProcess$ CRhoURLProtocol %s :: makeDirectHttpRequest : URL [ %s ]", [self selfIDstring], [[theUrl absoluteString] UTF8String]);
355
+ }
356
+
357
+ //NSLog(@"Will make local request to %@", [theUrl absoluteString]);
226
358
 
227
359
  const char* uri = [[theUrl path] UTF8String];
228
360
  const char* method = [[[self request] HTTPMethod] UTF8String];
@@ -295,6 +427,10 @@ int on_http_cb(http_parser* parser) { return 0; }
295
427
 
296
428
  - (void)stopLoading
297
429
  {
430
+ self.isStopped = YES;
431
+ if (is_net_trace()) {
432
+ RAWTRACE1("$NetRequestProcess$ CRhoURLProtocol %s :: stopLoading()", [self selfIDstring]);
433
+ }
298
434
 
299
435
  }
300
436
 
@@ -305,7 +441,13 @@ int on_http_cb(http_parser* parser) { return 0; }
305
441
 
306
442
  - (void)sendResponseWithResponseCode:(NSInteger)statusCode data:(NSData*)data
307
443
  {
444
+ if (is_net_trace()) {
445
+ RAWTRACE2("$NetRequestProcess$ CRhoURLProtocol %s :: sendResponseWithResponseCode : code: [ %d ] ", [self selfIDstring], (int)statusCode);
446
+ }
308
447
 
448
+ if (self.isStopped) {
449
+ return;
450
+ }
309
451
  CRhoURLResponse* response =
310
452
  [[CRhoURLResponse alloc] initWithURL:[[self request] URL]
311
453
  MIMEType:@"text/plain"
@@ -313,25 +455,39 @@ int on_http_cb(http_parser* parser) { return 0; }
313
455
  textEncodingName:@"UTF-8"];
314
456
  response.statusCode = statusCode;
315
457
 
316
- [[self client] URLProtocol:self didReceiveResponse:response cacheStoragePolicy:NSURLCacheStorageNotAllowed];
458
+ if (!self.isStopped) {
459
+ [[self client] URLProtocol:self didReceiveResponse:response cacheStoragePolicy:NSURLCacheStorageNotAllowed];
460
+ }
317
461
  if (data != nil) {
318
- [[self client] URLProtocol:self didLoadData:data];
462
+ if (!self.isStopped) {
463
+ [[self client] URLProtocol:self didLoadData:data];
464
+ }
465
+ }
466
+ if (!self.isStopped) {
467
+ [[self client] URLProtocolDidFinishLoading:self];
319
468
  }
320
- [[self client] URLProtocolDidFinishLoading:self];
321
-
322
469
  [response release];
323
470
  }
324
471
 
325
472
  + (BOOL) isLocalURL:(NSURL*)url
326
473
  {
474
+ if (is_net_trace()) {
475
+ RAWTRACE1("$NetRequestProcess$ isLocalURL BEGIN : URL: [ %s ] ", [[url absoluteString] UTF8String]);
476
+ }
327
477
  if ( [[url absoluteString] isEqualToString:@""] )
328
478
  {
479
+ if (is_net_trace()) {
480
+ RAWTRACE("isLocalURL END : return NO");
481
+ }
329
482
  return NO;
330
483
  }
331
484
 
332
485
  const char* scheme = [[url scheme] UTF8String];
333
486
  if (scheme != 0) {
334
487
  if ((strcmp(scheme, "http") !=0 ) && (strcmp(scheme, "https") !=0 )) {
488
+ if (is_net_trace()) {
489
+ RAWTRACE("$NetRequestProcess$ isLocalURL END : return NO");
490
+ }
335
491
  return NO;
336
492
  }
337
493
  }
@@ -340,7 +496,10 @@ int on_http_cb(http_parser* parser) { return 0; }
340
496
 
341
497
  if ( 0 == host )
342
498
  {
343
- return YES;
499
+ if (is_net_trace()) {
500
+ RAWTRACE("$NetRequestProcess$ isLocalURL END : return YES");
501
+ }
502
+ return YES;
344
503
  }
345
504
 
346
505
  NSNumber* p = [url port];
@@ -348,10 +507,15 @@ int on_http_cb(http_parser* parser) { return 0; }
348
507
 
349
508
  int rhoPort = rho_http_get_port();
350
509
 
351
- return (
510
+ BOOL ret = (
352
511
  ((port == rhoPort))
353
512
  && ( (strcmp(host,"127.0.0.1")==0) || (strcmp(host,"localhost")==0) )
354
513
  );
514
+ if (is_net_trace()) {
515
+ RAWTRACE1("$NetRequestProcess$ isLocalURL END : return [%s]", [[[NSNumber numberWithBool:ret] stringValue] UTF8String]);
516
+ }
517
+
518
+ return ret;
355
519
  }
356
520
 
357
521
 
@@ -359,6 +523,7 @@ int on_http_cb(http_parser* parser) { return 0; }
359
523
  @synthesize httpHeaderName;
360
524
  @synthesize httpHeaders;
361
525
  @synthesize httpBody;
526
+ @synthesize isStopped;
362
527
 
363
528
 
364
529
  @end