34509fca3c
The C surface in `library/src/c_api` was a single bucket of `pub extern "C"` functions covering both consumers — `package:shorebird_code_push` (via ffigen) and Shorebird's Flutter engine fork (via direct C++ link). That made it hard to reason about which symbols are stable ABI versus internal, and ffigen was generating bindings for engine-only symbols that no Dart code calls. Split into two self-contained submodules and two cbindgen-generated headers: - `c_api::dart` → `include/updater_dart.h` (stable ABI; ffigen entry point). Defines `UpdateResult`, the `SHOREBIRD_*` status constants, and the five Dart-stable functions: `shorebird_current_boot_patch_number`, `shorebird_next_boot_patch_number`, `shorebird_check_for_downloadable_update`, `shorebird_update_with_result`, `shorebird_free_update_result`. - `c_api::engine` → `include/updater_engine.h` (no stability guarantee). Defines `AppParameters`, `FileCallbacks`, and the engine-only functions: `shorebird_init`, `shorebird_should_auto_update`, `shorebird_validate_next_boot_patch`, `shorebird_next_boot_patch_path`, `shorebird_free_string`, `shorebird_start_update_thread`, and the `shorebird_report_launch_*` trio. Each bucket file is self-contained: cbindgen scans only the file (`with_src` in build.rs) and emits the items it defines plus the C types they reference. There are no exclude/include lists in the cbindgen configs — adding a function to one bucket automatically lands it in the right header, and items in the other bucket cannot leak. `mod.rs` shrinks to a thin layer of private helpers shared by both buckets (`to_rust`, `allocate_c_string`, `free_c_string`, `log_on_error`) plus the test module. `include/updater.h` is removed; consumers include the specific header for their use case. The Flutter engine's `shell/common/shorebird/updater.cc` will be updated in a follow-up engine-repo PR to include `updater_engine.h` directly. Also drops two retired Dart-side symbols: - `shorebird_update` (replaced by `shorebird_update_with_result` in the Dart 2.0 rewrite, Nov 2024). - `shorebird_check_for_update` (replaced by `shorebird_check_for_downloadable_update` in the same rewrite). The shorebird_code_push package's `_legacyFallback` was the only path that still called `shorebird_update`. The package's `flutter: >=3.24.5` constraint guarantees the engine has `shorebird_update_with_result`, so the fallback was unreachable in practice. Removing it lets us drop the ABI symbol. Bumps shorebird_code_push to 2.0.7. Bindings regenerated via ffigen now contain only the five Dart-stable symbols. Follow-up engine PR will: include `updater_engine.h` instead of the removed `updater.h`; clean up `android_exports.lst` (drop the ghost `shorebird_active_path` and `shorebird_active_patch_number` exports, drop `shorebird_check_for_update`).
114 lines
3.1 KiB
C
114 lines
3.1 KiB
C
#ifndef updater_dart_h
|
|
#define updater_dart_h
|
|
|
|
/* Warning, this file is autogenerated by cbindgen. Don't modify this manually. */
|
|
|
|
#include <stdarg.h>
|
|
#include <stdbool.h>
|
|
#include <stdint.h>
|
|
#include <stdlib.h>
|
|
#ifdef _WIN32
|
|
#define SHOREBIRD_EXPORT __declspec(dllexport)
|
|
#else
|
|
#define SHOREBIRD_EXPORT __attribute__((visibility("default")))
|
|
#endif
|
|
|
|
|
|
/**
|
|
* An unknown error occurred while updating. The update was not installed.
|
|
* This is a catch-all for errors that don't fit into the other categories.
|
|
*/
|
|
#define SHOREBIRD_UPDATE_ERROR -1
|
|
|
|
/**
|
|
* No update is available (e.g. the app is already up-to-date)
|
|
*/
|
|
#define SHOREBIRD_NO_UPDATE 0
|
|
|
|
/**
|
|
* An update was installed successfully. It will boot from the update on the
|
|
* next app launch.
|
|
*/
|
|
#define SHOREBIRD_UPDATE_INSTALLED 1
|
|
|
|
/**
|
|
* An error occurred while updating. The update was not installed.
|
|
*/
|
|
#define SHOREBIRD_UPDATE_HAD_ERROR 2
|
|
|
|
/**
|
|
* The downloaded patch was not installed because it was invalid.
|
|
*/
|
|
#define SHOREBIRD_UPDATE_IS_BAD_PATCH 3
|
|
|
|
/**
|
|
* Another update was already in progress when this call was made. The
|
|
* already-running update will continue; the caller did not start a new one.
|
|
* This is a benign outcome, not an error.
|
|
*/
|
|
#define SHOREBIRD_UPDATE_IN_PROGRESS 4
|
|
|
|
typedef struct UpdateResult {
|
|
int32_t status;
|
|
const char *message;
|
|
} UpdateResult;
|
|
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif // __cplusplus
|
|
|
|
/**
|
|
* The currently running patch number, or 0 if the release has not been
|
|
* patched. The internal name for this concept is `running_patch`; the
|
|
* FFI symbol keeps the historical `current_boot_patch_number` spelling
|
|
* because the Flutter Engine and existing pub releases of
|
|
* `shorebird_code_push` link against it.
|
|
*/
|
|
SHOREBIRD_EXPORT uintptr_t shorebird_current_boot_patch_number(void);
|
|
|
|
/**
|
|
* The patch number that will boot on the next run of the app, or 0 if there is
|
|
* no next patch.
|
|
*/
|
|
SHOREBIRD_EXPORT uintptr_t shorebird_next_boot_patch_number(void);
|
|
|
|
/**
|
|
* Check for an update on the first non-null channel of:
|
|
* 1. `c_channel`
|
|
* 2. The channel specified in shorebird.yaml
|
|
* 3. The default "stable" channel
|
|
*
|
|
* Returns true if an update exists that has not yet been downloaded.
|
|
*/
|
|
SHOREBIRD_EXPORT
|
|
bool shorebird_check_for_downloadable_update(const char *c_channel);
|
|
|
|
/**
|
|
* Synchronously download an update on the first non-null channel of:
|
|
* 1. `c_channel`
|
|
* 2. The channel specified in shorebird.yaml
|
|
* 3. The default "stable" channel
|
|
*
|
|
* Returns an [UpdateResult] indicating whether the update was successful.
|
|
*/
|
|
SHOREBIRD_EXPORT
|
|
const struct UpdateResult *shorebird_update_with_result(const char *c_channel);
|
|
|
|
/**
|
|
* Frees an `UpdateResult` previously returned by
|
|
* `shorebird_update_with_result`. Frees the embedded `message` string and
|
|
* the result allocation itself.
|
|
*
|
|
* # Safety
|
|
*
|
|
* `result` must be a valid pointer returned by `shorebird_update_with_result`,
|
|
* or null (in which case this is a no-op).
|
|
*/
|
|
SHOREBIRD_EXPORT void shorebird_free_update_result(struct UpdateResult *result);
|
|
|
|
#ifdef __cplusplus
|
|
} // extern "C"
|
|
#endif // __cplusplus
|
|
|
|
#endif /* updater_dart_h */
|