/app/models/upload/upload-req.js
JavaScript | 283 lines | 217 code | 19 blank | 47 comment | 26 complexity | e19b335acae2240ada0e87af760534c9 MD5 | raw file
- //----
- // Copyright (c) 2010-2011 hankei6km
- // License: MIT License (http://opensource.org/licenses/mit-license.php)
- //----
- var UploadReq = Class.create({
- initialize: function(){
- },
- imageUploadSettings: {
- providerMethod: "GET",
- providerAction: "https://api.twitter.com/1/account/verify_credentials.json",
- apiKey: "ca611a17f58706682c325d9dd8c45a03",
- api: {
- upload: {
- method: "POST",
- url: "http://api.twitpic.com/2/upload.json"
- }
- }
- },
-
- // == DownloadManager関連の操作 =====================
- // タイムアウトの制御、キャンセルなどを行う
- // =================================================
- uploadRequest: function(target, inParams){
- var params = Object.extend({
- onSuccess: function(transport){
- },
- onFailure: function(transport, errText){
- },
- onComplete: function(){
- },
- //timeout: 2 //アップロードは60分 -> は多すぎか? ※※※いまテストで値を小さくしてある。あとで直すこと
- timeout: 3600 //アップロードは60分 -> は多すぎか?
- }, inParams ||
- {});
-
- var onComplete = function(transport){
- this.uploadRequestComplete(params, timeoutId, transport);
- }.bind(this);
- params.uploadComplete = onComplete; //onSuccessなどで実行される
- params.uploadProgress = this.uploadProgress.bind(this.params);
-
- var req = new Mojo.Service.Request("palm://com.palm.downloadmanager", {
- method: "upload",
- parameters: {
- fileName: params.parameters.media,
- url: target,
- fileLabel: "media", //この指定がpostParametersのkeyに相当する?
- postParameters: [{
- key: "key",
- data: params.parameters.key
- }, {
- key: "message",
- data: params.parameters.message
- }],
- customHttpHeaders: params.requestHeaders,
- subscribe: true
- },
- onSuccess: this.uploadRequestSuccess.bind(this, params),
- onFailure: this.uploadRequestFailure.bind(this, params)
- });
-
- //タイムアウトを設定する(downloadmanagerのタイムアウト設定方法がわからなかったので、独自に処理を入れる)
- //とりあえず60分で様子を見る。
- var timeoutId = window.setTimeout(this.uploadRequestTimeout.bind(this, req, params), 1000 * params.timeout);
-
- return this.uploadRequestAbort.bind(this, req, params);
-
- },
- uploadRequestAbort: function(req, params){
- //Mojo.Log.info("+++++ uploadRequestAbort params.ticket:" + params.ticket)
- //params.ticketはuploadのonSuccessで受け取っている
- if (params.ticket) {
- var cancelReq = new Mojo.Service.Request('palm://com.palm.downloadmanager/', {
- method: 'cancelDownload',
- parameters: {
- "ticket": params.ticket
- },
- onSuccess: function(resp){
- //uploadメソッドのonCompleteが動くので、ここはとくになにもしない。
- },
- onFailure: function(e){
- this.uploadRequestFailure(params, e);
- }
- });
- }
-
- //req.cancel(); //serviceを使っている
- },
-
- uploadRequestTimeout: function(req, params){
- //Mojo.Log.info("+++++ uploadRequestTimeout ")
- this.uploadRequestFailure(params, {
- httpCode: this.err.timeOutError.status,
- responseString: this.err.timeOutError.text
- }, this.err.timeOutError.text);
- this.uploadRequestAbort(req, params);
- },
-
- uploadRequestTimeoutClear: function(timeoutId){
- if (timeoutId != undefined) {
- //Mojo.Log.info("+++++ timeout clear")
- window.clearTimeout(timeoutId);
- }
- },
- //--
- uploadProgress: function(params, resp){
-
- },
- //----
- uploadRequestSuccess: function(params, resp){
- //Mojo.Log.info("----upload success:" + Object.toJSON(resp));
- if (resp.completed) {
- if (resp.completionCode == 0 && resp.httpCode == 200) {
- params.onSuccess({
- status: resp.httpCode,
- responseText: resp.responseString
- });
- params.uploadComplete({
- status: resp.httpCode,
- responseText: resp.responseString
- });//完了したのでonComplete実行
- } else if (resp.httpCode == 0) {
- //resp.completionCodeが0以外でもresp.httpCodeが0ならおそらくキャンセルなどと思われるのでfailureにはしない
- params.uploadComplete({
- status: resp.httpCode,
- responseText: resp.responseString
- });//0のときはonCompleteのみ実行
- } else {
- this.uploadRequestFailure(params, resp);
- }
- } else {
- if (resp.httpCode == undefined && !params.ticket) {
- //ticketを持っていないので、upload開始直後
- params.ticket = resp.ticket;
- //StatusQueryを開始する(現状では使えない->DevForumを見ると要望はあがっているようなので残しておく)
- //params.progressReq = new Mojo.Service.Request('palm://com.palm.downloadmanager/', {
- // method: 'downloadStatusQuery',
- // parameters: {"ticket": params.ticket,},
- // onSuccess: function(resp){},
- // onFailure: function(e){}
- //});
- } else {
- if (resp.httpCode == 0) {
- //resp.completionCodeが0以外でもresp.httpCodeが0ならおそらくキャンセルなどと思われるのでfailureにはしない
- params.uploadComplete({
- status: resp.httpCode,
- responseText: resp.responseString
- });//0のときはonCompleteのみ実行
- } else {
- this.uploadRequestFailure(params, resp);
- }
- }
- }
- },
- uploadRequestFailure: function(params, e){
- //Mojo.Log.info("====upload failure:" + Object.toJSON(e));
- var errText = this.getErrorText(e.responseString); //errors要素からのテキストを取り出す
- params.onFailure({
- status: e.httpCode,
- responseText: e.responseString
- }, errText);
- params.uploadComplete({
- status: e.httpCode,
- responseText: e.responseString
- });//完了したのでonComplete実行
- },
- uploadRequestComplete: function(params, timeoutId, transport){
- //Mojo.Log.info("+++++ uploadRequestComplete")
- //reqを削除して、通信状態を解除する
- this.uploadRequestTimeoutClear(timeoutId);
- if (params.progressReq != undefined) {
- params.progressReq.cancel();
- }
- params.onComplete();
- },
- // == OAuth echo関連の操作 ===========================
- // 署名されたtargetからOAuth echo用にヘッダ組み立て直しなど
- // =================================================
- splitParameters: function(target){
- //parametersを切り分ける
- var ret = {};
- var tstr = target.split("?");
- var ptbl = tstr[1].split("&");
- for (var idx = 0; idx < ptbl.length; idx++) {
- pstr = ptbl[idx].split("=");
- ret[pstr[0]] = pstr[1];
- }
- return ret;
- },
- getRequestHeaders: function(tParameters){
- requestHeaders = new Array(0);
-
- //X-Verify-Credentials-Authorizationの処理
- var XVerifyCredentialsAuthorizationTbl = ["oauth_consumer_key", "oauth_signature_method", "oauth_token", "oauth_timestamp", "oauth_nonce", "oauth_version", "oauth_signature"];
- var dParameters = 'OAuth realm="http://api.twitter.com/",';
- for (var idx = 0; idx < XVerifyCredentialsAuthorizationTbl.length; idx++) {
- var p = XVerifyCredentialsAuthorizationTbl[idx];
- var val = tParameters[p];
- if (val) {
- dParameters = dParameters + p + '="' + val + '"';
- }
- dParameters = dParameters + ",";
- }
- dParameters = dParameters.replace(/,$/, "");
- requestHeaders.push("X-Verify-Credentials-Authorization: " + (dParameters))
-
- //X-Auth-Service-Providerの処理
- requestHeaders.push("X-Auth-Service-Provider: " + (this.imageUploadSettings.providerAction));
-
- return requestHeaders;
- },
- getDelegateParameters: function(params){
- var parameters = Object.extend({
- //apiKeyがあればをセットしておく
- key: this.imageUploadSettings.apiKey
- }, params.parameters ||
- {});
- return parameters;
- },
- imageUpload: function(target, inParams){
- var params = Object.extend({
- onSuccess: function(transport){
- },
- onFailure: function(transport){
- },
- onComplete: function(){
- },
- args: {}
- }, inParams ||
- {});
-
- //delegate用にヘッダを組み立て直す
- var tParameters = this.splitParameters(target); //parametersの切り出し
- var requestHeaders = this.getRequestHeaders(tParameters); //ヘッダの作成
- //delegate用のparametersを取得する
- var parameters = this.getDelegateParameters(params);
-
- var onSuccess = function(transport){
- params.onSuccess(transport);
- }.bind(this);
- var onFailure = function(transport, errText){
- params.onFailure(transport, errText);
- }.bind(this);
- var onComplete = function(){
- params.onComplete();
- }.bind(this);
-
-
- return this.uploadRequest(this.imageUploadSettings.api.upload.url, {
- controller: params.controller,
- method: this.imageUploadSettings.api.upload.method, //uploadではmethodは指定できないがとりあえずのコテしておく
- requestHeaders: requestHeaders,
- parameters: parameters,
- onSuccess: onSuccess,
- onFailure: onFailure,
- onComplete: onComplete
- })
-
- },
- // == エラー関連 =====================================
- // エラー一覧と、errorテキストを取り出す処理など
- // =================================================
- err: {
- timeOutError: {
- status: "408",
- text: $L("Request Time-out"),
- }
- },
- getErrorText: function(responseText){
- var ret = "";
- try {
- var json = Mojo.parseJSON(responseText);
- if (json) {
- //if (json.errors&&json.errors&&json.errors.length>0&&json.errors[0].message) { //TwitPicエラーフォーマット->複数かえってきたとの情報も見たいのでする
- // ret = json.errors[0].message;
- //}
- }
- } catch (e) {
- }
- return ret;
- }
-
- });