diff --git a/src/log.d b/src/log.d index 02281bd2..638c719f 100644 --- a/src/log.d +++ b/src/log.d @@ -154,6 +154,7 @@ void notify(T...)(T args) private void logfileWriteLine(T...)(T args) { + static import std.exception; // Write to log file string logFileName = .logFilePath ~ .username ~ ".onedrive.log"; auto currentTime = Clock.currTime(); diff --git a/src/notifications/dnotify.d b/src/notifications/dnotify.d index 81ebd229..1cc09356 100644 --- a/src/notifications/dnotify.d +++ b/src/notifications/dnotify.d @@ -163,7 +163,7 @@ class Notification { this(in char[] summary, in char[] body_, in char[] icon="") in { assert(is_initted(), "call dnotify.init() before using Notification"); } - body { + do { this.summary = summary; this.body_ = body_; this.icon = icon; diff --git a/src/qxor.d b/src/qxor.d index 0e521a49..63e8f0f5 100644 --- a/src/qxor.d +++ b/src/qxor.d @@ -1,88 +1,88 @@ -import std.algorithm; -import std.digest; - -// implementation of the QuickXorHash algorithm in D -// https://github.com/OneDrive/onedrive-api-docs/blob/live/docs/code-snippets/quickxorhash.md -struct QuickXor -{ - private immutable int widthInBits = 160; - private immutable size_t lengthInBytes = (widthInBits - 1) / 8 + 1; - private immutable size_t lengthInQWords = (widthInBits - 1) / 64 + 1; - private immutable int bitsInLastCell = widthInBits % 64; // 32 - private immutable int shift = 11; - - private ulong[lengthInQWords] _data; - private ulong _lengthSoFar; - private int _shiftSoFar; - - nothrow @safe void put(scope const(ubyte)[] array...) - { - int vectorArrayIndex = _shiftSoFar / 64; - int vectorOffset = _shiftSoFar % 64; - immutable size_t iterations = min(array.length, widthInBits); - - for (size_t i = 0; i < iterations; i++) { - immutable bool isLastCell = vectorArrayIndex == _data.length - 1; - immutable int bitsInVectorCell = isLastCell ? bitsInLastCell : 64; - - if (vectorOffset <= bitsInVectorCell - 8) { - for (size_t j = i; j < array.length; j += widthInBits) { - _data[vectorArrayIndex] ^= cast(ulong) array[j] << vectorOffset; - } - } else { - int index1 = vectorArrayIndex; - int index2 = isLastCell ? 0 : (vectorArrayIndex + 1); - ubyte low = cast(ubyte) (bitsInVectorCell - vectorOffset); - - ubyte xoredByte = 0; - for (size_t j = i; j < array.length; j += widthInBits) { - xoredByte ^= array[j]; - } - - _data[index1] ^= cast(ulong) xoredByte << vectorOffset; - _data[index2] ^= cast(ulong) xoredByte >> low; - } - - vectorOffset += shift; - if (vectorOffset >= bitsInVectorCell) { - vectorArrayIndex = isLastCell ? 0 : vectorArrayIndex + 1; - vectorOffset -= bitsInVectorCell; - } - } - - _shiftSoFar = cast(int) (_shiftSoFar + shift * (array.length % widthInBits)) % widthInBits; - _lengthSoFar += array.length; - - } - - nothrow @safe void start() - { - _data = _data.init; - _shiftSoFar = 0; - _lengthSoFar = 0; - } - - nothrow @trusted ubyte[lengthInBytes] finish() - { - ubyte[lengthInBytes] tmp; - tmp[0 .. lengthInBytes] = (cast(ubyte*) _data)[0 .. lengthInBytes]; - for (size_t i = 0; i < 8; i++) { - tmp[lengthInBytes - 8 + i] ^= (cast(ubyte*) &_lengthSoFar)[i]; - } - return tmp; - } -} - -unittest -{ - assert(isDigest!QuickXor); -} - -unittest -{ - QuickXor qxor; - qxor.put(cast(ubyte[]) "The quick brown fox jumps over the lazy dog"); - assert(qxor.finish().toHexString() == "6CC4A56F2B26C492FA4BBE57C1F31C4193A972BE"); -} - -alias QuickXorDigest = WrapperDigest!(QuickXor); +import std.algorithm; +import std.digest; + +// implementation of the QuickXorHash algorithm in D +// https://github.com/OneDrive/onedrive-api-docs/blob/live/docs/code-snippets/quickxorhash.md +struct QuickXor +{ + private enum int widthInBits = 160; + private enum size_t lengthInBytes = (widthInBits - 1) / 8 + 1; + private enum size_t lengthInQWords = (widthInBits - 1) / 64 + 1; + private enum int bitsInLastCell = widthInBits % 64; // 32 + private enum int shift = 11; + + private ulong[lengthInQWords] _data; + private ulong _lengthSoFar; + private int _shiftSoFar; + + nothrow @safe void put(scope const(ubyte)[] array...) + { + int vectorArrayIndex = _shiftSoFar / 64; + int vectorOffset = _shiftSoFar % 64; + immutable size_t iterations = min(array.length, widthInBits); + + for (size_t i = 0; i < iterations; i++) { + immutable bool isLastCell = vectorArrayIndex == _data.length - 1; + immutable int bitsInVectorCell = isLastCell ? bitsInLastCell : 64; + + if (vectorOffset <= bitsInVectorCell - 8) { + for (size_t j = i; j < array.length; j += widthInBits) { + _data[vectorArrayIndex] ^= cast(ulong) array[j] << vectorOffset; + } + } else { + int index1 = vectorArrayIndex; + int index2 = isLastCell ? 0 : (vectorArrayIndex + 1); + ubyte low = cast(ubyte) (bitsInVectorCell - vectorOffset); + + ubyte xoredByte = 0; + for (size_t j = i; j < array.length; j += widthInBits) { + xoredByte ^= array[j]; + } + + _data[index1] ^= cast(ulong) xoredByte << vectorOffset; + _data[index2] ^= cast(ulong) xoredByte >> low; + } + + vectorOffset += shift; + if (vectorOffset >= bitsInVectorCell) { + vectorArrayIndex = isLastCell ? 0 : vectorArrayIndex + 1; + vectorOffset -= bitsInVectorCell; + } + } + + _shiftSoFar = cast(int) (_shiftSoFar + shift * (array.length % widthInBits)) % widthInBits; + _lengthSoFar += array.length; + + } + + nothrow @safe void start() + { + _data = _data.init; + _shiftSoFar = 0; + _lengthSoFar = 0; + } + + nothrow @trusted ubyte[lengthInBytes] finish() + { + ubyte[lengthInBytes] tmp; + tmp[0 .. lengthInBytes] = (cast(ubyte*) _data)[0 .. lengthInBytes]; + for (size_t i = 0; i < 8; i++) { + tmp[lengthInBytes - 8 + i] ^= (cast(ubyte*) &_lengthSoFar)[i]; + } + return tmp; + } +} + +unittest +{ + assert(isDigest!QuickXor); +} + +unittest +{ + QuickXor qxor; + qxor.put(cast(ubyte[]) "The quick brown fox jumps over the lazy dog"); + assert(qxor.finish().toHexString() == "6CC4A56F2B26C492FA4BBE57C1F31C4193A972BE"); +} + +alias QuickXorDigest = WrapperDigest!(QuickXor); diff --git a/src/sync.d b/src/sync.d index 707cb5d9..f0806120 100644 --- a/src/sync.d +++ b/src/sync.d @@ -2585,6 +2585,7 @@ final class SyncEngine // downloads a File resource private void downloadFileItem(const ref Item item, const(string) path) { + static import std.exception; assert(item.type == ItemType.file); write("Downloading file ", path, " ... "); JSONValue fileDetails; @@ -3825,6 +3826,7 @@ final class SyncEngine // upload new items to OneDrive private void uploadNewItems(const(string) path) { + static import std.utf; import std.range : walkLength; import std.uni : byGrapheme; // https://support.microsoft.com/en-us/help/3125202/restrictions-and-limitations-when-you-sync-files-and-folders @@ -6515,6 +6517,7 @@ final class SyncEngine // Query itemdb.computePath() and catch potential assert when DB consistency issue occurs string computeItemPath(string thisDriveId, string thisItemId) { + static import core.exception; string calculatedPath; log.vdebug("Attempting to calculate local filesystem path for ", thisDriveId, " and ", thisItemId); try {