Commit Graph
214 Commits
Author SHA1 Message Date
Alexander Tkachev 13351a730d CLOUD: Add OneDrive::info()
Unfortunately, OneDrive doesn't share quota information anymore because
of some reason. I had to get as much information as I could.
2016-08-24 16:07:55 +06:00
Alexander Tkachev 3638c8348d CLOUD: Make SavesSyncRequest work with OneDrive
It actually works fine, but small Storage::savesDirectoryPath() was
added, because Dropbox's directories must start with a slash, and
OneDrive's directories must not.

Saves sync tested and it works fine with OneDrive.
2016-08-24 16:07:55 +06:00
Alexander Tkachev b39f46788a CLOUD: Add OneDriveUploadRequest
Doesn't support server's requested ranges yet.

Commit also adds some PUT-related code in NetworkReadStream and
CurlRequest.
2016-08-24 16:07:55 +06:00
Alexander Tkachev eb63b50b7f CLOUD: Refactor Request
Added ErrorResponse and ErrorCallback. Each Request now has an
ErrorCallback, which should be called instead of usual callback in case
of failure.
2016-08-24 16:07:55 +06:00
Alexander Tkachev 001b417f33 CLOUD: Fix OneDriveTokenRefresher
It was calling finish(), causing stack overflow.

Some minor changes are added also.
2016-08-24 16:07:55 +06:00
Alexander Tkachev af37ecca34 CLOUD: Make SavesSyncRequest work
It now actually read the "timestamps" file, loads and saves files as it
should, ignores Dropbox's "not_found" error.
2016-08-24 16:07:55 +06:00
Alexander Tkachev aa987e5c52 CLOUD: Add ListDirectoryStatus struct
It contains flags to indicate whether Request was interrupted or failed,
so dependent Requests may see that list is incomplete.
2016-08-24 16:07:55 +06:00
Alexander Tkachev a19fc52c32 CLOUD: Make DropboxUploadRequest use "/upload" too
If file could be uploaded in one API call, no need to create a session
(which requires at least two calls: to start and then to finish it).
2016-08-24 16:07:55 +06:00
Alexander Tkachev b9e3730ccd CLOUD: Add UploadStatus struct
It contains not just "success" flag, but also "file" struct, so the
caller can find out some information about uploaded file - like
timestamp.
2016-08-24 16:07:55 +06:00
Alexander Tkachev d917592099 CLOUD: Add DropboxUploadRequest 2016-08-24 16:07:55 +06:00
Alexander Tkachev c235aa29f9 CLOUD: Add SavesSyncRequest sketch
Never tested it, actually. It requires Storage to implement upload()
method and me to find some way to get saves' ReadStream.

The saveTimestamps() and loadTimestamps() part should be tested, other
parts should work fine.
2016-08-24 16:07:55 +06:00
Alexander Tkachev 1747f8ec42 CLOUD: Add "device_id" into configuration file 2016-08-24 16:07:55 +06:00
Peter Bozsó 86d5b1b2e1 Remove some unnecessary blank lines 2016-08-24 16:07:55 +06:00
Peter Bozsó 81c34adaef Fix comment formatting 2016-08-24 16:07:55 +06:00
Peter Bozsó f4dfaed19d Replace 0 constant with nullptr in getCurrentStorage() 2016-08-24 16:07:55 +06:00
Alexander Tkachev 6f35fc4272 CLOUD: Add OneDriveStorage::downloadFolder()
Just uses FolderDownloadRequest the way DropboxStorage does.
2016-08-24 16:07:55 +06:00
Alexander Tkachev b74d7a6861 CLOUD: Fix Requests destructors
I forgot to delete callbacks!
2016-08-24 16:07:55 +06:00
Alexander Tkachev 827c7e43da CLOUD: Add OneDriveListDirectoryRequest
Works as charm.
2016-08-24 16:07:55 +06:00
Alexander Tkachev 14d60e62f8 CLOUD: Fix format string warnings
I get 'warning: ISO C++98 does not support the '%lg' ms_printf format'
warning though.
2016-08-24 16:07:55 +06:00
Alexander Tkachev 8aa87815a6 CLOUD: Fix "global destructor" warning
Plain char * is used instead of Common::String in DropboxStorage and
OneDriveStorage's KEY and SECRET.
2016-08-24 16:07:55 +06:00
Alexander Tkachev 0ef1cda172 CLOUD: Add FolderDownloadRequest
Uses Storage's listDirectory() and download() methods to download
contents.
2016-08-24 16:07:55 +06:00
Alexander Tkachev 6c01edc57a CLOUD: Simplify OneDriveTokenRefresher
It now just extends CurlJsonRequest, not wraps one.
2016-08-24 16:07:55 +06:00
Alexander Tkachev dcbaeb57c4 CLOUD: Fix OneDriveTokenRefresher
Failed to update token in header when "Bearer" was used instead of
"bearer".
2016-08-24 16:07:55 +06:00
Alexander Tkachev 1348befe29 CLOUD: Add access to CurlRequest's Stream
One can access CurlRequest's NetworkReadStream in order to find out HTTP
response code or some other Stream-related data.

