The JUCE cross-platform C++ framework, with DISTRHO/KXStudio specific changes
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

92 lines
2.7KB

  1. /*
  2. ==============================================================================
  3. This file is part of the JUCE library.
  4. Copyright (c) 2022 - Raw Material Software Limited
  5. JUCE is an open source library subject to commercial or open-source
  6. licensing.
  7. By using JUCE, you agree to the terms of both the JUCE 7 End-User License
  8. Agreement and JUCE Privacy Policy.
  9. End User License Agreement: www.juce.com/juce-7-licence
  10. Privacy Policy: www.juce.com/juce-privacy-policy
  11. Or: You may also use this code under the terms of the GPL v3 (see
  12. www.gnu.org/licenses).
  13. JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER
  14. EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE
  15. DISCLAIMED.
  16. ==============================================================================
  17. */
  18. namespace juce
  19. {
  20. namespace build_tools
  21. {
  22. uint64 calculateStreamHashCode (InputStream& in)
  23. {
  24. uint64 t = 0;
  25. const int bufferSize = 4096;
  26. HeapBlock<uint8> buffer;
  27. buffer.malloc (bufferSize);
  28. for (;;)
  29. {
  30. auto num = in.read (buffer, bufferSize);
  31. if (num <= 0)
  32. break;
  33. for (int i = 0; i < num; ++i)
  34. t = t * 65599 + buffer[i];
  35. }
  36. return t;
  37. }
  38. uint64 calculateFileHashCode (const File& file)
  39. {
  40. std::unique_ptr<FileInputStream> stream (file.createInputStream());
  41. return stream != nullptr ? calculateStreamHashCode (*stream) : 0;
  42. }
  43. uint64 calculateMemoryHashCode (const void* data, size_t numBytes)
  44. {
  45. uint64 t = 0;
  46. for (size_t i = 0; i < numBytes; ++i)
  47. t = t * 65599 + static_cast<const uint8*> (data)[i];
  48. return t;
  49. }
  50. bool overwriteFileWithNewDataIfDifferent (const File& file, const void* data, size_t numBytes)
  51. {
  52. if (file.getSize() == (int64) numBytes
  53. && calculateMemoryHashCode (data, numBytes) == calculateFileHashCode (file))
  54. return true;
  55. if (file.exists())
  56. return file.replaceWithData (data, numBytes);
  57. return file.getParentDirectory().createDirectory() && file.appendData (data, numBytes);
  58. }
  59. bool overwriteFileWithNewDataIfDifferent (const File& file, const MemoryOutputStream& newData)
  60. {
  61. return overwriteFileWithNewDataIfDifferent (file, newData.getData(), newData.getDataSize());
  62. }
  63. bool overwriteFileWithNewDataIfDifferent (const File& file, const String& newData)
  64. {
  65. const char* const utf8 = newData.toUTF8();
  66. return overwriteFileWithNewDataIfDifferent (file, utf8, strlen (utf8));
  67. }
  68. }
  69. }