candle 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.
Files changed (164) hide show
  1. data/LICENSE.txt +20 -0
  2. data/README.md +4 -0
  3. data/VERSION +1 -0
  4. data/bin/candle +21 -0
  5. data/lib/candle.rb +68 -0
  6. data/lib/candle/command.rb +27 -0
  7. data/lib/candle/generators/actions.rb +183 -0
  8. data/lib/candle/generators/blank.rb +127 -0
  9. data/lib/candle/generators/cli.rb +55 -0
  10. data/lib/candle/generators/help.rb +47 -0
  11. data/lib/candle/generators/jam.rb +80 -0
  12. data/lib/candle/generators/lua/scripts/AppDelegate.lua +36 -0
  13. data/lib/candle/generators/lua/scripts/tests/init.lua +6 -0
  14. data/lib/candle/generators/lua/scripts/tests/someTest.lua +12 -0
  15. data/lib/candle/generators/lua/wax/ProtocolLoader.h +12 -0
  16. data/lib/candle/generators/lua/wax/bin/hammer +157 -0
  17. data/lib/candle/generators/lua/wax/bin/update-xibs +131 -0
  18. data/lib/candle/generators/lua/wax/bin/waxsim +0 -0
  19. data/lib/candle/generators/lua/wax/lib/build-scripts/compile-stdlib.sh +14 -0
  20. data/lib/candle/generators/lua/wax/lib/build-scripts/copy-scripts.sh +58 -0
  21. data/lib/candle/generators/lua/wax/lib/build-scripts/luac.lua +80 -0
  22. data/lib/candle/generators/lua/wax/lib/extensions/CGAffine/wax_CGTransform.h +12 -0
  23. data/lib/candle/generators/lua/wax/lib/extensions/CGAffine/wax_CGTransform.m +85 -0
  24. data/lib/candle/generators/lua/wax/lib/extensions/CGContext/wax_CGContext.h +12 -0
  25. data/lib/candle/generators/lua/wax/lib/extensions/CGContext/wax_CGContext.m +251 -0
  26. data/lib/candle/generators/lua/wax/lib/extensions/HTTP/wax_http.h +14 -0
  27. data/lib/candle/generators/lua/wax/lib/extensions/HTTP/wax_http.m +240 -0
  28. data/lib/candle/generators/lua/wax/lib/extensions/HTTP/wax_http_connection.h +54 -0
  29. data/lib/candle/generators/lua/wax/lib/extensions/HTTP/wax_http_connection.m +304 -0
  30. data/lib/candle/generators/lua/wax/lib/extensions/filesystem/wax_filesystem.h +9 -0
  31. data/lib/candle/generators/lua/wax/lib/extensions/filesystem/wax_filesystem.m +273 -0
  32. data/lib/candle/generators/lua/wax/lib/extensions/json/Rakefile +10 -0
  33. data/lib/candle/generators/lua/wax/lib/extensions/json/wax_json.c +304 -0
  34. data/lib/candle/generators/lua/wax/lib/extensions/json/wax_json.h +11 -0
  35. data/lib/candle/generators/lua/wax/lib/extensions/json/yajl-1.0.9.tar.gz +0 -0
  36. data/lib/candle/generators/lua/wax/lib/extensions/json/yajl/api/yajl_common.h +85 -0
  37. data/lib/candle/generators/lua/wax/lib/extensions/json/yajl/api/yajl_gen.h +159 -0
  38. data/lib/candle/generators/lua/wax/lib/extensions/json/yajl/api/yajl_parse.h +193 -0
  39. data/lib/candle/generators/lua/wax/lib/extensions/json/yajl/yajl.c +159 -0
  40. data/lib/candle/generators/lua/wax/lib/extensions/json/yajl/yajl_alloc.c +65 -0
  41. data/lib/candle/generators/lua/wax/lib/extensions/json/yajl/yajl_alloc.h +50 -0
  42. data/lib/candle/generators/lua/wax/lib/extensions/json/yajl/yajl_buf.c +119 -0
  43. data/lib/candle/generators/lua/wax/lib/extensions/json/yajl/yajl_buf.h +73 -0
  44. data/lib/candle/generators/lua/wax/lib/extensions/json/yajl/yajl_bytestack.h +85 -0
  45. data/lib/candle/generators/lua/wax/lib/extensions/json/yajl/yajl_common.h +85 -0
  46. data/lib/candle/generators/lua/wax/lib/extensions/json/yajl/yajl_encode.c +188 -0
  47. data/lib/candle/generators/lua/wax/lib/extensions/json/yajl/yajl_encode.h +50 -0
  48. data/lib/candle/generators/lua/wax/lib/extensions/json/yajl/yajl_gen.c +322 -0
  49. data/lib/candle/generators/lua/wax/lib/extensions/json/yajl/yajl_gen.h +159 -0
  50. data/lib/candle/generators/lua/wax/lib/extensions/json/yajl/yajl_lex.c +737 -0
  51. data/lib/candle/generators/lua/wax/lib/extensions/json/yajl/yajl_lex.h +133 -0
  52. data/lib/candle/generators/lua/wax/lib/extensions/json/yajl/yajl_parse.h +193 -0
  53. data/lib/candle/generators/lua/wax/lib/extensions/json/yajl/yajl_parser.c +448 -0
  54. data/lib/candle/generators/lua/wax/lib/extensions/json/yajl/yajl_parser.h +82 -0
  55. data/lib/candle/generators/lua/wax/lib/lua/lapi.c +1087 -0
  56. data/lib/candle/generators/lua/wax/lib/lua/lapi.h +16 -0
  57. data/lib/candle/generators/lua/wax/lib/lua/lauxlib.c +652 -0
  58. data/lib/candle/generators/lua/wax/lib/lua/lauxlib.h +174 -0
  59. data/lib/candle/generators/lua/wax/lib/lua/lbaselib.c +653 -0
  60. data/lib/candle/generators/lua/wax/lib/lua/lcode.c +839 -0
  61. data/lib/candle/generators/lua/wax/lib/lua/lcode.h +76 -0
  62. data/lib/candle/generators/lua/wax/lib/lua/ldblib.c +397 -0
  63. data/lib/candle/generators/lua/wax/lib/lua/ldebug.c +638 -0
  64. data/lib/candle/generators/lua/wax/lib/lua/ldebug.h +33 -0
  65. data/lib/candle/generators/lua/wax/lib/lua/ldo.c +518 -0
  66. data/lib/candle/generators/lua/wax/lib/lua/ldo.h +57 -0
  67. data/lib/candle/generators/lua/wax/lib/lua/ldump.c +164 -0
  68. data/lib/candle/generators/lua/wax/lib/lua/lfunc.c +174 -0
  69. data/lib/candle/generators/lua/wax/lib/lua/lfunc.h +34 -0
  70. data/lib/candle/generators/lua/wax/lib/lua/lgc.c +711 -0
  71. data/lib/candle/generators/lua/wax/lib/lua/lgc.h +110 -0
  72. data/lib/candle/generators/lua/wax/lib/lua/linit.c +38 -0
  73. data/lib/candle/generators/lua/wax/lib/lua/liolib.c +553 -0
  74. data/lib/candle/generators/lua/wax/lib/lua/llex.c +461 -0
  75. data/lib/candle/generators/lua/wax/lib/lua/llex.h +81 -0
  76. data/lib/candle/generators/lua/wax/lib/lua/llimits.h +128 -0
  77. data/lib/candle/generators/lua/wax/lib/lua/lmathlib.c +263 -0
  78. data/lib/candle/generators/lua/wax/lib/lua/lmem.c +86 -0
  79. data/lib/candle/generators/lua/wax/lib/lua/lmem.h +49 -0
  80. data/lib/candle/generators/lua/wax/lib/lua/loadlib.c +666 -0
  81. data/lib/candle/generators/lua/wax/lib/lua/lobject.c +214 -0
  82. data/lib/candle/generators/lua/wax/lib/lua/lobject.h +381 -0
  83. data/lib/candle/generators/lua/wax/lib/lua/lopcodes.c +102 -0
  84. data/lib/candle/generators/lua/wax/lib/lua/lopcodes.h +268 -0
  85. data/lib/candle/generators/lua/wax/lib/lua/loslib.c +243 -0
  86. data/lib/candle/generators/lua/wax/lib/lua/lparser.c +1339 -0
  87. data/lib/candle/generators/lua/wax/lib/lua/lparser.h +82 -0
  88. data/lib/candle/generators/lua/wax/lib/lua/lstate.c +214 -0
  89. data/lib/candle/generators/lua/wax/lib/lua/lstate.h +169 -0
  90. data/lib/candle/generators/lua/wax/lib/lua/lstring.c +111 -0
  91. data/lib/candle/generators/lua/wax/lib/lua/lstring.h +31 -0
  92. data/lib/candle/generators/lua/wax/lib/lua/lstrlib.c +869 -0
  93. data/lib/candle/generators/lua/wax/lib/lua/ltable.c +588 -0
  94. data/lib/candle/generators/lua/wax/lib/lua/ltable.h +40 -0
  95. data/lib/candle/generators/lua/wax/lib/lua/ltablib.c +287 -0
  96. data/lib/candle/generators/lua/wax/lib/lua/ltm.c +75 -0
  97. data/lib/candle/generators/lua/wax/lib/lua/ltm.h +54 -0
  98. data/lib/candle/generators/lua/wax/lib/lua/lua.h +388 -0
  99. data/lib/candle/generators/lua/wax/lib/lua/luaconf.h +753 -0
  100. data/lib/candle/generators/lua/wax/lib/lua/lualib.h +53 -0
  101. data/lib/candle/generators/lua/wax/lib/lua/lundump.c +227 -0
  102. data/lib/candle/generators/lua/wax/lib/lua/lundump.h +36 -0
  103. data/lib/candle/generators/lua/wax/lib/lua/lvm.c +763 -0
  104. data/lib/candle/generators/lua/wax/lib/lua/lvm.h +36 -0
  105. data/lib/candle/generators/lua/wax/lib/lua/lzio.c +82 -0
  106. data/lib/candle/generators/lua/wax/lib/lua/lzio.h +67 -0
  107. data/lib/candle/generators/lua/wax/lib/lua/print.c +227 -0
  108. data/lib/candle/generators/lua/wax/lib/project.rake +159 -0
  109. data/lib/candle/generators/lua/wax/lib/stdlib/enums.lua +396 -0
  110. data/lib/candle/generators/lua/wax/lib/stdlib/ext/http.lua +43 -0
  111. data/lib/candle/generators/lua/wax/lib/stdlib/ext/init.lua +4 -0
  112. data/lib/candle/generators/lua/wax/lib/stdlib/ext/number.lua +21 -0
  113. data/lib/candle/generators/lua/wax/lib/stdlib/ext/string.lua +97 -0
  114. data/lib/candle/generators/lua/wax/lib/stdlib/ext/table.lua +165 -0
  115. data/lib/candle/generators/lua/wax/lib/stdlib/helpers/WaxServer.lua +49 -0
  116. data/lib/candle/generators/lua/wax/lib/stdlib/helpers/autoload.lua +10 -0
  117. data/lib/candle/generators/lua/wax/lib/stdlib/helpers/base64.lua +64 -0
  118. data/lib/candle/generators/lua/wax/lib/stdlib/helpers/bit.lua +274 -0
  119. data/lib/candle/generators/lua/wax/lib/stdlib/helpers/cache.lua +73 -0
  120. data/lib/candle/generators/lua/wax/lib/stdlib/helpers/callback.lua +22 -0
  121. data/lib/candle/generators/lua/wax/lib/stdlib/helpers/frame.lua +76 -0
  122. data/lib/candle/generators/lua/wax/lib/stdlib/helpers/init.lua +78 -0
  123. data/lib/candle/generators/lua/wax/lib/stdlib/helpers/pickView.lua +54 -0
  124. data/lib/candle/generators/lua/wax/lib/stdlib/helpers/time.lua +102 -0
  125. data/lib/candle/generators/lua/wax/lib/stdlib/init.lua +18 -0
  126. data/lib/candle/generators/lua/wax/lib/stdlib/luaspec/init.lua +2 -0
  127. data/lib/candle/generators/lua/wax/lib/stdlib/luaspec/luamock.lua +84 -0
  128. data/lib/candle/generators/lua/wax/lib/stdlib/luaspec/luaspec.lua +377 -0
  129. data/lib/candle/generators/lua/wax/lib/stdlib/repl.lua +9 -0
  130. data/lib/candle/generators/lua/wax/lib/stdlib/structs.lua +11 -0
  131. data/lib/candle/generators/lua/wax/lib/stdlib/waxClass.lua +42 -0
  132. data/lib/candle/generators/lua/wax/lib/wax.h +16 -0
  133. data/lib/candle/generators/lua/wax/lib/wax.m +260 -0
  134. data/lib/candle/generators/lua/wax/lib/wax_class.h +18 -0
  135. data/lib/candle/generators/lua/wax/lib/wax_class.m +190 -0
  136. data/lib/candle/generators/lua/wax/lib/wax_gc.h +20 -0
  137. data/lib/candle/generators/lua/wax/lib/wax_gc.m +56 -0
  138. data/lib/candle/generators/lua/wax/lib/wax_helpers.h +102 -0
  139. data/lib/candle/generators/lua/wax/lib/wax_helpers.m +870 -0
  140. data/lib/candle/generators/lua/wax/lib/wax_instance.h +34 -0
  141. data/lib/candle/generators/lua/wax/lib/wax_instance.m +810 -0
  142. data/lib/candle/generators/lua/wax/lib/wax_server.h +47 -0
  143. data/lib/candle/generators/lua/wax/lib/wax_server.m +252 -0
  144. data/lib/candle/generators/lua/wax/lib/wax_stdlib.h +3 -0
  145. data/lib/candle/generators/lua/wax/lib/wax_struct.h +26 -0
  146. data/lib/candle/generators/lua/wax/lib/wax_struct.m +335 -0
  147. data/lib/candle/generators/templates/blank/WaxApplication.xcodeproj/project.pbxproj +836 -0
  148. data/lib/candle/generators/templates/blank/WaxApplication.xcodeproj/project.xcworkspace/contents.xcworkspacedata +7 -0
  149. data/lib/candle/generators/templates/blank/WaxApplication.xcodeproj/project.xcworkspace/xcuserdata/eiffel.xcuserdatad/UserInterfaceState.xcuserstate +0 -0
  150. data/lib/candle/generators/templates/blank/WaxApplication.xcodeproj/xcuserdata/eiffel.xcuserdatad/xcschemes/WaxApplication.xcscheme +86 -0
  151. data/lib/candle/generators/templates/blank/WaxApplication.xcodeproj/xcuserdata/eiffel.xcuserdatad/xcschemes/xcschememanagement.plist +22 -0
  152. data/lib/candle/generators/templates/blank/WaxApplication/Default-568h@2x.png +0 -0
  153. data/lib/candle/generators/templates/blank/WaxApplication/Default.png +0 -0
  154. data/lib/candle/generators/templates/blank/WaxApplication/Default@2x.png +0 -0
  155. data/lib/candle/generators/templates/blank/WaxApplication/ProtocolLoader.h +12 -0
  156. data/lib/candle/generators/templates/blank/WaxApplication/WaxApplication-Info.plist.tt +38 -0
  157. data/lib/candle/generators/templates/blank/WaxApplication/WaxApplication-Prefix.pch.tt +14 -0
  158. data/lib/candle/generators/templates/blank/WaxApplication/en.lproj/InfoPlist.strings +2 -0
  159. data/lib/candle/generators/templates/blank/WaxApplication/main.m.tt +20 -0
  160. data/lib/candle/tasks.rb +22 -0
  161. data/lib/candle/utility.rb +30 -0
  162. data/lib/candle/version.rb +9 -0
  163. data/lib/candle/view.rb +48 -0
  164. metadata +582 -0
