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.

91 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::build_tools
  19. {
  20. uint64 calculateStreamHashCode (InputStream& in)
  21. {
  22. uint64 t = 0;
  23. const int bufferSize = 4096;
  24. HeapBlock<uint8> buffer;
  25. buffer.malloc (bufferSize);
  26. for (;;)
  27. {
  28. auto num = in.read (buffer, bufferSize);
  29. if (num <= 0)
  30. break;
  31. for (int i = 0; i < num; ++i)
  32. t = t * 65599 + buffer[i];
  33. }
  34. return t;
  35. }
  36. uint64 calculateFileHashCode (const File& file)
  37. {
  38. std::unique_ptr<FileInputStream> stream (file.createInputStream());
  39. return stream != nullptr ? calculateStreamHashCode (*stream) : 0;
  40. }
  41. uint64 calculateMemoryHashCode (const void* data, size_t numBytes)
  42. {
  43. uint64 t = 0;
  44. for (size_t i = 0; i < numBytes; ++i)
  45. t = t * 65599 + static_cast<const uint8*> (data)[i];
  46. return t;
  47. }
  48. bool overwriteFileWithNewDataIfDifferent (const File& file, const void* data, size_t numBytes)
  49. {
  50. if (file.getSize() == (int64) numBytes
  51. && calculateMemoryHashCode (data, numBytes) == calculateFileHashCode (file))
  52. return true;
  53. if (file.exists())
  54. return file.replaceWithData (data, numBytes);
  55. return file.getParentDirectory().createDirectory() && file.appendData (data, numBytes);
  56. }
  57. bool overwriteFileWithNewDataIfDifferent (const File& file, const MemoryOutputStream& newData)
  58. {
  59. return overwriteFileWithNewDataIfDifferent (file, newData.getData(), newData.getDataSize());
  60. }
  61. bool overwriteFileWithNewDataIfDifferent (const File& file, const String& newData)
  62. {
  63. const char* const utf8 = newData.toUTF8();
  64. return overwriteFileWithNewDataIfDifferent (file, utf8, strlen (utf8));
  65. }
  66. } // namespace juce::build_tools