From 02640f1f89461e173fe2deaf39bf368e1ed21878 Mon Sep 17 00:00:00 2001 From: benweet Date: Fri, 27 Dec 2013 01:01:11 +0100 Subject: [PATCH] Secondary Google account (part6) --- public/res/helpers/googleHelper.js | 230 ++++++++++-------- public/res/providers/gdriveProviderBuilder.js | 15 +- 2 files changed, 135 insertions(+), 110 deletions(-) diff --git a/public/res/helpers/googleHelper.js b/public/res/helpers/googleHelper.js index de5c4599..61a42301 100644 --- a/public/res/helpers/googleHelper.js +++ b/public/res/helpers/googleHelper.js @@ -113,6 +113,8 @@ define([ authorizationMgrMap[accountId] = authorizationMgr; } task.onRun(function() { + var currentToken = gapi.auth.getToken(); + var newToken; function loadGdriveClient() { if(gapi.client.drive) { task.chain(); @@ -126,7 +128,7 @@ define([ $.ajax({ url: 'https://www.googleapis.com/oauth2/v1/tokeninfo', data: { - access_token: gapi.auth.getToken().access_token + access_token: newToken.access_token }, timeout: constants.AJAX_TIMEOUT, type: "GET" @@ -138,7 +140,7 @@ define([ else { authorizationMgr.setUserId(data.user_id); authorizationMgr.add(permission); - authorizationMgr.token = gapi.auth.getToken(); + authorizationMgr.token = newToken; task.chain(loadGdriveClient); } }).fail(function(jqXHR) { @@ -166,6 +168,8 @@ define([ immediate: immediate, authuser: immediate === false ? '' : authuser }, function(authResult) { + newToken = gapi.auth.getToken(); + gapi.auth.setToken(currentToken); if(!authResult || authResult.error) { if(connected === true && immediate === true) { // If immediate did not work retry without immediate @@ -199,7 +203,6 @@ define([ function startAuthenticate() { immediate = true; if(authorizationMgr.token && authorizationMgr.isAuthorized(permission)) { - gapi.auth.setToken(authorizationMgr.token); task.chain(); return; } @@ -219,6 +222,14 @@ define([ authenticate(task, 'gdrive', accountId); task.enqueue(); }; + + function runWithToken(accountId, functionToRun) { + var currentToken = gapi.auth.getToken(); + var authorizationMgr = authorizationMgrMap[accountId]; + gapi.auth.setToken(authorizationMgr.token); + functionToRun(); + gapi.auth.setToken(currentToken); + } googleHelper.upload = function(fileId, parentId, title, content, contentType, etag, accountId, callback) { var result; @@ -274,36 +285,38 @@ define([ close_delim ].join(""); - var request = gapi.client.request({ - 'path': path, - 'method': method, - 'params': { - 'uploadType': 'multipart', - }, - 'headers': headers, - 'body': multipartRequestBody, - }); - request.execute(function(response) { - if(response && response.id) { - // Upload success - result = response; - result.content = content; - task.chain(); - return; - } - var error = response.error; - // Handle error - if(error !== undefined && fileId !== undefined) { - if(error.code === 404) { - error = 'File ID "' + fileId + '" not found on Google Drive.|removePublish'; + runWithToken(accountId, function() { + var request = gapi.client.request({ + 'path': path, + 'method': method, + 'params': { + 'uploadType': 'multipart', + }, + 'headers': headers, + 'body': multipartRequestBody, + }); + request.execute(function(response) { + if(response && response.id) { + // Upload success + result = response; + result.content = content; + task.chain(); + return; } - else if(error.code === 412) { - // We may have missed a file update - storage.removeItem(accountId + ".gdrive.lastChangeId"); - error = 'Conflict on file ID "' + fileId + '". Please restart the synchronization.'; + var error = response.error; + // Handle error + if(error !== undefined && fileId !== undefined) { + if(error.code === 404) { + error = 'File ID "' + fileId + '" not found on Google Drive.|removePublish'; + } + else if(error.code === 412) { + // We may have missed a file update + storage.removeItem(accountId + ".gdrive.lastChangeId"); + error = 'Conflict on file ID "' + fileId + '". Please restart the synchronization.'; + } } - } - handleError(error, task); + handleError(error, task); + }); }); }); task.onSuccess(function() { @@ -322,25 +335,27 @@ define([ authenticate(task, 'gdrive', accountId); task.onRun(function() { var body = {'title': title}; - var request = gapi.client.drive.files.patch({ - 'fileId': fileId, - 'resource': body - }); - request.execute(function(response) { - if(response && response.id) { - // Rename success - result = response; - task.chain(); - return; - } - var error = response.error; - // Handle error - if(error !== undefined && fileId !== undefined) { - if(error.code === 404) { - error = 'File ID "' + fileId + '" not found on Google Drive.|removePublish'; + runWithToken(accountId, function() { + var request = gapi.client.drive.files.patch({ + 'fileId': fileId, + 'resource': body + }); + request.execute(function(response) { + if(response && response.id) { + // Rename success + result = response; + task.chain(); + return; } - } - handleError(error, task); + var error = response.error; + // Handle error + if(error !== undefined && fileId !== undefined) { + if(error.code === 404) { + error = 'File ID "' + fileId + '" not found on Google Drive.|removePublish'; + } + } + handleError(error, task); + }); }); }); task.onSuccess(function() { @@ -371,17 +386,19 @@ define([ } ]; } - var request = gapi.client.drive.files.insert({ - 'resource': metadata - }); - request.execute(function(response) { - if(response && response.id) { - // Upload success - result = response; - task.chain(); - return; - } - handleError(response.error, task); + runWithToken(accountId, function() { + var request = gapi.client.drive.files.insert({ + 'resource': metadata + }); + request.execute(function(response) { + if(response && response.id) { + // Upload success + result = response; + task.chain(); + return; + } + handleError(response.error, task); + }); }); }); task.onSuccess(function() { @@ -402,36 +419,38 @@ define([ task.onRun(function() { var nextPageToken; function retrievePageOfChanges() { - var request; - if(nextPageToken === undefined) { - request = gapi.client.drive.changes.list({ - 'startChangeId': newChangeId + 1 - }); - } - else { - request = gapi.client.drive.changes.list({ - 'pageToken': nextPageToken - }); - } - - request.execute(function(response) { - if(!response || !response.largestChangeId) { - // Handle error - handleError(response.error, task); - return; - } - // Retrieve success - newChangeId = response.largestChangeId; - nextPageToken = response.nextPageToken; - if(response.items !== undefined) { - changes = changes.concat(response.items); - } - if(nextPageToken !== undefined) { - task.chain(retrievePageOfChanges); + runWithToken(accountId, function() { + var request; + if(nextPageToken === undefined) { + request = gapi.client.drive.changes.list({ + 'startChangeId': newChangeId + 1 + }); } else { - task.chain(); + request = gapi.client.drive.changes.list({ + 'pageToken': nextPageToken + }); } + + request.execute(function(response) { + if(!response || !response.largestChangeId) { + // Handle error + handleError(response.error, task); + return; + } + // Retrieve success + newChangeId = response.largestChangeId; + nextPageToken = response.nextPageToken; + if(response.items !== undefined) { + changes = changes.concat(response.items); + } + if(nextPageToken !== undefined) { + task.chain(retrievePageOfChanges); + } + else { + task.chain(); + } + }); }); } task.chain(retrievePageOfChanges); @@ -460,9 +479,9 @@ define([ } var id = ids[0]; var headers = {}; - var token = gapi.auth.getToken(); - if(token) { - headers.Authorization = "Bearer " + token.access_token; + var authorizationMgr = authorizationMgrMap[accountId]; + if(authorizationMgr && authorizationMgr.token) { + headers.Authorization = "Bearer " + authorizationMgr.token.access_token; } $.ajax({ url: "https://www.googleapis.com/drive/v2/files/" + id, @@ -539,9 +558,9 @@ define([ return; } var headers = {}; - var token = gapi.auth.getToken(); - if(token) { - headers.Authorization = "Bearer " + token.access_token; + var authorizationMgr = authorizationMgrMap[accountId]; + if(authorizationMgr && authorizationMgr.token) { + headers.Authorization = "Bearer " + authorizationMgr.token.access_token; } $.ajax({ url: file.downloadUrl, @@ -581,6 +600,8 @@ define([ connect(task); authenticate(task, 'gdrive', accountId); task.onRun(function() { + var authorizationMgr = authorizationMgrMap[accountId]; + gapi.auth.setToken(authorizationMgr.token); gapi.drive.realtime.load(fileId, function(result) { // onFileLoaded doc = result; @@ -604,10 +625,11 @@ define([ }; googleHelper.uploadImg = function(name, content, albumId, callback) { + var accountId = 'google.picasa0'; var result; var task = new AsyncTask(); connect(task); - authenticate(task, 'picasa', 'google.picasa0'); + authenticate(task, 'picasa', accountId); task.onRun(function() { var headers = { "Slug": name @@ -621,9 +643,9 @@ define([ else if(name.match(/.gif$/i)) { headers["Content-Type"] = "image/gif"; } - var token = gapi.auth.getToken(); - if(token) { - headers.Authorization = "Bearer " + token.access_token; + var authorizationMgr = authorizationMgrMap[accountId]; + if(authorizationMgr && authorizationMgr.token) { + headers.Authorization = "Bearer " + authorizationMgr.token.access_token; } $.ajax({ @@ -742,6 +764,7 @@ define([ } loadPicker(task); task.onRun(function() { + var authorizationMgr = authorizationMgrMap[accountId]; var pickerBuilder = new google.picker.PickerBuilder(); pickerBuilder.setAppId(constants.GOOGLE_DRIVE_APP_ID); var view; @@ -758,7 +781,7 @@ define([ pickerBuilder.enableFeature(google.picker.Feature.NAV_HIDDEN); pickerBuilder.enableFeature(google.picker.Feature.MULTISELECT_ENABLED); pickerBuilder.addView(view); - pickerBuilder.setOAuthToken(gapi.auth.getToken().access_token); + authorizationMgr && authorizationMgr.token && pickerBuilder.setOAuthToken(authorizationMgr.token.access_token); } else if(pickerType == 'folder') { view = new google.picker.DocsView(google.picker.ViewId.FOLDERS); @@ -768,7 +791,7 @@ define([ view.setMimeTypes('application/vnd.google-apps.folder'); pickerBuilder.enableFeature(google.picker.Feature.NAV_HIDDEN); pickerBuilder.addView(view); - pickerBuilder.setOAuthToken(gapi.auth.getToken().access_token); + authorizationMgr && authorizationMgr.token && pickerBuilder.setOAuthToken(authorizationMgr.token.access_token); } else if(pickerType == 'img') { view = new google.picker.PhotosView(); @@ -806,14 +829,15 @@ define([ }; googleHelper.uploadBlogger = function(blogUrl, blogId, postId, labelList, isDraft, publishDate, title, content, callback) { + var accountId = 'google.blogger0'; var task = new AsyncTask(); connect(task); - authenticate(task, 'blogger', 'google.blogger0'); + authenticate(task, 'blogger', accountId); task.onRun(function() { var headers = {}; - var token = gapi.auth.getToken(); - if(token) { - headers.Authorization = "Bearer " + token.access_token; + var authorizationMgr = authorizationMgrMap[accountId]; + if(authorizationMgr && authorizationMgr.token) { + headers.Authorization = "Bearer " + authorizationMgr.token.access_token; } function uploadPost() { var url = "https://www.googleapis.com/blogger/v3/blogs/" + blogId + "/posts/"; diff --git a/public/res/providers/gdriveProviderBuilder.js b/public/res/providers/gdriveProviderBuilder.js index 928b15f9..97c2db04 100644 --- a/public/res/providers/gdriveProviderBuilder.js +++ b/public/res/providers/gdriveProviderBuilder.js @@ -199,7 +199,7 @@ define([ var localTitle = fileDesc.title; // File deleted if(change.deleted === true) { - eventMgr.onError('"' + localTitle + '" has been removed from Google Drive.'); + eventMgr.onError('"' + localTitle + '" has been removed from ' + providerName + '.'); fileDesc.removeSyncLocation(syncAttributes); eventMgr.onSyncRemoved(fileDesc, syncAttributes); if(syncAttributes.isRealtime === true && fileMgr.currentFile === fileDesc) { @@ -226,13 +226,13 @@ define([ if(fileTitleChanged && remoteTitleChanged === true) { fileDesc.title = file.title; eventMgr.onTitleChanged(fileDesc); - eventMgr.onMessage('"' + localTitle + '" has been renamed to "' + file.title + '" on Google Drive.'); + eventMgr.onMessage('"' + localTitle + '" has been renamed to "' + file.title + '" on ' + providerName + '.'); } // If file content changed if(!syncAttributes.isRealtime && fileContentChanged && remoteContentChanged === true) { fileDesc.content = file.content; eventMgr.onContentChanged(fileDesc); - eventMgr.onMessage('"' + file.title + '" has been updated from Google Drive.'); + eventMgr.onMessage('"' + file.title + '" has been updated from ' + providerName + '.'); if(fileMgr.currentFile === fileDesc) { fileMgr.selectFile(); // Refresh editor } @@ -443,7 +443,7 @@ define([ googleHelper.refreshGdriveToken(accountId); } else if(err.type == "not_found") { - eventMgr.onError('"' + fileDesc.title + '" has been removed from Google Drive.'); + eventMgr.onError('"' + fileDesc.title + '" has been removed from ' + providerName + '.'); fileDesc.removeSyncLocation(syncAttributes); eventMgr.onSyncRemoved(fileDesc, syncAttributes); gdriveProvider.stopRealtimeSync(); @@ -482,10 +482,11 @@ define([ $('.submenu-sync-' + providerId).toggle(settings.gdriveMultiAccount > accountIndex); // Create export dialog - document.querySelector('.modal-upload-' + providerId).innerHTML = _.template(dialogExportGdriveHTML, { + var modalUploadElt = document.querySelector('.modal-upload-' + providerId); + modalUploadElt && (modalUploadElt.innerHTML = _.template(dialogExportGdriveHTML, { providerId: providerId, providerName: providerName - }); + })); // Choose folder button in export modal $('.export-' + providerId + '-choose-folder').click(function() { @@ -522,7 +523,7 @@ define([ syncLocations[syncAttributes.syncIndex] = syncAttributes; var fileDesc = fileMgr.createFile(file.title, file.content, syncLocations); fileMgr.selectFile(fileDesc); - eventMgr.onMessage('"' + file.title + '" created successfully on Google Drive.'); + eventMgr.onMessage('"' + file.title + '" created successfully on ' + providerName + '.'); }); } else if(state.action == "open") {