PageRenderTime 37ms CodeModel.GetById 14ms RepoModel.GetById 0ms app.codeStats 0ms

/app/models/upload/upload-req.js

https://bitbucket.org/hankei6km/tsubumoca
JavaScript | 283 lines | 217 code | 19 blank | 47 comment | 26 complexity | e19b335acae2240ada0e87af760534c9 MD5 | raw file
  1. //----
  2. // Copyright (c) 2010-2011 hankei6km
  3. // License: MIT License (http://opensource.org/licenses/mit-license.php)
  4. //----
  5. var UploadReq = Class.create({
  6. initialize: function(){
  7. },
  8. imageUploadSettings: {
  9. providerMethod: "GET",
  10. providerAction: "https://api.twitter.com/1/account/verify_credentials.json",
  11. apiKey: "ca611a17f58706682c325d9dd8c45a03",
  12. api: {
  13. upload: {
  14. method: "POST",
  15. url: "http://api.twitpic.com/2/upload.json"
  16. }
  17. }
  18. },
  19. // == DownloadManager関連の操作 =====================
  20. // タイムアウトの制御、キャンセルなどを行う
  21. // =================================================
  22. uploadRequest: function(target, inParams){
  23. var params = Object.extend({
  24. onSuccess: function(transport){
  25. },
  26. onFailure: function(transport, errText){
  27. },
  28. onComplete: function(){
  29. },
  30. //timeout: 2 //アップロードは60分 -> は多すぎか? ※※※いまテストで値を小さくしてある。あとで直すこと
  31. timeout: 3600 //アップロードは60分 -> は多すぎか?
  32. }, inParams ||
  33. {});
  34. var onComplete = function(transport){
  35. this.uploadRequestComplete(params, timeoutId, transport);
  36. }.bind(this);
  37. params.uploadComplete = onComplete; //onSuccessなどで実行される
  38. params.uploadProgress = this.uploadProgress.bind(this.params);
  39. var req = new Mojo.Service.Request("palm://com.palm.downloadmanager", {
  40. method: "upload",
  41. parameters: {
  42. fileName: params.parameters.media,
  43. url: target,
  44. fileLabel: "media", //この指定がpostParametersのkeyに相当する?
  45. postParameters: [{
  46. key: "key",
  47. data: params.parameters.key
  48. }, {
  49. key: "message",
  50. data: params.parameters.message
  51. }],
  52. customHttpHeaders: params.requestHeaders,
  53. subscribe: true
  54. },
  55. onSuccess: this.uploadRequestSuccess.bind(this, params),
  56. onFailure: this.uploadRequestFailure.bind(this, params)
  57. });
  58. //タイムアウトを設定する(downloadmanagerのタイムアウト設定方法がわからなかったので、独自に処理を入れる)
  59. //とりあえず60分で様子を見る。
  60. var timeoutId = window.setTimeout(this.uploadRequestTimeout.bind(this, req, params), 1000 * params.timeout);
  61. return this.uploadRequestAbort.bind(this, req, params);
  62. },
  63. uploadRequestAbort: function(req, params){
  64. //Mojo.Log.info("+++++ uploadRequestAbort params.ticket:" + params.ticket)
  65. //params.ticketはuploadのonSuccessで受け取っている
  66. if (params.ticket) {
  67. var cancelReq = new Mojo.Service.Request('palm://com.palm.downloadmanager/', {
  68. method: 'cancelDownload',
  69. parameters: {
  70. "ticket": params.ticket
  71. },
  72. onSuccess: function(resp){
  73. //uploadメソッドのonCompleteが動くので、ここはとくになにもしない。
  74. },
  75. onFailure: function(e){
  76. this.uploadRequestFailure(params, e);
  77. }
  78. });
  79. }
  80. //req.cancel(); //serviceを使っている
  81. },
  82. uploadRequestTimeout: function(req, params){
  83. //Mojo.Log.info("+++++ uploadRequestTimeout ")
  84. this.uploadRequestFailure(params, {
  85. httpCode: this.err.timeOutError.status,
  86. responseString: this.err.timeOutError.text
  87. }, this.err.timeOutError.text);
  88. this.uploadRequestAbort(req, params);
  89. },
  90. uploadRequestTimeoutClear: function(timeoutId){
  91. if (timeoutId != undefined) {
  92. //Mojo.Log.info("+++++ timeout clear")
  93. window.clearTimeout(timeoutId);
  94. }
  95. },
  96. //--
  97. uploadProgress: function(params, resp){
  98. },
  99. //----
  100. uploadRequestSuccess: function(params, resp){
  101. //Mojo.Log.info("----upload success:" + Object.toJSON(resp));
  102. if (resp.completed) {
  103. if (resp.completionCode == 0 && resp.httpCode == 200) {
  104. params.onSuccess({
  105. status: resp.httpCode,
  106. responseText: resp.responseString
  107. });
  108. params.uploadComplete({
  109. status: resp.httpCode,
  110. responseText: resp.responseString
  111. });//完了したのでonComplete実行
  112. } else if (resp.httpCode == 0) {
  113. //resp.completionCodeが0以外でもresp.httpCodeが0ならおそらくキャンセルなどと思われるのでfailureにはしない
  114. params.uploadComplete({
  115. status: resp.httpCode,
  116. responseText: resp.responseString
  117. });//0のときはonCompleteのみ実行
  118. } else {
  119. this.uploadRequestFailure(params, resp);
  120. }
  121. } else {
  122. if (resp.httpCode == undefined && !params.ticket) {
  123. //ticketを持っていないので、upload開始直後
  124. params.ticket = resp.ticket;
  125. //StatusQueryを開始する(現状では使えない->DevForumを見ると要望はあがっているようなので残しておく)
  126. //params.progressReq = new Mojo.Service.Request('palm://com.palm.downloadmanager/', {
  127. // method: 'downloadStatusQuery',
  128. // parameters: {"ticket": params.ticket,},
  129. // onSuccess: function(resp){},
  130. // onFailure: function(e){}
  131. //});
  132. } else {
  133. if (resp.httpCode == 0) {
  134. //resp.completionCodeが0以外でもresp.httpCodeが0ならおそらくキャンセルなどと思われるのでfailureにはしない
  135. params.uploadComplete({
  136. status: resp.httpCode,
  137. responseText: resp.responseString
  138. });//0のときはonCompleteのみ実行
  139. } else {
  140. this.uploadRequestFailure(params, resp);
  141. }
  142. }
  143. }
  144. },
  145. uploadRequestFailure: function(params, e){
  146. //Mojo.Log.info("====upload failure:" + Object.toJSON(e));
  147. var errText = this.getErrorText(e.responseString); //errors要素からのテキストを取り出す
  148. params.onFailure({
  149. status: e.httpCode,
  150. responseText: e.responseString
  151. }, errText);
  152. params.uploadComplete({
  153. status: e.httpCode,
  154. responseText: e.responseString
  155. });//完了したのでonComplete実行
  156. },
  157. uploadRequestComplete: function(params, timeoutId, transport){
  158. //Mojo.Log.info("+++++ uploadRequestComplete")
  159. //reqを削除して、通信状態を解除する
  160. this.uploadRequestTimeoutClear(timeoutId);
  161. if (params.progressReq != undefined) {
  162. params.progressReq.cancel();
  163. }
  164. params.onComplete();
  165. },
  166. // == OAuth echo関連の操作 ===========================
  167. // 署名されたtargetからOAuth echo用にヘッダ組み立て直しなど
  168. // =================================================
  169. splitParameters: function(target){
  170. //parametersを切り分ける
  171. var ret = {};
  172. var tstr = target.split("?");
  173. var ptbl = tstr[1].split("&");
  174. for (var idx = 0; idx < ptbl.length; idx++) {
  175. pstr = ptbl[idx].split("=");
  176. ret[pstr[0]] = pstr[1];
  177. }
  178. return ret;
  179. },
  180. getRequestHeaders: function(tParameters){
  181. requestHeaders = new Array(0);
  182. //X-Verify-Credentials-Authorizationの処理
  183. var XVerifyCredentialsAuthorizationTbl = ["oauth_consumer_key", "oauth_signature_method", "oauth_token", "oauth_timestamp", "oauth_nonce", "oauth_version", "oauth_signature"];
  184. var dParameters = 'OAuth realm="http://api.twitter.com/",';
  185. for (var idx = 0; idx < XVerifyCredentialsAuthorizationTbl.length; idx++) {
  186. var p = XVerifyCredentialsAuthorizationTbl[idx];
  187. var val = tParameters[p];
  188. if (val) {
  189. dParameters = dParameters + p + '="' + val + '"';
  190. }
  191. dParameters = dParameters + ",";
  192. }
  193. dParameters = dParameters.replace(/,$/, "");
  194. requestHeaders.push("X-Verify-Credentials-Authorization: " + (dParameters))
  195. //X-Auth-Service-Providerの処理
  196. requestHeaders.push("X-Auth-Service-Provider: " + (this.imageUploadSettings.providerAction));
  197. return requestHeaders;
  198. },
  199. getDelegateParameters: function(params){
  200. var parameters = Object.extend({
  201. //apiKeyがあればをセットしておく
  202. key: this.imageUploadSettings.apiKey
  203. }, params.parameters ||
  204. {});
  205. return parameters;
  206. },
  207. imageUpload: function(target, inParams){
  208. var params = Object.extend({
  209. onSuccess: function(transport){
  210. },
  211. onFailure: function(transport){
  212. },
  213. onComplete: function(){
  214. },
  215. args: {}
  216. }, inParams ||
  217. {});
  218. //delegate用にヘッダを組み立て直す
  219. var tParameters = this.splitParameters(target); //parametersの切り出し
  220. var requestHeaders = this.getRequestHeaders(tParameters); //ヘッダの作成
  221. //delegate用のparametersを取得する
  222. var parameters = this.getDelegateParameters(params);
  223. var onSuccess = function(transport){
  224. params.onSuccess(transport);
  225. }.bind(this);
  226. var onFailure = function(transport, errText){
  227. params.onFailure(transport, errText);
  228. }.bind(this);
  229. var onComplete = function(){
  230. params.onComplete();
  231. }.bind(this);
  232. return this.uploadRequest(this.imageUploadSettings.api.upload.url, {
  233. controller: params.controller,
  234. method: this.imageUploadSettings.api.upload.method, //uploadではmethodは指定できないがとりあえずのコテしておく
  235. requestHeaders: requestHeaders,
  236. parameters: parameters,
  237. onSuccess: onSuccess,
  238. onFailure: onFailure,
  239. onComplete: onComplete
  240. })
  241. },
  242. // == エラー関連 =====================================
  243. // エラー一覧と、errorテキストを取り出す処理など
  244. // =================================================
  245. err: {
  246. timeOutError: {
  247. status: "408",
  248. text: $L("Request Time-out"),
  249. }
  250. },
  251. getErrorText: function(responseText){
  252. var ret = "";
  253. try {
  254. var json = Mojo.parseJSON(responseText);
  255. if (json) {
  256. //if (json.errors&&json.errors&&json.errors.length>0&&json.errors[0].message) { //TwitPicエラーフォーマット->複数かえってきたとの情報も見たいのでする
  257. // ret = json.errors[0].message;
  258. //}
  259. }
  260. } catch (e) {
  261. }
  262. return ret;
  263. }
  264. });