1 // The Antville Project 2 // http://code.google.com/p/antville 3 // 4 // Copyright 2007-2011 by Tobi Schäfer. 5 // 6 // Copyright 2001–2007 Robert Gaggl, Hannes Wallnöfer, Tobi Schäfer, 7 // Matthias & Michael Platzer, Christoph Lincke. 8 // 9 // Licensed under the Apache License, Version 2.0 (the ``License''); 10 // you may not use this file except in compliance with the License. 11 // You may obtain a copy of the License at 12 // 13 // http://www.apache.org/licenses/LICENSE-2.0 14 // 15 // Unless required by applicable law or agreed to in writing, software 16 // distributed under the License is distributed on an ``AS IS'' BASIS, 17 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 18 // See the License for the specific language governing permissions and 19 // limitations under the License. 20 // 21 // $Revision$ 22 // $Author$ 23 // $Date$ 24 // $URL$ 25 26 /** 27 * @fileoverview Defines the DropboxClient prototype similar to node-dropbox. 28 * @see https://github.com/evnm/dropbox-node 29 */ 30 31 app.addRepository("/Users/tobi/.m2/repository/oauth/signpost/signpost-core/1.2/signpost-core-1.2.jar"); 32 33 var DropboxClient = function(id, key) { 34 var API_URI = "https://api.dropbox.com/0"; 35 var CONTENT_API_URI = "https://api-content.dropbox.com/0"; 36 37 var consumer; 38 39 var signpost = Packages.oauth.signpost; 40 41 var provider = new signpost.basic.DefaultOAuthProvider( 42 API_URI + "/oauth/request_token", 43 API_URI + "/oauth/access_token", 44 API_URI + "/oauth/authorize"); 45 46 var get = function(url) { 47 res.debug(url); 48 var result; 49 var url = java.net.URL(url); 50 var request = url.openConnection(); 51 consumer.sign(request); 52 var status = request.getResponseCode(); 53 if (status === 200) { 54 var buffer; 55 var contentLength = request.contentLength; 56 if (request.getContentType().startsWith("text/") || contentLength === -1) { 57 buffer = []; 58 var streamReader = new java.io.InputStreamReader(request.getInputStream()); 59 var bufferedReader = new java.io.BufferedReader(streamReader); 60 var line; 61 while ((line = bufferedReader.readLine()) !== null) { 62 buffer.push(line); 63 } 64 streamReader.close(); 65 result = buffer.join(""); 66 } else { 67 buffer = java.lang.reflect.Array.newInstance(java.lang.Byte.TYPE, contentLength); 68 var inputStream = new java.io.BufferedInputStream(request.getInputStream()); 69 var bytesRead = 0, offset = 0; 70 while (offset < contentLength) { 71 bytesRead = inputStream.read(buffer, offset, buffer.length - offset); 72 if (bytesRead === -1) { 73 break; 74 } 75 offset += bytesRead; 76 } 77 inputStream.close(); 78 result = buffer; 79 } 80 request.disconnect(); 81 return result; 82 } 83 return null; 84 } 85 86 var post = function() { 87 88 } 89 90 this.connect = function(callback) { 91 if (!consumer) { 92 consumer = new signpost.basic.DefaultOAuthConsumer(id, key); 93 var url = provider.retrieveRequestToken(consumer, root.href(req.action)); 94 return callback(url); 95 } else if (req.data.oauth_token) { 96 provider.retrieveAccessToken(consumer, req.data.oauth_token); 97 consumer.setTokenWithSecret(consumer.getToken(), consumer.getTokenSecret()); 98 return callback(); 99 }/* else if (req.data.token && req.data.secret) { 100 consumer = new signpost.basic.DefaultOAuthConsumer(id, key); 101 consumer.setTokenWithSecret(req.data.token, req.data.secret); 102 res.redirect(callbackUrl); 103 }*/ 104 return; 105 } 106 107 this.getMetadata = function(remotePath, options, callback) { 108 if (typeof options === "function") callback = options, options = {}; 109 remotePath = escapePath(remotePath); 110 try { 111 var data = get(API_URI + "/metadata/dropbox" + remotePath + stringifyParams(options)); 112 return callback(null, JSON.parse(data)); 113 } catch (ex) { 114 return callback(ex); 115 } 116 } 117 118 this.getFile = function(remotePath, options, callback) { 119 if (typeof options === "function") callback = options, options = {}; 120 remotePath = escapePath(remotePath); 121 try { 122 var data = get(CONTENT_API_URI + "/files/dropbox" + remotePath + stringifyParams(options)); 123 return callback(null, data); 124 } catch (ex) { 125 return callback(ex); 126 } 127 } 128 129 this.test = function() { 130 var data = get(CONTENT_API_URI + "/files/dropbox/PlainText/Hello.txt"); 131 res.debug(data); 132 res.debug(stringifyParams({a: 1, b: 2})); 133 return; 134 } 135 136 function stringifyParams(param) { 137 var buffer = []; 138 for (let key in param) { 139 buffer.push(encodeURIComponent(key) + "=" + encodeURIComponent(param[key])); 140 } 141 return buffer.length > 0 ? "?" + buffer.join("&") : ""; 142 } 143 144 function escapePath(p) { 145 return encodeURIComponent(p).replace(/%2f/gi, '/'); 146 } 147 148 return this; 149 } 150