Souce Code (updated)
I wanted to write a small application which allows dragging and dropping multiple files and folders into a container in order to send them to an online storage. This article was written before Google introduced Google Drive, but it is still practical to use it for quick upload of multiple files to your Google Drive.
This article explains how to develop such an application that will use the free and the paid GoogleDocs service of storing documents and files online, allowing the end user to drag and drop files and entire folders and by doing so, backing up the selected files to a pre-defined GoogleDocs account.
Google Docs allows users to create and upload documents and files, work on them, and store them online. The service is free of charge; however, there are limitations which don’t exist when the paid service is used.
Google Docs Account Types
As described here, the free account type has its limitations when it comes to the types of files allowed to be uploaded. These limitations apply to the programmatic usage of the service, as opposed to using the online interface (docs.google.com).
To lift some of the limitations, the end user should hold a Premier account. Users of the free account can only upload HTML, PDF, Word, Excel, PowerPoint, OpenOffice, text, and images.
As a base, we have developed a class library named SmartHTTP.
We have defined:
#define HTTP_POST_VERB L"POST"
define HTTP_CONTENT_LENGTH L"Content-Length"
#define HTTP_CONTENT_TYPE L"Content-Type"
define HTTP_MIME_BINARY L"application/octet-stream"
#define HTTP_MIME_FORM_URL_ENCODED L"application/x-www-form-urlencoded"
Connecting to the GoogleDocs server is done by using:
BOOL Connect(LPCTSTR szServerName, INTERNET_PORT nServerPort = INTERNET_DEFAULT_HTTP_PORT);
and the call:
if (!m_internet.Connect(GOOGLE_LOGIN_SERVER, INTERNET_DEFAULT_HTTPS_PORT))
The Google Docs server is defined here:
GOOGLE_LOGIN_SERVER is L”www.google.com”
You may need to open an account with Google. A GMail account will do. If you are logged in, just go to http://docs.google.com.
Basically, my application is a container to which files and entire folders can be dragged and dropped, causing all files within them, including files inside subfolders, to be sent to the GoogleDocs server. When the application is started, the container appears.
Closing it will send it to the IconTray. The Icon application's Tray Icon is used to display status messages during runtime. For example, when a file is dragged to the container, it is being added to the queue, and the following message appears:
About the conversion to Google Docs format
Google Docs offers documents uploaded to be converted to Google Docs format. This conversion is explained here. From my experience, some types of documents may get corrupted as a result of such conversion, especially Word documents in right to left languages (Arabic, Hebrew, etc.).
For that reason, I have added a checkbox to allow the end user to decide whether to convert or not.
But before the first file can be copied, the Settings dialog pops up allowing the end user to enter the Google Docs account details. In addition, the following options can be set:
- Google Apps Premier Account - allows indicating the type of the account.
- List of Mirror Folders - allows adding (or deleting) local folders which will be mirrored at the server side keeping the structure of the files and folders under the given path.
- Recreate Folder Structure in Google Docs - when this option is set, documents are copied to a folder with the same name as the local one.
- Upload all Documents to the Root Google Docs folder - when this option is set, documents are copied to the root directory at the server side.
- Start Program on Windows Startup - launches DocsOnline when Windows starts.
Premier account holders can copy more types of files which are restricted for regular (free) accounts.
The logic behind my intuitive backup
I believe applications and utilities should be intuitive and easy to use. For example, my application allows dragging and dropping folders, and by doing so, all files, and files within all subfolders, are backed up, after checking against previous copies already on the server. The logic I use for such "intuitive backup" is done using an examination of each file and a calculation of a hash which represents its contents. This logic addresses the following scenarios:
- Different files having the same name - copy, but automatically generate a new name. Add a log entry.
- Identical files having different names - add a log entry (in a later version, we shall unite such files in to a single one with a single name).
- Identical files having the same name - skip.
The SystemTraySDK class by Chris Maunder, used in my application, is a light wrapper around the Windows system tray stuff. It adds an icon to the system tray with the specified tooltip text and callback notification value, which is sent back to the parent window.