diff --git a/docs/application-config-options.md b/docs/application-config-options.md index 169e2631..825f6dcc 100644 --- a/docs/application-config-options.md +++ b/docs/application-config-options.md @@ -68,6 +68,7 @@ Before reading this document, please ensure you are running application version - [CLI Option: --destination-directory](#cli-option---destination-directory) - [CLI Option: --display-config](#cli-option---display-config) - [CLI Option: --display-sync-status](#cli-option---display-sync-status) + - [CLI Option: --display-quota](#cli-option---display-quota) - [CLI Option: --force](#cli-option---force) - [CLI Option: --force-sync](#cli-option---force-sync) - [CLI Option: --get-file-link](#cli-option---get-file-link) @@ -947,6 +948,11 @@ _**Usage Example:**_ `onedrive --display-sync-status` _**Additional Usage Notes:**_ This option can also use the `--single-directory` option to determine the sync status of a specific directory within the configured 'sync_dir' +### CLI Option: ---display-quota +_**Description:**_ This CLI option will display the quota status of the account drive id or the configured 'drive_id' value + +_**Usage Example:**_ `onedrive --display-quota` + ### CLI Option: --force _**Description:**_ This CLI option enables the force the deletion of data when a 'big delete' is detected. diff --git a/src/config.d b/src/config.d index a3c0cf59..987eccee 100644 --- a/src/config.d +++ b/src/config.d @@ -975,6 +975,7 @@ class ApplicationConfig { stringValues["auth_response"] = ""; boolValues["display_config"] = false; boolValues["display_sync_status"] = false; + boolValues["display_quota"] = false; boolValues["print_token"] = false; boolValues["logout"] = false; boolValues["reauth"] = false; @@ -1044,6 +1045,9 @@ class ApplicationConfig { "display-sync-status", "Display the sync status of the client - no sync will be performed.", &boolValues["display_sync_status"], + "display-quota", + "Display the quota status of the client - no sync will be performed.", + &boolValues["display_quota"], "download-only", "Replicate the OneDrive online state locally, by only downloading changes from OneDrive. Do not upload local changes to OneDrive.", &boolValues["download_only"], @@ -2006,6 +2010,18 @@ class ApplicationConfig { operationalConflictDetected = true; } + // --monitor and --display-quota cannot be used together + if ((getValueBool("monitor")) && (getValueBool("display_quota"))) { + log.error("ERROR: --monitor and --display-quota cannot be used together"); + operationalConflictDetected = true; + } + + // --sync and and --display-quota cannot be used together + if ((getValueBool("synchronize")) && (getValueBool("display_quota"))) { + log.error("ERROR: --sync and and --display-quota cannot be used together"); + operationalConflictDetected = true; + } + // --force-sync can only be used when using --sync --single-directory if (getValueBool("force_sync")) { diff --git a/src/main.d b/src/main.d index 7277c3b3..cc81d3b7 100644 --- a/src/main.d +++ b/src/main.d @@ -401,6 +401,7 @@ int main(string[] cliArgs) { // - Are we just creating a directory online, without any sync being performed? // - Are we just deleting a directory online, without any sync being performed? // - Are we renaming or moving a directory? + // - Are we displaying the quota information? // --get-sharepoint-drive-id - Get the SharePoint Library drive_id if (appConfig.getValueString("sharepoint_library_name") != "") { @@ -488,6 +489,15 @@ int main(string[] cliArgs) { return EXIT_SUCCESS; } + // Are we displaying the quota information? + if (appConfig.getValueBool("display_quota")) { + // Query and respond with the quota details + syncEngineInstance.queryOneDriveForQuotaDetails(); + // Exit application + // Use exit scopes to shutdown API + return EXIT_SUCCESS; + } + // If we get to this point, we have not performed a 'no-sync' task .. log.error("\nYour command line input is missing either the '--sync' or '--monitor' switches. Please include one (but not both) of these switches in your command line, or refer to 'onedrive --help' for additional guidance.\n"); log.error("It is important to note that you must include one of these two arguments in your command line for the application to perform a synchronisation with Microsoft OneDrive\n"); diff --git a/src/sync.d b/src/sync.d index d71f44c5..7b7e214b 100644 --- a/src/sync.d +++ b/src/sync.d @@ -7017,4 +7017,85 @@ class SyncEngine { log.error("Selected path not found on local system: ", inputFilePath); } } + + // Query OneDrive for the quota details + void queryOneDriveForQuotaDetails() { + // This function is similar to getRemainingFreeSpace() but is different in data being analysed and output method + + JSONValue currentDriveQuota; + string driveId; + + if (appConfig.getValueString("drive_id").length) { + driveId = appConfig.getValueString("drive_id"); + } else { + driveId = appConfig.defaultDriveId; + } + + try { + // Create a new OneDrive API instance + OneDriveApi getCurrentDriveQuotaApiInstance; + getCurrentDriveQuotaApiInstance = new OneDriveApi(appConfig); + getCurrentDriveQuotaApiInstance.initialise(); + log.vdebug("Seeking available quota for this drive id: ", driveId); + currentDriveQuota = getCurrentDriveQuotaApiInstance.getDriveQuota(driveId); + // Shut this API instance down + getCurrentDriveQuotaApiInstance.shutdown(); + // Free object and memory + object.destroy(getCurrentDriveQuotaApiInstance); + } catch (OneDriveException e) { + log.vdebug("currentDriveQuota = onedrive.getDriveQuota(driveId) generated a OneDriveException"); + } + + // validate that currentDriveQuota is a JSON value + if (currentDriveQuota.type() == JSONType.object) { + // was 'quota' in response? + if ("quota" in currentDriveQuota) { + + // debug output of response + log.vdebug("currentDriveQuota: ", currentDriveQuota); + + // human readable output of response + string deletedValue = "Not Provided"; + string remainingValue = "Not Provided"; + string stateValue = "Not Provided"; + string totalValue = "Not Provided"; + string usedValue = "Not Provided"; + + // Update values + if ("deleted" in currentDriveQuota["quota"]) { + deletedValue = to!string(currentDriveQuota["quota"]["deleted"].integer); + } + + if ("remaining" in currentDriveQuota["quota"]) { + remainingValue = to!string(currentDriveQuota["quota"]["remaining"].integer); + } + + if ("state" in currentDriveQuota["quota"]) { + stateValue = currentDriveQuota["quota"]["state"].str; + } + + if ("total" in currentDriveQuota["quota"]) { + totalValue = to!string(currentDriveQuota["quota"]["total"].integer); + } + + if ("used" in currentDriveQuota["quota"]) { + usedValue = to!string(currentDriveQuota["quota"]["used"].integer); + } + + writeln("Microsoft OneDrive quota information as reported for this Drive ID: ", driveId); + writeln(); + writeln("Deleted: ", deletedValue); + writeln("Remaining: ", remainingValue); + writeln("State: ", stateValue); + writeln("Total: ", totalValue); + writeln("Used: ", usedValue); + writeln(); + writeln("The numeric values above are expressed in bytes"); + + } else { + writeln("Microsoft OneDrive quota information is being restricted for this Drive ID: ", driveId); + } + + } + } } \ No newline at end of file