Todo.txt-Enyo/app/source/Dropbox.js

230 lines
7.7 KiB
JavaScript

/*
* Copyright 2012 Morgan McMillian
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
*/
enyo.kind({
name: "Dropbox",
kind: enyo.Control,
published: {
token: "",
tokenSecret: "",
requestToken: "",
requestSecret: "",
authorized: false
},
events: {
"onAuthSuccess": "",
"onAuthFailure": "",
"onGetFileSuccess": "",
"onGetFileFailure": "",
"onPutFileSuccess": "",
"onPutFileFailure": "",
"onMetadataSuccess": "",
"onMetadataFailure": ""
},
components: [
{name: "authPopup", kind: "ModalDialog", components: [
{content: "Please click DONE to complete the process."},
{kind:"Button", caption:"DONE", onclick:"requestAccessToken"}
]},
{name: "openBrowser", kind: "PalmService",
service: "palm://com.palm.applicationManager",
method: "open", onSuccess: "launchSuccess",
onFailure: "launchFailed",
subscribe: true
},
{name: "webSrv", kind: "WebService" }
],
create: function() {
this.inherited(arguments);
this.contentURL = "https://api-content.dropbox.com/1";
this.apiURL = "https://api.dropbox.com/1";
this.mainURL = "https://www.dropbox.com/1";
/* valid values are either "dropbox" or "sandbox"
*
* See the following URL for the additional details.
* https://www.dropbox.com/developers/reference/api
*/
this.root = "dropbox";
/* The following two properties are contained in the
* dropbox-auth.js file. Dropbox will NOT work unless you
* update the file to contain the correct values.
*/
this.consumerKey = consumerKey;
this.consumerSecret = consumerSecret;
},
/* url - URL needed for a web service call
* params - (optional) Object containing paramters for the request
* body - (required for files_put) request body to be submitted
* method - method required for the request (GET, POST, PUT)
* onSuccess - callback function when web service call is successful
* onFailure - callback function when web service call has failed
*/
dropboxCall: function(url, params, body, method, onSuccess, onFailure) {
var token = (this.authorized) ? this.token : this.requestToken;
var secret = (this.authorized) ? this.tokenSecret : this.requestSecret;
var accessor = {
consumerKey: this.consumerKey,
consumerSecret: this.consumerSecret,
token: token,
tokenSecret: secret
};
var message = {
action: url,
method: method,
parameters: params
};
OAuth.completeRequest(message, accessor);
OAuth.SignatureMethod.sign(message, accessor);
var post = OAuth.formEncode(message.parameters);
if (url.match(/files_put/)) {
requrl = url + "?" + post;
this.$.webSrv.setContentType("text/plain");
} else {
body = post;
requrl = url;
}
this.$.webSrv.setUrl(requrl);
this.$.webSrv.setMethod(method);
this.$.webSrv.onSuccess = onSuccess;
this.$.webSrv.onFailure = onFailure;
this.$.webSrv.call(body);
},
/* ******************** OAuth Functions ******************** */
validateAccess: function() {
if (this.token.length > 0 && this.tokenSecret.length > 0) {
var url = this.apiURL + "/account/info";
this.dropboxCall(url, {}, "", "POST",
"doAuthSuccess", "doAuthFailure");
} else {
this.$.authPopup.openAtCenter();
this.startTokenRequest();
}
},
startTokenRequest: function() {
var url = this.apiURL + "/oauth/request_token";
this.dropboxCall(url, {}, "", "POST",
"processRequestToken", "doAuthFailure");
},
processRequestToken: function(inSender, inResponse, inRequest) {
if (inResponse) {
var url = this.mainURL + "/oauth/authorize?" + inResponse;
var tokens = inResponse.split("&");
this.requestSecret = tokens[0].split("=")[1];
this.requestToken = tokens[1].split("=")[1];
console.log("...launching browser window...");
if (this.owner.os == "BlackBerry") {
var args = new blackberry.invoke.BrowserArguments(url);
blackberry.invoke.invoke(
blackberry.invoke.APP_BROWSER, args);
} else {
this.$.openBrowser.call({
"target": url
});
}
}
},
requestAccessToken: function() {
var url = this.apiURL + "/oauth/access_token";
this.dropboxCall(url, {}, "", "POST",
"processAccessToken", "doAuthFailure");
},
processAccessToken: function(inSender, inResponse, inRequest) {
var tokens = inResponse.split("&");
var accessSecret = tokens[0].split("=")[1];
var accessToken = tokens[1].split("=")[1];
this.token = accessToken;
this.tokenSecret = accessSecret;
console.log("..authorized..");
//console.log(this.token);
//console.log(this.tokenSecret);
this.authorized = true;
this.doAuthSuccess();
this.$.authPopup.close();
},
/* ******************** Dropbox REST API ******************** */
/* file - Relative path of file to be uploaded.
* data - File contents to be uploaded.
* params - (optional) Object containing additional parameters.
*
* Returns the metadata for the uploaded file.
*
* See the following URL for the additional details
* https://www.dropbox.com/developers/reference/api#files_put
*/
putFile: function(file, data, params) {
var url = this.contentURL+"/files_put/"+this.root+file;
this.dropboxCall(url, params, data, "PUT",
"doPutFileSuccess", "doPutFileFailure");
},
/* file - Relative path of file to be retrieved
* rev - (optional) File revision to be retrieved. Defaults to
* the most recent revision.
*
* Returns the file contents at the requested revision. The
* HTTP response contains the content metadata in JSON format
* within an x-dropbox-metadata header.
*
* See the following URL for the additional details.
* https://www.dropbox.com/developers/reference/api#files_put
*/
getFile: function(file, rev) {
var url = this.contentURL+"/files/"+this.root+file;
var params = { rev: rev };
this.dropboxCall(url, params, "", "GET",
"doGetFileSuccess", "doGetFileFailure");
},
/* path - path to a file or folder
* params - (optional) Object containing additional parameters.
*
* Returns metadata for requested file or folder
*
* See the following URL for the additional details
* https://www.dropbox.com/developers/reference/api#metadata
*/
getMetadata: function(path, params) {
var url = this.apiURL+"/metadata/"+this.root+path;
this.dropboxCall(url, params, "", "GET",
"doMetadataSuccess", "doMetadataFailure");
}
});