/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ /* vim: set ts=8 sts=2 et sw=2 tw=80: */ /* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #ifndef MOZ_ZUCCHINI_H #define MOZ_ZUCCHINI_H // This is the zucchini interface exposed to updater.cpp. To mimic the way we // interface with bspatch, this interface assumes that the caller will first // load a patch, then check the size and crc32 of the source file on their own, // and finally call us back to apply the patch. To achieve this, we essentially // split zucchini::ApplyCommon into two separate functions MappedPatch::Load // and MappedPatch::ApplyUnsafe. The latter is called unsafe because we rely on // the assumption that the caller has properly checked the size and crc32 of // the source file. For this purpose, we also expose a function to compute the // zucchini crc32. #include #include namespace zucchini { namespace status { // Zucchini status code, which can also be used as process exit code. Therefore // success is explicitly 0. enum Code { kStatusSuccess = 0, kStatusInvalidParam = 1, kStatusFileReadError = 2, kStatusFileWriteError = 3, kStatusPatchReadError = 4, kStatusPatchWriteError = 5, kStatusInvalidOldImage = 6, kStatusInvalidNewImage = 7, kStatusDiskFull = 8, kStatusIoError = 9, kStatusFatal = 10, }; } // namespace status namespace mozilla { using LogFunctionPtr = void (*)(const char* aMessage); void SetLogFunction(LogFunctionPtr aLogFunction); uint32_t ComputeCrc32(const uint8_t* aBuf, size_t aBufSize); class MappedPatchImpl; class MappedPatch { public: MappedPatch(); ~MappedPatch(); status::Code Load(FILE* aPatchFile, uint32_t* aSourceSize, uint32_t* aDestinationSize, uint32_t* aSourceCrc32); // Applies the loaded patch to aOldImage, and writes the result to // aNewFile. aNewFile is never deleted, cleanup is up to the caller. // Assumes that the crc32 and size of aCheckOldImage have already been // checked by the caller, hence the name. status::Code ApplyUnsafe(const uint8_t* aCheckedOldImage, size_t aCheckedOldImageSize, FILE* aNewFile); private: MappedPatchImpl* mImpl; }; } // namespace mozilla } // namespace zucchini #endif // MOZ_ZUCCHINI_H