OneDriveTokenRefresher uses it to print some info on that 404 error I'm
trying to troubleshoot.
2016-08-24 16:07:55 +06:00
Alexander Tkachev 98150beb38 CLOUD: Refactor ConnectionManager/Requests system
ConnectionManager now storages Request * (not generates ids for it),
Requests have control on their RequestState, RequestIdPair is now called
Response and storages Request * with some response together.

All related classes are changed to use it in more clean and
understandable way.

Request, RequestState and Response are carefully commented/documented.
2016-08-24 16:07:55 +06:00
Alexander Tkachev 83b349a033 CLOUD: Make OneDriveStorage::download() work fine
Well, it takes two API calls instead of one now, but there are no
problems with expired token because of it.

This commit changes Storage::streamFile() to pass NetworkReadStream *
through callback.
2016-08-24 16:07:55 +06:00
Alexander Tkachev 24007c029b CLOUD: Add OneDriveStorage::download()
Doesn't work when token is invalid, though.
2016-08-24 16:07:55 +06:00
Alexander Tkachev 8f6bcdf55d CLOUD: Add OneDriveTokenRefresher
OneDriveTokenRefresher is a CurlJsonRequest replacement for
OneDriveStorage methods. It behaves very similarly, but checks received
JSON before passing it to user. If it contains "error" key, it attempts
to refresh the token through OneDriveStorage, and then restarts the
original request, so user won't notice that there ever was an error.
2016-08-24 16:07:55 +06:00
Alexander Tkachev b246c17850 CLOUD: Fix CurlJsonRequest to use JsonCallback
Type safety first.
2016-08-24 16:07:55 +06:00
Alexander Tkachev a7b28605a0 CLOUD: Change Request::handle()
With new ConnectionManager upgrade Requests indicate that they are
finished with RequestInfo.state. No need to use handle() return value
anymore.
2016-08-24 16:07:55 +06:00
Alexander Tkachev f4547f44df CLOUD: Add RequestIdPair struct
Can be used with Callback<T> (means it's still type safe). It's used to
pass not only Request id to user's callback, but also a value user
wanted.

void *data field is removed from RequestInfo.
2016-08-24 16:07:55 +06:00
Alexander Tkachev 62ccf1f902 CLOUD: Add RequestInfo struct
ConnectionManager upgrade: it now contains a special struct for each
request, so you can access request status and data by request id.
2016-08-24 16:07:55 +06:00
Alexander Tkachev eda575a660 CLOUD: Add Requests id
(Upgrading ConnectionManager step by step.)
2016-08-24 16:07:55 +06:00
Alexander Tkachev ae8e7f39f5 CLOUD: Make download() create necessary directories
DumpFile::open() with createPath=true create would create the missing
directories from the path before opening a file. Thus, one can easily
create a file and avoid "can't open a file" error.
2016-08-24 16:07:55 +06:00
Alexander Tkachev 5e346ea6fb CLOUD: Add OneDrive refresh_token support
It might be not that easy to restart the request after new token
received, though.
2016-08-24 16:07:55 +06:00
Alexander Tkachev 5f4bbe6e9e CLOUD: Add OneDrive Storage stub
Knows how to OAuth already.

This commit also adds CloudManager::addStorage(), so OneDriveStorage can
add newly created Storage and CloudManager can save it in the
configuration file.
2016-08-24 16:07:55 +06:00
Alexander Tkachev caaa4c5a5d CLOUD: Make DownloadRequest write to local file
Tested with .jpg file. Transfer complete, CRC-32 is the same.
2016-08-24 16:07:55 +06:00
Alexander Tkachev 826a2a921c CLOUD: Add DownloadRequest stub
It reads the passed NetworkReadStream and prints its contents onto
console (for now). It would be writing contents into file.

To simplify work with raw NetworkReadStream there is a new CurlRequest.
It basically does nothing, but as ConnMan handles transfers only if
there is an active Request, you need some Request to get
NetworkReadStream working. Thus, there is a CurlRequest, which is active
until NetworkReadStream is completely read. CurlRequest also has useful
addHeader() and addPostField() methods in order to customize the request
easily. Use execute() method to get its NetworkReadStream.

DropboxStorage implements streamFile() and download() API methods. As
DownloadRequest is incomplete, it is not actually downloading a file,
though.
2016-08-24 16:07:55 +06:00
Alexander Tkachev 3582f6165c CLOUD: Change ISO8601 to use strchr
I'm not sure it works as it should though.
2016-08-24 16:07:55 +06:00
Alexander Tkachev e53e3d188b CLOUD: Add DropboxListDirectoryRequest
Does multiple CurlJsonRequests while Dropbox returns "has_more" = true.
2016-08-24 16:07:55 +06:00
Alexander Tkachev 735db74b90 CLOUD: Add DropboxStorage::listDirectory sketch
It doesn't support any "has_more", doesn't call user's callback and just
prints JSON instead of parsing in into an array of files.

I believe it would become DropboxListDirectoryRequest in the next
commit.
2016-08-24 16:07:55 +06:00
Alexander Tkachev a439bd4c33 CLOUD: Make StorageInfo useful
It now contains a few useful methods to get name or quota usage.

DropboxStorage returns a finely filled StorageInfo.
2016-08-24 16:07:55 +06:00
Alexander Tkachev 41e65db7d0 CLOUD: Add Storage saving mechanism
In this commit CloudManager starts supporting multiple Storage. Now, in
its init() it loads all the Storages and determines the current one.

It now also has save() method. In that method all Storages are saved
with their new saveConfig() method.

CloudManager::save() not called from anywhere, though. The only one
Storage that could be added is DropboxStorage in case you have no
cloud-related config keys or you have no storages connected.
2016-08-24 16:07:55 +06:00
Alexander Tkachev b570499164 CLOUD: Add Callback typedefs
And do some minor cleanup work.
2016-08-24 16:07:55 +06:00
Alexander Tkachev 9e531e3ce7 CLOUD: Polish Callbacks
Cleaned up all example code and old callbacks.

New Callback classes are introduced in "common/callback.h" and
documented.
2016-08-24 16:07:55 +06:00
Alexander Tkachev e1109c0c32 CLOUD: Add CallbackBridge
This commit also adds GlobalFunctionCallback, because it was needed in
order to replace plain C pointers to functions (which were used in
Request) into our object-oriented BaseCallback pointers.
2016-08-24 16:07:55 +06:00
Alexander Tkachev ca456a7241 CLOUD: Add object-oriented Callbacks
These callbacks can call object's methods, not some global C functions.

DropboxStorage::info2() and DropboxStorage::infoMethodCallback()
demonstrate the idea.
2016-08-24 16:07:55 +06:00
Alexander Tkachev 17eb5f9143 CLOUD: Add complex callbacks
Originally, I intended to add Storage API, StorageFile and StorageInfo
stubs. When I tried to implement a simple info() call, I ended up fixing
Request to contain some pointer field and all callbacks to have Request*
parameter. And, now I have to place callback pointer into Request. which
calls another callback.

And, eventually, these "simple" callbacks would again require another
pointer (to some caller class).
2016-08-24 16:07:55 +06:00
Alexander Tkachev f913675c43 CLOUD: Add ConnectionManager hotfix
Tried to compile these two last commits with GCC and found a few minor
problems.
2016-08-24 16:07:55 +06:00
Alexander Tkachev 0a947618fb CLOUD: Make ConnectionManager singleton
With ConnectionManager singleton one can start their Requests without
creating Storage instance. Moreover, Storage instance should contain
cloud API, not Requests-related handling and timer starting methods.
Thus, these methods were moved into ConnectionManager itself.
2016-08-24 16:07:55 +06:00