diff options
| author | Alexander Tkachev | 2016-07-20 14:44:24 +0600 |
|---|---|---|
| committer | Alexander Tkachev | 2016-08-24 16:07:55 +0600 |
| commit | f743b319633dcd57ea08f5ac86d3daec548d1ab0 (patch) | |
| tree | ff02af57d11ce16e01c9adae9df081155f71aee5 /backends/cloud/onedrive | |
| parent | 0200694dd050409eec7a30efd8a616ab6b1fdae1 (diff) | |
| download | scummvm-rg350-f743b319633dcd57ea08f5ac86d3daec548d1ab0.tar.gz scummvm-rg350-f743b319633dcd57ea08f5ac86d3daec548d1ab0.tar.bz2 scummvm-rg350-f743b319633dcd57ea08f5ac86d3daec548d1ab0.zip | |
CLOUD: Fix CloudManager::connectStorage() memory leak
Diffstat (limited to 'backends/cloud/onedrive')
| -rw-r--r-- | backends/cloud/onedrive/onedrivestorage.cpp | 18 | ||||
| -rw-r--r-- | backends/cloud/onedrive/onedrivestorage.h | 3 |
2 files changed, 17 insertions, 4 deletions
diff --git a/backends/cloud/onedrive/onedrivestorage.cpp b/backends/cloud/onedrive/onedrivestorage.cpp index 3c8ea5fe81..e9165943af 100644 --- a/backends/cloud/onedrive/onedrivestorage.cpp +++ b/backends/cloud/onedrive/onedrivestorage.cpp @@ -57,12 +57,16 @@ OneDriveStorage::OneDriveStorage(Common::String accessToken, Common::String user _token(accessToken), _uid(userId), _refreshToken(refreshToken) {} OneDriveStorage::OneDriveStorage(Common::String code) { - getAccessToken(new Common::Callback<OneDriveStorage, BoolResponse>(this, &OneDriveStorage::codeFlowComplete), code); + getAccessToken( + new Common::Callback<OneDriveStorage, BoolResponse>(this, &OneDriveStorage::codeFlowComplete), + new Common::Callback<OneDriveStorage, Networking::ErrorResponse>(this, &OneDriveStorage::codeFlowFailed), + code + ); } OneDriveStorage::~OneDriveStorage() {} -void OneDriveStorage::getAccessToken(BoolCallback callback, Common::String code) { +void OneDriveStorage::getAccessToken(BoolCallback callback, Networking::ErrorCallback errorCallback, Common::String code) { if (!KEY || !SECRET) loadKeyAndSecret(); bool codeFlow = (code != ""); @@ -73,7 +77,8 @@ void OneDriveStorage::getAccessToken(BoolCallback callback, Common::String code) } Networking::JsonCallback innerCallback = new Common::CallbackBridge<OneDriveStorage, BoolResponse, Networking::JsonResponse>(this, &OneDriveStorage::tokenRefreshed, callback); - Networking::CurlJsonRequest *request = new Networking::CurlJsonRequest(innerCallback, getErrorPrintingCallback(), "https://login.live.com/oauth20_token.srf"); //TODO + if (errorCallback == nullptr) errorCallback = getErrorPrintingCallback(); + Networking::CurlJsonRequest *request = new Networking::CurlJsonRequest(innerCallback, errorCallback, "https://login.live.com/oauth20_token.srf"); //TODO if (codeFlow) { request->addPostField("code=" + code); request->addPostField("grant_type=authorization_code"); @@ -117,6 +122,7 @@ void OneDriveStorage::tokenRefreshed(BoolCallback callback, Networking::JsonResp void OneDriveStorage::codeFlowComplete(BoolResponse response) { if (!response.value) { warning("OneDriveStorage: failed to get access token through code flow"); + CloudMan.removeStorage(this); return; } @@ -125,6 +131,12 @@ void OneDriveStorage::codeFlowComplete(BoolResponse response) { ConfMan.flushToDisk(); } +void OneDriveStorage::codeFlowFailed(Networking::ErrorResponse error) { + debug("OneDrive's code flow failed (%s, %ld):", (error.failed ? "failed" : "interrupted"), error.httpResponseCode); + debug("%s", error.response.c_str()); + CloudMan.removeStorage(this); +} + void OneDriveStorage::saveConfig(Common::String keyPrefix) { ConfMan.set(keyPrefix + "access_token", _token, ConfMan.kCloudDomain); ConfMan.set(keyPrefix + "user_id", _uid, ConfMan.kCloudDomain); diff --git a/backends/cloud/onedrive/onedrivestorage.h b/backends/cloud/onedrive/onedrivestorage.h index 650c240aef..8ceaaf107e 100644 --- a/backends/cloud/onedrive/onedrivestorage.h +++ b/backends/cloud/onedrive/onedrivestorage.h @@ -41,6 +41,7 @@ class OneDriveStorage: public Cloud::Storage { void tokenRefreshed(BoolCallback callback, Networking::JsonResponse response); void codeFlowComplete(BoolResponse response); + void codeFlowFailed(Networking::ErrorResponse error); /** Constructs StorageInfo based on JSON response from cloud. */ void infoInnerCallback(StorageInfoCallback outerCallback, Networking::JsonResponse json); @@ -101,7 +102,7 @@ public: * Use "" in order to refresh token and pass a callback, so you could * continue your work when new token is available. */ - void getAccessToken(BoolCallback callback, Common::String code = ""); + void getAccessToken(BoolCallback callback, Networking::ErrorCallback errorCallback = nullptr, Common::String code = ""); Common::String accessToken() { return _token; } }; |