@@ -0,0 +1,14 @@
1
+ //
2
+ // wax_http.h
3
+ // Rentals
4
+ //
5
+ // Created by ProbablyInteractive on 7/13/09.
6
+ // Copyright 2009 Probably Interactive. All rights reserved.
7
+ //
8
+
9
+ #import <UIKit/UIKit.h>
10
+ #import "lua.h"
11
+
12
+ #define WAX_HTTP_METATABLE_NAME "wax.http"
13
+
14
+ int luaopen_wax_http(lua_State *L);
@@ -0,0 +1,240 @@
1
+ //
2
+ // wax_http.m
3
+ // Rentals
4
+ //
5
+ // Created by ProbablyInteractive on 7/13/09.
6
+ // Copyright 2009 Probably Interactive. All rights reserved.
7
+ //
8
+
9
+ #import "wax_http.h"
10
+ #import "wax_http_connection.h"
11
+ #import "wax_instance.h"
12
+ #import "wax_helpers.h"
13
+
14
+ #import "lua.h"
15
+ #import "lauxlib.h"
16
+
17
+ const NSTimeInterval WAX_HTTP_TIMEOUT = 30;
18
+
19
+ static int request(lua_State *L);
20
+
21
+ static BOOL pushCallback(lua_State *L, char *callbackName, int table_index);
22
+
23
+ static int getFormat(lua_State *L, int tableIndex);
24
+ static NSURLRequestCachePolicy getCachePolicy(lua_State *L, int tableIndex);
25
+ static NSDictionary *getHeaders(lua_State *L, int tableIndex);
26
+ static NSString *getMethod(lua_State *L, int tableIndex);
27
+ static NSTimeInterval getTimeout(lua_State *L, int tableIndex);
28
+ static NSString *getBody(lua_State *L, int tableIndex);
29
+
30
+ static const struct luaL_Reg metaFunctions[] = {
31
+ {NULL, NULL}
32
+ };
33
+
34
+ static const struct luaL_Reg functions[] = {
35
+ {"request", request},
36
+ {NULL, NULL}
37
+ };
38
+
39
+ int luaopen_wax_http(lua_State *L) {
40
+ BEGIN_STACK_MODIFY(L);
41
+
42
+ luaL_newmetatable(L, WAX_HTTP_METATABLE_NAME);
43
+ luaL_register(L, NULL, metaFunctions);
44
+ luaL_register(L, WAX_HTTP_METATABLE_NAME, functions);
45
+
46
+ lua_pushvalue(L, -2);
47
+ lua_setmetatable(L, -2); // Set the metatable for the module
48
+
49
+ END_STACK_MODIFY(L, 0)
50
+
51
+ return 0;
52
+ }
53
+
54
+ // wax.request({url, options}) => returns connection object or (body, response) if syncronous
55
+ // wax.request{url, options} => same as above, but with syntax sugar
56
+ // options:
57
+ // method = "get" | "post" | "put" | "delete"
58
+ // format = "text" | "binary" | "json" | "xml" # if none given, uses value from response Content-Type Header
59
+ // headers = table # Table of header values
60
+ // timout = number
61
+ // body = string
62
+ // cache = NSURLRequestCachePolicy # one of those enums, defaults to NSURLRequestUseProtocolCachePolicy
63
+ // callback = function(body, response) # No callback? Then treat request is treated as syncronous
64
+ // progressCallback = function(percentComplete, data) # Shows how much is left to download
65
+ // authCallback = function(NSURLAuthenticationChallenge) # Handle just like you would with NSURLConnection
66
+ // redirectCallback = function(response) # If there is a redirect, this callback will be called
67
+ static int request(lua_State *L) {
68
+ lua_rawgeti(L, 1, 1);
69
+
70
+ NSString *urlString = [NSString stringWithUTF8String:luaL_checkstring(L, -1)];
71
+ if (![urlString hasPrefix:@"http://"] && ![urlString hasPrefix:@"https://"]) urlString = [NSString stringWithFormat:@"http://%@", urlString];
72
+ NSURL *url = [NSURL URLWithString:urlString];
73
+
74
+ lua_pop(L, 1); // Pop the url off the stack
75
+
76
+ if (!url) luaL_error(L, "wax_http: Could not create URL from string '%s'", [urlString UTF8String]);
77
+
78
+
79
+ NSURLRequestCachePolicy cachePolicy = getCachePolicy(L, 1);
80
+ NSDictionary *headerFields = getHeaders(L, 1);
81
+ NSData *body = [getBody(L, 1) dataUsingEncoding:NSUTF8StringEncoding];
82
+
83
+ // Get the format
84
+ int format = getFormat(L, 1);
85
+ NSTimeInterval timeout = getTimeout(L, 1);
86
+ NSString *method = getMethod(L, 1);
87
+
88
+ NSMutableURLRequest *urlRequest = [[NSMutableURLRequest alloc] initWithURL:url];
89
+
90
+ [urlRequest setHTTPMethod:method];
91
+ [urlRequest setCachePolicy:cachePolicy];
92
+ [urlRequest setAllHTTPHeaderFields:headerFields];
93
+ [urlRequest setHTTPBody:body];
94
+
95
+ wax_http_connection *connection;
96
+ connection = [[[wax_http_connection alloc] initWithRequest:urlRequest timeout:timeout luaState:L] autorelease];
97
+ connection.format = format;
98
+ [urlRequest release];
99
+
100
+ wax_instance_create(L, connection, NO);
101
+
102
+ if (pushCallback(L, WAX_HTTP_AUTH_CALLBACK_FUNCTION_NAME, 1)) {
103
+ lua_setfield(L, -2, WAX_HTTP_AUTH_CALLBACK_FUNCTION_NAME); // Set the authCallback function for the userdata
104
+ }
105
+
106
+ if (pushCallback(L, WAX_HTTP_PROGRESS_CALLBACK_FUNCTION_NAME, 1)) {
107
+ lua_setfield(L, -2, WAX_HTTP_PROGRESS_CALLBACK_FUNCTION_NAME); // Set the progressCallback function for the userdata
108
+ }
109
+
110
+ if (pushCallback(L, WAX_HTTP_REDIRECT_CALLBACK_FUNCTION_NAME, 1)) {
111
+ lua_setfield(L, -2, WAX_HTTP_REDIRECT_CALLBACK_FUNCTION_NAME); // Set the redirectCallback function for the userdata
112
+ }
113
+
114
+ // Asyncronous or Syncronous
115
+ if (pushCallback(L, WAX_HTTP_CALLBACK_FUNCTION_NAME, 1)) {
116
+ lua_setfield(L, -2, WAX_HTTP_CALLBACK_FUNCTION_NAME); // Set the callback function for the userdata
117
+
118
+ [connection start];
119
+
120
+ return 1; // Return the connectionDelegate as userdata
121
+ }
122
+ else {
123
+ [connection start];
124
+
125
+ NSRunLoop* runLoop = [NSRunLoop currentRunLoop];
126
+ while (!connection.finished) {
127
+ [runLoop runUntilDate:[NSDate dateWithTimeIntervalSinceNow:0.1]];
128
+ }
129
+
130
+ return 3;
131
+ }
132
+ }
133
+
134
+ static NSTimeInterval getTimeout(lua_State *L, int tableIndex) {
135
+ NSTimeInterval timeout = WAX_HTTP_TIMEOUT; // Default
136
+ if (lua_isnoneornil(L, tableIndex)) return timeout;
137
+
138
+ lua_getfield(L, tableIndex, "timeout");
139
+ if (!lua_isnil(L, -1)) {
140
+ timeout = luaL_checknumber(L, -1);
141
+ }
142
+ lua_pop(L, 1);
143
+
144
+ return timeout;
145
+ }
146
+
147
+ static NSDictionary *getHeaders(lua_State *L, int tableIndex) {
148
+ NSDictionary *headers = [NSDictionary dictionary];
149
+
150
+ if (lua_isnoneornil(L, tableIndex)) return headers;
151
+
152
+ lua_getfield(L, tableIndex, "headers");
153
+ if (!lua_isnil(L, -1)) {
154
+ id *result = wax_copyToObjc(L, "@", -1, nil);
155
+ headers = *result;
156
+ free(result);
157
+ }
158
+ lua_pop(L, 1);
159
+
160
+ return headers;
161
+ }
162
+
163
+ static NSString *getMethod(lua_State *L, int tableIndex) {
164
+ NSString *method = @"GET"; // Default
165
+ if (lua_isnoneornil(L, tableIndex)) return method;
166
+
167
+ lua_getfield(L, tableIndex, "method");
168
+ if (!lua_isnil(L, -1)) {
169
+ const char *string = luaL_checkstring(L, -1);
170
+ method = [[NSString stringWithUTF8String:string] uppercaseString];
171
+ }
172
+ lua_pop(L, 1);
173
+
174
+ return method;
175
+ }
176
+
177
+ static NSURLRequestCachePolicy getCachePolicy(lua_State *L, int tableIndex) {
178
+ NSURLRequestCachePolicy cachePolicy = NSURLRequestUseProtocolCachePolicy;
179
+ if (lua_isnoneornil(L, tableIndex)) return cachePolicy;
180
+
181
+ lua_getfield(L, tableIndex, "cache");
182
+ if (!lua_isnil(L, -1)) {
183
+ cachePolicy = luaL_checknumber(L, -1);
184
+ }
185
+ lua_pop(L, 1);
186
+
187
+ return cachePolicy;
188
+ }
189
+
190
+ static int getFormat(lua_State *L, int tableIndex) {
191
+ int format = WAX_HTTP_UNKNOWN; // Default
192
+ if (lua_isnoneornil(L, tableIndex)) return format;
193
+
194
+ lua_getfield(L, tableIndex, "format");
195
+ if (!lua_isnil(L, -1)) {
196
+ const char *formatString = luaL_checkstring(L, -1);
197
+ if (strcasecmp(formatString, "text") == 0) {
198
+ format = WAX_HTTP_TEXT;
199
+ }
200
+ else if (strcasecmp(formatString, "binary") == 0) {
201
+ format = WAX_HTTP_BINARY;
202
+ }
203
+ else if (strcasecmp(formatString, "json") == 0) {
204
+ format = WAX_HTTP_JSON;
205
+ }
206
+ else {
207
+ luaL_error(L, "wax_http: Unknown format name '%s'", formatString);
208
+ }
209
+ }
210
+ lua_pop(L, 1);
211
+
212
+ return format;
213
+ }
214
+
215
+ static NSString *getBody(lua_State *L, int tableIndex) {
216
+ NSString *body = @""; // Default
217
+ if (lua_isnoneornil(L, tableIndex)) return body;
218
+
219
+ lua_getfield(L, tableIndex, "body");
220
+ if (!lua_isnil(L, -1)) {
221
+ const char *string = luaL_checkstring(L, -1);
222
+ body = [NSString stringWithUTF8String:string];
223
+ }
224
+ lua_pop(L, 1);
225
+
226
+ return body;
227
+ }
228
+
229
+ // Assumes table is on top of the stack
230
+ static BOOL pushCallback(lua_State *L, char *callbackName, int tableIndex) {
231
+ lua_getfield(L, tableIndex, callbackName);
232
+
233
+ if (lua_isnil(L, -1)) {
234
+ lua_pop(L, 1);
235
+ return NO;
236
+ }
237
+ else {
238
+ return YES;
239
+ }
240
+ }
@@ -0,0 +1,54 @@
1
+ //
2
+ // wax_http_connection.h
3
+ // RentList
4
+ //
5
+ // Created by Corey Johnson on 8/9/09.
6
+ // Copyright 2009 ProbablyInteractive. All rights reserved.
7
+ //
8
+
9
+ #import <UIKit/UIKit.h>
10
+ #import "lua.h"
11
+
12
+ enum {
13
+ WAX_HTTP_UNKNOWN,
14
+ WAX_HTTP_TEXT,
15
+ WAX_HTTP_BINARY, // Like an image or something
16
+ WAX_HTTP_JSON,
17
+ WAX_HTTP_XML
18
+ };
19
+
20
+ #define WAX_HTTP_CALLBACK_FUNCTION_NAME "callback"
21
+ #define WAX_HTTP_PROGRESS_CALLBACK_FUNCTION_NAME "progressCallback"
22
+ #define WAX_HTTP_AUTH_CALLBACK_FUNCTION_NAME "authCallback"
23
+ #define WAX_HTTP_REDIRECT_CALLBACK_FUNCTION_NAME "redirectCallback"
24
+
25
+ @interface wax_http_connection : NSURLConnection {
26
+ lua_State *L;
27
+ NSMutableData *_data;
28
+ NSHTTPURLResponse *_response;
29
+ NSURLRequest *_request;
30
+ NSTimer *_timeoutTimer;
31
+ NSError *_error;
32
+
33
+ NSTimeInterval _timeout;
34
+ int _format;
35
+ bool _finished;
36
+ bool _canceled;
37
+ }
38
+
39
+ @property (nonatomic, assign) NSHTTPURLResponse *response;
40
+
41
+ @property (nonatomic, assign) int format;
42
+ @property (nonatomic, readonly, getter=isFinished) bool finished;
43
+
44
+ - (id)initWithRequest:(NSURLRequest *)urlRequest timeout:(NSTimeInterval)timeout luaState:(lua_State *)luaState;
45
+ - (void)callRedirectCallback:(NSURLResponse *)redirectResponse;
46
+ - (BOOL)callLuaAuthCallback:(NSURLAuthenticationChallenge *)challenge;
47
+ - (void)callLuaProgressCallback;
48
+ - (void)callLuaCallback;
49
+
50
+ // HSHTTPURLResponse Delegate Methods
51
+ - (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error;
52
+
53
+ @end
54
+
@@ -0,0 +1,304 @@
1
+ //
2
+ // wax_http_connection.m
3
+ // RentList
4
+ //
5
+ // Created by Corey Johnson on 8/9/09.
6
+ // Copyright 2009 ProbablyInteractive. All rights reserved.
7
+ //
8
+
9
+ #include <CommonCrypto/CommonDigest.h>
10
+
11
+ #import "lauxlib.h"
12
+
13
+ #import "wax_http_connection.h"
14
+ #import "wax_instance.h"
15
+ #import "wax_helpers.h"
16
+ #import "wax_json.h"
17
+
18
+ #ifdef WAX_XML_INCLUDED
19
+ #import "wax_xml.h"
20
+ #endif
21
+
22
+ @implementation wax_http_connection
23
+
24
+ @synthesize response=_response;
25
+ @synthesize format=_format;
26
+ @synthesize finished=_finished;
27
+
28
+ - (void)dealloc {
29
+ [_data release];
30
+ [_error release];
31
+ [_response release];
32
+ [_request release];
33
+ [_timeoutTimer release];
34
+ [super dealloc];
35
+ }
36
+
37
+ - (id)initWithRequest:(NSURLRequest *)urlRequest timeout:(NSTimeInterval)timeout luaState:(lua_State *)luaState {
38
+ self = [super initWithRequest:urlRequest delegate:self startImmediately:NO];
39
+ [self scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
40
+ L = luaState;
41
+
42
+ _data = [[NSMutableData alloc] init];
43
+ _request = [urlRequest retain];
44
+
45
+ _timeout = timeout;
46
+ _format = WAX_HTTP_UNKNOWN;
47
+ _canceled = NO;
48
+ return self;
49
+ }
50
+
51
+ - (void)timeoutHack {
52
+ NSError *error = [NSError errorWithDomain:NSURLErrorDomain code:NSURLErrorTimedOut userInfo:nil];
53
+ [self connection:self didFailWithError:error];
54
+ [self cancel];
55
+ }
56
+
57
+ - (void)start {
58
+ // Apple makes has a mandatory 240 second minimum timeout WTF? https://devforums.apple.com/thread/25282
59
+ // Because of this stupidity by Apple, we are forced to setup our own timeout
60
+ // using a timer.
61
+ _timeoutTimer = [[NSTimer scheduledTimerWithTimeInterval:_timeout target:self selector:@selector(timeoutHack) userInfo:nil repeats:NO] retain];
62
+ wax_log(LOG_NETWORK, @"HTTP(%@) %@", [_request HTTPMethod], [_request URL]);
63
+ [super start];
64
+ }
65
+
66
+ - (void)cancel {
67
+ wax_log(LOG_NETWORK, @"CANCELING (%@) %@", [_request HTTPMethod], [_request URL]);
68
+ [_timeoutTimer invalidate];
69
+ _canceled = YES;
70
+ [super cancel];
71
+ }
72
+
73
+ - (bool)isFinished {
74
+ return _canceled || _finished;
75
+ }
76
+
77
+ - (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response {
78
+ if (response != _response) [_response release];
79
+ _response = [response retain];
80
+ }
81
+
82
+ - (NSURLRequest *)connection:(NSURLConnection *)connection willSendRequest:(NSURLRequest *)request redirectResponse:(NSURLResponse *)redirectResponse {
83
+ if (redirectResponse) [self callRedirectCallback:redirectResponse];
84
+ return request;
85
+ }
86
+
87
+ - (void)connection:(NSURLConnection *)connection didReceiveAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge {
88
+ if (![self callLuaAuthCallback:challenge]) {
89
+ [[challenge sender] continueWithoutCredentialForAuthenticationChallenge:challenge];
90
+ }
91
+ }
92
+
93
+ - (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data {
94
+ [_data appendData:data];
95
+ [self callLuaProgressCallback];
96
+ }
97
+
98
+ - (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error {
99
+ if (!_canceled) {
100
+ _error = [error retain];
101
+ [_data release];
102
+ _data = nil;
103
+ [self callLuaCallback];
104
+ }
105
+ }
106
+
107
+ - (void)connectionDidFinishLoading:(NSURLConnection *)connection {
108
+ if (!_canceled) {
109
+ [self callLuaCallback];
110
+ }
111
+ }
112
+
113
+ - (void)callRedirectCallback:(NSURLResponse *)redirectResponse {
114
+ BEGIN_STACK_MODIFY(L)
115
+
116
+ if (_canceled) {
117
+ assert("OH NO, URL CONNECTION WAS CANCELED BUT NOT CAUGHT");
118
+ }
119
+
120
+ wax_instance_pushUserdata(L, self);
121
+ lua_getfield(L, -1, WAX_HTTP_REDIRECT_CALLBACK_FUNCTION_NAME);
122
+
123
+ bool hasCallback = YES;
124
+ if (lua_isnil(L, -1)) {
125
+ hasCallback = NO;
126
+ lua_pop(L, 1);
127
+ }
128
+
129
+ wax_fromObjc(L, "@", &redirectResponse);
130
+
131
+ if (hasCallback && wax_pcall(L, 1, 0)) {
132
+ const char* error_string = lua_tostring(L, -1);
133
+ luaL_error(L, "Problem calling Lua function '%s' from wax_http.\n%s", WAX_HTTP_REDIRECT_CALLBACK_FUNCTION_NAME, error_string);
134
+ }
135
+
136
+ END_STACK_MODIFY(L, 0)
137
+ }
138
+
139
+ - (BOOL)callLuaAuthCallback:(NSURLAuthenticationChallenge *)challenge {
140
+ BEGIN_STACK_MODIFY(L)
141
+
142
+ if (_canceled) {
143
+ assert("OH NO, URL CONNECTION WAS CANCELED BUT NOT CAUGHT");
144
+ }
145
+
146
+ wax_instance_pushUserdata(L, self);
147
+ lua_getfield(L, -1, WAX_HTTP_AUTH_CALLBACK_FUNCTION_NAME);
148
+
149
+ bool hasCallback = YES;
150
+ if (lua_isnil(L, -1)) {
151
+ hasCallback = NO;
152
+ lua_pop(L, 1);
153
+ }
154
+
155
+ wax_fromObjc(L, "@", &challenge);
156
+
157
+ if (hasCallback && wax_pcall(L, 1, 0)) {
158
+ const char* error_string = lua_tostring(L, -1);
159
+ luaL_error(L, "Problem calling Lua function '%s' from wax_http.\n%s", WAX_HTTP_AUTH_CALLBACK_FUNCTION_NAME, error_string);
160
+ }
161
+
162
+ END_STACK_MODIFY(L, 0)
163
+
164
+ return hasCallback;
165
+ }
166
+
167
+ - (void)callLuaProgressCallback {
168
+ BEGIN_STACK_MODIFY(L)
169
+
170
+ if (_canceled) {
171
+ assert("OH NO, URL CONNECTION WAS CANCELED BUT NOT CAUGHT");
172
+ }
173
+
174
+ wax_instance_pushUserdata(L, self);
175
+ lua_getfield(L, -1, WAX_HTTP_PROGRESS_CALLBACK_FUNCTION_NAME);
176
+
177
+ if (lua_isnil(L, -1)) {
178
+ lua_pop(L, 1);
179
+ }
180
+ else {
181
+ float percentComplete = 0;
182
+
183
+ @try {
184
+ percentComplete = _data.length / [[[_response allHeaderFields] objectForKey:@"Content-Length"] floatValue];
185
+ }
186
+ @catch (NSException * e) {
187
+ NSLog(@"Error: Couldn't calculate percent Complete");
188
+ }
189
+
190
+
191
+ wax_fromObjc(L, "f", &percentComplete);
192
+ wax_fromObjc(L, "@", &_data);
193
+
194
+ if (wax_pcall(L, 2, 0)) {
195
+ const char* error_string = lua_tostring(L, -1);
196
+ luaL_error(L, "Problem calling Lua function '%s' from wax_http.\n%s", WAX_HTTP_PROGRESS_CALLBACK_FUNCTION_NAME, error_string);
197
+ }
198
+ }
199
+
200
+ END_STACK_MODIFY(L, 0)
201
+ }
202
+
203
+
204
+ - (void)callLuaCallback {
205
+ [_timeoutTimer invalidate];
206
+
207
+ BEGIN_STACK_MODIFY(L)
208
+
209
+ if (_canceled) {
210
+ assert("OH NO, URL CONNECTION WAS CANCELED BUT NOT CAUGHT");
211
+ }
212
+
213
+ wax_instance_pushUserdata(L, self);
214
+ lua_getfield(L, -1, WAX_HTTP_CALLBACK_FUNCTION_NAME);
215
+
216
+ bool hasCallback = YES;
217
+ if (lua_isnil(L, -1)) {
218
+ hasCallback = NO;
219
+ lua_pop(L, 1);
220
+ }
221
+
222
+ // Try and guess the format type
223
+ if (_format == WAX_HTTP_UNKNOWN) {
224
+ NSString *contentType = [[_response allHeaderFields] objectForKey:@"Content-Type"];
225
+
226
+ if ([contentType hasPrefix:@"application/xml"] ||
227
+ [contentType hasPrefix:@"text/xml"]) {
228
+ #ifdef WAX_XML_INCLUDED
229
+ _format = WAX_HTTP_XML;
230
+ #else
231
+ _format = WAX_HTTP_TEXT;
232
+ #endif
233
+ }
234
+ else if ([contentType hasPrefix:@"application/json"] ||
235
+ [contentType hasPrefix:@"text/json"] ||
236
+ [contentType hasPrefix:@"application/javascript"] ||
237
+ [contentType hasPrefix:@"text/javascript"]) {
238
+ _format = WAX_HTTP_JSON;
239
+ }
240
+ else if ([contentType hasPrefix:@"image/"] ||
241
+ [contentType hasPrefix:@"audio/"] ||
242
+ [contentType hasPrefix:@"application/octet-stream"]) {
243
+ _format = WAX_HTTP_BINARY;
244
+ }
245
+ else {
246
+ _format = WAX_HTTP_TEXT;
247
+ }
248
+ }
249
+
250
+ if (_error) {
251
+ lua_pushnil(L);
252
+ }
253
+ else if (_format == WAX_HTTP_TEXT || _format == WAX_HTTP_JSON || _format == WAX_HTTP_XML) {
254
+ NSString *string = [[NSString alloc] initWithData:_data encoding:NSUTF8StringEncoding];
255
+ if (!string) string = [[NSString alloc] initWithData:_data encoding:NSISOLatin1StringEncoding];
256
+ if (!string) string = [[NSString alloc] initWithData:_data encoding:NSNonLossyASCIIStringEncoding];
257
+ if (!string) string = [[NSString alloc] initWithData:_data encoding:NSNonLossyASCIIStringEncoding];
258
+
259
+
260
+ if (_format == WAX_HTTP_JSON) {
261
+ json_parseString(L, [string UTF8String]);
262
+ }
263
+ else if (_format == WAX_HTTP_XML){
264
+ #ifdef WAX_XML_INCLUDED
265
+ wax_xml_parseString(L, [string UTF8String]);
266
+ #else
267
+ luaL_error(L, "Trying to parse xml, but xml library not included.");
268
+ #endif
269
+ }
270
+ else {
271
+ wax_fromObjc(L, "@", &string);
272
+ }
273
+
274
+
275
+ [string release];
276
+ }
277
+ else if (_format == WAX_HTTP_BINARY) {
278
+ wax_fromObjc(L, "@", &_data);
279
+ }
280
+ else {
281
+ luaL_error(L, "wax_http: Unknown wax_http format '%d'", _format);
282
+ }
283
+
284
+ wax_fromObjc(L, "@", &_response);
285
+ if (_error) {
286
+ wax_fromObjc(L, "@", &_error);
287
+ }
288
+ else {
289
+ lua_pushnil(L);
290
+ }
291
+
292
+
293
+
294
+ if (hasCallback && wax_pcall(L, 3, 0)) {
295
+ const char* error_string = lua_tostring(L, -1);
296
+ luaL_error(L, "Problem calling Lua function '%s' from wax_http.\n%s", WAX_HTTP_CALLBACK_FUNCTION_NAME, error_string);
297
+ }
298
+
299
+ _finished = YES;
300
+
301
+ END_STACK_MODIFY(L, 3)
302
+ }
303
+
304
+ @end