diff --git a/.github/workflows/linux.yaml b/.github/workflows/linux.yaml new file mode 100644 index 000000000000..be5db3638039 --- /dev/null +++ b/.github/workflows/linux.yaml @@ -0,0 +1,53 @@ +name: build-linux + +concurrency: + group: ${{ github.workflow }}-${{ github.ref }}-linux + cancel-in-progress: true + +on: + pull_request: + paths-ignore: + - 'docs/**' + - 'website/**' + - '**/example/**' + - '!**/example/integration_test/**' + - '**/flutterfire_ui/**' + - '**.md' + push: + branches: + - main + paths-ignore: + - 'docs/**' + - 'website/**' + - '**/example/**' + - '!**/example/integration_test/**' + - '**/flutterfire_ui/**' + - '**.md' + +permissions: + contents: read + +jobs: + linux: + runs-on: ubuntu-latest + timeout-minutes: 45 + steps: + - uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 + - name: "Install Linux desktop build dependencies" + run: | + sudo apt-get update + sudo apt-get install -y ninja-build libgtk-3-dev libsecret-1-dev + - uses: subosito/flutter-action@1a449444c387b1966244ae4d4f8c696479add0b2 + with: + channel: 'stable' + cache: true + cache-key: "flutter-:os:-:channel:-:version:-:arch:-:hash:" + pub-cache-key: "flutter-pub-:os:-:channel:-:version:-:arch:-:hash:" + - uses: bluefireteam/melos-action@705015c3d2bc4ab94201ac24accb2bbe070cf533 + with: + run-bootstrap: false + melos-version: '3.0.0' + - name: "Bootstrap package" + run: melos bootstrap --scope "firebase_core*" + - name: "Build Linux (Release)" + run: cd packages/firebase_core/firebase_core/example && flutter build linux --release diff --git a/README.md b/README.md index ea77c522637c..16a83caa6929 100644 --- a/README.md +++ b/README.md @@ -45,25 +45,25 @@ and open source. ## Stable Plugins -| Name | pub.dev | Firebase Product | Documentation | View Source | Android | iOS | Web | MacOS | Windows | -| ---------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------- | ------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------- | ------- | --- | --- | ----- | ------- | -| Analytics | [![Analytics pub.dev badge](https://img.shields.io/pub/v/firebase_analytics.svg)](https://pub.dev/packages/firebase_analytics) | [🔗](https://firebase.google.com/products/analytics) | [📖](https://firebase.google.com/docs/analytics/get-started?platform=flutter) | [`firebase_analytics`](https://github.com/FirebaseExtended/flutterfire/tree/main/packages/firebase_analytics) | ✔ | ✔ | ✔ | β | N/A | -| App Check | [![App Check pub.dev badge](https://img.shields.io/pub/v/firebase_app_check.svg)](https://pub.dev/packages/firebase_app_check) | [🔗](https://firebase.google.com/docs/app-check) | [📖](https://firebase.google.com/docs/app-check/flutter/default-providers) | [`firebase_app_check`](https://github.com/FirebaseExtended/flutterfire/tree/main/packages/firebase_app_check) | ✔ | ✔ | ✔ | β | N/A | -| Authentication | [![Authentication pub.dev badge](https://img.shields.io/pub/v/firebase_auth.svg)](https://pub.dev/packages/firebase_auth) | [🔗](https://firebase.google.com/products/auth) | [📖](https://firebase.google.com/docs/auth/flutter/start) | [`firebase_auth`](https://github.com/FirebaseExtended/flutterfire/tree/main/packages/firebase_auth) | ✔ | ✔ | ✔ | β | (*) | -| Cloud Firestore | [![Cloud Firestore pub.dev badge](https://img.shields.io/pub/v/cloud_firestore.svg)](https://pub.dev/packages/cloud_firestore) | [🔗](https://firebase.google.com/products/firestore) | [📖](https://firebase.google.com/docs/firestore/quickstart) | [`cloud_firestore`](https://github.com/FirebaseExtended/flutterfire/tree/main/packages/cloud_firestore) | ✔ | ✔ | ✔ | β | (*) | -| Cloud Functions | [![Cloud Functions pub.dev badge](https://img.shields.io/pub/v/cloud_functions.svg)](https://pub.dev/packages/cloud_functions) | [🔗](https://firebase.google.com/products/functions) | [📖](https://firebase.google.com/docs/functions/get-started?gen=2nd) | [`cloud_functions`](https://github.com/FirebaseExtended/flutterfire/tree/main/packages/cloud_functions) | ✔ | ✔ | ✔ | β | N/A | -| Cloud Messaging | [![Cloud Messaging pub.dev badge](https://img.shields.io/pub/v/firebase_messaging.svg)](https://pub.dev/packages/firebase_messaging) | [🔗](https://firebase.google.com/products/cloud-messaging) | [📖](https://firebase.google.com/docs/cloud-messaging/flutter/client) | [`firebase_messaging`](https://github.com/FirebaseExtended/flutterfire/tree/main/packages/firebase_messaging) | ✔ | ✔ | ✔ | β | N/A | -| Cloud Storage | [![Cloud Storage pub.dev badge](https://img.shields.io/pub/v/firebase_storage.svg)](https://pub.dev/packages/firebase_storage) | [🔗](https://firebase.google.com/products/storage) | [📖](https://firebase.google.com/docs/storage/flutter/start) | [`firebase_storage`](https://github.com/FirebaseExtended/flutterfire/tree/main/packages/firebase_storage) | ✔ | ✔ | ✔ | β | (*) | -| Core | [![Core pub.dev badge](https://img.shields.io/pub/v/firebase_core.svg)](https://pub.dev/packages/firebase_core) | [🔗](https://firebase.google.com) | [📖](https://firebase.google.com) | [`firebase_core`](https://github.com/FirebaseExtended/flutterfire/tree/main/packages/firebase_core) | ✔ | ✔ | ✔ | β | (*) | -| Crashlytics | [![Crashlytics pub.dev badge](https://img.shields.io/pub/v/firebase_crashlytics.svg)](https://pub.dev/packages/firebase_crashlytics) | [🔗](https://firebase.google.com/products/crashlytics) | [📖](https://firebase.google.com/docs/crashlytics/get-started?platform=flutter) | [`firebase_crashlytics`](https://github.com/FirebaseExtended/flutterfire/tree/main/packages/firebase_crashlytics) | ✔ | ✔ | N/A | β | N/A | -| Data Connect | [![Data Connect pub.dev badge](https://img.shields.io/pub/v/firebase_data_connect.svg)](https://pub.dev/packages/firebase_data_connect) | [🔗](https://firebase.google.com/products/data-connect) | [📖](https://firebase.google.com/docs/data-connect/quickstart-local?userflow=automatic#flutter) | [`firebase_data_connect`](https://github.com/FirebaseExtended/flutterfire/tree/main/packages/firebase_data_connect) | ✔ | ✔ | ✔ | N/A | N/A | -| In-App Messaging | [![In-App Messaging pub.dev badge](https://img.shields.io/pub/v/firebase_in_app_messaging.svg)](https://pub.dev/packages/firebase_in_app_messaging) | [🔗](https://firebase.google.com/products/in-app-messaging) | [📖](https://firebase.google.com/docs/in-app-messaging/get-started?platform=flutter) | [`firebase_in_app_messaging`](https://github.com/FirebaseExtended/flutterfire/tree/main/packages/firebase_in_app_messaging) | ✔ | ✔ | N/A | N/A | N/A | -| Installations | [![Installations pub.dev badge](https://img.shields.io/pub/v/firebase_app_installations.svg)](https://pub.dev/packages/firebase_app_installations) | [🔗](https://firebase.google.com/docs/projects/manage-installations) | [📖](https://firebase.google.com/docs/projects/manage-installations#flutter) | [`firebase_app_installations`](https://github.com/FirebaseExtended/flutterfire/tree/main/packages/firebase_app_installations) | ✔ | ✔ | ✔ | β | N/A | -| Performance Monitoring | [![Performance Monitoring pub.dev badge](https://img.shields.io/pub/v/firebase_performance.svg)](https://pub.dev/packages/firebase_performance) | [🔗](https://firebase.google.com/products/performance) | [📖](https://firebase.google.com/docs/perf-mon/flutter/get-started) | [`firebase_performance`](https://github.com/FirebaseExtended/flutterfire/tree/main/packages/firebase_performance) | ✔ | ✔ | ✔ | N/A | N/A | -| Realtime Database | [![Realtime Database pub.dev badge](https://img.shields.io/pub/v/firebase_database.svg)](https://pub.dev/packages/firebase_database) | [🔗](https://firebase.google.com/products/database) | [📖](https://firebase.google.com/docs/database/flutter/start) | [`firebase_database`](https://github.com/FirebaseExtended/flutterfire/tree/main/packages/firebase_database) | ✔ | ✔ | ✔ | β | N/A | -| Remote Config | [![Remote Config pub.dev badge](https://img.shields.io/pub/v/firebase_remote_config.svg)](https://pub.dev/packages/firebase_remote_config) | [🔗](https://firebase.google.com/products/remote-config) | [📖](https://firebase.google.com/docs/remote-config/get-started?platform=flutter) | [`firebase_remote_config`](https://github.com/FirebaseExtended/flutterfire/tree/main/packages/firebase_remote_config) | ✔ | ✔ | ✔ | β | N/A | - - (*) for development only. Production on Windows is not supported. +| Name | pub.dev | Firebase Product | Documentation | View Source | Android | iOS | Web | MacOS | Windows | Linux | +| ---------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------- | ------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------- | ------- | --- | --- | ----- | ------- | ----- | +| Analytics | [![Analytics pub.dev badge](https://img.shields.io/pub/v/firebase_analytics.svg)](https://pub.dev/packages/firebase_analytics) | [🔗](https://firebase.google.com/products/analytics) | [📖](https://firebase.google.com/docs/analytics/get-started?platform=flutter) | [`firebase_analytics`](https://github.com/FirebaseExtended/flutterfire/tree/main/packages/firebase_analytics) | ✔ | ✔ | ✔ | β | N/A | N/A | +| App Check | [![App Check pub.dev badge](https://img.shields.io/pub/v/firebase_app_check.svg)](https://pub.dev/packages/firebase_app_check) | [🔗](https://firebase.google.com/docs/app-check) | [📖](https://firebase.google.com/docs/app-check/flutter/default-providers) | [`firebase_app_check`](https://github.com/FirebaseExtended/flutterfire/tree/main/packages/firebase_app_check) | ✔ | ✔ | ✔ | β | N/A | (*) | +| Authentication | [![Authentication pub.dev badge](https://img.shields.io/pub/v/firebase_auth.svg)](https://pub.dev/packages/firebase_auth) | [🔗](https://firebase.google.com/products/auth) | [📖](https://firebase.google.com/docs/auth/flutter/start) | [`firebase_auth`](https://github.com/FirebaseExtended/flutterfire/tree/main/packages/firebase_auth) | ✔ | ✔ | ✔ | β | (*) | (*) | +| Cloud Firestore | [![Cloud Firestore pub.dev badge](https://img.shields.io/pub/v/cloud_firestore.svg)](https://pub.dev/packages/cloud_firestore) | [🔗](https://firebase.google.com/products/firestore) | [📖](https://firebase.google.com/docs/firestore/quickstart) | [`cloud_firestore`](https://github.com/FirebaseExtended/flutterfire/tree/main/packages/cloud_firestore) | ✔ | ✔ | ✔ | β | (*) | (*) | +| Cloud Functions | [![Cloud Functions pub.dev badge](https://img.shields.io/pub/v/cloud_functions.svg)](https://pub.dev/packages/cloud_functions) | [🔗](https://firebase.google.com/products/functions) | [📖](https://firebase.google.com/docs/functions/get-started?gen=2nd) | [`cloud_functions`](https://github.com/FirebaseExtended/flutterfire/tree/main/packages/cloud_functions) | ✔ | ✔ | ✔ | β | N/A | N/A | +| Cloud Messaging | [![Cloud Messaging pub.dev badge](https://img.shields.io/pub/v/firebase_messaging.svg)](https://pub.dev/packages/firebase_messaging) | [🔗](https://firebase.google.com/products/cloud-messaging) | [📖](https://firebase.google.com/docs/cloud-messaging/flutter/client) | [`firebase_messaging`](https://github.com/FirebaseExtended/flutterfire/tree/main/packages/firebase_messaging) | ✔ | ✔ | ✔ | β | N/A | N/A | +| Cloud Storage | [![Cloud Storage pub.dev badge](https://img.shields.io/pub/v/firebase_storage.svg)](https://pub.dev/packages/firebase_storage) | [🔗](https://firebase.google.com/products/storage) | [📖](https://firebase.google.com/docs/storage/flutter/start) | [`firebase_storage`](https://github.com/FirebaseExtended/flutterfire/tree/main/packages/firebase_storage) | ✔ | ✔ | ✔ | β | (*) | (*) | +| Core | [![Core pub.dev badge](https://img.shields.io/pub/v/firebase_core.svg)](https://pub.dev/packages/firebase_core) | [🔗](https://firebase.google.com) | [📖](https://firebase.google.com) | [`firebase_core`](https://github.com/FirebaseExtended/flutterfire/tree/main/packages/firebase_core) | ✔ | ✔ | ✔ | β | (*) | (*) | +| Crashlytics | [![Crashlytics pub.dev badge](https://img.shields.io/pub/v/firebase_crashlytics.svg)](https://pub.dev/packages/firebase_crashlytics) | [🔗](https://firebase.google.com/products/crashlytics) | [📖](https://firebase.google.com/docs/crashlytics/get-started?platform=flutter) | [`firebase_crashlytics`](https://github.com/FirebaseExtended/flutterfire/tree/main/packages/firebase_crashlytics) | ✔ | ✔ | N/A | β | N/A | N/A | +| Data Connect | [![Data Connect pub.dev badge](https://img.shields.io/pub/v/firebase_data_connect.svg)](https://pub.dev/packages/firebase_data_connect) | [🔗](https://firebase.google.com/products/data-connect) | [📖](https://firebase.google.com/docs/data-connect/quickstart-local?userflow=automatic#flutter) | [`firebase_data_connect`](https://github.com/FirebaseExtended/flutterfire/tree/main/packages/firebase_data_connect) | ✔ | ✔ | ✔ | N/A | N/A | N/A | +| In-App Messaging | [![In-App Messaging pub.dev badge](https://img.shields.io/pub/v/firebase_in_app_messaging.svg)](https://pub.dev/packages/firebase_in_app_messaging) | [🔗](https://firebase.google.com/products/in-app-messaging) | [📖](https://firebase.google.com/docs/in-app-messaging/get-started?platform=flutter) | [`firebase_in_app_messaging`](https://github.com/FirebaseExtended/flutterfire/tree/main/packages/firebase_in_app_messaging) | ✔ | ✔ | N/A | N/A | N/A | N/A | +| Installations | [![Installations pub.dev badge](https://img.shields.io/pub/v/firebase_app_installations.svg)](https://pub.dev/packages/firebase_app_installations) | [🔗](https://firebase.google.com/docs/projects/manage-installations) | [📖](https://firebase.google.com/docs/projects/manage-installations#flutter) | [`firebase_app_installations`](https://github.com/FirebaseExtended/flutterfire/tree/main/packages/firebase_app_installations) | ✔ | ✔ | ✔ | β | N/A | N/A | +| Performance Monitoring | [![Performance Monitoring pub.dev badge](https://img.shields.io/pub/v/firebase_performance.svg)](https://pub.dev/packages/firebase_performance) | [🔗](https://firebase.google.com/products/performance) | [📖](https://firebase.google.com/docs/perf-mon/flutter/get-started) | [`firebase_performance`](https://github.com/FirebaseExtended/flutterfire/tree/main/packages/firebase_performance) | ✔ | ✔ | ✔ | N/A | N/A | N/A | +| Realtime Database | [![Realtime Database pub.dev badge](https://img.shields.io/pub/v/firebase_database.svg)](https://pub.dev/packages/firebase_database) | [🔗](https://firebase.google.com/products/database) | [📖](https://firebase.google.com/docs/database/flutter/start) | [`firebase_database`](https://github.com/FirebaseExtended/flutterfire/tree/main/packages/firebase_database) | ✔ | ✔ | ✔ | β | N/A | (*) | +| Remote Config | [![Remote Config pub.dev badge](https://img.shields.io/pub/v/firebase_remote_config.svg)](https://pub.dev/packages/firebase_remote_config) | [🔗](https://firebase.google.com/products/remote-config) | [📖](https://firebase.google.com/docs/remote-config/get-started?platform=flutter) | [`firebase_remote_config`](https://github.com/FirebaseExtended/flutterfire/tree/main/packages/firebase_remote_config) | ✔ | ✔ | ✔ | β | N/A | (*) | + + (*) for development only. Production on Windows and Linux is not supported. ## Preview Plugins diff --git a/packages/cloud_firestore/cloud_firestore/example/.metadata b/packages/cloud_firestore/cloud_firestore/example/.metadata index 784ce1298249..2feffa0e65e4 100644 --- a/packages/cloud_firestore/cloud_firestore/example/.metadata +++ b/packages/cloud_firestore/cloud_firestore/example/.metadata @@ -18,6 +18,9 @@ migration: - platform: web create_revision: a14f74ff3a1cbd521163c5f03d68113d50af93d3 base_revision: a14f74ff3a1cbd521163c5f03d68113d50af93d3 + - platform: linux + create_revision: ad70ec4617166f1c38e5d2bfd388af71fda14f06 + base_revision: ad70ec4617166f1c38e5d2bfd388af71fda14f06 # User provided section diff --git a/packages/cloud_firestore/cloud_firestore/example/lib/firebase_options.dart b/packages/cloud_firestore/cloud_firestore/example/lib/firebase_options.dart index 07f8169a6b06..2120aa1349fc 100644 --- a/packages/cloud_firestore/cloud_firestore/example/lib/firebase_options.dart +++ b/packages/cloud_firestore/cloud_firestore/example/lib/firebase_options.dart @@ -28,10 +28,8 @@ class DefaultFirebaseOptions { TargetPlatform.iOS => ios, TargetPlatform.macOS => macos, TargetPlatform.windows => android, - TargetPlatform.linux => throw UnsupportedError( - 'DefaultFirebaseOptions have not been configured for linux - ' - 'you can reconfigure this by running the FlutterFire CLI again.', - ), + // TODO: Remove when FlutterFire CLI supports Linux + TargetPlatform.linux => android, _ => throw UnsupportedError( 'DefaultFirebaseOptions are not supported for this platform.', ) diff --git a/packages/cloud_firestore/cloud_firestore/example/linux/.gitignore b/packages/cloud_firestore/cloud_firestore/example/linux/.gitignore new file mode 100644 index 000000000000..d3896c98444f --- /dev/null +++ b/packages/cloud_firestore/cloud_firestore/example/linux/.gitignore @@ -0,0 +1 @@ +flutter/ephemeral diff --git a/packages/cloud_firestore/cloud_firestore/example/linux/CMakeLists.txt b/packages/cloud_firestore/cloud_firestore/example/linux/CMakeLists.txt new file mode 100644 index 000000000000..48b90e99bf70 --- /dev/null +++ b/packages/cloud_firestore/cloud_firestore/example/linux/CMakeLists.txt @@ -0,0 +1,128 @@ +# Project-level configuration. +cmake_minimum_required(VERSION 3.13) +project(runner LANGUAGES CXX) + +# The name of the executable created for the application. Change this to change +# the on-disk name of your application. +set(BINARY_NAME "cloud_firestore_example") +# The unique GTK application identifier for this application. See: +# https://wiki.gnome.org/HowDoI/ChooseApplicationID +set(APPLICATION_ID "io.flutter.plugins.firebase.firestore.cloud_firestore_example") + +# Explicitly opt in to modern CMake behaviors to avoid warnings with recent +# versions of CMake. +cmake_policy(SET CMP0063 NEW) + +# Load bundled libraries from the lib/ directory relative to the binary. +set(CMAKE_INSTALL_RPATH "$ORIGIN/lib") + +# Root filesystem for cross-building. +if(FLUTTER_TARGET_PLATFORM_SYSROOT) + set(CMAKE_SYSROOT ${FLUTTER_TARGET_PLATFORM_SYSROOT}) + set(CMAKE_FIND_ROOT_PATH ${CMAKE_SYSROOT}) + set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER) + set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY) + set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY) + set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY) +endif() + +# Define build configuration options. +if(NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES) + set(CMAKE_BUILD_TYPE "Debug" CACHE + STRING "Flutter build mode" FORCE) + set_property(CACHE CMAKE_BUILD_TYPE PROPERTY STRINGS + "Debug" "Profile" "Release") +endif() + +# Compilation settings that should be applied to most targets. +# +# Be cautious about adding new options here, as plugins use this function by +# default. In most cases, you should add new options to specific targets instead +# of modifying this function. +function(APPLY_STANDARD_SETTINGS TARGET) + target_compile_features(${TARGET} PUBLIC cxx_std_14) + target_compile_options(${TARGET} PRIVATE -Wall -Werror) + target_compile_options(${TARGET} PRIVATE "$<$>:-O3>") + target_compile_definitions(${TARGET} PRIVATE "$<$>:NDEBUG>") +endfunction() + +# Flutter library and tool build rules. +set(FLUTTER_MANAGED_DIR "${CMAKE_CURRENT_SOURCE_DIR}/flutter") +add_subdirectory(${FLUTTER_MANAGED_DIR}) + +# System-level dependencies. +find_package(PkgConfig REQUIRED) +pkg_check_modules(GTK REQUIRED IMPORTED_TARGET gtk+-3.0) + +# Application build; see runner/CMakeLists.txt. +add_subdirectory("runner") + +# Run the Flutter tool portions of the build. This must not be removed. +add_dependencies(${BINARY_NAME} flutter_assemble) + +# Only the install-generated bundle's copy of the executable will launch +# correctly, since the resources must in the right relative locations. To avoid +# people trying to run the unbundled copy, put it in a subdirectory instead of +# the default top-level location. +set_target_properties(${BINARY_NAME} + PROPERTIES + RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/intermediates_do_not_run" +) + + +# Generated plugin build rules, which manage building the plugins and adding +# them to the application. +include(flutter/generated_plugins.cmake) + + +# === Installation === +# By default, "installing" just makes a relocatable bundle in the build +# directory. +set(BUILD_BUNDLE_DIR "${PROJECT_BINARY_DIR}/bundle") +if(CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT) + set(CMAKE_INSTALL_PREFIX "${BUILD_BUNDLE_DIR}" CACHE PATH "..." FORCE) +endif() + +# Start with a clean build bundle directory every time. +install(CODE " + file(REMOVE_RECURSE \"${BUILD_BUNDLE_DIR}/\") + " COMPONENT Runtime) + +set(INSTALL_BUNDLE_DATA_DIR "${CMAKE_INSTALL_PREFIX}/data") +set(INSTALL_BUNDLE_LIB_DIR "${CMAKE_INSTALL_PREFIX}/lib") + +install(TARGETS ${BINARY_NAME} RUNTIME DESTINATION "${CMAKE_INSTALL_PREFIX}" + COMPONENT Runtime) + +install(FILES "${FLUTTER_ICU_DATA_FILE}" DESTINATION "${INSTALL_BUNDLE_DATA_DIR}" + COMPONENT Runtime) + +install(FILES "${FLUTTER_LIBRARY}" DESTINATION "${INSTALL_BUNDLE_LIB_DIR}" + COMPONENT Runtime) + +foreach(bundled_library ${PLUGIN_BUNDLED_LIBRARIES}) + install(FILES "${bundled_library}" + DESTINATION "${INSTALL_BUNDLE_LIB_DIR}" + COMPONENT Runtime) +endforeach(bundled_library) + +# Copy the native assets provided by the build.dart from all packages. +set(NATIVE_ASSETS_DIR "${PROJECT_BUILD_DIR}native_assets/linux/") +install(DIRECTORY "${NATIVE_ASSETS_DIR}" + DESTINATION "${INSTALL_BUNDLE_LIB_DIR}" + COMPONENT Runtime) + +# Fully re-copy the assets directory on each build to avoid having stale files +# from a previous install. +set(FLUTTER_ASSET_DIR_NAME "flutter_assets") +install(CODE " + file(REMOVE_RECURSE \"${INSTALL_BUNDLE_DATA_DIR}/${FLUTTER_ASSET_DIR_NAME}\") + " COMPONENT Runtime) +install(DIRECTORY "${PROJECT_BUILD_DIR}/${FLUTTER_ASSET_DIR_NAME}" + DESTINATION "${INSTALL_BUNDLE_DATA_DIR}" COMPONENT Runtime) + +# Install the AOT library on non-Debug builds only. +if(NOT CMAKE_BUILD_TYPE MATCHES "Debug") + install(FILES "${AOT_LIBRARY}" DESTINATION "${INSTALL_BUNDLE_LIB_DIR}" + COMPONENT Runtime) +endif() diff --git a/packages/cloud_firestore/cloud_firestore/example/linux/flutter/CMakeLists.txt b/packages/cloud_firestore/cloud_firestore/example/linux/flutter/CMakeLists.txt new file mode 100644 index 000000000000..d5bd01648a96 --- /dev/null +++ b/packages/cloud_firestore/cloud_firestore/example/linux/flutter/CMakeLists.txt @@ -0,0 +1,88 @@ +# This file controls Flutter-level build steps. It should not be edited. +cmake_minimum_required(VERSION 3.10) + +set(EPHEMERAL_DIR "${CMAKE_CURRENT_SOURCE_DIR}/ephemeral") + +# Configuration provided via flutter tool. +include(${EPHEMERAL_DIR}/generated_config.cmake) + +# TODO: Move the rest of this into files in ephemeral. See +# https://github.com/flutter/flutter/issues/57146. + +# Serves the same purpose as list(TRANSFORM ... PREPEND ...), +# which isn't available in 3.10. +function(list_prepend LIST_NAME PREFIX) + set(NEW_LIST "") + foreach(element ${${LIST_NAME}}) + list(APPEND NEW_LIST "${PREFIX}${element}") + endforeach(element) + set(${LIST_NAME} "${NEW_LIST}" PARENT_SCOPE) +endfunction() + +# === Flutter Library === +# System-level dependencies. +find_package(PkgConfig REQUIRED) +pkg_check_modules(GTK REQUIRED IMPORTED_TARGET gtk+-3.0) +pkg_check_modules(GLIB REQUIRED IMPORTED_TARGET glib-2.0) +pkg_check_modules(GIO REQUIRED IMPORTED_TARGET gio-2.0) + +set(FLUTTER_LIBRARY "${EPHEMERAL_DIR}/libflutter_linux_gtk.so") + +# Published to parent scope for install step. +set(FLUTTER_LIBRARY ${FLUTTER_LIBRARY} PARENT_SCOPE) +set(FLUTTER_ICU_DATA_FILE "${EPHEMERAL_DIR}/icudtl.dat" PARENT_SCOPE) +set(PROJECT_BUILD_DIR "${PROJECT_DIR}/build/" PARENT_SCOPE) +set(AOT_LIBRARY "${PROJECT_DIR}/build/lib/libapp.so" PARENT_SCOPE) + +list(APPEND FLUTTER_LIBRARY_HEADERS + "fl_basic_message_channel.h" + "fl_binary_codec.h" + "fl_binary_messenger.h" + "fl_dart_project.h" + "fl_engine.h" + "fl_json_message_codec.h" + "fl_json_method_codec.h" + "fl_message_codec.h" + "fl_method_call.h" + "fl_method_channel.h" + "fl_method_codec.h" + "fl_method_response.h" + "fl_plugin_registrar.h" + "fl_plugin_registry.h" + "fl_standard_message_codec.h" + "fl_standard_method_codec.h" + "fl_string_codec.h" + "fl_value.h" + "fl_view.h" + "flutter_linux.h" +) +list_prepend(FLUTTER_LIBRARY_HEADERS "${EPHEMERAL_DIR}/flutter_linux/") +add_library(flutter INTERFACE) +target_include_directories(flutter INTERFACE + "${EPHEMERAL_DIR}" +) +target_link_libraries(flutter INTERFACE "${FLUTTER_LIBRARY}") +target_link_libraries(flutter INTERFACE + PkgConfig::GTK + PkgConfig::GLIB + PkgConfig::GIO +) +add_dependencies(flutter flutter_assemble) + +# === Flutter tool backend === +# _phony_ is a non-existent file to force this command to run every time, +# since currently there's no way to get a full input/output list from the +# flutter tool. +add_custom_command( + OUTPUT ${FLUTTER_LIBRARY} ${FLUTTER_LIBRARY_HEADERS} + ${CMAKE_CURRENT_BINARY_DIR}/_phony_ + COMMAND ${CMAKE_COMMAND} -E env + ${FLUTTER_TOOL_ENVIRONMENT} + "${FLUTTER_ROOT}/packages/flutter_tools/bin/tool_backend.sh" + ${FLUTTER_TARGET_PLATFORM} ${CMAKE_BUILD_TYPE} + VERBATIM +) +add_custom_target(flutter_assemble DEPENDS + "${FLUTTER_LIBRARY}" + ${FLUTTER_LIBRARY_HEADERS} +) diff --git a/packages/cloud_firestore/cloud_firestore/example/linux/runner/CMakeLists.txt b/packages/cloud_firestore/cloud_firestore/example/linux/runner/CMakeLists.txt new file mode 100644 index 000000000000..e97dabc7028e --- /dev/null +++ b/packages/cloud_firestore/cloud_firestore/example/linux/runner/CMakeLists.txt @@ -0,0 +1,26 @@ +cmake_minimum_required(VERSION 3.13) +project(runner LANGUAGES CXX) + +# Define the application target. To change its name, change BINARY_NAME in the +# top-level CMakeLists.txt, not the value here, or `flutter run` will no longer +# work. +# +# Any new source files that you add to the application should be added here. +add_executable(${BINARY_NAME} + "main.cc" + "my_application.cc" + "${FLUTTER_MANAGED_DIR}/generated_plugin_registrant.cc" +) + +# Apply the standard set of build settings. This can be removed for applications +# that need different build settings. +apply_standard_settings(${BINARY_NAME}) + +# Add preprocessor definitions for the application ID. +add_definitions(-DAPPLICATION_ID="${APPLICATION_ID}") + +# Add dependency libraries. Add any application-specific dependencies here. +target_link_libraries(${BINARY_NAME} PRIVATE flutter) +target_link_libraries(${BINARY_NAME} PRIVATE PkgConfig::GTK) + +target_include_directories(${BINARY_NAME} PRIVATE "${CMAKE_SOURCE_DIR}") diff --git a/packages/cloud_firestore/cloud_firestore/example/linux/runner/main.cc b/packages/cloud_firestore/cloud_firestore/example/linux/runner/main.cc new file mode 100644 index 000000000000..54fde7b87fa0 --- /dev/null +++ b/packages/cloud_firestore/cloud_firestore/example/linux/runner/main.cc @@ -0,0 +1,10 @@ +// Copyright 2026, the Chromium project authors. Please see the AUTHORS file +// for details. All rights reserved. Use of this source code is governed by a +// BSD-style license that can be found in the LICENSE file. + +#include "my_application.h" + +int main(int argc, char** argv) { + g_autoptr(MyApplication) app = my_application_new(); + return g_application_run(G_APPLICATION(app), argc, argv); +} diff --git a/packages/cloud_firestore/cloud_firestore/example/linux/runner/my_application.cc b/packages/cloud_firestore/cloud_firestore/example/linux/runner/my_application.cc new file mode 100644 index 000000000000..4fb856eed560 --- /dev/null +++ b/packages/cloud_firestore/cloud_firestore/example/linux/runner/my_application.cc @@ -0,0 +1,152 @@ +// Copyright 2026, the Chromium project authors. Please see the AUTHORS file +// for details. All rights reserved. Use of this source code is governed by a +// BSD-style license that can be found in the LICENSE file. + +#include "my_application.h" + +#include +#ifdef GDK_WINDOWING_X11 +#include +#endif + +#include "flutter/generated_plugin_registrant.h" + +struct _MyApplication { + GtkApplication parent_instance; + char** dart_entrypoint_arguments; +}; + +G_DEFINE_TYPE(MyApplication, my_application, GTK_TYPE_APPLICATION) + +// Called when first Flutter frame received. +static void first_frame_cb(MyApplication* self, FlView* view) { + gtk_widget_show(gtk_widget_get_toplevel(GTK_WIDGET(view))); +} + +// Implements GApplication::activate. +static void my_application_activate(GApplication* application) { + MyApplication* self = MY_APPLICATION(application); + GtkWindow* window = + GTK_WINDOW(gtk_application_window_new(GTK_APPLICATION(application))); + + // Use a header bar when running in GNOME as this is the common style used + // by applications and is the setup most users will be using (e.g. Ubuntu + // desktop). + // If running on X and not using GNOME then just use a traditional title bar + // in case the window manager does more exotic layout, e.g. tiling. + // If running on Wayland assume the header bar will work (may need changing + // if future cases occur). + gboolean use_header_bar = TRUE; +#ifdef GDK_WINDOWING_X11 + GdkScreen* screen = gtk_window_get_screen(window); + if (GDK_IS_X11_SCREEN(screen)) { + const gchar* wm_name = gdk_x11_screen_get_window_manager_name(screen); + if (g_strcmp0(wm_name, "GNOME Shell") != 0) { + use_header_bar = FALSE; + } + } +#endif + if (use_header_bar) { + GtkHeaderBar* header_bar = GTK_HEADER_BAR(gtk_header_bar_new()); + gtk_widget_show(GTK_WIDGET(header_bar)); + gtk_header_bar_set_title(header_bar, "cloud_firestore_example"); + gtk_header_bar_set_show_close_button(header_bar, TRUE); + gtk_window_set_titlebar(window, GTK_WIDGET(header_bar)); + } else { + gtk_window_set_title(window, "cloud_firestore_example"); + } + + gtk_window_set_default_size(window, 1280, 720); + + g_autoptr(FlDartProject) project = fl_dart_project_new(); + fl_dart_project_set_dart_entrypoint_arguments( + project, self->dart_entrypoint_arguments); + + FlView* view = fl_view_new(project); + GdkRGBA background_color; + // Background defaults to black, override it here if necessary, e.g. #00000000 + // for transparent. + gdk_rgba_parse(&background_color, "#000000"); + fl_view_set_background_color(view, &background_color); + gtk_widget_show(GTK_WIDGET(view)); + gtk_container_add(GTK_CONTAINER(window), GTK_WIDGET(view)); + + // Show the window when Flutter renders. + // Requires the view to be realized so we can start rendering. + g_signal_connect_swapped(view, "first-frame", G_CALLBACK(first_frame_cb), + self); + gtk_widget_realize(GTK_WIDGET(view)); + + fl_register_plugins(FL_PLUGIN_REGISTRY(view)); + + gtk_widget_grab_focus(GTK_WIDGET(view)); +} + +// Implements GApplication::local_command_line. +static gboolean my_application_local_command_line(GApplication* application, + gchar*** arguments, + int* exit_status) { + MyApplication* self = MY_APPLICATION(application); + // Strip out the first argument as it is the binary name. + self->dart_entrypoint_arguments = g_strdupv(*arguments + 1); + + g_autoptr(GError) error = nullptr; + if (!g_application_register(application, nullptr, &error)) { + g_warning("Failed to register: %s", error->message); + *exit_status = 1; + return TRUE; + } + + g_application_activate(application); + *exit_status = 0; + + return TRUE; +} + +// Implements GApplication::startup. +static void my_application_startup(GApplication* application) { + // MyApplication* self = MY_APPLICATION(object); + + // Perform any actions required at application startup. + + G_APPLICATION_CLASS(my_application_parent_class)->startup(application); +} + +// Implements GApplication::shutdown. +static void my_application_shutdown(GApplication* application) { + // MyApplication* self = MY_APPLICATION(object); + + // Perform any actions required at application shutdown. + + G_APPLICATION_CLASS(my_application_parent_class)->shutdown(application); +} + +// Implements GObject::dispose. +static void my_application_dispose(GObject* object) { + MyApplication* self = MY_APPLICATION(object); + g_clear_pointer(&self->dart_entrypoint_arguments, g_strfreev); + G_OBJECT_CLASS(my_application_parent_class)->dispose(object); +} + +static void my_application_class_init(MyApplicationClass* klass) { + G_APPLICATION_CLASS(klass)->activate = my_application_activate; + G_APPLICATION_CLASS(klass)->local_command_line = + my_application_local_command_line; + G_APPLICATION_CLASS(klass)->startup = my_application_startup; + G_APPLICATION_CLASS(klass)->shutdown = my_application_shutdown; + G_OBJECT_CLASS(klass)->dispose = my_application_dispose; +} + +static void my_application_init(MyApplication* self) {} + +MyApplication* my_application_new() { + // Set the program name to the application ID, which helps various systems + // like GTK and desktop environments map this running application to its + // corresponding .desktop file. This ensures better integration by allowing + // the application to be recognized beyond its binary name. + g_set_prgname(APPLICATION_ID); + + return MY_APPLICATION(g_object_new(my_application_get_type(), + "application-id", APPLICATION_ID, "flags", + G_APPLICATION_NON_UNIQUE, nullptr)); +} diff --git a/packages/cloud_firestore/cloud_firestore/example/linux/runner/my_application.h b/packages/cloud_firestore/cloud_firestore/example/linux/runner/my_application.h new file mode 100644 index 000000000000..a2ba75695cf5 --- /dev/null +++ b/packages/cloud_firestore/cloud_firestore/example/linux/runner/my_application.h @@ -0,0 +1,22 @@ +// Copyright 2026, the Chromium project authors. Please see the AUTHORS file +// for details. All rights reserved. Use of this source code is governed by a +// BSD-style license that can be found in the LICENSE file. + +#ifndef FLUTTER_MY_APPLICATION_H_ +#define FLUTTER_MY_APPLICATION_H_ + +#include + +G_DECLARE_FINAL_TYPE(MyApplication, my_application, MY, APPLICATION, + GtkApplication) + +/** + * my_application_new: + * + * Creates a new Flutter-based application. + * + * Returns: a new #MyApplication. + */ +MyApplication* my_application_new(); + +#endif // FLUTTER_MY_APPLICATION_H_ diff --git a/packages/cloud_firestore/cloud_firestore/linux/CMakeLists.txt b/packages/cloud_firestore/cloud_firestore/linux/CMakeLists.txt new file mode 100644 index 000000000000..56d12fa946b1 --- /dev/null +++ b/packages/cloud_firestore/cloud_firestore/linux/CMakeLists.txt @@ -0,0 +1,98 @@ +# The Flutter tooling requires that developers have CMake 3.10 or later +# installed. You should not increase this version, as doing so will cause +# the plugin to fail to compile for some customers of the plugin. +cmake_minimum_required(VERSION 3.10) + +# Project-level configuration. +set(PROJECT_NAME "cloud_firestore") +project(${PROJECT_NAME} LANGUAGES CXX) + +# This value is used when generating builds using this plugin, so it must +# not be changed +set(PLUGIN_NAME "cloud_firestore_plugin") + +# Any new source files that you add to the plugin should be added here. +list(APPEND PLUGIN_SOURCES + "include/cloud_firestore/cloud_firestore_plugin.h" + "cloud_firestore_plugin.cc" + "messages.g.cc" + "messages.g.h" + "firestore_codec.cc" + "firestore_codec.h" +) + +# Read version from pubspec.yaml +file(STRINGS "../pubspec.yaml" pubspec_content) +foreach(line ${pubspec_content}) + string(FIND ${line} "version: " has_version) + + if("${has_version}" STREQUAL "0") + string(FIND ${line} ": " version_start_pos) + math(EXPR version_start_pos "${version_start_pos} + 2") + string(LENGTH ${line} version_end_pos) + math(EXPR len "${version_end_pos} - ${version_start_pos}") + string(SUBSTRING ${line} ${version_start_pos} ${len} PLUGIN_VERSION) + break() + endif() +endforeach(line) + +configure_file(plugin_version.h.in ${CMAKE_BINARY_DIR}/generated/cloud_firestore/plugin_version.h) +include_directories(${CMAKE_BINARY_DIR}/generated/) + +# Define the plugin library target. Its name must not be changed (see comment +# on PLUGIN_NAME above). +# +# This is deliberately a STATIC library (unlike the SHARED library in the +# Flutter Linux plugin template) to mirror the Windows implementation and the +# firebase_core Linux plugin: the Firebase C++ SDK ships prebuilt static +# libraries, and a single statically linked copy in the runner keeps one +# firebase::App registry shared across all FlutterFire plugins. +add_library(${PLUGIN_NAME} STATIC + ${PLUGIN_SOURCES} + ${CMAKE_BINARY_DIR}/generated/cloud_firestore/plugin_version.h +) + +# Apply a standard set of build settings that are configured in the +# application-level CMakeLists.txt. This can be removed for plugins that want +# full control over build settings. +apply_standard_settings(${PLUGIN_NAME}) + +# Symbols are hidden by default to reduce the chance of accidental conflicts +# between plugins. This should not be removed; any symbols that should be +# exported should be explicitly exported with the FLUTTER_PLUGIN_EXPORT macro. +set_target_properties(${PLUGIN_NAME} PROPERTIES + CXX_VISIBILITY_PRESET hidden + POSITION_INDEPENDENT_CODE ON) +target_compile_definitions(${PLUGIN_NAME} PUBLIC FLUTTER_PLUGIN_IMPL) + +# Enable firebase-cpp-sdk's platform logging api. +target_compile_definitions(${PLUGIN_NAME} PRIVATE -DINTERNAL_EXPERIMENTAL=1) + +# Source include directories and library dependencies. Add any plugin-specific +# dependencies here. +# +# The Firebase C++ SDK itself is added (via add_subdirectory) by the +# firebase_core plugin, matching the Windows CMakeLists which links the SDK +# targets provided by firebase_core without re-adding the SDK. firebase_auth +# is required by firebase_firestore for its credentials provider, mirroring +# windows/CMakeLists.txt. +# NOTE: the Firebase SDK product archives are linked exclusively by the +# firebase_core_plugin target, which wraps all of them in a single +# -Wl,--start-group/--end-group (the archives have circular symbol +# dependencies that an ordered per-plugin link line cannot satisfy). +set(firebase_libs firebase_core_plugin) +set(ADDITIONAL_LIBS pthread) +target_link_libraries(${PLUGIN_NAME} PRIVATE "${firebase_libs}" "${ADDITIONAL_LIBS}") + +target_include_directories(${PLUGIN_NAME} INTERFACE + "${CMAKE_CURRENT_SOURCE_DIR}/include") +target_link_libraries(${PLUGIN_NAME} PRIVATE flutter) +target_link_libraries(${PLUGIN_NAME} PRIVATE PkgConfig::GTK) + +# List of absolute paths to libraries that should be bundled with the plugin. +# This list could contain prebuilt libraries, or libraries created by an +# external build triggered from this build file. +set(cloud_firestore_bundled_libraries + "" + PARENT_SCOPE +) diff --git a/packages/cloud_firestore/cloud_firestore/linux/cloud_firestore_plugin.cc b/packages/cloud_firestore/cloud_firestore/linux/cloud_firestore_plugin.cc new file mode 100644 index 000000000000..edfd86ae77f1 --- /dev/null +++ b/packages/cloud_firestore/cloud_firestore/linux/cloud_firestore_plugin.cc @@ -0,0 +1,1972 @@ +// Copyright 2026, the Chromium project authors. Please see the AUTHORS file +// for details. All rights reserved. Use of this source code is governed by a +// BSD-style license that can be found in the LICENSE file. + +#include "include/cloud_firestore/cloud_firestore_plugin.h" + +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "cloud_firestore/plugin_version.h" +#include "firebase/app.h" +#include "firebase/firestore.h" +#include "firebase/firestore/filter.h" +#include "firebase/log.h" +#include "firebase_core/firebase_core_plugin.h" +#include "firebase_core/flutter_firebase_plugin.h" +#include "firestore_codec.h" +#include "messages.g.h" + +using firebase::App; +using firebase::Future; +using firebase::firestore::AggregateQuerySnapshot; +using firebase::firestore::DocumentReference; +using firebase::firestore::DocumentSnapshot; +using firebase::firestore::Error; +using firebase::firestore::FieldPath; +using firebase::firestore::FieldValue; +using firebase::firestore::Filter; +using firebase::firestore::Firestore; +using firebase::firestore::ListenerRegistration; +using firebase::firestore::LoadBundleTaskProgress; +using firebase::firestore::MapFieldPathValue; +using firebase::firestore::MapFieldValue; +using firebase::firestore::MetadataChanges; +using firebase::firestore::Query; +using firebase::firestore::QuerySnapshot; +using firebase::firestore::SetOptions; +using firebase::firestore::Transaction; +using firebase::firestore::TransactionOptions; + +using cloud_firestore_linux::ConvertFieldValueToFlValue; +using cloud_firestore_linux::ConvertToFieldPathVector; +using cloud_firestore_linux::ConvertToFieldValue; +using cloud_firestore_linux::ConvertToFieldValueList; +using cloud_firestore_linux::ConvertToMapFieldPathValue; +using cloud_firestore_linux::ConvertToMapFieldValue; +using cloud_firestore_linux::FirestoreInstanceCache; +using cloud_firestore_linux::GetCustomFieldPath; + +static const char kLibraryName[] = "flutter-fire-fst"; + +#define CLOUD_FIRESTORE_PLUGIN(obj) \ + (G_TYPE_CHECK_INSTANCE_CAST((obj), cloud_firestore_plugin_get_type(), \ + CloudFirestorePlugin)) + +struct _CloudFirestorePlugin { + GObject parent_instance; +}; + +G_DEFINE_TYPE(CloudFirestorePlugin, cloud_firestore_plugin, g_object_get_type()) + +namespace { + +FlBinaryMessenger* messenger_ = nullptr; + +// ----------------------------------------------------------------------------- +// Platform-thread dispatch. +// +// Firebase future/listener callbacks run on SDK worker threads, but all +// Flutter messaging (Pigeon responses and event-channel sends) must happen on +// the platform thread. On Linux the platform thread runs the GLib main loop, +// so g_idle_add is the equivalent of the Windows message-window dispatcher. +// ----------------------------------------------------------------------------- + +void PostToMainThread(std::function task) { + auto* heap_task = new std::function(std::move(task)); + g_idle_add_full( + G_PRIORITY_DEFAULT, + [](gpointer data) -> gboolean { + (*static_cast*>(data))(); + return G_SOURCE_REMOVE; + }, + heap_task, + [](gpointer data) { delete static_cast*>(data); }); +} + +// ----------------------------------------------------------------------------- +// Event channels. +// ----------------------------------------------------------------------------- + +struct EventChannelState { + std::mutex mutex; + FlEventChannel* channel = nullptr; // Owned reference while active. + bool active = false; +}; + +void SendSuccessOnPlatformThread(std::shared_ptr state, + FlValue* value /* transfer full */) { + if (!state) { + if (value != nullptr) fl_value_unref(value); + return; + } + + PostToMainThread([state, value]() { + std::lock_guard lock(state->mutex); + if (state->active && state->channel != nullptr) { + fl_event_channel_send(state->channel, value, nullptr, nullptr); + } + if (value != nullptr) fl_value_unref(value); + }); +} + +void SendErrorOnPlatformThread(std::shared_ptr state, + const std::string& code, + const std::string& message, + FlValue* details /* transfer full, nullable */, + bool end_stream = false) { + if (!state) { + if (details != nullptr) fl_value_unref(details); + return; + } + + PostToMainThread([state, code, message, details, end_stream]() { + std::lock_guard lock(state->mutex); + if (state->active && state->channel != nullptr) { + fl_event_channel_send_error(state->channel, code.c_str(), message.c_str(), + details, nullptr, nullptr); + if (end_stream) { + fl_event_channel_send_end_of_stream(state->channel, nullptr, nullptr); + g_clear_object(&state->channel); + state->active = false; + } + } + if (details != nullptr) fl_value_unref(details); + }); +} + +void EndStreamOnPlatformThread(std::shared_ptr state) { + if (!state) { + return; + } + + PostToMainThread([state]() { + std::lock_guard lock(state->mutex); + if (state->active && state->channel != nullptr) { + fl_event_channel_send_end_of_stream(state->channel, nullptr, nullptr); + g_clear_object(&state->channel); + state->active = false; + } + }); +} + +// Base class mirroring flutter::StreamHandler on Windows. +class EventStreamHandler { + public: + virtual ~EventStreamHandler() = default; + virtual FlMethodErrorResponse* OnListen(FlEventChannel* channel, + FlValue* arguments) = 0; + virtual FlMethodErrorResponse* OnCancel(FlValue* arguments) = 0; +}; + +std::map event_channels_; +std::map> stream_handlers_; + +FlMethodErrorResponse* EventChannelListenCb(FlEventChannel* channel, + FlValue* args, gpointer user_data) { + return static_cast(user_data)->OnListen(channel, args); +} + +FlMethodErrorResponse* EventChannelCancelCb(FlEventChannel* channel, + FlValue* args, gpointer user_data) { + return static_cast(user_data)->OnCancel(args); +} + +std::string RegisterEventChannelWithUUID( + std::string prefix, std::string uuid, + std::unique_ptr handler) { + std::string channel_name = prefix + uuid; + + g_autoptr(FlStandardMessageCodec) message_codec = + FL_STANDARD_MESSAGE_CODEC(cloud_firestore_message_codec_new()); + g_autoptr(FlStandardMethodCodec) codec = + fl_standard_method_codec_new_with_message_codec(message_codec); + + FlEventChannel* channel = fl_event_channel_new( + messenger_, channel_name.c_str(), FL_METHOD_CODEC(codec)); + + EventStreamHandler* raw_handler = handler.get(); + stream_handlers_[channel_name] = std::move(handler); + event_channels_[channel_name] = channel; + + fl_event_channel_set_stream_handlers(channel, EventChannelListenCb, + EventChannelCancelCb, raw_handler, + nullptr); + + return uuid; +} + +std::string RegisterEventChannel(std::string prefix, + std::unique_ptr handler) { + g_autofree gchar* uuid = g_uuid_string_random(); + return RegisterEventChannelWithUUID(prefix, uuid, std::move(handler)); +} + +// ----------------------------------------------------------------------------- +// Firestore helpers. +// ----------------------------------------------------------------------------- + +bool HasValue(FlValue* value) { + return value != nullptr && fl_value_get_type(value) != FL_VALUE_TYPE_NULL; +} + +Firestore* GetFirestoreFromPigeon( + CloudFirestoreFirestorePigeonFirebaseApp* pigeon_app) { + const gchar* app_name = + cloud_firestore_firestore_pigeon_firebase_app_get_app_name(pigeon_app); + const gchar* database_url = + cloud_firestore_firestore_pigeon_firebase_app_get_database_u_r_l( + pigeon_app); + std::string cache_key = std::string(app_name) + "-" + database_url; + + auto& instances = FirestoreInstanceCache(); + if (instances.find(cache_key) != instances.end()) { + return instances[cache_key].get(); + } + + App* app = App::GetInstance(app_name); + + Firestore* firestore = Firestore::GetInstance(app, database_url); + + CloudFirestoreInternalFirebaseSettings* pigeon_settings = + cloud_firestore_firestore_pigeon_firebase_app_get_settings(pigeon_app); + + firebase::firestore::Settings settings; + + gboolean* persistence_enabled = + cloud_firestore_internal_firebase_settings_get_persistence_enabled( + pigeon_settings); + if (persistence_enabled != nullptr && *persistence_enabled) { + // This is the maximum amount of cache allowed. We use the same number on + // android. + int64_t size = 104857600; + + int64_t* cache_size_bytes = + cloud_firestore_internal_firebase_settings_get_cache_size_bytes( + pigeon_settings); + if (cache_size_bytes != nullptr && *cache_size_bytes != -1) { + size = *cache_size_bytes; + } + + settings.set_cache_size_bytes(size); + } + + const gchar* host = + cloud_firestore_internal_firebase_settings_get_host(pigeon_settings); + if (host != nullptr) { + settings.set_host(host); + + // Only allow changing ssl if host is also specified. + settings.set_ssl_enabled(false); + } + + firestore->set_settings(settings); + + instances[cache_key] = std::unique_ptr(firestore); + + return firestore; +} + +std::string GetErrorCode(Error error) { + switch (error) { + case firebase::firestore::kErrorOk: + return "ok"; + case firebase::firestore::kErrorCancelled: + return "cancelled"; + case firebase::firestore::kErrorUnknown: + return "unknown"; + case firebase::firestore::kErrorInvalidArgument: + return "invalid-argument"; + case firebase::firestore::kErrorDeadlineExceeded: + return "deadline-exceeded"; + case firebase::firestore::kErrorNotFound: + return "not-found"; + case firebase::firestore::kErrorAlreadyExists: + return "already-exists"; + case firebase::firestore::kErrorPermissionDenied: + return "permission-denied"; + case firebase::firestore::kErrorResourceExhausted: + return "resource-exhausted"; + case firebase::firestore::kErrorFailedPrecondition: + return "failed-precondition"; + case firebase::firestore::kErrorAborted: + return "aborted"; + case firebase::firestore::kErrorOutOfRange: + return "out-of-range"; + case firebase::firestore::kErrorUnimplemented: + return "unimplemented"; + case firebase::firestore::kErrorInternal: + return "internal"; + case firebase::firestore::kErrorUnavailable: + return "unavailable"; + case firebase::firestore::kErrorDataLoss: + return "data-loss"; + case firebase::firestore::kErrorUnauthenticated: + return "unauthenticated"; + default: + return "unknown-error"; + } +} + +// Builds the FlutterError details map used on Windows +// (FlutterError("firebase_firestore", message, {code, message})). +// Ownership: returns a new reference (transfer full). +FlValue* ParseErrorDetails(const std::string& error_code, + const std::string& message) { + FlValue* details = fl_value_new_map(); + fl_value_set_take(details, fl_value_new_string("code"), + fl_value_new_string(error_code.c_str())); + fl_value_set_take(details, fl_value_new_string("message"), + fl_value_new_string(message.c_str())); + return details; +} + +typedef void (*RespondErrorFn)( + CloudFirestoreFirebaseFirestoreHostApiResponseHandle* response_handle, + const gchar* code, const gchar* message, FlValue* details); + +// Responds with the Firestore error of a completed future on the platform +// thread and releases the (owned) response handle reference. +void RespondFutureErrorOnMainThread( + RespondErrorFn respond_error, + CloudFirestoreFirebaseFirestoreHostApiResponseHandle* response_handle, + const firebase::FutureBase& completed_future) { + const Error error_code = static_cast(completed_future.error()); + std::string error_code_string = GetErrorCode(error_code); + std::string message = completed_future.error_message(); + + PostToMainThread([respond_error, response_handle, error_code_string, + message]() { + g_autoptr(FlValue) details = ParseErrorDetails(error_code_string, message); + respond_error(response_handle, "firebase_firestore", message.c_str(), + details); + g_object_unref(response_handle); + }); +} + +firebase::firestore::Source GetSourceFromPigeon( + CloudFirestoreSource pigeon_source) { + switch (pigeon_source) { + case CLOUD_FIRESTORE_PLATFORM_INTERFACE_SOURCE_SERVER: + return firebase::firestore::Source::kServer; + case CLOUD_FIRESTORE_PLATFORM_INTERFACE_SOURCE_CACHE: + return firebase::firestore::Source::kCache; + case CLOUD_FIRESTORE_PLATFORM_INTERFACE_SOURCE_SERVER_AND_CACHE: + default: + return firebase::firestore::Source::kDefault; + } +} + +DocumentSnapshot::ServerTimestampBehavior GetServerTimestampBehaviorFromPigeon( + CloudFirestoreServerTimestampBehavior pigeon_server_timestamp_behavior) { + switch (pigeon_server_timestamp_behavior) { + case CLOUD_FIRESTORE_PLATFORM_INTERFACE_SERVER_TIMESTAMP_BEHAVIOR_ESTIMATE: + return DocumentSnapshot::ServerTimestampBehavior::kEstimate; + case CLOUD_FIRESTORE_PLATFORM_INTERFACE_SERVER_TIMESTAMP_BEHAVIOR_PREVIOUS: + return DocumentSnapshot::ServerTimestampBehavior::kPrevious; + case CLOUD_FIRESTORE_PLATFORM_INTERFACE_SERVER_TIMESTAMP_BEHAVIOR_NONE: + default: + return DocumentSnapshot::ServerTimestampBehavior::kNone; + } +} + +// Ownership: returns a new reference (transfer full). +CloudFirestoreInternalSnapshotMetadata* ParseSnapshotMetadata( + const firebase::firestore::SnapshotMetadata& metadata) { + return cloud_firestore_internal_snapshot_metadata_new( + metadata.has_pending_writes(), metadata.is_from_cache()); +} + +// Ownership: returns a new reference (transfer full). +CloudFirestoreInternalDocumentSnapshot* ParseDocumentSnapshot( + const DocumentSnapshot& document, + DocumentSnapshot::ServerTimestampBehavior server_timestamp_behavior) { + g_autoptr(FlValue) data = + cloud_firestore_linux::ConvertMapFieldValueToFlValue( + document.GetData(server_timestamp_behavior)); + g_autoptr(CloudFirestoreInternalSnapshotMetadata) metadata = + ParseSnapshotMetadata(document.metadata()); + + if (fl_value_get_length(data) == 0) { + return cloud_firestore_internal_document_snapshot_new( + document.reference().path().c_str(), nullptr, metadata); + } + + return cloud_firestore_internal_document_snapshot_new( + document.reference().path().c_str(), data, metadata); +} + +// Ownership: returns a new reference (transfer full). +FlValue* ParseDocumentSnapshots( + const std::vector& documents, + DocumentSnapshot::ServerTimestampBehavior server_timestamp_behavior) { + FlValue* snapshots = fl_value_new_list(); + + for (const auto& document : documents) { + g_autoptr(CloudFirestoreInternalDocumentSnapshot) snapshot = + ParseDocumentSnapshot(document, server_timestamp_behavior); + fl_value_append_take(snapshots, + fl_value_new_custom_object( + cloud_firestore_internal_document_snapshot_type_id, + G_OBJECT(snapshot))); + } + return snapshots; +} + +CloudFirestoreDocumentChangeType ParseDocumentChangeType( + const firebase::firestore::DocumentChange::Type& type) { + switch (type) { + case firebase::firestore::DocumentChange::Type::kAdded: + return CLOUD_FIRESTORE_PLATFORM_INTERFACE_DOCUMENT_CHANGE_TYPE_ADDED; + case firebase::firestore::DocumentChange::Type::kRemoved: + return CLOUD_FIRESTORE_PLATFORM_INTERFACE_DOCUMENT_CHANGE_TYPE_REMOVED; + case firebase::firestore::DocumentChange::Type::kModified: + return CLOUD_FIRESTORE_PLATFORM_INTERFACE_DOCUMENT_CHANGE_TYPE_MODIFIED; + } + + return CLOUD_FIRESTORE_PLATFORM_INTERFACE_DOCUMENT_CHANGE_TYPE_ADDED; +} + +// Ownership: returns a new reference (transfer full). +CloudFirestoreInternalDocumentChange* ParseDocumentChange( + const firebase::firestore::DocumentChange& document_change, + DocumentSnapshot::ServerTimestampBehavior server_timestamp_behavior) { + g_autoptr(CloudFirestoreInternalDocumentSnapshot) document = + ParseDocumentSnapshot(document_change.document(), + server_timestamp_behavior); + return cloud_firestore_internal_document_change_new( + ParseDocumentChangeType(document_change.type()), document, + document_change.old_index(), document_change.new_index()); +} + +// Ownership: returns a new reference (transfer full). +FlValue* ParseDocumentChanges( + const std::vector& document_changes, + DocumentSnapshot::ServerTimestampBehavior server_timestamp_behavior) { + FlValue* changes = fl_value_new_list(); + for (const auto& document_change : document_changes) { + g_autoptr(CloudFirestoreInternalDocumentChange) change = + ParseDocumentChange(document_change, server_timestamp_behavior); + fl_value_append_take(changes, + fl_value_new_custom_object( + cloud_firestore_internal_document_change_type_id, + G_OBJECT(change))); + } + return changes; +} + +// Ownership: returns a new reference (transfer full). +CloudFirestoreInternalQuerySnapshot* ParseQuerySnapshot( + const QuerySnapshot* query_snapshot, + DocumentSnapshot::ServerTimestampBehavior server_timestamp_behavior) { + g_autoptr(FlValue) documents = ParseDocumentSnapshots( + query_snapshot->documents(), server_timestamp_behavior); + g_autoptr(FlValue) document_changes = ParseDocumentChanges( + query_snapshot->DocumentChanges(), server_timestamp_behavior); + g_autoptr(CloudFirestoreInternalSnapshotMetadata) metadata = + ParseSnapshotMetadata(query_snapshot->metadata()); + + return cloud_firestore_internal_query_snapshot_new( + documents, document_changes, metadata); +} + +Filter FilterFromJson(FlValue* map) { + FlValue* field_path_value = fl_value_lookup_string(map, "fieldPath"); + if (HasValue(field_path_value)) { + // Deserialize a FilterQuery + std::string op = fl_value_get_string(fl_value_lookup_string(map, "op")); + const FieldPath& field_path = GetCustomFieldPath(field_path_value); + + FlValue* value = fl_value_lookup_string(map, "value"); + + // All the operators from Firebase + if (op == "==") { + return Filter::EqualTo(field_path, ConvertToFieldValue(value)); + } else if (op == "!=") { + return Filter::NotEqualTo(field_path, ConvertToFieldValue(value)); + } else if (op == "<") { + return Filter::LessThan(field_path, ConvertToFieldValue(value)); + } else if (op == "<=") { + return Filter::LessThanOrEqualTo(field_path, ConvertToFieldValue(value)); + } else if (op == ">") { + return Filter::GreaterThan(field_path, ConvertToFieldValue(value)); + } else if (op == ">=") { + return Filter::GreaterThanOrEqualTo(field_path, + ConvertToFieldValue(value)); + } else if (op == "array-contains") { + return Filter::ArrayContains(field_path, ConvertToFieldValue(value)); + } else if (op == "array-contains-any") { + return Filter::ArrayContainsAny(field_path, + ConvertToFieldValueList(value)); + } else if (op == "in") { + return Filter::In(field_path, ConvertToFieldValueList(value)); + } else if (op == "not-in") { + return Filter::NotIn(field_path, ConvertToFieldValueList(value)); + } else { + throw std::runtime_error("Invalid operator"); + } + } + + // Deserialize a FilterOperator + std::string op = fl_value_get_string(fl_value_lookup_string(map, "op")); + + FlValue* queries = fl_value_lookup_string(map, "queries"); + std::vector parsed_filters; + size_t length = fl_value_get_length(queries); + for (size_t i = 0; i < length; ++i) { + parsed_filters.push_back( + FilterFromJson(fl_value_get_list_value(queries, i))); + } + + if (op == "OR") { + return Filter::Or(parsed_filters); + } else if (op == "AND") { + return Filter::And(parsed_filters); + } + + throw std::runtime_error("Invalid operator"); +} + +Query ParseQuery(Firestore* firestore, const std::string& path, + bool is_collection_group, + CloudFirestoreInternalQueryParameters* parameters) { + try { + Query query; + + if (is_collection_group) { + query = firestore->CollectionGroup(path); + } else { + query = firestore->Collection(path); + } + + FlValue* filters = + cloud_firestore_internal_query_parameters_get_filters(parameters); + if (HasValue(filters)) { + query = query.Where(FilterFromJson(filters)); + } + + FlValue* where = + cloud_firestore_internal_query_parameters_get_where(parameters); + size_t where_length = HasValue(where) ? fl_value_get_length(where) : 0; + for (size_t i = 0; i < where_length; ++i) { + FlValue* condition = fl_value_get_list_value(where, i); + const FieldPath& field_path = + GetCustomFieldPath(fl_value_get_list_value(condition, 0)); + std::string op = + fl_value_get_string(fl_value_get_list_value(condition, 1)); + FlValue* value = fl_value_get_list_value(condition, 2); + + if (op == "==") { + query = query.WhereEqualTo(field_path, ConvertToFieldValue(value)); + } else if (op == "!=") { + query = query.WhereNotEqualTo(field_path, ConvertToFieldValue(value)); + } else if (op == "<") { + query = query.WhereLessThan(field_path, ConvertToFieldValue(value)); + } else if (op == "<=") { + query = query.WhereLessThanOrEqualTo(field_path, + ConvertToFieldValue(value)); + } else if (op == ">") { + query = query.WhereGreaterThan(field_path, ConvertToFieldValue(value)); + } else if (op == ">=") { + query = query.WhereGreaterThanOrEqualTo(field_path, + ConvertToFieldValue(value)); + } else if (op == "array-contains") { + query = + query.WhereArrayContains(field_path, ConvertToFieldValue(value)); + } else if (op == "array-contains-any") { + query = query.WhereArrayContainsAny(field_path, + ConvertToFieldValueList(value)); + } else if (op == "in") { + query = query.WhereIn(field_path, ConvertToFieldValueList(value)); + } else if (op == "not-in") { + query = query.WhereNotIn(field_path, ConvertToFieldValueList(value)); + } else { + throw std::runtime_error("Unknown operator"); + } + } + + int64_t* limit = + cloud_firestore_internal_query_parameters_get_limit(parameters); + if (limit != nullptr) { + query = query.Limit(static_cast(*limit)); + } + + int64_t* limit_to_last = + cloud_firestore_internal_query_parameters_get_limit_to_last(parameters); + if (limit_to_last != nullptr) { + query = query.LimitToLast(static_cast(*limit_to_last)); + } + + FlValue* order_by = + cloud_firestore_internal_query_parameters_get_order_by(parameters); + if (!HasValue(order_by)) { + return query; + } + + size_t order_by_length = fl_value_get_length(order_by); + for (size_t i = 0; i < order_by_length; ++i) { + FlValue* order = fl_value_get_list_value(order_by, i); + const FieldPath& field_path = + GetCustomFieldPath(fl_value_get_list_value(order, 0)); + bool direction = fl_value_get_bool(fl_value_get_list_value(order, 1)); + + if (direction) { + query = query.OrderBy(field_path, Query::Direction::kDescending); + } else { + query = query.OrderBy(field_path, Query::Direction::kAscending); + } + } + + FlValue* start_at = + cloud_firestore_internal_query_parameters_get_start_at(parameters); + if (HasValue(start_at)) { + query = query.StartAt(ConvertToFieldValueList(start_at)); + } + FlValue* start_after = + cloud_firestore_internal_query_parameters_get_start_after(parameters); + if (HasValue(start_after)) { + query = query.StartAfter(ConvertToFieldValueList(start_after)); + } + FlValue* end_at = + cloud_firestore_internal_query_parameters_get_end_at(parameters); + if (HasValue(end_at)) { + query = query.EndAt(ConvertToFieldValueList(end_at)); + } + FlValue* end_before = + cloud_firestore_internal_query_parameters_get_end_before(parameters); + if (HasValue(end_before)) { + query = query.EndBefore(ConvertToFieldValueList(end_before)); + } + + return query; + } catch (const std::exception& e) { + std::cerr << "Error: " << e.what() << std::endl; + // Return a 'null' or 'empty' query based on your C++ Firestore API + return Query(); + } +} + +// ----------------------------------------------------------------------------- +// Write commands (transactions and write batches). +// ----------------------------------------------------------------------------- + +// A fully converted write command. The conversion from the Pigeon +// InternalTransactionCommand happens on the platform thread so that no +// GObject/FlValue is touched from the Firestore transaction worker thread +// (an improvement over Windows, which converted on the worker thread). +struct ConvertedTransactionCommand { + CloudFirestoreInternalTransactionType type; + std::string path; + enum class SetMode { kOverwrite, kMerge, kMergeFields } set_mode; + MapFieldValue set_data; + std::vector merge_fields; + MapFieldPathValue update_data; +}; + +ConvertedTransactionCommand ConvertTransactionCommand( + CloudFirestoreInternalTransactionCommand* command) { + ConvertedTransactionCommand converted; + converted.type = + cloud_firestore_internal_transaction_command_get_type_(command); + converted.path = + cloud_firestore_internal_transaction_command_get_path(command); + converted.set_mode = ConvertedTransactionCommand::SetMode::kOverwrite; + + FlValue* data = + cloud_firestore_internal_transaction_command_get_data(command); + CloudFirestoreInternalDocumentOption* option = + cloud_firestore_internal_transaction_command_get_option(command); + + switch (converted.type) { + case CLOUD_FIRESTORE_PLATFORM_INTERFACE_INTERNAL_TRANSACTION_TYPE_SET: { + converted.set_data = ConvertToMapFieldValue(data); + if (option != nullptr) { + gboolean* merge = + cloud_firestore_internal_document_option_get_merge(option); + FlValue* merge_fields = + cloud_firestore_internal_document_option_get_merge_fields(option); + if (merge != nullptr && *merge) { + converted.set_mode = ConvertedTransactionCommand::SetMode::kMerge; + } else if (HasValue(merge_fields)) { + converted.set_mode = + ConvertedTransactionCommand::SetMode::kMergeFields; + converted.merge_fields = ConvertToFieldPathVector(merge_fields); + } + } + break; + } + case CLOUD_FIRESTORE_PLATFORM_INTERFACE_INTERNAL_TRANSACTION_TYPE_UPDATE: + converted.update_data = ConvertToMapFieldPathValue(data); + break; + default: + break; + } + return converted; +} + +std::map> transactions_; + +// ----------------------------------------------------------------------------- +// Stream handlers. +// ----------------------------------------------------------------------------- + +class LoadBundleStreamHandler : public EventStreamHandler { + public: + LoadBundleStreamHandler(Firestore* firestore, std::string bundle) + : firestore_(firestore), bundle_(std::move(bundle)) {} + + FlMethodErrorResponse* OnListen(FlEventChannel* channel, + FlValue* arguments) override { + events_state_ = std::make_shared(); + events_state_->channel = FL_EVENT_CHANNEL(g_object_ref(channel)); + events_state_->active = true; + firestore_->LoadBundle( + bundle_, + [events_state = events_state_](const LoadBundleTaskProgress& progress) { + FlValue* map = fl_value_new_map(); + fl_value_set_take(map, fl_value_new_string("bytesLoaded"), + fl_value_new_int(progress.bytes_loaded())); + fl_value_set_take(map, fl_value_new_string("documentsLoaded"), + fl_value_new_int(progress.documents_loaded())); + fl_value_set_take(map, fl_value_new_string("totalBytes"), + fl_value_new_int(progress.total_bytes())); + fl_value_set_take(map, fl_value_new_string("totalDocuments"), + fl_value_new_int(progress.total_documents())); + switch (progress.state()) { + case LoadBundleTaskProgress::State::kError: { + fl_value_unref(map); + SendErrorOnPlatformThread( + events_state, "firebase_firestore", + "Error loading the bundle", + ParseErrorDetails("load-bundle-error", + "Error loading the bundle"), + true); + return; + } + case LoadBundleTaskProgress::State::kInProgress: { + fl_value_set_take(map, fl_value_new_string("taskState"), + fl_value_new_string("running")); + SendSuccessOnPlatformThread(events_state, map); + break; + } + case LoadBundleTaskProgress::State::kSuccess: { + fl_value_set_take(map, fl_value_new_string("taskState"), + fl_value_new_string("success")); + SendSuccessOnPlatformThread(events_state, map); + EndStreamOnPlatformThread(events_state); + break; + } + } + }); + return nullptr; + } + + FlMethodErrorResponse* OnCancel(FlValue* arguments) override { + EndStreamOnPlatformThread(events_state_); + return nullptr; + } + + private: + Firestore* firestore_; + std::string bundle_; + std::shared_ptr events_state_; +}; + +class SnapshotInSyncStreamHandler : public EventStreamHandler { + public: + explicit SnapshotInSyncStreamHandler(Firestore* firestore) + : firestore_(firestore) {} + + FlMethodErrorResponse* OnListen(FlEventChannel* channel, + FlValue* arguments) override { + events_state_ = std::make_shared(); + events_state_->channel = FL_EVENT_CHANNEL(g_object_ref(channel)); + events_state_->active = true; + + listener_ = firestore_->AddSnapshotsInSyncListener( + [events_state = events_state_]() { + SendSuccessOnPlatformThread(events_state, fl_value_new_null()); + }); + return nullptr; + } + + FlMethodErrorResponse* OnCancel(FlValue* arguments) override { + listener_.Remove(); + EndStreamOnPlatformThread(events_state_); + return nullptr; + } + + private: + Firestore* firestore_; + ListenerRegistration listener_; + std::shared_ptr events_state_; +}; + +class TransactionStreamHandler : public EventStreamHandler { + public: + TransactionStreamHandler(Firestore* firestore, long timeout, int max_attempts, + std::string transaction_id) + : firestore_(firestore), + timeout_(timeout), + max_attempts_(max_attempts), + transaction_id_(std::move(transaction_id)) {} + + void ReceiveTransactionResponse( + CloudFirestoreInternalTransactionResult result_type, + std::vector commands) { + { + std::lock_guard command_lock(commands_mutex_); + result_type_ = result_type; + commands_ = std::move(commands); + } + // Signal under mtx_ with a predicate flag so the transaction worker can + // neither miss the notification (if it arrives before the worker starts + // waiting) nor wake spuriously and commit an empty transaction. The + // Windows implementation notifies without a predicate and is exposed to + // both races. + { + std::lock_guard lock(mtx_); + signaled_ = true; + } + cv_.notify_one(); + } + + FlMethodErrorResponse* OnListen(FlEventChannel* channel, + FlValue* arguments) override { + events_state_ = std::make_shared(); + events_state_->channel = FL_EVENT_CHANNEL(g_object_ref(channel)); + events_state_->active = true; + + TransactionOptions options; + options.set_max_attempts(max_attempts_); + + firestore_ + ->RunTransaction( + options, + [this](Transaction& transaction, std::string& str) -> Error { + auto noop_deleter = [](Transaction*) {}; + std::shared_ptr ptr(&transaction, noop_deleter); + transactions_[transaction_id_] = std::move(ptr); + + FlValue* map = fl_value_new_map(); + fl_value_set_take(map, fl_value_new_string("appName"), + fl_value_new_string(firestore_->app()->name())); + SendSuccessOnPlatformThread(events_state_, map); + + std::unique_lock lock(mtx_); + bool signaled = + cv_.wait_for(lock, std::chrono::milliseconds(timeout_), + [this] { return signaled_; }); + // Reset for the next attempt: RunTransaction may re-invoke this + // callback on conflict (up to max_attempts_ times). + signaled_ = false; + if (!signaled) { + SendErrorOnPlatformThread(events_state_, "Timeout", + "Transaction timed out.", nullptr, + true); + return firebase::firestore::kErrorDeadlineExceeded; + } + + std::lock_guard command_lock(commands_mutex_); + if (result_type_ == + CLOUD_FIRESTORE_PLATFORM_INTERFACE_INTERNAL_TRANSACTION_RESULT_FAILURE) { + return firebase::firestore::kErrorAborted; + } + if (commands_.empty()) return firebase::firestore::kErrorOk; + + for (const ConvertedTransactionCommand& command : commands_) { + if (command.path.empty()) { + std::cerr << "Path is invalid: " << command.path << std::endl; + continue; // Skip this iteration. + } + + DocumentReference reference = + firestore_->Document(command.path); + + switch (command.type) { + case CLOUD_FIRESTORE_PLATFORM_INTERFACE_INTERNAL_TRANSACTION_TYPE_SET: + switch (command.set_mode) { + case ConvertedTransactionCommand::SetMode::kMerge: + transaction.Set(reference, command.set_data, + SetOptions::Merge()); + break; + case ConvertedTransactionCommand::SetMode::kMergeFields: + transaction.Set( + reference, command.set_data, + SetOptions::MergeFieldPaths(command.merge_fields)); + break; + case ConvertedTransactionCommand::SetMode::kOverwrite: + transaction.Set(reference, command.set_data); + break; + } + break; + case CLOUD_FIRESTORE_PLATFORM_INTERFACE_INTERNAL_TRANSACTION_TYPE_UPDATE: + transaction.Update(reference, command.update_data); + break; + case CLOUD_FIRESTORE_PLATFORM_INTERFACE_INTERNAL_TRANSACTION_TYPE_DELETE_TYPE: + transaction.Delete(reference); + break; + default: + break; + } + } + return firebase::firestore::kErrorOk; + }) + .OnCompletion([this](const Future& completed_future) { + if (completed_future.error() == firebase::firestore::kErrorOk) { + FlValue* result = fl_value_new_map(); + fl_value_set_take(result, fl_value_new_string("complete"), + fl_value_new_bool(TRUE)); + SendSuccessOnPlatformThread(events_state_, result); + } else { + SendErrorOnPlatformThread(events_state_, "transaction_error", + completed_future.error_message(), + nullptr); + } + EndStreamOnPlatformThread(events_state_); + }); + + return nullptr; + } + + FlMethodErrorResponse* OnCancel(FlValue* arguments) override { + { + std::unique_lock lock(mtx_); + signaled_ = true; + } + cv_.notify_one(); + EndStreamOnPlatformThread(events_state_); + return nullptr; + } + + private: + Firestore* firestore_; + long timeout_; + int max_attempts_; + std::string transaction_id_; + std::vector commands_; + CloudFirestoreInternalTransactionResult result_type_ = + CLOUD_FIRESTORE_PLATFORM_INTERFACE_INTERNAL_TRANSACTION_RESULT_SUCCESS; + // Guarded by mtx_. True once the Dart side stored its result (or the stream + // was cancelled); consumed by the transaction worker per attempt. + bool signaled_ = false; + std::mutex mtx_; + std::mutex commands_mutex_; + std::condition_variable cv_; + std::shared_ptr events_state_; +}; + +std::map transaction_handlers_; + +class QuerySnapshotStreamHandler : public EventStreamHandler { + public: + QuerySnapshotStreamHandler( + std::unique_ptr query, bool include_metadata_changes, + DocumentSnapshot::ServerTimestampBehavior server_timestamp_behavior) + : query_(std::move(query)), + include_metadata_changes_(include_metadata_changes), + server_timestamp_behavior_(server_timestamp_behavior) {} + + FlMethodErrorResponse* OnListen(FlEventChannel* channel, + FlValue* arguments) override { + MetadataChanges metadata_changes = include_metadata_changes_ + ? MetadataChanges::kInclude + : MetadataChanges::kExclude; + + events_state_ = std::make_shared(); + events_state_->channel = FL_EVENT_CHANNEL(g_object_ref(channel)); + events_state_->active = true; + + listener_ = query_->AddSnapshotListener( + metadata_changes, + [events_state = events_state_, + server_timestamp_behavior = server_timestamp_behavior_, + metadata_changes](const QuerySnapshot& snapshot, Error error, + const std::string& error_message) mutable { + if (error == firebase::firestore::kErrorOk) { + // Emit the Pigeon object directly so the Pigeon-aware codec on + // the EventChannel serializes it end-to-end. Pigeon 26 no longer + // flattens nested types, so sending a raw list here would cause + // the Dart side to receive a List it can no longer + // decode into InternalQuerySnapshot. + g_autoptr(FlValue) documents = ParseDocumentSnapshots( + snapshot.documents(), server_timestamp_behavior); + g_autoptr(FlValue) document_changes = + ParseDocumentChanges(snapshot.DocumentChanges(metadata_changes), + server_timestamp_behavior); + g_autoptr(CloudFirestoreInternalSnapshotMetadata) metadata = + ParseSnapshotMetadata(snapshot.metadata()); + g_autoptr(CloudFirestoreInternalQuerySnapshot) query_snapshot = + cloud_firestore_internal_query_snapshot_new( + documents, document_changes, metadata); + SendSuccessOnPlatformThread( + events_state, + fl_value_new_custom_object( + cloud_firestore_internal_query_snapshot_type_id, + G_OBJECT(query_snapshot))); + } else { + SendErrorOnPlatformThread( + events_state, "firebase_firestore", error_message, + ParseErrorDetails(GetErrorCode(error), error_message), true); + } + }); + return nullptr; + } + + FlMethodErrorResponse* OnCancel(FlValue* arguments) override { + listener_.Remove(); + EndStreamOnPlatformThread(events_state_); + return nullptr; + } + + private: + ListenerRegistration listener_; + std::unique_ptr query_; + std::shared_ptr events_state_; + bool include_metadata_changes_; + DocumentSnapshot::ServerTimestampBehavior server_timestamp_behavior_; +}; + +class DocumentSnapshotStreamHandler : public EventStreamHandler { + public: + DocumentSnapshotStreamHandler( + std::unique_ptr reference, + bool include_metadata_changes, + DocumentSnapshot::ServerTimestampBehavior server_timestamp_behavior) + : reference_(std::move(reference)), + include_metadata_changes_(include_metadata_changes), + server_timestamp_behavior_(server_timestamp_behavior) {} + + FlMethodErrorResponse* OnListen(FlEventChannel* channel, + FlValue* arguments) override { + MetadataChanges metadata_changes = include_metadata_changes_ + ? MetadataChanges::kInclude + : MetadataChanges::kExclude; + + events_state_ = std::make_shared(); + events_state_->channel = FL_EVENT_CHANNEL(g_object_ref(channel)); + events_state_->active = true; + + listener_ = reference_->AddSnapshotListener( + metadata_changes, + [events_state = events_state_, + server_timestamp_behavior = server_timestamp_behavior_]( + const DocumentSnapshot& snapshot, Error error, + const std::string& error_message) mutable { + if (error == firebase::firestore::kErrorOk) { + // Emit the Pigeon object directly so the Pigeon-aware codec on + // the EventChannel serializes it end-to-end. Pigeon 26 no longer + // flattens nested types, so sending a raw list here would cause + // the Dart side to receive a List it can no longer + // decode into InternalDocumentSnapshot. + g_autoptr(CloudFirestoreInternalDocumentSnapshot) + document_snapshot = + ParseDocumentSnapshot(snapshot, server_timestamp_behavior); + SendSuccessOnPlatformThread( + events_state, + fl_value_new_custom_object( + cloud_firestore_internal_document_snapshot_type_id, + G_OBJECT(document_snapshot))); + } else { + SendErrorOnPlatformThread( + events_state, "firebase_firestore", error_message, + ParseErrorDetails(GetErrorCode(error), error_message), true); + } + }); + return nullptr; + } + + FlMethodErrorResponse* OnCancel(FlValue* arguments) override { + listener_.Remove(); + EndStreamOnPlatformThread(events_state_); + return nullptr; + } + + private: + ListenerRegistration listener_; + std::unique_ptr reference_; + std::shared_ptr events_state_; + bool include_metadata_changes_; + DocumentSnapshot::ServerTimestampBehavior server_timestamp_behavior_; +}; + +// ----------------------------------------------------------------------------- +// FirebaseFirestoreHostApi handlers. +// ----------------------------------------------------------------------------- + +void HandleLoadBundle( + CloudFirestoreFirestorePigeonFirebaseApp* app, const uint8_t* bundle, + size_t bundle_length, + CloudFirestoreFirebaseFirestoreHostApiResponseHandle* response_handle, + gpointer user_data) { + Firestore* firestore = GetFirestoreFromPigeon(app); + + std::string bundle_converted(reinterpret_cast(bundle), + bundle_length); + + auto handler = + std::make_unique(firestore, bundle_converted); + + std::string channel_name = RegisterEventChannel( + "plugins.flutter.io/firebase_firestore/loadBundle/", std::move(handler)); + + cloud_firestore_firebase_firestore_host_api_respond_load_bundle( + response_handle, channel_name.c_str()); +} + +void HandleNamedQueryGet( + CloudFirestoreFirestorePigeonFirebaseApp* app, const gchar* name, + CloudFirestoreInternalGetOptions* options, + CloudFirestoreFirebaseFirestoreHostApiResponseHandle* response_handle, + gpointer user_data) { + Firestore* firestore = GetFirestoreFromPigeon(app); + + firebase::firestore::Source source = GetSourceFromPigeon( + cloud_firestore_internal_get_options_get_source(options)); + DocumentSnapshot::ServerTimestampBehavior server_timestamp_behavior = + GetServerTimestampBehaviorFromPigeon( + cloud_firestore_internal_get_options_get_server_timestamp_behavior( + options)); + + g_object_ref(response_handle); + firestore->NamedQuery(name).OnCompletion([response_handle, source, + server_timestamp_behavior]( + const Future& + completed_future) { + const Query* query = completed_future.result(); + + if (query == nullptr) { + PostToMainThread([response_handle]() { + cloud_firestore_firebase_firestore_host_api_respond_error_named_query_get( + response_handle, + "Named query has not been found. Please check it has " + "been loaded properly via loadBundle().", + "Named query has not been found. Please check it has " + "been loaded properly via loadBundle().", + nullptr); + g_object_unref(response_handle); + }); + return; + } + + query->Get(source).OnCompletion([response_handle, + server_timestamp_behavior]( + const Future& + completed_future) { + if (completed_future.error() == firebase::firestore::kErrorOk) { + const QuerySnapshot* query_snapshot = completed_future.result(); + CloudFirestoreInternalQuerySnapshot* snapshot = + ParseQuerySnapshot(query_snapshot, server_timestamp_behavior); + PostToMainThread([response_handle, snapshot]() { + cloud_firestore_firebase_firestore_host_api_respond_named_query_get( + response_handle, snapshot); + g_object_unref(snapshot); + g_object_unref(response_handle); + }); + } else { + RespondFutureErrorOnMainThread( + cloud_firestore_firebase_firestore_host_api_respond_error_named_query_get, + response_handle, completed_future); + } + }); + }); +} + +void HandleClearPersistence( + CloudFirestoreFirestorePigeonFirebaseApp* app, + CloudFirestoreFirebaseFirestoreHostApiResponseHandle* response_handle, + gpointer user_data) { + Firestore* firestore = GetFirestoreFromPigeon(app); + g_object_ref(response_handle); + firestore->ClearPersistence().OnCompletion([response_handle]( + const Future& + completed_future) { + if (completed_future.error() == firebase::firestore::kErrorOk) { + PostToMainThread([response_handle]() { + cloud_firestore_firebase_firestore_host_api_respond_clear_persistence( + response_handle); + g_object_unref(response_handle); + }); + } else { + RespondFutureErrorOnMainThread( + cloud_firestore_firebase_firestore_host_api_respond_error_clear_persistence, + response_handle, completed_future); + } + }); +} + +void HandleDisableNetwork( + CloudFirestoreFirestorePigeonFirebaseApp* app, + CloudFirestoreFirebaseFirestoreHostApiResponseHandle* response_handle, + gpointer user_data) { + Firestore* firestore = GetFirestoreFromPigeon(app); + g_object_ref(response_handle); + firestore->DisableNetwork().OnCompletion([response_handle]( + const Future& + completed_future) { + if (completed_future.error() == firebase::firestore::kErrorOk) { + PostToMainThread([response_handle]() { + cloud_firestore_firebase_firestore_host_api_respond_disable_network( + response_handle); + g_object_unref(response_handle); + }); + } else { + RespondFutureErrorOnMainThread( + cloud_firestore_firebase_firestore_host_api_respond_error_disable_network, + response_handle, completed_future); + } + }); +} + +void HandleEnableNetwork( + CloudFirestoreFirestorePigeonFirebaseApp* app, + CloudFirestoreFirebaseFirestoreHostApiResponseHandle* response_handle, + gpointer user_data) { + Firestore* firestore = GetFirestoreFromPigeon(app); + g_object_ref(response_handle); + firestore->EnableNetwork().OnCompletion([response_handle]( + const Future& + completed_future) { + if (completed_future.error() == firebase::firestore::kErrorOk) { + PostToMainThread([response_handle]() { + cloud_firestore_firebase_firestore_host_api_respond_enable_network( + response_handle); + g_object_unref(response_handle); + }); + } else { + RespondFutureErrorOnMainThread( + cloud_firestore_firebase_firestore_host_api_respond_error_enable_network, + response_handle, completed_future); + } + }); +} + +void HandleTerminate( + CloudFirestoreFirestorePigeonFirebaseApp* app, + CloudFirestoreFirebaseFirestoreHostApiResponseHandle* response_handle, + gpointer user_data) { + std::string cache_key = + std::string( + cloud_firestore_firestore_pigeon_firebase_app_get_app_name(app)) + + "-" + + cloud_firestore_firestore_pigeon_firebase_app_get_database_u_r_l(app); + Firestore* firestore = GetFirestoreFromPigeon(app); + g_object_ref(response_handle); + firestore->Terminate().OnCompletion([response_handle, + cache_key](const Future& + completed_future) { + if (completed_future.error() == firebase::firestore::kErrorOk) { + PostToMainThread([response_handle, cache_key]() { + FirestoreInstanceCache().erase(cache_key); + cloud_firestore_firebase_firestore_host_api_respond_terminate( + response_handle); + g_object_unref(response_handle); + }); + } else { + RespondFutureErrorOnMainThread( + cloud_firestore_firebase_firestore_host_api_respond_error_terminate, + response_handle, completed_future); + } + }); +} + +void HandleWaitForPendingWrites( + CloudFirestoreFirestorePigeonFirebaseApp* app, + CloudFirestoreFirebaseFirestoreHostApiResponseHandle* response_handle, + gpointer user_data) { + Firestore* firestore = GetFirestoreFromPigeon(app); + g_object_ref(response_handle); + firestore->WaitForPendingWrites().OnCompletion([response_handle]( + const Future& + completed_future) { + if (completed_future.error() == firebase::firestore::kErrorOk) { + PostToMainThread([response_handle]() { + cloud_firestore_firebase_firestore_host_api_respond_wait_for_pending_writes( + response_handle); + g_object_unref(response_handle); + }); + } else { + RespondFutureErrorOnMainThread( + cloud_firestore_firebase_firestore_host_api_respond_error_wait_for_pending_writes, + response_handle, completed_future); + } + }); +} + +void HandleSetIndexConfiguration( + CloudFirestoreFirestorePigeonFirebaseApp* app, + const gchar* index_configuration, + CloudFirestoreFirebaseFirestoreHostApiResponseHandle* response_handle, + gpointer user_data) { + // TODO: not available in C++ SDK + cloud_firestore_firebase_firestore_host_api_respond_error_set_index_configuration( + response_handle, "Not available in C++ SDK", "Not available in C++ SDK", + nullptr); +} + +void HandleSetLoggingEnabled( + gboolean logging_enabled, + CloudFirestoreFirebaseFirestoreHostApiResponseHandle* response_handle, + gpointer user_data) { + Firestore::set_log_level(logging_enabled + ? firebase::LogLevel::kLogLevelDebug + : firebase::LogLevel::kLogLevelError); + cloud_firestore_firebase_firestore_host_api_respond_set_logging_enabled( + response_handle); +} + +void HandleSnapshotsInSyncSetup( + CloudFirestoreFirestorePigeonFirebaseApp* app, + CloudFirestoreFirebaseFirestoreHostApiResponseHandle* response_handle, + gpointer user_data) { + Firestore* firestore = GetFirestoreFromPigeon(app); + + auto handler = std::make_unique(firestore); + + g_autofree gchar* uuid = g_uuid_string_random(); + std::string snapshot_in_sync_id(uuid); + + RegisterEventChannelWithUUID( + "plugins.flutter.io/firebase_firestore/snapshotsInSync/", + snapshot_in_sync_id, std::move(handler)); + cloud_firestore_firebase_firestore_host_api_respond_snapshots_in_sync_setup( + response_handle, snapshot_in_sync_id.c_str()); +} + +void HandleTransactionCreate( + CloudFirestoreFirestorePigeonFirebaseApp* app, int64_t timeout, + int64_t max_attempts, + CloudFirestoreFirebaseFirestoreHostApiResponseHandle* response_handle, + gpointer user_data) { + Firestore* firestore = GetFirestoreFromPigeon(app); + + g_autofree gchar* uuid = g_uuid_string_random(); + std::string transaction_id(uuid); + + auto handler = std::make_unique( + firestore, static_cast(timeout), static_cast(max_attempts), + transaction_id); + TransactionStreamHandler* raw_handler = handler.get(); + transaction_handlers_[transaction_id] = raw_handler; + + // Register the event channel. + RegisterEventChannelWithUUID( + "plugins.flutter.io/firebase_firestore/transaction/", transaction_id, + std::move(handler)); + + cloud_firestore_firebase_firestore_host_api_respond_transaction_create( + response_handle, transaction_id.c_str()); +} + +void HandleTransactionStoreResult( + const gchar* transaction_id, + CloudFirestoreInternalTransactionResult result_type, FlValue* commands, + CloudFirestoreFirebaseFirestoreHostApiResponseHandle* response_handle, + gpointer user_data) { + auto handler_it = transaction_handlers_.find(transaction_id); + if (handler_it != transaction_handlers_.end() && handler_it->second) { + TransactionStreamHandler& handler = *handler_it->second; + std::vector command_vector; + if (HasValue(commands)) { + size_t length = fl_value_get_length(commands); + for (size_t i = 0; i < length; ++i) { + FlValue* element = fl_value_get_list_value(commands, i); + CloudFirestoreInternalTransactionCommand* command = + CLOUD_FIRESTORE_INTERNAL_TRANSACTION_COMMAND( + fl_value_get_custom_value_object(element)); + command_vector.push_back(ConvertTransactionCommand(command)); + } + } + handler.ReceiveTransactionResponse(result_type, std::move(command_vector)); + cloud_firestore_firebase_firestore_host_api_respond_transaction_store_result( + response_handle); + } else { + g_autoptr(FlValue) details = fl_value_new_string(transaction_id); + cloud_firestore_firebase_firestore_host_api_respond_error_transaction_store_result( + response_handle, "transaction_not_found", "Transaction not found", + details); + } +} + +void HandleTransactionGet( + CloudFirestoreFirestorePigeonFirebaseApp* app, const gchar* transaction_id, + const gchar* path, + CloudFirestoreFirebaseFirestoreHostApiResponseHandle* response_handle, + gpointer user_data) { + Firestore* firestore = GetFirestoreFromPigeon(app); + DocumentReference reference = firestore->Document(path); + + auto transaction_it = transactions_.find(transaction_id); + if (transaction_it == transactions_.end() || !transaction_it->second) { + // Improvement over Windows, which would dereference a null transaction. + cloud_firestore_firebase_firestore_host_api_respond_error_transaction_get( + response_handle, "transaction_not_found", "Transaction not found", + nullptr); + return; + } + std::shared_ptr transaction = transaction_it->second; + + Error error_code; + std::string error_message; + + // Call the Get function + DocumentSnapshot snapshot = + transaction->Get(reference, &error_code, &error_message); + + if (error_code != firebase::firestore::kErrorOk) { + cloud_firestore_firebase_firestore_host_api_respond_error_transaction_get( + response_handle, error_message.c_str(), error_message.c_str(), nullptr); + } else { + g_autoptr(CloudFirestoreInternalDocumentSnapshot) document_snapshot = + ParseDocumentSnapshot( + snapshot, DocumentSnapshot::ServerTimestampBehavior::kDefault); + cloud_firestore_firebase_firestore_host_api_respond_transaction_get( + response_handle, document_snapshot); + } +} + +void HandleDocumentReferenceSet( + CloudFirestoreFirestorePigeonFirebaseApp* app, + CloudFirestoreDocumentReferenceRequest* request, + CloudFirestoreFirebaseFirestoreHostApiResponseHandle* response_handle, + gpointer user_data) { + Firestore* firestore = GetFirestoreFromPigeon(app); + DocumentReference document_reference = firestore->Document( + cloud_firestore_document_reference_request_get_path(request)); + + FlValue* data = cloud_firestore_document_reference_request_get_data(request); + CloudFirestoreInternalDocumentOption* option = + cloud_firestore_document_reference_request_get_option(request); + + // Get the data + Future future; + + gboolean* merge = + option != nullptr + ? cloud_firestore_internal_document_option_get_merge(option) + : nullptr; + FlValue* merge_fields = + option != nullptr + ? cloud_firestore_internal_document_option_get_merge_fields(option) + : nullptr; + + if (merge != nullptr && *merge) { + future = document_reference.Set(ConvertToMapFieldValue(data), + SetOptions::Merge()); + } else if (HasValue(merge_fields)) { + future = document_reference.Set( + ConvertToMapFieldValue(data), + SetOptions::MergeFieldPaths(ConvertToFieldPathVector(merge_fields))); + } else { + future = document_reference.Set(ConvertToMapFieldValue(data)); + } + + g_object_ref(response_handle); + future.OnCompletion([response_handle](const Future& completed_future) { + if (completed_future.error() == firebase::firestore::kErrorOk) { + PostToMainThread([response_handle]() { + cloud_firestore_firebase_firestore_host_api_respond_document_reference_set( + response_handle); + g_object_unref(response_handle); + }); + } else { + RespondFutureErrorOnMainThread( + cloud_firestore_firebase_firestore_host_api_respond_error_document_reference_set, + response_handle, completed_future); + } + }); +} + +void HandleDocumentReferenceUpdate( + CloudFirestoreFirestorePigeonFirebaseApp* app, + CloudFirestoreDocumentReferenceRequest* request, + CloudFirestoreFirebaseFirestoreHostApiResponseHandle* response_handle, + gpointer user_data) { + Firestore* firestore = GetFirestoreFromPigeon(app); + DocumentReference document_reference = firestore->Document( + cloud_firestore_document_reference_request_get_path(request)); + + // Get the data + MapFieldPathValue data = ConvertToMapFieldPathValue( + cloud_firestore_document_reference_request_get_data(request)); + Future future = document_reference.Update(data); + + g_object_ref(response_handle); + future.OnCompletion([response_handle](const Future& completed_future) { + if (completed_future.error() == firebase::firestore::kErrorOk) { + PostToMainThread([response_handle]() { + cloud_firestore_firebase_firestore_host_api_respond_document_reference_update( + response_handle); + g_object_unref(response_handle); + }); + } else { + RespondFutureErrorOnMainThread( + cloud_firestore_firebase_firestore_host_api_respond_error_document_reference_update, + response_handle, completed_future); + } + }); +} + +void HandleDocumentReferenceGet( + CloudFirestoreFirestorePigeonFirebaseApp* app, + CloudFirestoreDocumentReferenceRequest* request, + CloudFirestoreFirebaseFirestoreHostApiResponseHandle* response_handle, + gpointer user_data) { + Firestore* firestore = GetFirestoreFromPigeon(app); + DocumentReference document_reference = firestore->Document( + cloud_firestore_document_reference_request_get_path(request)); + + CloudFirestoreSource* pigeon_source = + cloud_firestore_document_reference_request_get_source(request); + firebase::firestore::Source source = + pigeon_source != nullptr ? GetSourceFromPigeon(*pigeon_source) + : firebase::firestore::Source::kDefault; + + CloudFirestoreServerTimestampBehavior* pigeon_behavior = + cloud_firestore_document_reference_request_get_server_timestamp_behavior( + request); + DocumentSnapshot::ServerTimestampBehavior server_timestamp_behavior = + pigeon_behavior != nullptr + ? GetServerTimestampBehaviorFromPigeon(*pigeon_behavior) + : DocumentSnapshot::ServerTimestampBehavior::kNone; + + Future future = document_reference.Get(source); + + g_object_ref(response_handle); + future.OnCompletion([response_handle, server_timestamp_behavior]( + const Future& completed_future) { + if (completed_future.error() == firebase::firestore::kErrorOk) { + const DocumentSnapshot* document_snapshot = completed_future.result(); + CloudFirestoreInternalDocumentSnapshot* snapshot = + ParseDocumentSnapshot(*document_snapshot, server_timestamp_behavior); + PostToMainThread([response_handle, snapshot]() { + cloud_firestore_firebase_firestore_host_api_respond_document_reference_get( + response_handle, snapshot); + g_object_unref(snapshot); + g_object_unref(response_handle); + }); + } else { + RespondFutureErrorOnMainThread( + cloud_firestore_firebase_firestore_host_api_respond_error_document_reference_get, + response_handle, completed_future); + } + }); +} + +void HandleDocumentReferenceDelete( + CloudFirestoreFirestorePigeonFirebaseApp* app, + CloudFirestoreDocumentReferenceRequest* request, + CloudFirestoreFirebaseFirestoreHostApiResponseHandle* response_handle, + gpointer user_data) { + Firestore* firestore = GetFirestoreFromPigeon(app); + DocumentReference document_reference = firestore->Document( + cloud_firestore_document_reference_request_get_path(request)); + + Future future = document_reference.Delete(); + + g_object_ref(response_handle); + future.OnCompletion([response_handle](const Future& completed_future) { + if (completed_future.error() == firebase::firestore::kErrorOk) { + PostToMainThread([response_handle]() { + cloud_firestore_firebase_firestore_host_api_respond_document_reference_delete( + response_handle); + g_object_unref(response_handle); + }); + } else { + RespondFutureErrorOnMainThread( + cloud_firestore_firebase_firestore_host_api_respond_error_document_reference_delete, + response_handle, completed_future); + } + }); +} + +void HandleQueryGet( + CloudFirestoreFirestorePigeonFirebaseApp* app, const gchar* path, + gboolean is_collection_group, + CloudFirestoreInternalQueryParameters* parameters, + CloudFirestoreInternalGetOptions* options, + CloudFirestoreFirebaseFirestoreHostApiResponseHandle* response_handle, + gpointer user_data) { + Firestore* firestore = GetFirestoreFromPigeon(app); + Query query = ParseQuery(firestore, path, is_collection_group, parameters); + + firebase::firestore::Source source = GetSourceFromPigeon( + cloud_firestore_internal_get_options_get_source(options)); + DocumentSnapshot::ServerTimestampBehavior server_timestamp_behavior = + GetServerTimestampBehaviorFromPigeon( + cloud_firestore_internal_get_options_get_server_timestamp_behavior( + options)); + + Future future = query.Get(source); + + g_object_ref(response_handle); + future.OnCompletion([response_handle, server_timestamp_behavior]( + const Future& completed_future) { + if (completed_future.error() == firebase::firestore::kErrorOk) { + const QuerySnapshot* query_snapshot = completed_future.result(); + CloudFirestoreInternalQuerySnapshot* snapshot = + ParseQuerySnapshot(query_snapshot, server_timestamp_behavior); + PostToMainThread([response_handle, snapshot]() { + cloud_firestore_firebase_firestore_host_api_respond_query_get( + response_handle, snapshot); + g_object_unref(snapshot); + g_object_unref(response_handle); + }); + } else { + RespondFutureErrorOnMainThread( + cloud_firestore_firebase_firestore_host_api_respond_error_query_get, + response_handle, completed_future); + } + }); +} + +firebase::firestore::AggregateSource GetAggregateSourceFromPigeon( + CloudFirestoreAggregateSource source) { + switch (source) { + case CLOUD_FIRESTORE_PLATFORM_INTERFACE_AGGREGATE_SOURCE_SERVER: + default: + return firebase::firestore::AggregateSource::kServer; + } +} + +void HandleAggregateQuery( + CloudFirestoreFirestorePigeonFirebaseApp* app, const gchar* path, + CloudFirestoreInternalQueryParameters* parameters, + CloudFirestoreAggregateSource source, FlValue* queries, + gboolean is_collection_group, + CloudFirestoreFirebaseFirestoreHostApiResponseHandle* response_handle, + gpointer user_data) { + Firestore* firestore = GetFirestoreFromPigeon(app); + Query query = ParseQuery(firestore, path, is_collection_group, parameters); + + // C++ SDK does not support average and sum + firebase::firestore::AggregateQuery aggregate_query; + + std::vector query_types; + size_t queries_length = fl_value_get_length(queries); + for (size_t i = 0; i < queries_length; ++i) { + CloudFirestoreAggregateQuery* query_request = + CLOUD_FIRESTORE_AGGREGATE_QUERY(fl_value_get_custom_value_object( + fl_value_get_list_value(queries, i))); + CloudFirestoreAggregateType type = + cloud_firestore_aggregate_query_get_type_(query_request); + query_types.push_back(type); + + switch (type) { + case CLOUD_FIRESTORE_PLATFORM_INTERFACE_AGGREGATE_TYPE_COUNT: + aggregate_query = query.Count(); + break; + case CLOUD_FIRESTORE_PLATFORM_INTERFACE_AGGREGATE_TYPE_SUM: + std::cout << "Sum is not supported on C++" << std::endl; + break; + case CLOUD_FIRESTORE_PLATFORM_INTERFACE_AGGREGATE_TYPE_AVERAGE: + std::cout << "Average is not supported on C++" << std::endl; + break; + } + } + + Future future = + aggregate_query.Get(GetAggregateSourceFromPigeon(source)); + + g_object_ref(response_handle); + future.OnCompletion([response_handle, + query_types](const Future& + completed_future) { + if (completed_future.error() == firebase::firestore::kErrorOk) { + const AggregateQuerySnapshot* aggregate_query_snapshot = + completed_future.result(); + FlValue* aggregate_responses = fl_value_new_list(); + + for (CloudFirestoreAggregateType type : query_types) { + switch (type) { + case CLOUD_FIRESTORE_PLATFORM_INTERFACE_AGGREGATE_TYPE_COUNT: { + double double_value = + static_cast(aggregate_query_snapshot->count()); + g_autoptr(CloudFirestoreAggregateQueryResponse) aggregate_response = + cloud_firestore_aggregate_query_response_new( + CLOUD_FIRESTORE_PLATFORM_INTERFACE_AGGREGATE_TYPE_COUNT, + nullptr, &double_value); + fl_value_append_take( + aggregate_responses, + fl_value_new_custom_object( + cloud_firestore_aggregate_query_response_type_id, + G_OBJECT(aggregate_response))); + break; + } + case CLOUD_FIRESTORE_PLATFORM_INTERFACE_AGGREGATE_TYPE_SUM: + std::cout << "Sum is not supported on C++" << std::endl; + break; + case CLOUD_FIRESTORE_PLATFORM_INTERFACE_AGGREGATE_TYPE_AVERAGE: + std::cout << "Average is not supported on C++" << std::endl; + break; + } + } + + PostToMainThread([response_handle, aggregate_responses]() { + cloud_firestore_firebase_firestore_host_api_respond_aggregate_query( + response_handle, aggregate_responses); + fl_value_unref(aggregate_responses); + g_object_unref(response_handle); + }); + } else { + RespondFutureErrorOnMainThread( + cloud_firestore_firebase_firestore_host_api_respond_error_aggregate_query, + response_handle, completed_future); + } + }); +} + +void HandleWriteBatchCommit( + CloudFirestoreFirestorePigeonFirebaseApp* app, FlValue* writes, + CloudFirestoreFirebaseFirestoreHostApiResponseHandle* response_handle, + gpointer user_data) { + try { + Firestore* firestore = GetFirestoreFromPigeon(app); + firebase::firestore::WriteBatch batch = firestore->batch(); + + size_t length = fl_value_get_length(writes); + for (size_t i = 0; i < length; ++i) { + CloudFirestoreInternalTransactionCommand* command = + CLOUD_FIRESTORE_INTERNAL_TRANSACTION_COMMAND( + fl_value_get_custom_value_object( + fl_value_get_list_value(writes, i))); + ConvertedTransactionCommand converted = + ConvertTransactionCommand(command); + + DocumentReference document_reference = + firestore->Document(converted.path); + + switch (converted.type) { + case CLOUD_FIRESTORE_PLATFORM_INTERFACE_INTERNAL_TRANSACTION_TYPE_DELETE_TYPE: + batch.Delete(document_reference); + break; + case CLOUD_FIRESTORE_PLATFORM_INTERFACE_INTERNAL_TRANSACTION_TYPE_UPDATE: + batch.Update(document_reference, converted.update_data); + break; + case CLOUD_FIRESTORE_PLATFORM_INTERFACE_INTERNAL_TRANSACTION_TYPE_SET: + switch (converted.set_mode) { + case ConvertedTransactionCommand::SetMode::kMerge: + batch.Set(document_reference, converted.set_data, + SetOptions::Merge()); + break; + case ConvertedTransactionCommand::SetMode::kMergeFields: + batch.Set(document_reference, converted.set_data, + SetOptions::MergeFieldPaths(converted.merge_fields)); + break; + case ConvertedTransactionCommand::SetMode::kOverwrite: + batch.Set(document_reference, converted.set_data); + break; + } + break; + default: + break; + } + } + + g_object_ref(response_handle); + batch.Commit().OnCompletion([response_handle]( + const Future& completed_future) { + if (completed_future.error() == firebase::firestore::kErrorOk) { + PostToMainThread([response_handle]() { + cloud_firestore_firebase_firestore_host_api_respond_write_batch_commit( + response_handle); + g_object_unref(response_handle); + }); + } else { + RespondFutureErrorOnMainThread( + cloud_firestore_firebase_firestore_host_api_respond_error_write_batch_commit, + response_handle, completed_future); + } + }); + + } catch (const std::exception& e) { + std::cerr << "Error: " << e.what() << std::endl; + cloud_firestore_firebase_firestore_host_api_respond_error_write_batch_commit( + response_handle, e.what(), e.what(), nullptr); + } +} + +void HandleQuerySnapshot( + CloudFirestoreFirestorePigeonFirebaseApp* app, const gchar* path, + gboolean is_collection_group, + CloudFirestoreInternalQueryParameters* parameters, + CloudFirestoreInternalGetOptions* options, + gboolean include_metadata_changes, CloudFirestoreListenSource source, + CloudFirestoreFirebaseFirestoreHostApiResponseHandle* response_handle, + gpointer user_data) { + if (source == CLOUD_FIRESTORE_PLATFORM_INTERFACE_LISTEN_SOURCE_CACHE) { + cloud_firestore_firebase_firestore_host_api_respond_error_query_snapshot( + response_handle, "Listening from cache isn't supported on Linux", + "Listening from cache isn't supported on Linux", nullptr); + return; + } + + Firestore* firestore = GetFirestoreFromPigeon(app); + std::unique_ptr query_ptr = std::make_unique( + ParseQuery(firestore, path, is_collection_group, parameters)); + + auto query_snapshot_handler = std::make_unique( + std::move(query_ptr), include_metadata_changes, + GetServerTimestampBehaviorFromPigeon( + cloud_firestore_internal_get_options_get_server_timestamp_behavior( + options))); + + std::string channel_name = + RegisterEventChannel("plugins.flutter.io/firebase_firestore/query/", + std::move(query_snapshot_handler)); + + cloud_firestore_firebase_firestore_host_api_respond_query_snapshot( + response_handle, channel_name.c_str()); +} + +void HandleDocumentReferenceSnapshot( + CloudFirestoreFirestorePigeonFirebaseApp* app, + CloudFirestoreDocumentReferenceRequest* parameters, + gboolean include_metadata_changes, CloudFirestoreListenSource source, + CloudFirestoreFirebaseFirestoreHostApiResponseHandle* response_handle, + gpointer user_data) { + if (source == CLOUD_FIRESTORE_PLATFORM_INTERFACE_LISTEN_SOURCE_CACHE) { + cloud_firestore_firebase_firestore_host_api_respond_error_document_reference_snapshot( + response_handle, "Listening from cache isn't supported on Linux", + "Listening from cache isn't supported on Linux", nullptr); + return; + } + Firestore* firestore = GetFirestoreFromPigeon(app); + std::unique_ptr document_reference = + std::make_unique(firestore->Document( + cloud_firestore_document_reference_request_get_path(parameters))); + + CloudFirestoreServerTimestampBehavior* pigeon_behavior = + cloud_firestore_document_reference_request_get_server_timestamp_behavior( + parameters); + DocumentSnapshot::ServerTimestampBehavior server_timestamp_behavior = + pigeon_behavior != nullptr + ? GetServerTimestampBehaviorFromPigeon(*pigeon_behavior) + : DocumentSnapshot::ServerTimestampBehavior::kNone; + + auto document_snapshot_handler = + std::make_unique( + std::move(document_reference), include_metadata_changes, + server_timestamp_behavior); + + std::string channel_name = + RegisterEventChannel("plugins.flutter.io/firebase_firestore/document/", + std::move(document_snapshot_handler)); + cloud_firestore_firebase_firestore_host_api_respond_document_reference_snapshot( + response_handle, channel_name.c_str()); +} + +void HandlePersistenceCacheIndexManagerRequest( + CloudFirestoreFirestorePigeonFirebaseApp* app, + CloudFirestorePersistenceCacheIndexManagerRequest request, + CloudFirestoreFirebaseFirestoreHostApiResponseHandle* response_handle, + gpointer user_data) { + // Not available in the C++ SDK; mirrors the Windows stub. + cloud_firestore_firebase_firestore_host_api_respond_error_persistence_cache_index_manager_request( + response_handle, "Not implemented on Linux", "Not implemented on Linux", + nullptr); +} + +void HandleExecutePipeline( + CloudFirestoreFirestorePigeonFirebaseApp* app, FlValue* stages, + FlValue* options, + CloudFirestoreFirebaseFirestoreHostApiResponseHandle* response_handle, + gpointer user_data) { + // Not available in the C++ SDK; mirrors the Windows stub. + cloud_firestore_firebase_firestore_host_api_respond_error_execute_pipeline( + response_handle, "Not implemented on Linux", "Not implemented on Linux", + nullptr); +} + +const CloudFirestoreFirebaseFirestoreHostApiVTable kHostApiVTable = { + HandleLoadBundle, // load_bundle + HandleNamedQueryGet, // named_query_get + HandleClearPersistence, // clear_persistence + HandleDisableNetwork, // disable_network + HandleEnableNetwork, // enable_network + HandleTerminate, // terminate + HandleWaitForPendingWrites, // wait_for_pending_writes + HandleSetIndexConfiguration, // set_index_configuration + HandleSetLoggingEnabled, // set_logging_enabled + HandleSnapshotsInSyncSetup, // snapshots_in_sync_setup + HandleTransactionCreate, // transaction_create + HandleTransactionStoreResult, // transaction_store_result + HandleTransactionGet, // transaction_get + HandleDocumentReferenceSet, // document_reference_set + HandleDocumentReferenceUpdate, // document_reference_update + HandleDocumentReferenceGet, // document_reference_get + HandleDocumentReferenceDelete, // document_reference_delete + HandleQueryGet, // query_get + HandleAggregateQuery, // aggregate_query + HandleWriteBatchCommit, // write_batch_commit + HandleQuerySnapshot, // query_snapshot + HandleDocumentReferenceSnapshot, // document_reference_snapshot + HandlePersistenceCacheIndexManagerRequest, // persistence_cache_index_manager_request + HandleExecutePipeline, // execute_pipeline +}; + +// Implements the firebase_core plugin registry contract. Windows does not +// register Firestore with its registry; on Linux we register with an empty +// constants map, matching the Android/iOS implementations. +class CloudFirestoreFlutterFirebasePlugin : public FlutterFirebasePlugin { + public: + FlValue* GetPluginConstantsForFirebaseApp(const App& app) override { + return fl_value_new_map(); + } + + void DidReinitializeFirebaseCore() override { + // Release all cached Firestore instances on hot restart, mirroring the + // Android implementation (the Windows one keeps stale instances). + transaction_handlers_.clear(); + transactions_.clear(); + FirestoreInstanceCache().clear(); + } +}; + +CloudFirestoreFlutterFirebasePlugin* GetFlutterFirebasePlugin() { + static CloudFirestoreFlutterFirebasePlugin plugin; + return &plugin; +} + +} // namespace + +static void cloud_firestore_plugin_dispose(GObject* object) { + G_OBJECT_CLASS(cloud_firestore_plugin_parent_class)->dispose(object); +} + +static void cloud_firestore_plugin_class_init( + CloudFirestorePluginClass* klass) { + G_OBJECT_CLASS(klass)->dispose = cloud_firestore_plugin_dispose; +} + +static void cloud_firestore_plugin_init(CloudFirestorePlugin* self) {} + +void cloud_firestore_plugin_register_with_registrar( + FlPluginRegistrar* registrar) { + CloudFirestorePlugin* plugin = CLOUD_FIRESTORE_PLUGIN( + g_object_new(cloud_firestore_plugin_get_type(), nullptr)); + + messenger_ = fl_plugin_registrar_get_messenger(registrar); + + cloud_firestore_firebase_firestore_host_api_set_method_handlers( + messenger_, /* suffix= */ nullptr, &kHostApiVTable, g_object_ref(plugin), + g_object_unref); + + g_object_unref(plugin); + + RegisterFlutterFirebasePlugin("plugins.flutter.io/firebase_firestore", + GetFlutterFirebasePlugin()); + + // Register for platform logging + App::RegisterLibrary( + kLibraryName, cloud_firestore_linux::getPluginVersion().c_str(), nullptr); +} diff --git a/packages/cloud_firestore/cloud_firestore/linux/firestore_codec.cc b/packages/cloud_firestore/cloud_firestore/linux/firestore_codec.cc new file mode 100644 index 000000000000..74cc6111f48c --- /dev/null +++ b/packages/cloud_firestore/cloud_firestore/linux/firestore_codec.cc @@ -0,0 +1,659 @@ +// Copyright 2026, the Chromium project authors. Please see the AUTHORS file +// for details. All rights reserved. Use of this source code is governed by a +// BSD-style license that can be found in the LICENSE file. + +#include "firestore_codec.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "firebase/app.h" +#include "firebase/firestore.h" + +using firebase::Timestamp; +using firebase::firestore::DocumentReference; +using firebase::firestore::FieldPath; +using firebase::firestore::FieldValue; +using firebase::firestore::Firestore; +using firebase::firestore::GeoPoint; + +namespace cloud_firestore_linux { + +namespace { + +// Boxes a copy of a firebase C++ value inside an FlValue custom. The FlValue +// owns the heap copy and deletes it when the last reference is dropped. +template +FlValue* BoxCustom(int type_id, const T& value) { + return fl_value_new_custom(type_id, new T(value), [](gpointer boxed) { + delete static_cast(boxed); + }); +} + +template +const T& UnboxCustom(FlValue* value) { + return *static_cast(fl_value_get_custom_value(value)); +} + +// Returns the FlStandardMessageCodec base class so the fallbacks below can +// chain up past the Pigeon-generated subclass without recursing into it. +FlStandardMessageCodecClass* StandardCodecClass() { + return FL_STANDARD_MESSAGE_CODEC_CLASS( + g_type_class_peek(fl_standard_message_codec_get_type())); +} + +gboolean WriteBytes(GByteArray* buffer, const void* data, size_t length) { + g_byte_array_append(buffer, static_cast(data), + static_cast(length)); + return TRUE; +} + +void WriteAlignment(GByteArray* buffer, size_t alignment) { + static const uint8_t zero = 0; + while (buffer->len % alignment != 0) { + g_byte_array_append(buffer, &zero, 1); + } +} + +gboolean WriteStringValue(FlStandardMessageCodec* codec, GByteArray* buffer, + const std::string& value, GError** error) { + g_autoptr(FlValue) fl_string = fl_value_new_string(value.c_str()); + return fl_standard_message_codec_write_value(codec, buffer, fl_string, error); +} + +gboolean ReadBytes(GBytes* buffer, size_t* offset, void* out, size_t count, + GError** error) { + gsize data_length; + const uint8_t* data = + static_cast(g_bytes_get_data(buffer, &data_length)); + if (*offset + count > data_length) { + g_set_error(error, FL_MESSAGE_CODEC_ERROR, FL_MESSAGE_CODEC_ERROR_FAILED, + "Unexpected end of message"); + return FALSE; + } + memcpy(out, data + *offset, count); + *offset += count; + return TRUE; +} + +void ReadAlignment(size_t* offset, size_t alignment) { + while (*offset % alignment != 0) { + (*offset)++; + } +} + +// Reads a full (typed) value using the derived codec so nested Firestore +// customs are decoded too. Returns nullptr on error. +FlValue* ReadNestedValue(FlStandardMessageCodec* codec, GBytes* buffer, + size_t* offset, GError** error) { + return fl_standard_message_codec_read_value(codec, buffer, offset, error); +} + +std::string ReadNestedString(FlStandardMessageCodec* codec, GBytes* buffer, + size_t* offset, GError** error) { + g_autoptr(FlValue) value = ReadNestedValue(codec, buffer, offset, error); + if (value == nullptr || fl_value_get_type(value) != FL_VALUE_TYPE_STRING) { + return std::string(); + } + return fl_value_get_string(value); +} + +firebase::firestore::Settings SettingsFromFlValueMap(FlValue* settings_map) { + firebase::firestore::Settings settings; + + std::map map; + if (settings_map != nullptr && + fl_value_get_type(settings_map) == FL_VALUE_TYPE_MAP) { + size_t length = fl_value_get_length(settings_map); + for (size_t i = 0; i < length; ++i) { + FlValue* key = fl_value_get_map_key(settings_map, i); + FlValue* value = fl_value_get_map_value(settings_map, i); + if (fl_value_get_type(key) == FL_VALUE_TYPE_STRING && + fl_value_get_type(value) != FL_VALUE_TYPE_NULL) { + map[fl_value_get_string(key)] = value; + } + } + } + + if (map.count("persistenceEnabled") != 0) { + bool persist_enabled = fl_value_get_bool(map["persistenceEnabled"]); + + // This is the maximum amount of cache allowed. We use the same number + // on android. + int64_t size = 104857600; + + if (map.count("cacheSizeBytes") != 0) { + int64_t cache_size_bytes = fl_value_get_int(map["cacheSizeBytes"]); + if (cache_size_bytes != -1) { + size = cache_size_bytes; + } + } + + if (persist_enabled) { + settings.set_cache_size_bytes(size); + } + } + + if (map.count("host") != 0) { + settings.set_host(fl_value_get_string(map["host"])); + + // Only allow changing ssl if host is also specified. + settings.set_ssl_enabled(false); + } + + return settings; +} + +} // namespace + +FlValue* CustomFieldValue(const FieldValue& value) { + return BoxCustom(FirestoreCodec::DATA_TYPE_FIELD_VALUE, value); +} + +FlValue* CustomFieldPath(const FieldPath& path) { + return BoxCustom(FirestoreCodec::DATA_TYPE_FIELD_PATH, path); +} + +FlValue* CustomTimestamp(const Timestamp& timestamp) { + return BoxCustom(FirestoreCodec::DATA_TYPE_TIMESTAMP, timestamp); +} + +FlValue* CustomGeoPoint(const GeoPoint& geo_point) { + return BoxCustom(FirestoreCodec::DATA_TYPE_GEO_POINT, geo_point); +} + +FlValue* CustomDocumentReference(const DocumentReference& reference) { + return BoxCustom( + FirestoreCodec::DATA_TYPE_DOCUMENT_REFERENCE, reference); +} + +const FieldValue& GetCustomFieldValue(FlValue* value) { + return UnboxCustom(value); +} + +const FieldPath& GetCustomFieldPath(FlValue* value) { + return UnboxCustom(value); +} + +std::map>& FirestoreInstanceCache() { + static std::map> instances; + return instances; +} + +FieldValue ConvertToFieldValue(FlValue* value) { + switch (fl_value_get_type(value)) { + case FL_VALUE_TYPE_NULL: + return FieldValue::Null(); + case FL_VALUE_TYPE_BOOL: + return FieldValue::Boolean(fl_value_get_bool(value)); + case FL_VALUE_TYPE_INT: + return FieldValue::Integer(fl_value_get_int(value)); + case FL_VALUE_TYPE_FLOAT: + return FieldValue::Double(fl_value_get_float(value)); + case FL_VALUE_TYPE_STRING: + return FieldValue::String(fl_value_get_string(value)); + case FL_VALUE_TYPE_UINT8_LIST: + // Improvement over Windows (which throws for typed-data lists): a raw + // Uint8List maps naturally onto a Firestore blob. + return FieldValue::Blob(fl_value_get_uint8_list(value), + fl_value_get_length(value)); + case FL_VALUE_TYPE_LIST: { + std::vector converted_list; + size_t length = fl_value_get_length(value); + for (size_t i = 0; i < length; ++i) { + converted_list.push_back( + ConvertToFieldValue(fl_value_get_list_value(value, i))); + } + return FieldValue::Array(converted_list); + } + case FL_VALUE_TYPE_MAP: + return FieldValue::Map(ConvertToMapFieldValue(value)); + case FL_VALUE_TYPE_CUSTOM: { + switch (fl_value_get_custom_type(value)) { + case FirestoreCodec::DATA_TYPE_FIELD_VALUE: + return UnboxCustom(value); + case FirestoreCodec::DATA_TYPE_TIMESTAMP: + return FieldValue::Timestamp(UnboxCustom(value)); + case FirestoreCodec::DATA_TYPE_GEO_POINT: + return FieldValue::GeoPoint(UnboxCustom(value)); + case FirestoreCodec::DATA_TYPE_DOCUMENT_REFERENCE: + return FieldValue::Reference(UnboxCustom(value)); + default: + throw std::runtime_error("Unsupported custom FlValue type"); + } + } + default: + // Add more types as needed + // You may throw an exception or handle this some other way + throw std::runtime_error("Unsupported FlValue type"); + } +} + +std::vector ConvertToFieldValueList(FlValue* list) { + std::vector converted_list; + size_t length = fl_value_get_length(list); + for (size_t i = 0; i < length; ++i) { + converted_list.push_back( + ConvertToFieldValue(fl_value_get_list_value(list, i))); + } + return converted_list; +} + +firebase::firestore::MapFieldValue ConvertToMapFieldValue(FlValue* map) { + firebase::firestore::MapFieldValue converted_map; + + size_t length = fl_value_get_length(map); + for (size_t i = 0; i < length; ++i) { + FlValue* key = fl_value_get_map_key(map, i); + if (fl_value_get_type(key) == FL_VALUE_TYPE_STRING) { + converted_map[fl_value_get_string(key)] = + ConvertToFieldValue(fl_value_get_map_value(map, i)); + } else { + // Handle or skip non-string keys + // You may throw an exception or handle this some other way + throw std::runtime_error("Unsupported key type"); + } + } + + return converted_map; +} + +firebase::firestore::MapFieldPathValue ConvertToMapFieldPathValue( + FlValue* map) { + firebase::firestore::MapFieldPathValue converted_map; + + size_t length = fl_value_get_length(map); + for (size_t i = 0; i < length; ++i) { + FlValue* key = fl_value_get_map_key(map, i); + FlValue* value = fl_value_get_map_value(map, i); + if (fl_value_get_type(key) == FL_VALUE_TYPE_STRING) { + std::vector converted_list; + converted_list.push_back(fl_value_get_string(key)); + converted_map[FieldPath(converted_list)] = ConvertToFieldValue(value); + } else if (fl_value_get_type(key) == FL_VALUE_TYPE_CUSTOM && + fl_value_get_custom_type(key) == + FirestoreCodec::DATA_TYPE_FIELD_PATH) { + converted_map[UnboxCustom(key)] = ConvertToFieldValue(value); + } else { + // Handle or skip non-string keys + // You may throw an exception or handle this some other way + throw std::runtime_error("Unsupported key type"); + } + } + + return converted_map; +} + +std::vector ConvertToFieldPathVector(FlValue* list) { + std::vector field_vector; + + size_t length = fl_value_get_length(list); + for (size_t i = 0; i < length; ++i) { + FlValue* field_path = fl_value_get_list_value(list, i); + + std::vector converted_list; + size_t path_length = fl_value_get_length(field_path); + for (size_t j = 0; j < path_length; ++j) { + converted_list.push_back( + fl_value_get_string(fl_value_get_list_value(field_path, j))); + } + + // Was already converted by the Codec + field_vector.push_back(FieldPath(converted_list)); + } + + return field_vector; +} + +FlValue* ConvertFieldValueToFlValue(const FieldValue& field_value) { + switch (field_value.type()) { + case FieldValue::Type::kNull: + return fl_value_new_null(); + + case FieldValue::Type::kBoolean: + return fl_value_new_bool(field_value.boolean_value()); + + case FieldValue::Type::kInteger: + return fl_value_new_int(field_value.integer_value()); + + case FieldValue::Type::kDouble: + return fl_value_new_float(field_value.double_value()); + + case FieldValue::Type::kTimestamp: + return CustomTimestamp(field_value.timestamp_value()); + + case FieldValue::Type::kString: + return fl_value_new_string(field_value.string_value().c_str()); + + case FieldValue::Type::kBlob: + return fl_value_new_uint8_list(field_value.blob_value(), + field_value.blob_size()); + + case FieldValue::Type::kMap: { + FlValue* map = fl_value_new_map(); + for (const auto& kv : field_value.map_value()) { + fl_value_set_take(map, fl_value_new_string(kv.first.c_str()), + ConvertFieldValueToFlValue(kv.second)); + } + return map; + } + + case FieldValue::Type::kArray: { + FlValue* list = fl_value_new_list(); + for (const auto& item : field_value.array_value()) { + fl_value_append_take(list, ConvertFieldValueToFlValue(item)); + } + return list; + } + + case FieldValue::Type::kGeoPoint: + return CustomGeoPoint(field_value.geo_point_value()); + + case FieldValue::Type::kReference: + return CustomDocumentReference(field_value.reference_value()); + + default: + return fl_value_new_null(); + } +} + +FlValue* ConvertMapFieldValueToFlValue( + const firebase::firestore::MapFieldValue& map) { + FlValue* converted_map = fl_value_new_map(); + for (const auto& kv : map) { + fl_value_set_take(converted_map, fl_value_new_string(kv.first.c_str()), + ConvertFieldValueToFlValue(kv.second)); + } + return converted_map; +} + +} // namespace cloud_firestore_linux + +using cloud_firestore_linux::ConvertToFieldValueList; +using cloud_firestore_linux::CustomDocumentReference; +using cloud_firestore_linux::CustomFieldPath; +using cloud_firestore_linux::CustomFieldValue; +using cloud_firestore_linux::FirestoreCodec; +using cloud_firestore_linux::FirestoreInstanceCache; + +gboolean firestore_codec_write_value(FlStandardMessageCodec* codec, + GByteArray* buffer, FlValue* value, + GError** error) { + if (value != nullptr && fl_value_get_type(value) == FL_VALUE_TYPE_CUSTOM) { + switch (fl_value_get_custom_type(value)) { + case FirestoreCodec::DATA_TYPE_TIMESTAMP: { + const Timestamp& timestamp = + *static_cast(fl_value_get_custom_value(value)); + uint8_t type_byte = FirestoreCodec::DATA_TYPE_TIMESTAMP; + int64_t seconds = timestamp.seconds(); + int32_t nanoseconds = timestamp.nanoseconds(); + g_byte_array_append(buffer, &type_byte, 1); + cloud_firestore_linux::WriteBytes(buffer, &seconds, sizeof(seconds)); + cloud_firestore_linux::WriteBytes(buffer, &nanoseconds, + sizeof(nanoseconds)); + return TRUE; + } + case FirestoreCodec::DATA_TYPE_GEO_POINT: { + const GeoPoint& geo_point = + *static_cast(fl_value_get_custom_value(value)); + uint8_t type_byte = FirestoreCodec::DATA_TYPE_GEO_POINT; + g_byte_array_append(buffer, &type_byte, 1); + cloud_firestore_linux::WriteAlignment(buffer, 8); + double latitude = geo_point.latitude(); + double longitude = geo_point.longitude(); + cloud_firestore_linux::WriteBytes(buffer, &latitude, sizeof(latitude)); + cloud_firestore_linux::WriteBytes(buffer, &longitude, + sizeof(longitude)); + return TRUE; + } + case FirestoreCodec::DATA_TYPE_DOCUMENT_REFERENCE: { + const DocumentReference& reference = + *static_cast( + fl_value_get_custom_value(value)); + uint8_t type_byte = FirestoreCodec::DATA_TYPE_DOCUMENT_REFERENCE; + g_byte_array_append(buffer, &type_byte, 1); + const Firestore* firestore = reference.firestore(); + std::string app_name = firestore->app()->name(); + std::string database_url = "(default)"; + if (!cloud_firestore_linux::WriteStringValue(codec, buffer, app_name, + error) || + !cloud_firestore_linux::WriteStringValue(codec, buffer, + reference.path(), error) || + !cloud_firestore_linux::WriteStringValue(codec, buffer, + database_url, error)) { + return FALSE; + } + return TRUE; + } + } + } + + return cloud_firestore_linux::StandardCodecClass()->write_value(codec, buffer, + value, error); +} + +FlValue* firestore_codec_read_value_of_type(FlStandardMessageCodec* codec, + GBytes* buffer, size_t* offset, + int type, GError** error) { + switch (type) { + case FirestoreCodec::DATA_TYPE_DATE_TIME: { + int64_t value; + if (!cloud_firestore_linux::ReadBytes(buffer, offset, &value, + sizeof(value), error)) { + return nullptr; + } + return CustomFieldValue( + FieldValue::Timestamp(Timestamp(value / 1000, 0))); + } + + case FirestoreCodec::DATA_TYPE_TIMESTAMP: { + int64_t seconds; + int32_t nanoseconds; + if (!cloud_firestore_linux::ReadBytes(buffer, offset, &seconds, + sizeof(seconds), error) || + !cloud_firestore_linux::ReadBytes(buffer, offset, &nanoseconds, + sizeof(nanoseconds), error)) { + return nullptr; + } + return CustomFieldValue( + FieldValue::Timestamp(Timestamp(seconds, nanoseconds))); + } + + case FirestoreCodec::DATA_TYPE_DOCUMENT_REFERENCE: { + g_autoptr(FlValue) firestore_value = + cloud_firestore_linux::ReadNestedValue(codec, buffer, offset, error); + if (firestore_value == nullptr || + fl_value_get_type(firestore_value) != FL_VALUE_TYPE_CUSTOM || + fl_value_get_custom_type(firestore_value) != + FirestoreCodec::DATA_TYPE_FIRESTORE_INSTANCE) { + g_set_error(error, FL_MESSAGE_CODEC_ERROR, + FL_MESSAGE_CODEC_ERROR_FAILED, + "Expected Firestore instance"); + return nullptr; + } + Firestore* firestore = *static_cast( + fl_value_get_custom_value(firestore_value)); + + std::string path = + cloud_firestore_linux::ReadNestedString(codec, buffer, offset, error); + if (error != nullptr && *error != nullptr) { + return nullptr; + } + + return CustomDocumentReference(firestore->Document(path)); + } + + case FirestoreCodec::DATA_TYPE_GEO_POINT: { + double latitude; + double longitude; + cloud_firestore_linux::ReadAlignment(offset, 8); + if (!cloud_firestore_linux::ReadBytes(buffer, offset, &latitude, + sizeof(latitude), error) || + !cloud_firestore_linux::ReadBytes(buffer, offset, &longitude, + sizeof(longitude), error)) { + return nullptr; + } + return CustomFieldValue( + FieldValue::GeoPoint(GeoPoint(latitude, longitude))); + } + + case FirestoreCodec::DATA_TYPE_FIELD_PATH: { + uint32_t length; + if (!fl_standard_message_codec_read_size(codec, buffer, offset, &length, + error)) { + return nullptr; + } + std::vector array; + for (uint32_t i = 0; i < length; ++i) { + array.push_back(cloud_firestore_linux::ReadNestedString(codec, buffer, + offset, error)); + if (error != nullptr && *error != nullptr) { + return nullptr; + } + } + return CustomFieldPath(FieldPath(array)); + } + + case FirestoreCodec::DATA_TYPE_BLOB: { + uint32_t length; + if (!fl_standard_message_codec_read_size(codec, buffer, offset, &length, + error)) { + return nullptr; + } + std::vector blob_data(length); + if (length > 0 && !cloud_firestore_linux::ReadBytes( + buffer, offset, blob_data.data(), length, error)) { + return nullptr; + } + return CustomFieldValue(FieldValue::Blob(blob_data.data(), length)); + } + + case FirestoreCodec::DATA_TYPE_ARRAY_UNION: { + g_autoptr(FlValue) values = + cloud_firestore_linux::ReadNestedValue(codec, buffer, offset, error); + if (values == nullptr) { + return nullptr; + } + return CustomFieldValue( + FieldValue::ArrayUnion(ConvertToFieldValueList(values))); + } + + case FirestoreCodec::DATA_TYPE_ARRAY_REMOVE: { + g_autoptr(FlValue) values = + cloud_firestore_linux::ReadNestedValue(codec, buffer, offset, error); + if (values == nullptr) { + return nullptr; + } + return CustomFieldValue( + FieldValue::ArrayRemove(ConvertToFieldValueList(values))); + } + + case FirestoreCodec::DATA_TYPE_DELETE: + return CustomFieldValue(FieldValue::Delete()); + + case FirestoreCodec::DATA_TYPE_SERVER_TIMESTAMP: + return CustomFieldValue(FieldValue::ServerTimestamp()); + + case FirestoreCodec::DATA_TYPE_INCREMENT_DOUBLE: { + g_autoptr(FlValue) value = + cloud_firestore_linux::ReadNestedValue(codec, buffer, offset, error); + if (value == nullptr) { + return nullptr; + } + return CustomFieldValue(FieldValue::Increment(fl_value_get_float(value))); + } + + case FirestoreCodec::DATA_TYPE_INCREMENT_INTEGER: { + g_autoptr(FlValue) value = + cloud_firestore_linux::ReadNestedValue(codec, buffer, offset, error); + if (value == nullptr) { + return nullptr; + } + return CustomFieldValue(FieldValue::Increment(fl_value_get_int(value))); + } + + case FirestoreCodec::DATA_TYPE_DOCUMENT_ID: + return CustomFieldPath(FieldPath::DocumentId()); + + case FirestoreCodec::DATA_TYPE_FIRESTORE_INSTANCE: { + std::string app_name = + cloud_firestore_linux::ReadNestedString(codec, buffer, offset, error); + if (error != nullptr && *error != nullptr) { + return nullptr; + } + std::string database_url = + cloud_firestore_linux::ReadNestedString(codec, buffer, offset, error); + if (error != nullptr && *error != nullptr) { + return nullptr; + } + g_autoptr(FlValue) settings_value = + cloud_firestore_linux::ReadNestedValue(codec, buffer, offset, error); + if (settings_value == nullptr || + fl_value_get_type(settings_value) != FL_VALUE_TYPE_CUSTOM || + fl_value_get_custom_type(settings_value) != + FirestoreCodec::DATA_TYPE_FIRESTORE_SETTINGS) { + g_set_error(error, FL_MESSAGE_CODEC_ERROR, + FL_MESSAGE_CODEC_ERROR_FAILED, + "Expected Firestore settings"); + return nullptr; + } + const firebase::firestore::Settings& settings = + *static_cast( + fl_value_get_custom_value(settings_value)); + + // Use composite key matching GetFirestoreFromPigeon to avoid + // creating a duplicate unique_ptr for the same Firestore instance. + // See https://github.com/firebase/flutterfire/issues/18028 + std::string cache_key = app_name + "-" + database_url; + + auto& instances = FirestoreInstanceCache(); + if (instances.find(cache_key) == instances.end()) { + firebase::App* app = firebase::App::GetInstance(app_name.c_str()); + Firestore* firestore = + Firestore::GetInstance(app, database_url.c_str()); + firestore->set_settings(settings); + instances[cache_key] = std::unique_ptr(firestore); + } + Firestore* firestore = instances[cache_key].get(); + + return fl_value_new_custom(FirestoreCodec::DATA_TYPE_FIRESTORE_INSTANCE, + new Firestore*(firestore), [](gpointer boxed) { + delete static_cast(boxed); + }); + } + + case FirestoreCodec::DATA_TYPE_FIRESTORE_SETTINGS: { + g_autoptr(FlValue) settings_map = + cloud_firestore_linux::ReadNestedValue(codec, buffer, offset, error); + if (settings_map == nullptr) { + return nullptr; + } + firebase::firestore::Settings settings = + cloud_firestore_linux::SettingsFromFlValueMap(settings_map); + return fl_value_new_custom( + FirestoreCodec::DATA_TYPE_FIRESTORE_SETTINGS, + new firebase::firestore::Settings(settings), [](gpointer boxed) { + delete static_cast(boxed); + }); + } + + case FirestoreCodec::DATA_TYPE_NAN: + return fl_value_new_float(std::nan("1")); + + case FirestoreCodec::DATA_TYPE_INFINITY: + return fl_value_new_float(std::numeric_limits::infinity()); + + case FirestoreCodec::DATA_TYPE_NEGATIVE_INFINITY: + return fl_value_new_float(-std::numeric_limits::infinity()); + } + + return cloud_firestore_linux::StandardCodecClass()->read_value_of_type( + codec, buffer, offset, type, error); +} diff --git a/packages/cloud_firestore/cloud_firestore/linux/firestore_codec.h b/packages/cloud_firestore/cloud_firestore/linux/firestore_codec.h new file mode 100644 index 000000000000..4fc9a0adc5a1 --- /dev/null +++ b/packages/cloud_firestore/cloud_firestore/linux/firestore_codec.h @@ -0,0 +1,115 @@ +/* + * Copyright 2026, the Chromium project authors. Please see the AUTHORS file + * for details. All rights reserved. Use of this source code is governed by a + * BSD-style license that can be found in the LICENSE file. + */ + +#ifndef FIRESTORE_CODEC_H_ +#define FIRESTORE_CODEC_H_ + +#include + +#include +#include +#include +#include + +#include "firebase/firestore.h" +#include "firebase/firestore/field_path.h" +#include "firebase/firestore/field_value.h" +#include "firebase/firestore/geo_point.h" + +namespace cloud_firestore_linux { + +// Extension of the Pigeon-generated CloudFirestoreMessageCodec that +// (de)serializes the Firestore-specific wire types used by the Dart +// FirestoreMessageCodec (FieldValue sentinels, Timestamp, GeoPoint, +// DocumentReference, Blob, FieldPath, Firestore instance, Settings and +// special doubles). This mirrors windows/firestore_codec.cpp: the generated +// codec in messages.g.cc chains its unknown-type fallbacks into +// firestore_codec_write_value / firestore_codec_read_value_of_type below. +class FirestoreCodec { + public: + // Wire bytes used by the Dart FirestoreMessageCodec. These double as the + // FlValue custom type ids used to carry the decoded firebase C++ objects + // through FlValue trees (except the ids marked "in-memory only"). + static constexpr uint8_t DATA_TYPE_DATE_TIME = 180; + static constexpr uint8_t DATA_TYPE_GEO_POINT = 181; + static constexpr uint8_t DATA_TYPE_DOCUMENT_REFERENCE = 182; + static constexpr uint8_t DATA_TYPE_BLOB = 183; + static constexpr uint8_t DATA_TYPE_ARRAY_UNION = 184; + static constexpr uint8_t DATA_TYPE_ARRAY_REMOVE = 185; + static constexpr uint8_t DATA_TYPE_DELETE = 186; + static constexpr uint8_t DATA_TYPE_SERVER_TIMESTAMP = 187; + static constexpr uint8_t DATA_TYPE_TIMESTAMP = 188; + static constexpr uint8_t DATA_TYPE_INCREMENT_DOUBLE = 189; + static constexpr uint8_t DATA_TYPE_INCREMENT_INTEGER = 190; + static constexpr uint8_t DATA_TYPE_DOCUMENT_ID = 191; + static constexpr uint8_t DATA_TYPE_FIELD_PATH = 192; + static constexpr uint8_t DATA_TYPE_NAN = 193; + static constexpr uint8_t DATA_TYPE_INFINITY = 194; + static constexpr uint8_t DATA_TYPE_NEGATIVE_INFINITY = 195; + static constexpr uint8_t DATA_TYPE_FIRESTORE_INSTANCE = 196; + static constexpr uint8_t DATA_TYPE_FIRESTORE_QUERY = 197; + static constexpr uint8_t DATA_TYPE_FIRESTORE_SETTINGS = 198; + // In-memory only FlValue custom id (never a wire byte): a decoded + // firebase::firestore::FieldValue (sentinels, blobs, timestamps, ...). + static constexpr uint8_t DATA_TYPE_FIELD_VALUE = 199; +}; + +// Creates FlValue customs carrying firebase C++ objects (transfer full). +FlValue* CustomFieldValue(const firebase::firestore::FieldValue& value); +FlValue* CustomFieldPath(const firebase::firestore::FieldPath& path); +FlValue* CustomTimestamp(const firebase::Timestamp& timestamp); +FlValue* CustomGeoPoint(const firebase::firestore::GeoPoint& geo_point); +FlValue* CustomDocumentReference( + const firebase::firestore::DocumentReference& reference); + +// Accessors for the FlValue customs above. The FlValue must have the matching +// custom type id. +const firebase::firestore::FieldValue& GetCustomFieldValue(FlValue* value); +const firebase::firestore::FieldPath& GetCustomFieldPath(FlValue* value); + +// Converts an FlValue tree (possibly containing the customs above) into +// firebase::firestore values. Ported from the equivalent helpers in +// windows/cloud_firestore_plugin.cpp. +firebase::firestore::FieldValue ConvertToFieldValue(FlValue* value); +std::vector ConvertToFieldValueList( + FlValue* list); +firebase::firestore::MapFieldValue ConvertToMapFieldValue(FlValue* map); +firebase::firestore::MapFieldPathValue ConvertToMapFieldPathValue(FlValue* map); +std::vector ConvertToFieldPathVector( + FlValue* list); + +// Converts firebase::firestore values into an FlValue tree containing the +// customs above (transfer full). +FlValue* ConvertFieldValueToFlValue( + const firebase::firestore::FieldValue& field_value); +FlValue* ConvertMapFieldValueToFlValue( + const firebase::firestore::MapFieldValue& map); + +// Cache of Firestore instances keyed by "-", shared +// between the codec (DATA_TYPE_FIRESTORE_INSTANCE) and the plugin +// (GetFirestoreFromPigeon / Terminate). Mirrors +// CloudFirestorePlugin::firestoreInstances_ on Windows. +std::map>& +FirestoreInstanceCache(); + +} // namespace cloud_firestore_linux + +G_BEGIN_DECLS + +// Fallbacks chained from the Pigeon-generated CloudFirestoreMessageCodec in +// messages.g.cc (see the generate:pigeon:linux post-processing step). They +// handle the Firestore wire types and delegate everything else to +// FlStandardMessageCodec. +gboolean firestore_codec_write_value(FlStandardMessageCodec* codec, + GByteArray* buffer, FlValue* value, + GError** error); +FlValue* firestore_codec_read_value_of_type(FlStandardMessageCodec* codec, + GBytes* buffer, size_t* offset, + int type, GError** error); + +G_END_DECLS + +#endif // FIRESTORE_CODEC_H_ diff --git a/packages/cloud_firestore/cloud_firestore/linux/include/cloud_firestore/cloud_firestore_plugin.h b/packages/cloud_firestore/cloud_firestore/linux/include/cloud_firestore/cloud_firestore_plugin.h new file mode 100644 index 000000000000..db26458b7f60 --- /dev/null +++ b/packages/cloud_firestore/cloud_firestore/linux/include/cloud_firestore/cloud_firestore_plugin.h @@ -0,0 +1,32 @@ +/* + * Copyright 2026, the Chromium project authors. Please see the AUTHORS file + * for details. All rights reserved. Use of this source code is governed by a + * BSD-style license that can be found in the LICENSE file. + */ + +#ifndef FLUTTER_PLUGIN_CLOUD_FIRESTORE_PLUGIN_H_ +#define FLUTTER_PLUGIN_CLOUD_FIRESTORE_PLUGIN_H_ + +#include + +G_BEGIN_DECLS + +#ifdef FLUTTER_PLUGIN_IMPL +#define FLUTTER_PLUGIN_EXPORT __attribute__((visibility("default"))) +#else +#define FLUTTER_PLUGIN_EXPORT +#endif + +typedef struct _CloudFirestorePlugin CloudFirestorePlugin; +typedef struct { + GObjectClass parent_class; +} CloudFirestorePluginClass; + +FLUTTER_PLUGIN_EXPORT GType cloud_firestore_plugin_get_type(); + +FLUTTER_PLUGIN_EXPORT void cloud_firestore_plugin_register_with_registrar( + FlPluginRegistrar* registrar); + +G_END_DECLS + +#endif // FLUTTER_PLUGIN_CLOUD_FIRESTORE_PLUGIN_H_ diff --git a/packages/cloud_firestore/cloud_firestore/linux/messages.g.cc b/packages/cloud_firestore/cloud_firestore/linux/messages.g.cc new file mode 100644 index 000000000000..45d7e01d9bec --- /dev/null +++ b/packages/cloud_firestore/cloud_firestore/linux/messages.g.cc @@ -0,0 +1,7150 @@ +// Copyright 2023, the Chromium project authors. Please see the AUTHORS file +// for details. All rights reserved. Use of this source code is governed by a +// BSD-style license that can be found in the LICENSE file. +// Autogenerated from Pigeon (v26.3.4), do not edit directly. +// See also: https://pub.dev/packages/pigeon + +#include "messages.g.h" + +#include + +#include + +#include "firestore_codec.h" +static guint G_GNUC_UNUSED flpigeon_hash_double(double v) { + if (std::isnan(v)) { + return static_cast(0x7FF80000); + } + if (v == 0.0) { + v = 0.0; + } + union { + double d; + uint64_t u; + } u; + u.d = v; + return static_cast(u.u ^ (u.u >> 32)); +} +static gboolean G_GNUC_UNUSED flpigeon_equals_double(double a, double b) { + return (a == b) || (std::isnan(a) && std::isnan(b)); +} +static gboolean G_GNUC_UNUSED flpigeon_deep_equals(FlValue* a, FlValue* b) { + if (a == b) { + return TRUE; + } + if (a == nullptr || b == nullptr) { + return FALSE; + } + if (fl_value_get_type(a) != fl_value_get_type(b)) { + return FALSE; + } + switch (fl_value_get_type(a)) { + case FL_VALUE_TYPE_NULL: + return TRUE; + case FL_VALUE_TYPE_BOOL: + return fl_value_get_bool(a) == fl_value_get_bool(b); + case FL_VALUE_TYPE_INT: + return fl_value_get_int(a) == fl_value_get_int(b); + case FL_VALUE_TYPE_FLOAT: { + return flpigeon_equals_double(fl_value_get_float(a), + fl_value_get_float(b)); + } + case FL_VALUE_TYPE_STRING: + return g_strcmp0(fl_value_get_string(a), fl_value_get_string(b)) == 0; + case FL_VALUE_TYPE_UINT8_LIST: + return fl_value_get_length(a) == fl_value_get_length(b) && + memcmp(fl_value_get_uint8_list(a), fl_value_get_uint8_list(b), + fl_value_get_length(a)) == 0; + case FL_VALUE_TYPE_INT32_LIST: + return fl_value_get_length(a) == fl_value_get_length(b) && + memcmp(fl_value_get_int32_list(a), fl_value_get_int32_list(b), + fl_value_get_length(a) * sizeof(int32_t)) == 0; + case FL_VALUE_TYPE_INT64_LIST: + return fl_value_get_length(a) == fl_value_get_length(b) && + memcmp(fl_value_get_int64_list(a), fl_value_get_int64_list(b), + fl_value_get_length(a) * sizeof(int64_t)) == 0; + case FL_VALUE_TYPE_FLOAT_LIST: { + size_t len = fl_value_get_length(a); + if (len != fl_value_get_length(b)) { + return FALSE; + } + const double* a_data = fl_value_get_float_list(a); + const double* b_data = fl_value_get_float_list(b); + for (size_t i = 0; i < len; i++) { + if (!flpigeon_equals_double(a_data[i], b_data[i])) { + return FALSE; + } + } + return TRUE; + } + case FL_VALUE_TYPE_LIST: { + size_t len = fl_value_get_length(a); + if (len != fl_value_get_length(b)) { + return FALSE; + } + for (size_t i = 0; i < len; i++) { + if (!flpigeon_deep_equals(fl_value_get_list_value(a, i), + fl_value_get_list_value(b, i))) { + return FALSE; + } + } + return TRUE; + } + case FL_VALUE_TYPE_MAP: { + size_t len = fl_value_get_length(a); + if (len != fl_value_get_length(b)) { + return FALSE; + } + for (size_t i = 0; i < len; i++) { + FlValue* key = fl_value_get_map_key(a, i); + FlValue* val = fl_value_get_map_value(a, i); + gboolean found = FALSE; + for (size_t j = 0; j < len; j++) { + FlValue* b_key = fl_value_get_map_key(b, j); + if (flpigeon_deep_equals(key, b_key)) { + FlValue* b_val = fl_value_get_map_value(b, j); + if (flpigeon_deep_equals(val, b_val)) { + found = TRUE; + break; + } else { + return FALSE; + } + } + } + if (!found) { + return FALSE; + } + } + return TRUE; + } + default: + return FALSE; + } + return FALSE; +} +static guint G_GNUC_UNUSED flpigeon_deep_hash(FlValue* value) { + if (value == nullptr) { + return 0; + } + switch (fl_value_get_type(value)) { + case FL_VALUE_TYPE_NULL: + return 0; + case FL_VALUE_TYPE_BOOL: + return fl_value_get_bool(value) ? 1231 : 1237; + case FL_VALUE_TYPE_INT: { + int64_t v = fl_value_get_int(value); + return static_cast(v ^ (v >> 32)); + } + case FL_VALUE_TYPE_FLOAT: + return flpigeon_hash_double(fl_value_get_float(value)); + case FL_VALUE_TYPE_STRING: + return g_str_hash(fl_value_get_string(value)); + case FL_VALUE_TYPE_UINT8_LIST: { + guint result = 1; + size_t len = fl_value_get_length(value); + const uint8_t* data = fl_value_get_uint8_list(value); + for (size_t i = 0; i < len; i++) { + result = result * 31 + data[i]; + } + return result; + } + case FL_VALUE_TYPE_INT32_LIST: { + guint result = 1; + size_t len = fl_value_get_length(value); + const int32_t* data = fl_value_get_int32_list(value); + for (size_t i = 0; i < len; i++) { + result = result * 31 + static_cast(data[i]); + } + return result; + } + case FL_VALUE_TYPE_INT64_LIST: { + guint result = 1; + size_t len = fl_value_get_length(value); + const int64_t* data = fl_value_get_int64_list(value); + for (size_t i = 0; i < len; i++) { + result = result * 31 + static_cast(data[i] ^ (data[i] >> 32)); + } + return result; + } + case FL_VALUE_TYPE_FLOAT_LIST: { + guint result = 1; + size_t len = fl_value_get_length(value); + const double* data = fl_value_get_float_list(value); + for (size_t i = 0; i < len; i++) { + result = result * 31 + flpigeon_hash_double(data[i]); + } + return result; + } + case FL_VALUE_TYPE_LIST: { + guint result = 1; + size_t len = fl_value_get_length(value); + for (size_t i = 0; i < len; i++) { + result = + result * 31 + flpigeon_deep_hash(fl_value_get_list_value(value, i)); + } + return result; + } + case FL_VALUE_TYPE_MAP: { + guint result = 0; + size_t len = fl_value_get_length(value); + for (size_t i = 0; i < len; i++) { + result += ((flpigeon_deep_hash(fl_value_get_map_key(value, i)) * 31) ^ + flpigeon_deep_hash(fl_value_get_map_value(value, i))); + } + return result; + } + default: + return static_cast(fl_value_get_type(value)); + } + return 0; +} + +struct _CloudFirestoreInternalFirebaseSettings { + GObject parent_instance; + + gboolean* persistence_enabled; + gchar* host; + gboolean* ssl_enabled; + int64_t* cache_size_bytes; + gboolean ignore_undefined_properties; +}; + +G_DEFINE_TYPE(CloudFirestoreInternalFirebaseSettings, + cloud_firestore_internal_firebase_settings, G_TYPE_OBJECT) + +static void cloud_firestore_internal_firebase_settings_dispose( + GObject* object) { + CloudFirestoreInternalFirebaseSettings* self = + CLOUD_FIRESTORE_INTERNAL_FIREBASE_SETTINGS(object); + g_clear_pointer(&self->persistence_enabled, g_free); + g_clear_pointer(&self->host, g_free); + g_clear_pointer(&self->ssl_enabled, g_free); + g_clear_pointer(&self->cache_size_bytes, g_free); + G_OBJECT_CLASS(cloud_firestore_internal_firebase_settings_parent_class) + ->dispose(object); +} + +static void cloud_firestore_internal_firebase_settings_init( + CloudFirestoreInternalFirebaseSettings* self) {} + +static void cloud_firestore_internal_firebase_settings_class_init( + CloudFirestoreInternalFirebaseSettingsClass* klass) { + G_OBJECT_CLASS(klass)->dispose = + cloud_firestore_internal_firebase_settings_dispose; +} + +CloudFirestoreInternalFirebaseSettings* +cloud_firestore_internal_firebase_settings_new( + gboolean* persistence_enabled, const gchar* host, gboolean* ssl_enabled, + int64_t* cache_size_bytes, gboolean ignore_undefined_properties) { + CloudFirestoreInternalFirebaseSettings* self = + CLOUD_FIRESTORE_INTERNAL_FIREBASE_SETTINGS(g_object_new( + cloud_firestore_internal_firebase_settings_get_type(), nullptr)); + if (persistence_enabled != nullptr) { + self->persistence_enabled = + static_cast(malloc(sizeof(gboolean))); + *self->persistence_enabled = *persistence_enabled; + } else { + self->persistence_enabled = nullptr; + } + if (host != nullptr) { + self->host = g_strdup(host); + } else { + self->host = nullptr; + } + if (ssl_enabled != nullptr) { + self->ssl_enabled = static_cast(malloc(sizeof(gboolean))); + *self->ssl_enabled = *ssl_enabled; + } else { + self->ssl_enabled = nullptr; + } + if (cache_size_bytes != nullptr) { + self->cache_size_bytes = static_cast(malloc(sizeof(int64_t))); + *self->cache_size_bytes = *cache_size_bytes; + } else { + self->cache_size_bytes = nullptr; + } + self->ignore_undefined_properties = ignore_undefined_properties; + return self; +} + +gboolean* cloud_firestore_internal_firebase_settings_get_persistence_enabled( + CloudFirestoreInternalFirebaseSettings* self) { + g_return_val_if_fail(CLOUD_FIRESTORE_IS_INTERNAL_FIREBASE_SETTINGS(self), + nullptr); + return self->persistence_enabled; +} + +const gchar* cloud_firestore_internal_firebase_settings_get_host( + CloudFirestoreInternalFirebaseSettings* self) { + g_return_val_if_fail(CLOUD_FIRESTORE_IS_INTERNAL_FIREBASE_SETTINGS(self), + nullptr); + return self->host; +} + +gboolean* cloud_firestore_internal_firebase_settings_get_ssl_enabled( + CloudFirestoreInternalFirebaseSettings* self) { + g_return_val_if_fail(CLOUD_FIRESTORE_IS_INTERNAL_FIREBASE_SETTINGS(self), + nullptr); + return self->ssl_enabled; +} + +int64_t* cloud_firestore_internal_firebase_settings_get_cache_size_bytes( + CloudFirestoreInternalFirebaseSettings* self) { + g_return_val_if_fail(CLOUD_FIRESTORE_IS_INTERNAL_FIREBASE_SETTINGS(self), + nullptr); + return self->cache_size_bytes; +} + +gboolean +cloud_firestore_internal_firebase_settings_get_ignore_undefined_properties( + CloudFirestoreInternalFirebaseSettings* self) { + g_return_val_if_fail(CLOUD_FIRESTORE_IS_INTERNAL_FIREBASE_SETTINGS(self), + FALSE); + return self->ignore_undefined_properties; +} + +static FlValue* cloud_firestore_internal_firebase_settings_to_list( + CloudFirestoreInternalFirebaseSettings* self) { + FlValue* values = fl_value_new_list(); + fl_value_append_take(values, + self->persistence_enabled != nullptr + ? fl_value_new_bool(*self->persistence_enabled) + : fl_value_new_null()); + fl_value_append_take(values, self->host != nullptr + ? fl_value_new_string(self->host) + : fl_value_new_null()); + fl_value_append_take(values, self->ssl_enabled != nullptr + ? fl_value_new_bool(*self->ssl_enabled) + : fl_value_new_null()); + fl_value_append_take(values, self->cache_size_bytes != nullptr + ? fl_value_new_int(*self->cache_size_bytes) + : fl_value_new_null()); + fl_value_append_take(values, + fl_value_new_bool(self->ignore_undefined_properties)); + return values; +} + +static CloudFirestoreInternalFirebaseSettings* +cloud_firestore_internal_firebase_settings_new_from_list(FlValue* values) { + FlValue* value0 = fl_value_get_list_value(values, 0); + gboolean* persistence_enabled = nullptr; + gboolean persistence_enabled_value; + if (fl_value_get_type(value0) != FL_VALUE_TYPE_NULL) { + persistence_enabled_value = fl_value_get_bool(value0); + persistence_enabled = &persistence_enabled_value; + } + FlValue* value1 = fl_value_get_list_value(values, 1); + const gchar* host = nullptr; + if (fl_value_get_type(value1) != FL_VALUE_TYPE_NULL) { + host = fl_value_get_string(value1); + } + FlValue* value2 = fl_value_get_list_value(values, 2); + gboolean* ssl_enabled = nullptr; + gboolean ssl_enabled_value; + if (fl_value_get_type(value2) != FL_VALUE_TYPE_NULL) { + ssl_enabled_value = fl_value_get_bool(value2); + ssl_enabled = &ssl_enabled_value; + } + FlValue* value3 = fl_value_get_list_value(values, 3); + int64_t* cache_size_bytes = nullptr; + int64_t cache_size_bytes_value; + if (fl_value_get_type(value3) != FL_VALUE_TYPE_NULL) { + cache_size_bytes_value = fl_value_get_int(value3); + cache_size_bytes = &cache_size_bytes_value; + } + FlValue* value4 = fl_value_get_list_value(values, 4); + gboolean ignore_undefined_properties = fl_value_get_bool(value4); + return cloud_firestore_internal_firebase_settings_new( + persistence_enabled, host, ssl_enabled, cache_size_bytes, + ignore_undefined_properties); +} + +gboolean cloud_firestore_internal_firebase_settings_equals( + CloudFirestoreInternalFirebaseSettings* a, + CloudFirestoreInternalFirebaseSettings* b) { + if (a == b) { + return TRUE; + } + if (a == nullptr || b == nullptr) { + return FALSE; + } + if ((a->persistence_enabled == nullptr) != + (b->persistence_enabled == nullptr)) { + return FALSE; + } + if (a->persistence_enabled != nullptr && + *a->persistence_enabled != *b->persistence_enabled) { + return FALSE; + } + if (g_strcmp0(a->host, b->host) != 0) { + return FALSE; + } + if ((a->ssl_enabled == nullptr) != (b->ssl_enabled == nullptr)) { + return FALSE; + } + if (a->ssl_enabled != nullptr && *a->ssl_enabled != *b->ssl_enabled) { + return FALSE; + } + if ((a->cache_size_bytes == nullptr) != (b->cache_size_bytes == nullptr)) { + return FALSE; + } + if (a->cache_size_bytes != nullptr && + *a->cache_size_bytes != *b->cache_size_bytes) { + return FALSE; + } + if (a->ignore_undefined_properties != b->ignore_undefined_properties) { + return FALSE; + } + return TRUE; +} + +guint cloud_firestore_internal_firebase_settings_hash( + CloudFirestoreInternalFirebaseSettings* self) { + g_return_val_if_fail(CLOUD_FIRESTORE_IS_INTERNAL_FIREBASE_SETTINGS(self), 0); + guint result = 0; + result = result * 31 + (self->persistence_enabled != nullptr + ? static_cast(*self->persistence_enabled) + : 0); + result = result * 31 + (self->host != nullptr ? g_str_hash(self->host) : 0); + result = result * 31 + (self->ssl_enabled != nullptr + ? static_cast(*self->ssl_enabled) + : 0); + result = result * 31 + (self->cache_size_bytes != nullptr + ? static_cast(*self->cache_size_bytes) + : 0); + result = result * 31 + static_cast(self->ignore_undefined_properties); + return result; +} + +struct _CloudFirestoreFirestorePigeonFirebaseApp { + GObject parent_instance; + + gchar* app_name; + CloudFirestoreInternalFirebaseSettings* settings; + gchar* database_u_r_l; +}; + +G_DEFINE_TYPE(CloudFirestoreFirestorePigeonFirebaseApp, + cloud_firestore_firestore_pigeon_firebase_app, G_TYPE_OBJECT) + +static void cloud_firestore_firestore_pigeon_firebase_app_dispose( + GObject* object) { + CloudFirestoreFirestorePigeonFirebaseApp* self = + CLOUD_FIRESTORE_FIRESTORE_PIGEON_FIREBASE_APP(object); + g_clear_pointer(&self->app_name, g_free); + g_clear_object(&self->settings); + g_clear_pointer(&self->database_u_r_l, g_free); + G_OBJECT_CLASS(cloud_firestore_firestore_pigeon_firebase_app_parent_class) + ->dispose(object); +} + +static void cloud_firestore_firestore_pigeon_firebase_app_init( + CloudFirestoreFirestorePigeonFirebaseApp* self) {} + +static void cloud_firestore_firestore_pigeon_firebase_app_class_init( + CloudFirestoreFirestorePigeonFirebaseAppClass* klass) { + G_OBJECT_CLASS(klass)->dispose = + cloud_firestore_firestore_pigeon_firebase_app_dispose; +} + +CloudFirestoreFirestorePigeonFirebaseApp* +cloud_firestore_firestore_pigeon_firebase_app_new( + const gchar* app_name, CloudFirestoreInternalFirebaseSettings* settings, + const gchar* database_u_r_l) { + CloudFirestoreFirestorePigeonFirebaseApp* self = + CLOUD_FIRESTORE_FIRESTORE_PIGEON_FIREBASE_APP(g_object_new( + cloud_firestore_firestore_pigeon_firebase_app_get_type(), nullptr)); + self->app_name = g_strdup(app_name); + self->settings = + CLOUD_FIRESTORE_INTERNAL_FIREBASE_SETTINGS(g_object_ref(settings)); + self->database_u_r_l = g_strdup(database_u_r_l); + return self; +} + +const gchar* cloud_firestore_firestore_pigeon_firebase_app_get_app_name( + CloudFirestoreFirestorePigeonFirebaseApp* self) { + g_return_val_if_fail(CLOUD_FIRESTORE_IS_FIRESTORE_PIGEON_FIREBASE_APP(self), + nullptr); + return self->app_name; +} + +CloudFirestoreInternalFirebaseSettings* +cloud_firestore_firestore_pigeon_firebase_app_get_settings( + CloudFirestoreFirestorePigeonFirebaseApp* self) { + g_return_val_if_fail(CLOUD_FIRESTORE_IS_FIRESTORE_PIGEON_FIREBASE_APP(self), + nullptr); + return self->settings; +} + +const gchar* cloud_firestore_firestore_pigeon_firebase_app_get_database_u_r_l( + CloudFirestoreFirestorePigeonFirebaseApp* self) { + g_return_val_if_fail(CLOUD_FIRESTORE_IS_FIRESTORE_PIGEON_FIREBASE_APP(self), + nullptr); + return self->database_u_r_l; +} + +static FlValue* cloud_firestore_firestore_pigeon_firebase_app_to_list( + CloudFirestoreFirestorePigeonFirebaseApp* self) { + FlValue* values = fl_value_new_list(); + fl_value_append_take(values, fl_value_new_string(self->app_name)); + fl_value_append_take(values, + fl_value_new_custom_object( + cloud_firestore_internal_firebase_settings_type_id, + G_OBJECT(self->settings))); + fl_value_append_take(values, fl_value_new_string(self->database_u_r_l)); + return values; +} + +static CloudFirestoreFirestorePigeonFirebaseApp* +cloud_firestore_firestore_pigeon_firebase_app_new_from_list(FlValue* values) { + FlValue* value0 = fl_value_get_list_value(values, 0); + const gchar* app_name = fl_value_get_string(value0); + FlValue* value1 = fl_value_get_list_value(values, 1); + CloudFirestoreInternalFirebaseSettings* settings = + CLOUD_FIRESTORE_INTERNAL_FIREBASE_SETTINGS( + fl_value_get_custom_value_object(value1)); + FlValue* value2 = fl_value_get_list_value(values, 2); + const gchar* database_u_r_l = fl_value_get_string(value2); + return cloud_firestore_firestore_pigeon_firebase_app_new(app_name, settings, + database_u_r_l); +} + +gboolean cloud_firestore_firestore_pigeon_firebase_app_equals( + CloudFirestoreFirestorePigeonFirebaseApp* a, + CloudFirestoreFirestorePigeonFirebaseApp* b) { + if (a == b) { + return TRUE; + } + if (a == nullptr || b == nullptr) { + return FALSE; + } + if (g_strcmp0(a->app_name, b->app_name) != 0) { + return FALSE; + } + if (!cloud_firestore_internal_firebase_settings_equals(a->settings, + b->settings)) { + return FALSE; + } + if (g_strcmp0(a->database_u_r_l, b->database_u_r_l) != 0) { + return FALSE; + } + return TRUE; +} + +guint cloud_firestore_firestore_pigeon_firebase_app_hash( + CloudFirestoreFirestorePigeonFirebaseApp* self) { + g_return_val_if_fail(CLOUD_FIRESTORE_IS_FIRESTORE_PIGEON_FIREBASE_APP(self), + 0); + guint result = 0; + result = result * 31 + + (self->app_name != nullptr ? g_str_hash(self->app_name) : 0); + result = result * 31 + + cloud_firestore_internal_firebase_settings_hash(self->settings); + result = + result * 31 + + (self->database_u_r_l != nullptr ? g_str_hash(self->database_u_r_l) : 0); + return result; +} + +struct _CloudFirestoreInternalSnapshotMetadata { + GObject parent_instance; + + gboolean has_pending_writes; + gboolean is_from_cache; +}; + +G_DEFINE_TYPE(CloudFirestoreInternalSnapshotMetadata, + cloud_firestore_internal_snapshot_metadata, G_TYPE_OBJECT) + +static void cloud_firestore_internal_snapshot_metadata_dispose( + GObject* object) { + G_OBJECT_CLASS(cloud_firestore_internal_snapshot_metadata_parent_class) + ->dispose(object); +} + +static void cloud_firestore_internal_snapshot_metadata_init( + CloudFirestoreInternalSnapshotMetadata* self) {} + +static void cloud_firestore_internal_snapshot_metadata_class_init( + CloudFirestoreInternalSnapshotMetadataClass* klass) { + G_OBJECT_CLASS(klass)->dispose = + cloud_firestore_internal_snapshot_metadata_dispose; +} + +CloudFirestoreInternalSnapshotMetadata* +cloud_firestore_internal_snapshot_metadata_new(gboolean has_pending_writes, + gboolean is_from_cache) { + CloudFirestoreInternalSnapshotMetadata* self = + CLOUD_FIRESTORE_INTERNAL_SNAPSHOT_METADATA(g_object_new( + cloud_firestore_internal_snapshot_metadata_get_type(), nullptr)); + self->has_pending_writes = has_pending_writes; + self->is_from_cache = is_from_cache; + return self; +} + +gboolean cloud_firestore_internal_snapshot_metadata_get_has_pending_writes( + CloudFirestoreInternalSnapshotMetadata* self) { + g_return_val_if_fail(CLOUD_FIRESTORE_IS_INTERNAL_SNAPSHOT_METADATA(self), + FALSE); + return self->has_pending_writes; +} + +gboolean cloud_firestore_internal_snapshot_metadata_get_is_from_cache( + CloudFirestoreInternalSnapshotMetadata* self) { + g_return_val_if_fail(CLOUD_FIRESTORE_IS_INTERNAL_SNAPSHOT_METADATA(self), + FALSE); + return self->is_from_cache; +} + +static FlValue* cloud_firestore_internal_snapshot_metadata_to_list( + CloudFirestoreInternalSnapshotMetadata* self) { + FlValue* values = fl_value_new_list(); + fl_value_append_take(values, fl_value_new_bool(self->has_pending_writes)); + fl_value_append_take(values, fl_value_new_bool(self->is_from_cache)); + return values; +} + +static CloudFirestoreInternalSnapshotMetadata* +cloud_firestore_internal_snapshot_metadata_new_from_list(FlValue* values) { + FlValue* value0 = fl_value_get_list_value(values, 0); + gboolean has_pending_writes = fl_value_get_bool(value0); + FlValue* value1 = fl_value_get_list_value(values, 1); + gboolean is_from_cache = fl_value_get_bool(value1); + return cloud_firestore_internal_snapshot_metadata_new(has_pending_writes, + is_from_cache); +} + +gboolean cloud_firestore_internal_snapshot_metadata_equals( + CloudFirestoreInternalSnapshotMetadata* a, + CloudFirestoreInternalSnapshotMetadata* b) { + if (a == b) { + return TRUE; + } + if (a == nullptr || b == nullptr) { + return FALSE; + } + if (a->has_pending_writes != b->has_pending_writes) { + return FALSE; + } + if (a->is_from_cache != b->is_from_cache) { + return FALSE; + } + return TRUE; +} + +guint cloud_firestore_internal_snapshot_metadata_hash( + CloudFirestoreInternalSnapshotMetadata* self) { + g_return_val_if_fail(CLOUD_FIRESTORE_IS_INTERNAL_SNAPSHOT_METADATA(self), 0); + guint result = 0; + result = result * 31 + static_cast(self->has_pending_writes); + result = result * 31 + static_cast(self->is_from_cache); + return result; +} + +struct _CloudFirestoreInternalDocumentSnapshot { + GObject parent_instance; + + gchar* path; + FlValue* data; + CloudFirestoreInternalSnapshotMetadata* metadata; +}; + +G_DEFINE_TYPE(CloudFirestoreInternalDocumentSnapshot, + cloud_firestore_internal_document_snapshot, G_TYPE_OBJECT) + +static void cloud_firestore_internal_document_snapshot_dispose( + GObject* object) { + CloudFirestoreInternalDocumentSnapshot* self = + CLOUD_FIRESTORE_INTERNAL_DOCUMENT_SNAPSHOT(object); + g_clear_pointer(&self->path, g_free); + g_clear_pointer(&self->data, fl_value_unref); + g_clear_object(&self->metadata); + G_OBJECT_CLASS(cloud_firestore_internal_document_snapshot_parent_class) + ->dispose(object); +} + +static void cloud_firestore_internal_document_snapshot_init( + CloudFirestoreInternalDocumentSnapshot* self) {} + +static void cloud_firestore_internal_document_snapshot_class_init( + CloudFirestoreInternalDocumentSnapshotClass* klass) { + G_OBJECT_CLASS(klass)->dispose = + cloud_firestore_internal_document_snapshot_dispose; +} + +CloudFirestoreInternalDocumentSnapshot* +cloud_firestore_internal_document_snapshot_new( + const gchar* path, FlValue* data, + CloudFirestoreInternalSnapshotMetadata* metadata) { + CloudFirestoreInternalDocumentSnapshot* self = + CLOUD_FIRESTORE_INTERNAL_DOCUMENT_SNAPSHOT(g_object_new( + cloud_firestore_internal_document_snapshot_get_type(), nullptr)); + self->path = g_strdup(path); + if (data != nullptr) { + self->data = fl_value_ref(data); + } else { + self->data = nullptr; + } + self->metadata = + CLOUD_FIRESTORE_INTERNAL_SNAPSHOT_METADATA(g_object_ref(metadata)); + return self; +} + +const gchar* cloud_firestore_internal_document_snapshot_get_path( + CloudFirestoreInternalDocumentSnapshot* self) { + g_return_val_if_fail(CLOUD_FIRESTORE_IS_INTERNAL_DOCUMENT_SNAPSHOT(self), + nullptr); + return self->path; +} + +FlValue* cloud_firestore_internal_document_snapshot_get_data( + CloudFirestoreInternalDocumentSnapshot* self) { + g_return_val_if_fail(CLOUD_FIRESTORE_IS_INTERNAL_DOCUMENT_SNAPSHOT(self), + nullptr); + return self->data; +} + +CloudFirestoreInternalSnapshotMetadata* +cloud_firestore_internal_document_snapshot_get_metadata( + CloudFirestoreInternalDocumentSnapshot* self) { + g_return_val_if_fail(CLOUD_FIRESTORE_IS_INTERNAL_DOCUMENT_SNAPSHOT(self), + nullptr); + return self->metadata; +} + +static FlValue* cloud_firestore_internal_document_snapshot_to_list( + CloudFirestoreInternalDocumentSnapshot* self) { + FlValue* values = fl_value_new_list(); + fl_value_append_take(values, fl_value_new_string(self->path)); + fl_value_append_take(values, self->data != nullptr ? fl_value_ref(self->data) + : fl_value_new_null()); + fl_value_append_take(values, + fl_value_new_custom_object( + cloud_firestore_internal_snapshot_metadata_type_id, + G_OBJECT(self->metadata))); + return values; +} + +static CloudFirestoreInternalDocumentSnapshot* +cloud_firestore_internal_document_snapshot_new_from_list(FlValue* values) { + FlValue* value0 = fl_value_get_list_value(values, 0); + const gchar* path = fl_value_get_string(value0); + FlValue* value1 = fl_value_get_list_value(values, 1); + FlValue* data = nullptr; + if (fl_value_get_type(value1) != FL_VALUE_TYPE_NULL) { + data = value1; + } + FlValue* value2 = fl_value_get_list_value(values, 2); + CloudFirestoreInternalSnapshotMetadata* metadata = + CLOUD_FIRESTORE_INTERNAL_SNAPSHOT_METADATA( + fl_value_get_custom_value_object(value2)); + return cloud_firestore_internal_document_snapshot_new(path, data, metadata); +} + +gboolean cloud_firestore_internal_document_snapshot_equals( + CloudFirestoreInternalDocumentSnapshot* a, + CloudFirestoreInternalDocumentSnapshot* b) { + if (a == b) { + return TRUE; + } + if (a == nullptr || b == nullptr) { + return FALSE; + } + if (g_strcmp0(a->path, b->path) != 0) { + return FALSE; + } + if (!flpigeon_deep_equals(a->data, b->data)) { + return FALSE; + } + if (!cloud_firestore_internal_snapshot_metadata_equals(a->metadata, + b->metadata)) { + return FALSE; + } + return TRUE; +} + +guint cloud_firestore_internal_document_snapshot_hash( + CloudFirestoreInternalDocumentSnapshot* self) { + g_return_val_if_fail(CLOUD_FIRESTORE_IS_INTERNAL_DOCUMENT_SNAPSHOT(self), 0); + guint result = 0; + result = result * 31 + (self->path != nullptr ? g_str_hash(self->path) : 0); + result = result * 31 + flpigeon_deep_hash(self->data); + result = result * 31 + + cloud_firestore_internal_snapshot_metadata_hash(self->metadata); + return result; +} + +struct _CloudFirestoreInternalDocumentChange { + GObject parent_instance; + + CloudFirestoreDocumentChangeType type_; + CloudFirestoreInternalDocumentSnapshot* document; + int64_t old_index; + int64_t new_index; +}; + +G_DEFINE_TYPE(CloudFirestoreInternalDocumentChange, + cloud_firestore_internal_document_change, G_TYPE_OBJECT) + +static void cloud_firestore_internal_document_change_dispose(GObject* object) { + CloudFirestoreInternalDocumentChange* self = + CLOUD_FIRESTORE_INTERNAL_DOCUMENT_CHANGE(object); + g_clear_object(&self->document); + G_OBJECT_CLASS(cloud_firestore_internal_document_change_parent_class) + ->dispose(object); +} + +static void cloud_firestore_internal_document_change_init( + CloudFirestoreInternalDocumentChange* self) {} + +static void cloud_firestore_internal_document_change_class_init( + CloudFirestoreInternalDocumentChangeClass* klass) { + G_OBJECT_CLASS(klass)->dispose = + cloud_firestore_internal_document_change_dispose; +} + +CloudFirestoreInternalDocumentChange* +cloud_firestore_internal_document_change_new( + CloudFirestoreDocumentChangeType type_, + CloudFirestoreInternalDocumentSnapshot* document, int64_t old_index, + int64_t new_index) { + CloudFirestoreInternalDocumentChange* self = + CLOUD_FIRESTORE_INTERNAL_DOCUMENT_CHANGE(g_object_new( + cloud_firestore_internal_document_change_get_type(), nullptr)); + self->type_ = type_; + self->document = + CLOUD_FIRESTORE_INTERNAL_DOCUMENT_SNAPSHOT(g_object_ref(document)); + self->old_index = old_index; + self->new_index = new_index; + return self; +} + +CloudFirestoreDocumentChangeType +cloud_firestore_internal_document_change_get_type_( + CloudFirestoreInternalDocumentChange* self) { + g_return_val_if_fail(CLOUD_FIRESTORE_IS_INTERNAL_DOCUMENT_CHANGE(self), + static_cast(0)); + return self->type_; +} + +CloudFirestoreInternalDocumentSnapshot* +cloud_firestore_internal_document_change_get_document( + CloudFirestoreInternalDocumentChange* self) { + g_return_val_if_fail(CLOUD_FIRESTORE_IS_INTERNAL_DOCUMENT_CHANGE(self), + nullptr); + return self->document; +} + +int64_t cloud_firestore_internal_document_change_get_old_index( + CloudFirestoreInternalDocumentChange* self) { + g_return_val_if_fail(CLOUD_FIRESTORE_IS_INTERNAL_DOCUMENT_CHANGE(self), 0); + return self->old_index; +} + +int64_t cloud_firestore_internal_document_change_get_new_index( + CloudFirestoreInternalDocumentChange* self) { + g_return_val_if_fail(CLOUD_FIRESTORE_IS_INTERNAL_DOCUMENT_CHANGE(self), 0); + return self->new_index; +} + +static FlValue* cloud_firestore_internal_document_change_to_list( + CloudFirestoreInternalDocumentChange* self) { + FlValue* values = fl_value_new_list(); + fl_value_append_take( + values, fl_value_new_custom(cloud_firestore_document_change_type_type_id, + fl_value_new_int(self->type_), + (GDestroyNotify)fl_value_unref)); + fl_value_append_take(values, + fl_value_new_custom_object( + cloud_firestore_internal_document_snapshot_type_id, + G_OBJECT(self->document))); + fl_value_append_take(values, fl_value_new_int(self->old_index)); + fl_value_append_take(values, fl_value_new_int(self->new_index)); + return values; +} + +static CloudFirestoreInternalDocumentChange* +cloud_firestore_internal_document_change_new_from_list(FlValue* values) { + FlValue* value0 = fl_value_get_list_value(values, 0); + CloudFirestoreDocumentChangeType type_ = + static_cast( + fl_value_get_int(reinterpret_cast( + const_cast(fl_value_get_custom_value(value0))))); + FlValue* value1 = fl_value_get_list_value(values, 1); + CloudFirestoreInternalDocumentSnapshot* document = + CLOUD_FIRESTORE_INTERNAL_DOCUMENT_SNAPSHOT( + fl_value_get_custom_value_object(value1)); + FlValue* value2 = fl_value_get_list_value(values, 2); + int64_t old_index = fl_value_get_int(value2); + FlValue* value3 = fl_value_get_list_value(values, 3); + int64_t new_index = fl_value_get_int(value3); + return cloud_firestore_internal_document_change_new(type_, document, + old_index, new_index); +} + +gboolean cloud_firestore_internal_document_change_equals( + CloudFirestoreInternalDocumentChange* a, + CloudFirestoreInternalDocumentChange* b) { + if (a == b) { + return TRUE; + } + if (a == nullptr || b == nullptr) { + return FALSE; + } + if (a->type_ != b->type_) { + return FALSE; + } + if (!cloud_firestore_internal_document_snapshot_equals(a->document, + b->document)) { + return FALSE; + } + if (a->old_index != b->old_index) { + return FALSE; + } + if (a->new_index != b->new_index) { + return FALSE; + } + return TRUE; +} + +guint cloud_firestore_internal_document_change_hash( + CloudFirestoreInternalDocumentChange* self) { + g_return_val_if_fail(CLOUD_FIRESTORE_IS_INTERNAL_DOCUMENT_CHANGE(self), 0); + guint result = 0; + result = result * 31 + static_cast(self->type_); + result = result * 31 + + cloud_firestore_internal_document_snapshot_hash(self->document); + result = result * 31 + static_cast(self->old_index); + result = result * 31 + static_cast(self->new_index); + return result; +} + +struct _CloudFirestoreInternalQuerySnapshot { + GObject parent_instance; + + FlValue* documents; + FlValue* document_changes; + CloudFirestoreInternalSnapshotMetadata* metadata; +}; + +G_DEFINE_TYPE(CloudFirestoreInternalQuerySnapshot, + cloud_firestore_internal_query_snapshot, G_TYPE_OBJECT) + +static void cloud_firestore_internal_query_snapshot_dispose(GObject* object) { + CloudFirestoreInternalQuerySnapshot* self = + CLOUD_FIRESTORE_INTERNAL_QUERY_SNAPSHOT(object); + g_clear_pointer(&self->documents, fl_value_unref); + g_clear_pointer(&self->document_changes, fl_value_unref); + g_clear_object(&self->metadata); + G_OBJECT_CLASS(cloud_firestore_internal_query_snapshot_parent_class) + ->dispose(object); +} + +static void cloud_firestore_internal_query_snapshot_init( + CloudFirestoreInternalQuerySnapshot* self) {} + +static void cloud_firestore_internal_query_snapshot_class_init( + CloudFirestoreInternalQuerySnapshotClass* klass) { + G_OBJECT_CLASS(klass)->dispose = + cloud_firestore_internal_query_snapshot_dispose; +} + +CloudFirestoreInternalQuerySnapshot* +cloud_firestore_internal_query_snapshot_new( + FlValue* documents, FlValue* document_changes, + CloudFirestoreInternalSnapshotMetadata* metadata) { + CloudFirestoreInternalQuerySnapshot* self = + CLOUD_FIRESTORE_INTERNAL_QUERY_SNAPSHOT(g_object_new( + cloud_firestore_internal_query_snapshot_get_type(), nullptr)); + self->documents = fl_value_ref(documents); + self->document_changes = fl_value_ref(document_changes); + self->metadata = + CLOUD_FIRESTORE_INTERNAL_SNAPSHOT_METADATA(g_object_ref(metadata)); + return self; +} + +FlValue* cloud_firestore_internal_query_snapshot_get_documents( + CloudFirestoreInternalQuerySnapshot* self) { + g_return_val_if_fail(CLOUD_FIRESTORE_IS_INTERNAL_QUERY_SNAPSHOT(self), + nullptr); + return self->documents; +} + +FlValue* cloud_firestore_internal_query_snapshot_get_document_changes( + CloudFirestoreInternalQuerySnapshot* self) { + g_return_val_if_fail(CLOUD_FIRESTORE_IS_INTERNAL_QUERY_SNAPSHOT(self), + nullptr); + return self->document_changes; +} + +CloudFirestoreInternalSnapshotMetadata* +cloud_firestore_internal_query_snapshot_get_metadata( + CloudFirestoreInternalQuerySnapshot* self) { + g_return_val_if_fail(CLOUD_FIRESTORE_IS_INTERNAL_QUERY_SNAPSHOT(self), + nullptr); + return self->metadata; +} + +static FlValue* cloud_firestore_internal_query_snapshot_to_list( + CloudFirestoreInternalQuerySnapshot* self) { + FlValue* values = fl_value_new_list(); + fl_value_append_take(values, fl_value_ref(self->documents)); + fl_value_append_take(values, fl_value_ref(self->document_changes)); + fl_value_append_take(values, + fl_value_new_custom_object( + cloud_firestore_internal_snapshot_metadata_type_id, + G_OBJECT(self->metadata))); + return values; +} + +static CloudFirestoreInternalQuerySnapshot* +cloud_firestore_internal_query_snapshot_new_from_list(FlValue* values) { + FlValue* value0 = fl_value_get_list_value(values, 0); + FlValue* documents = value0; + FlValue* value1 = fl_value_get_list_value(values, 1); + FlValue* document_changes = value1; + FlValue* value2 = fl_value_get_list_value(values, 2); + CloudFirestoreInternalSnapshotMetadata* metadata = + CLOUD_FIRESTORE_INTERNAL_SNAPSHOT_METADATA( + fl_value_get_custom_value_object(value2)); + return cloud_firestore_internal_query_snapshot_new( + documents, document_changes, metadata); +} + +gboolean cloud_firestore_internal_query_snapshot_equals( + CloudFirestoreInternalQuerySnapshot* a, + CloudFirestoreInternalQuerySnapshot* b) { + if (a == b) { + return TRUE; + } + if (a == nullptr || b == nullptr) { + return FALSE; + } + if (!flpigeon_deep_equals(a->documents, b->documents)) { + return FALSE; + } + if (!flpigeon_deep_equals(a->document_changes, b->document_changes)) { + return FALSE; + } + if (!cloud_firestore_internal_snapshot_metadata_equals(a->metadata, + b->metadata)) { + return FALSE; + } + return TRUE; +} + +guint cloud_firestore_internal_query_snapshot_hash( + CloudFirestoreInternalQuerySnapshot* self) { + g_return_val_if_fail(CLOUD_FIRESTORE_IS_INTERNAL_QUERY_SNAPSHOT(self), 0); + guint result = 0; + result = result * 31 + flpigeon_deep_hash(self->documents); + result = result * 31 + flpigeon_deep_hash(self->document_changes); + result = result * 31 + + cloud_firestore_internal_snapshot_metadata_hash(self->metadata); + return result; +} + +struct _CloudFirestoreInternalPipelineResult { + GObject parent_instance; + + gchar* document_path; + int64_t* create_time; + int64_t* update_time; + FlValue* data; +}; + +G_DEFINE_TYPE(CloudFirestoreInternalPipelineResult, + cloud_firestore_internal_pipeline_result, G_TYPE_OBJECT) + +static void cloud_firestore_internal_pipeline_result_dispose(GObject* object) { + CloudFirestoreInternalPipelineResult* self = + CLOUD_FIRESTORE_INTERNAL_PIPELINE_RESULT(object); + g_clear_pointer(&self->document_path, g_free); + g_clear_pointer(&self->create_time, g_free); + g_clear_pointer(&self->update_time, g_free); + g_clear_pointer(&self->data, fl_value_unref); + G_OBJECT_CLASS(cloud_firestore_internal_pipeline_result_parent_class) + ->dispose(object); +} + +static void cloud_firestore_internal_pipeline_result_init( + CloudFirestoreInternalPipelineResult* self) {} + +static void cloud_firestore_internal_pipeline_result_class_init( + CloudFirestoreInternalPipelineResultClass* klass) { + G_OBJECT_CLASS(klass)->dispose = + cloud_firestore_internal_pipeline_result_dispose; +} + +CloudFirestoreInternalPipelineResult* +cloud_firestore_internal_pipeline_result_new(const gchar* document_path, + int64_t* create_time, + int64_t* update_time, + FlValue* data) { + CloudFirestoreInternalPipelineResult* self = + CLOUD_FIRESTORE_INTERNAL_PIPELINE_RESULT(g_object_new( + cloud_firestore_internal_pipeline_result_get_type(), nullptr)); + if (document_path != nullptr) { + self->document_path = g_strdup(document_path); + } else { + self->document_path = nullptr; + } + if (create_time != nullptr) { + self->create_time = static_cast(malloc(sizeof(int64_t))); + *self->create_time = *create_time; + } else { + self->create_time = nullptr; + } + if (update_time != nullptr) { + self->update_time = static_cast(malloc(sizeof(int64_t))); + *self->update_time = *update_time; + } else { + self->update_time = nullptr; + } + if (data != nullptr) { + self->data = fl_value_ref(data); + } else { + self->data = nullptr; + } + return self; +} + +const gchar* cloud_firestore_internal_pipeline_result_get_document_path( + CloudFirestoreInternalPipelineResult* self) { + g_return_val_if_fail(CLOUD_FIRESTORE_IS_INTERNAL_PIPELINE_RESULT(self), + nullptr); + return self->document_path; +} + +int64_t* cloud_firestore_internal_pipeline_result_get_create_time( + CloudFirestoreInternalPipelineResult* self) { + g_return_val_if_fail(CLOUD_FIRESTORE_IS_INTERNAL_PIPELINE_RESULT(self), + nullptr); + return self->create_time; +} + +int64_t* cloud_firestore_internal_pipeline_result_get_update_time( + CloudFirestoreInternalPipelineResult* self) { + g_return_val_if_fail(CLOUD_FIRESTORE_IS_INTERNAL_PIPELINE_RESULT(self), + nullptr); + return self->update_time; +} + +FlValue* cloud_firestore_internal_pipeline_result_get_data( + CloudFirestoreInternalPipelineResult* self) { + g_return_val_if_fail(CLOUD_FIRESTORE_IS_INTERNAL_PIPELINE_RESULT(self), + nullptr); + return self->data; +} + +static FlValue* cloud_firestore_internal_pipeline_result_to_list( + CloudFirestoreInternalPipelineResult* self) { + FlValue* values = fl_value_new_list(); + fl_value_append_take(values, self->document_path != nullptr + ? fl_value_new_string(self->document_path) + : fl_value_new_null()); + fl_value_append_take(values, self->create_time != nullptr + ? fl_value_new_int(*self->create_time) + : fl_value_new_null()); + fl_value_append_take(values, self->update_time != nullptr + ? fl_value_new_int(*self->update_time) + : fl_value_new_null()); + fl_value_append_take(values, self->data != nullptr ? fl_value_ref(self->data) + : fl_value_new_null()); + return values; +} + +static CloudFirestoreInternalPipelineResult* +cloud_firestore_internal_pipeline_result_new_from_list(FlValue* values) { + FlValue* value0 = fl_value_get_list_value(values, 0); + const gchar* document_path = nullptr; + if (fl_value_get_type(value0) != FL_VALUE_TYPE_NULL) { + document_path = fl_value_get_string(value0); + } + FlValue* value1 = fl_value_get_list_value(values, 1); + int64_t* create_time = nullptr; + int64_t create_time_value; + if (fl_value_get_type(value1) != FL_VALUE_TYPE_NULL) { + create_time_value = fl_value_get_int(value1); + create_time = &create_time_value; + } + FlValue* value2 = fl_value_get_list_value(values, 2); + int64_t* update_time = nullptr; + int64_t update_time_value; + if (fl_value_get_type(value2) != FL_VALUE_TYPE_NULL) { + update_time_value = fl_value_get_int(value2); + update_time = &update_time_value; + } + FlValue* value3 = fl_value_get_list_value(values, 3); + FlValue* data = nullptr; + if (fl_value_get_type(value3) != FL_VALUE_TYPE_NULL) { + data = value3; + } + return cloud_firestore_internal_pipeline_result_new( + document_path, create_time, update_time, data); +} + +gboolean cloud_firestore_internal_pipeline_result_equals( + CloudFirestoreInternalPipelineResult* a, + CloudFirestoreInternalPipelineResult* b) { + if (a == b) { + return TRUE; + } + if (a == nullptr || b == nullptr) { + return FALSE; + } + if (g_strcmp0(a->document_path, b->document_path) != 0) { + return FALSE; + } + if ((a->create_time == nullptr) != (b->create_time == nullptr)) { + return FALSE; + } + if (a->create_time != nullptr && *a->create_time != *b->create_time) { + return FALSE; + } + if ((a->update_time == nullptr) != (b->update_time == nullptr)) { + return FALSE; + } + if (a->update_time != nullptr && *a->update_time != *b->update_time) { + return FALSE; + } + if (!flpigeon_deep_equals(a->data, b->data)) { + return FALSE; + } + return TRUE; +} + +guint cloud_firestore_internal_pipeline_result_hash( + CloudFirestoreInternalPipelineResult* self) { + g_return_val_if_fail(CLOUD_FIRESTORE_IS_INTERNAL_PIPELINE_RESULT(self), 0); + guint result = 0; + result = + result * 31 + + (self->document_path != nullptr ? g_str_hash(self->document_path) : 0); + result = result * 31 + (self->create_time != nullptr + ? static_cast(*self->create_time) + : 0); + result = result * 31 + (self->update_time != nullptr + ? static_cast(*self->update_time) + : 0); + result = result * 31 + flpigeon_deep_hash(self->data); + return result; +} + +struct _CloudFirestoreInternalPipelineSnapshot { + GObject parent_instance; + + FlValue* results; + int64_t execution_time; +}; + +G_DEFINE_TYPE(CloudFirestoreInternalPipelineSnapshot, + cloud_firestore_internal_pipeline_snapshot, G_TYPE_OBJECT) + +static void cloud_firestore_internal_pipeline_snapshot_dispose( + GObject* object) { + CloudFirestoreInternalPipelineSnapshot* self = + CLOUD_FIRESTORE_INTERNAL_PIPELINE_SNAPSHOT(object); + g_clear_pointer(&self->results, fl_value_unref); + G_OBJECT_CLASS(cloud_firestore_internal_pipeline_snapshot_parent_class) + ->dispose(object); +} + +static void cloud_firestore_internal_pipeline_snapshot_init( + CloudFirestoreInternalPipelineSnapshot* self) {} + +static void cloud_firestore_internal_pipeline_snapshot_class_init( + CloudFirestoreInternalPipelineSnapshotClass* klass) { + G_OBJECT_CLASS(klass)->dispose = + cloud_firestore_internal_pipeline_snapshot_dispose; +} + +CloudFirestoreInternalPipelineSnapshot* +cloud_firestore_internal_pipeline_snapshot_new(FlValue* results, + int64_t execution_time) { + CloudFirestoreInternalPipelineSnapshot* self = + CLOUD_FIRESTORE_INTERNAL_PIPELINE_SNAPSHOT(g_object_new( + cloud_firestore_internal_pipeline_snapshot_get_type(), nullptr)); + self->results = fl_value_ref(results); + self->execution_time = execution_time; + return self; +} + +FlValue* cloud_firestore_internal_pipeline_snapshot_get_results( + CloudFirestoreInternalPipelineSnapshot* self) { + g_return_val_if_fail(CLOUD_FIRESTORE_IS_INTERNAL_PIPELINE_SNAPSHOT(self), + nullptr); + return self->results; +} + +int64_t cloud_firestore_internal_pipeline_snapshot_get_execution_time( + CloudFirestoreInternalPipelineSnapshot* self) { + g_return_val_if_fail(CLOUD_FIRESTORE_IS_INTERNAL_PIPELINE_SNAPSHOT(self), 0); + return self->execution_time; +} + +static FlValue* cloud_firestore_internal_pipeline_snapshot_to_list( + CloudFirestoreInternalPipelineSnapshot* self) { + FlValue* values = fl_value_new_list(); + fl_value_append_take(values, fl_value_ref(self->results)); + fl_value_append_take(values, fl_value_new_int(self->execution_time)); + return values; +} + +static CloudFirestoreInternalPipelineSnapshot* +cloud_firestore_internal_pipeline_snapshot_new_from_list(FlValue* values) { + FlValue* value0 = fl_value_get_list_value(values, 0); + FlValue* results = value0; + FlValue* value1 = fl_value_get_list_value(values, 1); + int64_t execution_time = fl_value_get_int(value1); + return cloud_firestore_internal_pipeline_snapshot_new(results, + execution_time); +} + +gboolean cloud_firestore_internal_pipeline_snapshot_equals( + CloudFirestoreInternalPipelineSnapshot* a, + CloudFirestoreInternalPipelineSnapshot* b) { + if (a == b) { + return TRUE; + } + if (a == nullptr || b == nullptr) { + return FALSE; + } + if (!flpigeon_deep_equals(a->results, b->results)) { + return FALSE; + } + if (a->execution_time != b->execution_time) { + return FALSE; + } + return TRUE; +} + +guint cloud_firestore_internal_pipeline_snapshot_hash( + CloudFirestoreInternalPipelineSnapshot* self) { + g_return_val_if_fail(CLOUD_FIRESTORE_IS_INTERNAL_PIPELINE_SNAPSHOT(self), 0); + guint result = 0; + result = result * 31 + flpigeon_deep_hash(self->results); + result = result * 31 + static_cast(self->execution_time); + return result; +} + +struct _CloudFirestoreInternalGetOptions { + GObject parent_instance; + + CloudFirestoreSource source; + CloudFirestoreServerTimestampBehavior server_timestamp_behavior; +}; + +G_DEFINE_TYPE(CloudFirestoreInternalGetOptions, + cloud_firestore_internal_get_options, G_TYPE_OBJECT) + +static void cloud_firestore_internal_get_options_dispose(GObject* object) { + G_OBJECT_CLASS(cloud_firestore_internal_get_options_parent_class) + ->dispose(object); +} + +static void cloud_firestore_internal_get_options_init( + CloudFirestoreInternalGetOptions* self) {} + +static void cloud_firestore_internal_get_options_class_init( + CloudFirestoreInternalGetOptionsClass* klass) { + G_OBJECT_CLASS(klass)->dispose = cloud_firestore_internal_get_options_dispose; +} + +CloudFirestoreInternalGetOptions* cloud_firestore_internal_get_options_new( + CloudFirestoreSource source, + CloudFirestoreServerTimestampBehavior server_timestamp_behavior) { + CloudFirestoreInternalGetOptions* self = CLOUD_FIRESTORE_INTERNAL_GET_OPTIONS( + g_object_new(cloud_firestore_internal_get_options_get_type(), nullptr)); + self->source = source; + self->server_timestamp_behavior = server_timestamp_behavior; + return self; +} + +CloudFirestoreSource cloud_firestore_internal_get_options_get_source( + CloudFirestoreInternalGetOptions* self) { + g_return_val_if_fail(CLOUD_FIRESTORE_IS_INTERNAL_GET_OPTIONS(self), + static_cast(0)); + return self->source; +} + +CloudFirestoreServerTimestampBehavior +cloud_firestore_internal_get_options_get_server_timestamp_behavior( + CloudFirestoreInternalGetOptions* self) { + g_return_val_if_fail(CLOUD_FIRESTORE_IS_INTERNAL_GET_OPTIONS(self), + static_cast(0)); + return self->server_timestamp_behavior; +} + +static FlValue* cloud_firestore_internal_get_options_to_list( + CloudFirestoreInternalGetOptions* self) { + FlValue* values = fl_value_new_list(); + fl_value_append_take(values, + fl_value_new_custom(cloud_firestore_source_type_id, + fl_value_new_int(self->source), + (GDestroyNotify)fl_value_unref)); + fl_value_append_take( + values, + fl_value_new_custom(cloud_firestore_server_timestamp_behavior_type_id, + fl_value_new_int(self->server_timestamp_behavior), + (GDestroyNotify)fl_value_unref)); + return values; +} + +static CloudFirestoreInternalGetOptions* +cloud_firestore_internal_get_options_new_from_list(FlValue* values) { + FlValue* value0 = fl_value_get_list_value(values, 0); + CloudFirestoreSource source = static_cast( + fl_value_get_int(reinterpret_cast( + const_cast(fl_value_get_custom_value(value0))))); + FlValue* value1 = fl_value_get_list_value(values, 1); + CloudFirestoreServerTimestampBehavior server_timestamp_behavior = + static_cast( + fl_value_get_int(reinterpret_cast( + const_cast(fl_value_get_custom_value(value1))))); + return cloud_firestore_internal_get_options_new(source, + server_timestamp_behavior); +} + +gboolean cloud_firestore_internal_get_options_equals( + CloudFirestoreInternalGetOptions* a, CloudFirestoreInternalGetOptions* b) { + if (a == b) { + return TRUE; + } + if (a == nullptr || b == nullptr) { + return FALSE; + } + if (a->source != b->source) { + return FALSE; + } + if (a->server_timestamp_behavior != b->server_timestamp_behavior) { + return FALSE; + } + return TRUE; +} + +guint cloud_firestore_internal_get_options_hash( + CloudFirestoreInternalGetOptions* self) { + g_return_val_if_fail(CLOUD_FIRESTORE_IS_INTERNAL_GET_OPTIONS(self), 0); + guint result = 0; + result = result * 31 + static_cast(self->source); + result = result * 31 + static_cast(self->server_timestamp_behavior); + return result; +} + +struct _CloudFirestoreInternalDocumentOption { + GObject parent_instance; + + gboolean* merge; + FlValue* merge_fields; +}; + +G_DEFINE_TYPE(CloudFirestoreInternalDocumentOption, + cloud_firestore_internal_document_option, G_TYPE_OBJECT) + +static void cloud_firestore_internal_document_option_dispose(GObject* object) { + CloudFirestoreInternalDocumentOption* self = + CLOUD_FIRESTORE_INTERNAL_DOCUMENT_OPTION(object); + g_clear_pointer(&self->merge, g_free); + g_clear_pointer(&self->merge_fields, fl_value_unref); + G_OBJECT_CLASS(cloud_firestore_internal_document_option_parent_class) + ->dispose(object); +} + +static void cloud_firestore_internal_document_option_init( + CloudFirestoreInternalDocumentOption* self) {} + +static void cloud_firestore_internal_document_option_class_init( + CloudFirestoreInternalDocumentOptionClass* klass) { + G_OBJECT_CLASS(klass)->dispose = + cloud_firestore_internal_document_option_dispose; +} + +CloudFirestoreInternalDocumentOption* +cloud_firestore_internal_document_option_new(gboolean* merge, + FlValue* merge_fields) { + CloudFirestoreInternalDocumentOption* self = + CLOUD_FIRESTORE_INTERNAL_DOCUMENT_OPTION(g_object_new( + cloud_firestore_internal_document_option_get_type(), nullptr)); + if (merge != nullptr) { + self->merge = static_cast(malloc(sizeof(gboolean))); + *self->merge = *merge; + } else { + self->merge = nullptr; + } + if (merge_fields != nullptr) { + self->merge_fields = fl_value_ref(merge_fields); + } else { + self->merge_fields = nullptr; + } + return self; +} + +gboolean* cloud_firestore_internal_document_option_get_merge( + CloudFirestoreInternalDocumentOption* self) { + g_return_val_if_fail(CLOUD_FIRESTORE_IS_INTERNAL_DOCUMENT_OPTION(self), + nullptr); + return self->merge; +} + +FlValue* cloud_firestore_internal_document_option_get_merge_fields( + CloudFirestoreInternalDocumentOption* self) { + g_return_val_if_fail(CLOUD_FIRESTORE_IS_INTERNAL_DOCUMENT_OPTION(self), + nullptr); + return self->merge_fields; +} + +static FlValue* cloud_firestore_internal_document_option_to_list( + CloudFirestoreInternalDocumentOption* self) { + FlValue* values = fl_value_new_list(); + fl_value_append_take(values, self->merge != nullptr + ? fl_value_new_bool(*self->merge) + : fl_value_new_null()); + fl_value_append_take(values, self->merge_fields != nullptr + ? fl_value_ref(self->merge_fields) + : fl_value_new_null()); + return values; +} + +static CloudFirestoreInternalDocumentOption* +cloud_firestore_internal_document_option_new_from_list(FlValue* values) { + FlValue* value0 = fl_value_get_list_value(values, 0); + gboolean* merge = nullptr; + gboolean merge_value; + if (fl_value_get_type(value0) != FL_VALUE_TYPE_NULL) { + merge_value = fl_value_get_bool(value0); + merge = &merge_value; + } + FlValue* value1 = fl_value_get_list_value(values, 1); + FlValue* merge_fields = nullptr; + if (fl_value_get_type(value1) != FL_VALUE_TYPE_NULL) { + merge_fields = value1; + } + return cloud_firestore_internal_document_option_new(merge, merge_fields); +} + +gboolean cloud_firestore_internal_document_option_equals( + CloudFirestoreInternalDocumentOption* a, + CloudFirestoreInternalDocumentOption* b) { + if (a == b) { + return TRUE; + } + if (a == nullptr || b == nullptr) { + return FALSE; + } + if ((a->merge == nullptr) != (b->merge == nullptr)) { + return FALSE; + } + if (a->merge != nullptr && *a->merge != *b->merge) { + return FALSE; + } + if (!flpigeon_deep_equals(a->merge_fields, b->merge_fields)) { + return FALSE; + } + return TRUE; +} + +guint cloud_firestore_internal_document_option_hash( + CloudFirestoreInternalDocumentOption* self) { + g_return_val_if_fail(CLOUD_FIRESTORE_IS_INTERNAL_DOCUMENT_OPTION(self), 0); + guint result = 0; + result = result * 31 + + (self->merge != nullptr ? static_cast(*self->merge) : 0); + result = result * 31 + flpigeon_deep_hash(self->merge_fields); + return result; +} + +struct _CloudFirestoreInternalTransactionCommand { + GObject parent_instance; + + CloudFirestoreInternalTransactionType type_; + gchar* path; + FlValue* data; + CloudFirestoreInternalDocumentOption* option; +}; + +G_DEFINE_TYPE(CloudFirestoreInternalTransactionCommand, + cloud_firestore_internal_transaction_command, G_TYPE_OBJECT) + +static void cloud_firestore_internal_transaction_command_dispose( + GObject* object) { + CloudFirestoreInternalTransactionCommand* self = + CLOUD_FIRESTORE_INTERNAL_TRANSACTION_COMMAND(object); + g_clear_pointer(&self->path, g_free); + g_clear_pointer(&self->data, fl_value_unref); + g_clear_object(&self->option); + G_OBJECT_CLASS(cloud_firestore_internal_transaction_command_parent_class) + ->dispose(object); +} + +static void cloud_firestore_internal_transaction_command_init( + CloudFirestoreInternalTransactionCommand* self) {} + +static void cloud_firestore_internal_transaction_command_class_init( + CloudFirestoreInternalTransactionCommandClass* klass) { + G_OBJECT_CLASS(klass)->dispose = + cloud_firestore_internal_transaction_command_dispose; +} + +CloudFirestoreInternalTransactionCommand* +cloud_firestore_internal_transaction_command_new( + CloudFirestoreInternalTransactionType type_, const gchar* path, + FlValue* data, CloudFirestoreInternalDocumentOption* option) { + CloudFirestoreInternalTransactionCommand* self = + CLOUD_FIRESTORE_INTERNAL_TRANSACTION_COMMAND(g_object_new( + cloud_firestore_internal_transaction_command_get_type(), nullptr)); + self->type_ = type_; + self->path = g_strdup(path); + if (data != nullptr) { + self->data = fl_value_ref(data); + } else { + self->data = nullptr; + } + if (option != nullptr) { + self->option = + CLOUD_FIRESTORE_INTERNAL_DOCUMENT_OPTION(g_object_ref(option)); + } else { + self->option = nullptr; + } + return self; +} + +CloudFirestoreInternalTransactionType +cloud_firestore_internal_transaction_command_get_type_( + CloudFirestoreInternalTransactionCommand* self) { + g_return_val_if_fail(CLOUD_FIRESTORE_IS_INTERNAL_TRANSACTION_COMMAND(self), + static_cast(0)); + return self->type_; +} + +const gchar* cloud_firestore_internal_transaction_command_get_path( + CloudFirestoreInternalTransactionCommand* self) { + g_return_val_if_fail(CLOUD_FIRESTORE_IS_INTERNAL_TRANSACTION_COMMAND(self), + nullptr); + return self->path; +} + +FlValue* cloud_firestore_internal_transaction_command_get_data( + CloudFirestoreInternalTransactionCommand* self) { + g_return_val_if_fail(CLOUD_FIRESTORE_IS_INTERNAL_TRANSACTION_COMMAND(self), + nullptr); + return self->data; +} + +CloudFirestoreInternalDocumentOption* +cloud_firestore_internal_transaction_command_get_option( + CloudFirestoreInternalTransactionCommand* self) { + g_return_val_if_fail(CLOUD_FIRESTORE_IS_INTERNAL_TRANSACTION_COMMAND(self), + nullptr); + return self->option; +} + +static FlValue* cloud_firestore_internal_transaction_command_to_list( + CloudFirestoreInternalTransactionCommand* self) { + FlValue* values = fl_value_new_list(); + fl_value_append_take( + values, + fl_value_new_custom(cloud_firestore_internal_transaction_type_type_id, + fl_value_new_int(self->type_), + (GDestroyNotify)fl_value_unref)); + fl_value_append_take(values, fl_value_new_string(self->path)); + fl_value_append_take(values, self->data != nullptr ? fl_value_ref(self->data) + : fl_value_new_null()); + fl_value_append_take( + values, self->option != nullptr + ? fl_value_new_custom_object( + cloud_firestore_internal_document_option_type_id, + G_OBJECT(self->option)) + : fl_value_new_null()); + return values; +} + +static CloudFirestoreInternalTransactionCommand* +cloud_firestore_internal_transaction_command_new_from_list(FlValue* values) { + FlValue* value0 = fl_value_get_list_value(values, 0); + CloudFirestoreInternalTransactionType type_ = + static_cast( + fl_value_get_int(reinterpret_cast( + const_cast(fl_value_get_custom_value(value0))))); + FlValue* value1 = fl_value_get_list_value(values, 1); + const gchar* path = fl_value_get_string(value1); + FlValue* value2 = fl_value_get_list_value(values, 2); + FlValue* data = nullptr; + if (fl_value_get_type(value2) != FL_VALUE_TYPE_NULL) { + data = value2; + } + FlValue* value3 = fl_value_get_list_value(values, 3); + CloudFirestoreInternalDocumentOption* option = nullptr; + if (fl_value_get_type(value3) != FL_VALUE_TYPE_NULL) { + option = CLOUD_FIRESTORE_INTERNAL_DOCUMENT_OPTION( + fl_value_get_custom_value_object(value3)); + } + return cloud_firestore_internal_transaction_command_new(type_, path, data, + option); +} + +gboolean cloud_firestore_internal_transaction_command_equals( + CloudFirestoreInternalTransactionCommand* a, + CloudFirestoreInternalTransactionCommand* b) { + if (a == b) { + return TRUE; + } + if (a == nullptr || b == nullptr) { + return FALSE; + } + if (a->type_ != b->type_) { + return FALSE; + } + if (g_strcmp0(a->path, b->path) != 0) { + return FALSE; + } + if (!flpigeon_deep_equals(a->data, b->data)) { + return FALSE; + } + if (!cloud_firestore_internal_document_option_equals(a->option, b->option)) { + return FALSE; + } + return TRUE; +} + +guint cloud_firestore_internal_transaction_command_hash( + CloudFirestoreInternalTransactionCommand* self) { + g_return_val_if_fail(CLOUD_FIRESTORE_IS_INTERNAL_TRANSACTION_COMMAND(self), + 0); + guint result = 0; + result = result * 31 + static_cast(self->type_); + result = result * 31 + (self->path != nullptr ? g_str_hash(self->path) : 0); + result = result * 31 + flpigeon_deep_hash(self->data); + result = + result * 31 + cloud_firestore_internal_document_option_hash(self->option); + return result; +} + +struct _CloudFirestoreDocumentReferenceRequest { + GObject parent_instance; + + gchar* path; + FlValue* data; + CloudFirestoreInternalDocumentOption* option; + CloudFirestoreSource* source; + CloudFirestoreServerTimestampBehavior* server_timestamp_behavior; +}; + +G_DEFINE_TYPE(CloudFirestoreDocumentReferenceRequest, + cloud_firestore_document_reference_request, G_TYPE_OBJECT) + +static void cloud_firestore_document_reference_request_dispose( + GObject* object) { + CloudFirestoreDocumentReferenceRequest* self = + CLOUD_FIRESTORE_DOCUMENT_REFERENCE_REQUEST(object); + g_clear_pointer(&self->path, g_free); + g_clear_pointer(&self->data, fl_value_unref); + g_clear_object(&self->option); + g_clear_pointer(&self->source, g_free); + g_clear_pointer(&self->server_timestamp_behavior, g_free); + G_OBJECT_CLASS(cloud_firestore_document_reference_request_parent_class) + ->dispose(object); +} + +static void cloud_firestore_document_reference_request_init( + CloudFirestoreDocumentReferenceRequest* self) {} + +static void cloud_firestore_document_reference_request_class_init( + CloudFirestoreDocumentReferenceRequestClass* klass) { + G_OBJECT_CLASS(klass)->dispose = + cloud_firestore_document_reference_request_dispose; +} + +CloudFirestoreDocumentReferenceRequest* +cloud_firestore_document_reference_request_new( + const gchar* path, FlValue* data, + CloudFirestoreInternalDocumentOption* option, CloudFirestoreSource* source, + CloudFirestoreServerTimestampBehavior* server_timestamp_behavior) { + CloudFirestoreDocumentReferenceRequest* self = + CLOUD_FIRESTORE_DOCUMENT_REFERENCE_REQUEST(g_object_new( + cloud_firestore_document_reference_request_get_type(), nullptr)); + self->path = g_strdup(path); + if (data != nullptr) { + self->data = fl_value_ref(data); + } else { + self->data = nullptr; + } + if (option != nullptr) { + self->option = + CLOUD_FIRESTORE_INTERNAL_DOCUMENT_OPTION(g_object_ref(option)); + } else { + self->option = nullptr; + } + if (source != nullptr) { + self->source = static_cast( + malloc(sizeof(CloudFirestoreSource))); + *self->source = *source; + } else { + self->source = nullptr; + } + if (server_timestamp_behavior != nullptr) { + self->server_timestamp_behavior = + static_cast( + malloc(sizeof(CloudFirestoreServerTimestampBehavior))); + *self->server_timestamp_behavior = *server_timestamp_behavior; + } else { + self->server_timestamp_behavior = nullptr; + } + return self; +} + +const gchar* cloud_firestore_document_reference_request_get_path( + CloudFirestoreDocumentReferenceRequest* self) { + g_return_val_if_fail(CLOUD_FIRESTORE_IS_DOCUMENT_REFERENCE_REQUEST(self), + nullptr); + return self->path; +} + +FlValue* cloud_firestore_document_reference_request_get_data( + CloudFirestoreDocumentReferenceRequest* self) { + g_return_val_if_fail(CLOUD_FIRESTORE_IS_DOCUMENT_REFERENCE_REQUEST(self), + nullptr); + return self->data; +} + +CloudFirestoreInternalDocumentOption* +cloud_firestore_document_reference_request_get_option( + CloudFirestoreDocumentReferenceRequest* self) { + g_return_val_if_fail(CLOUD_FIRESTORE_IS_DOCUMENT_REFERENCE_REQUEST(self), + nullptr); + return self->option; +} + +CloudFirestoreSource* cloud_firestore_document_reference_request_get_source( + CloudFirestoreDocumentReferenceRequest* self) { + g_return_val_if_fail(CLOUD_FIRESTORE_IS_DOCUMENT_REFERENCE_REQUEST(self), + nullptr); + return self->source; +} + +CloudFirestoreServerTimestampBehavior* +cloud_firestore_document_reference_request_get_server_timestamp_behavior( + CloudFirestoreDocumentReferenceRequest* self) { + g_return_val_if_fail(CLOUD_FIRESTORE_IS_DOCUMENT_REFERENCE_REQUEST(self), + nullptr); + return self->server_timestamp_behavior; +} + +static FlValue* cloud_firestore_document_reference_request_to_list( + CloudFirestoreDocumentReferenceRequest* self) { + FlValue* values = fl_value_new_list(); + fl_value_append_take(values, fl_value_new_string(self->path)); + fl_value_append_take(values, self->data != nullptr ? fl_value_ref(self->data) + : fl_value_new_null()); + fl_value_append_take( + values, self->option != nullptr + ? fl_value_new_custom_object( + cloud_firestore_internal_document_option_type_id, + G_OBJECT(self->option)) + : fl_value_new_null()); + fl_value_append_take( + values, self->source != nullptr + ? fl_value_new_custom(cloud_firestore_source_type_id, + fl_value_new_int(*self->source), + (GDestroyNotify)fl_value_unref) + : fl_value_new_null()); + fl_value_append_take( + values, self->server_timestamp_behavior != nullptr + ? fl_value_new_custom( + cloud_firestore_server_timestamp_behavior_type_id, + fl_value_new_int(*self->server_timestamp_behavior), + (GDestroyNotify)fl_value_unref) + : fl_value_new_null()); + return values; +} + +static CloudFirestoreDocumentReferenceRequest* +cloud_firestore_document_reference_request_new_from_list(FlValue* values) { + FlValue* value0 = fl_value_get_list_value(values, 0); + const gchar* path = fl_value_get_string(value0); + FlValue* value1 = fl_value_get_list_value(values, 1); + FlValue* data = nullptr; + if (fl_value_get_type(value1) != FL_VALUE_TYPE_NULL) { + data = value1; + } + FlValue* value2 = fl_value_get_list_value(values, 2); + CloudFirestoreInternalDocumentOption* option = nullptr; + if (fl_value_get_type(value2) != FL_VALUE_TYPE_NULL) { + option = CLOUD_FIRESTORE_INTERNAL_DOCUMENT_OPTION( + fl_value_get_custom_value_object(value2)); + } + FlValue* value3 = fl_value_get_list_value(values, 3); + CloudFirestoreSource* source = nullptr; + CloudFirestoreSource source_value; + if (fl_value_get_type(value3) != FL_VALUE_TYPE_NULL) { + source_value = static_cast( + fl_value_get_int(reinterpret_cast( + const_cast(fl_value_get_custom_value(value3))))); + source = &source_value; + } + FlValue* value4 = fl_value_get_list_value(values, 4); + CloudFirestoreServerTimestampBehavior* server_timestamp_behavior = nullptr; + CloudFirestoreServerTimestampBehavior server_timestamp_behavior_value; + if (fl_value_get_type(value4) != FL_VALUE_TYPE_NULL) { + server_timestamp_behavior_value = + static_cast( + fl_value_get_int(reinterpret_cast( + const_cast(fl_value_get_custom_value(value4))))); + server_timestamp_behavior = &server_timestamp_behavior_value; + } + return cloud_firestore_document_reference_request_new( + path, data, option, source, server_timestamp_behavior); +} + +gboolean cloud_firestore_document_reference_request_equals( + CloudFirestoreDocumentReferenceRequest* a, + CloudFirestoreDocumentReferenceRequest* b) { + if (a == b) { + return TRUE; + } + if (a == nullptr || b == nullptr) { + return FALSE; + } + if (g_strcmp0(a->path, b->path) != 0) { + return FALSE; + } + if (!flpigeon_deep_equals(a->data, b->data)) { + return FALSE; + } + if (!cloud_firestore_internal_document_option_equals(a->option, b->option)) { + return FALSE; + } + if ((a->source == nullptr) != (b->source == nullptr)) { + return FALSE; + } + if (a->source != nullptr && *a->source != *b->source) { + return FALSE; + } + if ((a->server_timestamp_behavior == nullptr) != + (b->server_timestamp_behavior == nullptr)) { + return FALSE; + } + if (a->server_timestamp_behavior != nullptr && + *a->server_timestamp_behavior != *b->server_timestamp_behavior) { + return FALSE; + } + return TRUE; +} + +guint cloud_firestore_document_reference_request_hash( + CloudFirestoreDocumentReferenceRequest* self) { + g_return_val_if_fail(CLOUD_FIRESTORE_IS_DOCUMENT_REFERENCE_REQUEST(self), 0); + guint result = 0; + result = result * 31 + (self->path != nullptr ? g_str_hash(self->path) : 0); + result = result * 31 + flpigeon_deep_hash(self->data); + result = + result * 31 + cloud_firestore_internal_document_option_hash(self->option); + result = result * 31 + + (self->source != nullptr ? static_cast(*self->source) : 0); + result = + result * 31 + (self->server_timestamp_behavior != nullptr + ? static_cast(*self->server_timestamp_behavior) + : 0); + return result; +} + +struct _CloudFirestoreInternalQueryParameters { + GObject parent_instance; + + FlValue* where; + FlValue* order_by; + int64_t* limit; + int64_t* limit_to_last; + FlValue* start_at; + FlValue* start_after; + FlValue* end_at; + FlValue* end_before; + FlValue* filters; +}; + +G_DEFINE_TYPE(CloudFirestoreInternalQueryParameters, + cloud_firestore_internal_query_parameters, G_TYPE_OBJECT) + +static void cloud_firestore_internal_query_parameters_dispose(GObject* object) { + CloudFirestoreInternalQueryParameters* self = + CLOUD_FIRESTORE_INTERNAL_QUERY_PARAMETERS(object); + g_clear_pointer(&self->where, fl_value_unref); + g_clear_pointer(&self->order_by, fl_value_unref); + g_clear_pointer(&self->limit, g_free); + g_clear_pointer(&self->limit_to_last, g_free); + g_clear_pointer(&self->start_at, fl_value_unref); + g_clear_pointer(&self->start_after, fl_value_unref); + g_clear_pointer(&self->end_at, fl_value_unref); + g_clear_pointer(&self->end_before, fl_value_unref); + g_clear_pointer(&self->filters, fl_value_unref); + G_OBJECT_CLASS(cloud_firestore_internal_query_parameters_parent_class) + ->dispose(object); +} + +static void cloud_firestore_internal_query_parameters_init( + CloudFirestoreInternalQueryParameters* self) {} + +static void cloud_firestore_internal_query_parameters_class_init( + CloudFirestoreInternalQueryParametersClass* klass) { + G_OBJECT_CLASS(klass)->dispose = + cloud_firestore_internal_query_parameters_dispose; +} + +CloudFirestoreInternalQueryParameters* +cloud_firestore_internal_query_parameters_new( + FlValue* where, FlValue* order_by, int64_t* limit, int64_t* limit_to_last, + FlValue* start_at, FlValue* start_after, FlValue* end_at, + FlValue* end_before, FlValue* filters) { + CloudFirestoreInternalQueryParameters* self = + CLOUD_FIRESTORE_INTERNAL_QUERY_PARAMETERS(g_object_new( + cloud_firestore_internal_query_parameters_get_type(), nullptr)); + if (where != nullptr) { + self->where = fl_value_ref(where); + } else { + self->where = nullptr; + } + if (order_by != nullptr) { + self->order_by = fl_value_ref(order_by); + } else { + self->order_by = nullptr; + } + if (limit != nullptr) { + self->limit = static_cast(malloc(sizeof(int64_t))); + *self->limit = *limit; + } else { + self->limit = nullptr; + } + if (limit_to_last != nullptr) { + self->limit_to_last = static_cast(malloc(sizeof(int64_t))); + *self->limit_to_last = *limit_to_last; + } else { + self->limit_to_last = nullptr; + } + if (start_at != nullptr) { + self->start_at = fl_value_ref(start_at); + } else { + self->start_at = nullptr; + } + if (start_after != nullptr) { + self->start_after = fl_value_ref(start_after); + } else { + self->start_after = nullptr; + } + if (end_at != nullptr) { + self->end_at = fl_value_ref(end_at); + } else { + self->end_at = nullptr; + } + if (end_before != nullptr) { + self->end_before = fl_value_ref(end_before); + } else { + self->end_before = nullptr; + } + if (filters != nullptr) { + self->filters = fl_value_ref(filters); + } else { + self->filters = nullptr; + } + return self; +} + +FlValue* cloud_firestore_internal_query_parameters_get_where( + CloudFirestoreInternalQueryParameters* self) { + g_return_val_if_fail(CLOUD_FIRESTORE_IS_INTERNAL_QUERY_PARAMETERS(self), + nullptr); + return self->where; +} + +FlValue* cloud_firestore_internal_query_parameters_get_order_by( + CloudFirestoreInternalQueryParameters* self) { + g_return_val_if_fail(CLOUD_FIRESTORE_IS_INTERNAL_QUERY_PARAMETERS(self), + nullptr); + return self->order_by; +} + +int64_t* cloud_firestore_internal_query_parameters_get_limit( + CloudFirestoreInternalQueryParameters* self) { + g_return_val_if_fail(CLOUD_FIRESTORE_IS_INTERNAL_QUERY_PARAMETERS(self), + nullptr); + return self->limit; +} + +int64_t* cloud_firestore_internal_query_parameters_get_limit_to_last( + CloudFirestoreInternalQueryParameters* self) { + g_return_val_if_fail(CLOUD_FIRESTORE_IS_INTERNAL_QUERY_PARAMETERS(self), + nullptr); + return self->limit_to_last; +} + +FlValue* cloud_firestore_internal_query_parameters_get_start_at( + CloudFirestoreInternalQueryParameters* self) { + g_return_val_if_fail(CLOUD_FIRESTORE_IS_INTERNAL_QUERY_PARAMETERS(self), + nullptr); + return self->start_at; +} + +FlValue* cloud_firestore_internal_query_parameters_get_start_after( + CloudFirestoreInternalQueryParameters* self) { + g_return_val_if_fail(CLOUD_FIRESTORE_IS_INTERNAL_QUERY_PARAMETERS(self), + nullptr); + return self->start_after; +} + +FlValue* cloud_firestore_internal_query_parameters_get_end_at( + CloudFirestoreInternalQueryParameters* self) { + g_return_val_if_fail(CLOUD_FIRESTORE_IS_INTERNAL_QUERY_PARAMETERS(self), + nullptr); + return self->end_at; +} + +FlValue* cloud_firestore_internal_query_parameters_get_end_before( + CloudFirestoreInternalQueryParameters* self) { + g_return_val_if_fail(CLOUD_FIRESTORE_IS_INTERNAL_QUERY_PARAMETERS(self), + nullptr); + return self->end_before; +} + +FlValue* cloud_firestore_internal_query_parameters_get_filters( + CloudFirestoreInternalQueryParameters* self) { + g_return_val_if_fail(CLOUD_FIRESTORE_IS_INTERNAL_QUERY_PARAMETERS(self), + nullptr); + return self->filters; +} + +static FlValue* cloud_firestore_internal_query_parameters_to_list( + CloudFirestoreInternalQueryParameters* self) { + FlValue* values = fl_value_new_list(); + fl_value_append_take(values, self->where != nullptr + ? fl_value_ref(self->where) + : fl_value_new_null()); + fl_value_append_take(values, self->order_by != nullptr + ? fl_value_ref(self->order_by) + : fl_value_new_null()); + fl_value_append_take(values, self->limit != nullptr + ? fl_value_new_int(*self->limit) + : fl_value_new_null()); + fl_value_append_take(values, self->limit_to_last != nullptr + ? fl_value_new_int(*self->limit_to_last) + : fl_value_new_null()); + fl_value_append_take(values, self->start_at != nullptr + ? fl_value_ref(self->start_at) + : fl_value_new_null()); + fl_value_append_take(values, self->start_after != nullptr + ? fl_value_ref(self->start_after) + : fl_value_new_null()); + fl_value_append_take(values, self->end_at != nullptr + ? fl_value_ref(self->end_at) + : fl_value_new_null()); + fl_value_append_take(values, self->end_before != nullptr + ? fl_value_ref(self->end_before) + : fl_value_new_null()); + fl_value_append_take(values, self->filters != nullptr + ? fl_value_ref(self->filters) + : fl_value_new_null()); + return values; +} + +static CloudFirestoreInternalQueryParameters* +cloud_firestore_internal_query_parameters_new_from_list(FlValue* values) { + FlValue* value0 = fl_value_get_list_value(values, 0); + FlValue* where = nullptr; + if (fl_value_get_type(value0) != FL_VALUE_TYPE_NULL) { + where = value0; + } + FlValue* value1 = fl_value_get_list_value(values, 1); + FlValue* order_by = nullptr; + if (fl_value_get_type(value1) != FL_VALUE_TYPE_NULL) { + order_by = value1; + } + FlValue* value2 = fl_value_get_list_value(values, 2); + int64_t* limit = nullptr; + int64_t limit_value; + if (fl_value_get_type(value2) != FL_VALUE_TYPE_NULL) { + limit_value = fl_value_get_int(value2); + limit = &limit_value; + } + FlValue* value3 = fl_value_get_list_value(values, 3); + int64_t* limit_to_last = nullptr; + int64_t limit_to_last_value; + if (fl_value_get_type(value3) != FL_VALUE_TYPE_NULL) { + limit_to_last_value = fl_value_get_int(value3); + limit_to_last = &limit_to_last_value; + } + FlValue* value4 = fl_value_get_list_value(values, 4); + FlValue* start_at = nullptr; + if (fl_value_get_type(value4) != FL_VALUE_TYPE_NULL) { + start_at = value4; + } + FlValue* value5 = fl_value_get_list_value(values, 5); + FlValue* start_after = nullptr; + if (fl_value_get_type(value5) != FL_VALUE_TYPE_NULL) { + start_after = value5; + } + FlValue* value6 = fl_value_get_list_value(values, 6); + FlValue* end_at = nullptr; + if (fl_value_get_type(value6) != FL_VALUE_TYPE_NULL) { + end_at = value6; + } + FlValue* value7 = fl_value_get_list_value(values, 7); + FlValue* end_before = nullptr; + if (fl_value_get_type(value7) != FL_VALUE_TYPE_NULL) { + end_before = value7; + } + FlValue* value8 = fl_value_get_list_value(values, 8); + FlValue* filters = nullptr; + if (fl_value_get_type(value8) != FL_VALUE_TYPE_NULL) { + filters = value8; + } + return cloud_firestore_internal_query_parameters_new( + where, order_by, limit, limit_to_last, start_at, start_after, end_at, + end_before, filters); +} + +gboolean cloud_firestore_internal_query_parameters_equals( + CloudFirestoreInternalQueryParameters* a, + CloudFirestoreInternalQueryParameters* b) { + if (a == b) { + return TRUE; + } + if (a == nullptr || b == nullptr) { + return FALSE; + } + if (!flpigeon_deep_equals(a->where, b->where)) { + return FALSE; + } + if (!flpigeon_deep_equals(a->order_by, b->order_by)) { + return FALSE; + } + if ((a->limit == nullptr) != (b->limit == nullptr)) { + return FALSE; + } + if (a->limit != nullptr && *a->limit != *b->limit) { + return FALSE; + } + if ((a->limit_to_last == nullptr) != (b->limit_to_last == nullptr)) { + return FALSE; + } + if (a->limit_to_last != nullptr && *a->limit_to_last != *b->limit_to_last) { + return FALSE; + } + if (!flpigeon_deep_equals(a->start_at, b->start_at)) { + return FALSE; + } + if (!flpigeon_deep_equals(a->start_after, b->start_after)) { + return FALSE; + } + if (!flpigeon_deep_equals(a->end_at, b->end_at)) { + return FALSE; + } + if (!flpigeon_deep_equals(a->end_before, b->end_before)) { + return FALSE; + } + if (!flpigeon_deep_equals(a->filters, b->filters)) { + return FALSE; + } + return TRUE; +} + +guint cloud_firestore_internal_query_parameters_hash( + CloudFirestoreInternalQueryParameters* self) { + g_return_val_if_fail(CLOUD_FIRESTORE_IS_INTERNAL_QUERY_PARAMETERS(self), 0); + guint result = 0; + result = result * 31 + flpigeon_deep_hash(self->where); + result = result * 31 + flpigeon_deep_hash(self->order_by); + result = result * 31 + + (self->limit != nullptr ? static_cast(*self->limit) : 0); + result = result * 31 + (self->limit_to_last != nullptr + ? static_cast(*self->limit_to_last) + : 0); + result = result * 31 + flpigeon_deep_hash(self->start_at); + result = result * 31 + flpigeon_deep_hash(self->start_after); + result = result * 31 + flpigeon_deep_hash(self->end_at); + result = result * 31 + flpigeon_deep_hash(self->end_before); + result = result * 31 + flpigeon_deep_hash(self->filters); + return result; +} + +struct _CloudFirestoreAggregateQuery { + GObject parent_instance; + + CloudFirestoreAggregateType type_; + gchar* field; +}; + +G_DEFINE_TYPE(CloudFirestoreAggregateQuery, cloud_firestore_aggregate_query, + G_TYPE_OBJECT) + +static void cloud_firestore_aggregate_query_dispose(GObject* object) { + CloudFirestoreAggregateQuery* self = CLOUD_FIRESTORE_AGGREGATE_QUERY(object); + g_clear_pointer(&self->field, g_free); + G_OBJECT_CLASS(cloud_firestore_aggregate_query_parent_class)->dispose(object); +} + +static void cloud_firestore_aggregate_query_init( + CloudFirestoreAggregateQuery* self) {} + +static void cloud_firestore_aggregate_query_class_init( + CloudFirestoreAggregateQueryClass* klass) { + G_OBJECT_CLASS(klass)->dispose = cloud_firestore_aggregate_query_dispose; +} + +CloudFirestoreAggregateQuery* cloud_firestore_aggregate_query_new( + CloudFirestoreAggregateType type_, const gchar* field) { + CloudFirestoreAggregateQuery* self = CLOUD_FIRESTORE_AGGREGATE_QUERY( + g_object_new(cloud_firestore_aggregate_query_get_type(), nullptr)); + self->type_ = type_; + if (field != nullptr) { + self->field = g_strdup(field); + } else { + self->field = nullptr; + } + return self; +} + +CloudFirestoreAggregateType cloud_firestore_aggregate_query_get_type_( + CloudFirestoreAggregateQuery* self) { + g_return_val_if_fail(CLOUD_FIRESTORE_IS_AGGREGATE_QUERY(self), + static_cast(0)); + return self->type_; +} + +const gchar* cloud_firestore_aggregate_query_get_field( + CloudFirestoreAggregateQuery* self) { + g_return_val_if_fail(CLOUD_FIRESTORE_IS_AGGREGATE_QUERY(self), nullptr); + return self->field; +} + +static FlValue* cloud_firestore_aggregate_query_to_list( + CloudFirestoreAggregateQuery* self) { + FlValue* values = fl_value_new_list(); + fl_value_append_take( + values, fl_value_new_custom(cloud_firestore_aggregate_type_type_id, + fl_value_new_int(self->type_), + (GDestroyNotify)fl_value_unref)); + fl_value_append_take(values, self->field != nullptr + ? fl_value_new_string(self->field) + : fl_value_new_null()); + return values; +} + +static CloudFirestoreAggregateQuery* +cloud_firestore_aggregate_query_new_from_list(FlValue* values) { + FlValue* value0 = fl_value_get_list_value(values, 0); + CloudFirestoreAggregateType type_ = static_cast( + fl_value_get_int(reinterpret_cast( + const_cast(fl_value_get_custom_value(value0))))); + FlValue* value1 = fl_value_get_list_value(values, 1); + const gchar* field = nullptr; + if (fl_value_get_type(value1) != FL_VALUE_TYPE_NULL) { + field = fl_value_get_string(value1); + } + return cloud_firestore_aggregate_query_new(type_, field); +} + +gboolean cloud_firestore_aggregate_query_equals( + CloudFirestoreAggregateQuery* a, CloudFirestoreAggregateQuery* b) { + if (a == b) { + return TRUE; + } + if (a == nullptr || b == nullptr) { + return FALSE; + } + if (a->type_ != b->type_) { + return FALSE; + } + if (g_strcmp0(a->field, b->field) != 0) { + return FALSE; + } + return TRUE; +} + +guint cloud_firestore_aggregate_query_hash(CloudFirestoreAggregateQuery* self) { + g_return_val_if_fail(CLOUD_FIRESTORE_IS_AGGREGATE_QUERY(self), 0); + guint result = 0; + result = result * 31 + static_cast(self->type_); + result = result * 31 + (self->field != nullptr ? g_str_hash(self->field) : 0); + return result; +} + +struct _CloudFirestoreAggregateQueryResponse { + GObject parent_instance; + + CloudFirestoreAggregateType type_; + gchar* field; + double* value; +}; + +G_DEFINE_TYPE(CloudFirestoreAggregateQueryResponse, + cloud_firestore_aggregate_query_response, G_TYPE_OBJECT) + +static void cloud_firestore_aggregate_query_response_dispose(GObject* object) { + CloudFirestoreAggregateQueryResponse* self = + CLOUD_FIRESTORE_AGGREGATE_QUERY_RESPONSE(object); + g_clear_pointer(&self->field, g_free); + g_clear_pointer(&self->value, g_free); + G_OBJECT_CLASS(cloud_firestore_aggregate_query_response_parent_class) + ->dispose(object); +} + +static void cloud_firestore_aggregate_query_response_init( + CloudFirestoreAggregateQueryResponse* self) {} + +static void cloud_firestore_aggregate_query_response_class_init( + CloudFirestoreAggregateQueryResponseClass* klass) { + G_OBJECT_CLASS(klass)->dispose = + cloud_firestore_aggregate_query_response_dispose; +} + +CloudFirestoreAggregateQueryResponse* +cloud_firestore_aggregate_query_response_new(CloudFirestoreAggregateType type_, + const gchar* field, + double* value) { + CloudFirestoreAggregateQueryResponse* self = + CLOUD_FIRESTORE_AGGREGATE_QUERY_RESPONSE(g_object_new( + cloud_firestore_aggregate_query_response_get_type(), nullptr)); + self->type_ = type_; + if (field != nullptr) { + self->field = g_strdup(field); + } else { + self->field = nullptr; + } + if (value != nullptr) { + self->value = static_cast(malloc(sizeof(double))); + *self->value = *value; + } else { + self->value = nullptr; + } + return self; +} + +CloudFirestoreAggregateType cloud_firestore_aggregate_query_response_get_type_( + CloudFirestoreAggregateQueryResponse* self) { + g_return_val_if_fail(CLOUD_FIRESTORE_IS_AGGREGATE_QUERY_RESPONSE(self), + static_cast(0)); + return self->type_; +} + +const gchar* cloud_firestore_aggregate_query_response_get_field( + CloudFirestoreAggregateQueryResponse* self) { + g_return_val_if_fail(CLOUD_FIRESTORE_IS_AGGREGATE_QUERY_RESPONSE(self), + nullptr); + return self->field; +} + +double* cloud_firestore_aggregate_query_response_get_value( + CloudFirestoreAggregateQueryResponse* self) { + g_return_val_if_fail(CLOUD_FIRESTORE_IS_AGGREGATE_QUERY_RESPONSE(self), + nullptr); + return self->value; +} + +static FlValue* cloud_firestore_aggregate_query_response_to_list( + CloudFirestoreAggregateQueryResponse* self) { + FlValue* values = fl_value_new_list(); + fl_value_append_take( + values, fl_value_new_custom(cloud_firestore_aggregate_type_type_id, + fl_value_new_int(self->type_), + (GDestroyNotify)fl_value_unref)); + fl_value_append_take(values, self->field != nullptr + ? fl_value_new_string(self->field) + : fl_value_new_null()); + fl_value_append_take(values, self->value != nullptr + ? fl_value_new_float(*self->value) + : fl_value_new_null()); + return values; +} + +static CloudFirestoreAggregateQueryResponse* +cloud_firestore_aggregate_query_response_new_from_list(FlValue* values) { + FlValue* value0 = fl_value_get_list_value(values, 0); + CloudFirestoreAggregateType type_ = static_cast( + fl_value_get_int(reinterpret_cast( + const_cast(fl_value_get_custom_value(value0))))); + FlValue* value1 = fl_value_get_list_value(values, 1); + const gchar* field = nullptr; + if (fl_value_get_type(value1) != FL_VALUE_TYPE_NULL) { + field = fl_value_get_string(value1); + } + FlValue* value2 = fl_value_get_list_value(values, 2); + double* value = nullptr; + double value_value; + if (fl_value_get_type(value2) != FL_VALUE_TYPE_NULL) { + value_value = fl_value_get_float(value2); + value = &value_value; + } + return cloud_firestore_aggregate_query_response_new(type_, field, value); +} + +gboolean cloud_firestore_aggregate_query_response_equals( + CloudFirestoreAggregateQueryResponse* a, + CloudFirestoreAggregateQueryResponse* b) { + if (a == b) { + return TRUE; + } + if (a == nullptr || b == nullptr) { + return FALSE; + } + if (a->type_ != b->type_) { + return FALSE; + } + if (g_strcmp0(a->field, b->field) != 0) { + return FALSE; + } + if ((a->value == nullptr) != (b->value == nullptr)) { + return FALSE; + } + if (a->value != nullptr && !flpigeon_equals_double(*a->value, *b->value)) { + return FALSE; + } + return TRUE; +} + +guint cloud_firestore_aggregate_query_response_hash( + CloudFirestoreAggregateQueryResponse* self) { + g_return_val_if_fail(CLOUD_FIRESTORE_IS_AGGREGATE_QUERY_RESPONSE(self), 0); + guint result = 0; + result = result * 31 + static_cast(self->type_); + result = result * 31 + (self->field != nullptr ? g_str_hash(self->field) : 0); + result = result * 31 + + (self->value != nullptr ? flpigeon_hash_double(*self->value) : 0); + return result; +} + +struct _CloudFirestoreMessageCodec { + FlStandardMessageCodec parent_instance; +}; + +G_DEFINE_TYPE(CloudFirestoreMessageCodec, cloud_firestore_message_codec, + fl_standard_message_codec_get_type()) + +const int cloud_firestore_document_change_type_type_id = 129; +const int cloud_firestore_source_type_id = 130; +const int cloud_firestore_listen_source_type_id = 131; +const int cloud_firestore_server_timestamp_behavior_type_id = 132; +const int cloud_firestore_aggregate_source_type_id = 133; +const int cloud_firestore_persistence_cache_index_manager_request_type_id = 134; +const int cloud_firestore_internal_transaction_result_type_id = 135; +const int cloud_firestore_internal_transaction_type_type_id = 136; +const int cloud_firestore_aggregate_type_type_id = 137; +const int cloud_firestore_internal_firebase_settings_type_id = 138; +const int cloud_firestore_firestore_pigeon_firebase_app_type_id = 139; +const int cloud_firestore_internal_snapshot_metadata_type_id = 140; +const int cloud_firestore_internal_document_snapshot_type_id = 141; +const int cloud_firestore_internal_document_change_type_id = 142; +const int cloud_firestore_internal_query_snapshot_type_id = 143; +const int cloud_firestore_internal_pipeline_result_type_id = 144; +const int cloud_firestore_internal_pipeline_snapshot_type_id = 145; +const int cloud_firestore_internal_get_options_type_id = 146; +const int cloud_firestore_internal_document_option_type_id = 147; +const int cloud_firestore_internal_transaction_command_type_id = 148; +const int cloud_firestore_document_reference_request_type_id = 149; +const int cloud_firestore_internal_query_parameters_type_id = 150; +const int cloud_firestore_aggregate_query_type_id = 151; +const int cloud_firestore_aggregate_query_response_type_id = 152; + +static gboolean +cloud_firestore_message_codec_write_cloud_firestore_document_change_type( + FlStandardMessageCodec* codec, GByteArray* buffer, FlValue* value, + GError** error) { + uint8_t type = cloud_firestore_document_change_type_type_id; + g_byte_array_append(buffer, &type, sizeof(uint8_t)); + return fl_standard_message_codec_write_value(codec, buffer, value, error); +} + +static gboolean cloud_firestore_message_codec_write_cloud_firestore_source( + FlStandardMessageCodec* codec, GByteArray* buffer, FlValue* value, + GError** error) { + uint8_t type = cloud_firestore_source_type_id; + g_byte_array_append(buffer, &type, sizeof(uint8_t)); + return fl_standard_message_codec_write_value(codec, buffer, value, error); +} + +static gboolean +cloud_firestore_message_codec_write_cloud_firestore_listen_source( + FlStandardMessageCodec* codec, GByteArray* buffer, FlValue* value, + GError** error) { + uint8_t type = cloud_firestore_listen_source_type_id; + g_byte_array_append(buffer, &type, sizeof(uint8_t)); + return fl_standard_message_codec_write_value(codec, buffer, value, error); +} + +static gboolean +cloud_firestore_message_codec_write_cloud_firestore_server_timestamp_behavior( + FlStandardMessageCodec* codec, GByteArray* buffer, FlValue* value, + GError** error) { + uint8_t type = cloud_firestore_server_timestamp_behavior_type_id; + g_byte_array_append(buffer, &type, sizeof(uint8_t)); + return fl_standard_message_codec_write_value(codec, buffer, value, error); +} + +static gboolean +cloud_firestore_message_codec_write_cloud_firestore_aggregate_source( + FlStandardMessageCodec* codec, GByteArray* buffer, FlValue* value, + GError** error) { + uint8_t type = cloud_firestore_aggregate_source_type_id; + g_byte_array_append(buffer, &type, sizeof(uint8_t)); + return fl_standard_message_codec_write_value(codec, buffer, value, error); +} + +static gboolean +cloud_firestore_message_codec_write_cloud_firestore_persistence_cache_index_manager_request( + FlStandardMessageCodec* codec, GByteArray* buffer, FlValue* value, + GError** error) { + uint8_t type = + cloud_firestore_persistence_cache_index_manager_request_type_id; + g_byte_array_append(buffer, &type, sizeof(uint8_t)); + return fl_standard_message_codec_write_value(codec, buffer, value, error); +} + +static gboolean +cloud_firestore_message_codec_write_cloud_firestore_internal_transaction_result( + FlStandardMessageCodec* codec, GByteArray* buffer, FlValue* value, + GError** error) { + uint8_t type = cloud_firestore_internal_transaction_result_type_id; + g_byte_array_append(buffer, &type, sizeof(uint8_t)); + return fl_standard_message_codec_write_value(codec, buffer, value, error); +} + +static gboolean +cloud_firestore_message_codec_write_cloud_firestore_internal_transaction_type( + FlStandardMessageCodec* codec, GByteArray* buffer, FlValue* value, + GError** error) { + uint8_t type = cloud_firestore_internal_transaction_type_type_id; + g_byte_array_append(buffer, &type, sizeof(uint8_t)); + return fl_standard_message_codec_write_value(codec, buffer, value, error); +} + +static gboolean +cloud_firestore_message_codec_write_cloud_firestore_aggregate_type( + FlStandardMessageCodec* codec, GByteArray* buffer, FlValue* value, + GError** error) { + uint8_t type = cloud_firestore_aggregate_type_type_id; + g_byte_array_append(buffer, &type, sizeof(uint8_t)); + return fl_standard_message_codec_write_value(codec, buffer, value, error); +} + +static gboolean +cloud_firestore_message_codec_write_cloud_firestore_internal_firebase_settings( + FlStandardMessageCodec* codec, GByteArray* buffer, + CloudFirestoreInternalFirebaseSettings* value, GError** error) { + uint8_t type = cloud_firestore_internal_firebase_settings_type_id; + g_byte_array_append(buffer, &type, sizeof(uint8_t)); + g_autoptr(FlValue) values = + cloud_firestore_internal_firebase_settings_to_list(value); + return fl_standard_message_codec_write_value(codec, buffer, values, error); +} + +static gboolean +cloud_firestore_message_codec_write_cloud_firestore_firestore_pigeon_firebase_app( + FlStandardMessageCodec* codec, GByteArray* buffer, + CloudFirestoreFirestorePigeonFirebaseApp* value, GError** error) { + uint8_t type = cloud_firestore_firestore_pigeon_firebase_app_type_id; + g_byte_array_append(buffer, &type, sizeof(uint8_t)); + g_autoptr(FlValue) values = + cloud_firestore_firestore_pigeon_firebase_app_to_list(value); + return fl_standard_message_codec_write_value(codec, buffer, values, error); +} + +static gboolean +cloud_firestore_message_codec_write_cloud_firestore_internal_snapshot_metadata( + FlStandardMessageCodec* codec, GByteArray* buffer, + CloudFirestoreInternalSnapshotMetadata* value, GError** error) { + uint8_t type = cloud_firestore_internal_snapshot_metadata_type_id; + g_byte_array_append(buffer, &type, sizeof(uint8_t)); + g_autoptr(FlValue) values = + cloud_firestore_internal_snapshot_metadata_to_list(value); + return fl_standard_message_codec_write_value(codec, buffer, values, error); +} + +static gboolean +cloud_firestore_message_codec_write_cloud_firestore_internal_document_snapshot( + FlStandardMessageCodec* codec, GByteArray* buffer, + CloudFirestoreInternalDocumentSnapshot* value, GError** error) { + uint8_t type = cloud_firestore_internal_document_snapshot_type_id; + g_byte_array_append(buffer, &type, sizeof(uint8_t)); + g_autoptr(FlValue) values = + cloud_firestore_internal_document_snapshot_to_list(value); + return fl_standard_message_codec_write_value(codec, buffer, values, error); +} + +static gboolean +cloud_firestore_message_codec_write_cloud_firestore_internal_document_change( + FlStandardMessageCodec* codec, GByteArray* buffer, + CloudFirestoreInternalDocumentChange* value, GError** error) { + uint8_t type = cloud_firestore_internal_document_change_type_id; + g_byte_array_append(buffer, &type, sizeof(uint8_t)); + g_autoptr(FlValue) values = + cloud_firestore_internal_document_change_to_list(value); + return fl_standard_message_codec_write_value(codec, buffer, values, error); +} + +static gboolean +cloud_firestore_message_codec_write_cloud_firestore_internal_query_snapshot( + FlStandardMessageCodec* codec, GByteArray* buffer, + CloudFirestoreInternalQuerySnapshot* value, GError** error) { + uint8_t type = cloud_firestore_internal_query_snapshot_type_id; + g_byte_array_append(buffer, &type, sizeof(uint8_t)); + g_autoptr(FlValue) values = + cloud_firestore_internal_query_snapshot_to_list(value); + return fl_standard_message_codec_write_value(codec, buffer, values, error); +} + +static gboolean +cloud_firestore_message_codec_write_cloud_firestore_internal_pipeline_result( + FlStandardMessageCodec* codec, GByteArray* buffer, + CloudFirestoreInternalPipelineResult* value, GError** error) { + uint8_t type = cloud_firestore_internal_pipeline_result_type_id; + g_byte_array_append(buffer, &type, sizeof(uint8_t)); + g_autoptr(FlValue) values = + cloud_firestore_internal_pipeline_result_to_list(value); + return fl_standard_message_codec_write_value(codec, buffer, values, error); +} + +static gboolean +cloud_firestore_message_codec_write_cloud_firestore_internal_pipeline_snapshot( + FlStandardMessageCodec* codec, GByteArray* buffer, + CloudFirestoreInternalPipelineSnapshot* value, GError** error) { + uint8_t type = cloud_firestore_internal_pipeline_snapshot_type_id; + g_byte_array_append(buffer, &type, sizeof(uint8_t)); + g_autoptr(FlValue) values = + cloud_firestore_internal_pipeline_snapshot_to_list(value); + return fl_standard_message_codec_write_value(codec, buffer, values, error); +} + +static gboolean +cloud_firestore_message_codec_write_cloud_firestore_internal_get_options( + FlStandardMessageCodec* codec, GByteArray* buffer, + CloudFirestoreInternalGetOptions* value, GError** error) { + uint8_t type = cloud_firestore_internal_get_options_type_id; + g_byte_array_append(buffer, &type, sizeof(uint8_t)); + g_autoptr(FlValue) values = + cloud_firestore_internal_get_options_to_list(value); + return fl_standard_message_codec_write_value(codec, buffer, values, error); +} + +static gboolean +cloud_firestore_message_codec_write_cloud_firestore_internal_document_option( + FlStandardMessageCodec* codec, GByteArray* buffer, + CloudFirestoreInternalDocumentOption* value, GError** error) { + uint8_t type = cloud_firestore_internal_document_option_type_id; + g_byte_array_append(buffer, &type, sizeof(uint8_t)); + g_autoptr(FlValue) values = + cloud_firestore_internal_document_option_to_list(value); + return fl_standard_message_codec_write_value(codec, buffer, values, error); +} + +static gboolean +cloud_firestore_message_codec_write_cloud_firestore_internal_transaction_command( + FlStandardMessageCodec* codec, GByteArray* buffer, + CloudFirestoreInternalTransactionCommand* value, GError** error) { + uint8_t type = cloud_firestore_internal_transaction_command_type_id; + g_byte_array_append(buffer, &type, sizeof(uint8_t)); + g_autoptr(FlValue) values = + cloud_firestore_internal_transaction_command_to_list(value); + return fl_standard_message_codec_write_value(codec, buffer, values, error); +} + +static gboolean +cloud_firestore_message_codec_write_cloud_firestore_document_reference_request( + FlStandardMessageCodec* codec, GByteArray* buffer, + CloudFirestoreDocumentReferenceRequest* value, GError** error) { + uint8_t type = cloud_firestore_document_reference_request_type_id; + g_byte_array_append(buffer, &type, sizeof(uint8_t)); + g_autoptr(FlValue) values = + cloud_firestore_document_reference_request_to_list(value); + return fl_standard_message_codec_write_value(codec, buffer, values, error); +} + +static gboolean +cloud_firestore_message_codec_write_cloud_firestore_internal_query_parameters( + FlStandardMessageCodec* codec, GByteArray* buffer, + CloudFirestoreInternalQueryParameters* value, GError** error) { + uint8_t type = cloud_firestore_internal_query_parameters_type_id; + g_byte_array_append(buffer, &type, sizeof(uint8_t)); + g_autoptr(FlValue) values = + cloud_firestore_internal_query_parameters_to_list(value); + return fl_standard_message_codec_write_value(codec, buffer, values, error); +} + +static gboolean +cloud_firestore_message_codec_write_cloud_firestore_aggregate_query( + FlStandardMessageCodec* codec, GByteArray* buffer, + CloudFirestoreAggregateQuery* value, GError** error) { + uint8_t type = cloud_firestore_aggregate_query_type_id; + g_byte_array_append(buffer, &type, sizeof(uint8_t)); + g_autoptr(FlValue) values = cloud_firestore_aggregate_query_to_list(value); + return fl_standard_message_codec_write_value(codec, buffer, values, error); +} + +static gboolean +cloud_firestore_message_codec_write_cloud_firestore_aggregate_query_response( + FlStandardMessageCodec* codec, GByteArray* buffer, + CloudFirestoreAggregateQueryResponse* value, GError** error) { + uint8_t type = cloud_firestore_aggregate_query_response_type_id; + g_byte_array_append(buffer, &type, sizeof(uint8_t)); + g_autoptr(FlValue) values = + cloud_firestore_aggregate_query_response_to_list(value); + return fl_standard_message_codec_write_value(codec, buffer, values, error); +} + +static gboolean cloud_firestore_message_codec_write_value( + FlStandardMessageCodec* codec, GByteArray* buffer, FlValue* value, + GError** error) { + if (fl_value_get_type(value) == FL_VALUE_TYPE_CUSTOM) { + switch (fl_value_get_custom_type(value)) { + case cloud_firestore_document_change_type_type_id: + return cloud_firestore_message_codec_write_cloud_firestore_document_change_type( + codec, buffer, + reinterpret_cast( + const_cast(fl_value_get_custom_value(value))), + error); + case cloud_firestore_source_type_id: + return cloud_firestore_message_codec_write_cloud_firestore_source( + codec, buffer, + reinterpret_cast( + const_cast(fl_value_get_custom_value(value))), + error); + case cloud_firestore_listen_source_type_id: + return cloud_firestore_message_codec_write_cloud_firestore_listen_source( + codec, buffer, + reinterpret_cast( + const_cast(fl_value_get_custom_value(value))), + error); + case cloud_firestore_server_timestamp_behavior_type_id: + return cloud_firestore_message_codec_write_cloud_firestore_server_timestamp_behavior( + codec, buffer, + reinterpret_cast( + const_cast(fl_value_get_custom_value(value))), + error); + case cloud_firestore_aggregate_source_type_id: + return cloud_firestore_message_codec_write_cloud_firestore_aggregate_source( + codec, buffer, + reinterpret_cast( + const_cast(fl_value_get_custom_value(value))), + error); + case cloud_firestore_persistence_cache_index_manager_request_type_id: + return cloud_firestore_message_codec_write_cloud_firestore_persistence_cache_index_manager_request( + codec, buffer, + reinterpret_cast( + const_cast(fl_value_get_custom_value(value))), + error); + case cloud_firestore_internal_transaction_result_type_id: + return cloud_firestore_message_codec_write_cloud_firestore_internal_transaction_result( + codec, buffer, + reinterpret_cast( + const_cast(fl_value_get_custom_value(value))), + error); + case cloud_firestore_internal_transaction_type_type_id: + return cloud_firestore_message_codec_write_cloud_firestore_internal_transaction_type( + codec, buffer, + reinterpret_cast( + const_cast(fl_value_get_custom_value(value))), + error); + case cloud_firestore_aggregate_type_type_id: + return cloud_firestore_message_codec_write_cloud_firestore_aggregate_type( + codec, buffer, + reinterpret_cast( + const_cast(fl_value_get_custom_value(value))), + error); + case cloud_firestore_internal_firebase_settings_type_id: + return cloud_firestore_message_codec_write_cloud_firestore_internal_firebase_settings( + codec, buffer, + CLOUD_FIRESTORE_INTERNAL_FIREBASE_SETTINGS( + fl_value_get_custom_value_object(value)), + error); + case cloud_firestore_firestore_pigeon_firebase_app_type_id: + return cloud_firestore_message_codec_write_cloud_firestore_firestore_pigeon_firebase_app( + codec, buffer, + CLOUD_FIRESTORE_FIRESTORE_PIGEON_FIREBASE_APP( + fl_value_get_custom_value_object(value)), + error); + case cloud_firestore_internal_snapshot_metadata_type_id: + return cloud_firestore_message_codec_write_cloud_firestore_internal_snapshot_metadata( + codec, buffer, + CLOUD_FIRESTORE_INTERNAL_SNAPSHOT_METADATA( + fl_value_get_custom_value_object(value)), + error); + case cloud_firestore_internal_document_snapshot_type_id: + return cloud_firestore_message_codec_write_cloud_firestore_internal_document_snapshot( + codec, buffer, + CLOUD_FIRESTORE_INTERNAL_DOCUMENT_SNAPSHOT( + fl_value_get_custom_value_object(value)), + error); + case cloud_firestore_internal_document_change_type_id: + return cloud_firestore_message_codec_write_cloud_firestore_internal_document_change( + codec, buffer, + CLOUD_FIRESTORE_INTERNAL_DOCUMENT_CHANGE( + fl_value_get_custom_value_object(value)), + error); + case cloud_firestore_internal_query_snapshot_type_id: + return cloud_firestore_message_codec_write_cloud_firestore_internal_query_snapshot( + codec, buffer, + CLOUD_FIRESTORE_INTERNAL_QUERY_SNAPSHOT( + fl_value_get_custom_value_object(value)), + error); + case cloud_firestore_internal_pipeline_result_type_id: + return cloud_firestore_message_codec_write_cloud_firestore_internal_pipeline_result( + codec, buffer, + CLOUD_FIRESTORE_INTERNAL_PIPELINE_RESULT( + fl_value_get_custom_value_object(value)), + error); + case cloud_firestore_internal_pipeline_snapshot_type_id: + return cloud_firestore_message_codec_write_cloud_firestore_internal_pipeline_snapshot( + codec, buffer, + CLOUD_FIRESTORE_INTERNAL_PIPELINE_SNAPSHOT( + fl_value_get_custom_value_object(value)), + error); + case cloud_firestore_internal_get_options_type_id: + return cloud_firestore_message_codec_write_cloud_firestore_internal_get_options( + codec, buffer, + CLOUD_FIRESTORE_INTERNAL_GET_OPTIONS( + fl_value_get_custom_value_object(value)), + error); + case cloud_firestore_internal_document_option_type_id: + return cloud_firestore_message_codec_write_cloud_firestore_internal_document_option( + codec, buffer, + CLOUD_FIRESTORE_INTERNAL_DOCUMENT_OPTION( + fl_value_get_custom_value_object(value)), + error); + case cloud_firestore_internal_transaction_command_type_id: + return cloud_firestore_message_codec_write_cloud_firestore_internal_transaction_command( + codec, buffer, + CLOUD_FIRESTORE_INTERNAL_TRANSACTION_COMMAND( + fl_value_get_custom_value_object(value)), + error); + case cloud_firestore_document_reference_request_type_id: + return cloud_firestore_message_codec_write_cloud_firestore_document_reference_request( + codec, buffer, + CLOUD_FIRESTORE_DOCUMENT_REFERENCE_REQUEST( + fl_value_get_custom_value_object(value)), + error); + case cloud_firestore_internal_query_parameters_type_id: + return cloud_firestore_message_codec_write_cloud_firestore_internal_query_parameters( + codec, buffer, + CLOUD_FIRESTORE_INTERNAL_QUERY_PARAMETERS( + fl_value_get_custom_value_object(value)), + error); + case cloud_firestore_aggregate_query_type_id: + return cloud_firestore_message_codec_write_cloud_firestore_aggregate_query( + codec, buffer, + CLOUD_FIRESTORE_AGGREGATE_QUERY( + fl_value_get_custom_value_object(value)), + error); + case cloud_firestore_aggregate_query_response_type_id: + return cloud_firestore_message_codec_write_cloud_firestore_aggregate_query_response( + codec, buffer, + CLOUD_FIRESTORE_AGGREGATE_QUERY_RESPONSE( + fl_value_get_custom_value_object(value)), + error); + } + } + + // Modified from the generated fallback (which chains to the parent class): + // delegate unknown types to the Firestore codec, mirroring how the Windows + // generated codec extends cloud_firestore_windows::FirestoreCodec. + return firestore_codec_write_value(codec, buffer, value, error); +} + +static FlValue* +cloud_firestore_message_codec_read_cloud_firestore_document_change_type( + FlStandardMessageCodec* codec, GBytes* buffer, size_t* offset, + GError** error) { + return fl_value_new_custom( + cloud_firestore_document_change_type_type_id, + fl_standard_message_codec_read_value(codec, buffer, offset, error), + (GDestroyNotify)fl_value_unref); +} + +static FlValue* cloud_firestore_message_codec_read_cloud_firestore_source( + FlStandardMessageCodec* codec, GBytes* buffer, size_t* offset, + GError** error) { + return fl_value_new_custom( + cloud_firestore_source_type_id, + fl_standard_message_codec_read_value(codec, buffer, offset, error), + (GDestroyNotify)fl_value_unref); +} + +static FlValue* +cloud_firestore_message_codec_read_cloud_firestore_listen_source( + FlStandardMessageCodec* codec, GBytes* buffer, size_t* offset, + GError** error) { + return fl_value_new_custom( + cloud_firestore_listen_source_type_id, + fl_standard_message_codec_read_value(codec, buffer, offset, error), + (GDestroyNotify)fl_value_unref); +} + +static FlValue* +cloud_firestore_message_codec_read_cloud_firestore_server_timestamp_behavior( + FlStandardMessageCodec* codec, GBytes* buffer, size_t* offset, + GError** error) { + return fl_value_new_custom( + cloud_firestore_server_timestamp_behavior_type_id, + fl_standard_message_codec_read_value(codec, buffer, offset, error), + (GDestroyNotify)fl_value_unref); +} + +static FlValue* +cloud_firestore_message_codec_read_cloud_firestore_aggregate_source( + FlStandardMessageCodec* codec, GBytes* buffer, size_t* offset, + GError** error) { + return fl_value_new_custom( + cloud_firestore_aggregate_source_type_id, + fl_standard_message_codec_read_value(codec, buffer, offset, error), + (GDestroyNotify)fl_value_unref); +} + +static FlValue* +cloud_firestore_message_codec_read_cloud_firestore_persistence_cache_index_manager_request( + FlStandardMessageCodec* codec, GBytes* buffer, size_t* offset, + GError** error) { + return fl_value_new_custom( + cloud_firestore_persistence_cache_index_manager_request_type_id, + fl_standard_message_codec_read_value(codec, buffer, offset, error), + (GDestroyNotify)fl_value_unref); +} + +static FlValue* +cloud_firestore_message_codec_read_cloud_firestore_internal_transaction_result( + FlStandardMessageCodec* codec, GBytes* buffer, size_t* offset, + GError** error) { + return fl_value_new_custom( + cloud_firestore_internal_transaction_result_type_id, + fl_standard_message_codec_read_value(codec, buffer, offset, error), + (GDestroyNotify)fl_value_unref); +} + +static FlValue* +cloud_firestore_message_codec_read_cloud_firestore_internal_transaction_type( + FlStandardMessageCodec* codec, GBytes* buffer, size_t* offset, + GError** error) { + return fl_value_new_custom( + cloud_firestore_internal_transaction_type_type_id, + fl_standard_message_codec_read_value(codec, buffer, offset, error), + (GDestroyNotify)fl_value_unref); +} + +static FlValue* +cloud_firestore_message_codec_read_cloud_firestore_aggregate_type( + FlStandardMessageCodec* codec, GBytes* buffer, size_t* offset, + GError** error) { + return fl_value_new_custom( + cloud_firestore_aggregate_type_type_id, + fl_standard_message_codec_read_value(codec, buffer, offset, error), + (GDestroyNotify)fl_value_unref); +} + +static FlValue* +cloud_firestore_message_codec_read_cloud_firestore_internal_firebase_settings( + FlStandardMessageCodec* codec, GBytes* buffer, size_t* offset, + GError** error) { + g_autoptr(FlValue) values = + fl_standard_message_codec_read_value(codec, buffer, offset, error); + if (values == nullptr) { + return nullptr; + } + + g_autoptr(CloudFirestoreInternalFirebaseSettings) value = + cloud_firestore_internal_firebase_settings_new_from_list(values); + if (value == nullptr) { + g_set_error(error, FL_MESSAGE_CODEC_ERROR, FL_MESSAGE_CODEC_ERROR_FAILED, + "Invalid data received for MessageData"); + return nullptr; + } + + return fl_value_new_custom_object( + cloud_firestore_internal_firebase_settings_type_id, G_OBJECT(value)); +} + +static FlValue* +cloud_firestore_message_codec_read_cloud_firestore_firestore_pigeon_firebase_app( + FlStandardMessageCodec* codec, GBytes* buffer, size_t* offset, + GError** error) { + g_autoptr(FlValue) values = + fl_standard_message_codec_read_value(codec, buffer, offset, error); + if (values == nullptr) { + return nullptr; + } + + g_autoptr(CloudFirestoreFirestorePigeonFirebaseApp) value = + cloud_firestore_firestore_pigeon_firebase_app_new_from_list(values); + if (value == nullptr) { + g_set_error(error, FL_MESSAGE_CODEC_ERROR, FL_MESSAGE_CODEC_ERROR_FAILED, + "Invalid data received for MessageData"); + return nullptr; + } + + return fl_value_new_custom_object( + cloud_firestore_firestore_pigeon_firebase_app_type_id, G_OBJECT(value)); +} + +static FlValue* +cloud_firestore_message_codec_read_cloud_firestore_internal_snapshot_metadata( + FlStandardMessageCodec* codec, GBytes* buffer, size_t* offset, + GError** error) { + g_autoptr(FlValue) values = + fl_standard_message_codec_read_value(codec, buffer, offset, error); + if (values == nullptr) { + return nullptr; + } + + g_autoptr(CloudFirestoreInternalSnapshotMetadata) value = + cloud_firestore_internal_snapshot_metadata_new_from_list(values); + if (value == nullptr) { + g_set_error(error, FL_MESSAGE_CODEC_ERROR, FL_MESSAGE_CODEC_ERROR_FAILED, + "Invalid data received for MessageData"); + return nullptr; + } + + return fl_value_new_custom_object( + cloud_firestore_internal_snapshot_metadata_type_id, G_OBJECT(value)); +} + +static FlValue* +cloud_firestore_message_codec_read_cloud_firestore_internal_document_snapshot( + FlStandardMessageCodec* codec, GBytes* buffer, size_t* offset, + GError** error) { + g_autoptr(FlValue) values = + fl_standard_message_codec_read_value(codec, buffer, offset, error); + if (values == nullptr) { + return nullptr; + } + + g_autoptr(CloudFirestoreInternalDocumentSnapshot) value = + cloud_firestore_internal_document_snapshot_new_from_list(values); + if (value == nullptr) { + g_set_error(error, FL_MESSAGE_CODEC_ERROR, FL_MESSAGE_CODEC_ERROR_FAILED, + "Invalid data received for MessageData"); + return nullptr; + } + + return fl_value_new_custom_object( + cloud_firestore_internal_document_snapshot_type_id, G_OBJECT(value)); +} + +static FlValue* +cloud_firestore_message_codec_read_cloud_firestore_internal_document_change( + FlStandardMessageCodec* codec, GBytes* buffer, size_t* offset, + GError** error) { + g_autoptr(FlValue) values = + fl_standard_message_codec_read_value(codec, buffer, offset, error); + if (values == nullptr) { + return nullptr; + } + + g_autoptr(CloudFirestoreInternalDocumentChange) value = + cloud_firestore_internal_document_change_new_from_list(values); + if (value == nullptr) { + g_set_error(error, FL_MESSAGE_CODEC_ERROR, FL_MESSAGE_CODEC_ERROR_FAILED, + "Invalid data received for MessageData"); + return nullptr; + } + + return fl_value_new_custom_object( + cloud_firestore_internal_document_change_type_id, G_OBJECT(value)); +} + +static FlValue* +cloud_firestore_message_codec_read_cloud_firestore_internal_query_snapshot( + FlStandardMessageCodec* codec, GBytes* buffer, size_t* offset, + GError** error) { + g_autoptr(FlValue) values = + fl_standard_message_codec_read_value(codec, buffer, offset, error); + if (values == nullptr) { + return nullptr; + } + + g_autoptr(CloudFirestoreInternalQuerySnapshot) value = + cloud_firestore_internal_query_snapshot_new_from_list(values); + if (value == nullptr) { + g_set_error(error, FL_MESSAGE_CODEC_ERROR, FL_MESSAGE_CODEC_ERROR_FAILED, + "Invalid data received for MessageData"); + return nullptr; + } + + return fl_value_new_custom_object( + cloud_firestore_internal_query_snapshot_type_id, G_OBJECT(value)); +} + +static FlValue* +cloud_firestore_message_codec_read_cloud_firestore_internal_pipeline_result( + FlStandardMessageCodec* codec, GBytes* buffer, size_t* offset, + GError** error) { + g_autoptr(FlValue) values = + fl_standard_message_codec_read_value(codec, buffer, offset, error); + if (values == nullptr) { + return nullptr; + } + + g_autoptr(CloudFirestoreInternalPipelineResult) value = + cloud_firestore_internal_pipeline_result_new_from_list(values); + if (value == nullptr) { + g_set_error(error, FL_MESSAGE_CODEC_ERROR, FL_MESSAGE_CODEC_ERROR_FAILED, + "Invalid data received for MessageData"); + return nullptr; + } + + return fl_value_new_custom_object( + cloud_firestore_internal_pipeline_result_type_id, G_OBJECT(value)); +} + +static FlValue* +cloud_firestore_message_codec_read_cloud_firestore_internal_pipeline_snapshot( + FlStandardMessageCodec* codec, GBytes* buffer, size_t* offset, + GError** error) { + g_autoptr(FlValue) values = + fl_standard_message_codec_read_value(codec, buffer, offset, error); + if (values == nullptr) { + return nullptr; + } + + g_autoptr(CloudFirestoreInternalPipelineSnapshot) value = + cloud_firestore_internal_pipeline_snapshot_new_from_list(values); + if (value == nullptr) { + g_set_error(error, FL_MESSAGE_CODEC_ERROR, FL_MESSAGE_CODEC_ERROR_FAILED, + "Invalid data received for MessageData"); + return nullptr; + } + + return fl_value_new_custom_object( + cloud_firestore_internal_pipeline_snapshot_type_id, G_OBJECT(value)); +} + +static FlValue* +cloud_firestore_message_codec_read_cloud_firestore_internal_get_options( + FlStandardMessageCodec* codec, GBytes* buffer, size_t* offset, + GError** error) { + g_autoptr(FlValue) values = + fl_standard_message_codec_read_value(codec, buffer, offset, error); + if (values == nullptr) { + return nullptr; + } + + g_autoptr(CloudFirestoreInternalGetOptions) value = + cloud_firestore_internal_get_options_new_from_list(values); + if (value == nullptr) { + g_set_error(error, FL_MESSAGE_CODEC_ERROR, FL_MESSAGE_CODEC_ERROR_FAILED, + "Invalid data received for MessageData"); + return nullptr; + } + + return fl_value_new_custom_object( + cloud_firestore_internal_get_options_type_id, G_OBJECT(value)); +} + +static FlValue* +cloud_firestore_message_codec_read_cloud_firestore_internal_document_option( + FlStandardMessageCodec* codec, GBytes* buffer, size_t* offset, + GError** error) { + g_autoptr(FlValue) values = + fl_standard_message_codec_read_value(codec, buffer, offset, error); + if (values == nullptr) { + return nullptr; + } + + g_autoptr(CloudFirestoreInternalDocumentOption) value = + cloud_firestore_internal_document_option_new_from_list(values); + if (value == nullptr) { + g_set_error(error, FL_MESSAGE_CODEC_ERROR, FL_MESSAGE_CODEC_ERROR_FAILED, + "Invalid data received for MessageData"); + return nullptr; + } + + return fl_value_new_custom_object( + cloud_firestore_internal_document_option_type_id, G_OBJECT(value)); +} + +static FlValue* +cloud_firestore_message_codec_read_cloud_firestore_internal_transaction_command( + FlStandardMessageCodec* codec, GBytes* buffer, size_t* offset, + GError** error) { + g_autoptr(FlValue) values = + fl_standard_message_codec_read_value(codec, buffer, offset, error); + if (values == nullptr) { + return nullptr; + } + + g_autoptr(CloudFirestoreInternalTransactionCommand) value = + cloud_firestore_internal_transaction_command_new_from_list(values); + if (value == nullptr) { + g_set_error(error, FL_MESSAGE_CODEC_ERROR, FL_MESSAGE_CODEC_ERROR_FAILED, + "Invalid data received for MessageData"); + return nullptr; + } + + return fl_value_new_custom_object( + cloud_firestore_internal_transaction_command_type_id, G_OBJECT(value)); +} + +static FlValue* +cloud_firestore_message_codec_read_cloud_firestore_document_reference_request( + FlStandardMessageCodec* codec, GBytes* buffer, size_t* offset, + GError** error) { + g_autoptr(FlValue) values = + fl_standard_message_codec_read_value(codec, buffer, offset, error); + if (values == nullptr) { + return nullptr; + } + + g_autoptr(CloudFirestoreDocumentReferenceRequest) value = + cloud_firestore_document_reference_request_new_from_list(values); + if (value == nullptr) { + g_set_error(error, FL_MESSAGE_CODEC_ERROR, FL_MESSAGE_CODEC_ERROR_FAILED, + "Invalid data received for MessageData"); + return nullptr; + } + + return fl_value_new_custom_object( + cloud_firestore_document_reference_request_type_id, G_OBJECT(value)); +} + +static FlValue* +cloud_firestore_message_codec_read_cloud_firestore_internal_query_parameters( + FlStandardMessageCodec* codec, GBytes* buffer, size_t* offset, + GError** error) { + g_autoptr(FlValue) values = + fl_standard_message_codec_read_value(codec, buffer, offset, error); + if (values == nullptr) { + return nullptr; + } + + g_autoptr(CloudFirestoreInternalQueryParameters) value = + cloud_firestore_internal_query_parameters_new_from_list(values); + if (value == nullptr) { + g_set_error(error, FL_MESSAGE_CODEC_ERROR, FL_MESSAGE_CODEC_ERROR_FAILED, + "Invalid data received for MessageData"); + return nullptr; + } + + return fl_value_new_custom_object( + cloud_firestore_internal_query_parameters_type_id, G_OBJECT(value)); +} + +static FlValue* +cloud_firestore_message_codec_read_cloud_firestore_aggregate_query( + FlStandardMessageCodec* codec, GBytes* buffer, size_t* offset, + GError** error) { + g_autoptr(FlValue) values = + fl_standard_message_codec_read_value(codec, buffer, offset, error); + if (values == nullptr) { + return nullptr; + } + + g_autoptr(CloudFirestoreAggregateQuery) value = + cloud_firestore_aggregate_query_new_from_list(values); + if (value == nullptr) { + g_set_error(error, FL_MESSAGE_CODEC_ERROR, FL_MESSAGE_CODEC_ERROR_FAILED, + "Invalid data received for MessageData"); + return nullptr; + } + + return fl_value_new_custom_object(cloud_firestore_aggregate_query_type_id, + G_OBJECT(value)); +} + +static FlValue* +cloud_firestore_message_codec_read_cloud_firestore_aggregate_query_response( + FlStandardMessageCodec* codec, GBytes* buffer, size_t* offset, + GError** error) { + g_autoptr(FlValue) values = + fl_standard_message_codec_read_value(codec, buffer, offset, error); + if (values == nullptr) { + return nullptr; + } + + g_autoptr(CloudFirestoreAggregateQueryResponse) value = + cloud_firestore_aggregate_query_response_new_from_list(values); + if (value == nullptr) { + g_set_error(error, FL_MESSAGE_CODEC_ERROR, FL_MESSAGE_CODEC_ERROR_FAILED, + "Invalid data received for MessageData"); + return nullptr; + } + + return fl_value_new_custom_object( + cloud_firestore_aggregate_query_response_type_id, G_OBJECT(value)); +} + +static FlValue* cloud_firestore_message_codec_read_value_of_type( + FlStandardMessageCodec* codec, GBytes* buffer, size_t* offset, int type, + GError** error) { + switch (type) { + case cloud_firestore_document_change_type_type_id: + return cloud_firestore_message_codec_read_cloud_firestore_document_change_type( + codec, buffer, offset, error); + case cloud_firestore_source_type_id: + return cloud_firestore_message_codec_read_cloud_firestore_source( + codec, buffer, offset, error); + case cloud_firestore_listen_source_type_id: + return cloud_firestore_message_codec_read_cloud_firestore_listen_source( + codec, buffer, offset, error); + case cloud_firestore_server_timestamp_behavior_type_id: + return cloud_firestore_message_codec_read_cloud_firestore_server_timestamp_behavior( + codec, buffer, offset, error); + case cloud_firestore_aggregate_source_type_id: + return cloud_firestore_message_codec_read_cloud_firestore_aggregate_source( + codec, buffer, offset, error); + case cloud_firestore_persistence_cache_index_manager_request_type_id: + return cloud_firestore_message_codec_read_cloud_firestore_persistence_cache_index_manager_request( + codec, buffer, offset, error); + case cloud_firestore_internal_transaction_result_type_id: + return cloud_firestore_message_codec_read_cloud_firestore_internal_transaction_result( + codec, buffer, offset, error); + case cloud_firestore_internal_transaction_type_type_id: + return cloud_firestore_message_codec_read_cloud_firestore_internal_transaction_type( + codec, buffer, offset, error); + case cloud_firestore_aggregate_type_type_id: + return cloud_firestore_message_codec_read_cloud_firestore_aggregate_type( + codec, buffer, offset, error); + case cloud_firestore_internal_firebase_settings_type_id: + return cloud_firestore_message_codec_read_cloud_firestore_internal_firebase_settings( + codec, buffer, offset, error); + case cloud_firestore_firestore_pigeon_firebase_app_type_id: + return cloud_firestore_message_codec_read_cloud_firestore_firestore_pigeon_firebase_app( + codec, buffer, offset, error); + case cloud_firestore_internal_snapshot_metadata_type_id: + return cloud_firestore_message_codec_read_cloud_firestore_internal_snapshot_metadata( + codec, buffer, offset, error); + case cloud_firestore_internal_document_snapshot_type_id: + return cloud_firestore_message_codec_read_cloud_firestore_internal_document_snapshot( + codec, buffer, offset, error); + case cloud_firestore_internal_document_change_type_id: + return cloud_firestore_message_codec_read_cloud_firestore_internal_document_change( + codec, buffer, offset, error); + case cloud_firestore_internal_query_snapshot_type_id: + return cloud_firestore_message_codec_read_cloud_firestore_internal_query_snapshot( + codec, buffer, offset, error); + case cloud_firestore_internal_pipeline_result_type_id: + return cloud_firestore_message_codec_read_cloud_firestore_internal_pipeline_result( + codec, buffer, offset, error); + case cloud_firestore_internal_pipeline_snapshot_type_id: + return cloud_firestore_message_codec_read_cloud_firestore_internal_pipeline_snapshot( + codec, buffer, offset, error); + case cloud_firestore_internal_get_options_type_id: + return cloud_firestore_message_codec_read_cloud_firestore_internal_get_options( + codec, buffer, offset, error); + case cloud_firestore_internal_document_option_type_id: + return cloud_firestore_message_codec_read_cloud_firestore_internal_document_option( + codec, buffer, offset, error); + case cloud_firestore_internal_transaction_command_type_id: + return cloud_firestore_message_codec_read_cloud_firestore_internal_transaction_command( + codec, buffer, offset, error); + case cloud_firestore_document_reference_request_type_id: + return cloud_firestore_message_codec_read_cloud_firestore_document_reference_request( + codec, buffer, offset, error); + case cloud_firestore_internal_query_parameters_type_id: + return cloud_firestore_message_codec_read_cloud_firestore_internal_query_parameters( + codec, buffer, offset, error); + case cloud_firestore_aggregate_query_type_id: + return cloud_firestore_message_codec_read_cloud_firestore_aggregate_query( + codec, buffer, offset, error); + case cloud_firestore_aggregate_query_response_type_id: + return cloud_firestore_message_codec_read_cloud_firestore_aggregate_query_response( + codec, buffer, offset, error); + default: + // Modified from the generated fallback (which chains to the parent + // class): delegate unknown types to the Firestore codec, mirroring how + // the Windows generated codec extends + // cloud_firestore_windows::FirestoreCodec. + return firestore_codec_read_value_of_type(codec, buffer, offset, type, + error); + } +} + +static void cloud_firestore_message_codec_init( + CloudFirestoreMessageCodec* self) {} + +static void cloud_firestore_message_codec_class_init( + CloudFirestoreMessageCodecClass* klass) { + FL_STANDARD_MESSAGE_CODEC_CLASS(klass)->write_value = + cloud_firestore_message_codec_write_value; + FL_STANDARD_MESSAGE_CODEC_CLASS(klass)->read_value_of_type = + cloud_firestore_message_codec_read_value_of_type; +} + +// Modified from the generated code: made non-static (and declared in +// messages.g.h) so the plugin can attach this codec to Firestore event +// channels, mirroring FirebaseFirestoreHostApiCodecSerializer::GetInstance() +// on Windows. +CloudFirestoreMessageCodec* cloud_firestore_message_codec_new() { + CloudFirestoreMessageCodec* self = CLOUD_FIRESTORE_MESSAGE_CODEC( + g_object_new(cloud_firestore_message_codec_get_type(), nullptr)); + return self; +} + +struct _CloudFirestoreFirebaseFirestoreHostApiResponseHandle { + GObject parent_instance; + + FlBasicMessageChannel* channel; + FlBasicMessageChannelResponseHandle* response_handle; +}; + +G_DEFINE_TYPE(CloudFirestoreFirebaseFirestoreHostApiResponseHandle, + cloud_firestore_firebase_firestore_host_api_response_handle, + G_TYPE_OBJECT) + +static void cloud_firestore_firebase_firestore_host_api_response_handle_dispose( + GObject* object) { + CloudFirestoreFirebaseFirestoreHostApiResponseHandle* self = + CLOUD_FIRESTORE_FIREBASE_FIRESTORE_HOST_API_RESPONSE_HANDLE(object); + g_clear_object(&self->channel); + g_clear_object(&self->response_handle); + G_OBJECT_CLASS( + cloud_firestore_firebase_firestore_host_api_response_handle_parent_class) + ->dispose(object); +} + +static void cloud_firestore_firebase_firestore_host_api_response_handle_init( + CloudFirestoreFirebaseFirestoreHostApiResponseHandle* self) {} + +static void +cloud_firestore_firebase_firestore_host_api_response_handle_class_init( + CloudFirestoreFirebaseFirestoreHostApiResponseHandleClass* klass) { + G_OBJECT_CLASS(klass)->dispose = + cloud_firestore_firebase_firestore_host_api_response_handle_dispose; +} + +static CloudFirestoreFirebaseFirestoreHostApiResponseHandle* +cloud_firestore_firebase_firestore_host_api_response_handle_new( + FlBasicMessageChannel* channel, + FlBasicMessageChannelResponseHandle* response_handle) { + CloudFirestoreFirebaseFirestoreHostApiResponseHandle* self = + CLOUD_FIRESTORE_FIREBASE_FIRESTORE_HOST_API_RESPONSE_HANDLE(g_object_new( + cloud_firestore_firebase_firestore_host_api_response_handle_get_type(), + nullptr)); + self->channel = FL_BASIC_MESSAGE_CHANNEL(g_object_ref(channel)); + self->response_handle = + FL_BASIC_MESSAGE_CHANNEL_RESPONSE_HANDLE(g_object_ref(response_handle)); + return self; +} + +G_DECLARE_FINAL_TYPE( + CloudFirestoreFirebaseFirestoreHostApiLoadBundleResponse, + cloud_firestore_firebase_firestore_host_api_load_bundle_response, + CLOUD_FIRESTORE, FIREBASE_FIRESTORE_HOST_API_LOAD_BUNDLE_RESPONSE, GObject) + +struct _CloudFirestoreFirebaseFirestoreHostApiLoadBundleResponse { + GObject parent_instance; + + FlValue* value; +}; + +G_DEFINE_TYPE(CloudFirestoreFirebaseFirestoreHostApiLoadBundleResponse, + cloud_firestore_firebase_firestore_host_api_load_bundle_response, + G_TYPE_OBJECT) + +static void +cloud_firestore_firebase_firestore_host_api_load_bundle_response_dispose( + GObject* object) { + CloudFirestoreFirebaseFirestoreHostApiLoadBundleResponse* self = + CLOUD_FIRESTORE_FIREBASE_FIRESTORE_HOST_API_LOAD_BUNDLE_RESPONSE(object); + g_clear_pointer(&self->value, fl_value_unref); + G_OBJECT_CLASS( + cloud_firestore_firebase_firestore_host_api_load_bundle_response_parent_class) + ->dispose(object); +} + +static void +cloud_firestore_firebase_firestore_host_api_load_bundle_response_init( + CloudFirestoreFirebaseFirestoreHostApiLoadBundleResponse* self) {} + +static void +cloud_firestore_firebase_firestore_host_api_load_bundle_response_class_init( + CloudFirestoreFirebaseFirestoreHostApiLoadBundleResponseClass* klass) { + G_OBJECT_CLASS(klass)->dispose = + cloud_firestore_firebase_firestore_host_api_load_bundle_response_dispose; +} + +static CloudFirestoreFirebaseFirestoreHostApiLoadBundleResponse* +cloud_firestore_firebase_firestore_host_api_load_bundle_response_new( + const gchar* return_value) { + CloudFirestoreFirebaseFirestoreHostApiLoadBundleResponse* self = + CLOUD_FIRESTORE_FIREBASE_FIRESTORE_HOST_API_LOAD_BUNDLE_RESPONSE(g_object_new( + cloud_firestore_firebase_firestore_host_api_load_bundle_response_get_type(), + nullptr)); + self->value = fl_value_new_list(); + fl_value_append_take(self->value, fl_value_new_string(return_value)); + return self; +} + +static CloudFirestoreFirebaseFirestoreHostApiLoadBundleResponse* +cloud_firestore_firebase_firestore_host_api_load_bundle_response_new_error( + const gchar* code, const gchar* message, FlValue* details) { + CloudFirestoreFirebaseFirestoreHostApiLoadBundleResponse* self = + CLOUD_FIRESTORE_FIREBASE_FIRESTORE_HOST_API_LOAD_BUNDLE_RESPONSE(g_object_new( + cloud_firestore_firebase_firestore_host_api_load_bundle_response_get_type(), + nullptr)); + self->value = fl_value_new_list(); + fl_value_append_take(self->value, fl_value_new_string(code)); + fl_value_append_take(self->value, + fl_value_new_string(message != nullptr ? message : "")); + fl_value_append_take(self->value, details != nullptr ? fl_value_ref(details) + : fl_value_new_null()); + return self; +} + +G_DECLARE_FINAL_TYPE( + CloudFirestoreFirebaseFirestoreHostApiNamedQueryGetResponse, + cloud_firestore_firebase_firestore_host_api_named_query_get_response, + CLOUD_FIRESTORE, FIREBASE_FIRESTORE_HOST_API_NAMED_QUERY_GET_RESPONSE, + GObject) + +struct _CloudFirestoreFirebaseFirestoreHostApiNamedQueryGetResponse { + GObject parent_instance; + + FlValue* value; +}; + +G_DEFINE_TYPE( + CloudFirestoreFirebaseFirestoreHostApiNamedQueryGetResponse, + cloud_firestore_firebase_firestore_host_api_named_query_get_response, + G_TYPE_OBJECT) + +static void +cloud_firestore_firebase_firestore_host_api_named_query_get_response_dispose( + GObject* object) { + CloudFirestoreFirebaseFirestoreHostApiNamedQueryGetResponse* self = + CLOUD_FIRESTORE_FIREBASE_FIRESTORE_HOST_API_NAMED_QUERY_GET_RESPONSE( + object); + g_clear_pointer(&self->value, fl_value_unref); + G_OBJECT_CLASS( + cloud_firestore_firebase_firestore_host_api_named_query_get_response_parent_class) + ->dispose(object); +} + +static void +cloud_firestore_firebase_firestore_host_api_named_query_get_response_init( + CloudFirestoreFirebaseFirestoreHostApiNamedQueryGetResponse* self) {} + +static void +cloud_firestore_firebase_firestore_host_api_named_query_get_response_class_init( + CloudFirestoreFirebaseFirestoreHostApiNamedQueryGetResponseClass* klass) { + G_OBJECT_CLASS(klass)->dispose = + cloud_firestore_firebase_firestore_host_api_named_query_get_response_dispose; +} + +static CloudFirestoreFirebaseFirestoreHostApiNamedQueryGetResponse* +cloud_firestore_firebase_firestore_host_api_named_query_get_response_new( + CloudFirestoreInternalQuerySnapshot* return_value) { + CloudFirestoreFirebaseFirestoreHostApiNamedQueryGetResponse* self = + CLOUD_FIRESTORE_FIREBASE_FIRESTORE_HOST_API_NAMED_QUERY_GET_RESPONSE(g_object_new( + cloud_firestore_firebase_firestore_host_api_named_query_get_response_get_type(), + nullptr)); + self->value = fl_value_new_list(); + fl_value_append_take(self->value, + fl_value_new_custom_object( + cloud_firestore_internal_query_snapshot_type_id, + G_OBJECT(return_value))); + return self; +} + +static CloudFirestoreFirebaseFirestoreHostApiNamedQueryGetResponse* +cloud_firestore_firebase_firestore_host_api_named_query_get_response_new_error( + const gchar* code, const gchar* message, FlValue* details) { + CloudFirestoreFirebaseFirestoreHostApiNamedQueryGetResponse* self = + CLOUD_FIRESTORE_FIREBASE_FIRESTORE_HOST_API_NAMED_QUERY_GET_RESPONSE(g_object_new( + cloud_firestore_firebase_firestore_host_api_named_query_get_response_get_type(), + nullptr)); + self->value = fl_value_new_list(); + fl_value_append_take(self->value, fl_value_new_string(code)); + fl_value_append_take(self->value, + fl_value_new_string(message != nullptr ? message : "")); + fl_value_append_take(self->value, details != nullptr ? fl_value_ref(details) + : fl_value_new_null()); + return self; +} + +G_DECLARE_FINAL_TYPE( + CloudFirestoreFirebaseFirestoreHostApiClearPersistenceResponse, + cloud_firestore_firebase_firestore_host_api_clear_persistence_response, + CLOUD_FIRESTORE, FIREBASE_FIRESTORE_HOST_API_CLEAR_PERSISTENCE_RESPONSE, + GObject) + +struct _CloudFirestoreFirebaseFirestoreHostApiClearPersistenceResponse { + GObject parent_instance; + + FlValue* value; +}; + +G_DEFINE_TYPE( + CloudFirestoreFirebaseFirestoreHostApiClearPersistenceResponse, + cloud_firestore_firebase_firestore_host_api_clear_persistence_response, + G_TYPE_OBJECT) + +static void +cloud_firestore_firebase_firestore_host_api_clear_persistence_response_dispose( + GObject* object) { + CloudFirestoreFirebaseFirestoreHostApiClearPersistenceResponse* self = + CLOUD_FIRESTORE_FIREBASE_FIRESTORE_HOST_API_CLEAR_PERSISTENCE_RESPONSE( + object); + g_clear_pointer(&self->value, fl_value_unref); + G_OBJECT_CLASS( + cloud_firestore_firebase_firestore_host_api_clear_persistence_response_parent_class) + ->dispose(object); +} + +static void +cloud_firestore_firebase_firestore_host_api_clear_persistence_response_init( + CloudFirestoreFirebaseFirestoreHostApiClearPersistenceResponse* self) {} + +static void +cloud_firestore_firebase_firestore_host_api_clear_persistence_response_class_init( + CloudFirestoreFirebaseFirestoreHostApiClearPersistenceResponseClass* + klass) { + G_OBJECT_CLASS(klass)->dispose = + cloud_firestore_firebase_firestore_host_api_clear_persistence_response_dispose; +} + +static CloudFirestoreFirebaseFirestoreHostApiClearPersistenceResponse* +cloud_firestore_firebase_firestore_host_api_clear_persistence_response_new() { + CloudFirestoreFirebaseFirestoreHostApiClearPersistenceResponse* self = + CLOUD_FIRESTORE_FIREBASE_FIRESTORE_HOST_API_CLEAR_PERSISTENCE_RESPONSE( + g_object_new( + cloud_firestore_firebase_firestore_host_api_clear_persistence_response_get_type(), + nullptr)); + self->value = fl_value_new_list(); + fl_value_append_take(self->value, fl_value_new_null()); + return self; +} + +static CloudFirestoreFirebaseFirestoreHostApiClearPersistenceResponse* +cloud_firestore_firebase_firestore_host_api_clear_persistence_response_new_error( + const gchar* code, const gchar* message, FlValue* details) { + CloudFirestoreFirebaseFirestoreHostApiClearPersistenceResponse* self = + CLOUD_FIRESTORE_FIREBASE_FIRESTORE_HOST_API_CLEAR_PERSISTENCE_RESPONSE( + g_object_new( + cloud_firestore_firebase_firestore_host_api_clear_persistence_response_get_type(), + nullptr)); + self->value = fl_value_new_list(); + fl_value_append_take(self->value, fl_value_new_string(code)); + fl_value_append_take(self->value, + fl_value_new_string(message != nullptr ? message : "")); + fl_value_append_take(self->value, details != nullptr ? fl_value_ref(details) + : fl_value_new_null()); + return self; +} + +G_DECLARE_FINAL_TYPE( + CloudFirestoreFirebaseFirestoreHostApiDisableNetworkResponse, + cloud_firestore_firebase_firestore_host_api_disable_network_response, + CLOUD_FIRESTORE, FIREBASE_FIRESTORE_HOST_API_DISABLE_NETWORK_RESPONSE, + GObject) + +struct _CloudFirestoreFirebaseFirestoreHostApiDisableNetworkResponse { + GObject parent_instance; + + FlValue* value; +}; + +G_DEFINE_TYPE( + CloudFirestoreFirebaseFirestoreHostApiDisableNetworkResponse, + cloud_firestore_firebase_firestore_host_api_disable_network_response, + G_TYPE_OBJECT) + +static void +cloud_firestore_firebase_firestore_host_api_disable_network_response_dispose( + GObject* object) { + CloudFirestoreFirebaseFirestoreHostApiDisableNetworkResponse* self = + CLOUD_FIRESTORE_FIREBASE_FIRESTORE_HOST_API_DISABLE_NETWORK_RESPONSE( + object); + g_clear_pointer(&self->value, fl_value_unref); + G_OBJECT_CLASS( + cloud_firestore_firebase_firestore_host_api_disable_network_response_parent_class) + ->dispose(object); +} + +static void +cloud_firestore_firebase_firestore_host_api_disable_network_response_init( + CloudFirestoreFirebaseFirestoreHostApiDisableNetworkResponse* self) {} + +static void +cloud_firestore_firebase_firestore_host_api_disable_network_response_class_init( + CloudFirestoreFirebaseFirestoreHostApiDisableNetworkResponseClass* klass) { + G_OBJECT_CLASS(klass)->dispose = + cloud_firestore_firebase_firestore_host_api_disable_network_response_dispose; +} + +static CloudFirestoreFirebaseFirestoreHostApiDisableNetworkResponse* +cloud_firestore_firebase_firestore_host_api_disable_network_response_new() { + CloudFirestoreFirebaseFirestoreHostApiDisableNetworkResponse* self = + CLOUD_FIRESTORE_FIREBASE_FIRESTORE_HOST_API_DISABLE_NETWORK_RESPONSE(g_object_new( + cloud_firestore_firebase_firestore_host_api_disable_network_response_get_type(), + nullptr)); + self->value = fl_value_new_list(); + fl_value_append_take(self->value, fl_value_new_null()); + return self; +} + +static CloudFirestoreFirebaseFirestoreHostApiDisableNetworkResponse* +cloud_firestore_firebase_firestore_host_api_disable_network_response_new_error( + const gchar* code, const gchar* message, FlValue* details) { + CloudFirestoreFirebaseFirestoreHostApiDisableNetworkResponse* self = + CLOUD_FIRESTORE_FIREBASE_FIRESTORE_HOST_API_DISABLE_NETWORK_RESPONSE(g_object_new( + cloud_firestore_firebase_firestore_host_api_disable_network_response_get_type(), + nullptr)); + self->value = fl_value_new_list(); + fl_value_append_take(self->value, fl_value_new_string(code)); + fl_value_append_take(self->value, + fl_value_new_string(message != nullptr ? message : "")); + fl_value_append_take(self->value, details != nullptr ? fl_value_ref(details) + : fl_value_new_null()); + return self; +} + +G_DECLARE_FINAL_TYPE( + CloudFirestoreFirebaseFirestoreHostApiEnableNetworkResponse, + cloud_firestore_firebase_firestore_host_api_enable_network_response, + CLOUD_FIRESTORE, FIREBASE_FIRESTORE_HOST_API_ENABLE_NETWORK_RESPONSE, + GObject) + +struct _CloudFirestoreFirebaseFirestoreHostApiEnableNetworkResponse { + GObject parent_instance; + + FlValue* value; +}; + +G_DEFINE_TYPE( + CloudFirestoreFirebaseFirestoreHostApiEnableNetworkResponse, + cloud_firestore_firebase_firestore_host_api_enable_network_response, + G_TYPE_OBJECT) + +static void +cloud_firestore_firebase_firestore_host_api_enable_network_response_dispose( + GObject* object) { + CloudFirestoreFirebaseFirestoreHostApiEnableNetworkResponse* self = + CLOUD_FIRESTORE_FIREBASE_FIRESTORE_HOST_API_ENABLE_NETWORK_RESPONSE( + object); + g_clear_pointer(&self->value, fl_value_unref); + G_OBJECT_CLASS( + cloud_firestore_firebase_firestore_host_api_enable_network_response_parent_class) + ->dispose(object); +} + +static void +cloud_firestore_firebase_firestore_host_api_enable_network_response_init( + CloudFirestoreFirebaseFirestoreHostApiEnableNetworkResponse* self) {} + +static void +cloud_firestore_firebase_firestore_host_api_enable_network_response_class_init( + CloudFirestoreFirebaseFirestoreHostApiEnableNetworkResponseClass* klass) { + G_OBJECT_CLASS(klass)->dispose = + cloud_firestore_firebase_firestore_host_api_enable_network_response_dispose; +} + +static CloudFirestoreFirebaseFirestoreHostApiEnableNetworkResponse* +cloud_firestore_firebase_firestore_host_api_enable_network_response_new() { + CloudFirestoreFirebaseFirestoreHostApiEnableNetworkResponse* self = + CLOUD_FIRESTORE_FIREBASE_FIRESTORE_HOST_API_ENABLE_NETWORK_RESPONSE(g_object_new( + cloud_firestore_firebase_firestore_host_api_enable_network_response_get_type(), + nullptr)); + self->value = fl_value_new_list(); + fl_value_append_take(self->value, fl_value_new_null()); + return self; +} + +static CloudFirestoreFirebaseFirestoreHostApiEnableNetworkResponse* +cloud_firestore_firebase_firestore_host_api_enable_network_response_new_error( + const gchar* code, const gchar* message, FlValue* details) { + CloudFirestoreFirebaseFirestoreHostApiEnableNetworkResponse* self = + CLOUD_FIRESTORE_FIREBASE_FIRESTORE_HOST_API_ENABLE_NETWORK_RESPONSE(g_object_new( + cloud_firestore_firebase_firestore_host_api_enable_network_response_get_type(), + nullptr)); + self->value = fl_value_new_list(); + fl_value_append_take(self->value, fl_value_new_string(code)); + fl_value_append_take(self->value, + fl_value_new_string(message != nullptr ? message : "")); + fl_value_append_take(self->value, details != nullptr ? fl_value_ref(details) + : fl_value_new_null()); + return self; +} + +G_DECLARE_FINAL_TYPE( + CloudFirestoreFirebaseFirestoreHostApiTerminateResponse, + cloud_firestore_firebase_firestore_host_api_terminate_response, + CLOUD_FIRESTORE, FIREBASE_FIRESTORE_HOST_API_TERMINATE_RESPONSE, GObject) + +struct _CloudFirestoreFirebaseFirestoreHostApiTerminateResponse { + GObject parent_instance; + + FlValue* value; +}; + +G_DEFINE_TYPE(CloudFirestoreFirebaseFirestoreHostApiTerminateResponse, + cloud_firestore_firebase_firestore_host_api_terminate_response, + G_TYPE_OBJECT) + +static void +cloud_firestore_firebase_firestore_host_api_terminate_response_dispose( + GObject* object) { + CloudFirestoreFirebaseFirestoreHostApiTerminateResponse* self = + CLOUD_FIRESTORE_FIREBASE_FIRESTORE_HOST_API_TERMINATE_RESPONSE(object); + g_clear_pointer(&self->value, fl_value_unref); + G_OBJECT_CLASS( + cloud_firestore_firebase_firestore_host_api_terminate_response_parent_class) + ->dispose(object); +} + +static void cloud_firestore_firebase_firestore_host_api_terminate_response_init( + CloudFirestoreFirebaseFirestoreHostApiTerminateResponse* self) {} + +static void +cloud_firestore_firebase_firestore_host_api_terminate_response_class_init( + CloudFirestoreFirebaseFirestoreHostApiTerminateResponseClass* klass) { + G_OBJECT_CLASS(klass)->dispose = + cloud_firestore_firebase_firestore_host_api_terminate_response_dispose; +} + +static CloudFirestoreFirebaseFirestoreHostApiTerminateResponse* +cloud_firestore_firebase_firestore_host_api_terminate_response_new() { + CloudFirestoreFirebaseFirestoreHostApiTerminateResponse* self = + CLOUD_FIRESTORE_FIREBASE_FIRESTORE_HOST_API_TERMINATE_RESPONSE(g_object_new( + cloud_firestore_firebase_firestore_host_api_terminate_response_get_type(), + nullptr)); + self->value = fl_value_new_list(); + fl_value_append_take(self->value, fl_value_new_null()); + return self; +} + +static CloudFirestoreFirebaseFirestoreHostApiTerminateResponse* +cloud_firestore_firebase_firestore_host_api_terminate_response_new_error( + const gchar* code, const gchar* message, FlValue* details) { + CloudFirestoreFirebaseFirestoreHostApiTerminateResponse* self = + CLOUD_FIRESTORE_FIREBASE_FIRESTORE_HOST_API_TERMINATE_RESPONSE(g_object_new( + cloud_firestore_firebase_firestore_host_api_terminate_response_get_type(), + nullptr)); + self->value = fl_value_new_list(); + fl_value_append_take(self->value, fl_value_new_string(code)); + fl_value_append_take(self->value, + fl_value_new_string(message != nullptr ? message : "")); + fl_value_append_take(self->value, details != nullptr ? fl_value_ref(details) + : fl_value_new_null()); + return self; +} + +G_DECLARE_FINAL_TYPE( + CloudFirestoreFirebaseFirestoreHostApiWaitForPendingWritesResponse, + cloud_firestore_firebase_firestore_host_api_wait_for_pending_writes_response, + CLOUD_FIRESTORE, + FIREBASE_FIRESTORE_HOST_API_WAIT_FOR_PENDING_WRITES_RESPONSE, GObject) + +struct _CloudFirestoreFirebaseFirestoreHostApiWaitForPendingWritesResponse { + GObject parent_instance; + + FlValue* value; +}; + +G_DEFINE_TYPE( + CloudFirestoreFirebaseFirestoreHostApiWaitForPendingWritesResponse, + cloud_firestore_firebase_firestore_host_api_wait_for_pending_writes_response, + G_TYPE_OBJECT) + +static void +cloud_firestore_firebase_firestore_host_api_wait_for_pending_writes_response_dispose( + GObject* object) { + CloudFirestoreFirebaseFirestoreHostApiWaitForPendingWritesResponse* self = + CLOUD_FIRESTORE_FIREBASE_FIRESTORE_HOST_API_WAIT_FOR_PENDING_WRITES_RESPONSE( + object); + g_clear_pointer(&self->value, fl_value_unref); + G_OBJECT_CLASS( + cloud_firestore_firebase_firestore_host_api_wait_for_pending_writes_response_parent_class) + ->dispose(object); +} + +static void +cloud_firestore_firebase_firestore_host_api_wait_for_pending_writes_response_init( + CloudFirestoreFirebaseFirestoreHostApiWaitForPendingWritesResponse* self) {} + +static void +cloud_firestore_firebase_firestore_host_api_wait_for_pending_writes_response_class_init( + CloudFirestoreFirebaseFirestoreHostApiWaitForPendingWritesResponseClass* + klass) { + G_OBJECT_CLASS(klass)->dispose = + cloud_firestore_firebase_firestore_host_api_wait_for_pending_writes_response_dispose; +} + +static CloudFirestoreFirebaseFirestoreHostApiWaitForPendingWritesResponse* +cloud_firestore_firebase_firestore_host_api_wait_for_pending_writes_response_new() { + CloudFirestoreFirebaseFirestoreHostApiWaitForPendingWritesResponse* self = + CLOUD_FIRESTORE_FIREBASE_FIRESTORE_HOST_API_WAIT_FOR_PENDING_WRITES_RESPONSE( + g_object_new( + cloud_firestore_firebase_firestore_host_api_wait_for_pending_writes_response_get_type(), + nullptr)); + self->value = fl_value_new_list(); + fl_value_append_take(self->value, fl_value_new_null()); + return self; +} + +static CloudFirestoreFirebaseFirestoreHostApiWaitForPendingWritesResponse* +cloud_firestore_firebase_firestore_host_api_wait_for_pending_writes_response_new_error( + const gchar* code, const gchar* message, FlValue* details) { + CloudFirestoreFirebaseFirestoreHostApiWaitForPendingWritesResponse* self = + CLOUD_FIRESTORE_FIREBASE_FIRESTORE_HOST_API_WAIT_FOR_PENDING_WRITES_RESPONSE( + g_object_new( + cloud_firestore_firebase_firestore_host_api_wait_for_pending_writes_response_get_type(), + nullptr)); + self->value = fl_value_new_list(); + fl_value_append_take(self->value, fl_value_new_string(code)); + fl_value_append_take(self->value, + fl_value_new_string(message != nullptr ? message : "")); + fl_value_append_take(self->value, details != nullptr ? fl_value_ref(details) + : fl_value_new_null()); + return self; +} + +G_DECLARE_FINAL_TYPE( + CloudFirestoreFirebaseFirestoreHostApiSetIndexConfigurationResponse, + cloud_firestore_firebase_firestore_host_api_set_index_configuration_response, + CLOUD_FIRESTORE, + FIREBASE_FIRESTORE_HOST_API_SET_INDEX_CONFIGURATION_RESPONSE, GObject) + +struct _CloudFirestoreFirebaseFirestoreHostApiSetIndexConfigurationResponse { + GObject parent_instance; + + FlValue* value; +}; + +G_DEFINE_TYPE( + CloudFirestoreFirebaseFirestoreHostApiSetIndexConfigurationResponse, + cloud_firestore_firebase_firestore_host_api_set_index_configuration_response, + G_TYPE_OBJECT) + +static void +cloud_firestore_firebase_firestore_host_api_set_index_configuration_response_dispose( + GObject* object) { + CloudFirestoreFirebaseFirestoreHostApiSetIndexConfigurationResponse* self = + CLOUD_FIRESTORE_FIREBASE_FIRESTORE_HOST_API_SET_INDEX_CONFIGURATION_RESPONSE( + object); + g_clear_pointer(&self->value, fl_value_unref); + G_OBJECT_CLASS( + cloud_firestore_firebase_firestore_host_api_set_index_configuration_response_parent_class) + ->dispose(object); +} + +static void +cloud_firestore_firebase_firestore_host_api_set_index_configuration_response_init( + CloudFirestoreFirebaseFirestoreHostApiSetIndexConfigurationResponse* self) { +} + +static void +cloud_firestore_firebase_firestore_host_api_set_index_configuration_response_class_init( + CloudFirestoreFirebaseFirestoreHostApiSetIndexConfigurationResponseClass* + klass) { + G_OBJECT_CLASS(klass)->dispose = + cloud_firestore_firebase_firestore_host_api_set_index_configuration_response_dispose; +} + +static CloudFirestoreFirebaseFirestoreHostApiSetIndexConfigurationResponse* +cloud_firestore_firebase_firestore_host_api_set_index_configuration_response_new() { + CloudFirestoreFirebaseFirestoreHostApiSetIndexConfigurationResponse* self = + CLOUD_FIRESTORE_FIREBASE_FIRESTORE_HOST_API_SET_INDEX_CONFIGURATION_RESPONSE( + g_object_new( + cloud_firestore_firebase_firestore_host_api_set_index_configuration_response_get_type(), + nullptr)); + self->value = fl_value_new_list(); + fl_value_append_take(self->value, fl_value_new_null()); + return self; +} + +static CloudFirestoreFirebaseFirestoreHostApiSetIndexConfigurationResponse* +cloud_firestore_firebase_firestore_host_api_set_index_configuration_response_new_error( + const gchar* code, const gchar* message, FlValue* details) { + CloudFirestoreFirebaseFirestoreHostApiSetIndexConfigurationResponse* self = + CLOUD_FIRESTORE_FIREBASE_FIRESTORE_HOST_API_SET_INDEX_CONFIGURATION_RESPONSE( + g_object_new( + cloud_firestore_firebase_firestore_host_api_set_index_configuration_response_get_type(), + nullptr)); + self->value = fl_value_new_list(); + fl_value_append_take(self->value, fl_value_new_string(code)); + fl_value_append_take(self->value, + fl_value_new_string(message != nullptr ? message : "")); + fl_value_append_take(self->value, details != nullptr ? fl_value_ref(details) + : fl_value_new_null()); + return self; +} + +G_DECLARE_FINAL_TYPE( + CloudFirestoreFirebaseFirestoreHostApiSetLoggingEnabledResponse, + cloud_firestore_firebase_firestore_host_api_set_logging_enabled_response, + CLOUD_FIRESTORE, FIREBASE_FIRESTORE_HOST_API_SET_LOGGING_ENABLED_RESPONSE, + GObject) + +struct _CloudFirestoreFirebaseFirestoreHostApiSetLoggingEnabledResponse { + GObject parent_instance; + + FlValue* value; +}; + +G_DEFINE_TYPE( + CloudFirestoreFirebaseFirestoreHostApiSetLoggingEnabledResponse, + cloud_firestore_firebase_firestore_host_api_set_logging_enabled_response, + G_TYPE_OBJECT) + +static void +cloud_firestore_firebase_firestore_host_api_set_logging_enabled_response_dispose( + GObject* object) { + CloudFirestoreFirebaseFirestoreHostApiSetLoggingEnabledResponse* self = + CLOUD_FIRESTORE_FIREBASE_FIRESTORE_HOST_API_SET_LOGGING_ENABLED_RESPONSE( + object); + g_clear_pointer(&self->value, fl_value_unref); + G_OBJECT_CLASS( + cloud_firestore_firebase_firestore_host_api_set_logging_enabled_response_parent_class) + ->dispose(object); +} + +static void +cloud_firestore_firebase_firestore_host_api_set_logging_enabled_response_init( + CloudFirestoreFirebaseFirestoreHostApiSetLoggingEnabledResponse* self) {} + +static void +cloud_firestore_firebase_firestore_host_api_set_logging_enabled_response_class_init( + CloudFirestoreFirebaseFirestoreHostApiSetLoggingEnabledResponseClass* + klass) { + G_OBJECT_CLASS(klass)->dispose = + cloud_firestore_firebase_firestore_host_api_set_logging_enabled_response_dispose; +} + +static CloudFirestoreFirebaseFirestoreHostApiSetLoggingEnabledResponse* +cloud_firestore_firebase_firestore_host_api_set_logging_enabled_response_new() { + CloudFirestoreFirebaseFirestoreHostApiSetLoggingEnabledResponse* self = + CLOUD_FIRESTORE_FIREBASE_FIRESTORE_HOST_API_SET_LOGGING_ENABLED_RESPONSE( + g_object_new( + cloud_firestore_firebase_firestore_host_api_set_logging_enabled_response_get_type(), + nullptr)); + self->value = fl_value_new_list(); + fl_value_append_take(self->value, fl_value_new_null()); + return self; +} + +static CloudFirestoreFirebaseFirestoreHostApiSetLoggingEnabledResponse* +cloud_firestore_firebase_firestore_host_api_set_logging_enabled_response_new_error( + const gchar* code, const gchar* message, FlValue* details) { + CloudFirestoreFirebaseFirestoreHostApiSetLoggingEnabledResponse* self = + CLOUD_FIRESTORE_FIREBASE_FIRESTORE_HOST_API_SET_LOGGING_ENABLED_RESPONSE( + g_object_new( + cloud_firestore_firebase_firestore_host_api_set_logging_enabled_response_get_type(), + nullptr)); + self->value = fl_value_new_list(); + fl_value_append_take(self->value, fl_value_new_string(code)); + fl_value_append_take(self->value, + fl_value_new_string(message != nullptr ? message : "")); + fl_value_append_take(self->value, details != nullptr ? fl_value_ref(details) + : fl_value_new_null()); + return self; +} + +G_DECLARE_FINAL_TYPE( + CloudFirestoreFirebaseFirestoreHostApiSnapshotsInSyncSetupResponse, + cloud_firestore_firebase_firestore_host_api_snapshots_in_sync_setup_response, + CLOUD_FIRESTORE, + FIREBASE_FIRESTORE_HOST_API_SNAPSHOTS_IN_SYNC_SETUP_RESPONSE, GObject) + +struct _CloudFirestoreFirebaseFirestoreHostApiSnapshotsInSyncSetupResponse { + GObject parent_instance; + + FlValue* value; +}; + +G_DEFINE_TYPE( + CloudFirestoreFirebaseFirestoreHostApiSnapshotsInSyncSetupResponse, + cloud_firestore_firebase_firestore_host_api_snapshots_in_sync_setup_response, + G_TYPE_OBJECT) + +static void +cloud_firestore_firebase_firestore_host_api_snapshots_in_sync_setup_response_dispose( + GObject* object) { + CloudFirestoreFirebaseFirestoreHostApiSnapshotsInSyncSetupResponse* self = + CLOUD_FIRESTORE_FIREBASE_FIRESTORE_HOST_API_SNAPSHOTS_IN_SYNC_SETUP_RESPONSE( + object); + g_clear_pointer(&self->value, fl_value_unref); + G_OBJECT_CLASS( + cloud_firestore_firebase_firestore_host_api_snapshots_in_sync_setup_response_parent_class) + ->dispose(object); +} + +static void +cloud_firestore_firebase_firestore_host_api_snapshots_in_sync_setup_response_init( + CloudFirestoreFirebaseFirestoreHostApiSnapshotsInSyncSetupResponse* self) {} + +static void +cloud_firestore_firebase_firestore_host_api_snapshots_in_sync_setup_response_class_init( + CloudFirestoreFirebaseFirestoreHostApiSnapshotsInSyncSetupResponseClass* + klass) { + G_OBJECT_CLASS(klass)->dispose = + cloud_firestore_firebase_firestore_host_api_snapshots_in_sync_setup_response_dispose; +} + +static CloudFirestoreFirebaseFirestoreHostApiSnapshotsInSyncSetupResponse* +cloud_firestore_firebase_firestore_host_api_snapshots_in_sync_setup_response_new( + const gchar* return_value) { + CloudFirestoreFirebaseFirestoreHostApiSnapshotsInSyncSetupResponse* self = + CLOUD_FIRESTORE_FIREBASE_FIRESTORE_HOST_API_SNAPSHOTS_IN_SYNC_SETUP_RESPONSE( + g_object_new( + cloud_firestore_firebase_firestore_host_api_snapshots_in_sync_setup_response_get_type(), + nullptr)); + self->value = fl_value_new_list(); + fl_value_append_take(self->value, fl_value_new_string(return_value)); + return self; +} + +static CloudFirestoreFirebaseFirestoreHostApiSnapshotsInSyncSetupResponse* +cloud_firestore_firebase_firestore_host_api_snapshots_in_sync_setup_response_new_error( + const gchar* code, const gchar* message, FlValue* details) { + CloudFirestoreFirebaseFirestoreHostApiSnapshotsInSyncSetupResponse* self = + CLOUD_FIRESTORE_FIREBASE_FIRESTORE_HOST_API_SNAPSHOTS_IN_SYNC_SETUP_RESPONSE( + g_object_new( + cloud_firestore_firebase_firestore_host_api_snapshots_in_sync_setup_response_get_type(), + nullptr)); + self->value = fl_value_new_list(); + fl_value_append_take(self->value, fl_value_new_string(code)); + fl_value_append_take(self->value, + fl_value_new_string(message != nullptr ? message : "")); + fl_value_append_take(self->value, details != nullptr ? fl_value_ref(details) + : fl_value_new_null()); + return self; +} + +G_DECLARE_FINAL_TYPE( + CloudFirestoreFirebaseFirestoreHostApiTransactionCreateResponse, + cloud_firestore_firebase_firestore_host_api_transaction_create_response, + CLOUD_FIRESTORE, FIREBASE_FIRESTORE_HOST_API_TRANSACTION_CREATE_RESPONSE, + GObject) + +struct _CloudFirestoreFirebaseFirestoreHostApiTransactionCreateResponse { + GObject parent_instance; + + FlValue* value; +}; + +G_DEFINE_TYPE( + CloudFirestoreFirebaseFirestoreHostApiTransactionCreateResponse, + cloud_firestore_firebase_firestore_host_api_transaction_create_response, + G_TYPE_OBJECT) + +static void +cloud_firestore_firebase_firestore_host_api_transaction_create_response_dispose( + GObject* object) { + CloudFirestoreFirebaseFirestoreHostApiTransactionCreateResponse* self = + CLOUD_FIRESTORE_FIREBASE_FIRESTORE_HOST_API_TRANSACTION_CREATE_RESPONSE( + object); + g_clear_pointer(&self->value, fl_value_unref); + G_OBJECT_CLASS( + cloud_firestore_firebase_firestore_host_api_transaction_create_response_parent_class) + ->dispose(object); +} + +static void +cloud_firestore_firebase_firestore_host_api_transaction_create_response_init( + CloudFirestoreFirebaseFirestoreHostApiTransactionCreateResponse* self) {} + +static void +cloud_firestore_firebase_firestore_host_api_transaction_create_response_class_init( + CloudFirestoreFirebaseFirestoreHostApiTransactionCreateResponseClass* + klass) { + G_OBJECT_CLASS(klass)->dispose = + cloud_firestore_firebase_firestore_host_api_transaction_create_response_dispose; +} + +static CloudFirestoreFirebaseFirestoreHostApiTransactionCreateResponse* +cloud_firestore_firebase_firestore_host_api_transaction_create_response_new( + const gchar* return_value) { + CloudFirestoreFirebaseFirestoreHostApiTransactionCreateResponse* self = + CLOUD_FIRESTORE_FIREBASE_FIRESTORE_HOST_API_TRANSACTION_CREATE_RESPONSE( + g_object_new( + cloud_firestore_firebase_firestore_host_api_transaction_create_response_get_type(), + nullptr)); + self->value = fl_value_new_list(); + fl_value_append_take(self->value, fl_value_new_string(return_value)); + return self; +} + +static CloudFirestoreFirebaseFirestoreHostApiTransactionCreateResponse* +cloud_firestore_firebase_firestore_host_api_transaction_create_response_new_error( + const gchar* code, const gchar* message, FlValue* details) { + CloudFirestoreFirebaseFirestoreHostApiTransactionCreateResponse* self = + CLOUD_FIRESTORE_FIREBASE_FIRESTORE_HOST_API_TRANSACTION_CREATE_RESPONSE( + g_object_new( + cloud_firestore_firebase_firestore_host_api_transaction_create_response_get_type(), + nullptr)); + self->value = fl_value_new_list(); + fl_value_append_take(self->value, fl_value_new_string(code)); + fl_value_append_take(self->value, + fl_value_new_string(message != nullptr ? message : "")); + fl_value_append_take(self->value, details != nullptr ? fl_value_ref(details) + : fl_value_new_null()); + return self; +} + +G_DECLARE_FINAL_TYPE( + CloudFirestoreFirebaseFirestoreHostApiTransactionStoreResultResponse, + cloud_firestore_firebase_firestore_host_api_transaction_store_result_response, + CLOUD_FIRESTORE, + FIREBASE_FIRESTORE_HOST_API_TRANSACTION_STORE_RESULT_RESPONSE, GObject) + +struct _CloudFirestoreFirebaseFirestoreHostApiTransactionStoreResultResponse { + GObject parent_instance; + + FlValue* value; +}; + +G_DEFINE_TYPE( + CloudFirestoreFirebaseFirestoreHostApiTransactionStoreResultResponse, + cloud_firestore_firebase_firestore_host_api_transaction_store_result_response, + G_TYPE_OBJECT) + +static void +cloud_firestore_firebase_firestore_host_api_transaction_store_result_response_dispose( + GObject* object) { + CloudFirestoreFirebaseFirestoreHostApiTransactionStoreResultResponse* self = + CLOUD_FIRESTORE_FIREBASE_FIRESTORE_HOST_API_TRANSACTION_STORE_RESULT_RESPONSE( + object); + g_clear_pointer(&self->value, fl_value_unref); + G_OBJECT_CLASS( + cloud_firestore_firebase_firestore_host_api_transaction_store_result_response_parent_class) + ->dispose(object); +} + +static void +cloud_firestore_firebase_firestore_host_api_transaction_store_result_response_init( + CloudFirestoreFirebaseFirestoreHostApiTransactionStoreResultResponse* + self) {} + +static void +cloud_firestore_firebase_firestore_host_api_transaction_store_result_response_class_init( + CloudFirestoreFirebaseFirestoreHostApiTransactionStoreResultResponseClass* + klass) { + G_OBJECT_CLASS(klass)->dispose = + cloud_firestore_firebase_firestore_host_api_transaction_store_result_response_dispose; +} + +static CloudFirestoreFirebaseFirestoreHostApiTransactionStoreResultResponse* +cloud_firestore_firebase_firestore_host_api_transaction_store_result_response_new() { + CloudFirestoreFirebaseFirestoreHostApiTransactionStoreResultResponse* self = + CLOUD_FIRESTORE_FIREBASE_FIRESTORE_HOST_API_TRANSACTION_STORE_RESULT_RESPONSE( + g_object_new( + cloud_firestore_firebase_firestore_host_api_transaction_store_result_response_get_type(), + nullptr)); + self->value = fl_value_new_list(); + fl_value_append_take(self->value, fl_value_new_null()); + return self; +} + +static CloudFirestoreFirebaseFirestoreHostApiTransactionStoreResultResponse* +cloud_firestore_firebase_firestore_host_api_transaction_store_result_response_new_error( + const gchar* code, const gchar* message, FlValue* details) { + CloudFirestoreFirebaseFirestoreHostApiTransactionStoreResultResponse* self = + CLOUD_FIRESTORE_FIREBASE_FIRESTORE_HOST_API_TRANSACTION_STORE_RESULT_RESPONSE( + g_object_new( + cloud_firestore_firebase_firestore_host_api_transaction_store_result_response_get_type(), + nullptr)); + self->value = fl_value_new_list(); + fl_value_append_take(self->value, fl_value_new_string(code)); + fl_value_append_take(self->value, + fl_value_new_string(message != nullptr ? message : "")); + fl_value_append_take(self->value, details != nullptr ? fl_value_ref(details) + : fl_value_new_null()); + return self; +} + +G_DECLARE_FINAL_TYPE( + CloudFirestoreFirebaseFirestoreHostApiTransactionGetResponse, + cloud_firestore_firebase_firestore_host_api_transaction_get_response, + CLOUD_FIRESTORE, FIREBASE_FIRESTORE_HOST_API_TRANSACTION_GET_RESPONSE, + GObject) + +struct _CloudFirestoreFirebaseFirestoreHostApiTransactionGetResponse { + GObject parent_instance; + + FlValue* value; +}; + +G_DEFINE_TYPE( + CloudFirestoreFirebaseFirestoreHostApiTransactionGetResponse, + cloud_firestore_firebase_firestore_host_api_transaction_get_response, + G_TYPE_OBJECT) + +static void +cloud_firestore_firebase_firestore_host_api_transaction_get_response_dispose( + GObject* object) { + CloudFirestoreFirebaseFirestoreHostApiTransactionGetResponse* self = + CLOUD_FIRESTORE_FIREBASE_FIRESTORE_HOST_API_TRANSACTION_GET_RESPONSE( + object); + g_clear_pointer(&self->value, fl_value_unref); + G_OBJECT_CLASS( + cloud_firestore_firebase_firestore_host_api_transaction_get_response_parent_class) + ->dispose(object); +} + +static void +cloud_firestore_firebase_firestore_host_api_transaction_get_response_init( + CloudFirestoreFirebaseFirestoreHostApiTransactionGetResponse* self) {} + +static void +cloud_firestore_firebase_firestore_host_api_transaction_get_response_class_init( + CloudFirestoreFirebaseFirestoreHostApiTransactionGetResponseClass* klass) { + G_OBJECT_CLASS(klass)->dispose = + cloud_firestore_firebase_firestore_host_api_transaction_get_response_dispose; +} + +static CloudFirestoreFirebaseFirestoreHostApiTransactionGetResponse* +cloud_firestore_firebase_firestore_host_api_transaction_get_response_new( + CloudFirestoreInternalDocumentSnapshot* return_value) { + CloudFirestoreFirebaseFirestoreHostApiTransactionGetResponse* self = + CLOUD_FIRESTORE_FIREBASE_FIRESTORE_HOST_API_TRANSACTION_GET_RESPONSE(g_object_new( + cloud_firestore_firebase_firestore_host_api_transaction_get_response_get_type(), + nullptr)); + self->value = fl_value_new_list(); + fl_value_append_take(self->value, + fl_value_new_custom_object( + cloud_firestore_internal_document_snapshot_type_id, + G_OBJECT(return_value))); + return self; +} + +static CloudFirestoreFirebaseFirestoreHostApiTransactionGetResponse* +cloud_firestore_firebase_firestore_host_api_transaction_get_response_new_error( + const gchar* code, const gchar* message, FlValue* details) { + CloudFirestoreFirebaseFirestoreHostApiTransactionGetResponse* self = + CLOUD_FIRESTORE_FIREBASE_FIRESTORE_HOST_API_TRANSACTION_GET_RESPONSE(g_object_new( + cloud_firestore_firebase_firestore_host_api_transaction_get_response_get_type(), + nullptr)); + self->value = fl_value_new_list(); + fl_value_append_take(self->value, fl_value_new_string(code)); + fl_value_append_take(self->value, + fl_value_new_string(message != nullptr ? message : "")); + fl_value_append_take(self->value, details != nullptr ? fl_value_ref(details) + : fl_value_new_null()); + return self; +} + +G_DECLARE_FINAL_TYPE( + CloudFirestoreFirebaseFirestoreHostApiDocumentReferenceSetResponse, + cloud_firestore_firebase_firestore_host_api_document_reference_set_response, + CLOUD_FIRESTORE, + FIREBASE_FIRESTORE_HOST_API_DOCUMENT_REFERENCE_SET_RESPONSE, GObject) + +struct _CloudFirestoreFirebaseFirestoreHostApiDocumentReferenceSetResponse { + GObject parent_instance; + + FlValue* value; +}; + +G_DEFINE_TYPE( + CloudFirestoreFirebaseFirestoreHostApiDocumentReferenceSetResponse, + cloud_firestore_firebase_firestore_host_api_document_reference_set_response, + G_TYPE_OBJECT) + +static void +cloud_firestore_firebase_firestore_host_api_document_reference_set_response_dispose( + GObject* object) { + CloudFirestoreFirebaseFirestoreHostApiDocumentReferenceSetResponse* self = + CLOUD_FIRESTORE_FIREBASE_FIRESTORE_HOST_API_DOCUMENT_REFERENCE_SET_RESPONSE( + object); + g_clear_pointer(&self->value, fl_value_unref); + G_OBJECT_CLASS( + cloud_firestore_firebase_firestore_host_api_document_reference_set_response_parent_class) + ->dispose(object); +} + +static void +cloud_firestore_firebase_firestore_host_api_document_reference_set_response_init( + CloudFirestoreFirebaseFirestoreHostApiDocumentReferenceSetResponse* self) {} + +static void +cloud_firestore_firebase_firestore_host_api_document_reference_set_response_class_init( + CloudFirestoreFirebaseFirestoreHostApiDocumentReferenceSetResponseClass* + klass) { + G_OBJECT_CLASS(klass)->dispose = + cloud_firestore_firebase_firestore_host_api_document_reference_set_response_dispose; +} + +static CloudFirestoreFirebaseFirestoreHostApiDocumentReferenceSetResponse* +cloud_firestore_firebase_firestore_host_api_document_reference_set_response_new() { + CloudFirestoreFirebaseFirestoreHostApiDocumentReferenceSetResponse* self = + CLOUD_FIRESTORE_FIREBASE_FIRESTORE_HOST_API_DOCUMENT_REFERENCE_SET_RESPONSE( + g_object_new( + cloud_firestore_firebase_firestore_host_api_document_reference_set_response_get_type(), + nullptr)); + self->value = fl_value_new_list(); + fl_value_append_take(self->value, fl_value_new_null()); + return self; +} + +static CloudFirestoreFirebaseFirestoreHostApiDocumentReferenceSetResponse* +cloud_firestore_firebase_firestore_host_api_document_reference_set_response_new_error( + const gchar* code, const gchar* message, FlValue* details) { + CloudFirestoreFirebaseFirestoreHostApiDocumentReferenceSetResponse* self = + CLOUD_FIRESTORE_FIREBASE_FIRESTORE_HOST_API_DOCUMENT_REFERENCE_SET_RESPONSE( + g_object_new( + cloud_firestore_firebase_firestore_host_api_document_reference_set_response_get_type(), + nullptr)); + self->value = fl_value_new_list(); + fl_value_append_take(self->value, fl_value_new_string(code)); + fl_value_append_take(self->value, + fl_value_new_string(message != nullptr ? message : "")); + fl_value_append_take(self->value, details != nullptr ? fl_value_ref(details) + : fl_value_new_null()); + return self; +} + +G_DECLARE_FINAL_TYPE( + CloudFirestoreFirebaseFirestoreHostApiDocumentReferenceUpdateResponse, + cloud_firestore_firebase_firestore_host_api_document_reference_update_response, + CLOUD_FIRESTORE, + FIREBASE_FIRESTORE_HOST_API_DOCUMENT_REFERENCE_UPDATE_RESPONSE, GObject) + +struct _CloudFirestoreFirebaseFirestoreHostApiDocumentReferenceUpdateResponse { + GObject parent_instance; + + FlValue* value; +}; + +G_DEFINE_TYPE( + CloudFirestoreFirebaseFirestoreHostApiDocumentReferenceUpdateResponse, + cloud_firestore_firebase_firestore_host_api_document_reference_update_response, + G_TYPE_OBJECT) + +static void +cloud_firestore_firebase_firestore_host_api_document_reference_update_response_dispose( + GObject* object) { + CloudFirestoreFirebaseFirestoreHostApiDocumentReferenceUpdateResponse* self = + CLOUD_FIRESTORE_FIREBASE_FIRESTORE_HOST_API_DOCUMENT_REFERENCE_UPDATE_RESPONSE( + object); + g_clear_pointer(&self->value, fl_value_unref); + G_OBJECT_CLASS( + cloud_firestore_firebase_firestore_host_api_document_reference_update_response_parent_class) + ->dispose(object); +} + +static void +cloud_firestore_firebase_firestore_host_api_document_reference_update_response_init( + CloudFirestoreFirebaseFirestoreHostApiDocumentReferenceUpdateResponse* + self) {} + +static void +cloud_firestore_firebase_firestore_host_api_document_reference_update_response_class_init( + CloudFirestoreFirebaseFirestoreHostApiDocumentReferenceUpdateResponseClass* + klass) { + G_OBJECT_CLASS(klass)->dispose = + cloud_firestore_firebase_firestore_host_api_document_reference_update_response_dispose; +} + +static CloudFirestoreFirebaseFirestoreHostApiDocumentReferenceUpdateResponse* +cloud_firestore_firebase_firestore_host_api_document_reference_update_response_new() { + CloudFirestoreFirebaseFirestoreHostApiDocumentReferenceUpdateResponse* self = + CLOUD_FIRESTORE_FIREBASE_FIRESTORE_HOST_API_DOCUMENT_REFERENCE_UPDATE_RESPONSE( + g_object_new( + cloud_firestore_firebase_firestore_host_api_document_reference_update_response_get_type(), + nullptr)); + self->value = fl_value_new_list(); + fl_value_append_take(self->value, fl_value_new_null()); + return self; +} + +static CloudFirestoreFirebaseFirestoreHostApiDocumentReferenceUpdateResponse* +cloud_firestore_firebase_firestore_host_api_document_reference_update_response_new_error( + const gchar* code, const gchar* message, FlValue* details) { + CloudFirestoreFirebaseFirestoreHostApiDocumentReferenceUpdateResponse* self = + CLOUD_FIRESTORE_FIREBASE_FIRESTORE_HOST_API_DOCUMENT_REFERENCE_UPDATE_RESPONSE( + g_object_new( + cloud_firestore_firebase_firestore_host_api_document_reference_update_response_get_type(), + nullptr)); + self->value = fl_value_new_list(); + fl_value_append_take(self->value, fl_value_new_string(code)); + fl_value_append_take(self->value, + fl_value_new_string(message != nullptr ? message : "")); + fl_value_append_take(self->value, details != nullptr ? fl_value_ref(details) + : fl_value_new_null()); + return self; +} + +G_DECLARE_FINAL_TYPE( + CloudFirestoreFirebaseFirestoreHostApiDocumentReferenceGetResponse, + cloud_firestore_firebase_firestore_host_api_document_reference_get_response, + CLOUD_FIRESTORE, + FIREBASE_FIRESTORE_HOST_API_DOCUMENT_REFERENCE_GET_RESPONSE, GObject) + +struct _CloudFirestoreFirebaseFirestoreHostApiDocumentReferenceGetResponse { + GObject parent_instance; + + FlValue* value; +}; + +G_DEFINE_TYPE( + CloudFirestoreFirebaseFirestoreHostApiDocumentReferenceGetResponse, + cloud_firestore_firebase_firestore_host_api_document_reference_get_response, + G_TYPE_OBJECT) + +static void +cloud_firestore_firebase_firestore_host_api_document_reference_get_response_dispose( + GObject* object) { + CloudFirestoreFirebaseFirestoreHostApiDocumentReferenceGetResponse* self = + CLOUD_FIRESTORE_FIREBASE_FIRESTORE_HOST_API_DOCUMENT_REFERENCE_GET_RESPONSE( + object); + g_clear_pointer(&self->value, fl_value_unref); + G_OBJECT_CLASS( + cloud_firestore_firebase_firestore_host_api_document_reference_get_response_parent_class) + ->dispose(object); +} + +static void +cloud_firestore_firebase_firestore_host_api_document_reference_get_response_init( + CloudFirestoreFirebaseFirestoreHostApiDocumentReferenceGetResponse* self) {} + +static void +cloud_firestore_firebase_firestore_host_api_document_reference_get_response_class_init( + CloudFirestoreFirebaseFirestoreHostApiDocumentReferenceGetResponseClass* + klass) { + G_OBJECT_CLASS(klass)->dispose = + cloud_firestore_firebase_firestore_host_api_document_reference_get_response_dispose; +} + +static CloudFirestoreFirebaseFirestoreHostApiDocumentReferenceGetResponse* +cloud_firestore_firebase_firestore_host_api_document_reference_get_response_new( + CloudFirestoreInternalDocumentSnapshot* return_value) { + CloudFirestoreFirebaseFirestoreHostApiDocumentReferenceGetResponse* self = + CLOUD_FIRESTORE_FIREBASE_FIRESTORE_HOST_API_DOCUMENT_REFERENCE_GET_RESPONSE( + g_object_new( + cloud_firestore_firebase_firestore_host_api_document_reference_get_response_get_type(), + nullptr)); + self->value = fl_value_new_list(); + fl_value_append_take(self->value, + fl_value_new_custom_object( + cloud_firestore_internal_document_snapshot_type_id, + G_OBJECT(return_value))); + return self; +} + +static CloudFirestoreFirebaseFirestoreHostApiDocumentReferenceGetResponse* +cloud_firestore_firebase_firestore_host_api_document_reference_get_response_new_error( + const gchar* code, const gchar* message, FlValue* details) { + CloudFirestoreFirebaseFirestoreHostApiDocumentReferenceGetResponse* self = + CLOUD_FIRESTORE_FIREBASE_FIRESTORE_HOST_API_DOCUMENT_REFERENCE_GET_RESPONSE( + g_object_new( + cloud_firestore_firebase_firestore_host_api_document_reference_get_response_get_type(), + nullptr)); + self->value = fl_value_new_list(); + fl_value_append_take(self->value, fl_value_new_string(code)); + fl_value_append_take(self->value, + fl_value_new_string(message != nullptr ? message : "")); + fl_value_append_take(self->value, details != nullptr ? fl_value_ref(details) + : fl_value_new_null()); + return self; +} + +G_DECLARE_FINAL_TYPE( + CloudFirestoreFirebaseFirestoreHostApiDocumentReferenceDeleteResponse, + cloud_firestore_firebase_firestore_host_api_document_reference_delete_response, + CLOUD_FIRESTORE, + FIREBASE_FIRESTORE_HOST_API_DOCUMENT_REFERENCE_DELETE_RESPONSE, GObject) + +struct _CloudFirestoreFirebaseFirestoreHostApiDocumentReferenceDeleteResponse { + GObject parent_instance; + + FlValue* value; +}; + +G_DEFINE_TYPE( + CloudFirestoreFirebaseFirestoreHostApiDocumentReferenceDeleteResponse, + cloud_firestore_firebase_firestore_host_api_document_reference_delete_response, + G_TYPE_OBJECT) + +static void +cloud_firestore_firebase_firestore_host_api_document_reference_delete_response_dispose( + GObject* object) { + CloudFirestoreFirebaseFirestoreHostApiDocumentReferenceDeleteResponse* self = + CLOUD_FIRESTORE_FIREBASE_FIRESTORE_HOST_API_DOCUMENT_REFERENCE_DELETE_RESPONSE( + object); + g_clear_pointer(&self->value, fl_value_unref); + G_OBJECT_CLASS( + cloud_firestore_firebase_firestore_host_api_document_reference_delete_response_parent_class) + ->dispose(object); +} + +static void +cloud_firestore_firebase_firestore_host_api_document_reference_delete_response_init( + CloudFirestoreFirebaseFirestoreHostApiDocumentReferenceDeleteResponse* + self) {} + +static void +cloud_firestore_firebase_firestore_host_api_document_reference_delete_response_class_init( + CloudFirestoreFirebaseFirestoreHostApiDocumentReferenceDeleteResponseClass* + klass) { + G_OBJECT_CLASS(klass)->dispose = + cloud_firestore_firebase_firestore_host_api_document_reference_delete_response_dispose; +} + +static CloudFirestoreFirebaseFirestoreHostApiDocumentReferenceDeleteResponse* +cloud_firestore_firebase_firestore_host_api_document_reference_delete_response_new() { + CloudFirestoreFirebaseFirestoreHostApiDocumentReferenceDeleteResponse* self = + CLOUD_FIRESTORE_FIREBASE_FIRESTORE_HOST_API_DOCUMENT_REFERENCE_DELETE_RESPONSE( + g_object_new( + cloud_firestore_firebase_firestore_host_api_document_reference_delete_response_get_type(), + nullptr)); + self->value = fl_value_new_list(); + fl_value_append_take(self->value, fl_value_new_null()); + return self; +} + +static CloudFirestoreFirebaseFirestoreHostApiDocumentReferenceDeleteResponse* +cloud_firestore_firebase_firestore_host_api_document_reference_delete_response_new_error( + const gchar* code, const gchar* message, FlValue* details) { + CloudFirestoreFirebaseFirestoreHostApiDocumentReferenceDeleteResponse* self = + CLOUD_FIRESTORE_FIREBASE_FIRESTORE_HOST_API_DOCUMENT_REFERENCE_DELETE_RESPONSE( + g_object_new( + cloud_firestore_firebase_firestore_host_api_document_reference_delete_response_get_type(), + nullptr)); + self->value = fl_value_new_list(); + fl_value_append_take(self->value, fl_value_new_string(code)); + fl_value_append_take(self->value, + fl_value_new_string(message != nullptr ? message : "")); + fl_value_append_take(self->value, details != nullptr ? fl_value_ref(details) + : fl_value_new_null()); + return self; +} + +G_DECLARE_FINAL_TYPE( + CloudFirestoreFirebaseFirestoreHostApiQueryGetResponse, + cloud_firestore_firebase_firestore_host_api_query_get_response, + CLOUD_FIRESTORE, FIREBASE_FIRESTORE_HOST_API_QUERY_GET_RESPONSE, GObject) + +struct _CloudFirestoreFirebaseFirestoreHostApiQueryGetResponse { + GObject parent_instance; + + FlValue* value; +}; + +G_DEFINE_TYPE(CloudFirestoreFirebaseFirestoreHostApiQueryGetResponse, + cloud_firestore_firebase_firestore_host_api_query_get_response, + G_TYPE_OBJECT) + +static void +cloud_firestore_firebase_firestore_host_api_query_get_response_dispose( + GObject* object) { + CloudFirestoreFirebaseFirestoreHostApiQueryGetResponse* self = + CLOUD_FIRESTORE_FIREBASE_FIRESTORE_HOST_API_QUERY_GET_RESPONSE(object); + g_clear_pointer(&self->value, fl_value_unref); + G_OBJECT_CLASS( + cloud_firestore_firebase_firestore_host_api_query_get_response_parent_class) + ->dispose(object); +} + +static void cloud_firestore_firebase_firestore_host_api_query_get_response_init( + CloudFirestoreFirebaseFirestoreHostApiQueryGetResponse* self) {} + +static void +cloud_firestore_firebase_firestore_host_api_query_get_response_class_init( + CloudFirestoreFirebaseFirestoreHostApiQueryGetResponseClass* klass) { + G_OBJECT_CLASS(klass)->dispose = + cloud_firestore_firebase_firestore_host_api_query_get_response_dispose; +} + +static CloudFirestoreFirebaseFirestoreHostApiQueryGetResponse* +cloud_firestore_firebase_firestore_host_api_query_get_response_new( + CloudFirestoreInternalQuerySnapshot* return_value) { + CloudFirestoreFirebaseFirestoreHostApiQueryGetResponse* self = + CLOUD_FIRESTORE_FIREBASE_FIRESTORE_HOST_API_QUERY_GET_RESPONSE(g_object_new( + cloud_firestore_firebase_firestore_host_api_query_get_response_get_type(), + nullptr)); + self->value = fl_value_new_list(); + fl_value_append_take(self->value, + fl_value_new_custom_object( + cloud_firestore_internal_query_snapshot_type_id, + G_OBJECT(return_value))); + return self; +} + +static CloudFirestoreFirebaseFirestoreHostApiQueryGetResponse* +cloud_firestore_firebase_firestore_host_api_query_get_response_new_error( + const gchar* code, const gchar* message, FlValue* details) { + CloudFirestoreFirebaseFirestoreHostApiQueryGetResponse* self = + CLOUD_FIRESTORE_FIREBASE_FIRESTORE_HOST_API_QUERY_GET_RESPONSE(g_object_new( + cloud_firestore_firebase_firestore_host_api_query_get_response_get_type(), + nullptr)); + self->value = fl_value_new_list(); + fl_value_append_take(self->value, fl_value_new_string(code)); + fl_value_append_take(self->value, + fl_value_new_string(message != nullptr ? message : "")); + fl_value_append_take(self->value, details != nullptr ? fl_value_ref(details) + : fl_value_new_null()); + return self; +} + +G_DECLARE_FINAL_TYPE( + CloudFirestoreFirebaseFirestoreHostApiAggregateQueryResponse, + cloud_firestore_firebase_firestore_host_api_aggregate_query_response, + CLOUD_FIRESTORE, FIREBASE_FIRESTORE_HOST_API_AGGREGATE_QUERY_RESPONSE, + GObject) + +struct _CloudFirestoreFirebaseFirestoreHostApiAggregateQueryResponse { + GObject parent_instance; + + FlValue* value; +}; + +G_DEFINE_TYPE( + CloudFirestoreFirebaseFirestoreHostApiAggregateQueryResponse, + cloud_firestore_firebase_firestore_host_api_aggregate_query_response, + G_TYPE_OBJECT) + +static void +cloud_firestore_firebase_firestore_host_api_aggregate_query_response_dispose( + GObject* object) { + CloudFirestoreFirebaseFirestoreHostApiAggregateQueryResponse* self = + CLOUD_FIRESTORE_FIREBASE_FIRESTORE_HOST_API_AGGREGATE_QUERY_RESPONSE( + object); + g_clear_pointer(&self->value, fl_value_unref); + G_OBJECT_CLASS( + cloud_firestore_firebase_firestore_host_api_aggregate_query_response_parent_class) + ->dispose(object); +} + +static void +cloud_firestore_firebase_firestore_host_api_aggregate_query_response_init( + CloudFirestoreFirebaseFirestoreHostApiAggregateQueryResponse* self) {} + +static void +cloud_firestore_firebase_firestore_host_api_aggregate_query_response_class_init( + CloudFirestoreFirebaseFirestoreHostApiAggregateQueryResponseClass* klass) { + G_OBJECT_CLASS(klass)->dispose = + cloud_firestore_firebase_firestore_host_api_aggregate_query_response_dispose; +} + +static CloudFirestoreFirebaseFirestoreHostApiAggregateQueryResponse* +cloud_firestore_firebase_firestore_host_api_aggregate_query_response_new( + FlValue* return_value) { + CloudFirestoreFirebaseFirestoreHostApiAggregateQueryResponse* self = + CLOUD_FIRESTORE_FIREBASE_FIRESTORE_HOST_API_AGGREGATE_QUERY_RESPONSE(g_object_new( + cloud_firestore_firebase_firestore_host_api_aggregate_query_response_get_type(), + nullptr)); + self->value = fl_value_new_list(); + fl_value_append_take(self->value, fl_value_ref(return_value)); + return self; +} + +static CloudFirestoreFirebaseFirestoreHostApiAggregateQueryResponse* +cloud_firestore_firebase_firestore_host_api_aggregate_query_response_new_error( + const gchar* code, const gchar* message, FlValue* details) { + CloudFirestoreFirebaseFirestoreHostApiAggregateQueryResponse* self = + CLOUD_FIRESTORE_FIREBASE_FIRESTORE_HOST_API_AGGREGATE_QUERY_RESPONSE(g_object_new( + cloud_firestore_firebase_firestore_host_api_aggregate_query_response_get_type(), + nullptr)); + self->value = fl_value_new_list(); + fl_value_append_take(self->value, fl_value_new_string(code)); + fl_value_append_take(self->value, + fl_value_new_string(message != nullptr ? message : "")); + fl_value_append_take(self->value, details != nullptr ? fl_value_ref(details) + : fl_value_new_null()); + return self; +} + +G_DECLARE_FINAL_TYPE( + CloudFirestoreFirebaseFirestoreHostApiWriteBatchCommitResponse, + cloud_firestore_firebase_firestore_host_api_write_batch_commit_response, + CLOUD_FIRESTORE, FIREBASE_FIRESTORE_HOST_API_WRITE_BATCH_COMMIT_RESPONSE, + GObject) + +struct _CloudFirestoreFirebaseFirestoreHostApiWriteBatchCommitResponse { + GObject parent_instance; + + FlValue* value; +}; + +G_DEFINE_TYPE( + CloudFirestoreFirebaseFirestoreHostApiWriteBatchCommitResponse, + cloud_firestore_firebase_firestore_host_api_write_batch_commit_response, + G_TYPE_OBJECT) + +static void +cloud_firestore_firebase_firestore_host_api_write_batch_commit_response_dispose( + GObject* object) { + CloudFirestoreFirebaseFirestoreHostApiWriteBatchCommitResponse* self = + CLOUD_FIRESTORE_FIREBASE_FIRESTORE_HOST_API_WRITE_BATCH_COMMIT_RESPONSE( + object); + g_clear_pointer(&self->value, fl_value_unref); + G_OBJECT_CLASS( + cloud_firestore_firebase_firestore_host_api_write_batch_commit_response_parent_class) + ->dispose(object); +} + +static void +cloud_firestore_firebase_firestore_host_api_write_batch_commit_response_init( + CloudFirestoreFirebaseFirestoreHostApiWriteBatchCommitResponse* self) {} + +static void +cloud_firestore_firebase_firestore_host_api_write_batch_commit_response_class_init( + CloudFirestoreFirebaseFirestoreHostApiWriteBatchCommitResponseClass* + klass) { + G_OBJECT_CLASS(klass)->dispose = + cloud_firestore_firebase_firestore_host_api_write_batch_commit_response_dispose; +} + +static CloudFirestoreFirebaseFirestoreHostApiWriteBatchCommitResponse* +cloud_firestore_firebase_firestore_host_api_write_batch_commit_response_new() { + CloudFirestoreFirebaseFirestoreHostApiWriteBatchCommitResponse* self = + CLOUD_FIRESTORE_FIREBASE_FIRESTORE_HOST_API_WRITE_BATCH_COMMIT_RESPONSE( + g_object_new( + cloud_firestore_firebase_firestore_host_api_write_batch_commit_response_get_type(), + nullptr)); + self->value = fl_value_new_list(); + fl_value_append_take(self->value, fl_value_new_null()); + return self; +} + +static CloudFirestoreFirebaseFirestoreHostApiWriteBatchCommitResponse* +cloud_firestore_firebase_firestore_host_api_write_batch_commit_response_new_error( + const gchar* code, const gchar* message, FlValue* details) { + CloudFirestoreFirebaseFirestoreHostApiWriteBatchCommitResponse* self = + CLOUD_FIRESTORE_FIREBASE_FIRESTORE_HOST_API_WRITE_BATCH_COMMIT_RESPONSE( + g_object_new( + cloud_firestore_firebase_firestore_host_api_write_batch_commit_response_get_type(), + nullptr)); + self->value = fl_value_new_list(); + fl_value_append_take(self->value, fl_value_new_string(code)); + fl_value_append_take(self->value, + fl_value_new_string(message != nullptr ? message : "")); + fl_value_append_take(self->value, details != nullptr ? fl_value_ref(details) + : fl_value_new_null()); + return self; +} + +G_DECLARE_FINAL_TYPE( + CloudFirestoreFirebaseFirestoreHostApiQuerySnapshotResponse, + cloud_firestore_firebase_firestore_host_api_query_snapshot_response, + CLOUD_FIRESTORE, FIREBASE_FIRESTORE_HOST_API_QUERY_SNAPSHOT_RESPONSE, + GObject) + +struct _CloudFirestoreFirebaseFirestoreHostApiQuerySnapshotResponse { + GObject parent_instance; + + FlValue* value; +}; + +G_DEFINE_TYPE( + CloudFirestoreFirebaseFirestoreHostApiQuerySnapshotResponse, + cloud_firestore_firebase_firestore_host_api_query_snapshot_response, + G_TYPE_OBJECT) + +static void +cloud_firestore_firebase_firestore_host_api_query_snapshot_response_dispose( + GObject* object) { + CloudFirestoreFirebaseFirestoreHostApiQuerySnapshotResponse* self = + CLOUD_FIRESTORE_FIREBASE_FIRESTORE_HOST_API_QUERY_SNAPSHOT_RESPONSE( + object); + g_clear_pointer(&self->value, fl_value_unref); + G_OBJECT_CLASS( + cloud_firestore_firebase_firestore_host_api_query_snapshot_response_parent_class) + ->dispose(object); +} + +static void +cloud_firestore_firebase_firestore_host_api_query_snapshot_response_init( + CloudFirestoreFirebaseFirestoreHostApiQuerySnapshotResponse* self) {} + +static void +cloud_firestore_firebase_firestore_host_api_query_snapshot_response_class_init( + CloudFirestoreFirebaseFirestoreHostApiQuerySnapshotResponseClass* klass) { + G_OBJECT_CLASS(klass)->dispose = + cloud_firestore_firebase_firestore_host_api_query_snapshot_response_dispose; +} + +static CloudFirestoreFirebaseFirestoreHostApiQuerySnapshotResponse* +cloud_firestore_firebase_firestore_host_api_query_snapshot_response_new( + const gchar* return_value) { + CloudFirestoreFirebaseFirestoreHostApiQuerySnapshotResponse* self = + CLOUD_FIRESTORE_FIREBASE_FIRESTORE_HOST_API_QUERY_SNAPSHOT_RESPONSE(g_object_new( + cloud_firestore_firebase_firestore_host_api_query_snapshot_response_get_type(), + nullptr)); + self->value = fl_value_new_list(); + fl_value_append_take(self->value, fl_value_new_string(return_value)); + return self; +} + +static CloudFirestoreFirebaseFirestoreHostApiQuerySnapshotResponse* +cloud_firestore_firebase_firestore_host_api_query_snapshot_response_new_error( + const gchar* code, const gchar* message, FlValue* details) { + CloudFirestoreFirebaseFirestoreHostApiQuerySnapshotResponse* self = + CLOUD_FIRESTORE_FIREBASE_FIRESTORE_HOST_API_QUERY_SNAPSHOT_RESPONSE(g_object_new( + cloud_firestore_firebase_firestore_host_api_query_snapshot_response_get_type(), + nullptr)); + self->value = fl_value_new_list(); + fl_value_append_take(self->value, fl_value_new_string(code)); + fl_value_append_take(self->value, + fl_value_new_string(message != nullptr ? message : "")); + fl_value_append_take(self->value, details != nullptr ? fl_value_ref(details) + : fl_value_new_null()); + return self; +} + +G_DECLARE_FINAL_TYPE( + CloudFirestoreFirebaseFirestoreHostApiDocumentReferenceSnapshotResponse, + cloud_firestore_firebase_firestore_host_api_document_reference_snapshot_response, + CLOUD_FIRESTORE, + FIREBASE_FIRESTORE_HOST_API_DOCUMENT_REFERENCE_SNAPSHOT_RESPONSE, GObject) + +struct + _CloudFirestoreFirebaseFirestoreHostApiDocumentReferenceSnapshotResponse { + GObject parent_instance; + + FlValue* value; +}; + +G_DEFINE_TYPE( + CloudFirestoreFirebaseFirestoreHostApiDocumentReferenceSnapshotResponse, + cloud_firestore_firebase_firestore_host_api_document_reference_snapshot_response, + G_TYPE_OBJECT) + +static void +cloud_firestore_firebase_firestore_host_api_document_reference_snapshot_response_dispose( + GObject* object) { + CloudFirestoreFirebaseFirestoreHostApiDocumentReferenceSnapshotResponse* self = + CLOUD_FIRESTORE_FIREBASE_FIRESTORE_HOST_API_DOCUMENT_REFERENCE_SNAPSHOT_RESPONSE( + object); + g_clear_pointer(&self->value, fl_value_unref); + G_OBJECT_CLASS( + cloud_firestore_firebase_firestore_host_api_document_reference_snapshot_response_parent_class) + ->dispose(object); +} + +static void +cloud_firestore_firebase_firestore_host_api_document_reference_snapshot_response_init( + CloudFirestoreFirebaseFirestoreHostApiDocumentReferenceSnapshotResponse* + self) {} + +static void +cloud_firestore_firebase_firestore_host_api_document_reference_snapshot_response_class_init( + CloudFirestoreFirebaseFirestoreHostApiDocumentReferenceSnapshotResponseClass* + klass) { + G_OBJECT_CLASS(klass)->dispose = + cloud_firestore_firebase_firestore_host_api_document_reference_snapshot_response_dispose; +} + +static CloudFirestoreFirebaseFirestoreHostApiDocumentReferenceSnapshotResponse* +cloud_firestore_firebase_firestore_host_api_document_reference_snapshot_response_new( + const gchar* return_value) { + CloudFirestoreFirebaseFirestoreHostApiDocumentReferenceSnapshotResponse* self = + CLOUD_FIRESTORE_FIREBASE_FIRESTORE_HOST_API_DOCUMENT_REFERENCE_SNAPSHOT_RESPONSE( + g_object_new( + cloud_firestore_firebase_firestore_host_api_document_reference_snapshot_response_get_type(), + nullptr)); + self->value = fl_value_new_list(); + fl_value_append_take(self->value, fl_value_new_string(return_value)); + return self; +} + +static CloudFirestoreFirebaseFirestoreHostApiDocumentReferenceSnapshotResponse* +cloud_firestore_firebase_firestore_host_api_document_reference_snapshot_response_new_error( + const gchar* code, const gchar* message, FlValue* details) { + CloudFirestoreFirebaseFirestoreHostApiDocumentReferenceSnapshotResponse* self = + CLOUD_FIRESTORE_FIREBASE_FIRESTORE_HOST_API_DOCUMENT_REFERENCE_SNAPSHOT_RESPONSE( + g_object_new( + cloud_firestore_firebase_firestore_host_api_document_reference_snapshot_response_get_type(), + nullptr)); + self->value = fl_value_new_list(); + fl_value_append_take(self->value, fl_value_new_string(code)); + fl_value_append_take(self->value, + fl_value_new_string(message != nullptr ? message : "")); + fl_value_append_take(self->value, details != nullptr ? fl_value_ref(details) + : fl_value_new_null()); + return self; +} + +G_DECLARE_FINAL_TYPE( + CloudFirestoreFirebaseFirestoreHostApiPersistenceCacheIndexManagerRequestResponse, + cloud_firestore_firebase_firestore_host_api_persistence_cache_index_manager_request_response, + CLOUD_FIRESTORE, + FIREBASE_FIRESTORE_HOST_API_PERSISTENCE_CACHE_INDEX_MANAGER_REQUEST_RESPONSE, + GObject) + +struct + _CloudFirestoreFirebaseFirestoreHostApiPersistenceCacheIndexManagerRequestResponse { + GObject parent_instance; + + FlValue* value; +}; + +G_DEFINE_TYPE( + CloudFirestoreFirebaseFirestoreHostApiPersistenceCacheIndexManagerRequestResponse, + cloud_firestore_firebase_firestore_host_api_persistence_cache_index_manager_request_response, + G_TYPE_OBJECT) + +static void +cloud_firestore_firebase_firestore_host_api_persistence_cache_index_manager_request_response_dispose( + GObject* object) { + CloudFirestoreFirebaseFirestoreHostApiPersistenceCacheIndexManagerRequestResponse* + self = + CLOUD_FIRESTORE_FIREBASE_FIRESTORE_HOST_API_PERSISTENCE_CACHE_INDEX_MANAGER_REQUEST_RESPONSE( + object); + g_clear_pointer(&self->value, fl_value_unref); + G_OBJECT_CLASS( + cloud_firestore_firebase_firestore_host_api_persistence_cache_index_manager_request_response_parent_class) + ->dispose(object); +} + +static void +cloud_firestore_firebase_firestore_host_api_persistence_cache_index_manager_request_response_init( + CloudFirestoreFirebaseFirestoreHostApiPersistenceCacheIndexManagerRequestResponse* + self) {} + +static void +cloud_firestore_firebase_firestore_host_api_persistence_cache_index_manager_request_response_class_init( + CloudFirestoreFirebaseFirestoreHostApiPersistenceCacheIndexManagerRequestResponseClass* + klass) { + G_OBJECT_CLASS(klass)->dispose = + cloud_firestore_firebase_firestore_host_api_persistence_cache_index_manager_request_response_dispose; +} + +static CloudFirestoreFirebaseFirestoreHostApiPersistenceCacheIndexManagerRequestResponse* +cloud_firestore_firebase_firestore_host_api_persistence_cache_index_manager_request_response_new() { + CloudFirestoreFirebaseFirestoreHostApiPersistenceCacheIndexManagerRequestResponse* + self = CLOUD_FIRESTORE_FIREBASE_FIRESTORE_HOST_API_PERSISTENCE_CACHE_INDEX_MANAGER_REQUEST_RESPONSE( + g_object_new( + cloud_firestore_firebase_firestore_host_api_persistence_cache_index_manager_request_response_get_type(), + nullptr)); + self->value = fl_value_new_list(); + fl_value_append_take(self->value, fl_value_new_null()); + return self; +} + +static CloudFirestoreFirebaseFirestoreHostApiPersistenceCacheIndexManagerRequestResponse* +cloud_firestore_firebase_firestore_host_api_persistence_cache_index_manager_request_response_new_error( + const gchar* code, const gchar* message, FlValue* details) { + CloudFirestoreFirebaseFirestoreHostApiPersistenceCacheIndexManagerRequestResponse* + self = CLOUD_FIRESTORE_FIREBASE_FIRESTORE_HOST_API_PERSISTENCE_CACHE_INDEX_MANAGER_REQUEST_RESPONSE( + g_object_new( + cloud_firestore_firebase_firestore_host_api_persistence_cache_index_manager_request_response_get_type(), + nullptr)); + self->value = fl_value_new_list(); + fl_value_append_take(self->value, fl_value_new_string(code)); + fl_value_append_take(self->value, + fl_value_new_string(message != nullptr ? message : "")); + fl_value_append_take(self->value, details != nullptr ? fl_value_ref(details) + : fl_value_new_null()); + return self; +} + +G_DECLARE_FINAL_TYPE( + CloudFirestoreFirebaseFirestoreHostApiExecutePipelineResponse, + cloud_firestore_firebase_firestore_host_api_execute_pipeline_response, + CLOUD_FIRESTORE, FIREBASE_FIRESTORE_HOST_API_EXECUTE_PIPELINE_RESPONSE, + GObject) + +struct _CloudFirestoreFirebaseFirestoreHostApiExecutePipelineResponse { + GObject parent_instance; + + FlValue* value; +}; + +G_DEFINE_TYPE( + CloudFirestoreFirebaseFirestoreHostApiExecutePipelineResponse, + cloud_firestore_firebase_firestore_host_api_execute_pipeline_response, + G_TYPE_OBJECT) + +static void +cloud_firestore_firebase_firestore_host_api_execute_pipeline_response_dispose( + GObject* object) { + CloudFirestoreFirebaseFirestoreHostApiExecutePipelineResponse* self = + CLOUD_FIRESTORE_FIREBASE_FIRESTORE_HOST_API_EXECUTE_PIPELINE_RESPONSE( + object); + g_clear_pointer(&self->value, fl_value_unref); + G_OBJECT_CLASS( + cloud_firestore_firebase_firestore_host_api_execute_pipeline_response_parent_class) + ->dispose(object); +} + +static void +cloud_firestore_firebase_firestore_host_api_execute_pipeline_response_init( + CloudFirestoreFirebaseFirestoreHostApiExecutePipelineResponse* self) {} + +static void +cloud_firestore_firebase_firestore_host_api_execute_pipeline_response_class_init( + CloudFirestoreFirebaseFirestoreHostApiExecutePipelineResponseClass* klass) { + G_OBJECT_CLASS(klass)->dispose = + cloud_firestore_firebase_firestore_host_api_execute_pipeline_response_dispose; +} + +static CloudFirestoreFirebaseFirestoreHostApiExecutePipelineResponse* +cloud_firestore_firebase_firestore_host_api_execute_pipeline_response_new( + CloudFirestoreInternalPipelineSnapshot* return_value) { + CloudFirestoreFirebaseFirestoreHostApiExecutePipelineResponse* self = + CLOUD_FIRESTORE_FIREBASE_FIRESTORE_HOST_API_EXECUTE_PIPELINE_RESPONSE( + g_object_new( + cloud_firestore_firebase_firestore_host_api_execute_pipeline_response_get_type(), + nullptr)); + self->value = fl_value_new_list(); + fl_value_append_take(self->value, + fl_value_new_custom_object( + cloud_firestore_internal_pipeline_snapshot_type_id, + G_OBJECT(return_value))); + return self; +} + +static CloudFirestoreFirebaseFirestoreHostApiExecutePipelineResponse* +cloud_firestore_firebase_firestore_host_api_execute_pipeline_response_new_error( + const gchar* code, const gchar* message, FlValue* details) { + CloudFirestoreFirebaseFirestoreHostApiExecutePipelineResponse* self = + CLOUD_FIRESTORE_FIREBASE_FIRESTORE_HOST_API_EXECUTE_PIPELINE_RESPONSE( + g_object_new( + cloud_firestore_firebase_firestore_host_api_execute_pipeline_response_get_type(), + nullptr)); + self->value = fl_value_new_list(); + fl_value_append_take(self->value, fl_value_new_string(code)); + fl_value_append_take(self->value, + fl_value_new_string(message != nullptr ? message : "")); + fl_value_append_take(self->value, details != nullptr ? fl_value_ref(details) + : fl_value_new_null()); + return self; +} + +struct _CloudFirestoreFirebaseFirestoreHostApi { + GObject parent_instance; + + const CloudFirestoreFirebaseFirestoreHostApiVTable* vtable; + gpointer user_data; + GDestroyNotify user_data_free_func; +}; + +G_DEFINE_TYPE(CloudFirestoreFirebaseFirestoreHostApi, + cloud_firestore_firebase_firestore_host_api, G_TYPE_OBJECT) + +static void cloud_firestore_firebase_firestore_host_api_dispose( + GObject* object) { + CloudFirestoreFirebaseFirestoreHostApi* self = + CLOUD_FIRESTORE_FIREBASE_FIRESTORE_HOST_API(object); + if (self->user_data != nullptr) { + self->user_data_free_func(self->user_data); + } + self->user_data = nullptr; + G_OBJECT_CLASS(cloud_firestore_firebase_firestore_host_api_parent_class) + ->dispose(object); +} + +static void cloud_firestore_firebase_firestore_host_api_init( + CloudFirestoreFirebaseFirestoreHostApi* self) {} + +static void cloud_firestore_firebase_firestore_host_api_class_init( + CloudFirestoreFirebaseFirestoreHostApiClass* klass) { + G_OBJECT_CLASS(klass)->dispose = + cloud_firestore_firebase_firestore_host_api_dispose; +} + +static CloudFirestoreFirebaseFirestoreHostApi* +cloud_firestore_firebase_firestore_host_api_new( + const CloudFirestoreFirebaseFirestoreHostApiVTable* vtable, + gpointer user_data, GDestroyNotify user_data_free_func) { + CloudFirestoreFirebaseFirestoreHostApi* self = + CLOUD_FIRESTORE_FIREBASE_FIRESTORE_HOST_API(g_object_new( + cloud_firestore_firebase_firestore_host_api_get_type(), nullptr)); + self->vtable = vtable; + self->user_data = user_data; + self->user_data_free_func = user_data_free_func; + return self; +} + +static void cloud_firestore_firebase_firestore_host_api_load_bundle_cb( + FlBasicMessageChannel* channel, FlValue* message_, + FlBasicMessageChannelResponseHandle* response_handle, gpointer user_data) { + CloudFirestoreFirebaseFirestoreHostApi* self = + CLOUD_FIRESTORE_FIREBASE_FIRESTORE_HOST_API(user_data); + + if (self->vtable == nullptr || self->vtable->load_bundle == nullptr) { + return; + } + + FlValue* value0 = fl_value_get_list_value(message_, 0); + CloudFirestoreFirestorePigeonFirebaseApp* app = + CLOUD_FIRESTORE_FIRESTORE_PIGEON_FIREBASE_APP( + fl_value_get_custom_value_object(value0)); + FlValue* value1 = fl_value_get_list_value(message_, 1); + const uint8_t* bundle = fl_value_get_uint8_list(value1); + size_t bundle_length = fl_value_get_length(value1); + g_autoptr(CloudFirestoreFirebaseFirestoreHostApiResponseHandle) handle = + cloud_firestore_firebase_firestore_host_api_response_handle_new( + channel, response_handle); + self->vtable->load_bundle(app, bundle, bundle_length, handle, + self->user_data); +} + +static void cloud_firestore_firebase_firestore_host_api_named_query_get_cb( + FlBasicMessageChannel* channel, FlValue* message_, + FlBasicMessageChannelResponseHandle* response_handle, gpointer user_data) { + CloudFirestoreFirebaseFirestoreHostApi* self = + CLOUD_FIRESTORE_FIREBASE_FIRESTORE_HOST_API(user_data); + + if (self->vtable == nullptr || self->vtable->named_query_get == nullptr) { + return; + } + + FlValue* value0 = fl_value_get_list_value(message_, 0); + CloudFirestoreFirestorePigeonFirebaseApp* app = + CLOUD_FIRESTORE_FIRESTORE_PIGEON_FIREBASE_APP( + fl_value_get_custom_value_object(value0)); + FlValue* value1 = fl_value_get_list_value(message_, 1); + const gchar* name = fl_value_get_string(value1); + FlValue* value2 = fl_value_get_list_value(message_, 2); + CloudFirestoreInternalGetOptions* options = + CLOUD_FIRESTORE_INTERNAL_GET_OPTIONS( + fl_value_get_custom_value_object(value2)); + g_autoptr(CloudFirestoreFirebaseFirestoreHostApiResponseHandle) handle = + cloud_firestore_firebase_firestore_host_api_response_handle_new( + channel, response_handle); + self->vtable->named_query_get(app, name, options, handle, self->user_data); +} + +static void cloud_firestore_firebase_firestore_host_api_clear_persistence_cb( + FlBasicMessageChannel* channel, FlValue* message_, + FlBasicMessageChannelResponseHandle* response_handle, gpointer user_data) { + CloudFirestoreFirebaseFirestoreHostApi* self = + CLOUD_FIRESTORE_FIREBASE_FIRESTORE_HOST_API(user_data); + + if (self->vtable == nullptr || self->vtable->clear_persistence == nullptr) { + return; + } + + FlValue* value0 = fl_value_get_list_value(message_, 0); + CloudFirestoreFirestorePigeonFirebaseApp* app = + CLOUD_FIRESTORE_FIRESTORE_PIGEON_FIREBASE_APP( + fl_value_get_custom_value_object(value0)); + g_autoptr(CloudFirestoreFirebaseFirestoreHostApiResponseHandle) handle = + cloud_firestore_firebase_firestore_host_api_response_handle_new( + channel, response_handle); + self->vtable->clear_persistence(app, handle, self->user_data); +} + +static void cloud_firestore_firebase_firestore_host_api_disable_network_cb( + FlBasicMessageChannel* channel, FlValue* message_, + FlBasicMessageChannelResponseHandle* response_handle, gpointer user_data) { + CloudFirestoreFirebaseFirestoreHostApi* self = + CLOUD_FIRESTORE_FIREBASE_FIRESTORE_HOST_API(user_data); + + if (self->vtable == nullptr || self->vtable->disable_network == nullptr) { + return; + } + + FlValue* value0 = fl_value_get_list_value(message_, 0); + CloudFirestoreFirestorePigeonFirebaseApp* app = + CLOUD_FIRESTORE_FIRESTORE_PIGEON_FIREBASE_APP( + fl_value_get_custom_value_object(value0)); + g_autoptr(CloudFirestoreFirebaseFirestoreHostApiResponseHandle) handle = + cloud_firestore_firebase_firestore_host_api_response_handle_new( + channel, response_handle); + self->vtable->disable_network(app, handle, self->user_data); +} + +static void cloud_firestore_firebase_firestore_host_api_enable_network_cb( + FlBasicMessageChannel* channel, FlValue* message_, + FlBasicMessageChannelResponseHandle* response_handle, gpointer user_data) { + CloudFirestoreFirebaseFirestoreHostApi* self = + CLOUD_FIRESTORE_FIREBASE_FIRESTORE_HOST_API(user_data); + + if (self->vtable == nullptr || self->vtable->enable_network == nullptr) { + return; + } + + FlValue* value0 = fl_value_get_list_value(message_, 0); + CloudFirestoreFirestorePigeonFirebaseApp* app = + CLOUD_FIRESTORE_FIRESTORE_PIGEON_FIREBASE_APP( + fl_value_get_custom_value_object(value0)); + g_autoptr(CloudFirestoreFirebaseFirestoreHostApiResponseHandle) handle = + cloud_firestore_firebase_firestore_host_api_response_handle_new( + channel, response_handle); + self->vtable->enable_network(app, handle, self->user_data); +} + +static void cloud_firestore_firebase_firestore_host_api_terminate_cb( + FlBasicMessageChannel* channel, FlValue* message_, + FlBasicMessageChannelResponseHandle* response_handle, gpointer user_data) { + CloudFirestoreFirebaseFirestoreHostApi* self = + CLOUD_FIRESTORE_FIREBASE_FIRESTORE_HOST_API(user_data); + + if (self->vtable == nullptr || self->vtable->terminate == nullptr) { + return; + } + + FlValue* value0 = fl_value_get_list_value(message_, 0); + CloudFirestoreFirestorePigeonFirebaseApp* app = + CLOUD_FIRESTORE_FIRESTORE_PIGEON_FIREBASE_APP( + fl_value_get_custom_value_object(value0)); + g_autoptr(CloudFirestoreFirebaseFirestoreHostApiResponseHandle) handle = + cloud_firestore_firebase_firestore_host_api_response_handle_new( + channel, response_handle); + self->vtable->terminate(app, handle, self->user_data); +} + +static void +cloud_firestore_firebase_firestore_host_api_wait_for_pending_writes_cb( + FlBasicMessageChannel* channel, FlValue* message_, + FlBasicMessageChannelResponseHandle* response_handle, gpointer user_data) { + CloudFirestoreFirebaseFirestoreHostApi* self = + CLOUD_FIRESTORE_FIREBASE_FIRESTORE_HOST_API(user_data); + + if (self->vtable == nullptr || + self->vtable->wait_for_pending_writes == nullptr) { + return; + } + + FlValue* value0 = fl_value_get_list_value(message_, 0); + CloudFirestoreFirestorePigeonFirebaseApp* app = + CLOUD_FIRESTORE_FIRESTORE_PIGEON_FIREBASE_APP( + fl_value_get_custom_value_object(value0)); + g_autoptr(CloudFirestoreFirebaseFirestoreHostApiResponseHandle) handle = + cloud_firestore_firebase_firestore_host_api_response_handle_new( + channel, response_handle); + self->vtable->wait_for_pending_writes(app, handle, self->user_data); +} + +static void +cloud_firestore_firebase_firestore_host_api_set_index_configuration_cb( + FlBasicMessageChannel* channel, FlValue* message_, + FlBasicMessageChannelResponseHandle* response_handle, gpointer user_data) { + CloudFirestoreFirebaseFirestoreHostApi* self = + CLOUD_FIRESTORE_FIREBASE_FIRESTORE_HOST_API(user_data); + + if (self->vtable == nullptr || + self->vtable->set_index_configuration == nullptr) { + return; + } + + FlValue* value0 = fl_value_get_list_value(message_, 0); + CloudFirestoreFirestorePigeonFirebaseApp* app = + CLOUD_FIRESTORE_FIRESTORE_PIGEON_FIREBASE_APP( + fl_value_get_custom_value_object(value0)); + FlValue* value1 = fl_value_get_list_value(message_, 1); + const gchar* index_configuration = fl_value_get_string(value1); + g_autoptr(CloudFirestoreFirebaseFirestoreHostApiResponseHandle) handle = + cloud_firestore_firebase_firestore_host_api_response_handle_new( + channel, response_handle); + self->vtable->set_index_configuration(app, index_configuration, handle, + self->user_data); +} + +static void cloud_firestore_firebase_firestore_host_api_set_logging_enabled_cb( + FlBasicMessageChannel* channel, FlValue* message_, + FlBasicMessageChannelResponseHandle* response_handle, gpointer user_data) { + CloudFirestoreFirebaseFirestoreHostApi* self = + CLOUD_FIRESTORE_FIREBASE_FIRESTORE_HOST_API(user_data); + + if (self->vtable == nullptr || self->vtable->set_logging_enabled == nullptr) { + return; + } + + FlValue* value0 = fl_value_get_list_value(message_, 0); + gboolean logging_enabled = fl_value_get_bool(value0); + g_autoptr(CloudFirestoreFirebaseFirestoreHostApiResponseHandle) handle = + cloud_firestore_firebase_firestore_host_api_response_handle_new( + channel, response_handle); + self->vtable->set_logging_enabled(logging_enabled, handle, self->user_data); +} + +static void +cloud_firestore_firebase_firestore_host_api_snapshots_in_sync_setup_cb( + FlBasicMessageChannel* channel, FlValue* message_, + FlBasicMessageChannelResponseHandle* response_handle, gpointer user_data) { + CloudFirestoreFirebaseFirestoreHostApi* self = + CLOUD_FIRESTORE_FIREBASE_FIRESTORE_HOST_API(user_data); + + if (self->vtable == nullptr || + self->vtable->snapshots_in_sync_setup == nullptr) { + return; + } + + FlValue* value0 = fl_value_get_list_value(message_, 0); + CloudFirestoreFirestorePigeonFirebaseApp* app = + CLOUD_FIRESTORE_FIRESTORE_PIGEON_FIREBASE_APP( + fl_value_get_custom_value_object(value0)); + g_autoptr(CloudFirestoreFirebaseFirestoreHostApiResponseHandle) handle = + cloud_firestore_firebase_firestore_host_api_response_handle_new( + channel, response_handle); + self->vtable->snapshots_in_sync_setup(app, handle, self->user_data); +} + +static void cloud_firestore_firebase_firestore_host_api_transaction_create_cb( + FlBasicMessageChannel* channel, FlValue* message_, + FlBasicMessageChannelResponseHandle* response_handle, gpointer user_data) { + CloudFirestoreFirebaseFirestoreHostApi* self = + CLOUD_FIRESTORE_FIREBASE_FIRESTORE_HOST_API(user_data); + + if (self->vtable == nullptr || self->vtable->transaction_create == nullptr) { + return; + } + + FlValue* value0 = fl_value_get_list_value(message_, 0); + CloudFirestoreFirestorePigeonFirebaseApp* app = + CLOUD_FIRESTORE_FIRESTORE_PIGEON_FIREBASE_APP( + fl_value_get_custom_value_object(value0)); + FlValue* value1 = fl_value_get_list_value(message_, 1); + int64_t timeout = fl_value_get_int(value1); + FlValue* value2 = fl_value_get_list_value(message_, 2); + int64_t max_attempts = fl_value_get_int(value2); + g_autoptr(CloudFirestoreFirebaseFirestoreHostApiResponseHandle) handle = + cloud_firestore_firebase_firestore_host_api_response_handle_new( + channel, response_handle); + self->vtable->transaction_create(app, timeout, max_attempts, handle, + self->user_data); +} + +static void +cloud_firestore_firebase_firestore_host_api_transaction_store_result_cb( + FlBasicMessageChannel* channel, FlValue* message_, + FlBasicMessageChannelResponseHandle* response_handle, gpointer user_data) { + CloudFirestoreFirebaseFirestoreHostApi* self = + CLOUD_FIRESTORE_FIREBASE_FIRESTORE_HOST_API(user_data); + + if (self->vtable == nullptr || + self->vtable->transaction_store_result == nullptr) { + return; + } + + FlValue* value0 = fl_value_get_list_value(message_, 0); + const gchar* transaction_id = fl_value_get_string(value0); + FlValue* value1 = fl_value_get_list_value(message_, 1); + CloudFirestoreInternalTransactionResult result_type = + static_cast( + fl_value_get_int(reinterpret_cast( + const_cast(fl_value_get_custom_value(value1))))); + FlValue* value2 = fl_value_get_list_value(message_, 2); + FlValue* commands = value2; + g_autoptr(CloudFirestoreFirebaseFirestoreHostApiResponseHandle) handle = + cloud_firestore_firebase_firestore_host_api_response_handle_new( + channel, response_handle); + self->vtable->transaction_store_result(transaction_id, result_type, commands, + handle, self->user_data); +} + +static void cloud_firestore_firebase_firestore_host_api_transaction_get_cb( + FlBasicMessageChannel* channel, FlValue* message_, + FlBasicMessageChannelResponseHandle* response_handle, gpointer user_data) { + CloudFirestoreFirebaseFirestoreHostApi* self = + CLOUD_FIRESTORE_FIREBASE_FIRESTORE_HOST_API(user_data); + + if (self->vtable == nullptr || self->vtable->transaction_get == nullptr) { + return; + } + + FlValue* value0 = fl_value_get_list_value(message_, 0); + CloudFirestoreFirestorePigeonFirebaseApp* app = + CLOUD_FIRESTORE_FIRESTORE_PIGEON_FIREBASE_APP( + fl_value_get_custom_value_object(value0)); + FlValue* value1 = fl_value_get_list_value(message_, 1); + const gchar* transaction_id = fl_value_get_string(value1); + FlValue* value2 = fl_value_get_list_value(message_, 2); + const gchar* path = fl_value_get_string(value2); + g_autoptr(CloudFirestoreFirebaseFirestoreHostApiResponseHandle) handle = + cloud_firestore_firebase_firestore_host_api_response_handle_new( + channel, response_handle); + self->vtable->transaction_get(app, transaction_id, path, handle, + self->user_data); +} + +static void +cloud_firestore_firebase_firestore_host_api_document_reference_set_cb( + FlBasicMessageChannel* channel, FlValue* message_, + FlBasicMessageChannelResponseHandle* response_handle, gpointer user_data) { + CloudFirestoreFirebaseFirestoreHostApi* self = + CLOUD_FIRESTORE_FIREBASE_FIRESTORE_HOST_API(user_data); + + if (self->vtable == nullptr || + self->vtable->document_reference_set == nullptr) { + return; + } + + FlValue* value0 = fl_value_get_list_value(message_, 0); + CloudFirestoreFirestorePigeonFirebaseApp* app = + CLOUD_FIRESTORE_FIRESTORE_PIGEON_FIREBASE_APP( + fl_value_get_custom_value_object(value0)); + FlValue* value1 = fl_value_get_list_value(message_, 1); + CloudFirestoreDocumentReferenceRequest* request = + CLOUD_FIRESTORE_DOCUMENT_REFERENCE_REQUEST( + fl_value_get_custom_value_object(value1)); + g_autoptr(CloudFirestoreFirebaseFirestoreHostApiResponseHandle) handle = + cloud_firestore_firebase_firestore_host_api_response_handle_new( + channel, response_handle); + self->vtable->document_reference_set(app, request, handle, self->user_data); +} + +static void +cloud_firestore_firebase_firestore_host_api_document_reference_update_cb( + FlBasicMessageChannel* channel, FlValue* message_, + FlBasicMessageChannelResponseHandle* response_handle, gpointer user_data) { + CloudFirestoreFirebaseFirestoreHostApi* self = + CLOUD_FIRESTORE_FIREBASE_FIRESTORE_HOST_API(user_data); + + if (self->vtable == nullptr || + self->vtable->document_reference_update == nullptr) { + return; + } + + FlValue* value0 = fl_value_get_list_value(message_, 0); + CloudFirestoreFirestorePigeonFirebaseApp* app = + CLOUD_FIRESTORE_FIRESTORE_PIGEON_FIREBASE_APP( + fl_value_get_custom_value_object(value0)); + FlValue* value1 = fl_value_get_list_value(message_, 1); + CloudFirestoreDocumentReferenceRequest* request = + CLOUD_FIRESTORE_DOCUMENT_REFERENCE_REQUEST( + fl_value_get_custom_value_object(value1)); + g_autoptr(CloudFirestoreFirebaseFirestoreHostApiResponseHandle) handle = + cloud_firestore_firebase_firestore_host_api_response_handle_new( + channel, response_handle); + self->vtable->document_reference_update(app, request, handle, + self->user_data); +} + +static void +cloud_firestore_firebase_firestore_host_api_document_reference_get_cb( + FlBasicMessageChannel* channel, FlValue* message_, + FlBasicMessageChannelResponseHandle* response_handle, gpointer user_data) { + CloudFirestoreFirebaseFirestoreHostApi* self = + CLOUD_FIRESTORE_FIREBASE_FIRESTORE_HOST_API(user_data); + + if (self->vtable == nullptr || + self->vtable->document_reference_get == nullptr) { + return; + } + + FlValue* value0 = fl_value_get_list_value(message_, 0); + CloudFirestoreFirestorePigeonFirebaseApp* app = + CLOUD_FIRESTORE_FIRESTORE_PIGEON_FIREBASE_APP( + fl_value_get_custom_value_object(value0)); + FlValue* value1 = fl_value_get_list_value(message_, 1); + CloudFirestoreDocumentReferenceRequest* request = + CLOUD_FIRESTORE_DOCUMENT_REFERENCE_REQUEST( + fl_value_get_custom_value_object(value1)); + g_autoptr(CloudFirestoreFirebaseFirestoreHostApiResponseHandle) handle = + cloud_firestore_firebase_firestore_host_api_response_handle_new( + channel, response_handle); + self->vtable->document_reference_get(app, request, handle, self->user_data); +} + +static void +cloud_firestore_firebase_firestore_host_api_document_reference_delete_cb( + FlBasicMessageChannel* channel, FlValue* message_, + FlBasicMessageChannelResponseHandle* response_handle, gpointer user_data) { + CloudFirestoreFirebaseFirestoreHostApi* self = + CLOUD_FIRESTORE_FIREBASE_FIRESTORE_HOST_API(user_data); + + if (self->vtable == nullptr || + self->vtable->document_reference_delete == nullptr) { + return; + } + + FlValue* value0 = fl_value_get_list_value(message_, 0); + CloudFirestoreFirestorePigeonFirebaseApp* app = + CLOUD_FIRESTORE_FIRESTORE_PIGEON_FIREBASE_APP( + fl_value_get_custom_value_object(value0)); + FlValue* value1 = fl_value_get_list_value(message_, 1); + CloudFirestoreDocumentReferenceRequest* request = + CLOUD_FIRESTORE_DOCUMENT_REFERENCE_REQUEST( + fl_value_get_custom_value_object(value1)); + g_autoptr(CloudFirestoreFirebaseFirestoreHostApiResponseHandle) handle = + cloud_firestore_firebase_firestore_host_api_response_handle_new( + channel, response_handle); + self->vtable->document_reference_delete(app, request, handle, + self->user_data); +} + +static void cloud_firestore_firebase_firestore_host_api_query_get_cb( + FlBasicMessageChannel* channel, FlValue* message_, + FlBasicMessageChannelResponseHandle* response_handle, gpointer user_data) { + CloudFirestoreFirebaseFirestoreHostApi* self = + CLOUD_FIRESTORE_FIREBASE_FIRESTORE_HOST_API(user_data); + + if (self->vtable == nullptr || self->vtable->query_get == nullptr) { + return; + } + + FlValue* value0 = fl_value_get_list_value(message_, 0); + CloudFirestoreFirestorePigeonFirebaseApp* app = + CLOUD_FIRESTORE_FIRESTORE_PIGEON_FIREBASE_APP( + fl_value_get_custom_value_object(value0)); + FlValue* value1 = fl_value_get_list_value(message_, 1); + const gchar* path = fl_value_get_string(value1); + FlValue* value2 = fl_value_get_list_value(message_, 2); + gboolean is_collection_group = fl_value_get_bool(value2); + FlValue* value3 = fl_value_get_list_value(message_, 3); + CloudFirestoreInternalQueryParameters* parameters = + CLOUD_FIRESTORE_INTERNAL_QUERY_PARAMETERS( + fl_value_get_custom_value_object(value3)); + FlValue* value4 = fl_value_get_list_value(message_, 4); + CloudFirestoreInternalGetOptions* options = + CLOUD_FIRESTORE_INTERNAL_GET_OPTIONS( + fl_value_get_custom_value_object(value4)); + g_autoptr(CloudFirestoreFirebaseFirestoreHostApiResponseHandle) handle = + cloud_firestore_firebase_firestore_host_api_response_handle_new( + channel, response_handle); + self->vtable->query_get(app, path, is_collection_group, parameters, options, + handle, self->user_data); +} + +static void cloud_firestore_firebase_firestore_host_api_aggregate_query_cb( + FlBasicMessageChannel* channel, FlValue* message_, + FlBasicMessageChannelResponseHandle* response_handle, gpointer user_data) { + CloudFirestoreFirebaseFirestoreHostApi* self = + CLOUD_FIRESTORE_FIREBASE_FIRESTORE_HOST_API(user_data); + + if (self->vtable == nullptr || self->vtable->aggregate_query == nullptr) { + return; + } + + FlValue* value0 = fl_value_get_list_value(message_, 0); + CloudFirestoreFirestorePigeonFirebaseApp* app = + CLOUD_FIRESTORE_FIRESTORE_PIGEON_FIREBASE_APP( + fl_value_get_custom_value_object(value0)); + FlValue* value1 = fl_value_get_list_value(message_, 1); + const gchar* path = fl_value_get_string(value1); + FlValue* value2 = fl_value_get_list_value(message_, 2); + CloudFirestoreInternalQueryParameters* parameters = + CLOUD_FIRESTORE_INTERNAL_QUERY_PARAMETERS( + fl_value_get_custom_value_object(value2)); + FlValue* value3 = fl_value_get_list_value(message_, 3); + CloudFirestoreAggregateSource source = + static_cast( + fl_value_get_int(reinterpret_cast( + const_cast(fl_value_get_custom_value(value3))))); + FlValue* value4 = fl_value_get_list_value(message_, 4); + FlValue* queries = value4; + FlValue* value5 = fl_value_get_list_value(message_, 5); + gboolean is_collection_group = fl_value_get_bool(value5); + g_autoptr(CloudFirestoreFirebaseFirestoreHostApiResponseHandle) handle = + cloud_firestore_firebase_firestore_host_api_response_handle_new( + channel, response_handle); + self->vtable->aggregate_query(app, path, parameters, source, queries, + is_collection_group, handle, self->user_data); +} + +static void cloud_firestore_firebase_firestore_host_api_write_batch_commit_cb( + FlBasicMessageChannel* channel, FlValue* message_, + FlBasicMessageChannelResponseHandle* response_handle, gpointer user_data) { + CloudFirestoreFirebaseFirestoreHostApi* self = + CLOUD_FIRESTORE_FIREBASE_FIRESTORE_HOST_API(user_data); + + if (self->vtable == nullptr || self->vtable->write_batch_commit == nullptr) { + return; + } + + FlValue* value0 = fl_value_get_list_value(message_, 0); + CloudFirestoreFirestorePigeonFirebaseApp* app = + CLOUD_FIRESTORE_FIRESTORE_PIGEON_FIREBASE_APP( + fl_value_get_custom_value_object(value0)); + FlValue* value1 = fl_value_get_list_value(message_, 1); + FlValue* writes = value1; + g_autoptr(CloudFirestoreFirebaseFirestoreHostApiResponseHandle) handle = + cloud_firestore_firebase_firestore_host_api_response_handle_new( + channel, response_handle); + self->vtable->write_batch_commit(app, writes, handle, self->user_data); +} + +static void cloud_firestore_firebase_firestore_host_api_query_snapshot_cb( + FlBasicMessageChannel* channel, FlValue* message_, + FlBasicMessageChannelResponseHandle* response_handle, gpointer user_data) { + CloudFirestoreFirebaseFirestoreHostApi* self = + CLOUD_FIRESTORE_FIREBASE_FIRESTORE_HOST_API(user_data); + + if (self->vtable == nullptr || self->vtable->query_snapshot == nullptr) { + return; + } + + FlValue* value0 = fl_value_get_list_value(message_, 0); + CloudFirestoreFirestorePigeonFirebaseApp* app = + CLOUD_FIRESTORE_FIRESTORE_PIGEON_FIREBASE_APP( + fl_value_get_custom_value_object(value0)); + FlValue* value1 = fl_value_get_list_value(message_, 1); + const gchar* path = fl_value_get_string(value1); + FlValue* value2 = fl_value_get_list_value(message_, 2); + gboolean is_collection_group = fl_value_get_bool(value2); + FlValue* value3 = fl_value_get_list_value(message_, 3); + CloudFirestoreInternalQueryParameters* parameters = + CLOUD_FIRESTORE_INTERNAL_QUERY_PARAMETERS( + fl_value_get_custom_value_object(value3)); + FlValue* value4 = fl_value_get_list_value(message_, 4); + CloudFirestoreInternalGetOptions* options = + CLOUD_FIRESTORE_INTERNAL_GET_OPTIONS( + fl_value_get_custom_value_object(value4)); + FlValue* value5 = fl_value_get_list_value(message_, 5); + gboolean include_metadata_changes = fl_value_get_bool(value5); + FlValue* value6 = fl_value_get_list_value(message_, 6); + CloudFirestoreListenSource source = static_cast( + fl_value_get_int(reinterpret_cast( + const_cast(fl_value_get_custom_value(value6))))); + g_autoptr(CloudFirestoreFirebaseFirestoreHostApiResponseHandle) handle = + cloud_firestore_firebase_firestore_host_api_response_handle_new( + channel, response_handle); + self->vtable->query_snapshot(app, path, is_collection_group, parameters, + options, include_metadata_changes, source, + handle, self->user_data); +} + +static void +cloud_firestore_firebase_firestore_host_api_document_reference_snapshot_cb( + FlBasicMessageChannel* channel, FlValue* message_, + FlBasicMessageChannelResponseHandle* response_handle, gpointer user_data) { + CloudFirestoreFirebaseFirestoreHostApi* self = + CLOUD_FIRESTORE_FIREBASE_FIRESTORE_HOST_API(user_data); + + if (self->vtable == nullptr || + self->vtable->document_reference_snapshot == nullptr) { + return; + } + + FlValue* value0 = fl_value_get_list_value(message_, 0); + CloudFirestoreFirestorePigeonFirebaseApp* app = + CLOUD_FIRESTORE_FIRESTORE_PIGEON_FIREBASE_APP( + fl_value_get_custom_value_object(value0)); + FlValue* value1 = fl_value_get_list_value(message_, 1); + CloudFirestoreDocumentReferenceRequest* parameters = + CLOUD_FIRESTORE_DOCUMENT_REFERENCE_REQUEST( + fl_value_get_custom_value_object(value1)); + FlValue* value2 = fl_value_get_list_value(message_, 2); + gboolean include_metadata_changes = fl_value_get_bool(value2); + FlValue* value3 = fl_value_get_list_value(message_, 3); + CloudFirestoreListenSource source = static_cast( + fl_value_get_int(reinterpret_cast( + const_cast(fl_value_get_custom_value(value3))))); + g_autoptr(CloudFirestoreFirebaseFirestoreHostApiResponseHandle) handle = + cloud_firestore_firebase_firestore_host_api_response_handle_new( + channel, response_handle); + self->vtable->document_reference_snapshot(app, parameters, + include_metadata_changes, source, + handle, self->user_data); +} + +static void +cloud_firestore_firebase_firestore_host_api_persistence_cache_index_manager_request_cb( + FlBasicMessageChannel* channel, FlValue* message_, + FlBasicMessageChannelResponseHandle* response_handle, gpointer user_data) { + CloudFirestoreFirebaseFirestoreHostApi* self = + CLOUD_FIRESTORE_FIREBASE_FIRESTORE_HOST_API(user_data); + + if (self->vtable == nullptr || + self->vtable->persistence_cache_index_manager_request == nullptr) { + return; + } + + FlValue* value0 = fl_value_get_list_value(message_, 0); + CloudFirestoreFirestorePigeonFirebaseApp* app = + CLOUD_FIRESTORE_FIRESTORE_PIGEON_FIREBASE_APP( + fl_value_get_custom_value_object(value0)); + FlValue* value1 = fl_value_get_list_value(message_, 1); + CloudFirestorePersistenceCacheIndexManagerRequest request = + static_cast( + fl_value_get_int(reinterpret_cast( + const_cast(fl_value_get_custom_value(value1))))); + g_autoptr(CloudFirestoreFirebaseFirestoreHostApiResponseHandle) handle = + cloud_firestore_firebase_firestore_host_api_response_handle_new( + channel, response_handle); + self->vtable->persistence_cache_index_manager_request(app, request, handle, + self->user_data); +} + +static void cloud_firestore_firebase_firestore_host_api_execute_pipeline_cb( + FlBasicMessageChannel* channel, FlValue* message_, + FlBasicMessageChannelResponseHandle* response_handle, gpointer user_data) { + CloudFirestoreFirebaseFirestoreHostApi* self = + CLOUD_FIRESTORE_FIREBASE_FIRESTORE_HOST_API(user_data); + + if (self->vtable == nullptr || self->vtable->execute_pipeline == nullptr) { + return; + } + + FlValue* value0 = fl_value_get_list_value(message_, 0); + CloudFirestoreFirestorePigeonFirebaseApp* app = + CLOUD_FIRESTORE_FIRESTORE_PIGEON_FIREBASE_APP( + fl_value_get_custom_value_object(value0)); + FlValue* value1 = fl_value_get_list_value(message_, 1); + FlValue* stages = value1; + FlValue* value2 = fl_value_get_list_value(message_, 2); + FlValue* options = value2; + g_autoptr(CloudFirestoreFirebaseFirestoreHostApiResponseHandle) handle = + cloud_firestore_firebase_firestore_host_api_response_handle_new( + channel, response_handle); + self->vtable->execute_pipeline(app, stages, options, handle, self->user_data); +} + +void cloud_firestore_firebase_firestore_host_api_set_method_handlers( + FlBinaryMessenger* messenger, const gchar* suffix, + const CloudFirestoreFirebaseFirestoreHostApiVTable* vtable, + gpointer user_data, GDestroyNotify user_data_free_func) { + g_autofree gchar* dot_suffix = + suffix != nullptr ? g_strdup_printf(".%s", suffix) : g_strdup(""); + g_autoptr(CloudFirestoreFirebaseFirestoreHostApi) api_data = + cloud_firestore_firebase_firestore_host_api_new(vtable, user_data, + user_data_free_func); + + g_autoptr(CloudFirestoreMessageCodec) codec = + cloud_firestore_message_codec_new(); + g_autofree gchar* load_bundle_channel_name = g_strdup_printf( + "dev.flutter.pigeon.cloud_firestore_platform_interface." + "FirebaseFirestoreHostApi.loadBundle%s", + dot_suffix); + g_autoptr(FlBasicMessageChannel) load_bundle_channel = + fl_basic_message_channel_new(messenger, load_bundle_channel_name, + FL_MESSAGE_CODEC(codec)); + fl_basic_message_channel_set_message_handler( + load_bundle_channel, + cloud_firestore_firebase_firestore_host_api_load_bundle_cb, + g_object_ref(api_data), g_object_unref); + g_autofree gchar* named_query_get_channel_name = g_strdup_printf( + "dev.flutter.pigeon.cloud_firestore_platform_interface." + "FirebaseFirestoreHostApi.namedQueryGet%s", + dot_suffix); + g_autoptr(FlBasicMessageChannel) named_query_get_channel = + fl_basic_message_channel_new(messenger, named_query_get_channel_name, + FL_MESSAGE_CODEC(codec)); + fl_basic_message_channel_set_message_handler( + named_query_get_channel, + cloud_firestore_firebase_firestore_host_api_named_query_get_cb, + g_object_ref(api_data), g_object_unref); + g_autofree gchar* clear_persistence_channel_name = g_strdup_printf( + "dev.flutter.pigeon.cloud_firestore_platform_interface." + "FirebaseFirestoreHostApi.clearPersistence%s", + dot_suffix); + g_autoptr(FlBasicMessageChannel) clear_persistence_channel = + fl_basic_message_channel_new(messenger, clear_persistence_channel_name, + FL_MESSAGE_CODEC(codec)); + fl_basic_message_channel_set_message_handler( + clear_persistence_channel, + cloud_firestore_firebase_firestore_host_api_clear_persistence_cb, + g_object_ref(api_data), g_object_unref); + g_autofree gchar* disable_network_channel_name = g_strdup_printf( + "dev.flutter.pigeon.cloud_firestore_platform_interface." + "FirebaseFirestoreHostApi.disableNetwork%s", + dot_suffix); + g_autoptr(FlBasicMessageChannel) disable_network_channel = + fl_basic_message_channel_new(messenger, disable_network_channel_name, + FL_MESSAGE_CODEC(codec)); + fl_basic_message_channel_set_message_handler( + disable_network_channel, + cloud_firestore_firebase_firestore_host_api_disable_network_cb, + g_object_ref(api_data), g_object_unref); + g_autofree gchar* enable_network_channel_name = g_strdup_printf( + "dev.flutter.pigeon.cloud_firestore_platform_interface." + "FirebaseFirestoreHostApi.enableNetwork%s", + dot_suffix); + g_autoptr(FlBasicMessageChannel) enable_network_channel = + fl_basic_message_channel_new(messenger, enable_network_channel_name, + FL_MESSAGE_CODEC(codec)); + fl_basic_message_channel_set_message_handler( + enable_network_channel, + cloud_firestore_firebase_firestore_host_api_enable_network_cb, + g_object_ref(api_data), g_object_unref); + g_autofree gchar* terminate_channel_name = g_strdup_printf( + "dev.flutter.pigeon.cloud_firestore_platform_interface." + "FirebaseFirestoreHostApi.terminate%s", + dot_suffix); + g_autoptr(FlBasicMessageChannel) terminate_channel = + fl_basic_message_channel_new(messenger, terminate_channel_name, + FL_MESSAGE_CODEC(codec)); + fl_basic_message_channel_set_message_handler( + terminate_channel, + cloud_firestore_firebase_firestore_host_api_terminate_cb, + g_object_ref(api_data), g_object_unref); + g_autofree gchar* wait_for_pending_writes_channel_name = g_strdup_printf( + "dev.flutter.pigeon.cloud_firestore_platform_interface." + "FirebaseFirestoreHostApi.waitForPendingWrites%s", + dot_suffix); + g_autoptr(FlBasicMessageChannel) wait_for_pending_writes_channel = + fl_basic_message_channel_new(messenger, + wait_for_pending_writes_channel_name, + FL_MESSAGE_CODEC(codec)); + fl_basic_message_channel_set_message_handler( + wait_for_pending_writes_channel, + cloud_firestore_firebase_firestore_host_api_wait_for_pending_writes_cb, + g_object_ref(api_data), g_object_unref); + g_autofree gchar* set_index_configuration_channel_name = g_strdup_printf( + "dev.flutter.pigeon.cloud_firestore_platform_interface." + "FirebaseFirestoreHostApi.setIndexConfiguration%s", + dot_suffix); + g_autoptr(FlBasicMessageChannel) set_index_configuration_channel = + fl_basic_message_channel_new(messenger, + set_index_configuration_channel_name, + FL_MESSAGE_CODEC(codec)); + fl_basic_message_channel_set_message_handler( + set_index_configuration_channel, + cloud_firestore_firebase_firestore_host_api_set_index_configuration_cb, + g_object_ref(api_data), g_object_unref); + g_autofree gchar* set_logging_enabled_channel_name = g_strdup_printf( + "dev.flutter.pigeon.cloud_firestore_platform_interface." + "FirebaseFirestoreHostApi.setLoggingEnabled%s", + dot_suffix); + g_autoptr(FlBasicMessageChannel) set_logging_enabled_channel = + fl_basic_message_channel_new(messenger, set_logging_enabled_channel_name, + FL_MESSAGE_CODEC(codec)); + fl_basic_message_channel_set_message_handler( + set_logging_enabled_channel, + cloud_firestore_firebase_firestore_host_api_set_logging_enabled_cb, + g_object_ref(api_data), g_object_unref); + g_autofree gchar* snapshots_in_sync_setup_channel_name = g_strdup_printf( + "dev.flutter.pigeon.cloud_firestore_platform_interface." + "FirebaseFirestoreHostApi.snapshotsInSyncSetup%s", + dot_suffix); + g_autoptr(FlBasicMessageChannel) snapshots_in_sync_setup_channel = + fl_basic_message_channel_new(messenger, + snapshots_in_sync_setup_channel_name, + FL_MESSAGE_CODEC(codec)); + fl_basic_message_channel_set_message_handler( + snapshots_in_sync_setup_channel, + cloud_firestore_firebase_firestore_host_api_snapshots_in_sync_setup_cb, + g_object_ref(api_data), g_object_unref); + g_autofree gchar* transaction_create_channel_name = g_strdup_printf( + "dev.flutter.pigeon.cloud_firestore_platform_interface." + "FirebaseFirestoreHostApi.transactionCreate%s", + dot_suffix); + g_autoptr(FlBasicMessageChannel) transaction_create_channel = + fl_basic_message_channel_new(messenger, transaction_create_channel_name, + FL_MESSAGE_CODEC(codec)); + fl_basic_message_channel_set_message_handler( + transaction_create_channel, + cloud_firestore_firebase_firestore_host_api_transaction_create_cb, + g_object_ref(api_data), g_object_unref); + g_autofree gchar* transaction_store_result_channel_name = g_strdup_printf( + "dev.flutter.pigeon.cloud_firestore_platform_interface." + "FirebaseFirestoreHostApi.transactionStoreResult%s", + dot_suffix); + g_autoptr(FlBasicMessageChannel) transaction_store_result_channel = + fl_basic_message_channel_new(messenger, + transaction_store_result_channel_name, + FL_MESSAGE_CODEC(codec)); + fl_basic_message_channel_set_message_handler( + transaction_store_result_channel, + cloud_firestore_firebase_firestore_host_api_transaction_store_result_cb, + g_object_ref(api_data), g_object_unref); + g_autofree gchar* transaction_get_channel_name = g_strdup_printf( + "dev.flutter.pigeon.cloud_firestore_platform_interface." + "FirebaseFirestoreHostApi.transactionGet%s", + dot_suffix); + g_autoptr(FlBasicMessageChannel) transaction_get_channel = + fl_basic_message_channel_new(messenger, transaction_get_channel_name, + FL_MESSAGE_CODEC(codec)); + fl_basic_message_channel_set_message_handler( + transaction_get_channel, + cloud_firestore_firebase_firestore_host_api_transaction_get_cb, + g_object_ref(api_data), g_object_unref); + g_autofree gchar* document_reference_set_channel_name = g_strdup_printf( + "dev.flutter.pigeon.cloud_firestore_platform_interface." + "FirebaseFirestoreHostApi.documentReferenceSet%s", + dot_suffix); + g_autoptr(FlBasicMessageChannel) document_reference_set_channel = + fl_basic_message_channel_new(messenger, + document_reference_set_channel_name, + FL_MESSAGE_CODEC(codec)); + fl_basic_message_channel_set_message_handler( + document_reference_set_channel, + cloud_firestore_firebase_firestore_host_api_document_reference_set_cb, + g_object_ref(api_data), g_object_unref); + g_autofree gchar* document_reference_update_channel_name = g_strdup_printf( + "dev.flutter.pigeon.cloud_firestore_platform_interface." + "FirebaseFirestoreHostApi.documentReferenceUpdate%s", + dot_suffix); + g_autoptr(FlBasicMessageChannel) document_reference_update_channel = + fl_basic_message_channel_new(messenger, + document_reference_update_channel_name, + FL_MESSAGE_CODEC(codec)); + fl_basic_message_channel_set_message_handler( + document_reference_update_channel, + cloud_firestore_firebase_firestore_host_api_document_reference_update_cb, + g_object_ref(api_data), g_object_unref); + g_autofree gchar* document_reference_get_channel_name = g_strdup_printf( + "dev.flutter.pigeon.cloud_firestore_platform_interface." + "FirebaseFirestoreHostApi.documentReferenceGet%s", + dot_suffix); + g_autoptr(FlBasicMessageChannel) document_reference_get_channel = + fl_basic_message_channel_new(messenger, + document_reference_get_channel_name, + FL_MESSAGE_CODEC(codec)); + fl_basic_message_channel_set_message_handler( + document_reference_get_channel, + cloud_firestore_firebase_firestore_host_api_document_reference_get_cb, + g_object_ref(api_data), g_object_unref); + g_autofree gchar* document_reference_delete_channel_name = g_strdup_printf( + "dev.flutter.pigeon.cloud_firestore_platform_interface." + "FirebaseFirestoreHostApi.documentReferenceDelete%s", + dot_suffix); + g_autoptr(FlBasicMessageChannel) document_reference_delete_channel = + fl_basic_message_channel_new(messenger, + document_reference_delete_channel_name, + FL_MESSAGE_CODEC(codec)); + fl_basic_message_channel_set_message_handler( + document_reference_delete_channel, + cloud_firestore_firebase_firestore_host_api_document_reference_delete_cb, + g_object_ref(api_data), g_object_unref); + g_autofree gchar* query_get_channel_name = g_strdup_printf( + "dev.flutter.pigeon.cloud_firestore_platform_interface." + "FirebaseFirestoreHostApi.queryGet%s", + dot_suffix); + g_autoptr(FlBasicMessageChannel) query_get_channel = + fl_basic_message_channel_new(messenger, query_get_channel_name, + FL_MESSAGE_CODEC(codec)); + fl_basic_message_channel_set_message_handler( + query_get_channel, + cloud_firestore_firebase_firestore_host_api_query_get_cb, + g_object_ref(api_data), g_object_unref); + g_autofree gchar* aggregate_query_channel_name = g_strdup_printf( + "dev.flutter.pigeon.cloud_firestore_platform_interface." + "FirebaseFirestoreHostApi.aggregateQuery%s", + dot_suffix); + g_autoptr(FlBasicMessageChannel) aggregate_query_channel = + fl_basic_message_channel_new(messenger, aggregate_query_channel_name, + FL_MESSAGE_CODEC(codec)); + fl_basic_message_channel_set_message_handler( + aggregate_query_channel, + cloud_firestore_firebase_firestore_host_api_aggregate_query_cb, + g_object_ref(api_data), g_object_unref); + g_autofree gchar* write_batch_commit_channel_name = g_strdup_printf( + "dev.flutter.pigeon.cloud_firestore_platform_interface." + "FirebaseFirestoreHostApi.writeBatchCommit%s", + dot_suffix); + g_autoptr(FlBasicMessageChannel) write_batch_commit_channel = + fl_basic_message_channel_new(messenger, write_batch_commit_channel_name, + FL_MESSAGE_CODEC(codec)); + fl_basic_message_channel_set_message_handler( + write_batch_commit_channel, + cloud_firestore_firebase_firestore_host_api_write_batch_commit_cb, + g_object_ref(api_data), g_object_unref); + g_autofree gchar* query_snapshot_channel_name = g_strdup_printf( + "dev.flutter.pigeon.cloud_firestore_platform_interface." + "FirebaseFirestoreHostApi.querySnapshot%s", + dot_suffix); + g_autoptr(FlBasicMessageChannel) query_snapshot_channel = + fl_basic_message_channel_new(messenger, query_snapshot_channel_name, + FL_MESSAGE_CODEC(codec)); + fl_basic_message_channel_set_message_handler( + query_snapshot_channel, + cloud_firestore_firebase_firestore_host_api_query_snapshot_cb, + g_object_ref(api_data), g_object_unref); + g_autofree gchar* document_reference_snapshot_channel_name = g_strdup_printf( + "dev.flutter.pigeon.cloud_firestore_platform_interface." + "FirebaseFirestoreHostApi.documentReferenceSnapshot%s", + dot_suffix); + g_autoptr(FlBasicMessageChannel) document_reference_snapshot_channel = + fl_basic_message_channel_new(messenger, + document_reference_snapshot_channel_name, + FL_MESSAGE_CODEC(codec)); + fl_basic_message_channel_set_message_handler( + document_reference_snapshot_channel, + cloud_firestore_firebase_firestore_host_api_document_reference_snapshot_cb, + g_object_ref(api_data), g_object_unref); + g_autofree gchar* persistence_cache_index_manager_request_channel_name = + g_strdup_printf( + "dev.flutter.pigeon.cloud_firestore_platform_interface." + "FirebaseFirestoreHostApi.persistenceCacheIndexManagerRequest%s", + dot_suffix); + g_autoptr(FlBasicMessageChannel) + persistence_cache_index_manager_request_channel = + fl_basic_message_channel_new( + messenger, persistence_cache_index_manager_request_channel_name, + FL_MESSAGE_CODEC(codec)); + fl_basic_message_channel_set_message_handler( + persistence_cache_index_manager_request_channel, + cloud_firestore_firebase_firestore_host_api_persistence_cache_index_manager_request_cb, + g_object_ref(api_data), g_object_unref); + g_autofree gchar* execute_pipeline_channel_name = g_strdup_printf( + "dev.flutter.pigeon.cloud_firestore_platform_interface." + "FirebaseFirestoreHostApi.executePipeline%s", + dot_suffix); + g_autoptr(FlBasicMessageChannel) execute_pipeline_channel = + fl_basic_message_channel_new(messenger, execute_pipeline_channel_name, + FL_MESSAGE_CODEC(codec)); + fl_basic_message_channel_set_message_handler( + execute_pipeline_channel, + cloud_firestore_firebase_firestore_host_api_execute_pipeline_cb, + g_object_ref(api_data), g_object_unref); +} + +void cloud_firestore_firebase_firestore_host_api_clear_method_handlers( + FlBinaryMessenger* messenger, const gchar* suffix) { + g_autofree gchar* dot_suffix = + suffix != nullptr ? g_strdup_printf(".%s", suffix) : g_strdup(""); + + g_autoptr(CloudFirestoreMessageCodec) codec = + cloud_firestore_message_codec_new(); + g_autofree gchar* load_bundle_channel_name = g_strdup_printf( + "dev.flutter.pigeon.cloud_firestore_platform_interface." + "FirebaseFirestoreHostApi.loadBundle%s", + dot_suffix); + g_autoptr(FlBasicMessageChannel) load_bundle_channel = + fl_basic_message_channel_new(messenger, load_bundle_channel_name, + FL_MESSAGE_CODEC(codec)); + fl_basic_message_channel_set_message_handler(load_bundle_channel, nullptr, + nullptr, nullptr); + g_autofree gchar* named_query_get_channel_name = g_strdup_printf( + "dev.flutter.pigeon.cloud_firestore_platform_interface." + "FirebaseFirestoreHostApi.namedQueryGet%s", + dot_suffix); + g_autoptr(FlBasicMessageChannel) named_query_get_channel = + fl_basic_message_channel_new(messenger, named_query_get_channel_name, + FL_MESSAGE_CODEC(codec)); + fl_basic_message_channel_set_message_handler(named_query_get_channel, nullptr, + nullptr, nullptr); + g_autofree gchar* clear_persistence_channel_name = g_strdup_printf( + "dev.flutter.pigeon.cloud_firestore_platform_interface." + "FirebaseFirestoreHostApi.clearPersistence%s", + dot_suffix); + g_autoptr(FlBasicMessageChannel) clear_persistence_channel = + fl_basic_message_channel_new(messenger, clear_persistence_channel_name, + FL_MESSAGE_CODEC(codec)); + fl_basic_message_channel_set_message_handler(clear_persistence_channel, + nullptr, nullptr, nullptr); + g_autofree gchar* disable_network_channel_name = g_strdup_printf( + "dev.flutter.pigeon.cloud_firestore_platform_interface." + "FirebaseFirestoreHostApi.disableNetwork%s", + dot_suffix); + g_autoptr(FlBasicMessageChannel) disable_network_channel = + fl_basic_message_channel_new(messenger, disable_network_channel_name, + FL_MESSAGE_CODEC(codec)); + fl_basic_message_channel_set_message_handler(disable_network_channel, nullptr, + nullptr, nullptr); + g_autofree gchar* enable_network_channel_name = g_strdup_printf( + "dev.flutter.pigeon.cloud_firestore_platform_interface." + "FirebaseFirestoreHostApi.enableNetwork%s", + dot_suffix); + g_autoptr(FlBasicMessageChannel) enable_network_channel = + fl_basic_message_channel_new(messenger, enable_network_channel_name, + FL_MESSAGE_CODEC(codec)); + fl_basic_message_channel_set_message_handler(enable_network_channel, nullptr, + nullptr, nullptr); + g_autofree gchar* terminate_channel_name = g_strdup_printf( + "dev.flutter.pigeon.cloud_firestore_platform_interface." + "FirebaseFirestoreHostApi.terminate%s", + dot_suffix); + g_autoptr(FlBasicMessageChannel) terminate_channel = + fl_basic_message_channel_new(messenger, terminate_channel_name, + FL_MESSAGE_CODEC(codec)); + fl_basic_message_channel_set_message_handler(terminate_channel, nullptr, + nullptr, nullptr); + g_autofree gchar* wait_for_pending_writes_channel_name = g_strdup_printf( + "dev.flutter.pigeon.cloud_firestore_platform_interface." + "FirebaseFirestoreHostApi.waitForPendingWrites%s", + dot_suffix); + g_autoptr(FlBasicMessageChannel) wait_for_pending_writes_channel = + fl_basic_message_channel_new(messenger, + wait_for_pending_writes_channel_name, + FL_MESSAGE_CODEC(codec)); + fl_basic_message_channel_set_message_handler(wait_for_pending_writes_channel, + nullptr, nullptr, nullptr); + g_autofree gchar* set_index_configuration_channel_name = g_strdup_printf( + "dev.flutter.pigeon.cloud_firestore_platform_interface." + "FirebaseFirestoreHostApi.setIndexConfiguration%s", + dot_suffix); + g_autoptr(FlBasicMessageChannel) set_index_configuration_channel = + fl_basic_message_channel_new(messenger, + set_index_configuration_channel_name, + FL_MESSAGE_CODEC(codec)); + fl_basic_message_channel_set_message_handler(set_index_configuration_channel, + nullptr, nullptr, nullptr); + g_autofree gchar* set_logging_enabled_channel_name = g_strdup_printf( + "dev.flutter.pigeon.cloud_firestore_platform_interface." + "FirebaseFirestoreHostApi.setLoggingEnabled%s", + dot_suffix); + g_autoptr(FlBasicMessageChannel) set_logging_enabled_channel = + fl_basic_message_channel_new(messenger, set_logging_enabled_channel_name, + FL_MESSAGE_CODEC(codec)); + fl_basic_message_channel_set_message_handler(set_logging_enabled_channel, + nullptr, nullptr, nullptr); + g_autofree gchar* snapshots_in_sync_setup_channel_name = g_strdup_printf( + "dev.flutter.pigeon.cloud_firestore_platform_interface." + "FirebaseFirestoreHostApi.snapshotsInSyncSetup%s", + dot_suffix); + g_autoptr(FlBasicMessageChannel) snapshots_in_sync_setup_channel = + fl_basic_message_channel_new(messenger, + snapshots_in_sync_setup_channel_name, + FL_MESSAGE_CODEC(codec)); + fl_basic_message_channel_set_message_handler(snapshots_in_sync_setup_channel, + nullptr, nullptr, nullptr); + g_autofree gchar* transaction_create_channel_name = g_strdup_printf( + "dev.flutter.pigeon.cloud_firestore_platform_interface." + "FirebaseFirestoreHostApi.transactionCreate%s", + dot_suffix); + g_autoptr(FlBasicMessageChannel) transaction_create_channel = + fl_basic_message_channel_new(messenger, transaction_create_channel_name, + FL_MESSAGE_CODEC(codec)); + fl_basic_message_channel_set_message_handler(transaction_create_channel, + nullptr, nullptr, nullptr); + g_autofree gchar* transaction_store_result_channel_name = g_strdup_printf( + "dev.flutter.pigeon.cloud_firestore_platform_interface." + "FirebaseFirestoreHostApi.transactionStoreResult%s", + dot_suffix); + g_autoptr(FlBasicMessageChannel) transaction_store_result_channel = + fl_basic_message_channel_new(messenger, + transaction_store_result_channel_name, + FL_MESSAGE_CODEC(codec)); + fl_basic_message_channel_set_message_handler(transaction_store_result_channel, + nullptr, nullptr, nullptr); + g_autofree gchar* transaction_get_channel_name = g_strdup_printf( + "dev.flutter.pigeon.cloud_firestore_platform_interface." + "FirebaseFirestoreHostApi.transactionGet%s", + dot_suffix); + g_autoptr(FlBasicMessageChannel) transaction_get_channel = + fl_basic_message_channel_new(messenger, transaction_get_channel_name, + FL_MESSAGE_CODEC(codec)); + fl_basic_message_channel_set_message_handler(transaction_get_channel, nullptr, + nullptr, nullptr); + g_autofree gchar* document_reference_set_channel_name = g_strdup_printf( + "dev.flutter.pigeon.cloud_firestore_platform_interface." + "FirebaseFirestoreHostApi.documentReferenceSet%s", + dot_suffix); + g_autoptr(FlBasicMessageChannel) document_reference_set_channel = + fl_basic_message_channel_new(messenger, + document_reference_set_channel_name, + FL_MESSAGE_CODEC(codec)); + fl_basic_message_channel_set_message_handler(document_reference_set_channel, + nullptr, nullptr, nullptr); + g_autofree gchar* document_reference_update_channel_name = g_strdup_printf( + "dev.flutter.pigeon.cloud_firestore_platform_interface." + "FirebaseFirestoreHostApi.documentReferenceUpdate%s", + dot_suffix); + g_autoptr(FlBasicMessageChannel) document_reference_update_channel = + fl_basic_message_channel_new(messenger, + document_reference_update_channel_name, + FL_MESSAGE_CODEC(codec)); + fl_basic_message_channel_set_message_handler( + document_reference_update_channel, nullptr, nullptr, nullptr); + g_autofree gchar* document_reference_get_channel_name = g_strdup_printf( + "dev.flutter.pigeon.cloud_firestore_platform_interface." + "FirebaseFirestoreHostApi.documentReferenceGet%s", + dot_suffix); + g_autoptr(FlBasicMessageChannel) document_reference_get_channel = + fl_basic_message_channel_new(messenger, + document_reference_get_channel_name, + FL_MESSAGE_CODEC(codec)); + fl_basic_message_channel_set_message_handler(document_reference_get_channel, + nullptr, nullptr, nullptr); + g_autofree gchar* document_reference_delete_channel_name = g_strdup_printf( + "dev.flutter.pigeon.cloud_firestore_platform_interface." + "FirebaseFirestoreHostApi.documentReferenceDelete%s", + dot_suffix); + g_autoptr(FlBasicMessageChannel) document_reference_delete_channel = + fl_basic_message_channel_new(messenger, + document_reference_delete_channel_name, + FL_MESSAGE_CODEC(codec)); + fl_basic_message_channel_set_message_handler( + document_reference_delete_channel, nullptr, nullptr, nullptr); + g_autofree gchar* query_get_channel_name = g_strdup_printf( + "dev.flutter.pigeon.cloud_firestore_platform_interface." + "FirebaseFirestoreHostApi.queryGet%s", + dot_suffix); + g_autoptr(FlBasicMessageChannel) query_get_channel = + fl_basic_message_channel_new(messenger, query_get_channel_name, + FL_MESSAGE_CODEC(codec)); + fl_basic_message_channel_set_message_handler(query_get_channel, nullptr, + nullptr, nullptr); + g_autofree gchar* aggregate_query_channel_name = g_strdup_printf( + "dev.flutter.pigeon.cloud_firestore_platform_interface." + "FirebaseFirestoreHostApi.aggregateQuery%s", + dot_suffix); + g_autoptr(FlBasicMessageChannel) aggregate_query_channel = + fl_basic_message_channel_new(messenger, aggregate_query_channel_name, + FL_MESSAGE_CODEC(codec)); + fl_basic_message_channel_set_message_handler(aggregate_query_channel, nullptr, + nullptr, nullptr); + g_autofree gchar* write_batch_commit_channel_name = g_strdup_printf( + "dev.flutter.pigeon.cloud_firestore_platform_interface." + "FirebaseFirestoreHostApi.writeBatchCommit%s", + dot_suffix); + g_autoptr(FlBasicMessageChannel) write_batch_commit_channel = + fl_basic_message_channel_new(messenger, write_batch_commit_channel_name, + FL_MESSAGE_CODEC(codec)); + fl_basic_message_channel_set_message_handler(write_batch_commit_channel, + nullptr, nullptr, nullptr); + g_autofree gchar* query_snapshot_channel_name = g_strdup_printf( + "dev.flutter.pigeon.cloud_firestore_platform_interface." + "FirebaseFirestoreHostApi.querySnapshot%s", + dot_suffix); + g_autoptr(FlBasicMessageChannel) query_snapshot_channel = + fl_basic_message_channel_new(messenger, query_snapshot_channel_name, + FL_MESSAGE_CODEC(codec)); + fl_basic_message_channel_set_message_handler(query_snapshot_channel, nullptr, + nullptr, nullptr); + g_autofree gchar* document_reference_snapshot_channel_name = g_strdup_printf( + "dev.flutter.pigeon.cloud_firestore_platform_interface." + "FirebaseFirestoreHostApi.documentReferenceSnapshot%s", + dot_suffix); + g_autoptr(FlBasicMessageChannel) document_reference_snapshot_channel = + fl_basic_message_channel_new(messenger, + document_reference_snapshot_channel_name, + FL_MESSAGE_CODEC(codec)); + fl_basic_message_channel_set_message_handler( + document_reference_snapshot_channel, nullptr, nullptr, nullptr); + g_autofree gchar* persistence_cache_index_manager_request_channel_name = + g_strdup_printf( + "dev.flutter.pigeon.cloud_firestore_platform_interface." + "FirebaseFirestoreHostApi.persistenceCacheIndexManagerRequest%s", + dot_suffix); + g_autoptr(FlBasicMessageChannel) + persistence_cache_index_manager_request_channel = + fl_basic_message_channel_new( + messenger, persistence_cache_index_manager_request_channel_name, + FL_MESSAGE_CODEC(codec)); + fl_basic_message_channel_set_message_handler( + persistence_cache_index_manager_request_channel, nullptr, nullptr, + nullptr); + g_autofree gchar* execute_pipeline_channel_name = g_strdup_printf( + "dev.flutter.pigeon.cloud_firestore_platform_interface." + "FirebaseFirestoreHostApi.executePipeline%s", + dot_suffix); + g_autoptr(FlBasicMessageChannel) execute_pipeline_channel = + fl_basic_message_channel_new(messenger, execute_pipeline_channel_name, + FL_MESSAGE_CODEC(codec)); + fl_basic_message_channel_set_message_handler(execute_pipeline_channel, + nullptr, nullptr, nullptr); +} + +void cloud_firestore_firebase_firestore_host_api_respond_load_bundle( + CloudFirestoreFirebaseFirestoreHostApiResponseHandle* response_handle, + const gchar* return_value) { + g_autoptr(CloudFirestoreFirebaseFirestoreHostApiLoadBundleResponse) response = + cloud_firestore_firebase_firestore_host_api_load_bundle_response_new( + return_value); + g_autoptr(GError) error = nullptr; + if (!fl_basic_message_channel_respond(response_handle->channel, + response_handle->response_handle, + response->value, &error)) { + g_warning("Failed to send response to %s.%s: %s", + "FirebaseFirestoreHostApi", "loadBundle", error->message); + } +} + +void cloud_firestore_firebase_firestore_host_api_respond_error_load_bundle( + CloudFirestoreFirebaseFirestoreHostApiResponseHandle* response_handle, + const gchar* code, const gchar* message, FlValue* details) { + g_autoptr(CloudFirestoreFirebaseFirestoreHostApiLoadBundleResponse) response = + cloud_firestore_firebase_firestore_host_api_load_bundle_response_new_error( + code, message, details); + g_autoptr(GError) error = nullptr; + if (!fl_basic_message_channel_respond(response_handle->channel, + response_handle->response_handle, + response->value, &error)) { + g_warning("Failed to send response to %s.%s: %s", + "FirebaseFirestoreHostApi", "loadBundle", error->message); + } +} + +void cloud_firestore_firebase_firestore_host_api_respond_named_query_get( + CloudFirestoreFirebaseFirestoreHostApiResponseHandle* response_handle, + CloudFirestoreInternalQuerySnapshot* return_value) { + g_autoptr( + CloudFirestoreFirebaseFirestoreHostApiNamedQueryGetResponse) response = + cloud_firestore_firebase_firestore_host_api_named_query_get_response_new( + return_value); + g_autoptr(GError) error = nullptr; + if (!fl_basic_message_channel_respond(response_handle->channel, + response_handle->response_handle, + response->value, &error)) { + g_warning("Failed to send response to %s.%s: %s", + "FirebaseFirestoreHostApi", "namedQueryGet", error->message); + } +} + +void cloud_firestore_firebase_firestore_host_api_respond_error_named_query_get( + CloudFirestoreFirebaseFirestoreHostApiResponseHandle* response_handle, + const gchar* code, const gchar* message, FlValue* details) { + g_autoptr( + CloudFirestoreFirebaseFirestoreHostApiNamedQueryGetResponse) response = + cloud_firestore_firebase_firestore_host_api_named_query_get_response_new_error( + code, message, details); + g_autoptr(GError) error = nullptr; + if (!fl_basic_message_channel_respond(response_handle->channel, + response_handle->response_handle, + response->value, &error)) { + g_warning("Failed to send response to %s.%s: %s", + "FirebaseFirestoreHostApi", "namedQueryGet", error->message); + } +} + +void cloud_firestore_firebase_firestore_host_api_respond_clear_persistence( + CloudFirestoreFirebaseFirestoreHostApiResponseHandle* response_handle) { + g_autoptr( + CloudFirestoreFirebaseFirestoreHostApiClearPersistenceResponse) response = + cloud_firestore_firebase_firestore_host_api_clear_persistence_response_new(); + g_autoptr(GError) error = nullptr; + if (!fl_basic_message_channel_respond(response_handle->channel, + response_handle->response_handle, + response->value, &error)) { + g_warning("Failed to send response to %s.%s: %s", + "FirebaseFirestoreHostApi", "clearPersistence", error->message); + } +} + +void cloud_firestore_firebase_firestore_host_api_respond_error_clear_persistence( + CloudFirestoreFirebaseFirestoreHostApiResponseHandle* response_handle, + const gchar* code, const gchar* message, FlValue* details) { + g_autoptr( + CloudFirestoreFirebaseFirestoreHostApiClearPersistenceResponse) response = + cloud_firestore_firebase_firestore_host_api_clear_persistence_response_new_error( + code, message, details); + g_autoptr(GError) error = nullptr; + if (!fl_basic_message_channel_respond(response_handle->channel, + response_handle->response_handle, + response->value, &error)) { + g_warning("Failed to send response to %s.%s: %s", + "FirebaseFirestoreHostApi", "clearPersistence", error->message); + } +} + +void cloud_firestore_firebase_firestore_host_api_respond_disable_network( + CloudFirestoreFirebaseFirestoreHostApiResponseHandle* response_handle) { + g_autoptr( + CloudFirestoreFirebaseFirestoreHostApiDisableNetworkResponse) response = + cloud_firestore_firebase_firestore_host_api_disable_network_response_new(); + g_autoptr(GError) error = nullptr; + if (!fl_basic_message_channel_respond(response_handle->channel, + response_handle->response_handle, + response->value, &error)) { + g_warning("Failed to send response to %s.%s: %s", + "FirebaseFirestoreHostApi", "disableNetwork", error->message); + } +} + +void cloud_firestore_firebase_firestore_host_api_respond_error_disable_network( + CloudFirestoreFirebaseFirestoreHostApiResponseHandle* response_handle, + const gchar* code, const gchar* message, FlValue* details) { + g_autoptr( + CloudFirestoreFirebaseFirestoreHostApiDisableNetworkResponse) response = + cloud_firestore_firebase_firestore_host_api_disable_network_response_new_error( + code, message, details); + g_autoptr(GError) error = nullptr; + if (!fl_basic_message_channel_respond(response_handle->channel, + response_handle->response_handle, + response->value, &error)) { + g_warning("Failed to send response to %s.%s: %s", + "FirebaseFirestoreHostApi", "disableNetwork", error->message); + } +} + +void cloud_firestore_firebase_firestore_host_api_respond_enable_network( + CloudFirestoreFirebaseFirestoreHostApiResponseHandle* response_handle) { + g_autoptr( + CloudFirestoreFirebaseFirestoreHostApiEnableNetworkResponse) response = + cloud_firestore_firebase_firestore_host_api_enable_network_response_new(); + g_autoptr(GError) error = nullptr; + if (!fl_basic_message_channel_respond(response_handle->channel, + response_handle->response_handle, + response->value, &error)) { + g_warning("Failed to send response to %s.%s: %s", + "FirebaseFirestoreHostApi", "enableNetwork", error->message); + } +} + +void cloud_firestore_firebase_firestore_host_api_respond_error_enable_network( + CloudFirestoreFirebaseFirestoreHostApiResponseHandle* response_handle, + const gchar* code, const gchar* message, FlValue* details) { + g_autoptr( + CloudFirestoreFirebaseFirestoreHostApiEnableNetworkResponse) response = + cloud_firestore_firebase_firestore_host_api_enable_network_response_new_error( + code, message, details); + g_autoptr(GError) error = nullptr; + if (!fl_basic_message_channel_respond(response_handle->channel, + response_handle->response_handle, + response->value, &error)) { + g_warning("Failed to send response to %s.%s: %s", + "FirebaseFirestoreHostApi", "enableNetwork", error->message); + } +} + +void cloud_firestore_firebase_firestore_host_api_respond_terminate( + CloudFirestoreFirebaseFirestoreHostApiResponseHandle* response_handle) { + g_autoptr(CloudFirestoreFirebaseFirestoreHostApiTerminateResponse) response = + cloud_firestore_firebase_firestore_host_api_terminate_response_new(); + g_autoptr(GError) error = nullptr; + if (!fl_basic_message_channel_respond(response_handle->channel, + response_handle->response_handle, + response->value, &error)) { + g_warning("Failed to send response to %s.%s: %s", + "FirebaseFirestoreHostApi", "terminate", error->message); + } +} + +void cloud_firestore_firebase_firestore_host_api_respond_error_terminate( + CloudFirestoreFirebaseFirestoreHostApiResponseHandle* response_handle, + const gchar* code, const gchar* message, FlValue* details) { + g_autoptr(CloudFirestoreFirebaseFirestoreHostApiTerminateResponse) response = + cloud_firestore_firebase_firestore_host_api_terminate_response_new_error( + code, message, details); + g_autoptr(GError) error = nullptr; + if (!fl_basic_message_channel_respond(response_handle->channel, + response_handle->response_handle, + response->value, &error)) { + g_warning("Failed to send response to %s.%s: %s", + "FirebaseFirestoreHostApi", "terminate", error->message); + } +} + +void cloud_firestore_firebase_firestore_host_api_respond_wait_for_pending_writes( + CloudFirestoreFirebaseFirestoreHostApiResponseHandle* response_handle) { + g_autoptr( + CloudFirestoreFirebaseFirestoreHostApiWaitForPendingWritesResponse) response = + cloud_firestore_firebase_firestore_host_api_wait_for_pending_writes_response_new(); + g_autoptr(GError) error = nullptr; + if (!fl_basic_message_channel_respond(response_handle->channel, + response_handle->response_handle, + response->value, &error)) { + g_warning("Failed to send response to %s.%s: %s", + "FirebaseFirestoreHostApi", "waitForPendingWrites", + error->message); + } +} + +void cloud_firestore_firebase_firestore_host_api_respond_error_wait_for_pending_writes( + CloudFirestoreFirebaseFirestoreHostApiResponseHandle* response_handle, + const gchar* code, const gchar* message, FlValue* details) { + g_autoptr( + CloudFirestoreFirebaseFirestoreHostApiWaitForPendingWritesResponse) response = + cloud_firestore_firebase_firestore_host_api_wait_for_pending_writes_response_new_error( + code, message, details); + g_autoptr(GError) error = nullptr; + if (!fl_basic_message_channel_respond(response_handle->channel, + response_handle->response_handle, + response->value, &error)) { + g_warning("Failed to send response to %s.%s: %s", + "FirebaseFirestoreHostApi", "waitForPendingWrites", + error->message); + } +} + +void cloud_firestore_firebase_firestore_host_api_respond_set_index_configuration( + CloudFirestoreFirebaseFirestoreHostApiResponseHandle* response_handle) { + g_autoptr( + CloudFirestoreFirebaseFirestoreHostApiSetIndexConfigurationResponse) response = + cloud_firestore_firebase_firestore_host_api_set_index_configuration_response_new(); + g_autoptr(GError) error = nullptr; + if (!fl_basic_message_channel_respond(response_handle->channel, + response_handle->response_handle, + response->value, &error)) { + g_warning("Failed to send response to %s.%s: %s", + "FirebaseFirestoreHostApi", "setIndexConfiguration", + error->message); + } +} + +void cloud_firestore_firebase_firestore_host_api_respond_error_set_index_configuration( + CloudFirestoreFirebaseFirestoreHostApiResponseHandle* response_handle, + const gchar* code, const gchar* message, FlValue* details) { + g_autoptr(CloudFirestoreFirebaseFirestoreHostApiSetIndexConfigurationResponse) + response = + cloud_firestore_firebase_firestore_host_api_set_index_configuration_response_new_error( + code, message, details); + g_autoptr(GError) error = nullptr; + if (!fl_basic_message_channel_respond(response_handle->channel, + response_handle->response_handle, + response->value, &error)) { + g_warning("Failed to send response to %s.%s: %s", + "FirebaseFirestoreHostApi", "setIndexConfiguration", + error->message); + } +} + +void cloud_firestore_firebase_firestore_host_api_respond_set_logging_enabled( + CloudFirestoreFirebaseFirestoreHostApiResponseHandle* response_handle) { + g_autoptr( + CloudFirestoreFirebaseFirestoreHostApiSetLoggingEnabledResponse) response = + cloud_firestore_firebase_firestore_host_api_set_logging_enabled_response_new(); + g_autoptr(GError) error = nullptr; + if (!fl_basic_message_channel_respond(response_handle->channel, + response_handle->response_handle, + response->value, &error)) { + g_warning("Failed to send response to %s.%s: %s", + "FirebaseFirestoreHostApi", "setLoggingEnabled", error->message); + } +} + +void cloud_firestore_firebase_firestore_host_api_respond_error_set_logging_enabled( + CloudFirestoreFirebaseFirestoreHostApiResponseHandle* response_handle, + const gchar* code, const gchar* message, FlValue* details) { + g_autoptr( + CloudFirestoreFirebaseFirestoreHostApiSetLoggingEnabledResponse) response = + cloud_firestore_firebase_firestore_host_api_set_logging_enabled_response_new_error( + code, message, details); + g_autoptr(GError) error = nullptr; + if (!fl_basic_message_channel_respond(response_handle->channel, + response_handle->response_handle, + response->value, &error)) { + g_warning("Failed to send response to %s.%s: %s", + "FirebaseFirestoreHostApi", "setLoggingEnabled", error->message); + } +} + +void cloud_firestore_firebase_firestore_host_api_respond_snapshots_in_sync_setup( + CloudFirestoreFirebaseFirestoreHostApiResponseHandle* response_handle, + const gchar* return_value) { + g_autoptr( + CloudFirestoreFirebaseFirestoreHostApiSnapshotsInSyncSetupResponse) response = + cloud_firestore_firebase_firestore_host_api_snapshots_in_sync_setup_response_new( + return_value); + g_autoptr(GError) error = nullptr; + if (!fl_basic_message_channel_respond(response_handle->channel, + response_handle->response_handle, + response->value, &error)) { + g_warning("Failed to send response to %s.%s: %s", + "FirebaseFirestoreHostApi", "snapshotsInSyncSetup", + error->message); + } +} + +void cloud_firestore_firebase_firestore_host_api_respond_error_snapshots_in_sync_setup( + CloudFirestoreFirebaseFirestoreHostApiResponseHandle* response_handle, + const gchar* code, const gchar* message, FlValue* details) { + g_autoptr( + CloudFirestoreFirebaseFirestoreHostApiSnapshotsInSyncSetupResponse) response = + cloud_firestore_firebase_firestore_host_api_snapshots_in_sync_setup_response_new_error( + code, message, details); + g_autoptr(GError) error = nullptr; + if (!fl_basic_message_channel_respond(response_handle->channel, + response_handle->response_handle, + response->value, &error)) { + g_warning("Failed to send response to %s.%s: %s", + "FirebaseFirestoreHostApi", "snapshotsInSyncSetup", + error->message); + } +} + +void cloud_firestore_firebase_firestore_host_api_respond_transaction_create( + CloudFirestoreFirebaseFirestoreHostApiResponseHandle* response_handle, + const gchar* return_value) { + g_autoptr( + CloudFirestoreFirebaseFirestoreHostApiTransactionCreateResponse) response = + cloud_firestore_firebase_firestore_host_api_transaction_create_response_new( + return_value); + g_autoptr(GError) error = nullptr; + if (!fl_basic_message_channel_respond(response_handle->channel, + response_handle->response_handle, + response->value, &error)) { + g_warning("Failed to send response to %s.%s: %s", + "FirebaseFirestoreHostApi", "transactionCreate", error->message); + } +} + +void cloud_firestore_firebase_firestore_host_api_respond_error_transaction_create( + CloudFirestoreFirebaseFirestoreHostApiResponseHandle* response_handle, + const gchar* code, const gchar* message, FlValue* details) { + g_autoptr( + CloudFirestoreFirebaseFirestoreHostApiTransactionCreateResponse) response = + cloud_firestore_firebase_firestore_host_api_transaction_create_response_new_error( + code, message, details); + g_autoptr(GError) error = nullptr; + if (!fl_basic_message_channel_respond(response_handle->channel, + response_handle->response_handle, + response->value, &error)) { + g_warning("Failed to send response to %s.%s: %s", + "FirebaseFirestoreHostApi", "transactionCreate", error->message); + } +} + +void cloud_firestore_firebase_firestore_host_api_respond_transaction_store_result( + CloudFirestoreFirebaseFirestoreHostApiResponseHandle* response_handle) { + g_autoptr( + CloudFirestoreFirebaseFirestoreHostApiTransactionStoreResultResponse) response = + cloud_firestore_firebase_firestore_host_api_transaction_store_result_response_new(); + g_autoptr(GError) error = nullptr; + if (!fl_basic_message_channel_respond(response_handle->channel, + response_handle->response_handle, + response->value, &error)) { + g_warning("Failed to send response to %s.%s: %s", + "FirebaseFirestoreHostApi", "transactionStoreResult", + error->message); + } +} + +void cloud_firestore_firebase_firestore_host_api_respond_error_transaction_store_result( + CloudFirestoreFirebaseFirestoreHostApiResponseHandle* response_handle, + const gchar* code, const gchar* message, FlValue* details) { + g_autoptr( + CloudFirestoreFirebaseFirestoreHostApiTransactionStoreResultResponse) + response = + cloud_firestore_firebase_firestore_host_api_transaction_store_result_response_new_error( + code, message, details); + g_autoptr(GError) error = nullptr; + if (!fl_basic_message_channel_respond(response_handle->channel, + response_handle->response_handle, + response->value, &error)) { + g_warning("Failed to send response to %s.%s: %s", + "FirebaseFirestoreHostApi", "transactionStoreResult", + error->message); + } +} + +void cloud_firestore_firebase_firestore_host_api_respond_transaction_get( + CloudFirestoreFirebaseFirestoreHostApiResponseHandle* response_handle, + CloudFirestoreInternalDocumentSnapshot* return_value) { + g_autoptr( + CloudFirestoreFirebaseFirestoreHostApiTransactionGetResponse) response = + cloud_firestore_firebase_firestore_host_api_transaction_get_response_new( + return_value); + g_autoptr(GError) error = nullptr; + if (!fl_basic_message_channel_respond(response_handle->channel, + response_handle->response_handle, + response->value, &error)) { + g_warning("Failed to send response to %s.%s: %s", + "FirebaseFirestoreHostApi", "transactionGet", error->message); + } +} + +void cloud_firestore_firebase_firestore_host_api_respond_error_transaction_get( + CloudFirestoreFirebaseFirestoreHostApiResponseHandle* response_handle, + const gchar* code, const gchar* message, FlValue* details) { + g_autoptr( + CloudFirestoreFirebaseFirestoreHostApiTransactionGetResponse) response = + cloud_firestore_firebase_firestore_host_api_transaction_get_response_new_error( + code, message, details); + g_autoptr(GError) error = nullptr; + if (!fl_basic_message_channel_respond(response_handle->channel, + response_handle->response_handle, + response->value, &error)) { + g_warning("Failed to send response to %s.%s: %s", + "FirebaseFirestoreHostApi", "transactionGet", error->message); + } +} + +void cloud_firestore_firebase_firestore_host_api_respond_document_reference_set( + CloudFirestoreFirebaseFirestoreHostApiResponseHandle* response_handle) { + g_autoptr( + CloudFirestoreFirebaseFirestoreHostApiDocumentReferenceSetResponse) response = + cloud_firestore_firebase_firestore_host_api_document_reference_set_response_new(); + g_autoptr(GError) error = nullptr; + if (!fl_basic_message_channel_respond(response_handle->channel, + response_handle->response_handle, + response->value, &error)) { + g_warning("Failed to send response to %s.%s: %s", + "FirebaseFirestoreHostApi", "documentReferenceSet", + error->message); + } +} + +void cloud_firestore_firebase_firestore_host_api_respond_error_document_reference_set( + CloudFirestoreFirebaseFirestoreHostApiResponseHandle* response_handle, + const gchar* code, const gchar* message, FlValue* details) { + g_autoptr( + CloudFirestoreFirebaseFirestoreHostApiDocumentReferenceSetResponse) response = + cloud_firestore_firebase_firestore_host_api_document_reference_set_response_new_error( + code, message, details); + g_autoptr(GError) error = nullptr; + if (!fl_basic_message_channel_respond(response_handle->channel, + response_handle->response_handle, + response->value, &error)) { + g_warning("Failed to send response to %s.%s: %s", + "FirebaseFirestoreHostApi", "documentReferenceSet", + error->message); + } +} + +void cloud_firestore_firebase_firestore_host_api_respond_document_reference_update( + CloudFirestoreFirebaseFirestoreHostApiResponseHandle* response_handle) { + g_autoptr( + CloudFirestoreFirebaseFirestoreHostApiDocumentReferenceUpdateResponse) response = + cloud_firestore_firebase_firestore_host_api_document_reference_update_response_new(); + g_autoptr(GError) error = nullptr; + if (!fl_basic_message_channel_respond(response_handle->channel, + response_handle->response_handle, + response->value, &error)) { + g_warning("Failed to send response to %s.%s: %s", + "FirebaseFirestoreHostApi", "documentReferenceUpdate", + error->message); + } +} + +void cloud_firestore_firebase_firestore_host_api_respond_error_document_reference_update( + CloudFirestoreFirebaseFirestoreHostApiResponseHandle* response_handle, + const gchar* code, const gchar* message, FlValue* details) { + g_autoptr( + CloudFirestoreFirebaseFirestoreHostApiDocumentReferenceUpdateResponse) + response = + cloud_firestore_firebase_firestore_host_api_document_reference_update_response_new_error( + code, message, details); + g_autoptr(GError) error = nullptr; + if (!fl_basic_message_channel_respond(response_handle->channel, + response_handle->response_handle, + response->value, &error)) { + g_warning("Failed to send response to %s.%s: %s", + "FirebaseFirestoreHostApi", "documentReferenceUpdate", + error->message); + } +} + +void cloud_firestore_firebase_firestore_host_api_respond_document_reference_get( + CloudFirestoreFirebaseFirestoreHostApiResponseHandle* response_handle, + CloudFirestoreInternalDocumentSnapshot* return_value) { + g_autoptr( + CloudFirestoreFirebaseFirestoreHostApiDocumentReferenceGetResponse) response = + cloud_firestore_firebase_firestore_host_api_document_reference_get_response_new( + return_value); + g_autoptr(GError) error = nullptr; + if (!fl_basic_message_channel_respond(response_handle->channel, + response_handle->response_handle, + response->value, &error)) { + g_warning("Failed to send response to %s.%s: %s", + "FirebaseFirestoreHostApi", "documentReferenceGet", + error->message); + } +} + +void cloud_firestore_firebase_firestore_host_api_respond_error_document_reference_get( + CloudFirestoreFirebaseFirestoreHostApiResponseHandle* response_handle, + const gchar* code, const gchar* message, FlValue* details) { + g_autoptr( + CloudFirestoreFirebaseFirestoreHostApiDocumentReferenceGetResponse) response = + cloud_firestore_firebase_firestore_host_api_document_reference_get_response_new_error( + code, message, details); + g_autoptr(GError) error = nullptr; + if (!fl_basic_message_channel_respond(response_handle->channel, + response_handle->response_handle, + response->value, &error)) { + g_warning("Failed to send response to %s.%s: %s", + "FirebaseFirestoreHostApi", "documentReferenceGet", + error->message); + } +} + +void cloud_firestore_firebase_firestore_host_api_respond_document_reference_delete( + CloudFirestoreFirebaseFirestoreHostApiResponseHandle* response_handle) { + g_autoptr( + CloudFirestoreFirebaseFirestoreHostApiDocumentReferenceDeleteResponse) response = + cloud_firestore_firebase_firestore_host_api_document_reference_delete_response_new(); + g_autoptr(GError) error = nullptr; + if (!fl_basic_message_channel_respond(response_handle->channel, + response_handle->response_handle, + response->value, &error)) { + g_warning("Failed to send response to %s.%s: %s", + "FirebaseFirestoreHostApi", "documentReferenceDelete", + error->message); + } +} + +void cloud_firestore_firebase_firestore_host_api_respond_error_document_reference_delete( + CloudFirestoreFirebaseFirestoreHostApiResponseHandle* response_handle, + const gchar* code, const gchar* message, FlValue* details) { + g_autoptr( + CloudFirestoreFirebaseFirestoreHostApiDocumentReferenceDeleteResponse) + response = + cloud_firestore_firebase_firestore_host_api_document_reference_delete_response_new_error( + code, message, details); + g_autoptr(GError) error = nullptr; + if (!fl_basic_message_channel_respond(response_handle->channel, + response_handle->response_handle, + response->value, &error)) { + g_warning("Failed to send response to %s.%s: %s", + "FirebaseFirestoreHostApi", "documentReferenceDelete", + error->message); + } +} + +void cloud_firestore_firebase_firestore_host_api_respond_query_get( + CloudFirestoreFirebaseFirestoreHostApiResponseHandle* response_handle, + CloudFirestoreInternalQuerySnapshot* return_value) { + g_autoptr(CloudFirestoreFirebaseFirestoreHostApiQueryGetResponse) response = + cloud_firestore_firebase_firestore_host_api_query_get_response_new( + return_value); + g_autoptr(GError) error = nullptr; + if (!fl_basic_message_channel_respond(response_handle->channel, + response_handle->response_handle, + response->value, &error)) { + g_warning("Failed to send response to %s.%s: %s", + "FirebaseFirestoreHostApi", "queryGet", error->message); + } +} + +void cloud_firestore_firebase_firestore_host_api_respond_error_query_get( + CloudFirestoreFirebaseFirestoreHostApiResponseHandle* response_handle, + const gchar* code, const gchar* message, FlValue* details) { + g_autoptr(CloudFirestoreFirebaseFirestoreHostApiQueryGetResponse) response = + cloud_firestore_firebase_firestore_host_api_query_get_response_new_error( + code, message, details); + g_autoptr(GError) error = nullptr; + if (!fl_basic_message_channel_respond(response_handle->channel, + response_handle->response_handle, + response->value, &error)) { + g_warning("Failed to send response to %s.%s: %s", + "FirebaseFirestoreHostApi", "queryGet", error->message); + } +} + +void cloud_firestore_firebase_firestore_host_api_respond_aggregate_query( + CloudFirestoreFirebaseFirestoreHostApiResponseHandle* response_handle, + FlValue* return_value) { + g_autoptr( + CloudFirestoreFirebaseFirestoreHostApiAggregateQueryResponse) response = + cloud_firestore_firebase_firestore_host_api_aggregate_query_response_new( + return_value); + g_autoptr(GError) error = nullptr; + if (!fl_basic_message_channel_respond(response_handle->channel, + response_handle->response_handle, + response->value, &error)) { + g_warning("Failed to send response to %s.%s: %s", + "FirebaseFirestoreHostApi", "aggregateQuery", error->message); + } +} + +void cloud_firestore_firebase_firestore_host_api_respond_error_aggregate_query( + CloudFirestoreFirebaseFirestoreHostApiResponseHandle* response_handle, + const gchar* code, const gchar* message, FlValue* details) { + g_autoptr( + CloudFirestoreFirebaseFirestoreHostApiAggregateQueryResponse) response = + cloud_firestore_firebase_firestore_host_api_aggregate_query_response_new_error( + code, message, details); + g_autoptr(GError) error = nullptr; + if (!fl_basic_message_channel_respond(response_handle->channel, + response_handle->response_handle, + response->value, &error)) { + g_warning("Failed to send response to %s.%s: %s", + "FirebaseFirestoreHostApi", "aggregateQuery", error->message); + } +} + +void cloud_firestore_firebase_firestore_host_api_respond_write_batch_commit( + CloudFirestoreFirebaseFirestoreHostApiResponseHandle* response_handle) { + g_autoptr( + CloudFirestoreFirebaseFirestoreHostApiWriteBatchCommitResponse) response = + cloud_firestore_firebase_firestore_host_api_write_batch_commit_response_new(); + g_autoptr(GError) error = nullptr; + if (!fl_basic_message_channel_respond(response_handle->channel, + response_handle->response_handle, + response->value, &error)) { + g_warning("Failed to send response to %s.%s: %s", + "FirebaseFirestoreHostApi", "writeBatchCommit", error->message); + } +} + +void cloud_firestore_firebase_firestore_host_api_respond_error_write_batch_commit( + CloudFirestoreFirebaseFirestoreHostApiResponseHandle* response_handle, + const gchar* code, const gchar* message, FlValue* details) { + g_autoptr( + CloudFirestoreFirebaseFirestoreHostApiWriteBatchCommitResponse) response = + cloud_firestore_firebase_firestore_host_api_write_batch_commit_response_new_error( + code, message, details); + g_autoptr(GError) error = nullptr; + if (!fl_basic_message_channel_respond(response_handle->channel, + response_handle->response_handle, + response->value, &error)) { + g_warning("Failed to send response to %s.%s: %s", + "FirebaseFirestoreHostApi", "writeBatchCommit", error->message); + } +} + +void cloud_firestore_firebase_firestore_host_api_respond_query_snapshot( + CloudFirestoreFirebaseFirestoreHostApiResponseHandle* response_handle, + const gchar* return_value) { + g_autoptr( + CloudFirestoreFirebaseFirestoreHostApiQuerySnapshotResponse) response = + cloud_firestore_firebase_firestore_host_api_query_snapshot_response_new( + return_value); + g_autoptr(GError) error = nullptr; + if (!fl_basic_message_channel_respond(response_handle->channel, + response_handle->response_handle, + response->value, &error)) { + g_warning("Failed to send response to %s.%s: %s", + "FirebaseFirestoreHostApi", "querySnapshot", error->message); + } +} + +void cloud_firestore_firebase_firestore_host_api_respond_error_query_snapshot( + CloudFirestoreFirebaseFirestoreHostApiResponseHandle* response_handle, + const gchar* code, const gchar* message, FlValue* details) { + g_autoptr( + CloudFirestoreFirebaseFirestoreHostApiQuerySnapshotResponse) response = + cloud_firestore_firebase_firestore_host_api_query_snapshot_response_new_error( + code, message, details); + g_autoptr(GError) error = nullptr; + if (!fl_basic_message_channel_respond(response_handle->channel, + response_handle->response_handle, + response->value, &error)) { + g_warning("Failed to send response to %s.%s: %s", + "FirebaseFirestoreHostApi", "querySnapshot", error->message); + } +} + +void cloud_firestore_firebase_firestore_host_api_respond_document_reference_snapshot( + CloudFirestoreFirebaseFirestoreHostApiResponseHandle* response_handle, + const gchar* return_value) { + g_autoptr( + CloudFirestoreFirebaseFirestoreHostApiDocumentReferenceSnapshotResponse) + response = + cloud_firestore_firebase_firestore_host_api_document_reference_snapshot_response_new( + return_value); + g_autoptr(GError) error = nullptr; + if (!fl_basic_message_channel_respond(response_handle->channel, + response_handle->response_handle, + response->value, &error)) { + g_warning("Failed to send response to %s.%s: %s", + "FirebaseFirestoreHostApi", "documentReferenceSnapshot", + error->message); + } +} + +void cloud_firestore_firebase_firestore_host_api_respond_error_document_reference_snapshot( + CloudFirestoreFirebaseFirestoreHostApiResponseHandle* response_handle, + const gchar* code, const gchar* message, FlValue* details) { + g_autoptr( + CloudFirestoreFirebaseFirestoreHostApiDocumentReferenceSnapshotResponse) + response = + cloud_firestore_firebase_firestore_host_api_document_reference_snapshot_response_new_error( + code, message, details); + g_autoptr(GError) error = nullptr; + if (!fl_basic_message_channel_respond(response_handle->channel, + response_handle->response_handle, + response->value, &error)) { + g_warning("Failed to send response to %s.%s: %s", + "FirebaseFirestoreHostApi", "documentReferenceSnapshot", + error->message); + } +} + +void cloud_firestore_firebase_firestore_host_api_respond_persistence_cache_index_manager_request( + CloudFirestoreFirebaseFirestoreHostApiResponseHandle* response_handle) { + g_autoptr( + CloudFirestoreFirebaseFirestoreHostApiPersistenceCacheIndexManagerRequestResponse) + response = + cloud_firestore_firebase_firestore_host_api_persistence_cache_index_manager_request_response_new(); + g_autoptr(GError) error = nullptr; + if (!fl_basic_message_channel_respond(response_handle->channel, + response_handle->response_handle, + response->value, &error)) { + g_warning("Failed to send response to %s.%s: %s", + "FirebaseFirestoreHostApi", "persistenceCacheIndexManagerRequest", + error->message); + } +} + +void cloud_firestore_firebase_firestore_host_api_respond_error_persistence_cache_index_manager_request( + CloudFirestoreFirebaseFirestoreHostApiResponseHandle* response_handle, + const gchar* code, const gchar* message, FlValue* details) { + g_autoptr( + CloudFirestoreFirebaseFirestoreHostApiPersistenceCacheIndexManagerRequestResponse) + response = + cloud_firestore_firebase_firestore_host_api_persistence_cache_index_manager_request_response_new_error( + code, message, details); + g_autoptr(GError) error = nullptr; + if (!fl_basic_message_channel_respond(response_handle->channel, + response_handle->response_handle, + response->value, &error)) { + g_warning("Failed to send response to %s.%s: %s", + "FirebaseFirestoreHostApi", "persistenceCacheIndexManagerRequest", + error->message); + } +} + +void cloud_firestore_firebase_firestore_host_api_respond_execute_pipeline( + CloudFirestoreFirebaseFirestoreHostApiResponseHandle* response_handle, + CloudFirestoreInternalPipelineSnapshot* return_value) { + g_autoptr( + CloudFirestoreFirebaseFirestoreHostApiExecutePipelineResponse) response = + cloud_firestore_firebase_firestore_host_api_execute_pipeline_response_new( + return_value); + g_autoptr(GError) error = nullptr; + if (!fl_basic_message_channel_respond(response_handle->channel, + response_handle->response_handle, + response->value, &error)) { + g_warning("Failed to send response to %s.%s: %s", + "FirebaseFirestoreHostApi", "executePipeline", error->message); + } +} + +void cloud_firestore_firebase_firestore_host_api_respond_error_execute_pipeline( + CloudFirestoreFirebaseFirestoreHostApiResponseHandle* response_handle, + const gchar* code, const gchar* message, FlValue* details) { + g_autoptr( + CloudFirestoreFirebaseFirestoreHostApiExecutePipelineResponse) response = + cloud_firestore_firebase_firestore_host_api_execute_pipeline_response_new_error( + code, message, details); + g_autoptr(GError) error = nullptr; + if (!fl_basic_message_channel_respond(response_handle->channel, + response_handle->response_handle, + response->value, &error)) { + g_warning("Failed to send response to %s.%s: %s", + "FirebaseFirestoreHostApi", "executePipeline", error->message); + } +} diff --git a/packages/cloud_firestore/cloud_firestore/linux/messages.g.h b/packages/cloud_firestore/cloud_firestore/linux/messages.g.h new file mode 100644 index 000000000000..3ce5efcf5778 --- /dev/null +++ b/packages/cloud_firestore/cloud_firestore/linux/messages.g.h @@ -0,0 +1,2256 @@ +// Copyright 2023, the Chromium project authors. Please see the AUTHORS file +// for details. All rights reserved. Use of this source code is governed by a +// BSD-style license that can be found in the LICENSE file. +// Autogenerated from Pigeon (v26.3.4), do not edit directly. +// See also: https://pub.dev/packages/pigeon + +#ifndef PIGEON_MESSAGES_G_H_ +#define PIGEON_MESSAGES_G_H_ + +#include + +G_BEGIN_DECLS + +/** + * CloudFirestoreDocumentChangeType: + * CLOUD_FIRESTORE_PLATFORM_INTERFACE_DOCUMENT_CHANGE_TYPE_ADDED: + * Indicates a new document was added to the set of documents matching the + * query. + * CLOUD_FIRESTORE_PLATFORM_INTERFACE_DOCUMENT_CHANGE_TYPE_MODIFIED: + * Indicates a document within the query was modified. + * CLOUD_FIRESTORE_PLATFORM_INTERFACE_DOCUMENT_CHANGE_TYPE_REMOVED: + * Indicates a document within the query was removed (either deleted or no + * longer matches the query. + * + * An enumeration of document change types. + */ +typedef enum { + CLOUD_FIRESTORE_PLATFORM_INTERFACE_DOCUMENT_CHANGE_TYPE_ADDED = 0, + CLOUD_FIRESTORE_PLATFORM_INTERFACE_DOCUMENT_CHANGE_TYPE_MODIFIED = 1, + CLOUD_FIRESTORE_PLATFORM_INTERFACE_DOCUMENT_CHANGE_TYPE_REMOVED = 2 +} CloudFirestoreDocumentChangeType; + +/** + * CloudFirestoreSource: + * CLOUD_FIRESTORE_PLATFORM_INTERFACE_SOURCE_SERVER_AND_CACHE: + * Causes Firestore to try to retrieve an up-to-date (server-retrieved) + * snapshot, but fall back to returning cached data if the server can't be + * reached. CLOUD_FIRESTORE_PLATFORM_INTERFACE_SOURCE_SERVER: Causes Firestore + * to avoid the cache, generating an error if the server cannot be reached. Note + * that the cache will still be updated if the server request succeeds. Also + * note that latency-compensation still takes effect, so any pending write + * operations will be visible in the returned data (merged into the + * server-provided data). CLOUD_FIRESTORE_PLATFORM_INTERFACE_SOURCE_CACHE: + * Causes Firestore to immediately return a value from the cache, ignoring the + * server completely (implying that the returned value may be stale with respect + * to the value on the server). If there is no data in the cache to satisfy the + * `get` call, [DocumentReference.get] will throw a [FirebaseException] and + * [Query.get] will return an empty [QuerySnapshotPlatform] with no documents. + * + * An enumeration of firestore source types. + */ +typedef enum { + CLOUD_FIRESTORE_PLATFORM_INTERFACE_SOURCE_SERVER_AND_CACHE = 0, + CLOUD_FIRESTORE_PLATFORM_INTERFACE_SOURCE_SERVER = 1, + CLOUD_FIRESTORE_PLATFORM_INTERFACE_SOURCE_CACHE = 2 +} CloudFirestoreSource; + +/** + * CloudFirestoreListenSource: + * CLOUD_FIRESTORE_PLATFORM_INTERFACE_LISTEN_SOURCE_DEFAULT_SOURCE: + * The default behavior. The listener attempts to return initial snapshot from + * cache and retrieve up-to-date snapshots from the Firestore server. Snapshot + * events will be triggered on local mutations and server side updates. + * CLOUD_FIRESTORE_PLATFORM_INTERFACE_LISTEN_SOURCE_CACHE: + * The listener retrieves data and listens to updates from the local Firestore + * cache only. If the cache is empty, an empty snapshot will be returned. + * Snapshot events will be triggered on cache updates, like local mutations or + * load bundles. + * + * The listener retrieves data and listens to updates from the local Firestore + * cache only. If the cache is empty, an empty snapshot will be returned. + * Snapshot events will be triggered on cache updates, like local mutations or + * load bundles. + * + * Note that the data might be stale if the cache hasn't synchronized with + * recent server-side changes. + */ +typedef enum { + CLOUD_FIRESTORE_PLATFORM_INTERFACE_LISTEN_SOURCE_DEFAULT_SOURCE = 0, + CLOUD_FIRESTORE_PLATFORM_INTERFACE_LISTEN_SOURCE_CACHE = 1 +} CloudFirestoreListenSource; + +/** + * CloudFirestoreServerTimestampBehavior: + * CLOUD_FIRESTORE_PLATFORM_INTERFACE_SERVER_TIMESTAMP_BEHAVIOR_NONE: + * Return null for [FieldValue.serverTimestamp()] values that have not yet + * CLOUD_FIRESTORE_PLATFORM_INTERFACE_SERVER_TIMESTAMP_BEHAVIOR_ESTIMATE: + * Return local estimates for [FieldValue.serverTimestamp()] values that have + * not yet been set to their final value. + * CLOUD_FIRESTORE_PLATFORM_INTERFACE_SERVER_TIMESTAMP_BEHAVIOR_PREVIOUS: + * Return the previous value for [FieldValue.serverTimestamp()] values that have + * not yet been set to their final value. + * + */ +typedef enum { + CLOUD_FIRESTORE_PLATFORM_INTERFACE_SERVER_TIMESTAMP_BEHAVIOR_NONE = 0, + CLOUD_FIRESTORE_PLATFORM_INTERFACE_SERVER_TIMESTAMP_BEHAVIOR_ESTIMATE = 1, + CLOUD_FIRESTORE_PLATFORM_INTERFACE_SERVER_TIMESTAMP_BEHAVIOR_PREVIOUS = 2 +} CloudFirestoreServerTimestampBehavior; + +/** + * CloudFirestoreAggregateSource: + * CLOUD_FIRESTORE_PLATFORM_INTERFACE_AGGREGATE_SOURCE_SERVER: + * Indicates that the data should be retrieved from the server. + * + * [AggregateSource] represents the source of data for an [AggregateQuery]. + */ +typedef enum { + CLOUD_FIRESTORE_PLATFORM_INTERFACE_AGGREGATE_SOURCE_SERVER = 0 +} CloudFirestoreAggregateSource; + +/** + * CloudFirestorePersistenceCacheIndexManagerRequest: + * CLOUD_FIRESTORE_PLATFORM_INTERFACE_PERSISTENCE_CACHE_INDEX_MANAGER_REQUEST_ENABLE_INDEX_AUTO_CREATION: + * CLOUD_FIRESTORE_PLATFORM_INTERFACE_PERSISTENCE_CACHE_INDEX_MANAGER_REQUEST_DISABLE_INDEX_AUTO_CREATION: + * CLOUD_FIRESTORE_PLATFORM_INTERFACE_PERSISTENCE_CACHE_INDEX_MANAGER_REQUEST_DELETE_ALL_INDEXES: + * + * [PersistenceCacheIndexManagerRequest] represents the request types for the + * persistence cache index manager. + */ +typedef enum { + CLOUD_FIRESTORE_PLATFORM_INTERFACE_PERSISTENCE_CACHE_INDEX_MANAGER_REQUEST_ENABLE_INDEX_AUTO_CREATION = + 0, + CLOUD_FIRESTORE_PLATFORM_INTERFACE_PERSISTENCE_CACHE_INDEX_MANAGER_REQUEST_DISABLE_INDEX_AUTO_CREATION = + 1, + CLOUD_FIRESTORE_PLATFORM_INTERFACE_PERSISTENCE_CACHE_INDEX_MANAGER_REQUEST_DELETE_ALL_INDEXES = + 2 +} CloudFirestorePersistenceCacheIndexManagerRequest; + +/** + * CloudFirestoreInternalTransactionResult: + * CLOUD_FIRESTORE_PLATFORM_INTERFACE_INTERNAL_TRANSACTION_RESULT_SUCCESS: + * CLOUD_FIRESTORE_PLATFORM_INTERFACE_INTERNAL_TRANSACTION_RESULT_FAILURE: + * + */ +typedef enum { + CLOUD_FIRESTORE_PLATFORM_INTERFACE_INTERNAL_TRANSACTION_RESULT_SUCCESS = 0, + CLOUD_FIRESTORE_PLATFORM_INTERFACE_INTERNAL_TRANSACTION_RESULT_FAILURE = 1 +} CloudFirestoreInternalTransactionResult; + +/** + * CloudFirestoreInternalTransactionType: + * CLOUD_FIRESTORE_PLATFORM_INTERFACE_INTERNAL_TRANSACTION_TYPE_GET: + * CLOUD_FIRESTORE_PLATFORM_INTERFACE_INTERNAL_TRANSACTION_TYPE_UPDATE: + * CLOUD_FIRESTORE_PLATFORM_INTERFACE_INTERNAL_TRANSACTION_TYPE_SET: + * CLOUD_FIRESTORE_PLATFORM_INTERFACE_INTERNAL_TRANSACTION_TYPE_DELETE_TYPE: + * + */ +typedef enum { + CLOUD_FIRESTORE_PLATFORM_INTERFACE_INTERNAL_TRANSACTION_TYPE_GET = 0, + CLOUD_FIRESTORE_PLATFORM_INTERFACE_INTERNAL_TRANSACTION_TYPE_UPDATE = 1, + CLOUD_FIRESTORE_PLATFORM_INTERFACE_INTERNAL_TRANSACTION_TYPE_SET = 2, + CLOUD_FIRESTORE_PLATFORM_INTERFACE_INTERNAL_TRANSACTION_TYPE_DELETE_TYPE = 3 +} CloudFirestoreInternalTransactionType; + +/** + * CloudFirestoreAggregateType: + * CLOUD_FIRESTORE_PLATFORM_INTERFACE_AGGREGATE_TYPE_COUNT: + * CLOUD_FIRESTORE_PLATFORM_INTERFACE_AGGREGATE_TYPE_SUM: + * CLOUD_FIRESTORE_PLATFORM_INTERFACE_AGGREGATE_TYPE_AVERAGE: + * + */ +typedef enum { + CLOUD_FIRESTORE_PLATFORM_INTERFACE_AGGREGATE_TYPE_COUNT = 0, + CLOUD_FIRESTORE_PLATFORM_INTERFACE_AGGREGATE_TYPE_SUM = 1, + CLOUD_FIRESTORE_PLATFORM_INTERFACE_AGGREGATE_TYPE_AVERAGE = 2 +} CloudFirestoreAggregateType; + +/** + * CloudFirestoreInternalFirebaseSettings: + * + */ + +G_DECLARE_FINAL_TYPE(CloudFirestoreInternalFirebaseSettings, + cloud_firestore_internal_firebase_settings, + CLOUD_FIRESTORE, INTERNAL_FIREBASE_SETTINGS, GObject) + +/** + * cloud_firestore_internal_firebase_settings_new: + * persistence_enabled: field in this object. + * host: field in this object. + * ssl_enabled: field in this object. + * cache_size_bytes: field in this object. + * ignore_undefined_properties: field in this object. + * + * Creates a new #InternalFirebaseSettings object. + * + * Returns: a new #CloudFirestoreInternalFirebaseSettings + */ +CloudFirestoreInternalFirebaseSettings* +cloud_firestore_internal_firebase_settings_new( + gboolean* persistence_enabled, const gchar* host, gboolean* ssl_enabled, + int64_t* cache_size_bytes, gboolean ignore_undefined_properties); + +/** + * cloud_firestore_internal_firebase_settings_get_persistence_enabled + * @object: a #CloudFirestoreInternalFirebaseSettings. + * + * Gets the value of the persistenceEnabled field of @object. + * + * Returns: the field value. + */ +gboolean* cloud_firestore_internal_firebase_settings_get_persistence_enabled( + CloudFirestoreInternalFirebaseSettings* object); + +/** + * cloud_firestore_internal_firebase_settings_get_host + * @object: a #CloudFirestoreInternalFirebaseSettings. + * + * Gets the value of the host field of @object. + * + * Returns: the field value. + */ +const gchar* cloud_firestore_internal_firebase_settings_get_host( + CloudFirestoreInternalFirebaseSettings* object); + +/** + * cloud_firestore_internal_firebase_settings_get_ssl_enabled + * @object: a #CloudFirestoreInternalFirebaseSettings. + * + * Gets the value of the sslEnabled field of @object. + * + * Returns: the field value. + */ +gboolean* cloud_firestore_internal_firebase_settings_get_ssl_enabled( + CloudFirestoreInternalFirebaseSettings* object); + +/** + * cloud_firestore_internal_firebase_settings_get_cache_size_bytes + * @object: a #CloudFirestoreInternalFirebaseSettings. + * + * Gets the value of the cacheSizeBytes field of @object. + * + * Returns: the field value. + */ +int64_t* cloud_firestore_internal_firebase_settings_get_cache_size_bytes( + CloudFirestoreInternalFirebaseSettings* object); + +/** + * cloud_firestore_internal_firebase_settings_get_ignore_undefined_properties + * @object: a #CloudFirestoreInternalFirebaseSettings. + * + * Gets the value of the ignoreUndefinedProperties field of @object. + * + * Returns: the field value. + */ +gboolean +cloud_firestore_internal_firebase_settings_get_ignore_undefined_properties( + CloudFirestoreInternalFirebaseSettings* object); + +/** + * cloud_firestore_internal_firebase_settings_equals: + * @a: a #CloudFirestoreInternalFirebaseSettings. + * @b: another #CloudFirestoreInternalFirebaseSettings. + * + * Checks if two #CloudFirestoreInternalFirebaseSettings objects are equal. + * + * Returns: TRUE if @a and @b are equal. + */ +gboolean cloud_firestore_internal_firebase_settings_equals( + CloudFirestoreInternalFirebaseSettings* a, + CloudFirestoreInternalFirebaseSettings* b); + +/** + * cloud_firestore_internal_firebase_settings_hash: + * @object: a #CloudFirestoreInternalFirebaseSettings. + * + * Calculates a hash code for a #CloudFirestoreInternalFirebaseSettings object. + * + * Returns: the hash code. + */ +guint cloud_firestore_internal_firebase_settings_hash( + CloudFirestoreInternalFirebaseSettings* object); + +/** + * CloudFirestoreFirestorePigeonFirebaseApp: + * + */ + +G_DECLARE_FINAL_TYPE(CloudFirestoreFirestorePigeonFirebaseApp, + cloud_firestore_firestore_pigeon_firebase_app, + CLOUD_FIRESTORE, FIRESTORE_PIGEON_FIREBASE_APP, GObject) + +/** + * cloud_firestore_firestore_pigeon_firebase_app_new: + * app_name: field in this object. + * settings: field in this object. + * database_u_r_l: field in this object. + * + * Creates a new #FirestorePigeonFirebaseApp object. + * + * Returns: a new #CloudFirestoreFirestorePigeonFirebaseApp + */ +CloudFirestoreFirestorePigeonFirebaseApp* +cloud_firestore_firestore_pigeon_firebase_app_new( + const gchar* app_name, CloudFirestoreInternalFirebaseSettings* settings, + const gchar* database_u_r_l); + +/** + * cloud_firestore_firestore_pigeon_firebase_app_get_app_name + * @object: a #CloudFirestoreFirestorePigeonFirebaseApp. + * + * Gets the value of the appName field of @object. + * + * Returns: the field value. + */ +const gchar* cloud_firestore_firestore_pigeon_firebase_app_get_app_name( + CloudFirestoreFirestorePigeonFirebaseApp* object); + +/** + * cloud_firestore_firestore_pigeon_firebase_app_get_settings + * @object: a #CloudFirestoreFirestorePigeonFirebaseApp. + * + * Gets the value of the settings field of @object. + * + * Returns: the field value. + */ +CloudFirestoreInternalFirebaseSettings* +cloud_firestore_firestore_pigeon_firebase_app_get_settings( + CloudFirestoreFirestorePigeonFirebaseApp* object); + +/** + * cloud_firestore_firestore_pigeon_firebase_app_get_database_u_r_l + * @object: a #CloudFirestoreFirestorePigeonFirebaseApp. + * + * Gets the value of the databaseURL field of @object. + * + * Returns: the field value. + */ +const gchar* cloud_firestore_firestore_pigeon_firebase_app_get_database_u_r_l( + CloudFirestoreFirestorePigeonFirebaseApp* object); + +/** + * cloud_firestore_firestore_pigeon_firebase_app_equals: + * @a: a #CloudFirestoreFirestorePigeonFirebaseApp. + * @b: another #CloudFirestoreFirestorePigeonFirebaseApp. + * + * Checks if two #CloudFirestoreFirestorePigeonFirebaseApp objects are equal. + * + * Returns: TRUE if @a and @b are equal. + */ +gboolean cloud_firestore_firestore_pigeon_firebase_app_equals( + CloudFirestoreFirestorePigeonFirebaseApp* a, + CloudFirestoreFirestorePigeonFirebaseApp* b); + +/** + * cloud_firestore_firestore_pigeon_firebase_app_hash: + * @object: a #CloudFirestoreFirestorePigeonFirebaseApp. + * + * Calculates a hash code for a #CloudFirestoreFirestorePigeonFirebaseApp + * object. + * + * Returns: the hash code. + */ +guint cloud_firestore_firestore_pigeon_firebase_app_hash( + CloudFirestoreFirestorePigeonFirebaseApp* object); + +/** + * CloudFirestoreInternalSnapshotMetadata: + * + */ + +G_DECLARE_FINAL_TYPE(CloudFirestoreInternalSnapshotMetadata, + cloud_firestore_internal_snapshot_metadata, + CLOUD_FIRESTORE, INTERNAL_SNAPSHOT_METADATA, GObject) + +/** + * cloud_firestore_internal_snapshot_metadata_new: + * has_pending_writes: field in this object. + * is_from_cache: field in this object. + * + * Creates a new #InternalSnapshotMetadata object. + * + * Returns: a new #CloudFirestoreInternalSnapshotMetadata + */ +CloudFirestoreInternalSnapshotMetadata* +cloud_firestore_internal_snapshot_metadata_new(gboolean has_pending_writes, + gboolean is_from_cache); + +/** + * cloud_firestore_internal_snapshot_metadata_get_has_pending_writes + * @object: a #CloudFirestoreInternalSnapshotMetadata. + * + * Gets the value of the hasPendingWrites field of @object. + * + * Returns: the field value. + */ +gboolean cloud_firestore_internal_snapshot_metadata_get_has_pending_writes( + CloudFirestoreInternalSnapshotMetadata* object); + +/** + * cloud_firestore_internal_snapshot_metadata_get_is_from_cache + * @object: a #CloudFirestoreInternalSnapshotMetadata. + * + * Gets the value of the isFromCache field of @object. + * + * Returns: the field value. + */ +gboolean cloud_firestore_internal_snapshot_metadata_get_is_from_cache( + CloudFirestoreInternalSnapshotMetadata* object); + +/** + * cloud_firestore_internal_snapshot_metadata_equals: + * @a: a #CloudFirestoreInternalSnapshotMetadata. + * @b: another #CloudFirestoreInternalSnapshotMetadata. + * + * Checks if two #CloudFirestoreInternalSnapshotMetadata objects are equal. + * + * Returns: TRUE if @a and @b are equal. + */ +gboolean cloud_firestore_internal_snapshot_metadata_equals( + CloudFirestoreInternalSnapshotMetadata* a, + CloudFirestoreInternalSnapshotMetadata* b); + +/** + * cloud_firestore_internal_snapshot_metadata_hash: + * @object: a #CloudFirestoreInternalSnapshotMetadata. + * + * Calculates a hash code for a #CloudFirestoreInternalSnapshotMetadata object. + * + * Returns: the hash code. + */ +guint cloud_firestore_internal_snapshot_metadata_hash( + CloudFirestoreInternalSnapshotMetadata* object); + +/** + * CloudFirestoreInternalDocumentSnapshot: + * + */ + +G_DECLARE_FINAL_TYPE(CloudFirestoreInternalDocumentSnapshot, + cloud_firestore_internal_document_snapshot, + CLOUD_FIRESTORE, INTERNAL_DOCUMENT_SNAPSHOT, GObject) + +/** + * cloud_firestore_internal_document_snapshot_new: + * path: field in this object. + * data: field in this object. + * metadata: field in this object. + * + * Creates a new #InternalDocumentSnapshot object. + * + * Returns: a new #CloudFirestoreInternalDocumentSnapshot + */ +CloudFirestoreInternalDocumentSnapshot* +cloud_firestore_internal_document_snapshot_new( + const gchar* path, FlValue* data, + CloudFirestoreInternalSnapshotMetadata* metadata); + +/** + * cloud_firestore_internal_document_snapshot_get_path + * @object: a #CloudFirestoreInternalDocumentSnapshot. + * + * Gets the value of the path field of @object. + * + * Returns: the field value. + */ +const gchar* cloud_firestore_internal_document_snapshot_get_path( + CloudFirestoreInternalDocumentSnapshot* object); + +/** + * cloud_firestore_internal_document_snapshot_get_data + * @object: a #CloudFirestoreInternalDocumentSnapshot. + * + * Gets the value of the data field of @object. + * + * Returns: the field value. + */ +FlValue* cloud_firestore_internal_document_snapshot_get_data( + CloudFirestoreInternalDocumentSnapshot* object); + +/** + * cloud_firestore_internal_document_snapshot_get_metadata + * @object: a #CloudFirestoreInternalDocumentSnapshot. + * + * Gets the value of the metadata field of @object. + * + * Returns: the field value. + */ +CloudFirestoreInternalSnapshotMetadata* +cloud_firestore_internal_document_snapshot_get_metadata( + CloudFirestoreInternalDocumentSnapshot* object); + +/** + * cloud_firestore_internal_document_snapshot_equals: + * @a: a #CloudFirestoreInternalDocumentSnapshot. + * @b: another #CloudFirestoreInternalDocumentSnapshot. + * + * Checks if two #CloudFirestoreInternalDocumentSnapshot objects are equal. + * + * Returns: TRUE if @a and @b are equal. + */ +gboolean cloud_firestore_internal_document_snapshot_equals( + CloudFirestoreInternalDocumentSnapshot* a, + CloudFirestoreInternalDocumentSnapshot* b); + +/** + * cloud_firestore_internal_document_snapshot_hash: + * @object: a #CloudFirestoreInternalDocumentSnapshot. + * + * Calculates a hash code for a #CloudFirestoreInternalDocumentSnapshot object. + * + * Returns: the hash code. + */ +guint cloud_firestore_internal_document_snapshot_hash( + CloudFirestoreInternalDocumentSnapshot* object); + +/** + * CloudFirestoreInternalDocumentChange: + * + */ + +G_DECLARE_FINAL_TYPE(CloudFirestoreInternalDocumentChange, + cloud_firestore_internal_document_change, CLOUD_FIRESTORE, + INTERNAL_DOCUMENT_CHANGE, GObject) + +/** + * cloud_firestore_internal_document_change_new: + * type_: field in this object. + * document: field in this object. + * old_index: field in this object. + * new_index: field in this object. + * + * Creates a new #InternalDocumentChange object. + * + * Returns: a new #CloudFirestoreInternalDocumentChange + */ +CloudFirestoreInternalDocumentChange* +cloud_firestore_internal_document_change_new( + CloudFirestoreDocumentChangeType type_, + CloudFirestoreInternalDocumentSnapshot* document, int64_t old_index, + int64_t new_index); + +/** + * cloud_firestore_internal_document_change_get_type_ + * @object: a #CloudFirestoreInternalDocumentChange. + * + * Gets the value of the type field of @object. + * + * Returns: the field value. + */ +CloudFirestoreDocumentChangeType +cloud_firestore_internal_document_change_get_type_( + CloudFirestoreInternalDocumentChange* object); + +/** + * cloud_firestore_internal_document_change_get_document + * @object: a #CloudFirestoreInternalDocumentChange. + * + * Gets the value of the document field of @object. + * + * Returns: the field value. + */ +CloudFirestoreInternalDocumentSnapshot* +cloud_firestore_internal_document_change_get_document( + CloudFirestoreInternalDocumentChange* object); + +/** + * cloud_firestore_internal_document_change_get_old_index + * @object: a #CloudFirestoreInternalDocumentChange. + * + * Gets the value of the oldIndex field of @object. + * + * Returns: the field value. + */ +int64_t cloud_firestore_internal_document_change_get_old_index( + CloudFirestoreInternalDocumentChange* object); + +/** + * cloud_firestore_internal_document_change_get_new_index + * @object: a #CloudFirestoreInternalDocumentChange. + * + * Gets the value of the newIndex field of @object. + * + * Returns: the field value. + */ +int64_t cloud_firestore_internal_document_change_get_new_index( + CloudFirestoreInternalDocumentChange* object); + +/** + * cloud_firestore_internal_document_change_equals: + * @a: a #CloudFirestoreInternalDocumentChange. + * @b: another #CloudFirestoreInternalDocumentChange. + * + * Checks if two #CloudFirestoreInternalDocumentChange objects are equal. + * + * Returns: TRUE if @a and @b are equal. + */ +gboolean cloud_firestore_internal_document_change_equals( + CloudFirestoreInternalDocumentChange* a, + CloudFirestoreInternalDocumentChange* b); + +/** + * cloud_firestore_internal_document_change_hash: + * @object: a #CloudFirestoreInternalDocumentChange. + * + * Calculates a hash code for a #CloudFirestoreInternalDocumentChange object. + * + * Returns: the hash code. + */ +guint cloud_firestore_internal_document_change_hash( + CloudFirestoreInternalDocumentChange* object); + +/** + * CloudFirestoreInternalQuerySnapshot: + * + */ + +G_DECLARE_FINAL_TYPE(CloudFirestoreInternalQuerySnapshot, + cloud_firestore_internal_query_snapshot, CLOUD_FIRESTORE, + INTERNAL_QUERY_SNAPSHOT, GObject) + +/** + * cloud_firestore_internal_query_snapshot_new: + * documents: field in this object. + * document_changes: field in this object. + * metadata: field in this object. + * + * Creates a new #InternalQuerySnapshot object. + * + * Returns: a new #CloudFirestoreInternalQuerySnapshot + */ +CloudFirestoreInternalQuerySnapshot* +cloud_firestore_internal_query_snapshot_new( + FlValue* documents, FlValue* document_changes, + CloudFirestoreInternalSnapshotMetadata* metadata); + +/** + * cloud_firestore_internal_query_snapshot_get_documents + * @object: a #CloudFirestoreInternalQuerySnapshot. + * + * Gets the value of the documents field of @object. + * + * Returns: the field value. + */ +FlValue* cloud_firestore_internal_query_snapshot_get_documents( + CloudFirestoreInternalQuerySnapshot* object); + +/** + * cloud_firestore_internal_query_snapshot_get_document_changes + * @object: a #CloudFirestoreInternalQuerySnapshot. + * + * Gets the value of the documentChanges field of @object. + * + * Returns: the field value. + */ +FlValue* cloud_firestore_internal_query_snapshot_get_document_changes( + CloudFirestoreInternalQuerySnapshot* object); + +/** + * cloud_firestore_internal_query_snapshot_get_metadata + * @object: a #CloudFirestoreInternalQuerySnapshot. + * + * Gets the value of the metadata field of @object. + * + * Returns: the field value. + */ +CloudFirestoreInternalSnapshotMetadata* +cloud_firestore_internal_query_snapshot_get_metadata( + CloudFirestoreInternalQuerySnapshot* object); + +/** + * cloud_firestore_internal_query_snapshot_equals: + * @a: a #CloudFirestoreInternalQuerySnapshot. + * @b: another #CloudFirestoreInternalQuerySnapshot. + * + * Checks if two #CloudFirestoreInternalQuerySnapshot objects are equal. + * + * Returns: TRUE if @a and @b are equal. + */ +gboolean cloud_firestore_internal_query_snapshot_equals( + CloudFirestoreInternalQuerySnapshot* a, + CloudFirestoreInternalQuerySnapshot* b); + +/** + * cloud_firestore_internal_query_snapshot_hash: + * @object: a #CloudFirestoreInternalQuerySnapshot. + * + * Calculates a hash code for a #CloudFirestoreInternalQuerySnapshot object. + * + * Returns: the hash code. + */ +guint cloud_firestore_internal_query_snapshot_hash( + CloudFirestoreInternalQuerySnapshot* object); + +/** + * CloudFirestoreInternalPipelineResult: + * + */ + +G_DECLARE_FINAL_TYPE(CloudFirestoreInternalPipelineResult, + cloud_firestore_internal_pipeline_result, CLOUD_FIRESTORE, + INTERNAL_PIPELINE_RESULT, GObject) + +/** + * cloud_firestore_internal_pipeline_result_new: + * document_path: field in this object. + * create_time: field in this object. + * update_time: field in this object. + * data: field in this object. + * + * Creates a new #InternalPipelineResult object. + * + * Returns: a new #CloudFirestoreInternalPipelineResult + */ +CloudFirestoreInternalPipelineResult* +cloud_firestore_internal_pipeline_result_new(const gchar* document_path, + int64_t* create_time, + int64_t* update_time, + FlValue* data); + +/** + * cloud_firestore_internal_pipeline_result_get_document_path + * @object: a #CloudFirestoreInternalPipelineResult. + * + * Gets the value of the documentPath field of @object. + * + * Returns: the field value. + */ +const gchar* cloud_firestore_internal_pipeline_result_get_document_path( + CloudFirestoreInternalPipelineResult* object); + +/** + * cloud_firestore_internal_pipeline_result_get_create_time + * @object: a #CloudFirestoreInternalPipelineResult. + * + * Gets the value of the createTime field of @object. + * + * Returns: the field value. + */ +int64_t* cloud_firestore_internal_pipeline_result_get_create_time( + CloudFirestoreInternalPipelineResult* object); + +/** + * cloud_firestore_internal_pipeline_result_get_update_time + * @object: a #CloudFirestoreInternalPipelineResult. + * + * Gets the value of the updateTime field of @object. + * + * Returns: the field value. + */ +int64_t* cloud_firestore_internal_pipeline_result_get_update_time( + CloudFirestoreInternalPipelineResult* object); + +/** + * cloud_firestore_internal_pipeline_result_get_data + * @object: a #CloudFirestoreInternalPipelineResult. + * + * All fields in the result (from PipelineResult.data() on Android). + * + * Returns: the field value. + */ +FlValue* cloud_firestore_internal_pipeline_result_get_data( + CloudFirestoreInternalPipelineResult* object); + +/** + * cloud_firestore_internal_pipeline_result_equals: + * @a: a #CloudFirestoreInternalPipelineResult. + * @b: another #CloudFirestoreInternalPipelineResult. + * + * Checks if two #CloudFirestoreInternalPipelineResult objects are equal. + * + * Returns: TRUE if @a and @b are equal. + */ +gboolean cloud_firestore_internal_pipeline_result_equals( + CloudFirestoreInternalPipelineResult* a, + CloudFirestoreInternalPipelineResult* b); + +/** + * cloud_firestore_internal_pipeline_result_hash: + * @object: a #CloudFirestoreInternalPipelineResult. + * + * Calculates a hash code for a #CloudFirestoreInternalPipelineResult object. + * + * Returns: the hash code. + */ +guint cloud_firestore_internal_pipeline_result_hash( + CloudFirestoreInternalPipelineResult* object); + +/** + * CloudFirestoreInternalPipelineSnapshot: + * + */ + +G_DECLARE_FINAL_TYPE(CloudFirestoreInternalPipelineSnapshot, + cloud_firestore_internal_pipeline_snapshot, + CLOUD_FIRESTORE, INTERNAL_PIPELINE_SNAPSHOT, GObject) + +/** + * cloud_firestore_internal_pipeline_snapshot_new: + * results: field in this object. + * execution_time: field in this object. + * + * Creates a new #InternalPipelineSnapshot object. + * + * Returns: a new #CloudFirestoreInternalPipelineSnapshot + */ +CloudFirestoreInternalPipelineSnapshot* +cloud_firestore_internal_pipeline_snapshot_new(FlValue* results, + int64_t execution_time); + +/** + * cloud_firestore_internal_pipeline_snapshot_get_results + * @object: a #CloudFirestoreInternalPipelineSnapshot. + * + * Gets the value of the results field of @object. + * + * Returns: the field value. + */ +FlValue* cloud_firestore_internal_pipeline_snapshot_get_results( + CloudFirestoreInternalPipelineSnapshot* object); + +/** + * cloud_firestore_internal_pipeline_snapshot_get_execution_time + * @object: a #CloudFirestoreInternalPipelineSnapshot. + * + * Gets the value of the executionTime field of @object. + * + * Returns: the field value. + */ +int64_t cloud_firestore_internal_pipeline_snapshot_get_execution_time( + CloudFirestoreInternalPipelineSnapshot* object); + +/** + * cloud_firestore_internal_pipeline_snapshot_equals: + * @a: a #CloudFirestoreInternalPipelineSnapshot. + * @b: another #CloudFirestoreInternalPipelineSnapshot. + * + * Checks if two #CloudFirestoreInternalPipelineSnapshot objects are equal. + * + * Returns: TRUE if @a and @b are equal. + */ +gboolean cloud_firestore_internal_pipeline_snapshot_equals( + CloudFirestoreInternalPipelineSnapshot* a, + CloudFirestoreInternalPipelineSnapshot* b); + +/** + * cloud_firestore_internal_pipeline_snapshot_hash: + * @object: a #CloudFirestoreInternalPipelineSnapshot. + * + * Calculates a hash code for a #CloudFirestoreInternalPipelineSnapshot object. + * + * Returns: the hash code. + */ +guint cloud_firestore_internal_pipeline_snapshot_hash( + CloudFirestoreInternalPipelineSnapshot* object); + +/** + * CloudFirestoreInternalGetOptions: + * + */ + +G_DECLARE_FINAL_TYPE(CloudFirestoreInternalGetOptions, + cloud_firestore_internal_get_options, CLOUD_FIRESTORE, + INTERNAL_GET_OPTIONS, GObject) + +/** + * cloud_firestore_internal_get_options_new: + * source: field in this object. + * server_timestamp_behavior: field in this object. + * + * Creates a new #InternalGetOptions object. + * + * Returns: a new #CloudFirestoreInternalGetOptions + */ +CloudFirestoreInternalGetOptions* cloud_firestore_internal_get_options_new( + CloudFirestoreSource source, + CloudFirestoreServerTimestampBehavior server_timestamp_behavior); + +/** + * cloud_firestore_internal_get_options_get_source + * @object: a #CloudFirestoreInternalGetOptions. + * + * Gets the value of the source field of @object. + * + * Returns: the field value. + */ +CloudFirestoreSource cloud_firestore_internal_get_options_get_source( + CloudFirestoreInternalGetOptions* object); + +/** + * cloud_firestore_internal_get_options_get_server_timestamp_behavior + * @object: a #CloudFirestoreInternalGetOptions. + * + * Gets the value of the serverTimestampBehavior field of @object. + * + * Returns: the field value. + */ +CloudFirestoreServerTimestampBehavior +cloud_firestore_internal_get_options_get_server_timestamp_behavior( + CloudFirestoreInternalGetOptions* object); + +/** + * cloud_firestore_internal_get_options_equals: + * @a: a #CloudFirestoreInternalGetOptions. + * @b: another #CloudFirestoreInternalGetOptions. + * + * Checks if two #CloudFirestoreInternalGetOptions objects are equal. + * + * Returns: TRUE if @a and @b are equal. + */ +gboolean cloud_firestore_internal_get_options_equals( + CloudFirestoreInternalGetOptions* a, CloudFirestoreInternalGetOptions* b); + +/** + * cloud_firestore_internal_get_options_hash: + * @object: a #CloudFirestoreInternalGetOptions. + * + * Calculates a hash code for a #CloudFirestoreInternalGetOptions object. + * + * Returns: the hash code. + */ +guint cloud_firestore_internal_get_options_hash( + CloudFirestoreInternalGetOptions* object); + +/** + * CloudFirestoreInternalDocumentOption: + * + */ + +G_DECLARE_FINAL_TYPE(CloudFirestoreInternalDocumentOption, + cloud_firestore_internal_document_option, CLOUD_FIRESTORE, + INTERNAL_DOCUMENT_OPTION, GObject) + +/** + * cloud_firestore_internal_document_option_new: + * merge: field in this object. + * merge_fields: field in this object. + * + * Creates a new #InternalDocumentOption object. + * + * Returns: a new #CloudFirestoreInternalDocumentOption + */ +CloudFirestoreInternalDocumentOption* +cloud_firestore_internal_document_option_new(gboolean* merge, + FlValue* merge_fields); + +/** + * cloud_firestore_internal_document_option_get_merge + * @object: a #CloudFirestoreInternalDocumentOption. + * + * Gets the value of the merge field of @object. + * + * Returns: the field value. + */ +gboolean* cloud_firestore_internal_document_option_get_merge( + CloudFirestoreInternalDocumentOption* object); + +/** + * cloud_firestore_internal_document_option_get_merge_fields + * @object: a #CloudFirestoreInternalDocumentOption. + * + * Gets the value of the mergeFields field of @object. + * + * Returns: the field value. + */ +FlValue* cloud_firestore_internal_document_option_get_merge_fields( + CloudFirestoreInternalDocumentOption* object); + +/** + * cloud_firestore_internal_document_option_equals: + * @a: a #CloudFirestoreInternalDocumentOption. + * @b: another #CloudFirestoreInternalDocumentOption. + * + * Checks if two #CloudFirestoreInternalDocumentOption objects are equal. + * + * Returns: TRUE if @a and @b are equal. + */ +gboolean cloud_firestore_internal_document_option_equals( + CloudFirestoreInternalDocumentOption* a, + CloudFirestoreInternalDocumentOption* b); + +/** + * cloud_firestore_internal_document_option_hash: + * @object: a #CloudFirestoreInternalDocumentOption. + * + * Calculates a hash code for a #CloudFirestoreInternalDocumentOption object. + * + * Returns: the hash code. + */ +guint cloud_firestore_internal_document_option_hash( + CloudFirestoreInternalDocumentOption* object); + +/** + * CloudFirestoreInternalTransactionCommand: + * + */ + +G_DECLARE_FINAL_TYPE(CloudFirestoreInternalTransactionCommand, + cloud_firestore_internal_transaction_command, + CLOUD_FIRESTORE, INTERNAL_TRANSACTION_COMMAND, GObject) + +/** + * cloud_firestore_internal_transaction_command_new: + * type_: field in this object. + * path: field in this object. + * data: field in this object. + * option: field in this object. + * + * Creates a new #InternalTransactionCommand object. + * + * Returns: a new #CloudFirestoreInternalTransactionCommand + */ +CloudFirestoreInternalTransactionCommand* +cloud_firestore_internal_transaction_command_new( + CloudFirestoreInternalTransactionType type_, const gchar* path, + FlValue* data, CloudFirestoreInternalDocumentOption* option); + +/** + * cloud_firestore_internal_transaction_command_get_type_ + * @object: a #CloudFirestoreInternalTransactionCommand. + * + * Gets the value of the type field of @object. + * + * Returns: the field value. + */ +CloudFirestoreInternalTransactionType +cloud_firestore_internal_transaction_command_get_type_( + CloudFirestoreInternalTransactionCommand* object); + +/** + * cloud_firestore_internal_transaction_command_get_path + * @object: a #CloudFirestoreInternalTransactionCommand. + * + * Gets the value of the path field of @object. + * + * Returns: the field value. + */ +const gchar* cloud_firestore_internal_transaction_command_get_path( + CloudFirestoreInternalTransactionCommand* object); + +/** + * cloud_firestore_internal_transaction_command_get_data + * @object: a #CloudFirestoreInternalTransactionCommand. + * + * Gets the value of the data field of @object. + * + * Returns: the field value. + */ +FlValue* cloud_firestore_internal_transaction_command_get_data( + CloudFirestoreInternalTransactionCommand* object); + +/** + * cloud_firestore_internal_transaction_command_get_option + * @object: a #CloudFirestoreInternalTransactionCommand. + * + * Gets the value of the option field of @object. + * + * Returns: the field value. + */ +CloudFirestoreInternalDocumentOption* +cloud_firestore_internal_transaction_command_get_option( + CloudFirestoreInternalTransactionCommand* object); + +/** + * cloud_firestore_internal_transaction_command_equals: + * @a: a #CloudFirestoreInternalTransactionCommand. + * @b: another #CloudFirestoreInternalTransactionCommand. + * + * Checks if two #CloudFirestoreInternalTransactionCommand objects are equal. + * + * Returns: TRUE if @a and @b are equal. + */ +gboolean cloud_firestore_internal_transaction_command_equals( + CloudFirestoreInternalTransactionCommand* a, + CloudFirestoreInternalTransactionCommand* b); + +/** + * cloud_firestore_internal_transaction_command_hash: + * @object: a #CloudFirestoreInternalTransactionCommand. + * + * Calculates a hash code for a #CloudFirestoreInternalTransactionCommand + * object. + * + * Returns: the hash code. + */ +guint cloud_firestore_internal_transaction_command_hash( + CloudFirestoreInternalTransactionCommand* object); + +/** + * CloudFirestoreDocumentReferenceRequest: + * + */ + +G_DECLARE_FINAL_TYPE(CloudFirestoreDocumentReferenceRequest, + cloud_firestore_document_reference_request, + CLOUD_FIRESTORE, DOCUMENT_REFERENCE_REQUEST, GObject) + +/** + * cloud_firestore_document_reference_request_new: + * path: field in this object. + * data: field in this object. + * option: field in this object. + * source: field in this object. + * server_timestamp_behavior: field in this object. + * + * Creates a new #DocumentReferenceRequest object. + * + * Returns: a new #CloudFirestoreDocumentReferenceRequest + */ +CloudFirestoreDocumentReferenceRequest* +cloud_firestore_document_reference_request_new( + const gchar* path, FlValue* data, + CloudFirestoreInternalDocumentOption* option, CloudFirestoreSource* source, + CloudFirestoreServerTimestampBehavior* server_timestamp_behavior); + +/** + * cloud_firestore_document_reference_request_get_path + * @object: a #CloudFirestoreDocumentReferenceRequest. + * + * Gets the value of the path field of @object. + * + * Returns: the field value. + */ +const gchar* cloud_firestore_document_reference_request_get_path( + CloudFirestoreDocumentReferenceRequest* object); + +/** + * cloud_firestore_document_reference_request_get_data + * @object: a #CloudFirestoreDocumentReferenceRequest. + * + * Gets the value of the data field of @object. + * + * Returns: the field value. + */ +FlValue* cloud_firestore_document_reference_request_get_data( + CloudFirestoreDocumentReferenceRequest* object); + +/** + * cloud_firestore_document_reference_request_get_option + * @object: a #CloudFirestoreDocumentReferenceRequest. + * + * Gets the value of the option field of @object. + * + * Returns: the field value. + */ +CloudFirestoreInternalDocumentOption* +cloud_firestore_document_reference_request_get_option( + CloudFirestoreDocumentReferenceRequest* object); + +/** + * cloud_firestore_document_reference_request_get_source + * @object: a #CloudFirestoreDocumentReferenceRequest. + * + * Gets the value of the source field of @object. + * + * Returns: the field value. + */ +CloudFirestoreSource* cloud_firestore_document_reference_request_get_source( + CloudFirestoreDocumentReferenceRequest* object); + +/** + * cloud_firestore_document_reference_request_get_server_timestamp_behavior + * @object: a #CloudFirestoreDocumentReferenceRequest. + * + * Gets the value of the serverTimestampBehavior field of @object. + * + * Returns: the field value. + */ +CloudFirestoreServerTimestampBehavior* +cloud_firestore_document_reference_request_get_server_timestamp_behavior( + CloudFirestoreDocumentReferenceRequest* object); + +/** + * cloud_firestore_document_reference_request_equals: + * @a: a #CloudFirestoreDocumentReferenceRequest. + * @b: another #CloudFirestoreDocumentReferenceRequest. + * + * Checks if two #CloudFirestoreDocumentReferenceRequest objects are equal. + * + * Returns: TRUE if @a and @b are equal. + */ +gboolean cloud_firestore_document_reference_request_equals( + CloudFirestoreDocumentReferenceRequest* a, + CloudFirestoreDocumentReferenceRequest* b); + +/** + * cloud_firestore_document_reference_request_hash: + * @object: a #CloudFirestoreDocumentReferenceRequest. + * + * Calculates a hash code for a #CloudFirestoreDocumentReferenceRequest object. + * + * Returns: the hash code. + */ +guint cloud_firestore_document_reference_request_hash( + CloudFirestoreDocumentReferenceRequest* object); + +/** + * CloudFirestoreInternalQueryParameters: + * + */ + +G_DECLARE_FINAL_TYPE(CloudFirestoreInternalQueryParameters, + cloud_firestore_internal_query_parameters, CLOUD_FIRESTORE, + INTERNAL_QUERY_PARAMETERS, GObject) + +/** + * cloud_firestore_internal_query_parameters_new: + * where: field in this object. + * order_by: field in this object. + * limit: field in this object. + * limit_to_last: field in this object. + * start_at: field in this object. + * start_after: field in this object. + * end_at: field in this object. + * end_before: field in this object. + * filters: field in this object. + * + * Creates a new #InternalQueryParameters object. + * + * Returns: a new #CloudFirestoreInternalQueryParameters + */ +CloudFirestoreInternalQueryParameters* +cloud_firestore_internal_query_parameters_new( + FlValue* where, FlValue* order_by, int64_t* limit, int64_t* limit_to_last, + FlValue* start_at, FlValue* start_after, FlValue* end_at, + FlValue* end_before, FlValue* filters); + +/** + * cloud_firestore_internal_query_parameters_get_where + * @object: a #CloudFirestoreInternalQueryParameters. + * + * Gets the value of the where field of @object. + * + * Returns: the field value. + */ +FlValue* cloud_firestore_internal_query_parameters_get_where( + CloudFirestoreInternalQueryParameters* object); + +/** + * cloud_firestore_internal_query_parameters_get_order_by + * @object: a #CloudFirestoreInternalQueryParameters. + * + * Gets the value of the orderBy field of @object. + * + * Returns: the field value. + */ +FlValue* cloud_firestore_internal_query_parameters_get_order_by( + CloudFirestoreInternalQueryParameters* object); + +/** + * cloud_firestore_internal_query_parameters_get_limit + * @object: a #CloudFirestoreInternalQueryParameters. + * + * Gets the value of the limit field of @object. + * + * Returns: the field value. + */ +int64_t* cloud_firestore_internal_query_parameters_get_limit( + CloudFirestoreInternalQueryParameters* object); + +/** + * cloud_firestore_internal_query_parameters_get_limit_to_last + * @object: a #CloudFirestoreInternalQueryParameters. + * + * Gets the value of the limitToLast field of @object. + * + * Returns: the field value. + */ +int64_t* cloud_firestore_internal_query_parameters_get_limit_to_last( + CloudFirestoreInternalQueryParameters* object); + +/** + * cloud_firestore_internal_query_parameters_get_start_at + * @object: a #CloudFirestoreInternalQueryParameters. + * + * Gets the value of the startAt field of @object. + * + * Returns: the field value. + */ +FlValue* cloud_firestore_internal_query_parameters_get_start_at( + CloudFirestoreInternalQueryParameters* object); + +/** + * cloud_firestore_internal_query_parameters_get_start_after + * @object: a #CloudFirestoreInternalQueryParameters. + * + * Gets the value of the startAfter field of @object. + * + * Returns: the field value. + */ +FlValue* cloud_firestore_internal_query_parameters_get_start_after( + CloudFirestoreInternalQueryParameters* object); + +/** + * cloud_firestore_internal_query_parameters_get_end_at + * @object: a #CloudFirestoreInternalQueryParameters. + * + * Gets the value of the endAt field of @object. + * + * Returns: the field value. + */ +FlValue* cloud_firestore_internal_query_parameters_get_end_at( + CloudFirestoreInternalQueryParameters* object); + +/** + * cloud_firestore_internal_query_parameters_get_end_before + * @object: a #CloudFirestoreInternalQueryParameters. + * + * Gets the value of the endBefore field of @object. + * + * Returns: the field value. + */ +FlValue* cloud_firestore_internal_query_parameters_get_end_before( + CloudFirestoreInternalQueryParameters* object); + +/** + * cloud_firestore_internal_query_parameters_get_filters + * @object: a #CloudFirestoreInternalQueryParameters. + * + * Gets the value of the filters field of @object. + * + * Returns: the field value. + */ +FlValue* cloud_firestore_internal_query_parameters_get_filters( + CloudFirestoreInternalQueryParameters* object); + +/** + * cloud_firestore_internal_query_parameters_equals: + * @a: a #CloudFirestoreInternalQueryParameters. + * @b: another #CloudFirestoreInternalQueryParameters. + * + * Checks if two #CloudFirestoreInternalQueryParameters objects are equal. + * + * Returns: TRUE if @a and @b are equal. + */ +gboolean cloud_firestore_internal_query_parameters_equals( + CloudFirestoreInternalQueryParameters* a, + CloudFirestoreInternalQueryParameters* b); + +/** + * cloud_firestore_internal_query_parameters_hash: + * @object: a #CloudFirestoreInternalQueryParameters. + * + * Calculates a hash code for a #CloudFirestoreInternalQueryParameters object. + * + * Returns: the hash code. + */ +guint cloud_firestore_internal_query_parameters_hash( + CloudFirestoreInternalQueryParameters* object); + +/** + * CloudFirestoreAggregateQuery: + * + */ + +G_DECLARE_FINAL_TYPE(CloudFirestoreAggregateQuery, + cloud_firestore_aggregate_query, CLOUD_FIRESTORE, + AGGREGATE_QUERY, GObject) + +/** + * cloud_firestore_aggregate_query_new: + * type_: field in this object. + * field: field in this object. + * + * Creates a new #AggregateQuery object. + * + * Returns: a new #CloudFirestoreAggregateQuery + */ +CloudFirestoreAggregateQuery* cloud_firestore_aggregate_query_new( + CloudFirestoreAggregateType type_, const gchar* field); + +/** + * cloud_firestore_aggregate_query_get_type_ + * @object: a #CloudFirestoreAggregateQuery. + * + * Gets the value of the type field of @object. + * + * Returns: the field value. + */ +CloudFirestoreAggregateType cloud_firestore_aggregate_query_get_type_( + CloudFirestoreAggregateQuery* object); + +/** + * cloud_firestore_aggregate_query_get_field + * @object: a #CloudFirestoreAggregateQuery. + * + * Gets the value of the field field of @object. + * + * Returns: the field value. + */ +const gchar* cloud_firestore_aggregate_query_get_field( + CloudFirestoreAggregateQuery* object); + +/** + * cloud_firestore_aggregate_query_equals: + * @a: a #CloudFirestoreAggregateQuery. + * @b: another #CloudFirestoreAggregateQuery. + * + * Checks if two #CloudFirestoreAggregateQuery objects are equal. + * + * Returns: TRUE if @a and @b are equal. + */ +gboolean cloud_firestore_aggregate_query_equals( + CloudFirestoreAggregateQuery* a, CloudFirestoreAggregateQuery* b); + +/** + * cloud_firestore_aggregate_query_hash: + * @object: a #CloudFirestoreAggregateQuery. + * + * Calculates a hash code for a #CloudFirestoreAggregateQuery object. + * + * Returns: the hash code. + */ +guint cloud_firestore_aggregate_query_hash( + CloudFirestoreAggregateQuery* object); + +/** + * CloudFirestoreAggregateQueryResponse: + * + */ + +G_DECLARE_FINAL_TYPE(CloudFirestoreAggregateQueryResponse, + cloud_firestore_aggregate_query_response, CLOUD_FIRESTORE, + AGGREGATE_QUERY_RESPONSE, GObject) + +/** + * cloud_firestore_aggregate_query_response_new: + * type_: field in this object. + * field: field in this object. + * value: field in this object. + * + * Creates a new #AggregateQueryResponse object. + * + * Returns: a new #CloudFirestoreAggregateQueryResponse + */ +CloudFirestoreAggregateQueryResponse* +cloud_firestore_aggregate_query_response_new(CloudFirestoreAggregateType type_, + const gchar* field, double* value); + +/** + * cloud_firestore_aggregate_query_response_get_type_ + * @object: a #CloudFirestoreAggregateQueryResponse. + * + * Gets the value of the type field of @object. + * + * Returns: the field value. + */ +CloudFirestoreAggregateType cloud_firestore_aggregate_query_response_get_type_( + CloudFirestoreAggregateQueryResponse* object); + +/** + * cloud_firestore_aggregate_query_response_get_field + * @object: a #CloudFirestoreAggregateQueryResponse. + * + * Gets the value of the field field of @object. + * + * Returns: the field value. + */ +const gchar* cloud_firestore_aggregate_query_response_get_field( + CloudFirestoreAggregateQueryResponse* object); + +/** + * cloud_firestore_aggregate_query_response_get_value + * @object: a #CloudFirestoreAggregateQueryResponse. + * + * Gets the value of the value field of @object. + * + * Returns: the field value. + */ +double* cloud_firestore_aggregate_query_response_get_value( + CloudFirestoreAggregateQueryResponse* object); + +/** + * cloud_firestore_aggregate_query_response_equals: + * @a: a #CloudFirestoreAggregateQueryResponse. + * @b: another #CloudFirestoreAggregateQueryResponse. + * + * Checks if two #CloudFirestoreAggregateQueryResponse objects are equal. + * + * Returns: TRUE if @a and @b are equal. + */ +gboolean cloud_firestore_aggregate_query_response_equals( + CloudFirestoreAggregateQueryResponse* a, + CloudFirestoreAggregateQueryResponse* b); + +/** + * cloud_firestore_aggregate_query_response_hash: + * @object: a #CloudFirestoreAggregateQueryResponse. + * + * Calculates a hash code for a #CloudFirestoreAggregateQueryResponse object. + * + * Returns: the hash code. + */ +guint cloud_firestore_aggregate_query_response_hash( + CloudFirestoreAggregateQueryResponse* object); + +G_DECLARE_FINAL_TYPE(CloudFirestoreMessageCodec, cloud_firestore_message_codec, + CLOUD_FIRESTORE, MESSAGE_CODEC, FlStandardMessageCodec) + +/** + * cloud_firestore_message_codec_new: + * + * Creates a #CloudFirestoreMessageCodec. + * + * Modified from the generated code: exposed so the plugin can attach the + * Pigeon-aware codec to Firestore event channels, mirroring + * FirebaseFirestoreHostApiCodecSerializer::GetInstance() on Windows. + * + * Returns: a new #CloudFirestoreMessageCodec. + */ +CloudFirestoreMessageCodec* cloud_firestore_message_codec_new(); + +/** + * Custom type ID constants: + * + * Constants used to identify custom types in the codec. + * They are used in the codec to encode and decode custom types. + * They may be used in custom object creation functions to identify the type. + */ +extern const int cloud_firestore_document_change_type_type_id; +extern const int cloud_firestore_source_type_id; +extern const int cloud_firestore_listen_source_type_id; +extern const int cloud_firestore_server_timestamp_behavior_type_id; +extern const int cloud_firestore_aggregate_source_type_id; +extern const int + cloud_firestore_persistence_cache_index_manager_request_type_id; +extern const int cloud_firestore_internal_transaction_result_type_id; +extern const int cloud_firestore_internal_transaction_type_type_id; +extern const int cloud_firestore_aggregate_type_type_id; +extern const int cloud_firestore_internal_firebase_settings_type_id; +extern const int cloud_firestore_firestore_pigeon_firebase_app_type_id; +extern const int cloud_firestore_internal_snapshot_metadata_type_id; +extern const int cloud_firestore_internal_document_snapshot_type_id; +extern const int cloud_firestore_internal_document_change_type_id; +extern const int cloud_firestore_internal_query_snapshot_type_id; +extern const int cloud_firestore_internal_pipeline_result_type_id; +extern const int cloud_firestore_internal_pipeline_snapshot_type_id; +extern const int cloud_firestore_internal_get_options_type_id; +extern const int cloud_firestore_internal_document_option_type_id; +extern const int cloud_firestore_internal_transaction_command_type_id; +extern const int cloud_firestore_document_reference_request_type_id; +extern const int cloud_firestore_internal_query_parameters_type_id; +extern const int cloud_firestore_aggregate_query_type_id; +extern const int cloud_firestore_aggregate_query_response_type_id; + +G_DECLARE_FINAL_TYPE(CloudFirestoreFirebaseFirestoreHostApi, + cloud_firestore_firebase_firestore_host_api, + CLOUD_FIRESTORE, FIREBASE_FIRESTORE_HOST_API, GObject) + +G_DECLARE_FINAL_TYPE( + CloudFirestoreFirebaseFirestoreHostApiResponseHandle, + cloud_firestore_firebase_firestore_host_api_response_handle, + CLOUD_FIRESTORE, FIREBASE_FIRESTORE_HOST_API_RESPONSE_HANDLE, GObject) + +/** + * CloudFirestoreFirebaseFirestoreHostApiVTable: + * + * Table of functions exposed by FirebaseFirestoreHostApi to be implemented by + * the API provider. + */ +typedef struct { + void (*load_bundle)( + CloudFirestoreFirestorePigeonFirebaseApp* app, const uint8_t* bundle, + size_t bundle_length, + CloudFirestoreFirebaseFirestoreHostApiResponseHandle* response_handle, + gpointer user_data); + void (*named_query_get)( + CloudFirestoreFirestorePigeonFirebaseApp* app, const gchar* name, + CloudFirestoreInternalGetOptions* options, + CloudFirestoreFirebaseFirestoreHostApiResponseHandle* response_handle, + gpointer user_data); + void (*clear_persistence)( + CloudFirestoreFirestorePigeonFirebaseApp* app, + CloudFirestoreFirebaseFirestoreHostApiResponseHandle* response_handle, + gpointer user_data); + void (*disable_network)( + CloudFirestoreFirestorePigeonFirebaseApp* app, + CloudFirestoreFirebaseFirestoreHostApiResponseHandle* response_handle, + gpointer user_data); + void (*enable_network)( + CloudFirestoreFirestorePigeonFirebaseApp* app, + CloudFirestoreFirebaseFirestoreHostApiResponseHandle* response_handle, + gpointer user_data); + void (*terminate)( + CloudFirestoreFirestorePigeonFirebaseApp* app, + CloudFirestoreFirebaseFirestoreHostApiResponseHandle* response_handle, + gpointer user_data); + void (*wait_for_pending_writes)( + CloudFirestoreFirestorePigeonFirebaseApp* app, + CloudFirestoreFirebaseFirestoreHostApiResponseHandle* response_handle, + gpointer user_data); + void (*set_index_configuration)( + CloudFirestoreFirestorePigeonFirebaseApp* app, + const gchar* index_configuration, + CloudFirestoreFirebaseFirestoreHostApiResponseHandle* response_handle, + gpointer user_data); + void (*set_logging_enabled)( + gboolean logging_enabled, + CloudFirestoreFirebaseFirestoreHostApiResponseHandle* response_handle, + gpointer user_data); + void (*snapshots_in_sync_setup)( + CloudFirestoreFirestorePigeonFirebaseApp* app, + CloudFirestoreFirebaseFirestoreHostApiResponseHandle* response_handle, + gpointer user_data); + void (*transaction_create)( + CloudFirestoreFirestorePigeonFirebaseApp* app, int64_t timeout, + int64_t max_attempts, + CloudFirestoreFirebaseFirestoreHostApiResponseHandle* response_handle, + gpointer user_data); + void (*transaction_store_result)( + const gchar* transaction_id, + CloudFirestoreInternalTransactionResult result_type, FlValue* commands, + CloudFirestoreFirebaseFirestoreHostApiResponseHandle* response_handle, + gpointer user_data); + void (*transaction_get)( + CloudFirestoreFirestorePigeonFirebaseApp* app, + const gchar* transaction_id, const gchar* path, + CloudFirestoreFirebaseFirestoreHostApiResponseHandle* response_handle, + gpointer user_data); + void (*document_reference_set)( + CloudFirestoreFirestorePigeonFirebaseApp* app, + CloudFirestoreDocumentReferenceRequest* request, + CloudFirestoreFirebaseFirestoreHostApiResponseHandle* response_handle, + gpointer user_data); + void (*document_reference_update)( + CloudFirestoreFirestorePigeonFirebaseApp* app, + CloudFirestoreDocumentReferenceRequest* request, + CloudFirestoreFirebaseFirestoreHostApiResponseHandle* response_handle, + gpointer user_data); + void (*document_reference_get)( + CloudFirestoreFirestorePigeonFirebaseApp* app, + CloudFirestoreDocumentReferenceRequest* request, + CloudFirestoreFirebaseFirestoreHostApiResponseHandle* response_handle, + gpointer user_data); + void (*document_reference_delete)( + CloudFirestoreFirestorePigeonFirebaseApp* app, + CloudFirestoreDocumentReferenceRequest* request, + CloudFirestoreFirebaseFirestoreHostApiResponseHandle* response_handle, + gpointer user_data); + void (*query_get)( + CloudFirestoreFirestorePigeonFirebaseApp* app, const gchar* path, + gboolean is_collection_group, + CloudFirestoreInternalQueryParameters* parameters, + CloudFirestoreInternalGetOptions* options, + CloudFirestoreFirebaseFirestoreHostApiResponseHandle* response_handle, + gpointer user_data); + void (*aggregate_query)( + CloudFirestoreFirestorePigeonFirebaseApp* app, const gchar* path, + CloudFirestoreInternalQueryParameters* parameters, + CloudFirestoreAggregateSource source, FlValue* queries, + gboolean is_collection_group, + CloudFirestoreFirebaseFirestoreHostApiResponseHandle* response_handle, + gpointer user_data); + void (*write_batch_commit)( + CloudFirestoreFirestorePigeonFirebaseApp* app, FlValue* writes, + CloudFirestoreFirebaseFirestoreHostApiResponseHandle* response_handle, + gpointer user_data); + void (*query_snapshot)( + CloudFirestoreFirestorePigeonFirebaseApp* app, const gchar* path, + gboolean is_collection_group, + CloudFirestoreInternalQueryParameters* parameters, + CloudFirestoreInternalGetOptions* options, + gboolean include_metadata_changes, CloudFirestoreListenSource source, + CloudFirestoreFirebaseFirestoreHostApiResponseHandle* response_handle, + gpointer user_data); + void (*document_reference_snapshot)( + CloudFirestoreFirestorePigeonFirebaseApp* app, + CloudFirestoreDocumentReferenceRequest* parameters, + gboolean include_metadata_changes, CloudFirestoreListenSource source, + CloudFirestoreFirebaseFirestoreHostApiResponseHandle* response_handle, + gpointer user_data); + void (*persistence_cache_index_manager_request)( + CloudFirestoreFirestorePigeonFirebaseApp* app, + CloudFirestorePersistenceCacheIndexManagerRequest request, + CloudFirestoreFirebaseFirestoreHostApiResponseHandle* response_handle, + gpointer user_data); + void (*execute_pipeline)( + CloudFirestoreFirestorePigeonFirebaseApp* app, FlValue* stages, + FlValue* options, + CloudFirestoreFirebaseFirestoreHostApiResponseHandle* response_handle, + gpointer user_data); +} CloudFirestoreFirebaseFirestoreHostApiVTable; + +/** + * cloud_firestore_firebase_firestore_host_api_set_method_handlers: + * + * @messenger: an #FlBinaryMessenger. + * @suffix: (allow-none): a suffix to add to the API or %NULL for none. + * @vtable: implementations of the methods in this API. + * @user_data: (closure): user data to pass to the functions in @vtable. + * @user_data_free_func: (allow-none): a function which gets called to free + * @user_data, or %NULL. + * + * Connects the method handlers in the FirebaseFirestoreHostApi API. + */ +void cloud_firestore_firebase_firestore_host_api_set_method_handlers( + FlBinaryMessenger* messenger, const gchar* suffix, + const CloudFirestoreFirebaseFirestoreHostApiVTable* vtable, + gpointer user_data, GDestroyNotify user_data_free_func); + +/** + * cloud_firestore_firebase_firestore_host_api_clear_method_handlers: + * + * @messenger: an #FlBinaryMessenger. + * @suffix: (allow-none): a suffix to add to the API or %NULL for none. + * + * Clears the method handlers in the FirebaseFirestoreHostApi API. + */ +void cloud_firestore_firebase_firestore_host_api_clear_method_handlers( + FlBinaryMessenger* messenger, const gchar* suffix); + +/** + * cloud_firestore_firebase_firestore_host_api_respond_load_bundle: + * @response_handle: a #CloudFirestoreFirebaseFirestoreHostApiResponseHandle. + * @return_value: location to write the value returned by this method. + * + * Responds to FirebaseFirestoreHostApi.loadBundle. + */ +void cloud_firestore_firebase_firestore_host_api_respond_load_bundle( + CloudFirestoreFirebaseFirestoreHostApiResponseHandle* response_handle, + const gchar* return_value); + +/** + * cloud_firestore_firebase_firestore_host_api_respond_error_load_bundle: + * @response_handle: a #CloudFirestoreFirebaseFirestoreHostApiResponseHandle. + * @code: error code. + * @message: error message. + * @details: (allow-none): error details or %NULL. + * + * Responds with an error to FirebaseFirestoreHostApi.loadBundle. + */ +void cloud_firestore_firebase_firestore_host_api_respond_error_load_bundle( + CloudFirestoreFirebaseFirestoreHostApiResponseHandle* response_handle, + const gchar* code, const gchar* message, FlValue* details); + +/** + * cloud_firestore_firebase_firestore_host_api_respond_named_query_get: + * @response_handle: a #CloudFirestoreFirebaseFirestoreHostApiResponseHandle. + * @return_value: location to write the value returned by this method. + * + * Responds to FirebaseFirestoreHostApi.namedQueryGet. + */ +void cloud_firestore_firebase_firestore_host_api_respond_named_query_get( + CloudFirestoreFirebaseFirestoreHostApiResponseHandle* response_handle, + CloudFirestoreInternalQuerySnapshot* return_value); + +/** + * cloud_firestore_firebase_firestore_host_api_respond_error_named_query_get: + * @response_handle: a #CloudFirestoreFirebaseFirestoreHostApiResponseHandle. + * @code: error code. + * @message: error message. + * @details: (allow-none): error details or %NULL. + * + * Responds with an error to FirebaseFirestoreHostApi.namedQueryGet. + */ +void cloud_firestore_firebase_firestore_host_api_respond_error_named_query_get( + CloudFirestoreFirebaseFirestoreHostApiResponseHandle* response_handle, + const gchar* code, const gchar* message, FlValue* details); + +/** + * cloud_firestore_firebase_firestore_host_api_respond_clear_persistence: + * @response_handle: a #CloudFirestoreFirebaseFirestoreHostApiResponseHandle. + * + * Responds to FirebaseFirestoreHostApi.clearPersistence. + */ +void cloud_firestore_firebase_firestore_host_api_respond_clear_persistence( + CloudFirestoreFirebaseFirestoreHostApiResponseHandle* response_handle); + +/** + * cloud_firestore_firebase_firestore_host_api_respond_error_clear_persistence: + * @response_handle: a #CloudFirestoreFirebaseFirestoreHostApiResponseHandle. + * @code: error code. + * @message: error message. + * @details: (allow-none): error details or %NULL. + * + * Responds with an error to FirebaseFirestoreHostApi.clearPersistence. + */ +void cloud_firestore_firebase_firestore_host_api_respond_error_clear_persistence( + CloudFirestoreFirebaseFirestoreHostApiResponseHandle* response_handle, + const gchar* code, const gchar* message, FlValue* details); + +/** + * cloud_firestore_firebase_firestore_host_api_respond_disable_network: + * @response_handle: a #CloudFirestoreFirebaseFirestoreHostApiResponseHandle. + * + * Responds to FirebaseFirestoreHostApi.disableNetwork. + */ +void cloud_firestore_firebase_firestore_host_api_respond_disable_network( + CloudFirestoreFirebaseFirestoreHostApiResponseHandle* response_handle); + +/** + * cloud_firestore_firebase_firestore_host_api_respond_error_disable_network: + * @response_handle: a #CloudFirestoreFirebaseFirestoreHostApiResponseHandle. + * @code: error code. + * @message: error message. + * @details: (allow-none): error details or %NULL. + * + * Responds with an error to FirebaseFirestoreHostApi.disableNetwork. + */ +void cloud_firestore_firebase_firestore_host_api_respond_error_disable_network( + CloudFirestoreFirebaseFirestoreHostApiResponseHandle* response_handle, + const gchar* code, const gchar* message, FlValue* details); + +/** + * cloud_firestore_firebase_firestore_host_api_respond_enable_network: + * @response_handle: a #CloudFirestoreFirebaseFirestoreHostApiResponseHandle. + * + * Responds to FirebaseFirestoreHostApi.enableNetwork. + */ +void cloud_firestore_firebase_firestore_host_api_respond_enable_network( + CloudFirestoreFirebaseFirestoreHostApiResponseHandle* response_handle); + +/** + * cloud_firestore_firebase_firestore_host_api_respond_error_enable_network: + * @response_handle: a #CloudFirestoreFirebaseFirestoreHostApiResponseHandle. + * @code: error code. + * @message: error message. + * @details: (allow-none): error details or %NULL. + * + * Responds with an error to FirebaseFirestoreHostApi.enableNetwork. + */ +void cloud_firestore_firebase_firestore_host_api_respond_error_enable_network( + CloudFirestoreFirebaseFirestoreHostApiResponseHandle* response_handle, + const gchar* code, const gchar* message, FlValue* details); + +/** + * cloud_firestore_firebase_firestore_host_api_respond_terminate: + * @response_handle: a #CloudFirestoreFirebaseFirestoreHostApiResponseHandle. + * + * Responds to FirebaseFirestoreHostApi.terminate. + */ +void cloud_firestore_firebase_firestore_host_api_respond_terminate( + CloudFirestoreFirebaseFirestoreHostApiResponseHandle* response_handle); + +/** + * cloud_firestore_firebase_firestore_host_api_respond_error_terminate: + * @response_handle: a #CloudFirestoreFirebaseFirestoreHostApiResponseHandle. + * @code: error code. + * @message: error message. + * @details: (allow-none): error details or %NULL. + * + * Responds with an error to FirebaseFirestoreHostApi.terminate. + */ +void cloud_firestore_firebase_firestore_host_api_respond_error_terminate( + CloudFirestoreFirebaseFirestoreHostApiResponseHandle* response_handle, + const gchar* code, const gchar* message, FlValue* details); + +/** + * cloud_firestore_firebase_firestore_host_api_respond_wait_for_pending_writes: + * @response_handle: a #CloudFirestoreFirebaseFirestoreHostApiResponseHandle. + * + * Responds to FirebaseFirestoreHostApi.waitForPendingWrites. + */ +void cloud_firestore_firebase_firestore_host_api_respond_wait_for_pending_writes( + CloudFirestoreFirebaseFirestoreHostApiResponseHandle* response_handle); + +/** + * cloud_firestore_firebase_firestore_host_api_respond_error_wait_for_pending_writes: + * @response_handle: a #CloudFirestoreFirebaseFirestoreHostApiResponseHandle. + * @code: error code. + * @message: error message. + * @details: (allow-none): error details or %NULL. + * + * Responds with an error to FirebaseFirestoreHostApi.waitForPendingWrites. + */ +void cloud_firestore_firebase_firestore_host_api_respond_error_wait_for_pending_writes( + CloudFirestoreFirebaseFirestoreHostApiResponseHandle* response_handle, + const gchar* code, const gchar* message, FlValue* details); + +/** + * cloud_firestore_firebase_firestore_host_api_respond_set_index_configuration: + * @response_handle: a #CloudFirestoreFirebaseFirestoreHostApiResponseHandle. + * + * Responds to FirebaseFirestoreHostApi.setIndexConfiguration. + */ +void cloud_firestore_firebase_firestore_host_api_respond_set_index_configuration( + CloudFirestoreFirebaseFirestoreHostApiResponseHandle* response_handle); + +/** + * cloud_firestore_firebase_firestore_host_api_respond_error_set_index_configuration: + * @response_handle: a #CloudFirestoreFirebaseFirestoreHostApiResponseHandle. + * @code: error code. + * @message: error message. + * @details: (allow-none): error details or %NULL. + * + * Responds with an error to FirebaseFirestoreHostApi.setIndexConfiguration. + */ +void cloud_firestore_firebase_firestore_host_api_respond_error_set_index_configuration( + CloudFirestoreFirebaseFirestoreHostApiResponseHandle* response_handle, + const gchar* code, const gchar* message, FlValue* details); + +/** + * cloud_firestore_firebase_firestore_host_api_respond_set_logging_enabled: + * @response_handle: a #CloudFirestoreFirebaseFirestoreHostApiResponseHandle. + * + * Responds to FirebaseFirestoreHostApi.setLoggingEnabled. + */ +void cloud_firestore_firebase_firestore_host_api_respond_set_logging_enabled( + CloudFirestoreFirebaseFirestoreHostApiResponseHandle* response_handle); + +/** + * cloud_firestore_firebase_firestore_host_api_respond_error_set_logging_enabled: + * @response_handle: a #CloudFirestoreFirebaseFirestoreHostApiResponseHandle. + * @code: error code. + * @message: error message. + * @details: (allow-none): error details or %NULL. + * + * Responds with an error to FirebaseFirestoreHostApi.setLoggingEnabled. + */ +void cloud_firestore_firebase_firestore_host_api_respond_error_set_logging_enabled( + CloudFirestoreFirebaseFirestoreHostApiResponseHandle* response_handle, + const gchar* code, const gchar* message, FlValue* details); + +/** + * cloud_firestore_firebase_firestore_host_api_respond_snapshots_in_sync_setup: + * @response_handle: a #CloudFirestoreFirebaseFirestoreHostApiResponseHandle. + * @return_value: location to write the value returned by this method. + * + * Responds to FirebaseFirestoreHostApi.snapshotsInSyncSetup. + */ +void cloud_firestore_firebase_firestore_host_api_respond_snapshots_in_sync_setup( + CloudFirestoreFirebaseFirestoreHostApiResponseHandle* response_handle, + const gchar* return_value); + +/** + * cloud_firestore_firebase_firestore_host_api_respond_error_snapshots_in_sync_setup: + * @response_handle: a #CloudFirestoreFirebaseFirestoreHostApiResponseHandle. + * @code: error code. + * @message: error message. + * @details: (allow-none): error details or %NULL. + * + * Responds with an error to FirebaseFirestoreHostApi.snapshotsInSyncSetup. + */ +void cloud_firestore_firebase_firestore_host_api_respond_error_snapshots_in_sync_setup( + CloudFirestoreFirebaseFirestoreHostApiResponseHandle* response_handle, + const gchar* code, const gchar* message, FlValue* details); + +/** + * cloud_firestore_firebase_firestore_host_api_respond_transaction_create: + * @response_handle: a #CloudFirestoreFirebaseFirestoreHostApiResponseHandle. + * @return_value: location to write the value returned by this method. + * + * Responds to FirebaseFirestoreHostApi.transactionCreate. + */ +void cloud_firestore_firebase_firestore_host_api_respond_transaction_create( + CloudFirestoreFirebaseFirestoreHostApiResponseHandle* response_handle, + const gchar* return_value); + +/** + * cloud_firestore_firebase_firestore_host_api_respond_error_transaction_create: + * @response_handle: a #CloudFirestoreFirebaseFirestoreHostApiResponseHandle. + * @code: error code. + * @message: error message. + * @details: (allow-none): error details or %NULL. + * + * Responds with an error to FirebaseFirestoreHostApi.transactionCreate. + */ +void cloud_firestore_firebase_firestore_host_api_respond_error_transaction_create( + CloudFirestoreFirebaseFirestoreHostApiResponseHandle* response_handle, + const gchar* code, const gchar* message, FlValue* details); + +/** + * cloud_firestore_firebase_firestore_host_api_respond_transaction_store_result: + * @response_handle: a #CloudFirestoreFirebaseFirestoreHostApiResponseHandle. + * + * Responds to FirebaseFirestoreHostApi.transactionStoreResult. + */ +void cloud_firestore_firebase_firestore_host_api_respond_transaction_store_result( + CloudFirestoreFirebaseFirestoreHostApiResponseHandle* response_handle); + +/** + * cloud_firestore_firebase_firestore_host_api_respond_error_transaction_store_result: + * @response_handle: a #CloudFirestoreFirebaseFirestoreHostApiResponseHandle. + * @code: error code. + * @message: error message. + * @details: (allow-none): error details or %NULL. + * + * Responds with an error to FirebaseFirestoreHostApi.transactionStoreResult. + */ +void cloud_firestore_firebase_firestore_host_api_respond_error_transaction_store_result( + CloudFirestoreFirebaseFirestoreHostApiResponseHandle* response_handle, + const gchar* code, const gchar* message, FlValue* details); + +/** + * cloud_firestore_firebase_firestore_host_api_respond_transaction_get: + * @response_handle: a #CloudFirestoreFirebaseFirestoreHostApiResponseHandle. + * @return_value: location to write the value returned by this method. + * + * Responds to FirebaseFirestoreHostApi.transactionGet. + */ +void cloud_firestore_firebase_firestore_host_api_respond_transaction_get( + CloudFirestoreFirebaseFirestoreHostApiResponseHandle* response_handle, + CloudFirestoreInternalDocumentSnapshot* return_value); + +/** + * cloud_firestore_firebase_firestore_host_api_respond_error_transaction_get: + * @response_handle: a #CloudFirestoreFirebaseFirestoreHostApiResponseHandle. + * @code: error code. + * @message: error message. + * @details: (allow-none): error details or %NULL. + * + * Responds with an error to FirebaseFirestoreHostApi.transactionGet. + */ +void cloud_firestore_firebase_firestore_host_api_respond_error_transaction_get( + CloudFirestoreFirebaseFirestoreHostApiResponseHandle* response_handle, + const gchar* code, const gchar* message, FlValue* details); + +/** + * cloud_firestore_firebase_firestore_host_api_respond_document_reference_set: + * @response_handle: a #CloudFirestoreFirebaseFirestoreHostApiResponseHandle. + * + * Responds to FirebaseFirestoreHostApi.documentReferenceSet. + */ +void cloud_firestore_firebase_firestore_host_api_respond_document_reference_set( + CloudFirestoreFirebaseFirestoreHostApiResponseHandle* response_handle); + +/** + * cloud_firestore_firebase_firestore_host_api_respond_error_document_reference_set: + * @response_handle: a #CloudFirestoreFirebaseFirestoreHostApiResponseHandle. + * @code: error code. + * @message: error message. + * @details: (allow-none): error details or %NULL. + * + * Responds with an error to FirebaseFirestoreHostApi.documentReferenceSet. + */ +void cloud_firestore_firebase_firestore_host_api_respond_error_document_reference_set( + CloudFirestoreFirebaseFirestoreHostApiResponseHandle* response_handle, + const gchar* code, const gchar* message, FlValue* details); + +/** + * cloud_firestore_firebase_firestore_host_api_respond_document_reference_update: + * @response_handle: a #CloudFirestoreFirebaseFirestoreHostApiResponseHandle. + * + * Responds to FirebaseFirestoreHostApi.documentReferenceUpdate. + */ +void cloud_firestore_firebase_firestore_host_api_respond_document_reference_update( + CloudFirestoreFirebaseFirestoreHostApiResponseHandle* response_handle); + +/** + * cloud_firestore_firebase_firestore_host_api_respond_error_document_reference_update: + * @response_handle: a #CloudFirestoreFirebaseFirestoreHostApiResponseHandle. + * @code: error code. + * @message: error message. + * @details: (allow-none): error details or %NULL. + * + * Responds with an error to FirebaseFirestoreHostApi.documentReferenceUpdate. + */ +void cloud_firestore_firebase_firestore_host_api_respond_error_document_reference_update( + CloudFirestoreFirebaseFirestoreHostApiResponseHandle* response_handle, + const gchar* code, const gchar* message, FlValue* details); + +/** + * cloud_firestore_firebase_firestore_host_api_respond_document_reference_get: + * @response_handle: a #CloudFirestoreFirebaseFirestoreHostApiResponseHandle. + * @return_value: location to write the value returned by this method. + * + * Responds to FirebaseFirestoreHostApi.documentReferenceGet. + */ +void cloud_firestore_firebase_firestore_host_api_respond_document_reference_get( + CloudFirestoreFirebaseFirestoreHostApiResponseHandle* response_handle, + CloudFirestoreInternalDocumentSnapshot* return_value); + +/** + * cloud_firestore_firebase_firestore_host_api_respond_error_document_reference_get: + * @response_handle: a #CloudFirestoreFirebaseFirestoreHostApiResponseHandle. + * @code: error code. + * @message: error message. + * @details: (allow-none): error details or %NULL. + * + * Responds with an error to FirebaseFirestoreHostApi.documentReferenceGet. + */ +void cloud_firestore_firebase_firestore_host_api_respond_error_document_reference_get( + CloudFirestoreFirebaseFirestoreHostApiResponseHandle* response_handle, + const gchar* code, const gchar* message, FlValue* details); + +/** + * cloud_firestore_firebase_firestore_host_api_respond_document_reference_delete: + * @response_handle: a #CloudFirestoreFirebaseFirestoreHostApiResponseHandle. + * + * Responds to FirebaseFirestoreHostApi.documentReferenceDelete. + */ +void cloud_firestore_firebase_firestore_host_api_respond_document_reference_delete( + CloudFirestoreFirebaseFirestoreHostApiResponseHandle* response_handle); + +/** + * cloud_firestore_firebase_firestore_host_api_respond_error_document_reference_delete: + * @response_handle: a #CloudFirestoreFirebaseFirestoreHostApiResponseHandle. + * @code: error code. + * @message: error message. + * @details: (allow-none): error details or %NULL. + * + * Responds with an error to FirebaseFirestoreHostApi.documentReferenceDelete. + */ +void cloud_firestore_firebase_firestore_host_api_respond_error_document_reference_delete( + CloudFirestoreFirebaseFirestoreHostApiResponseHandle* response_handle, + const gchar* code, const gchar* message, FlValue* details); + +/** + * cloud_firestore_firebase_firestore_host_api_respond_query_get: + * @response_handle: a #CloudFirestoreFirebaseFirestoreHostApiResponseHandle. + * @return_value: location to write the value returned by this method. + * + * Responds to FirebaseFirestoreHostApi.queryGet. + */ +void cloud_firestore_firebase_firestore_host_api_respond_query_get( + CloudFirestoreFirebaseFirestoreHostApiResponseHandle* response_handle, + CloudFirestoreInternalQuerySnapshot* return_value); + +/** + * cloud_firestore_firebase_firestore_host_api_respond_error_query_get: + * @response_handle: a #CloudFirestoreFirebaseFirestoreHostApiResponseHandle. + * @code: error code. + * @message: error message. + * @details: (allow-none): error details or %NULL. + * + * Responds with an error to FirebaseFirestoreHostApi.queryGet. + */ +void cloud_firestore_firebase_firestore_host_api_respond_error_query_get( + CloudFirestoreFirebaseFirestoreHostApiResponseHandle* response_handle, + const gchar* code, const gchar* message, FlValue* details); + +/** + * cloud_firestore_firebase_firestore_host_api_respond_aggregate_query: + * @response_handle: a #CloudFirestoreFirebaseFirestoreHostApiResponseHandle. + * @return_value: location to write the value returned by this method. + * + * Responds to FirebaseFirestoreHostApi.aggregateQuery. + */ +void cloud_firestore_firebase_firestore_host_api_respond_aggregate_query( + CloudFirestoreFirebaseFirestoreHostApiResponseHandle* response_handle, + FlValue* return_value); + +/** + * cloud_firestore_firebase_firestore_host_api_respond_error_aggregate_query: + * @response_handle: a #CloudFirestoreFirebaseFirestoreHostApiResponseHandle. + * @code: error code. + * @message: error message. + * @details: (allow-none): error details or %NULL. + * + * Responds with an error to FirebaseFirestoreHostApi.aggregateQuery. + */ +void cloud_firestore_firebase_firestore_host_api_respond_error_aggregate_query( + CloudFirestoreFirebaseFirestoreHostApiResponseHandle* response_handle, + const gchar* code, const gchar* message, FlValue* details); + +/** + * cloud_firestore_firebase_firestore_host_api_respond_write_batch_commit: + * @response_handle: a #CloudFirestoreFirebaseFirestoreHostApiResponseHandle. + * + * Responds to FirebaseFirestoreHostApi.writeBatchCommit. + */ +void cloud_firestore_firebase_firestore_host_api_respond_write_batch_commit( + CloudFirestoreFirebaseFirestoreHostApiResponseHandle* response_handle); + +/** + * cloud_firestore_firebase_firestore_host_api_respond_error_write_batch_commit: + * @response_handle: a #CloudFirestoreFirebaseFirestoreHostApiResponseHandle. + * @code: error code. + * @message: error message. + * @details: (allow-none): error details or %NULL. + * + * Responds with an error to FirebaseFirestoreHostApi.writeBatchCommit. + */ +void cloud_firestore_firebase_firestore_host_api_respond_error_write_batch_commit( + CloudFirestoreFirebaseFirestoreHostApiResponseHandle* response_handle, + const gchar* code, const gchar* message, FlValue* details); + +/** + * cloud_firestore_firebase_firestore_host_api_respond_query_snapshot: + * @response_handle: a #CloudFirestoreFirebaseFirestoreHostApiResponseHandle. + * @return_value: location to write the value returned by this method. + * + * Responds to FirebaseFirestoreHostApi.querySnapshot. + */ +void cloud_firestore_firebase_firestore_host_api_respond_query_snapshot( + CloudFirestoreFirebaseFirestoreHostApiResponseHandle* response_handle, + const gchar* return_value); + +/** + * cloud_firestore_firebase_firestore_host_api_respond_error_query_snapshot: + * @response_handle: a #CloudFirestoreFirebaseFirestoreHostApiResponseHandle. + * @code: error code. + * @message: error message. + * @details: (allow-none): error details or %NULL. + * + * Responds with an error to FirebaseFirestoreHostApi.querySnapshot. + */ +void cloud_firestore_firebase_firestore_host_api_respond_error_query_snapshot( + CloudFirestoreFirebaseFirestoreHostApiResponseHandle* response_handle, + const gchar* code, const gchar* message, FlValue* details); + +/** + * cloud_firestore_firebase_firestore_host_api_respond_document_reference_snapshot: + * @response_handle: a #CloudFirestoreFirebaseFirestoreHostApiResponseHandle. + * @return_value: location to write the value returned by this method. + * + * Responds to FirebaseFirestoreHostApi.documentReferenceSnapshot. + */ +void cloud_firestore_firebase_firestore_host_api_respond_document_reference_snapshot( + CloudFirestoreFirebaseFirestoreHostApiResponseHandle* response_handle, + const gchar* return_value); + +/** + * cloud_firestore_firebase_firestore_host_api_respond_error_document_reference_snapshot: + * @response_handle: a #CloudFirestoreFirebaseFirestoreHostApiResponseHandle. + * @code: error code. + * @message: error message. + * @details: (allow-none): error details or %NULL. + * + * Responds with an error to FirebaseFirestoreHostApi.documentReferenceSnapshot. + */ +void cloud_firestore_firebase_firestore_host_api_respond_error_document_reference_snapshot( + CloudFirestoreFirebaseFirestoreHostApiResponseHandle* response_handle, + const gchar* code, const gchar* message, FlValue* details); + +/** + * cloud_firestore_firebase_firestore_host_api_respond_persistence_cache_index_manager_request: + * @response_handle: a #CloudFirestoreFirebaseFirestoreHostApiResponseHandle. + * + * Responds to FirebaseFirestoreHostApi.persistenceCacheIndexManagerRequest. + */ +void cloud_firestore_firebase_firestore_host_api_respond_persistence_cache_index_manager_request( + CloudFirestoreFirebaseFirestoreHostApiResponseHandle* response_handle); + +/** + * cloud_firestore_firebase_firestore_host_api_respond_error_persistence_cache_index_manager_request: + * @response_handle: a #CloudFirestoreFirebaseFirestoreHostApiResponseHandle. + * @code: error code. + * @message: error message. + * @details: (allow-none): error details or %NULL. + * + * Responds with an error to + * FirebaseFirestoreHostApi.persistenceCacheIndexManagerRequest. + */ +void cloud_firestore_firebase_firestore_host_api_respond_error_persistence_cache_index_manager_request( + CloudFirestoreFirebaseFirestoreHostApiResponseHandle* response_handle, + const gchar* code, const gchar* message, FlValue* details); + +/** + * cloud_firestore_firebase_firestore_host_api_respond_execute_pipeline: + * @response_handle: a #CloudFirestoreFirebaseFirestoreHostApiResponseHandle. + * @return_value: location to write the value returned by this method. + * + * Responds to FirebaseFirestoreHostApi.executePipeline. + */ +void cloud_firestore_firebase_firestore_host_api_respond_execute_pipeline( + CloudFirestoreFirebaseFirestoreHostApiResponseHandle* response_handle, + CloudFirestoreInternalPipelineSnapshot* return_value); + +/** + * cloud_firestore_firebase_firestore_host_api_respond_error_execute_pipeline: + * @response_handle: a #CloudFirestoreFirebaseFirestoreHostApiResponseHandle. + * @code: error code. + * @message: error message. + * @details: (allow-none): error details or %NULL. + * + * Responds with an error to FirebaseFirestoreHostApi.executePipeline. + */ +void cloud_firestore_firebase_firestore_host_api_respond_error_execute_pipeline( + CloudFirestoreFirebaseFirestoreHostApiResponseHandle* response_handle, + const gchar* code, const gchar* message, FlValue* details); + +G_END_DECLS + +#endif // PIGEON_MESSAGES_G_H_ diff --git a/packages/cloud_firestore/cloud_firestore/linux/plugin_version.h.in b/packages/cloud_firestore/cloud_firestore/linux/plugin_version.h.in new file mode 100644 index 000000000000..88b1a624c872 --- /dev/null +++ b/packages/cloud_firestore/cloud_firestore/linux/plugin_version.h.in @@ -0,0 +1,13 @@ +// Copyright 2026, the Chromium project authors. Please see the AUTHORS file +// for details. All rights reserved. Use of this source code is governed by a +// BSD-style license that can be found in the LICENSE file. + +#ifndef PLUGIN_VERSION_CONFIG_H +#define PLUGIN_VERSION_CONFIG_H + +namespace cloud_firestore_linux { + +std::string getPluginVersion() { return "@PLUGIN_VERSION@"; } +} // namespace cloud_firestore_linux + +#endif // PLUGIN_VERSION_CONFIG_H diff --git a/packages/cloud_firestore/cloud_firestore/pubspec.yaml b/packages/cloud_firestore/cloud_firestore/pubspec.yaml index 5abad9967c6c..8ad64de193fa 100755 --- a/packages/cloud_firestore/cloud_firestore/pubspec.yaml +++ b/packages/cloud_firestore/cloud_firestore/pubspec.yaml @@ -43,6 +43,8 @@ flutter: pluginClass: FlutterFirebaseFirestorePlugin ios: pluginClass: FLTFirebaseFirestorePlugin + linux: + pluginClass: CloudFirestorePlugin macos: pluginClass: FLTFirebaseFirestorePlugin web: diff --git a/packages/cloud_firestore/cloud_firestore_platform_interface/pigeons/messages.dart b/packages/cloud_firestore/cloud_firestore_platform_interface/pigeons/messages.dart index 27a61ef98f0d..0f2a6dd2c9c9 100644 --- a/packages/cloud_firestore/cloud_firestore_platform_interface/pigeons/messages.dart +++ b/packages/cloud_firestore/cloud_firestore_platform_interface/pigeons/messages.dart @@ -23,6 +23,12 @@ import 'package:pigeon/pigeon.dart'; cppHeaderOut: '../cloud_firestore/windows/messages.g.h', cppSourceOut: '../cloud_firestore/windows/messages.g.cpp', cppOptions: CppOptions(namespace: 'cloud_firestore_windows'), + gobjectHeaderOut: '../cloud_firestore/linux/messages.g.h', + gobjectSourceOut: '../cloud_firestore/linux/messages.g.cc', + gobjectOptions: GObjectOptions( + headerIncludePath: 'messages.g.h', + module: 'CloudFirestore', + ), copyrightHeader: 'pigeons/copyright.txt', ), ) diff --git a/packages/cloud_functions/cloud_functions/linux/CMakeLists.txt b/packages/cloud_functions/cloud_functions/linux/CMakeLists.txt new file mode 100644 index 000000000000..eebb3b4d1e65 --- /dev/null +++ b/packages/cloud_functions/cloud_functions/linux/CMakeLists.txt @@ -0,0 +1,95 @@ +# The Flutter tooling requires that developers have CMake 3.10 or later +# installed. You should not increase this version, as doing so will cause +# the plugin to fail to compile for some customers of the plugin. +cmake_minimum_required(VERSION 3.10) + +# Project-level configuration. +set(PROJECT_NAME "cloud_functions") +project(${PROJECT_NAME} LANGUAGES CXX) + +# This value is used when generating builds using this plugin, so it must +# not be changed +set(PLUGIN_NAME "cloud_functions_plugin") + +# Any new source files that you add to the plugin should be added here. +list(APPEND PLUGIN_SOURCES + "include/cloud_functions/cloud_functions_plugin.h" + "cloud_functions_plugin.cc" + "messages.g.cc" + "messages.g.h" +) + +# Read version from pubspec.yaml +file(STRINGS "../pubspec.yaml" pubspec_content) +foreach(line ${pubspec_content}) + string(FIND ${line} "version: " has_version) + + if("${has_version}" STREQUAL "0") + string(FIND ${line} ": " version_start_pos) + math(EXPR version_start_pos "${version_start_pos} + 2") + string(LENGTH ${line} version_end_pos) + math(EXPR len "${version_end_pos} - ${version_start_pos}") + string(SUBSTRING ${line} ${version_start_pos} ${len} PLUGIN_VERSION) + break() + endif() +endforeach(line) + +configure_file(plugin_version.h.in ${CMAKE_BINARY_DIR}/generated/cloud_functions/plugin_version.h) +include_directories(${CMAKE_BINARY_DIR}/generated/) + +# Define the plugin library target. Its name must not be changed (see comment +# on PLUGIN_NAME above). +# +# This is deliberately a STATIC library (unlike the SHARED library in the +# Flutter Linux plugin template) to mirror the Windows implementation; see the +# comment in firebase_core/linux/CMakeLists.txt for the full rationale (a +# single copy of the prebuilt Firebase C++ SDK static libraries must be linked +# into the runner so that all FlutterFire plugins share one firebase::App +# registry). POSITION_INDEPENDENT_CODE is enabled below because the runner +# executable is built as PIE. +add_library(${PLUGIN_NAME} STATIC + ${PLUGIN_SOURCES} + ${CMAKE_BINARY_DIR}/generated/cloud_functions/plugin_version.h +) + +# Apply a standard set of build settings that are configured in the +# application-level CMakeLists.txt. This can be removed for plugins that want +# full control over build settings. +apply_standard_settings(${PLUGIN_NAME}) + +# Symbols are hidden by default to reduce the chance of accidental conflicts +# between plugins. This should not be removed; any symbols that should be +# exported should be explicitly exported with the FLUTTER_PLUGIN_EXPORT macro. +set_target_properties(${PLUGIN_NAME} PROPERTIES + CXX_VISIBILITY_PRESET hidden + POSITION_INDEPENDENT_CODE ON) +target_compile_definitions(${PLUGIN_NAME} PUBLIC FLUTTER_PLUGIN_IMPL) + +# Enable firebase-cpp-sdk's platform logging api. +target_compile_definitions(${PLUGIN_NAME} PRIVATE -DINTERNAL_EXPERIMENTAL=1) + +# Source include directories and library dependencies. The Firebase C++ SDK is +# added (via add_subdirectory) by the firebase_core plugin, exactly like the +# Windows implementation, so it is not re-added here; linking against +# firebase_core_plugin transitively provides the SDK include directories and +# the firebase_app library. +# NOTE: the Firebase SDK product archives (including firebase_functions) are +# linked exclusively by the firebase_core_plugin target, which wraps all of +# them in a single -Wl,--start-group/--end-group (the archives have circular +# symbol dependencies that an ordered per-plugin link line cannot satisfy). +set(firebase_libs firebase_core_plugin) +set(ADDITIONAL_LIBS pthread) +target_link_libraries(${PLUGIN_NAME} PRIVATE "${firebase_libs}" "${ADDITIONAL_LIBS}") + +target_include_directories(${PLUGIN_NAME} INTERFACE + "${CMAKE_CURRENT_SOURCE_DIR}/include") +target_link_libraries(${PLUGIN_NAME} PRIVATE flutter) +target_link_libraries(${PLUGIN_NAME} PRIVATE PkgConfig::GTK) + +# List of absolute paths to libraries that should be bundled with the plugin. +# This list could contain prebuilt libraries, or libraries created by an +# external build triggered from this build file. +set(cloud_functions_bundled_libraries + "" + PARENT_SCOPE +) diff --git a/packages/cloud_functions/cloud_functions/linux/cloud_functions_plugin.cc b/packages/cloud_functions/cloud_functions/linux/cloud_functions_plugin.cc new file mode 100644 index 000000000000..0b760de029d6 --- /dev/null +++ b/packages/cloud_functions/cloud_functions/linux/cloud_functions_plugin.cc @@ -0,0 +1,358 @@ +// Copyright 2026, the Chromium project authors. Please see the AUTHORS file +// for details. All rights reserved. Use of this source code is governed by a +// BSD-style license that can be found in the LICENSE file. + +#include "include/cloud_functions/cloud_functions_plugin.h" + +#include + +#include +#include +#include +#include + +#include "cloud_functions/plugin_version.h" +#include "firebase/app.h" +#include "firebase/functions.h" +#include "firebase/functions/callable_reference.h" +#include "firebase/functions/callable_result.h" +#include "firebase/functions/common.h" +#include "firebase/future.h" +#include "firebase/variant.h" +#include "messages.g.h" + +using firebase::App; +using firebase::Future; +using firebase::Variant; +using firebase::functions::Error; +using firebase::functions::Functions; +using firebase::functions::HttpsCallableReference; +using firebase::functions::HttpsCallableResult; + +static const char kLibraryName[] = "flutter-fire-fn"; + +#define CLOUD_FUNCTIONS_PLUGIN(obj) \ + (G_TYPE_CHECK_INSTANCE_CAST((obj), cloud_functions_plugin_get_type(), \ + CloudFunctionsPlugin)) + +struct _CloudFunctionsPlugin { + GObject parent_instance; +}; + +G_DEFINE_TYPE(CloudFunctionsPlugin, cloud_functions_plugin, g_object_get_type()) + +// Cache of Functions instances keyed by "|". The C++ SDK +// manages their lifetime via App's CleanupNotifier, so these raw pointers are +// not owned here (mirroring firebase_database / firebase_storage). +static std::map functions_instances_; + +// --- Helper: Run a closure on the GLib main thread --- +// Firebase C++ SDK futures fire on SDK-internal threads, but the GObject +// embedder API (FlBinaryMessenger / pigeon responses) is not thread-safe, so +// every response is marshalled back through the main loop. +static void PostToMainThread(std::function fn) { + auto* boxed = new std::function(std::move(fn)); + g_idle_add( + [](gpointer data) -> gboolean { + auto* callback = static_cast*>(data); + (*callback)(); + delete callback; + return G_SOURCE_REMOVE; + }, + boxed); +} + +// --- Helper: Convert firebase::Variant to FlValue (transfer full) --- +static FlValue* VariantToFlValue(const Variant& variant) { + switch (variant.type()) { + case Variant::kTypeNull: + return fl_value_new_null(); + case Variant::kTypeInt64: + return fl_value_new_int(variant.int64_value()); + case Variant::kTypeDouble: + return fl_value_new_float(variant.double_value()); + case Variant::kTypeBool: + return fl_value_new_bool(variant.bool_value()); + case Variant::kTypeStaticString: + return fl_value_new_string(variant.string_value()); + case Variant::kTypeMutableString: + return fl_value_new_string(variant.mutable_string().c_str()); + case Variant::kTypeVector: { + FlValue* list = fl_value_new_list(); + for (const auto& item : variant.vector()) { + fl_value_append_take(list, VariantToFlValue(item)); + } + return list; + } + case Variant::kTypeMap: { + FlValue* map = fl_value_new_map(); + for (const auto& kv : variant.map()) { + fl_value_set_take(map, VariantToFlValue(kv.first), + VariantToFlValue(kv.second)); + } + return map; + } + case Variant::kTypeStaticBlob: + return fl_value_new_uint8_list(variant.blob_data(), variant.blob_size()); + case Variant::kTypeMutableBlob: + return fl_value_new_uint8_list(variant.blob_data(), variant.blob_size()); + default: + return fl_value_new_null(); + } +} + +// --- Helper: Convert FlValue to firebase::Variant --- +static Variant FlValueToVariant(FlValue* value) { + if (value == nullptr) { + return Variant::Null(); + } + switch (fl_value_get_type(value)) { + case FL_VALUE_TYPE_NULL: + return Variant::Null(); + case FL_VALUE_TYPE_BOOL: + return Variant(static_cast(fl_value_get_bool(value))); + case FL_VALUE_TYPE_INT: + return Variant(static_cast(fl_value_get_int(value))); + case FL_VALUE_TYPE_FLOAT: + return Variant(fl_value_get_float(value)); + case FL_VALUE_TYPE_STRING: + return Variant(std::string(fl_value_get_string(value))); + case FL_VALUE_TYPE_UINT8_LIST: + return Variant::FromMutableBlob(fl_value_get_uint8_list(value), + fl_value_get_length(value)); + case FL_VALUE_TYPE_LIST: { + std::vector vec; + size_t length = fl_value_get_length(value); + for (size_t i = 0; i < length; i++) { + vec.push_back(FlValueToVariant(fl_value_get_list_value(value, i))); + } + return Variant(vec); + } + case FL_VALUE_TYPE_MAP: { + std::map variant_map; + size_t length = fl_value_get_length(value); + for (size_t i = 0; i < length; i++) { + variant_map[FlValueToVariant(fl_value_get_map_key(value, i))] = + FlValueToVariant(fl_value_get_map_value(value, i)); + } + return Variant(variant_map); + } + default: + return Variant::Null(); + } +} + +// --- Helper: map a Cloud Functions error enum to its canonical string code --- +static std::string GetFunctionsErrorCode(Error error) { + switch (error) { + case Error::kErrorNone: + return "none"; + case Error::kErrorCancelled: + return "cancelled"; + case Error::kErrorInvalidArgument: + return "invalid-argument"; + case Error::kErrorDeadlineExceeded: + return "deadline-exceeded"; + case Error::kErrorNotFound: + return "not-found"; + case Error::kErrorAlreadyExists: + return "already-exists"; + case Error::kErrorPermissionDenied: + return "permission-denied"; + case Error::kErrorResourceExhausted: + return "resource-exhausted"; + case Error::kErrorFailedPrecondition: + return "failed-precondition"; + case Error::kErrorAborted: + return "aborted"; + case Error::kErrorOutOfRange: + return "out-of-range"; + case Error::kErrorUnimplemented: + return "unimplemented"; + case Error::kErrorInternal: + return "internal"; + case Error::kErrorUnavailable: + return "unavailable"; + case Error::kErrorDataLoss: + return "data-loss"; + case Error::kErrorUnauthenticated: + return "unauthenticated"; + case Error::kErrorUnknown: + default: + return "unknown"; + } +} + +// --- Helper: read a string entry from an FlValue map (or nullptr) --- +static const gchar* GetStringArg(FlValue* map, const char* key) { + FlValue* value = fl_value_lookup_string(map, key); + if (value == nullptr || fl_value_get_type(value) != FL_VALUE_TYPE_STRING) { + return nullptr; + } + return fl_value_get_string(value); +} + +// --- Helper: resolve (and cache) a Functions instance for app + region --- +static Functions* GetFunctionsInstance(const gchar* app_name, + const gchar* region) { + App* app = App::GetInstance(app_name); + if (app == nullptr) { + return nullptr; + } + std::string region_str = region != nullptr ? region : ""; + std::string cache_key = std::string(app_name) + "|" + region_str; + + auto it = functions_instances_.find(cache_key); + if (it != functions_instances_.end()) { + return it->second; + } + + Functions* functions = region_str.empty() + ? Functions::GetInstance(app) + : Functions::GetInstance(app, region_str.c_str()); + if (functions == nullptr) { + return nullptr; + } + functions_instances_[cache_key] = functions; + return functions; +} + +// --- CloudFunctionsHostApi.call --- +static void HandleCall( + FlValue* arguments, + CloudFunctionsCloudFunctionsHostApiResponseHandle* response_handle, + gpointer user_data) { + if (arguments == nullptr || + fl_value_get_type(arguments) != FL_VALUE_TYPE_MAP) { + cloud_functions_cloud_functions_host_api_respond_error_call( + response_handle, "invalid-argument", "Missing call arguments", nullptr); + return; + } + + const gchar* app_name = GetStringArg(arguments, "appName"); + const gchar* region = GetStringArg(arguments, "region"); + const gchar* function_name = GetStringArg(arguments, "functionName"); + const gchar* function_uri = GetStringArg(arguments, "functionUri"); + const gchar* origin = GetStringArg(arguments, "origin"); + + if (app_name == nullptr) { + cloud_functions_cloud_functions_host_api_respond_error_call( + response_handle, "invalid-argument", "Missing appName", nullptr); + return; + } + + Functions* functions = GetFunctionsInstance(app_name, region); + if (functions == nullptr) { + cloud_functions_cloud_functions_host_api_respond_error_call( + response_handle, "internal", "Functions instance not found", nullptr); + return; + } + + if (origin != nullptr && origin[0] != '\0') { + functions->UseFunctionsEmulator(origin); + } + + // The HttpsCallableReference is heap-allocated and only deleted once the + // response has been delivered (on the main thread, after completion). The + // reference's internal owns the curl transport that runs the request on an + // SDK background thread; if the reference were a local and went out of scope + // when this handler returns, that transport would be destroyed mid-request + // and crash (use-after-free in the curl thread). A copy captured by value + // does not help because the SDK's copies own independent transports. + auto* ref = new HttpsCallableReference(); + if (function_name != nullptr && function_name[0] != '\0') { + *ref = functions->GetHttpsCallable(function_name); + } else if (function_uri != nullptr && function_uri[0] != '\0') { + *ref = functions->GetHttpsCallableFromURL(function_uri); + } else { + delete ref; + cloud_functions_cloud_functions_host_api_respond_error_call( + response_handle, "invalid-argument", + "Either functionName or functionUri must be provided", nullptr); + return; + } + + Variant parameters = + FlValueToVariant(fl_value_lookup_string(arguments, "parameters")); + + g_object_ref(response_handle); + ref->Call(parameters) + .OnCompletion([response_handle, + ref](const Future& future) { + if (future.error() == Error::kErrorNone) { + const HttpsCallableResult* result = future.result(); + FlValue* data = result != nullptr ? VariantToFlValue(result->data()) + : fl_value_new_null(); + PostToMainThread([response_handle, data, ref]() { + cloud_functions_cloud_functions_host_api_respond_call( + response_handle, data); + fl_value_unref(data); + g_object_unref(response_handle); + delete ref; + }); + } else { + std::string code = + GetFunctionsErrorCode(static_cast(future.error())); + std::string message = + future.error_message() ? future.error_message() : "Unknown error"; + PostToMainThread([response_handle, code, message, ref]() { + // Dart's platformExceptionToFirebaseFunctionsException reads the + // canonical code/message out of the error details map. + FlValue* details = fl_value_new_map(); + fl_value_set_string_take(details, "code", + fl_value_new_string(code.c_str())); + fl_value_set_string_take(details, "message", + fl_value_new_string(message.c_str())); + cloud_functions_cloud_functions_host_api_respond_error_call( + response_handle, code.c_str(), message.c_str(), details); + fl_value_unref(details); + g_object_unref(response_handle); + delete ref; + }); + } + }); +} + +// --- CloudFunctionsHostApi.registerEventChannel --- +// Streaming callable functions (httpsCallable().stream()) are not yet +// supported on Linux. Fail explicitly rather than silently hanging. +static void HandleRegisterEventChannel( + FlValue* arguments, + CloudFunctionsCloudFunctionsHostApiResponseHandle* response_handle, + gpointer user_data) { + cloud_functions_cloud_functions_host_api_respond_error_register_event_channel( + response_handle, "unimplemented", + "Streaming callable functions are not supported on Linux.", nullptr); +} + +static const CloudFunctionsCloudFunctionsHostApiVTable kHostApiVTable = { + HandleCall, // call + HandleRegisterEventChannel, // register_event_channel +}; + +static void cloud_functions_plugin_dispose(GObject* object) { + G_OBJECT_CLASS(cloud_functions_plugin_parent_class)->dispose(object); +} + +static void cloud_functions_plugin_class_init( + CloudFunctionsPluginClass* klass) { + G_OBJECT_CLASS(klass)->dispose = cloud_functions_plugin_dispose; +} + +static void cloud_functions_plugin_init(CloudFunctionsPlugin* self) {} + +void cloud_functions_plugin_register_with_registrar( + FlPluginRegistrar* registrar) { + CloudFunctionsPlugin* plugin = CLOUD_FUNCTIONS_PLUGIN( + g_object_new(cloud_functions_plugin_get_type(), nullptr)); + + FlBinaryMessenger* messenger = fl_plugin_registrar_get_messenger(registrar); + cloud_functions_cloud_functions_host_api_set_method_handlers( + messenger, /* suffix= */ nullptr, &kHostApiVTable, g_object_ref(plugin), + g_object_unref); + + g_object_unref(plugin); + + App::RegisterLibrary( + kLibraryName, cloud_functions_linux::getPluginVersion().c_str(), nullptr); +} diff --git a/packages/cloud_functions/cloud_functions/linux/include/cloud_functions/cloud_functions_plugin.h b/packages/cloud_functions/cloud_functions/linux/include/cloud_functions/cloud_functions_plugin.h new file mode 100644 index 000000000000..bdc627754859 --- /dev/null +++ b/packages/cloud_functions/cloud_functions/linux/include/cloud_functions/cloud_functions_plugin.h @@ -0,0 +1,32 @@ +/* + * Copyright 2026, the Chromium project authors. Please see the AUTHORS file + * for details. All rights reserved. Use of this source code is governed by a + * BSD-style license that can be found in the LICENSE file. + */ + +#ifndef FLUTTER_PLUGIN_CLOUD_FUNCTIONS_PLUGIN_H_ +#define FLUTTER_PLUGIN_CLOUD_FUNCTIONS_PLUGIN_H_ + +#include + +G_BEGIN_DECLS + +#ifdef FLUTTER_PLUGIN_IMPL +#define FLUTTER_PLUGIN_EXPORT __attribute__((visibility("default"))) +#else +#define FLUTTER_PLUGIN_EXPORT +#endif + +typedef struct _CloudFunctionsPlugin CloudFunctionsPlugin; +typedef struct { + GObjectClass parent_class; +} CloudFunctionsPluginClass; + +FLUTTER_PLUGIN_EXPORT GType cloud_functions_plugin_get_type(); + +FLUTTER_PLUGIN_EXPORT void cloud_functions_plugin_register_with_registrar( + FlPluginRegistrar* registrar); + +G_END_DECLS + +#endif // FLUTTER_PLUGIN_CLOUD_FUNCTIONS_PLUGIN_H_ diff --git a/packages/cloud_functions/cloud_functions/linux/messages.g.cc b/packages/cloud_functions/cloud_functions/linux/messages.g.cc new file mode 100644 index 000000000000..33e8ea49be53 --- /dev/null +++ b/packages/cloud_functions/cloud_functions/linux/messages.g.cc @@ -0,0 +1,626 @@ +// Copyright 2025, the Chromium project authors. Please see the AUTHORS file +// for details. All rights reserved. Use of this source code is governed by a +// BSD-style license that can be found in the LICENSE file. +// Autogenerated from Pigeon (v26.3.4), do not edit directly. +// See also: https://pub.dev/packages/pigeon + +#include "messages.g.h" + +#include + +#include +static guint G_GNUC_UNUSED flpigeon_hash_double(double v) { + if (std::isnan(v)) { + return static_cast(0x7FF80000); + } + if (v == 0.0) { + v = 0.0; + } + union { + double d; + uint64_t u; + } u; + u.d = v; + return static_cast(u.u ^ (u.u >> 32)); +} +static gboolean G_GNUC_UNUSED flpigeon_equals_double(double a, double b) { + return (a == b) || (std::isnan(a) && std::isnan(b)); +} +static gboolean G_GNUC_UNUSED flpigeon_deep_equals(FlValue* a, FlValue* b) { + if (a == b) { + return TRUE; + } + if (a == nullptr || b == nullptr) { + return FALSE; + } + if (fl_value_get_type(a) != fl_value_get_type(b)) { + return FALSE; + } + switch (fl_value_get_type(a)) { + case FL_VALUE_TYPE_NULL: + return TRUE; + case FL_VALUE_TYPE_BOOL: + return fl_value_get_bool(a) == fl_value_get_bool(b); + case FL_VALUE_TYPE_INT: + return fl_value_get_int(a) == fl_value_get_int(b); + case FL_VALUE_TYPE_FLOAT: { + return flpigeon_equals_double(fl_value_get_float(a), + fl_value_get_float(b)); + } + case FL_VALUE_TYPE_STRING: + return g_strcmp0(fl_value_get_string(a), fl_value_get_string(b)) == 0; + case FL_VALUE_TYPE_UINT8_LIST: + return fl_value_get_length(a) == fl_value_get_length(b) && + memcmp(fl_value_get_uint8_list(a), fl_value_get_uint8_list(b), + fl_value_get_length(a)) == 0; + case FL_VALUE_TYPE_INT32_LIST: + return fl_value_get_length(a) == fl_value_get_length(b) && + memcmp(fl_value_get_int32_list(a), fl_value_get_int32_list(b), + fl_value_get_length(a) * sizeof(int32_t)) == 0; + case FL_VALUE_TYPE_INT64_LIST: + return fl_value_get_length(a) == fl_value_get_length(b) && + memcmp(fl_value_get_int64_list(a), fl_value_get_int64_list(b), + fl_value_get_length(a) * sizeof(int64_t)) == 0; + case FL_VALUE_TYPE_FLOAT_LIST: { + size_t len = fl_value_get_length(a); + if (len != fl_value_get_length(b)) { + return FALSE; + } + const double* a_data = fl_value_get_float_list(a); + const double* b_data = fl_value_get_float_list(b); + for (size_t i = 0; i < len; i++) { + if (!flpigeon_equals_double(a_data[i], b_data[i])) { + return FALSE; + } + } + return TRUE; + } + case FL_VALUE_TYPE_LIST: { + size_t len = fl_value_get_length(a); + if (len != fl_value_get_length(b)) { + return FALSE; + } + for (size_t i = 0; i < len; i++) { + if (!flpigeon_deep_equals(fl_value_get_list_value(a, i), + fl_value_get_list_value(b, i))) { + return FALSE; + } + } + return TRUE; + } + case FL_VALUE_TYPE_MAP: { + size_t len = fl_value_get_length(a); + if (len != fl_value_get_length(b)) { + return FALSE; + } + for (size_t i = 0; i < len; i++) { + FlValue* key = fl_value_get_map_key(a, i); + FlValue* val = fl_value_get_map_value(a, i); + gboolean found = FALSE; + for (size_t j = 0; j < len; j++) { + FlValue* b_key = fl_value_get_map_key(b, j); + if (flpigeon_deep_equals(key, b_key)) { + FlValue* b_val = fl_value_get_map_value(b, j); + if (flpigeon_deep_equals(val, b_val)) { + found = TRUE; + break; + } else { + return FALSE; + } + } + } + if (!found) { + return FALSE; + } + } + return TRUE; + } + default: + return FALSE; + } + return FALSE; +} +static guint G_GNUC_UNUSED flpigeon_deep_hash(FlValue* value) { + if (value == nullptr) { + return 0; + } + switch (fl_value_get_type(value)) { + case FL_VALUE_TYPE_NULL: + return 0; + case FL_VALUE_TYPE_BOOL: + return fl_value_get_bool(value) ? 1231 : 1237; + case FL_VALUE_TYPE_INT: { + int64_t v = fl_value_get_int(value); + return static_cast(v ^ (v >> 32)); + } + case FL_VALUE_TYPE_FLOAT: + return flpigeon_hash_double(fl_value_get_float(value)); + case FL_VALUE_TYPE_STRING: + return g_str_hash(fl_value_get_string(value)); + case FL_VALUE_TYPE_UINT8_LIST: { + guint result = 1; + size_t len = fl_value_get_length(value); + const uint8_t* data = fl_value_get_uint8_list(value); + for (size_t i = 0; i < len; i++) { + result = result * 31 + data[i]; + } + return result; + } + case FL_VALUE_TYPE_INT32_LIST: { + guint result = 1; + size_t len = fl_value_get_length(value); + const int32_t* data = fl_value_get_int32_list(value); + for (size_t i = 0; i < len; i++) { + result = result * 31 + static_cast(data[i]); + } + return result; + } + case FL_VALUE_TYPE_INT64_LIST: { + guint result = 1; + size_t len = fl_value_get_length(value); + const int64_t* data = fl_value_get_int64_list(value); + for (size_t i = 0; i < len; i++) { + result = result * 31 + static_cast(data[i] ^ (data[i] >> 32)); + } + return result; + } + case FL_VALUE_TYPE_FLOAT_LIST: { + guint result = 1; + size_t len = fl_value_get_length(value); + const double* data = fl_value_get_float_list(value); + for (size_t i = 0; i < len; i++) { + result = result * 31 + flpigeon_hash_double(data[i]); + } + return result; + } + case FL_VALUE_TYPE_LIST: { + guint result = 1; + size_t len = fl_value_get_length(value); + for (size_t i = 0; i < len; i++) { + result = + result * 31 + flpigeon_deep_hash(fl_value_get_list_value(value, i)); + } + return result; + } + case FL_VALUE_TYPE_MAP: { + guint result = 0; + size_t len = fl_value_get_length(value); + for (size_t i = 0; i < len; i++) { + result += ((flpigeon_deep_hash(fl_value_get_map_key(value, i)) * 31) ^ + flpigeon_deep_hash(fl_value_get_map_value(value, i))); + } + return result; + } + default: + return static_cast(fl_value_get_type(value)); + } + return 0; +} + +struct _CloudFunctionsMessageCodec { + FlStandardMessageCodec parent_instance; +}; + +G_DEFINE_TYPE(CloudFunctionsMessageCodec, cloud_functions_message_codec, + fl_standard_message_codec_get_type()) + +static gboolean cloud_functions_message_codec_write_value( + FlStandardMessageCodec* codec, GByteArray* buffer, FlValue* value, + GError** error) { + if (fl_value_get_type(value) == FL_VALUE_TYPE_CUSTOM) { + switch (fl_value_get_custom_type(value)) {} + } + + return FL_STANDARD_MESSAGE_CODEC_CLASS( + cloud_functions_message_codec_parent_class) + ->write_value(codec, buffer, value, error); +} + +static FlValue* cloud_functions_message_codec_read_value_of_type( + FlStandardMessageCodec* codec, GBytes* buffer, size_t* offset, int type, + GError** error) { + switch (type) { + default: + return FL_STANDARD_MESSAGE_CODEC_CLASS( + cloud_functions_message_codec_parent_class) + ->read_value_of_type(codec, buffer, offset, type, error); + } +} + +static void cloud_functions_message_codec_init( + CloudFunctionsMessageCodec* self) {} + +static void cloud_functions_message_codec_class_init( + CloudFunctionsMessageCodecClass* klass) { + FL_STANDARD_MESSAGE_CODEC_CLASS(klass)->write_value = + cloud_functions_message_codec_write_value; + FL_STANDARD_MESSAGE_CODEC_CLASS(klass)->read_value_of_type = + cloud_functions_message_codec_read_value_of_type; +} + +static CloudFunctionsMessageCodec* cloud_functions_message_codec_new() { + CloudFunctionsMessageCodec* self = CLOUD_FUNCTIONS_MESSAGE_CODEC( + g_object_new(cloud_functions_message_codec_get_type(), nullptr)); + return self; +} + +struct _CloudFunctionsCloudFunctionsHostApiResponseHandle { + GObject parent_instance; + + FlBasicMessageChannel* channel; + FlBasicMessageChannelResponseHandle* response_handle; +}; + +G_DEFINE_TYPE(CloudFunctionsCloudFunctionsHostApiResponseHandle, + cloud_functions_cloud_functions_host_api_response_handle, + G_TYPE_OBJECT) + +static void cloud_functions_cloud_functions_host_api_response_handle_dispose( + GObject* object) { + CloudFunctionsCloudFunctionsHostApiResponseHandle* self = + CLOUD_FUNCTIONS_CLOUD_FUNCTIONS_HOST_API_RESPONSE_HANDLE(object); + g_clear_object(&self->channel); + g_clear_object(&self->response_handle); + G_OBJECT_CLASS( + cloud_functions_cloud_functions_host_api_response_handle_parent_class) + ->dispose(object); +} + +static void cloud_functions_cloud_functions_host_api_response_handle_init( + CloudFunctionsCloudFunctionsHostApiResponseHandle* self) {} + +static void cloud_functions_cloud_functions_host_api_response_handle_class_init( + CloudFunctionsCloudFunctionsHostApiResponseHandleClass* klass) { + G_OBJECT_CLASS(klass)->dispose = + cloud_functions_cloud_functions_host_api_response_handle_dispose; +} + +static CloudFunctionsCloudFunctionsHostApiResponseHandle* +cloud_functions_cloud_functions_host_api_response_handle_new( + FlBasicMessageChannel* channel, + FlBasicMessageChannelResponseHandle* response_handle) { + CloudFunctionsCloudFunctionsHostApiResponseHandle* self = + CLOUD_FUNCTIONS_CLOUD_FUNCTIONS_HOST_API_RESPONSE_HANDLE(g_object_new( + cloud_functions_cloud_functions_host_api_response_handle_get_type(), + nullptr)); + self->channel = FL_BASIC_MESSAGE_CHANNEL(g_object_ref(channel)); + self->response_handle = + FL_BASIC_MESSAGE_CHANNEL_RESPONSE_HANDLE(g_object_ref(response_handle)); + return self; +} + +G_DECLARE_FINAL_TYPE(CloudFunctionsCloudFunctionsHostApiCallResponse, + cloud_functions_cloud_functions_host_api_call_response, + CLOUD_FUNCTIONS, CLOUD_FUNCTIONS_HOST_API_CALL_RESPONSE, + GObject) + +struct _CloudFunctionsCloudFunctionsHostApiCallResponse { + GObject parent_instance; + + FlValue* value; +}; + +G_DEFINE_TYPE(CloudFunctionsCloudFunctionsHostApiCallResponse, + cloud_functions_cloud_functions_host_api_call_response, + G_TYPE_OBJECT) + +static void cloud_functions_cloud_functions_host_api_call_response_dispose( + GObject* object) { + CloudFunctionsCloudFunctionsHostApiCallResponse* self = + CLOUD_FUNCTIONS_CLOUD_FUNCTIONS_HOST_API_CALL_RESPONSE(object); + g_clear_pointer(&self->value, fl_value_unref); + G_OBJECT_CLASS( + cloud_functions_cloud_functions_host_api_call_response_parent_class) + ->dispose(object); +} + +static void cloud_functions_cloud_functions_host_api_call_response_init( + CloudFunctionsCloudFunctionsHostApiCallResponse* self) {} + +static void cloud_functions_cloud_functions_host_api_call_response_class_init( + CloudFunctionsCloudFunctionsHostApiCallResponseClass* klass) { + G_OBJECT_CLASS(klass)->dispose = + cloud_functions_cloud_functions_host_api_call_response_dispose; +} + +static CloudFunctionsCloudFunctionsHostApiCallResponse* +cloud_functions_cloud_functions_host_api_call_response_new( + FlValue* return_value) { + CloudFunctionsCloudFunctionsHostApiCallResponse* self = + CLOUD_FUNCTIONS_CLOUD_FUNCTIONS_HOST_API_CALL_RESPONSE(g_object_new( + cloud_functions_cloud_functions_host_api_call_response_get_type(), + nullptr)); + self->value = fl_value_new_list(); + fl_value_append_take(self->value, return_value != nullptr + ? fl_value_ref(return_value) + : fl_value_new_null()); + return self; +} + +static CloudFunctionsCloudFunctionsHostApiCallResponse* +cloud_functions_cloud_functions_host_api_call_response_new_error( + const gchar* code, const gchar* message, FlValue* details) { + CloudFunctionsCloudFunctionsHostApiCallResponse* self = + CLOUD_FUNCTIONS_CLOUD_FUNCTIONS_HOST_API_CALL_RESPONSE(g_object_new( + cloud_functions_cloud_functions_host_api_call_response_get_type(), + nullptr)); + self->value = fl_value_new_list(); + fl_value_append_take(self->value, fl_value_new_string(code)); + fl_value_append_take(self->value, + fl_value_new_string(message != nullptr ? message : "")); + fl_value_append_take(self->value, details != nullptr ? fl_value_ref(details) + : fl_value_new_null()); + return self; +} + +G_DECLARE_FINAL_TYPE( + CloudFunctionsCloudFunctionsHostApiRegisterEventChannelResponse, + cloud_functions_cloud_functions_host_api_register_event_channel_response, + CLOUD_FUNCTIONS, CLOUD_FUNCTIONS_HOST_API_REGISTER_EVENT_CHANNEL_RESPONSE, + GObject) + +struct _CloudFunctionsCloudFunctionsHostApiRegisterEventChannelResponse { + GObject parent_instance; + + FlValue* value; +}; + +G_DEFINE_TYPE( + CloudFunctionsCloudFunctionsHostApiRegisterEventChannelResponse, + cloud_functions_cloud_functions_host_api_register_event_channel_response, + G_TYPE_OBJECT) + +static void +cloud_functions_cloud_functions_host_api_register_event_channel_response_dispose( + GObject* object) { + CloudFunctionsCloudFunctionsHostApiRegisterEventChannelResponse* self = + CLOUD_FUNCTIONS_CLOUD_FUNCTIONS_HOST_API_REGISTER_EVENT_CHANNEL_RESPONSE( + object); + g_clear_pointer(&self->value, fl_value_unref); + G_OBJECT_CLASS( + cloud_functions_cloud_functions_host_api_register_event_channel_response_parent_class) + ->dispose(object); +} + +static void +cloud_functions_cloud_functions_host_api_register_event_channel_response_init( + CloudFunctionsCloudFunctionsHostApiRegisterEventChannelResponse* self) {} + +static void +cloud_functions_cloud_functions_host_api_register_event_channel_response_class_init( + CloudFunctionsCloudFunctionsHostApiRegisterEventChannelResponseClass* + klass) { + G_OBJECT_CLASS(klass)->dispose = + cloud_functions_cloud_functions_host_api_register_event_channel_response_dispose; +} + +static CloudFunctionsCloudFunctionsHostApiRegisterEventChannelResponse* +cloud_functions_cloud_functions_host_api_register_event_channel_response_new() { + CloudFunctionsCloudFunctionsHostApiRegisterEventChannelResponse* self = + CLOUD_FUNCTIONS_CLOUD_FUNCTIONS_HOST_API_REGISTER_EVENT_CHANNEL_RESPONSE( + g_object_new( + cloud_functions_cloud_functions_host_api_register_event_channel_response_get_type(), + nullptr)); + self->value = fl_value_new_list(); + fl_value_append_take(self->value, fl_value_new_null()); + return self; +} + +static CloudFunctionsCloudFunctionsHostApiRegisterEventChannelResponse* +cloud_functions_cloud_functions_host_api_register_event_channel_response_new_error( + const gchar* code, const gchar* message, FlValue* details) { + CloudFunctionsCloudFunctionsHostApiRegisterEventChannelResponse* self = + CLOUD_FUNCTIONS_CLOUD_FUNCTIONS_HOST_API_REGISTER_EVENT_CHANNEL_RESPONSE( + g_object_new( + cloud_functions_cloud_functions_host_api_register_event_channel_response_get_type(), + nullptr)); + self->value = fl_value_new_list(); + fl_value_append_take(self->value, fl_value_new_string(code)); + fl_value_append_take(self->value, + fl_value_new_string(message != nullptr ? message : "")); + fl_value_append_take(self->value, details != nullptr ? fl_value_ref(details) + : fl_value_new_null()); + return self; +} + +struct _CloudFunctionsCloudFunctionsHostApi { + GObject parent_instance; + + const CloudFunctionsCloudFunctionsHostApiVTable* vtable; + gpointer user_data; + GDestroyNotify user_data_free_func; +}; + +G_DEFINE_TYPE(CloudFunctionsCloudFunctionsHostApi, + cloud_functions_cloud_functions_host_api, G_TYPE_OBJECT) + +static void cloud_functions_cloud_functions_host_api_dispose(GObject* object) { + CloudFunctionsCloudFunctionsHostApi* self = + CLOUD_FUNCTIONS_CLOUD_FUNCTIONS_HOST_API(object); + if (self->user_data != nullptr) { + self->user_data_free_func(self->user_data); + } + self->user_data = nullptr; + G_OBJECT_CLASS(cloud_functions_cloud_functions_host_api_parent_class) + ->dispose(object); +} + +static void cloud_functions_cloud_functions_host_api_init( + CloudFunctionsCloudFunctionsHostApi* self) {} + +static void cloud_functions_cloud_functions_host_api_class_init( + CloudFunctionsCloudFunctionsHostApiClass* klass) { + G_OBJECT_CLASS(klass)->dispose = + cloud_functions_cloud_functions_host_api_dispose; +} + +static CloudFunctionsCloudFunctionsHostApi* +cloud_functions_cloud_functions_host_api_new( + const CloudFunctionsCloudFunctionsHostApiVTable* vtable, gpointer user_data, + GDestroyNotify user_data_free_func) { + CloudFunctionsCloudFunctionsHostApi* self = + CLOUD_FUNCTIONS_CLOUD_FUNCTIONS_HOST_API(g_object_new( + cloud_functions_cloud_functions_host_api_get_type(), nullptr)); + self->vtable = vtable; + self->user_data = user_data; + self->user_data_free_func = user_data_free_func; + return self; +} + +static void cloud_functions_cloud_functions_host_api_call_cb( + FlBasicMessageChannel* channel, FlValue* message_, + FlBasicMessageChannelResponseHandle* response_handle, gpointer user_data) { + CloudFunctionsCloudFunctionsHostApi* self = + CLOUD_FUNCTIONS_CLOUD_FUNCTIONS_HOST_API(user_data); + + if (self->vtable == nullptr || self->vtable->call == nullptr) { + return; + } + + FlValue* value0 = fl_value_get_list_value(message_, 0); + FlValue* arguments = value0; + g_autoptr(CloudFunctionsCloudFunctionsHostApiResponseHandle) handle = + cloud_functions_cloud_functions_host_api_response_handle_new( + channel, response_handle); + self->vtable->call(arguments, handle, self->user_data); +} + +static void cloud_functions_cloud_functions_host_api_register_event_channel_cb( + FlBasicMessageChannel* channel, FlValue* message_, + FlBasicMessageChannelResponseHandle* response_handle, gpointer user_data) { + CloudFunctionsCloudFunctionsHostApi* self = + CLOUD_FUNCTIONS_CLOUD_FUNCTIONS_HOST_API(user_data); + + if (self->vtable == nullptr || + self->vtable->register_event_channel == nullptr) { + return; + } + + FlValue* value0 = fl_value_get_list_value(message_, 0); + FlValue* arguments = value0; + g_autoptr(CloudFunctionsCloudFunctionsHostApiResponseHandle) handle = + cloud_functions_cloud_functions_host_api_response_handle_new( + channel, response_handle); + self->vtable->register_event_channel(arguments, handle, self->user_data); +} + +void cloud_functions_cloud_functions_host_api_set_method_handlers( + FlBinaryMessenger* messenger, const gchar* suffix, + const CloudFunctionsCloudFunctionsHostApiVTable* vtable, gpointer user_data, + GDestroyNotify user_data_free_func) { + g_autofree gchar* dot_suffix = + suffix != nullptr ? g_strdup_printf(".%s", suffix) : g_strdup(""); + g_autoptr(CloudFunctionsCloudFunctionsHostApi) api_data = + cloud_functions_cloud_functions_host_api_new(vtable, user_data, + user_data_free_func); + + g_autoptr(CloudFunctionsMessageCodec) codec = + cloud_functions_message_codec_new(); + g_autofree gchar* call_channel_name = g_strdup_printf( + "dev.flutter.pigeon.cloud_functions_platform_interface." + "CloudFunctionsHostApi.call%s", + dot_suffix); + g_autoptr(FlBasicMessageChannel) call_channel = fl_basic_message_channel_new( + messenger, call_channel_name, FL_MESSAGE_CODEC(codec)); + fl_basic_message_channel_set_message_handler( + call_channel, cloud_functions_cloud_functions_host_api_call_cb, + g_object_ref(api_data), g_object_unref); + g_autofree gchar* register_event_channel_channel_name = g_strdup_printf( + "dev.flutter.pigeon.cloud_functions_platform_interface." + "CloudFunctionsHostApi.registerEventChannel%s", + dot_suffix); + g_autoptr(FlBasicMessageChannel) register_event_channel_channel = + fl_basic_message_channel_new(messenger, + register_event_channel_channel_name, + FL_MESSAGE_CODEC(codec)); + fl_basic_message_channel_set_message_handler( + register_event_channel_channel, + cloud_functions_cloud_functions_host_api_register_event_channel_cb, + g_object_ref(api_data), g_object_unref); +} + +void cloud_functions_cloud_functions_host_api_clear_method_handlers( + FlBinaryMessenger* messenger, const gchar* suffix) { + g_autofree gchar* dot_suffix = + suffix != nullptr ? g_strdup_printf(".%s", suffix) : g_strdup(""); + + g_autoptr(CloudFunctionsMessageCodec) codec = + cloud_functions_message_codec_new(); + g_autofree gchar* call_channel_name = g_strdup_printf( + "dev.flutter.pigeon.cloud_functions_platform_interface." + "CloudFunctionsHostApi.call%s", + dot_suffix); + g_autoptr(FlBasicMessageChannel) call_channel = fl_basic_message_channel_new( + messenger, call_channel_name, FL_MESSAGE_CODEC(codec)); + fl_basic_message_channel_set_message_handler(call_channel, nullptr, nullptr, + nullptr); + g_autofree gchar* register_event_channel_channel_name = g_strdup_printf( + "dev.flutter.pigeon.cloud_functions_platform_interface." + "CloudFunctionsHostApi.registerEventChannel%s", + dot_suffix); + g_autoptr(FlBasicMessageChannel) register_event_channel_channel = + fl_basic_message_channel_new(messenger, + register_event_channel_channel_name, + FL_MESSAGE_CODEC(codec)); + fl_basic_message_channel_set_message_handler(register_event_channel_channel, + nullptr, nullptr, nullptr); +} + +void cloud_functions_cloud_functions_host_api_respond_call( + CloudFunctionsCloudFunctionsHostApiResponseHandle* response_handle, + FlValue* return_value) { + g_autoptr(CloudFunctionsCloudFunctionsHostApiCallResponse) response = + cloud_functions_cloud_functions_host_api_call_response_new(return_value); + g_autoptr(GError) error = nullptr; + if (!fl_basic_message_channel_respond(response_handle->channel, + response_handle->response_handle, + response->value, &error)) { + g_warning("Failed to send response to %s.%s: %s", "CloudFunctionsHostApi", + "call", error->message); + } +} + +void cloud_functions_cloud_functions_host_api_respond_error_call( + CloudFunctionsCloudFunctionsHostApiResponseHandle* response_handle, + const gchar* code, const gchar* message, FlValue* details) { + g_autoptr(CloudFunctionsCloudFunctionsHostApiCallResponse) response = + cloud_functions_cloud_functions_host_api_call_response_new_error( + code, message, details); + g_autoptr(GError) error = nullptr; + if (!fl_basic_message_channel_respond(response_handle->channel, + response_handle->response_handle, + response->value, &error)) { + g_warning("Failed to send response to %s.%s: %s", "CloudFunctionsHostApi", + "call", error->message); + } +} + +void cloud_functions_cloud_functions_host_api_respond_register_event_channel( + CloudFunctionsCloudFunctionsHostApiResponseHandle* response_handle) { + g_autoptr( + CloudFunctionsCloudFunctionsHostApiRegisterEventChannelResponse) response = + cloud_functions_cloud_functions_host_api_register_event_channel_response_new(); + g_autoptr(GError) error = nullptr; + if (!fl_basic_message_channel_respond(response_handle->channel, + response_handle->response_handle, + response->value, &error)) { + g_warning("Failed to send response to %s.%s: %s", "CloudFunctionsHostApi", + "registerEventChannel", error->message); + } +} + +void cloud_functions_cloud_functions_host_api_respond_error_register_event_channel( + CloudFunctionsCloudFunctionsHostApiResponseHandle* response_handle, + const gchar* code, const gchar* message, FlValue* details) { + g_autoptr( + CloudFunctionsCloudFunctionsHostApiRegisterEventChannelResponse) response = + cloud_functions_cloud_functions_host_api_register_event_channel_response_new_error( + code, message, details); + g_autoptr(GError) error = nullptr; + if (!fl_basic_message_channel_respond(response_handle->channel, + response_handle->response_handle, + response->value, &error)) { + g_warning("Failed to send response to %s.%s: %s", "CloudFunctionsHostApi", + "registerEventChannel", error->message); + } +} diff --git a/packages/cloud_functions/cloud_functions/linux/messages.g.h b/packages/cloud_functions/cloud_functions/linux/messages.g.h new file mode 100644 index 000000000000..89b399e952fc --- /dev/null +++ b/packages/cloud_functions/cloud_functions/linux/messages.g.h @@ -0,0 +1,119 @@ +// Copyright 2025, the Chromium project authors. Please see the AUTHORS file +// for details. All rights reserved. Use of this source code is governed by a +// BSD-style license that can be found in the LICENSE file. +// Autogenerated from Pigeon (v26.3.4), do not edit directly. +// See also: https://pub.dev/packages/pigeon + +#ifndef PIGEON_MESSAGES_G_H_ +#define PIGEON_MESSAGES_G_H_ + +#include + +G_BEGIN_DECLS + +G_DECLARE_FINAL_TYPE(CloudFunctionsMessageCodec, cloud_functions_message_codec, + CLOUD_FUNCTIONS, MESSAGE_CODEC, FlStandardMessageCodec) + +G_DECLARE_FINAL_TYPE(CloudFunctionsCloudFunctionsHostApi, + cloud_functions_cloud_functions_host_api, CLOUD_FUNCTIONS, + CLOUD_FUNCTIONS_HOST_API, GObject) + +G_DECLARE_FINAL_TYPE(CloudFunctionsCloudFunctionsHostApiResponseHandle, + cloud_functions_cloud_functions_host_api_response_handle, + CLOUD_FUNCTIONS, CLOUD_FUNCTIONS_HOST_API_RESPONSE_HANDLE, + GObject) + +/** + * CloudFunctionsCloudFunctionsHostApiVTable: + * + * Table of functions exposed by CloudFunctionsHostApi to be implemented by the + * API provider. + */ +typedef struct { + void (*call)( + FlValue* arguments, + CloudFunctionsCloudFunctionsHostApiResponseHandle* response_handle, + gpointer user_data); + void (*register_event_channel)( + FlValue* arguments, + CloudFunctionsCloudFunctionsHostApiResponseHandle* response_handle, + gpointer user_data); +} CloudFunctionsCloudFunctionsHostApiVTable; + +/** + * cloud_functions_cloud_functions_host_api_set_method_handlers: + * + * @messenger: an #FlBinaryMessenger. + * @suffix: (allow-none): a suffix to add to the API or %NULL for none. + * @vtable: implementations of the methods in this API. + * @user_data: (closure): user data to pass to the functions in @vtable. + * @user_data_free_func: (allow-none): a function which gets called to free + * @user_data, or %NULL. + * + * Connects the method handlers in the CloudFunctionsHostApi API. + */ +void cloud_functions_cloud_functions_host_api_set_method_handlers( + FlBinaryMessenger* messenger, const gchar* suffix, + const CloudFunctionsCloudFunctionsHostApiVTable* vtable, gpointer user_data, + GDestroyNotify user_data_free_func); + +/** + * cloud_functions_cloud_functions_host_api_clear_method_handlers: + * + * @messenger: an #FlBinaryMessenger. + * @suffix: (allow-none): a suffix to add to the API or %NULL for none. + * + * Clears the method handlers in the CloudFunctionsHostApi API. + */ +void cloud_functions_cloud_functions_host_api_clear_method_handlers( + FlBinaryMessenger* messenger, const gchar* suffix); + +/** + * cloud_functions_cloud_functions_host_api_respond_call: + * @response_handle: a #CloudFunctionsCloudFunctionsHostApiResponseHandle. + * @return_value: location to write the value returned by this method. + * + * Responds to CloudFunctionsHostApi.call. + */ +void cloud_functions_cloud_functions_host_api_respond_call( + CloudFunctionsCloudFunctionsHostApiResponseHandle* response_handle, + FlValue* return_value); + +/** + * cloud_functions_cloud_functions_host_api_respond_error_call: + * @response_handle: a #CloudFunctionsCloudFunctionsHostApiResponseHandle. + * @code: error code. + * @message: error message. + * @details: (allow-none): error details or %NULL. + * + * Responds with an error to CloudFunctionsHostApi.call. + */ +void cloud_functions_cloud_functions_host_api_respond_error_call( + CloudFunctionsCloudFunctionsHostApiResponseHandle* response_handle, + const gchar* code, const gchar* message, FlValue* details); + +/** + * cloud_functions_cloud_functions_host_api_respond_register_event_channel: + * @response_handle: a #CloudFunctionsCloudFunctionsHostApiResponseHandle. + * + * Responds to CloudFunctionsHostApi.registerEventChannel. + */ +void cloud_functions_cloud_functions_host_api_respond_register_event_channel( + CloudFunctionsCloudFunctionsHostApiResponseHandle* response_handle); + +/** + * cloud_functions_cloud_functions_host_api_respond_error_register_event_channel: + * @response_handle: a #CloudFunctionsCloudFunctionsHostApiResponseHandle. + * @code: error code. + * @message: error message. + * @details: (allow-none): error details or %NULL. + * + * Responds with an error to CloudFunctionsHostApi.registerEventChannel. + */ +void cloud_functions_cloud_functions_host_api_respond_error_register_event_channel( + CloudFunctionsCloudFunctionsHostApiResponseHandle* response_handle, + const gchar* code, const gchar* message, FlValue* details); + +G_END_DECLS + +#endif // PIGEON_MESSAGES_G_H_ diff --git a/packages/cloud_functions/cloud_functions/linux/plugin_version.h.in b/packages/cloud_functions/cloud_functions/linux/plugin_version.h.in new file mode 100644 index 000000000000..009a0020f054 --- /dev/null +++ b/packages/cloud_functions/cloud_functions/linux/plugin_version.h.in @@ -0,0 +1,13 @@ +// Copyright 2026, the Chromium project authors. Please see the AUTHORS file +// for details. All rights reserved. Use of this source code is governed by a +// BSD-style license that can be found in the LICENSE file. + +#ifndef PLUGIN_VERSION_CONFIG_H +#define PLUGIN_VERSION_CONFIG_H + +namespace cloud_functions_linux { + +std::string getPluginVersion() { return "@PLUGIN_VERSION@"; } +} // namespace cloud_functions_linux + +#endif // PLUGIN_VERSION_CONFIG_H diff --git a/packages/cloud_functions/cloud_functions/pubspec.yaml b/packages/cloud_functions/cloud_functions/pubspec.yaml index 6b84a9a33e03..0f44ad5302ed 100644 --- a/packages/cloud_functions/cloud_functions/pubspec.yaml +++ b/packages/cloud_functions/cloud_functions/pubspec.yaml @@ -38,6 +38,8 @@ flutter: pluginClass: FlutterFirebaseFunctionsPlugin ios: pluginClass: FirebaseFunctionsPlugin + linux: + pluginClass: CloudFunctionsPlugin macos: pluginClass: FirebaseFunctionsPlugin web: diff --git a/packages/cloud_functions/cloud_functions_platform_interface/pigeons/messages.dart b/packages/cloud_functions/cloud_functions_platform_interface/pigeons/messages.dart index 4d283dce32c0..ecae72d01ee5 100644 --- a/packages/cloud_functions/cloud_functions_platform_interface/pigeons/messages.dart +++ b/packages/cloud_functions/cloud_functions_platform_interface/pigeons/messages.dart @@ -19,6 +19,12 @@ import 'package:pigeon/pigeon.dart'; cppHeaderOut: '../cloud_functions/windows/messages.g.h', cppSourceOut: '../cloud_functions/windows/messages.g.cpp', cppOptions: CppOptions(namespace: 'cloud_functions_windows'), + gobjectHeaderOut: '../cloud_functions/linux/messages.g.h', + gobjectSourceOut: '../cloud_functions/linux/messages.g.cc', + gobjectOptions: GObjectOptions( + headerIncludePath: 'messages.g.h', + module: 'CloudFunctions', + ), copyrightHeader: 'pigeons/copyright.txt', ), ) diff --git a/packages/firebase_app_check/firebase_app_check/example/.metadata b/packages/firebase_app_check/firebase_app_check/example/.metadata index 827d9a16d24a..c4aab3e27b27 100644 --- a/packages/firebase_app_check/firebase_app_check/example/.metadata +++ b/packages/firebase_app_check/firebase_app_check/example/.metadata @@ -18,6 +18,9 @@ migration: - platform: windows create_revision: 90673a4eef275d1a6692c26ac80d6d746d41a73a base_revision: 90673a4eef275d1a6692c26ac80d6d746d41a73a + - platform: linux + create_revision: ad70ec4617166f1c38e5d2bfd388af71fda14f06 + base_revision: ad70ec4617166f1c38e5d2bfd388af71fda14f06 # User provided section diff --git a/packages/firebase_app_check/firebase_app_check/example/lib/firebase_options.dart b/packages/firebase_app_check/firebase_app_check/example/lib/firebase_options.dart index 8bbd98affc15..8fdf4ed14113 100644 --- a/packages/firebase_app_check/firebase_app_check/example/lib/firebase_options.dart +++ b/packages/firebase_app_check/firebase_app_check/example/lib/firebase_options.dart @@ -32,11 +32,9 @@ class DefaultFirebaseOptions { return macos; case TargetPlatform.windows: return web; + // TODO: Remove when FlutterFire CLI supports Linux case TargetPlatform.linux: - throw UnsupportedError( - 'DefaultFirebaseOptions have not been configured for linux - ' - 'you can reconfigure this by running the FlutterFire CLI again.', - ); + return android; default: throw UnsupportedError( 'DefaultFirebaseOptions are not supported for this platform.', diff --git a/packages/firebase_app_check/firebase_app_check/example/linux/.gitignore b/packages/firebase_app_check/firebase_app_check/example/linux/.gitignore new file mode 100644 index 000000000000..d3896c98444f --- /dev/null +++ b/packages/firebase_app_check/firebase_app_check/example/linux/.gitignore @@ -0,0 +1 @@ +flutter/ephemeral diff --git a/packages/firebase_app_check/firebase_app_check/example/linux/CMakeLists.txt b/packages/firebase_app_check/firebase_app_check/example/linux/CMakeLists.txt new file mode 100644 index 000000000000..e8b2e2ce976e --- /dev/null +++ b/packages/firebase_app_check/firebase_app_check/example/linux/CMakeLists.txt @@ -0,0 +1,128 @@ +# Project-level configuration. +cmake_minimum_required(VERSION 3.13) +project(runner LANGUAGES CXX) + +# The name of the executable created for the application. Change this to change +# the on-disk name of your application. +set(BINARY_NAME "firebase_app_check_example") +# The unique GTK application identifier for this application. See: +# https://wiki.gnome.org/HowDoI/ChooseApplicationID +set(APPLICATION_ID "io.flutter.plugins.firebase.appcheck.firebase_app_check_example") + +# Explicitly opt in to modern CMake behaviors to avoid warnings with recent +# versions of CMake. +cmake_policy(SET CMP0063 NEW) + +# Load bundled libraries from the lib/ directory relative to the binary. +set(CMAKE_INSTALL_RPATH "$ORIGIN/lib") + +# Root filesystem for cross-building. +if(FLUTTER_TARGET_PLATFORM_SYSROOT) + set(CMAKE_SYSROOT ${FLUTTER_TARGET_PLATFORM_SYSROOT}) + set(CMAKE_FIND_ROOT_PATH ${CMAKE_SYSROOT}) + set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER) + set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY) + set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY) + set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY) +endif() + +# Define build configuration options. +if(NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES) + set(CMAKE_BUILD_TYPE "Debug" CACHE + STRING "Flutter build mode" FORCE) + set_property(CACHE CMAKE_BUILD_TYPE PROPERTY STRINGS + "Debug" "Profile" "Release") +endif() + +# Compilation settings that should be applied to most targets. +# +# Be cautious about adding new options here, as plugins use this function by +# default. In most cases, you should add new options to specific targets instead +# of modifying this function. +function(APPLY_STANDARD_SETTINGS TARGET) + target_compile_features(${TARGET} PUBLIC cxx_std_14) + target_compile_options(${TARGET} PRIVATE -Wall -Werror) + target_compile_options(${TARGET} PRIVATE "$<$>:-O3>") + target_compile_definitions(${TARGET} PRIVATE "$<$>:NDEBUG>") +endfunction() + +# Flutter library and tool build rules. +set(FLUTTER_MANAGED_DIR "${CMAKE_CURRENT_SOURCE_DIR}/flutter") +add_subdirectory(${FLUTTER_MANAGED_DIR}) + +# System-level dependencies. +find_package(PkgConfig REQUIRED) +pkg_check_modules(GTK REQUIRED IMPORTED_TARGET gtk+-3.0) + +# Application build; see runner/CMakeLists.txt. +add_subdirectory("runner") + +# Run the Flutter tool portions of the build. This must not be removed. +add_dependencies(${BINARY_NAME} flutter_assemble) + +# Only the install-generated bundle's copy of the executable will launch +# correctly, since the resources must in the right relative locations. To avoid +# people trying to run the unbundled copy, put it in a subdirectory instead of +# the default top-level location. +set_target_properties(${BINARY_NAME} + PROPERTIES + RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/intermediates_do_not_run" +) + + +# Generated plugin build rules, which manage building the plugins and adding +# them to the application. +include(flutter/generated_plugins.cmake) + + +# === Installation === +# By default, "installing" just makes a relocatable bundle in the build +# directory. +set(BUILD_BUNDLE_DIR "${PROJECT_BINARY_DIR}/bundle") +if(CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT) + set(CMAKE_INSTALL_PREFIX "${BUILD_BUNDLE_DIR}" CACHE PATH "..." FORCE) +endif() + +# Start with a clean build bundle directory every time. +install(CODE " + file(REMOVE_RECURSE \"${BUILD_BUNDLE_DIR}/\") + " COMPONENT Runtime) + +set(INSTALL_BUNDLE_DATA_DIR "${CMAKE_INSTALL_PREFIX}/data") +set(INSTALL_BUNDLE_LIB_DIR "${CMAKE_INSTALL_PREFIX}/lib") + +install(TARGETS ${BINARY_NAME} RUNTIME DESTINATION "${CMAKE_INSTALL_PREFIX}" + COMPONENT Runtime) + +install(FILES "${FLUTTER_ICU_DATA_FILE}" DESTINATION "${INSTALL_BUNDLE_DATA_DIR}" + COMPONENT Runtime) + +install(FILES "${FLUTTER_LIBRARY}" DESTINATION "${INSTALL_BUNDLE_LIB_DIR}" + COMPONENT Runtime) + +foreach(bundled_library ${PLUGIN_BUNDLED_LIBRARIES}) + install(FILES "${bundled_library}" + DESTINATION "${INSTALL_BUNDLE_LIB_DIR}" + COMPONENT Runtime) +endforeach(bundled_library) + +# Copy the native assets provided by the build.dart from all packages. +set(NATIVE_ASSETS_DIR "${PROJECT_BUILD_DIR}native_assets/linux/") +install(DIRECTORY "${NATIVE_ASSETS_DIR}" + DESTINATION "${INSTALL_BUNDLE_LIB_DIR}" + COMPONENT Runtime) + +# Fully re-copy the assets directory on each build to avoid having stale files +# from a previous install. +set(FLUTTER_ASSET_DIR_NAME "flutter_assets") +install(CODE " + file(REMOVE_RECURSE \"${INSTALL_BUNDLE_DATA_DIR}/${FLUTTER_ASSET_DIR_NAME}\") + " COMPONENT Runtime) +install(DIRECTORY "${PROJECT_BUILD_DIR}/${FLUTTER_ASSET_DIR_NAME}" + DESTINATION "${INSTALL_BUNDLE_DATA_DIR}" COMPONENT Runtime) + +# Install the AOT library on non-Debug builds only. +if(NOT CMAKE_BUILD_TYPE MATCHES "Debug") + install(FILES "${AOT_LIBRARY}" DESTINATION "${INSTALL_BUNDLE_LIB_DIR}" + COMPONENT Runtime) +endif() diff --git a/packages/firebase_app_check/firebase_app_check/example/linux/flutter/CMakeLists.txt b/packages/firebase_app_check/firebase_app_check/example/linux/flutter/CMakeLists.txt new file mode 100644 index 000000000000..d5bd01648a96 --- /dev/null +++ b/packages/firebase_app_check/firebase_app_check/example/linux/flutter/CMakeLists.txt @@ -0,0 +1,88 @@ +# This file controls Flutter-level build steps. It should not be edited. +cmake_minimum_required(VERSION 3.10) + +set(EPHEMERAL_DIR "${CMAKE_CURRENT_SOURCE_DIR}/ephemeral") + +# Configuration provided via flutter tool. +include(${EPHEMERAL_DIR}/generated_config.cmake) + +# TODO: Move the rest of this into files in ephemeral. See +# https://github.com/flutter/flutter/issues/57146. + +# Serves the same purpose as list(TRANSFORM ... PREPEND ...), +# which isn't available in 3.10. +function(list_prepend LIST_NAME PREFIX) + set(NEW_LIST "") + foreach(element ${${LIST_NAME}}) + list(APPEND NEW_LIST "${PREFIX}${element}") + endforeach(element) + set(${LIST_NAME} "${NEW_LIST}" PARENT_SCOPE) +endfunction() + +# === Flutter Library === +# System-level dependencies. +find_package(PkgConfig REQUIRED) +pkg_check_modules(GTK REQUIRED IMPORTED_TARGET gtk+-3.0) +pkg_check_modules(GLIB REQUIRED IMPORTED_TARGET glib-2.0) +pkg_check_modules(GIO REQUIRED IMPORTED_TARGET gio-2.0) + +set(FLUTTER_LIBRARY "${EPHEMERAL_DIR}/libflutter_linux_gtk.so") + +# Published to parent scope for install step. +set(FLUTTER_LIBRARY ${FLUTTER_LIBRARY} PARENT_SCOPE) +set(FLUTTER_ICU_DATA_FILE "${EPHEMERAL_DIR}/icudtl.dat" PARENT_SCOPE) +set(PROJECT_BUILD_DIR "${PROJECT_DIR}/build/" PARENT_SCOPE) +set(AOT_LIBRARY "${PROJECT_DIR}/build/lib/libapp.so" PARENT_SCOPE) + +list(APPEND FLUTTER_LIBRARY_HEADERS + "fl_basic_message_channel.h" + "fl_binary_codec.h" + "fl_binary_messenger.h" + "fl_dart_project.h" + "fl_engine.h" + "fl_json_message_codec.h" + "fl_json_method_codec.h" + "fl_message_codec.h" + "fl_method_call.h" + "fl_method_channel.h" + "fl_method_codec.h" + "fl_method_response.h" + "fl_plugin_registrar.h" + "fl_plugin_registry.h" + "fl_standard_message_codec.h" + "fl_standard_method_codec.h" + "fl_string_codec.h" + "fl_value.h" + "fl_view.h" + "flutter_linux.h" +) +list_prepend(FLUTTER_LIBRARY_HEADERS "${EPHEMERAL_DIR}/flutter_linux/") +add_library(flutter INTERFACE) +target_include_directories(flutter INTERFACE + "${EPHEMERAL_DIR}" +) +target_link_libraries(flutter INTERFACE "${FLUTTER_LIBRARY}") +target_link_libraries(flutter INTERFACE + PkgConfig::GTK + PkgConfig::GLIB + PkgConfig::GIO +) +add_dependencies(flutter flutter_assemble) + +# === Flutter tool backend === +# _phony_ is a non-existent file to force this command to run every time, +# since currently there's no way to get a full input/output list from the +# flutter tool. +add_custom_command( + OUTPUT ${FLUTTER_LIBRARY} ${FLUTTER_LIBRARY_HEADERS} + ${CMAKE_CURRENT_BINARY_DIR}/_phony_ + COMMAND ${CMAKE_COMMAND} -E env + ${FLUTTER_TOOL_ENVIRONMENT} + "${FLUTTER_ROOT}/packages/flutter_tools/bin/tool_backend.sh" + ${FLUTTER_TARGET_PLATFORM} ${CMAKE_BUILD_TYPE} + VERBATIM +) +add_custom_target(flutter_assemble DEPENDS + "${FLUTTER_LIBRARY}" + ${FLUTTER_LIBRARY_HEADERS} +) diff --git a/packages/firebase_app_check/firebase_app_check/example/linux/runner/CMakeLists.txt b/packages/firebase_app_check/firebase_app_check/example/linux/runner/CMakeLists.txt new file mode 100644 index 000000000000..e97dabc7028e --- /dev/null +++ b/packages/firebase_app_check/firebase_app_check/example/linux/runner/CMakeLists.txt @@ -0,0 +1,26 @@ +cmake_minimum_required(VERSION 3.13) +project(runner LANGUAGES CXX) + +# Define the application target. To change its name, change BINARY_NAME in the +# top-level CMakeLists.txt, not the value here, or `flutter run` will no longer +# work. +# +# Any new source files that you add to the application should be added here. +add_executable(${BINARY_NAME} + "main.cc" + "my_application.cc" + "${FLUTTER_MANAGED_DIR}/generated_plugin_registrant.cc" +) + +# Apply the standard set of build settings. This can be removed for applications +# that need different build settings. +apply_standard_settings(${BINARY_NAME}) + +# Add preprocessor definitions for the application ID. +add_definitions(-DAPPLICATION_ID="${APPLICATION_ID}") + +# Add dependency libraries. Add any application-specific dependencies here. +target_link_libraries(${BINARY_NAME} PRIVATE flutter) +target_link_libraries(${BINARY_NAME} PRIVATE PkgConfig::GTK) + +target_include_directories(${BINARY_NAME} PRIVATE "${CMAKE_SOURCE_DIR}") diff --git a/packages/firebase_app_check/firebase_app_check/example/linux/runner/main.cc b/packages/firebase_app_check/firebase_app_check/example/linux/runner/main.cc new file mode 100644 index 000000000000..54fde7b87fa0 --- /dev/null +++ b/packages/firebase_app_check/firebase_app_check/example/linux/runner/main.cc @@ -0,0 +1,10 @@ +// Copyright 2026, the Chromium project authors. Please see the AUTHORS file +// for details. All rights reserved. Use of this source code is governed by a +// BSD-style license that can be found in the LICENSE file. + +#include "my_application.h" + +int main(int argc, char** argv) { + g_autoptr(MyApplication) app = my_application_new(); + return g_application_run(G_APPLICATION(app), argc, argv); +} diff --git a/packages/firebase_app_check/firebase_app_check/example/linux/runner/my_application.cc b/packages/firebase_app_check/firebase_app_check/example/linux/runner/my_application.cc new file mode 100644 index 000000000000..428bd1f19c3f --- /dev/null +++ b/packages/firebase_app_check/firebase_app_check/example/linux/runner/my_application.cc @@ -0,0 +1,152 @@ +// Copyright 2026, the Chromium project authors. Please see the AUTHORS file +// for details. All rights reserved. Use of this source code is governed by a +// BSD-style license that can be found in the LICENSE file. + +#include "my_application.h" + +#include +#ifdef GDK_WINDOWING_X11 +#include +#endif + +#include "flutter/generated_plugin_registrant.h" + +struct _MyApplication { + GtkApplication parent_instance; + char** dart_entrypoint_arguments; +}; + +G_DEFINE_TYPE(MyApplication, my_application, GTK_TYPE_APPLICATION) + +// Called when first Flutter frame received. +static void first_frame_cb(MyApplication* self, FlView* view) { + gtk_widget_show(gtk_widget_get_toplevel(GTK_WIDGET(view))); +} + +// Implements GApplication::activate. +static void my_application_activate(GApplication* application) { + MyApplication* self = MY_APPLICATION(application); + GtkWindow* window = + GTK_WINDOW(gtk_application_window_new(GTK_APPLICATION(application))); + + // Use a header bar when running in GNOME as this is the common style used + // by applications and is the setup most users will be using (e.g. Ubuntu + // desktop). + // If running on X and not using GNOME then just use a traditional title bar + // in case the window manager does more exotic layout, e.g. tiling. + // If running on Wayland assume the header bar will work (may need changing + // if future cases occur). + gboolean use_header_bar = TRUE; +#ifdef GDK_WINDOWING_X11 + GdkScreen* screen = gtk_window_get_screen(window); + if (GDK_IS_X11_SCREEN(screen)) { + const gchar* wm_name = gdk_x11_screen_get_window_manager_name(screen); + if (g_strcmp0(wm_name, "GNOME Shell") != 0) { + use_header_bar = FALSE; + } + } +#endif + if (use_header_bar) { + GtkHeaderBar* header_bar = GTK_HEADER_BAR(gtk_header_bar_new()); + gtk_widget_show(GTK_WIDGET(header_bar)); + gtk_header_bar_set_title(header_bar, "firebase_app_check_example"); + gtk_header_bar_set_show_close_button(header_bar, TRUE); + gtk_window_set_titlebar(window, GTK_WIDGET(header_bar)); + } else { + gtk_window_set_title(window, "firebase_app_check_example"); + } + + gtk_window_set_default_size(window, 1280, 720); + + g_autoptr(FlDartProject) project = fl_dart_project_new(); + fl_dart_project_set_dart_entrypoint_arguments( + project, self->dart_entrypoint_arguments); + + FlView* view = fl_view_new(project); + GdkRGBA background_color; + // Background defaults to black, override it here if necessary, e.g. #00000000 + // for transparent. + gdk_rgba_parse(&background_color, "#000000"); + fl_view_set_background_color(view, &background_color); + gtk_widget_show(GTK_WIDGET(view)); + gtk_container_add(GTK_CONTAINER(window), GTK_WIDGET(view)); + + // Show the window when Flutter renders. + // Requires the view to be realized so we can start rendering. + g_signal_connect_swapped(view, "first-frame", G_CALLBACK(first_frame_cb), + self); + gtk_widget_realize(GTK_WIDGET(view)); + + fl_register_plugins(FL_PLUGIN_REGISTRY(view)); + + gtk_widget_grab_focus(GTK_WIDGET(view)); +} + +// Implements GApplication::local_command_line. +static gboolean my_application_local_command_line(GApplication* application, + gchar*** arguments, + int* exit_status) { + MyApplication* self = MY_APPLICATION(application); + // Strip out the first argument as it is the binary name. + self->dart_entrypoint_arguments = g_strdupv(*arguments + 1); + + g_autoptr(GError) error = nullptr; + if (!g_application_register(application, nullptr, &error)) { + g_warning("Failed to register: %s", error->message); + *exit_status = 1; + return TRUE; + } + + g_application_activate(application); + *exit_status = 0; + + return TRUE; +} + +// Implements GApplication::startup. +static void my_application_startup(GApplication* application) { + // MyApplication* self = MY_APPLICATION(object); + + // Perform any actions required at application startup. + + G_APPLICATION_CLASS(my_application_parent_class)->startup(application); +} + +// Implements GApplication::shutdown. +static void my_application_shutdown(GApplication* application) { + // MyApplication* self = MY_APPLICATION(object); + + // Perform any actions required at application shutdown. + + G_APPLICATION_CLASS(my_application_parent_class)->shutdown(application); +} + +// Implements GObject::dispose. +static void my_application_dispose(GObject* object) { + MyApplication* self = MY_APPLICATION(object); + g_clear_pointer(&self->dart_entrypoint_arguments, g_strfreev); + G_OBJECT_CLASS(my_application_parent_class)->dispose(object); +} + +static void my_application_class_init(MyApplicationClass* klass) { + G_APPLICATION_CLASS(klass)->activate = my_application_activate; + G_APPLICATION_CLASS(klass)->local_command_line = + my_application_local_command_line; + G_APPLICATION_CLASS(klass)->startup = my_application_startup; + G_APPLICATION_CLASS(klass)->shutdown = my_application_shutdown; + G_OBJECT_CLASS(klass)->dispose = my_application_dispose; +} + +static void my_application_init(MyApplication* self) {} + +MyApplication* my_application_new() { + // Set the program name to the application ID, which helps various systems + // like GTK and desktop environments map this running application to its + // corresponding .desktop file. This ensures better integration by allowing + // the application to be recognized beyond its binary name. + g_set_prgname(APPLICATION_ID); + + return MY_APPLICATION(g_object_new(my_application_get_type(), + "application-id", APPLICATION_ID, "flags", + G_APPLICATION_NON_UNIQUE, nullptr)); +} diff --git a/packages/firebase_app_check/firebase_app_check/example/linux/runner/my_application.h b/packages/firebase_app_check/firebase_app_check/example/linux/runner/my_application.h new file mode 100644 index 000000000000..a2ba75695cf5 --- /dev/null +++ b/packages/firebase_app_check/firebase_app_check/example/linux/runner/my_application.h @@ -0,0 +1,22 @@ +// Copyright 2026, the Chromium project authors. Please see the AUTHORS file +// for details. All rights reserved. Use of this source code is governed by a +// BSD-style license that can be found in the LICENSE file. + +#ifndef FLUTTER_MY_APPLICATION_H_ +#define FLUTTER_MY_APPLICATION_H_ + +#include + +G_DECLARE_FINAL_TYPE(MyApplication, my_application, MY, APPLICATION, + GtkApplication) + +/** + * my_application_new: + * + * Creates a new Flutter-based application. + * + * Returns: a new #MyApplication. + */ +MyApplication* my_application_new(); + +#endif // FLUTTER_MY_APPLICATION_H_ diff --git a/packages/firebase_app_check/firebase_app_check/linux/CMakeLists.txt b/packages/firebase_app_check/firebase_app_check/linux/CMakeLists.txt new file mode 100644 index 000000000000..594a66e2e576 --- /dev/null +++ b/packages/firebase_app_check/firebase_app_check/linux/CMakeLists.txt @@ -0,0 +1,91 @@ +# The Flutter tooling requires that developers have CMake 3.10 or later +# installed. You should not increase this version, as doing so will cause +# the plugin to fail to compile for some customers of the plugin. +cmake_minimum_required(VERSION 3.10) + +# Project-level configuration. +set(PROJECT_NAME "firebase_app_check") +project(${PROJECT_NAME} LANGUAGES CXX) + +# This value is used when generating builds using this plugin, so it must +# not be changed +set(PLUGIN_NAME "firebase_app_check_plugin") + +# Any new source files that you add to the plugin should be added here. +list(APPEND PLUGIN_SOURCES + "include/firebase_app_check/firebase_app_check_plugin.h" + "firebase_app_check_plugin.cc" + "messages.g.cc" + "messages.g.h" +) + +# Read version from pubspec.yaml +file(STRINGS "../pubspec.yaml" pubspec_content) +foreach(line ${pubspec_content}) + string(FIND ${line} "version: " has_version) + + if("${has_version}" STREQUAL "0") + string(FIND ${line} ": " version_start_pos) + math(EXPR version_start_pos "${version_start_pos} + 2") + string(LENGTH ${line} version_end_pos) + math(EXPR len "${version_end_pos} - ${version_start_pos}") + string(SUBSTRING ${line} ${version_start_pos} ${len} PLUGIN_VERSION) + break() + endif() +endforeach(line) + +configure_file(plugin_version.h.in ${CMAKE_BINARY_DIR}/generated/firebase_app_check/plugin_version.h) +include_directories(${CMAKE_BINARY_DIR}/generated/) + +# Define the plugin library target. Its name must not be changed (see comment +# on PLUGIN_NAME above). +# +# This is deliberately a STATIC library (unlike the SHARED library in the +# Flutter Linux plugin template) to mirror the Windows implementation; see +# firebase_core/linux/CMakeLists.txt for the full rationale. The Firebase C++ +# SDK itself is added via add_subdirectory by firebase_core, which this +# plugin links against. POSITION_INDEPENDENT_CODE is enabled because the +# runner executable is built as PIE. +add_library(${PLUGIN_NAME} STATIC + ${PLUGIN_SOURCES} + ${CMAKE_BINARY_DIR}/generated/firebase_app_check/plugin_version.h +) + +# Apply a standard set of build settings that are configured in the +# application-level CMakeLists.txt. This can be removed for plugins that want +# full control over build settings. +apply_standard_settings(${PLUGIN_NAME}) + +# Symbols are hidden by default to reduce the chance of accidental conflicts +# between plugins. This should not be removed; any symbols that should be +# exported should be explicitly exported with the FLUTTER_PLUGIN_EXPORT macro. +set_target_properties(${PLUGIN_NAME} PROPERTIES + CXX_VISIBILITY_PRESET hidden + POSITION_INDEPENDENT_CODE ON) +target_compile_definitions(${PLUGIN_NAME} PUBLIC FLUTTER_PLUGIN_IMPL) + +# Enable firebase-cpp-sdk's platform logging api. +target_compile_definitions(${PLUGIN_NAME} PRIVATE -DINTERNAL_EXPERIMENTAL=1) + +# Source include directories and library dependencies. Add any plugin-specific +# dependencies here. The firebase_core_plugin target provides the Firebase C++ +# SDK (added there via add_subdirectory) along with its include directories. +# NOTE: the Firebase SDK product archives are linked exclusively by the +# firebase_core_plugin target, which wraps all of them in a single +# -Wl,--start-group/--end-group (the archives have circular symbol +# dependencies that an ordered per-plugin link line cannot satisfy). +set(firebase_libs firebase_core_plugin) +target_link_libraries(${PLUGIN_NAME} PRIVATE "${firebase_libs}") + +target_include_directories(${PLUGIN_NAME} INTERFACE + "${CMAKE_CURRENT_SOURCE_DIR}/include") +target_link_libraries(${PLUGIN_NAME} PRIVATE flutter) +target_link_libraries(${PLUGIN_NAME} PRIVATE PkgConfig::GTK) + +# List of absolute paths to libraries that should be bundled with the plugin. +# This list could contain prebuilt libraries, or libraries created by an +# external build triggered from this build file. +set(firebase_app_check_bundled_libraries + "" + PARENT_SCOPE +) diff --git a/packages/firebase_app_check/firebase_app_check/linux/firebase_app_check_plugin.cc b/packages/firebase_app_check/firebase_app_check/linux/firebase_app_check_plugin.cc new file mode 100644 index 000000000000..623eb351f79e --- /dev/null +++ b/packages/firebase_app_check/firebase_app_check/linux/firebase_app_check_plugin.cc @@ -0,0 +1,381 @@ +// Copyright 2026, the Chromium project authors. Please see the AUTHORS file +// for details. All rights reserved. Use of this source code is governed by a +// BSD-style license that can be found in the LICENSE file. + +#include "include/firebase_app_check/firebase_app_check_plugin.h" + +#include + +#include +#include + +#include "firebase/app.h" +#include "firebase/app_check.h" +#include "firebase/app_check/debug_provider.h" +#include "firebase/future.h" +#include "firebase_app_check/plugin_version.h" +#include "messages.g.h" + +using ::firebase::App; +using ::firebase::Future; +using ::firebase::app_check::AppCheck; +using ::firebase::app_check::AppCheckListener; +using ::firebase::app_check::AppCheckToken; +using ::firebase::app_check::DebugAppCheckProviderFactory; + +static const char kLibraryName[] = "flutter-fire-app-check"; +static const char kEventChannelNamePrefix[] = + "plugins.flutter.io/firebase_app_check/token/"; + +#define FIREBASE_APP_CHECK_PLUGIN(obj) \ + (G_TYPE_CHECK_INSTANCE_CAST((obj), firebase_app_check_plugin_get_type(), \ + FirebaseAppCheckPlugin)) + +struct _FirebaseAppCheckPlugin { + GObject parent_instance; +}; + +G_DEFINE_TYPE(FirebaseAppCheckPlugin, firebase_app_check_plugin, + g_object_get_type()) + +class FlutterAppCheckListener; + +// The messenger is owned by the engine and outlives the plugin. +static FlBinaryMessenger* binary_messenger = nullptr; +// Event channels created by registerTokenListener, keyed by app name. +// The map owns a reference on each channel. +static std::map event_channels_; +// Active AppCheck listeners, keyed by app name. The map owns the listeners. +static std::map listeners_map_; + +static AppCheck* GetAppCheckFromPigeon(const std::string& app_name) { + App* app = App::GetInstance(app_name.c_str()); + return AppCheck::GetInstance(app); +} + +static void ParseError(const firebase::FutureBase& completed_future, + std::string* error_code, std::string* error_message) { + int error = completed_future.error(); + switch (error) { + case firebase::app_check::kAppCheckErrorServerUnreachable: + *error_code = "server-unreachable"; + break; + case firebase::app_check::kAppCheckErrorInvalidConfiguration: + *error_code = "invalid-configuration"; + break; + case firebase::app_check::kAppCheckErrorSystemKeychain: + *error_code = "system-keychain"; + break; + case firebase::app_check::kAppCheckErrorUnsupportedProvider: + *error_code = "unsupported-provider"; + break; + default: + *error_code = "unknown"; + break; + } + + *error_message = completed_future.error_message() + ? completed_future.error_message() + : "An unknown error occurred"; +} + +// Token change events are delivered on a Firebase SDK thread; they are +// marshalled to the platform (main) thread with g_idle_add before being sent +// on the event channel. +struct TokenEvent { + FlEventChannel* channel; // Owned reference. + std::string token; +}; + +static gboolean SendTokenEvent(gpointer user_data) { + TokenEvent* event = static_cast(user_data); + g_autoptr(FlValue) map = fl_value_new_map(); + fl_value_set_string_take(map, "token", + fl_value_new_string(event->token.c_str())); + g_autoptr(GError) error = nullptr; + if (!fl_event_channel_send(event->channel, map, nullptr, &error)) { + g_warning("firebase_app_check: failed to send token event: %s", + error->message); + } + g_object_unref(event->channel); + delete event; + return G_SOURCE_REMOVE; +} + +// AppCheckListener implementation that forwards token changes to an +// FlEventChannel. +class FlutterAppCheckListener : public AppCheckListener { + public: + explicit FlutterAppCheckListener(FlEventChannel* channel) + : channel_(FL_EVENT_CHANNEL(g_object_ref(channel))) {} + + ~FlutterAppCheckListener() override { g_object_unref(channel_); } + + void OnAppCheckTokenChanged(const AppCheckToken& token) override { + TokenEvent* event = + new TokenEvent{FL_EVENT_CHANNEL(g_object_ref(channel_)), token.token}; + g_idle_add(SendTokenEvent, event); + } + + private: + FlEventChannel* channel_; +}; + +// Stream handlers for token change events. + +struct TokenStreamHandlerData { + std::string app_name; +}; + +static FlMethodErrorResponse* OnListenTokenChannel(FlEventChannel* channel, + FlValue* args, + gpointer user_data) { + TokenStreamHandlerData* data = + static_cast(user_data); + AppCheck* app_check = GetAppCheckFromPigeon(data->app_name); + FlutterAppCheckListener* listener = new FlutterAppCheckListener(channel); + app_check->AddAppCheckListener(listener); + listeners_map_[data->app_name] = listener; + return nullptr; +} + +static FlMethodErrorResponse* OnCancelTokenChannel(FlEventChannel* channel, + FlValue* args, + gpointer user_data) { + TokenStreamHandlerData* data = + static_cast(user_data); + auto it = listeners_map_.find(data->app_name); + if (it != listeners_map_.end()) { + AppCheck* app_check = GetAppCheckFromPigeon(data->app_name); + app_check->RemoveAppCheckListener(it->second); + delete it->second; + listeners_map_.erase(it); + } + return nullptr; +} + +static void DestroyTokenStreamHandlerData(gpointer user_data) { + delete static_cast(user_data); +} + +// Firebase Future completions run on an SDK thread; responses are marshalled +// back to the platform (main) thread with g_idle_add before replying over the +// pigeon channel. +enum class TokenRequestKind { kGetToken, kGetLimitedUseToken }; + +struct TokenRequestResult { + TokenRequestKind kind; + // Owned reference, released after responding. + FirebaseAppCheckFirebaseAppCheckHostApiResponseHandle* response_handle; + bool success; + bool has_token; + std::string token; + std::string error_code; + std::string error_message; +}; + +static gboolean RespondTokenRequest(gpointer user_data) { + TokenRequestResult* result = static_cast(user_data); + switch (result->kind) { + case TokenRequestKind::kGetToken: + if (result->success) { + firebase_app_check_firebase_app_check_host_api_respond_get_token( + result->response_handle, + result->has_token ? result->token.c_str() : nullptr); + } else { + firebase_app_check_firebase_app_check_host_api_respond_error_get_token( + result->response_handle, result->error_code.c_str(), + result->error_message.c_str(), nullptr); + } + break; + case TokenRequestKind::kGetLimitedUseToken: + if (result->success) { + firebase_app_check_firebase_app_check_host_api_respond_get_limited_use_app_check_token( + result->response_handle, result->token.c_str()); + } else { + firebase_app_check_firebase_app_check_host_api_respond_error_get_limited_use_app_check_token( + result->response_handle, result->error_code.c_str(), + result->error_message.c_str(), nullptr); + } + break; + } + g_object_unref(result->response_handle); + delete result; + return G_SOURCE_REMOVE; +} + +// FirebaseAppCheckHostApi + +static void HandleActivate( + const gchar* app_name, const gchar* android_provider, + const gchar* apple_provider, const gchar* debug_token, + FirebaseAppCheckFirebaseAppCheckHostApiResponseHandle* response_handle, + gpointer user_data) { + // On Linux/desktop, only the Debug provider is available. + DebugAppCheckProviderFactory* factory = + DebugAppCheckProviderFactory::GetInstance(); + + if (debug_token != nullptr && debug_token[0] != '\0') { + factory->SetDebugToken(debug_token); + } + + AppCheck::SetAppCheckProviderFactory(factory); + + firebase_app_check_firebase_app_check_host_api_respond_activate( + response_handle); +} + +static void HandleGetToken( + const gchar* app_name, gboolean force_refresh, + FirebaseAppCheckFirebaseAppCheckHostApiResponseHandle* response_handle, + gpointer user_data) { + AppCheck* app_check = GetAppCheckFromPigeon(app_name); + + // The response handle must outlive this callback; released in + // RespondTokenRequest. + g_object_ref(response_handle); + + Future future = app_check->GetAppCheckToken(force_refresh); + future.OnCompletion([response_handle]( + const Future& completed_future) { + TokenRequestResult* result = new TokenRequestResult(); + result->kind = TokenRequestKind::kGetToken; + result->response_handle = response_handle; + if (completed_future.error() != 0) { + result->success = false; + ParseError(completed_future, &result->error_code, &result->error_message); + } else { + result->success = true; + const AppCheckToken* token = completed_future.result(); + if (token) { + result->has_token = true; + result->token = token->token; + } else { + result->has_token = false; + } + } + g_idle_add(RespondTokenRequest, result); + }); +} + +static void HandleSetTokenAutoRefreshEnabled( + const gchar* app_name, gboolean is_token_auto_refresh_enabled, + FirebaseAppCheckFirebaseAppCheckHostApiResponseHandle* response_handle, + gpointer user_data) { + AppCheck* app_check = GetAppCheckFromPigeon(app_name); + app_check->SetTokenAutoRefreshEnabled(is_token_auto_refresh_enabled); + firebase_app_check_firebase_app_check_host_api_respond_set_token_auto_refresh_enabled( + response_handle); +} + +static void HandleRegisterTokenListener( + const gchar* app_name, + FirebaseAppCheckFirebaseAppCheckHostApiResponseHandle* response_handle, + gpointer user_data) { + const std::string name = std::string(kEventChannelNamePrefix) + app_name; + + // Reuse an existing channel on re-registration (e.g. hot restart); creating + // a second FlEventChannel with the same name would detach the first one's + // stream handlers. + if (event_channels_.find(app_name) == event_channels_.end()) { + g_autoptr(FlStandardMethodCodec) codec = fl_standard_method_codec_new(); + FlEventChannel* event_channel = fl_event_channel_new( + binary_messenger, name.c_str(), FL_METHOD_CODEC(codec)); + fl_event_channel_set_stream_handlers( + event_channel, OnListenTokenChannel, OnCancelTokenChannel, + new TokenStreamHandlerData{app_name}, DestroyTokenStreamHandlerData); + event_channels_[app_name] = event_channel; + } + + firebase_app_check_firebase_app_check_host_api_respond_register_token_listener( + response_handle, name.c_str()); +} + +static void HandleGetLimitedUseAppCheckToken( + const gchar* app_name, + FirebaseAppCheckFirebaseAppCheckHostApiResponseHandle* response_handle, + gpointer user_data) { + AppCheck* app_check = GetAppCheckFromPigeon(app_name); + + // The response handle must outlive this callback; released in + // RespondTokenRequest. + g_object_ref(response_handle); + + Future future = app_check->GetLimitedUseAppCheckToken(); + future.OnCompletion([response_handle]( + const Future& completed_future) { + TokenRequestResult* result = new TokenRequestResult(); + result->kind = TokenRequestKind::kGetLimitedUseToken; + result->response_handle = response_handle; + if (completed_future.error() != 0) { + result->success = false; + ParseError(completed_future, &result->error_code, &result->error_message); + } else { + const AppCheckToken* token = completed_future.result(); + if (token) { + result->success = true; + result->token = token->token; + } else { + result->success = false; + result->error_code = "unknown"; + result->error_message = "Failed to get limited use token"; + } + } + g_idle_add(RespondTokenRequest, result); + }); +} + +static const FirebaseAppCheckFirebaseAppCheckHostApiVTable + kFirebaseAppCheckHostApiVTable = { + HandleActivate, // activate + HandleGetToken, // get_token + HandleSetTokenAutoRefreshEnabled, // set_token_auto_refresh_enabled + HandleRegisterTokenListener, // register_token_listener + HandleGetLimitedUseAppCheckToken, // get_limited_use_app_check_token +}; + +static void firebase_app_check_plugin_dispose(GObject* object) { + for (auto& [app_name, listener] : listeners_map_) { + App* app = App::GetInstance(app_name.c_str()); + if (app) { + AppCheck* app_check = AppCheck::GetInstance(app); + if (app_check) { + app_check->RemoveAppCheckListener(listener); + } + } + delete listener; + } + listeners_map_.clear(); + for (auto& [app_name, channel] : event_channels_) { + g_object_unref(channel); + } + event_channels_.clear(); + G_OBJECT_CLASS(firebase_app_check_plugin_parent_class)->dispose(object); +} + +static void firebase_app_check_plugin_class_init( + FirebaseAppCheckPluginClass* klass) { + G_OBJECT_CLASS(klass)->dispose = firebase_app_check_plugin_dispose; +} + +static void firebase_app_check_plugin_init(FirebaseAppCheckPlugin* self) {} + +void firebase_app_check_plugin_register_with_registrar( + FlPluginRegistrar* registrar) { + FirebaseAppCheckPlugin* plugin = FIREBASE_APP_CHECK_PLUGIN( + g_object_new(firebase_app_check_plugin_get_type(), nullptr)); + + FlBinaryMessenger* messenger = fl_plugin_registrar_get_messenger(registrar); + binary_messenger = messenger; + + firebase_app_check_firebase_app_check_host_api_set_method_handlers( + messenger, /* suffix= */ nullptr, &kFirebaseAppCheckHostApiVTable, + g_object_ref(plugin), g_object_unref); + + g_object_unref(plugin); + + // Register for platform logging + App::RegisterLibrary(kLibraryName, + firebase_app_check_linux::getPluginVersion().c_str(), + nullptr); +} diff --git a/packages/firebase_app_check/firebase_app_check/linux/include/firebase_app_check/firebase_app_check_plugin.h b/packages/firebase_app_check/firebase_app_check/linux/include/firebase_app_check/firebase_app_check_plugin.h new file mode 100644 index 000000000000..9ed7a0d86e20 --- /dev/null +++ b/packages/firebase_app_check/firebase_app_check/linux/include/firebase_app_check/firebase_app_check_plugin.h @@ -0,0 +1,32 @@ +/* + * Copyright 2026, the Chromium project authors. Please see the AUTHORS file + * for details. All rights reserved. Use of this source code is governed by a + * BSD-style license that can be found in the LICENSE file. + */ + +#ifndef FLUTTER_PLUGIN_FIREBASE_APP_CHECK_PLUGIN_H_ +#define FLUTTER_PLUGIN_FIREBASE_APP_CHECK_PLUGIN_H_ + +#include + +G_BEGIN_DECLS + +#ifdef FLUTTER_PLUGIN_IMPL +#define FLUTTER_PLUGIN_EXPORT __attribute__((visibility("default"))) +#else +#define FLUTTER_PLUGIN_EXPORT +#endif + +typedef struct _FirebaseAppCheckPlugin FirebaseAppCheckPlugin; +typedef struct { + GObjectClass parent_class; +} FirebaseAppCheckPluginClass; + +FLUTTER_PLUGIN_EXPORT GType firebase_app_check_plugin_get_type(); + +FLUTTER_PLUGIN_EXPORT void firebase_app_check_plugin_register_with_registrar( + FlPluginRegistrar* registrar); + +G_END_DECLS + +#endif // FLUTTER_PLUGIN_FIREBASE_APP_CHECK_PLUGIN_H_ diff --git a/packages/firebase_app_check/firebase_app_check/linux/messages.g.cc b/packages/firebase_app_check/firebase_app_check/linux/messages.g.cc new file mode 100644 index 000000000000..d94d74bf636f --- /dev/null +++ b/packages/firebase_app_check/firebase_app_check/linux/messages.g.cc @@ -0,0 +1,1087 @@ +// Copyright 2026, the Chromium project authors. Please see the AUTHORS file +// for details. All rights reserved. Use of this source code is governed by a +// BSD-style license that can be found in the LICENSE file. +// Autogenerated from Pigeon (v26.3.4), do not edit directly. +// See also: https://pub.dev/packages/pigeon + +#include "messages.g.h" + +#include + +#include +static guint G_GNUC_UNUSED flpigeon_hash_double(double v) { + if (std::isnan(v)) { + return static_cast(0x7FF80000); + } + if (v == 0.0) { + v = 0.0; + } + union { + double d; + uint64_t u; + } u; + u.d = v; + return static_cast(u.u ^ (u.u >> 32)); +} +static gboolean G_GNUC_UNUSED flpigeon_equals_double(double a, double b) { + return (a == b) || (std::isnan(a) && std::isnan(b)); +} +static gboolean G_GNUC_UNUSED flpigeon_deep_equals(FlValue* a, FlValue* b) { + if (a == b) { + return TRUE; + } + if (a == nullptr || b == nullptr) { + return FALSE; + } + if (fl_value_get_type(a) != fl_value_get_type(b)) { + return FALSE; + } + switch (fl_value_get_type(a)) { + case FL_VALUE_TYPE_NULL: + return TRUE; + case FL_VALUE_TYPE_BOOL: + return fl_value_get_bool(a) == fl_value_get_bool(b); + case FL_VALUE_TYPE_INT: + return fl_value_get_int(a) == fl_value_get_int(b); + case FL_VALUE_TYPE_FLOAT: { + return flpigeon_equals_double(fl_value_get_float(a), + fl_value_get_float(b)); + } + case FL_VALUE_TYPE_STRING: + return g_strcmp0(fl_value_get_string(a), fl_value_get_string(b)) == 0; + case FL_VALUE_TYPE_UINT8_LIST: + return fl_value_get_length(a) == fl_value_get_length(b) && + memcmp(fl_value_get_uint8_list(a), fl_value_get_uint8_list(b), + fl_value_get_length(a)) == 0; + case FL_VALUE_TYPE_INT32_LIST: + return fl_value_get_length(a) == fl_value_get_length(b) && + memcmp(fl_value_get_int32_list(a), fl_value_get_int32_list(b), + fl_value_get_length(a) * sizeof(int32_t)) == 0; + case FL_VALUE_TYPE_INT64_LIST: + return fl_value_get_length(a) == fl_value_get_length(b) && + memcmp(fl_value_get_int64_list(a), fl_value_get_int64_list(b), + fl_value_get_length(a) * sizeof(int64_t)) == 0; + case FL_VALUE_TYPE_FLOAT_LIST: { + size_t len = fl_value_get_length(a); + if (len != fl_value_get_length(b)) { + return FALSE; + } + const double* a_data = fl_value_get_float_list(a); + const double* b_data = fl_value_get_float_list(b); + for (size_t i = 0; i < len; i++) { + if (!flpigeon_equals_double(a_data[i], b_data[i])) { + return FALSE; + } + } + return TRUE; + } + case FL_VALUE_TYPE_LIST: { + size_t len = fl_value_get_length(a); + if (len != fl_value_get_length(b)) { + return FALSE; + } + for (size_t i = 0; i < len; i++) { + if (!flpigeon_deep_equals(fl_value_get_list_value(a, i), + fl_value_get_list_value(b, i))) { + return FALSE; + } + } + return TRUE; + } + case FL_VALUE_TYPE_MAP: { + size_t len = fl_value_get_length(a); + if (len != fl_value_get_length(b)) { + return FALSE; + } + for (size_t i = 0; i < len; i++) { + FlValue* key = fl_value_get_map_key(a, i); + FlValue* val = fl_value_get_map_value(a, i); + gboolean found = FALSE; + for (size_t j = 0; j < len; j++) { + FlValue* b_key = fl_value_get_map_key(b, j); + if (flpigeon_deep_equals(key, b_key)) { + FlValue* b_val = fl_value_get_map_value(b, j); + if (flpigeon_deep_equals(val, b_val)) { + found = TRUE; + break; + } else { + return FALSE; + } + } + } + if (!found) { + return FALSE; + } + } + return TRUE; + } + default: + return FALSE; + } + return FALSE; +} +static guint G_GNUC_UNUSED flpigeon_deep_hash(FlValue* value) { + if (value == nullptr) { + return 0; + } + switch (fl_value_get_type(value)) { + case FL_VALUE_TYPE_NULL: + return 0; + case FL_VALUE_TYPE_BOOL: + return fl_value_get_bool(value) ? 1231 : 1237; + case FL_VALUE_TYPE_INT: { + int64_t v = fl_value_get_int(value); + return static_cast(v ^ (v >> 32)); + } + case FL_VALUE_TYPE_FLOAT: + return flpigeon_hash_double(fl_value_get_float(value)); + case FL_VALUE_TYPE_STRING: + return g_str_hash(fl_value_get_string(value)); + case FL_VALUE_TYPE_UINT8_LIST: { + guint result = 1; + size_t len = fl_value_get_length(value); + const uint8_t* data = fl_value_get_uint8_list(value); + for (size_t i = 0; i < len; i++) { + result = result * 31 + data[i]; + } + return result; + } + case FL_VALUE_TYPE_INT32_LIST: { + guint result = 1; + size_t len = fl_value_get_length(value); + const int32_t* data = fl_value_get_int32_list(value); + for (size_t i = 0; i < len; i++) { + result = result * 31 + static_cast(data[i]); + } + return result; + } + case FL_VALUE_TYPE_INT64_LIST: { + guint result = 1; + size_t len = fl_value_get_length(value); + const int64_t* data = fl_value_get_int64_list(value); + for (size_t i = 0; i < len; i++) { + result = result * 31 + static_cast(data[i] ^ (data[i] >> 32)); + } + return result; + } + case FL_VALUE_TYPE_FLOAT_LIST: { + guint result = 1; + size_t len = fl_value_get_length(value); + const double* data = fl_value_get_float_list(value); + for (size_t i = 0; i < len; i++) { + result = result * 31 + flpigeon_hash_double(data[i]); + } + return result; + } + case FL_VALUE_TYPE_LIST: { + guint result = 1; + size_t len = fl_value_get_length(value); + for (size_t i = 0; i < len; i++) { + result = + result * 31 + flpigeon_deep_hash(fl_value_get_list_value(value, i)); + } + return result; + } + case FL_VALUE_TYPE_MAP: { + guint result = 0; + size_t len = fl_value_get_length(value); + for (size_t i = 0; i < len; i++) { + result += ((flpigeon_deep_hash(fl_value_get_map_key(value, i)) * 31) ^ + flpigeon_deep_hash(fl_value_get_map_value(value, i))); + } + return result; + } + default: + return static_cast(fl_value_get_type(value)); + } + return 0; +} + +struct _FirebaseAppCheckMessageCodec { + FlStandardMessageCodec parent_instance; +}; + +G_DEFINE_TYPE(FirebaseAppCheckMessageCodec, firebase_app_check_message_codec, + fl_standard_message_codec_get_type()) + +static gboolean firebase_app_check_message_codec_write_value( + FlStandardMessageCodec* codec, GByteArray* buffer, FlValue* value, + GError** error) { + if (fl_value_get_type(value) == FL_VALUE_TYPE_CUSTOM) { + switch (fl_value_get_custom_type(value)) {} + } + + return FL_STANDARD_MESSAGE_CODEC_CLASS( + firebase_app_check_message_codec_parent_class) + ->write_value(codec, buffer, value, error); +} + +static FlValue* firebase_app_check_message_codec_read_value_of_type( + FlStandardMessageCodec* codec, GBytes* buffer, size_t* offset, int type, + GError** error) { + switch (type) { + default: + return FL_STANDARD_MESSAGE_CODEC_CLASS( + firebase_app_check_message_codec_parent_class) + ->read_value_of_type(codec, buffer, offset, type, error); + } +} + +static void firebase_app_check_message_codec_init( + FirebaseAppCheckMessageCodec* self) {} + +static void firebase_app_check_message_codec_class_init( + FirebaseAppCheckMessageCodecClass* klass) { + FL_STANDARD_MESSAGE_CODEC_CLASS(klass)->write_value = + firebase_app_check_message_codec_write_value; + FL_STANDARD_MESSAGE_CODEC_CLASS(klass)->read_value_of_type = + firebase_app_check_message_codec_read_value_of_type; +} + +static FirebaseAppCheckMessageCodec* firebase_app_check_message_codec_new() { + FirebaseAppCheckMessageCodec* self = FIREBASE_APP_CHECK_MESSAGE_CODEC( + g_object_new(firebase_app_check_message_codec_get_type(), nullptr)); + return self; +} + +struct _FirebaseAppCheckFirebaseAppCheckHostApiResponseHandle { + GObject parent_instance; + + FlBasicMessageChannel* channel; + FlBasicMessageChannelResponseHandle* response_handle; +}; + +G_DEFINE_TYPE(FirebaseAppCheckFirebaseAppCheckHostApiResponseHandle, + firebase_app_check_firebase_app_check_host_api_response_handle, + G_TYPE_OBJECT) + +static void +firebase_app_check_firebase_app_check_host_api_response_handle_dispose( + GObject* object) { + FirebaseAppCheckFirebaseAppCheckHostApiResponseHandle* self = + FIREBASE_APP_CHECK_FIREBASE_APP_CHECK_HOST_API_RESPONSE_HANDLE(object); + g_clear_object(&self->channel); + g_clear_object(&self->response_handle); + G_OBJECT_CLASS( + firebase_app_check_firebase_app_check_host_api_response_handle_parent_class) + ->dispose(object); +} + +static void firebase_app_check_firebase_app_check_host_api_response_handle_init( + FirebaseAppCheckFirebaseAppCheckHostApiResponseHandle* self) {} + +static void +firebase_app_check_firebase_app_check_host_api_response_handle_class_init( + FirebaseAppCheckFirebaseAppCheckHostApiResponseHandleClass* klass) { + G_OBJECT_CLASS(klass)->dispose = + firebase_app_check_firebase_app_check_host_api_response_handle_dispose; +} + +static FirebaseAppCheckFirebaseAppCheckHostApiResponseHandle* +firebase_app_check_firebase_app_check_host_api_response_handle_new( + FlBasicMessageChannel* channel, + FlBasicMessageChannelResponseHandle* response_handle) { + FirebaseAppCheckFirebaseAppCheckHostApiResponseHandle* self = + FIREBASE_APP_CHECK_FIREBASE_APP_CHECK_HOST_API_RESPONSE_HANDLE(g_object_new( + firebase_app_check_firebase_app_check_host_api_response_handle_get_type(), + nullptr)); + self->channel = FL_BASIC_MESSAGE_CHANNEL(g_object_ref(channel)); + self->response_handle = + FL_BASIC_MESSAGE_CHANNEL_RESPONSE_HANDLE(g_object_ref(response_handle)); + return self; +} + +G_DECLARE_FINAL_TYPE( + FirebaseAppCheckFirebaseAppCheckHostApiActivateResponse, + firebase_app_check_firebase_app_check_host_api_activate_response, + FIREBASE_APP_CHECK, FIREBASE_APP_CHECK_HOST_API_ACTIVATE_RESPONSE, GObject) + +struct _FirebaseAppCheckFirebaseAppCheckHostApiActivateResponse { + GObject parent_instance; + + FlValue* value; +}; + +G_DEFINE_TYPE(FirebaseAppCheckFirebaseAppCheckHostApiActivateResponse, + firebase_app_check_firebase_app_check_host_api_activate_response, + G_TYPE_OBJECT) + +static void +firebase_app_check_firebase_app_check_host_api_activate_response_dispose( + GObject* object) { + FirebaseAppCheckFirebaseAppCheckHostApiActivateResponse* self = + FIREBASE_APP_CHECK_FIREBASE_APP_CHECK_HOST_API_ACTIVATE_RESPONSE(object); + g_clear_pointer(&self->value, fl_value_unref); + G_OBJECT_CLASS( + firebase_app_check_firebase_app_check_host_api_activate_response_parent_class) + ->dispose(object); +} + +static void +firebase_app_check_firebase_app_check_host_api_activate_response_init( + FirebaseAppCheckFirebaseAppCheckHostApiActivateResponse* self) {} + +static void +firebase_app_check_firebase_app_check_host_api_activate_response_class_init( + FirebaseAppCheckFirebaseAppCheckHostApiActivateResponseClass* klass) { + G_OBJECT_CLASS(klass)->dispose = + firebase_app_check_firebase_app_check_host_api_activate_response_dispose; +} + +static FirebaseAppCheckFirebaseAppCheckHostApiActivateResponse* +firebase_app_check_firebase_app_check_host_api_activate_response_new() { + FirebaseAppCheckFirebaseAppCheckHostApiActivateResponse* self = + FIREBASE_APP_CHECK_FIREBASE_APP_CHECK_HOST_API_ACTIVATE_RESPONSE(g_object_new( + firebase_app_check_firebase_app_check_host_api_activate_response_get_type(), + nullptr)); + self->value = fl_value_new_list(); + fl_value_append_take(self->value, fl_value_new_null()); + return self; +} + +static FirebaseAppCheckFirebaseAppCheckHostApiActivateResponse* +firebase_app_check_firebase_app_check_host_api_activate_response_new_error( + const gchar* code, const gchar* message, FlValue* details) { + FirebaseAppCheckFirebaseAppCheckHostApiActivateResponse* self = + FIREBASE_APP_CHECK_FIREBASE_APP_CHECK_HOST_API_ACTIVATE_RESPONSE(g_object_new( + firebase_app_check_firebase_app_check_host_api_activate_response_get_type(), + nullptr)); + self->value = fl_value_new_list(); + fl_value_append_take(self->value, fl_value_new_string(code)); + fl_value_append_take(self->value, + fl_value_new_string(message != nullptr ? message : "")); + fl_value_append_take(self->value, details != nullptr ? fl_value_ref(details) + : fl_value_new_null()); + return self; +} + +G_DECLARE_FINAL_TYPE( + FirebaseAppCheckFirebaseAppCheckHostApiGetTokenResponse, + firebase_app_check_firebase_app_check_host_api_get_token_response, + FIREBASE_APP_CHECK, FIREBASE_APP_CHECK_HOST_API_GET_TOKEN_RESPONSE, GObject) + +struct _FirebaseAppCheckFirebaseAppCheckHostApiGetTokenResponse { + GObject parent_instance; + + FlValue* value; +}; + +G_DEFINE_TYPE(FirebaseAppCheckFirebaseAppCheckHostApiGetTokenResponse, + firebase_app_check_firebase_app_check_host_api_get_token_response, + G_TYPE_OBJECT) + +static void +firebase_app_check_firebase_app_check_host_api_get_token_response_dispose( + GObject* object) { + FirebaseAppCheckFirebaseAppCheckHostApiGetTokenResponse* self = + FIREBASE_APP_CHECK_FIREBASE_APP_CHECK_HOST_API_GET_TOKEN_RESPONSE(object); + g_clear_pointer(&self->value, fl_value_unref); + G_OBJECT_CLASS( + firebase_app_check_firebase_app_check_host_api_get_token_response_parent_class) + ->dispose(object); +} + +static void +firebase_app_check_firebase_app_check_host_api_get_token_response_init( + FirebaseAppCheckFirebaseAppCheckHostApiGetTokenResponse* self) {} + +static void +firebase_app_check_firebase_app_check_host_api_get_token_response_class_init( + FirebaseAppCheckFirebaseAppCheckHostApiGetTokenResponseClass* klass) { + G_OBJECT_CLASS(klass)->dispose = + firebase_app_check_firebase_app_check_host_api_get_token_response_dispose; +} + +static FirebaseAppCheckFirebaseAppCheckHostApiGetTokenResponse* +firebase_app_check_firebase_app_check_host_api_get_token_response_new( + const gchar* return_value) { + FirebaseAppCheckFirebaseAppCheckHostApiGetTokenResponse* self = + FIREBASE_APP_CHECK_FIREBASE_APP_CHECK_HOST_API_GET_TOKEN_RESPONSE(g_object_new( + firebase_app_check_firebase_app_check_host_api_get_token_response_get_type(), + nullptr)); + self->value = fl_value_new_list(); + fl_value_append_take(self->value, return_value != nullptr + ? fl_value_new_string(return_value) + : fl_value_new_null()); + return self; +} + +static FirebaseAppCheckFirebaseAppCheckHostApiGetTokenResponse* +firebase_app_check_firebase_app_check_host_api_get_token_response_new_error( + const gchar* code, const gchar* message, FlValue* details) { + FirebaseAppCheckFirebaseAppCheckHostApiGetTokenResponse* self = + FIREBASE_APP_CHECK_FIREBASE_APP_CHECK_HOST_API_GET_TOKEN_RESPONSE(g_object_new( + firebase_app_check_firebase_app_check_host_api_get_token_response_get_type(), + nullptr)); + self->value = fl_value_new_list(); + fl_value_append_take(self->value, fl_value_new_string(code)); + fl_value_append_take(self->value, + fl_value_new_string(message != nullptr ? message : "")); + fl_value_append_take(self->value, details != nullptr ? fl_value_ref(details) + : fl_value_new_null()); + return self; +} + +G_DECLARE_FINAL_TYPE( + FirebaseAppCheckFirebaseAppCheckHostApiSetTokenAutoRefreshEnabledResponse, + firebase_app_check_firebase_app_check_host_api_set_token_auto_refresh_enabled_response, + FIREBASE_APP_CHECK, + FIREBASE_APP_CHECK_HOST_API_SET_TOKEN_AUTO_REFRESH_ENABLED_RESPONSE, + GObject) + +struct + _FirebaseAppCheckFirebaseAppCheckHostApiSetTokenAutoRefreshEnabledResponse { + GObject parent_instance; + + FlValue* value; +}; + +G_DEFINE_TYPE( + FirebaseAppCheckFirebaseAppCheckHostApiSetTokenAutoRefreshEnabledResponse, + firebase_app_check_firebase_app_check_host_api_set_token_auto_refresh_enabled_response, + G_TYPE_OBJECT) + +static void +firebase_app_check_firebase_app_check_host_api_set_token_auto_refresh_enabled_response_dispose( + GObject* object) { + FirebaseAppCheckFirebaseAppCheckHostApiSetTokenAutoRefreshEnabledResponse* self = + FIREBASE_APP_CHECK_FIREBASE_APP_CHECK_HOST_API_SET_TOKEN_AUTO_REFRESH_ENABLED_RESPONSE( + object); + g_clear_pointer(&self->value, fl_value_unref); + G_OBJECT_CLASS( + firebase_app_check_firebase_app_check_host_api_set_token_auto_refresh_enabled_response_parent_class) + ->dispose(object); +} + +static void +firebase_app_check_firebase_app_check_host_api_set_token_auto_refresh_enabled_response_init( + FirebaseAppCheckFirebaseAppCheckHostApiSetTokenAutoRefreshEnabledResponse* + self) {} + +static void +firebase_app_check_firebase_app_check_host_api_set_token_auto_refresh_enabled_response_class_init( + FirebaseAppCheckFirebaseAppCheckHostApiSetTokenAutoRefreshEnabledResponseClass* + klass) { + G_OBJECT_CLASS(klass)->dispose = + firebase_app_check_firebase_app_check_host_api_set_token_auto_refresh_enabled_response_dispose; +} + +static FirebaseAppCheckFirebaseAppCheckHostApiSetTokenAutoRefreshEnabledResponse* +firebase_app_check_firebase_app_check_host_api_set_token_auto_refresh_enabled_response_new() { + FirebaseAppCheckFirebaseAppCheckHostApiSetTokenAutoRefreshEnabledResponse* self = + FIREBASE_APP_CHECK_FIREBASE_APP_CHECK_HOST_API_SET_TOKEN_AUTO_REFRESH_ENABLED_RESPONSE( + g_object_new( + firebase_app_check_firebase_app_check_host_api_set_token_auto_refresh_enabled_response_get_type(), + nullptr)); + self->value = fl_value_new_list(); + fl_value_append_take(self->value, fl_value_new_null()); + return self; +} + +static FirebaseAppCheckFirebaseAppCheckHostApiSetTokenAutoRefreshEnabledResponse* +firebase_app_check_firebase_app_check_host_api_set_token_auto_refresh_enabled_response_new_error( + const gchar* code, const gchar* message, FlValue* details) { + FirebaseAppCheckFirebaseAppCheckHostApiSetTokenAutoRefreshEnabledResponse* self = + FIREBASE_APP_CHECK_FIREBASE_APP_CHECK_HOST_API_SET_TOKEN_AUTO_REFRESH_ENABLED_RESPONSE( + g_object_new( + firebase_app_check_firebase_app_check_host_api_set_token_auto_refresh_enabled_response_get_type(), + nullptr)); + self->value = fl_value_new_list(); + fl_value_append_take(self->value, fl_value_new_string(code)); + fl_value_append_take(self->value, + fl_value_new_string(message != nullptr ? message : "")); + fl_value_append_take(self->value, details != nullptr ? fl_value_ref(details) + : fl_value_new_null()); + return self; +} + +G_DECLARE_FINAL_TYPE( + FirebaseAppCheckFirebaseAppCheckHostApiRegisterTokenListenerResponse, + firebase_app_check_firebase_app_check_host_api_register_token_listener_response, + FIREBASE_APP_CHECK, + FIREBASE_APP_CHECK_HOST_API_REGISTER_TOKEN_LISTENER_RESPONSE, GObject) + +struct _FirebaseAppCheckFirebaseAppCheckHostApiRegisterTokenListenerResponse { + GObject parent_instance; + + FlValue* value; +}; + +G_DEFINE_TYPE( + FirebaseAppCheckFirebaseAppCheckHostApiRegisterTokenListenerResponse, + firebase_app_check_firebase_app_check_host_api_register_token_listener_response, + G_TYPE_OBJECT) + +static void +firebase_app_check_firebase_app_check_host_api_register_token_listener_response_dispose( + GObject* object) { + FirebaseAppCheckFirebaseAppCheckHostApiRegisterTokenListenerResponse* self = + FIREBASE_APP_CHECK_FIREBASE_APP_CHECK_HOST_API_REGISTER_TOKEN_LISTENER_RESPONSE( + object); + g_clear_pointer(&self->value, fl_value_unref); + G_OBJECT_CLASS( + firebase_app_check_firebase_app_check_host_api_register_token_listener_response_parent_class) + ->dispose(object); +} + +static void +firebase_app_check_firebase_app_check_host_api_register_token_listener_response_init( + FirebaseAppCheckFirebaseAppCheckHostApiRegisterTokenListenerResponse* + self) {} + +static void +firebase_app_check_firebase_app_check_host_api_register_token_listener_response_class_init( + FirebaseAppCheckFirebaseAppCheckHostApiRegisterTokenListenerResponseClass* + klass) { + G_OBJECT_CLASS(klass)->dispose = + firebase_app_check_firebase_app_check_host_api_register_token_listener_response_dispose; +} + +static FirebaseAppCheckFirebaseAppCheckHostApiRegisterTokenListenerResponse* +firebase_app_check_firebase_app_check_host_api_register_token_listener_response_new( + const gchar* return_value) { + FirebaseAppCheckFirebaseAppCheckHostApiRegisterTokenListenerResponse* self = + FIREBASE_APP_CHECK_FIREBASE_APP_CHECK_HOST_API_REGISTER_TOKEN_LISTENER_RESPONSE( + g_object_new( + firebase_app_check_firebase_app_check_host_api_register_token_listener_response_get_type(), + nullptr)); + self->value = fl_value_new_list(); + fl_value_append_take(self->value, fl_value_new_string(return_value)); + return self; +} + +static FirebaseAppCheckFirebaseAppCheckHostApiRegisterTokenListenerResponse* +firebase_app_check_firebase_app_check_host_api_register_token_listener_response_new_error( + const gchar* code, const gchar* message, FlValue* details) { + FirebaseAppCheckFirebaseAppCheckHostApiRegisterTokenListenerResponse* self = + FIREBASE_APP_CHECK_FIREBASE_APP_CHECK_HOST_API_REGISTER_TOKEN_LISTENER_RESPONSE( + g_object_new( + firebase_app_check_firebase_app_check_host_api_register_token_listener_response_get_type(), + nullptr)); + self->value = fl_value_new_list(); + fl_value_append_take(self->value, fl_value_new_string(code)); + fl_value_append_take(self->value, + fl_value_new_string(message != nullptr ? message : "")); + fl_value_append_take(self->value, details != nullptr ? fl_value_ref(details) + : fl_value_new_null()); + return self; +} + +G_DECLARE_FINAL_TYPE( + FirebaseAppCheckFirebaseAppCheckHostApiGetLimitedUseAppCheckTokenResponse, + firebase_app_check_firebase_app_check_host_api_get_limited_use_app_check_token_response, + FIREBASE_APP_CHECK, + FIREBASE_APP_CHECK_HOST_API_GET_LIMITED_USE_APP_CHECK_TOKEN_RESPONSE, + GObject) + +struct + _FirebaseAppCheckFirebaseAppCheckHostApiGetLimitedUseAppCheckTokenResponse { + GObject parent_instance; + + FlValue* value; +}; + +G_DEFINE_TYPE( + FirebaseAppCheckFirebaseAppCheckHostApiGetLimitedUseAppCheckTokenResponse, + firebase_app_check_firebase_app_check_host_api_get_limited_use_app_check_token_response, + G_TYPE_OBJECT) + +static void +firebase_app_check_firebase_app_check_host_api_get_limited_use_app_check_token_response_dispose( + GObject* object) { + FirebaseAppCheckFirebaseAppCheckHostApiGetLimitedUseAppCheckTokenResponse* self = + FIREBASE_APP_CHECK_FIREBASE_APP_CHECK_HOST_API_GET_LIMITED_USE_APP_CHECK_TOKEN_RESPONSE( + object); + g_clear_pointer(&self->value, fl_value_unref); + G_OBJECT_CLASS( + firebase_app_check_firebase_app_check_host_api_get_limited_use_app_check_token_response_parent_class) + ->dispose(object); +} + +static void +firebase_app_check_firebase_app_check_host_api_get_limited_use_app_check_token_response_init( + FirebaseAppCheckFirebaseAppCheckHostApiGetLimitedUseAppCheckTokenResponse* + self) {} + +static void +firebase_app_check_firebase_app_check_host_api_get_limited_use_app_check_token_response_class_init( + FirebaseAppCheckFirebaseAppCheckHostApiGetLimitedUseAppCheckTokenResponseClass* + klass) { + G_OBJECT_CLASS(klass)->dispose = + firebase_app_check_firebase_app_check_host_api_get_limited_use_app_check_token_response_dispose; +} + +static FirebaseAppCheckFirebaseAppCheckHostApiGetLimitedUseAppCheckTokenResponse* +firebase_app_check_firebase_app_check_host_api_get_limited_use_app_check_token_response_new( + const gchar* return_value) { + FirebaseAppCheckFirebaseAppCheckHostApiGetLimitedUseAppCheckTokenResponse* self = + FIREBASE_APP_CHECK_FIREBASE_APP_CHECK_HOST_API_GET_LIMITED_USE_APP_CHECK_TOKEN_RESPONSE( + g_object_new( + firebase_app_check_firebase_app_check_host_api_get_limited_use_app_check_token_response_get_type(), + nullptr)); + self->value = fl_value_new_list(); + fl_value_append_take(self->value, fl_value_new_string(return_value)); + return self; +} + +static FirebaseAppCheckFirebaseAppCheckHostApiGetLimitedUseAppCheckTokenResponse* +firebase_app_check_firebase_app_check_host_api_get_limited_use_app_check_token_response_new_error( + const gchar* code, const gchar* message, FlValue* details) { + FirebaseAppCheckFirebaseAppCheckHostApiGetLimitedUseAppCheckTokenResponse* self = + FIREBASE_APP_CHECK_FIREBASE_APP_CHECK_HOST_API_GET_LIMITED_USE_APP_CHECK_TOKEN_RESPONSE( + g_object_new( + firebase_app_check_firebase_app_check_host_api_get_limited_use_app_check_token_response_get_type(), + nullptr)); + self->value = fl_value_new_list(); + fl_value_append_take(self->value, fl_value_new_string(code)); + fl_value_append_take(self->value, + fl_value_new_string(message != nullptr ? message : "")); + fl_value_append_take(self->value, details != nullptr ? fl_value_ref(details) + : fl_value_new_null()); + return self; +} + +struct _FirebaseAppCheckFirebaseAppCheckHostApi { + GObject parent_instance; + + const FirebaseAppCheckFirebaseAppCheckHostApiVTable* vtable; + gpointer user_data; + GDestroyNotify user_data_free_func; +}; + +G_DEFINE_TYPE(FirebaseAppCheckFirebaseAppCheckHostApi, + firebase_app_check_firebase_app_check_host_api, G_TYPE_OBJECT) + +static void firebase_app_check_firebase_app_check_host_api_dispose( + GObject* object) { + FirebaseAppCheckFirebaseAppCheckHostApi* self = + FIREBASE_APP_CHECK_FIREBASE_APP_CHECK_HOST_API(object); + if (self->user_data != nullptr) { + self->user_data_free_func(self->user_data); + } + self->user_data = nullptr; + G_OBJECT_CLASS(firebase_app_check_firebase_app_check_host_api_parent_class) + ->dispose(object); +} + +static void firebase_app_check_firebase_app_check_host_api_init( + FirebaseAppCheckFirebaseAppCheckHostApi* self) {} + +static void firebase_app_check_firebase_app_check_host_api_class_init( + FirebaseAppCheckFirebaseAppCheckHostApiClass* klass) { + G_OBJECT_CLASS(klass)->dispose = + firebase_app_check_firebase_app_check_host_api_dispose; +} + +static FirebaseAppCheckFirebaseAppCheckHostApi* +firebase_app_check_firebase_app_check_host_api_new( + const FirebaseAppCheckFirebaseAppCheckHostApiVTable* vtable, + gpointer user_data, GDestroyNotify user_data_free_func) { + FirebaseAppCheckFirebaseAppCheckHostApi* self = + FIREBASE_APP_CHECK_FIREBASE_APP_CHECK_HOST_API(g_object_new( + firebase_app_check_firebase_app_check_host_api_get_type(), nullptr)); + self->vtable = vtable; + self->user_data = user_data; + self->user_data_free_func = user_data_free_func; + return self; +} + +static void firebase_app_check_firebase_app_check_host_api_activate_cb( + FlBasicMessageChannel* channel, FlValue* message_, + FlBasicMessageChannelResponseHandle* response_handle, gpointer user_data) { + FirebaseAppCheckFirebaseAppCheckHostApi* self = + FIREBASE_APP_CHECK_FIREBASE_APP_CHECK_HOST_API(user_data); + + if (self->vtable == nullptr || self->vtable->activate == nullptr) { + return; + } + + FlValue* value0 = fl_value_get_list_value(message_, 0); + const gchar* app_name = fl_value_get_string(value0); + FlValue* value1 = fl_value_get_list_value(message_, 1); + const gchar* android_provider = fl_value_get_string(value1); + FlValue* value2 = fl_value_get_list_value(message_, 2); + const gchar* apple_provider = fl_value_get_string(value2); + FlValue* value3 = fl_value_get_list_value(message_, 3); + const gchar* debug_token = fl_value_get_string(value3); + g_autoptr(FirebaseAppCheckFirebaseAppCheckHostApiResponseHandle) handle = + firebase_app_check_firebase_app_check_host_api_response_handle_new( + channel, response_handle); + self->vtable->activate(app_name, android_provider, apple_provider, + debug_token, handle, self->user_data); +} + +static void firebase_app_check_firebase_app_check_host_api_get_token_cb( + FlBasicMessageChannel* channel, FlValue* message_, + FlBasicMessageChannelResponseHandle* response_handle, gpointer user_data) { + FirebaseAppCheckFirebaseAppCheckHostApi* self = + FIREBASE_APP_CHECK_FIREBASE_APP_CHECK_HOST_API(user_data); + + if (self->vtable == nullptr || self->vtable->get_token == nullptr) { + return; + } + + FlValue* value0 = fl_value_get_list_value(message_, 0); + const gchar* app_name = fl_value_get_string(value0); + FlValue* value1 = fl_value_get_list_value(message_, 1); + gboolean force_refresh = fl_value_get_bool(value1); + g_autoptr(FirebaseAppCheckFirebaseAppCheckHostApiResponseHandle) handle = + firebase_app_check_firebase_app_check_host_api_response_handle_new( + channel, response_handle); + self->vtable->get_token(app_name, force_refresh, handle, self->user_data); +} + +static void +firebase_app_check_firebase_app_check_host_api_set_token_auto_refresh_enabled_cb( + FlBasicMessageChannel* channel, FlValue* message_, + FlBasicMessageChannelResponseHandle* response_handle, gpointer user_data) { + FirebaseAppCheckFirebaseAppCheckHostApi* self = + FIREBASE_APP_CHECK_FIREBASE_APP_CHECK_HOST_API(user_data); + + if (self->vtable == nullptr || + self->vtable->set_token_auto_refresh_enabled == nullptr) { + return; + } + + FlValue* value0 = fl_value_get_list_value(message_, 0); + const gchar* app_name = fl_value_get_string(value0); + FlValue* value1 = fl_value_get_list_value(message_, 1); + gboolean is_token_auto_refresh_enabled = fl_value_get_bool(value1); + g_autoptr(FirebaseAppCheckFirebaseAppCheckHostApiResponseHandle) handle = + firebase_app_check_firebase_app_check_host_api_response_handle_new( + channel, response_handle); + self->vtable->set_token_auto_refresh_enabled( + app_name, is_token_auto_refresh_enabled, handle, self->user_data); +} + +static void +firebase_app_check_firebase_app_check_host_api_register_token_listener_cb( + FlBasicMessageChannel* channel, FlValue* message_, + FlBasicMessageChannelResponseHandle* response_handle, gpointer user_data) { + FirebaseAppCheckFirebaseAppCheckHostApi* self = + FIREBASE_APP_CHECK_FIREBASE_APP_CHECK_HOST_API(user_data); + + if (self->vtable == nullptr || + self->vtable->register_token_listener == nullptr) { + return; + } + + FlValue* value0 = fl_value_get_list_value(message_, 0); + const gchar* app_name = fl_value_get_string(value0); + g_autoptr(FirebaseAppCheckFirebaseAppCheckHostApiResponseHandle) handle = + firebase_app_check_firebase_app_check_host_api_response_handle_new( + channel, response_handle); + self->vtable->register_token_listener(app_name, handle, self->user_data); +} + +static void +firebase_app_check_firebase_app_check_host_api_get_limited_use_app_check_token_cb( + FlBasicMessageChannel* channel, FlValue* message_, + FlBasicMessageChannelResponseHandle* response_handle, gpointer user_data) { + FirebaseAppCheckFirebaseAppCheckHostApi* self = + FIREBASE_APP_CHECK_FIREBASE_APP_CHECK_HOST_API(user_data); + + if (self->vtable == nullptr || + self->vtable->get_limited_use_app_check_token == nullptr) { + return; + } + + FlValue* value0 = fl_value_get_list_value(message_, 0); + const gchar* app_name = fl_value_get_string(value0); + g_autoptr(FirebaseAppCheckFirebaseAppCheckHostApiResponseHandle) handle = + firebase_app_check_firebase_app_check_host_api_response_handle_new( + channel, response_handle); + self->vtable->get_limited_use_app_check_token(app_name, handle, + self->user_data); +} + +void firebase_app_check_firebase_app_check_host_api_set_method_handlers( + FlBinaryMessenger* messenger, const gchar* suffix, + const FirebaseAppCheckFirebaseAppCheckHostApiVTable* vtable, + gpointer user_data, GDestroyNotify user_data_free_func) { + g_autofree gchar* dot_suffix = + suffix != nullptr ? g_strdup_printf(".%s", suffix) : g_strdup(""); + g_autoptr(FirebaseAppCheckFirebaseAppCheckHostApi) api_data = + firebase_app_check_firebase_app_check_host_api_new(vtable, user_data, + user_data_free_func); + + g_autoptr(FirebaseAppCheckMessageCodec) codec = + firebase_app_check_message_codec_new(); + g_autofree gchar* activate_channel_name = g_strdup_printf( + "dev.flutter.pigeon.firebase_app_check_platform_interface." + "FirebaseAppCheckHostApi.activate%s", + dot_suffix); + g_autoptr(FlBasicMessageChannel) activate_channel = + fl_basic_message_channel_new(messenger, activate_channel_name, + FL_MESSAGE_CODEC(codec)); + fl_basic_message_channel_set_message_handler( + activate_channel, + firebase_app_check_firebase_app_check_host_api_activate_cb, + g_object_ref(api_data), g_object_unref); + g_autofree gchar* get_token_channel_name = g_strdup_printf( + "dev.flutter.pigeon.firebase_app_check_platform_interface." + "FirebaseAppCheckHostApi.getToken%s", + dot_suffix); + g_autoptr(FlBasicMessageChannel) get_token_channel = + fl_basic_message_channel_new(messenger, get_token_channel_name, + FL_MESSAGE_CODEC(codec)); + fl_basic_message_channel_set_message_handler( + get_token_channel, + firebase_app_check_firebase_app_check_host_api_get_token_cb, + g_object_ref(api_data), g_object_unref); + g_autofree gchar* set_token_auto_refresh_enabled_channel_name = + g_strdup_printf( + "dev.flutter.pigeon.firebase_app_check_platform_interface." + "FirebaseAppCheckHostApi.setTokenAutoRefreshEnabled%s", + dot_suffix); + g_autoptr(FlBasicMessageChannel) set_token_auto_refresh_enabled_channel = + fl_basic_message_channel_new(messenger, + set_token_auto_refresh_enabled_channel_name, + FL_MESSAGE_CODEC(codec)); + fl_basic_message_channel_set_message_handler( + set_token_auto_refresh_enabled_channel, + firebase_app_check_firebase_app_check_host_api_set_token_auto_refresh_enabled_cb, + g_object_ref(api_data), g_object_unref); + g_autofree gchar* register_token_listener_channel_name = g_strdup_printf( + "dev.flutter.pigeon.firebase_app_check_platform_interface." + "FirebaseAppCheckHostApi.registerTokenListener%s", + dot_suffix); + g_autoptr(FlBasicMessageChannel) register_token_listener_channel = + fl_basic_message_channel_new(messenger, + register_token_listener_channel_name, + FL_MESSAGE_CODEC(codec)); + fl_basic_message_channel_set_message_handler( + register_token_listener_channel, + firebase_app_check_firebase_app_check_host_api_register_token_listener_cb, + g_object_ref(api_data), g_object_unref); + g_autofree gchar* get_limited_use_app_check_token_channel_name = + g_strdup_printf( + "dev.flutter.pigeon.firebase_app_check_platform_interface." + "FirebaseAppCheckHostApi.getLimitedUseAppCheckToken%s", + dot_suffix); + g_autoptr(FlBasicMessageChannel) get_limited_use_app_check_token_channel = + fl_basic_message_channel_new(messenger, + get_limited_use_app_check_token_channel_name, + FL_MESSAGE_CODEC(codec)); + fl_basic_message_channel_set_message_handler( + get_limited_use_app_check_token_channel, + firebase_app_check_firebase_app_check_host_api_get_limited_use_app_check_token_cb, + g_object_ref(api_data), g_object_unref); +} + +void firebase_app_check_firebase_app_check_host_api_clear_method_handlers( + FlBinaryMessenger* messenger, const gchar* suffix) { + g_autofree gchar* dot_suffix = + suffix != nullptr ? g_strdup_printf(".%s", suffix) : g_strdup(""); + + g_autoptr(FirebaseAppCheckMessageCodec) codec = + firebase_app_check_message_codec_new(); + g_autofree gchar* activate_channel_name = g_strdup_printf( + "dev.flutter.pigeon.firebase_app_check_platform_interface." + "FirebaseAppCheckHostApi.activate%s", + dot_suffix); + g_autoptr(FlBasicMessageChannel) activate_channel = + fl_basic_message_channel_new(messenger, activate_channel_name, + FL_MESSAGE_CODEC(codec)); + fl_basic_message_channel_set_message_handler(activate_channel, nullptr, + nullptr, nullptr); + g_autofree gchar* get_token_channel_name = g_strdup_printf( + "dev.flutter.pigeon.firebase_app_check_platform_interface." + "FirebaseAppCheckHostApi.getToken%s", + dot_suffix); + g_autoptr(FlBasicMessageChannel) get_token_channel = + fl_basic_message_channel_new(messenger, get_token_channel_name, + FL_MESSAGE_CODEC(codec)); + fl_basic_message_channel_set_message_handler(get_token_channel, nullptr, + nullptr, nullptr); + g_autofree gchar* set_token_auto_refresh_enabled_channel_name = + g_strdup_printf( + "dev.flutter.pigeon.firebase_app_check_platform_interface." + "FirebaseAppCheckHostApi.setTokenAutoRefreshEnabled%s", + dot_suffix); + g_autoptr(FlBasicMessageChannel) set_token_auto_refresh_enabled_channel = + fl_basic_message_channel_new(messenger, + set_token_auto_refresh_enabled_channel_name, + FL_MESSAGE_CODEC(codec)); + fl_basic_message_channel_set_message_handler( + set_token_auto_refresh_enabled_channel, nullptr, nullptr, nullptr); + g_autofree gchar* register_token_listener_channel_name = g_strdup_printf( + "dev.flutter.pigeon.firebase_app_check_platform_interface." + "FirebaseAppCheckHostApi.registerTokenListener%s", + dot_suffix); + g_autoptr(FlBasicMessageChannel) register_token_listener_channel = + fl_basic_message_channel_new(messenger, + register_token_listener_channel_name, + FL_MESSAGE_CODEC(codec)); + fl_basic_message_channel_set_message_handler(register_token_listener_channel, + nullptr, nullptr, nullptr); + g_autofree gchar* get_limited_use_app_check_token_channel_name = + g_strdup_printf( + "dev.flutter.pigeon.firebase_app_check_platform_interface." + "FirebaseAppCheckHostApi.getLimitedUseAppCheckToken%s", + dot_suffix); + g_autoptr(FlBasicMessageChannel) get_limited_use_app_check_token_channel = + fl_basic_message_channel_new(messenger, + get_limited_use_app_check_token_channel_name, + FL_MESSAGE_CODEC(codec)); + fl_basic_message_channel_set_message_handler( + get_limited_use_app_check_token_channel, nullptr, nullptr, nullptr); +} + +void firebase_app_check_firebase_app_check_host_api_respond_activate( + FirebaseAppCheckFirebaseAppCheckHostApiResponseHandle* response_handle) { + g_autoptr(FirebaseAppCheckFirebaseAppCheckHostApiActivateResponse) response = + firebase_app_check_firebase_app_check_host_api_activate_response_new(); + g_autoptr(GError) error = nullptr; + if (!fl_basic_message_channel_respond(response_handle->channel, + response_handle->response_handle, + response->value, &error)) { + g_warning("Failed to send response to %s.%s: %s", "FirebaseAppCheckHostApi", + "activate", error->message); + } +} + +void firebase_app_check_firebase_app_check_host_api_respond_error_activate( + FirebaseAppCheckFirebaseAppCheckHostApiResponseHandle* response_handle, + const gchar* code, const gchar* message, FlValue* details) { + g_autoptr(FirebaseAppCheckFirebaseAppCheckHostApiActivateResponse) response = + firebase_app_check_firebase_app_check_host_api_activate_response_new_error( + code, message, details); + g_autoptr(GError) error = nullptr; + if (!fl_basic_message_channel_respond(response_handle->channel, + response_handle->response_handle, + response->value, &error)) { + g_warning("Failed to send response to %s.%s: %s", "FirebaseAppCheckHostApi", + "activate", error->message); + } +} + +void firebase_app_check_firebase_app_check_host_api_respond_get_token( + FirebaseAppCheckFirebaseAppCheckHostApiResponseHandle* response_handle, + const gchar* return_value) { + g_autoptr(FirebaseAppCheckFirebaseAppCheckHostApiGetTokenResponse) response = + firebase_app_check_firebase_app_check_host_api_get_token_response_new( + return_value); + g_autoptr(GError) error = nullptr; + if (!fl_basic_message_channel_respond(response_handle->channel, + response_handle->response_handle, + response->value, &error)) { + g_warning("Failed to send response to %s.%s: %s", "FirebaseAppCheckHostApi", + "getToken", error->message); + } +} + +void firebase_app_check_firebase_app_check_host_api_respond_error_get_token( + FirebaseAppCheckFirebaseAppCheckHostApiResponseHandle* response_handle, + const gchar* code, const gchar* message, FlValue* details) { + g_autoptr(FirebaseAppCheckFirebaseAppCheckHostApiGetTokenResponse) response = + firebase_app_check_firebase_app_check_host_api_get_token_response_new_error( + code, message, details); + g_autoptr(GError) error = nullptr; + if (!fl_basic_message_channel_respond(response_handle->channel, + response_handle->response_handle, + response->value, &error)) { + g_warning("Failed to send response to %s.%s: %s", "FirebaseAppCheckHostApi", + "getToken", error->message); + } +} + +void firebase_app_check_firebase_app_check_host_api_respond_set_token_auto_refresh_enabled( + FirebaseAppCheckFirebaseAppCheckHostApiResponseHandle* response_handle) { + g_autoptr( + FirebaseAppCheckFirebaseAppCheckHostApiSetTokenAutoRefreshEnabledResponse) + response = + firebase_app_check_firebase_app_check_host_api_set_token_auto_refresh_enabled_response_new(); + g_autoptr(GError) error = nullptr; + if (!fl_basic_message_channel_respond(response_handle->channel, + response_handle->response_handle, + response->value, &error)) { + g_warning("Failed to send response to %s.%s: %s", "FirebaseAppCheckHostApi", + "setTokenAutoRefreshEnabled", error->message); + } +} + +void firebase_app_check_firebase_app_check_host_api_respond_error_set_token_auto_refresh_enabled( + FirebaseAppCheckFirebaseAppCheckHostApiResponseHandle* response_handle, + const gchar* code, const gchar* message, FlValue* details) { + g_autoptr( + FirebaseAppCheckFirebaseAppCheckHostApiSetTokenAutoRefreshEnabledResponse) + response = + firebase_app_check_firebase_app_check_host_api_set_token_auto_refresh_enabled_response_new_error( + code, message, details); + g_autoptr(GError) error = nullptr; + if (!fl_basic_message_channel_respond(response_handle->channel, + response_handle->response_handle, + response->value, &error)) { + g_warning("Failed to send response to %s.%s: %s", "FirebaseAppCheckHostApi", + "setTokenAutoRefreshEnabled", error->message); + } +} + +void firebase_app_check_firebase_app_check_host_api_respond_register_token_listener( + FirebaseAppCheckFirebaseAppCheckHostApiResponseHandle* response_handle, + const gchar* return_value) { + g_autoptr( + FirebaseAppCheckFirebaseAppCheckHostApiRegisterTokenListenerResponse) + response = + firebase_app_check_firebase_app_check_host_api_register_token_listener_response_new( + return_value); + g_autoptr(GError) error = nullptr; + if (!fl_basic_message_channel_respond(response_handle->channel, + response_handle->response_handle, + response->value, &error)) { + g_warning("Failed to send response to %s.%s: %s", "FirebaseAppCheckHostApi", + "registerTokenListener", error->message); + } +} + +void firebase_app_check_firebase_app_check_host_api_respond_error_register_token_listener( + FirebaseAppCheckFirebaseAppCheckHostApiResponseHandle* response_handle, + const gchar* code, const gchar* message, FlValue* details) { + g_autoptr( + FirebaseAppCheckFirebaseAppCheckHostApiRegisterTokenListenerResponse) + response = + firebase_app_check_firebase_app_check_host_api_register_token_listener_response_new_error( + code, message, details); + g_autoptr(GError) error = nullptr; + if (!fl_basic_message_channel_respond(response_handle->channel, + response_handle->response_handle, + response->value, &error)) { + g_warning("Failed to send response to %s.%s: %s", "FirebaseAppCheckHostApi", + "registerTokenListener", error->message); + } +} + +void firebase_app_check_firebase_app_check_host_api_respond_get_limited_use_app_check_token( + FirebaseAppCheckFirebaseAppCheckHostApiResponseHandle* response_handle, + const gchar* return_value) { + g_autoptr( + FirebaseAppCheckFirebaseAppCheckHostApiGetLimitedUseAppCheckTokenResponse) + response = + firebase_app_check_firebase_app_check_host_api_get_limited_use_app_check_token_response_new( + return_value); + g_autoptr(GError) error = nullptr; + if (!fl_basic_message_channel_respond(response_handle->channel, + response_handle->response_handle, + response->value, &error)) { + g_warning("Failed to send response to %s.%s: %s", "FirebaseAppCheckHostApi", + "getLimitedUseAppCheckToken", error->message); + } +} + +void firebase_app_check_firebase_app_check_host_api_respond_error_get_limited_use_app_check_token( + FirebaseAppCheckFirebaseAppCheckHostApiResponseHandle* response_handle, + const gchar* code, const gchar* message, FlValue* details) { + g_autoptr( + FirebaseAppCheckFirebaseAppCheckHostApiGetLimitedUseAppCheckTokenResponse) + response = + firebase_app_check_firebase_app_check_host_api_get_limited_use_app_check_token_response_new_error( + code, message, details); + g_autoptr(GError) error = nullptr; + if (!fl_basic_message_channel_respond(response_handle->channel, + response_handle->response_handle, + response->value, &error)) { + g_warning("Failed to send response to %s.%s: %s", "FirebaseAppCheckHostApi", + "getLimitedUseAppCheckToken", error->message); + } +} diff --git a/packages/firebase_app_check/firebase_app_check/linux/messages.g.h b/packages/firebase_app_check/firebase_app_check/linux/messages.g.h new file mode 100644 index 000000000000..437a9fc92ad4 --- /dev/null +++ b/packages/firebase_app_check/firebase_app_check/linux/messages.g.h @@ -0,0 +1,203 @@ +// Copyright 2026, the Chromium project authors. Please see the AUTHORS file +// for details. All rights reserved. Use of this source code is governed by a +// BSD-style license that can be found in the LICENSE file. +// Autogenerated from Pigeon (v26.3.4), do not edit directly. +// See also: https://pub.dev/packages/pigeon + +#ifndef PIGEON_MESSAGES_G_H_ +#define PIGEON_MESSAGES_G_H_ + +#include + +G_BEGIN_DECLS + +G_DECLARE_FINAL_TYPE(FirebaseAppCheckMessageCodec, + firebase_app_check_message_codec, FIREBASE_APP_CHECK, + MESSAGE_CODEC, FlStandardMessageCodec) + +G_DECLARE_FINAL_TYPE(FirebaseAppCheckFirebaseAppCheckHostApi, + firebase_app_check_firebase_app_check_host_api, + FIREBASE_APP_CHECK, FIREBASE_APP_CHECK_HOST_API, GObject) + +G_DECLARE_FINAL_TYPE( + FirebaseAppCheckFirebaseAppCheckHostApiResponseHandle, + firebase_app_check_firebase_app_check_host_api_response_handle, + FIREBASE_APP_CHECK, FIREBASE_APP_CHECK_HOST_API_RESPONSE_HANDLE, GObject) + +/** + * FirebaseAppCheckFirebaseAppCheckHostApiVTable: + * + * Table of functions exposed by FirebaseAppCheckHostApi to be implemented by + * the API provider. + */ +typedef struct { + void (*activate)( + const gchar* app_name, const gchar* android_provider, + const gchar* apple_provider, const gchar* debug_token, + FirebaseAppCheckFirebaseAppCheckHostApiResponseHandle* response_handle, + gpointer user_data); + void (*get_token)( + const gchar* app_name, gboolean force_refresh, + FirebaseAppCheckFirebaseAppCheckHostApiResponseHandle* response_handle, + gpointer user_data); + void (*set_token_auto_refresh_enabled)( + const gchar* app_name, gboolean is_token_auto_refresh_enabled, + FirebaseAppCheckFirebaseAppCheckHostApiResponseHandle* response_handle, + gpointer user_data); + void (*register_token_listener)( + const gchar* app_name, + FirebaseAppCheckFirebaseAppCheckHostApiResponseHandle* response_handle, + gpointer user_data); + void (*get_limited_use_app_check_token)( + const gchar* app_name, + FirebaseAppCheckFirebaseAppCheckHostApiResponseHandle* response_handle, + gpointer user_data); +} FirebaseAppCheckFirebaseAppCheckHostApiVTable; + +/** + * firebase_app_check_firebase_app_check_host_api_set_method_handlers: + * + * @messenger: an #FlBinaryMessenger. + * @suffix: (allow-none): a suffix to add to the API or %NULL for none. + * @vtable: implementations of the methods in this API. + * @user_data: (closure): user data to pass to the functions in @vtable. + * @user_data_free_func: (allow-none): a function which gets called to free + * @user_data, or %NULL. + * + * Connects the method handlers in the FirebaseAppCheckHostApi API. + */ +void firebase_app_check_firebase_app_check_host_api_set_method_handlers( + FlBinaryMessenger* messenger, const gchar* suffix, + const FirebaseAppCheckFirebaseAppCheckHostApiVTable* vtable, + gpointer user_data, GDestroyNotify user_data_free_func); + +/** + * firebase_app_check_firebase_app_check_host_api_clear_method_handlers: + * + * @messenger: an #FlBinaryMessenger. + * @suffix: (allow-none): a suffix to add to the API or %NULL for none. + * + * Clears the method handlers in the FirebaseAppCheckHostApi API. + */ +void firebase_app_check_firebase_app_check_host_api_clear_method_handlers( + FlBinaryMessenger* messenger, const gchar* suffix); + +/** + * firebase_app_check_firebase_app_check_host_api_respond_activate: + * @response_handle: a #FirebaseAppCheckFirebaseAppCheckHostApiResponseHandle. + * + * Responds to FirebaseAppCheckHostApi.activate. + */ +void firebase_app_check_firebase_app_check_host_api_respond_activate( + FirebaseAppCheckFirebaseAppCheckHostApiResponseHandle* response_handle); + +/** + * firebase_app_check_firebase_app_check_host_api_respond_error_activate: + * @response_handle: a #FirebaseAppCheckFirebaseAppCheckHostApiResponseHandle. + * @code: error code. + * @message: error message. + * @details: (allow-none): error details or %NULL. + * + * Responds with an error to FirebaseAppCheckHostApi.activate. + */ +void firebase_app_check_firebase_app_check_host_api_respond_error_activate( + FirebaseAppCheckFirebaseAppCheckHostApiResponseHandle* response_handle, + const gchar* code, const gchar* message, FlValue* details); + +/** + * firebase_app_check_firebase_app_check_host_api_respond_get_token: + * @response_handle: a #FirebaseAppCheckFirebaseAppCheckHostApiResponseHandle. + * @return_value: location to write the value returned by this method. + * + * Responds to FirebaseAppCheckHostApi.getToken. + */ +void firebase_app_check_firebase_app_check_host_api_respond_get_token( + FirebaseAppCheckFirebaseAppCheckHostApiResponseHandle* response_handle, + const gchar* return_value); + +/** + * firebase_app_check_firebase_app_check_host_api_respond_error_get_token: + * @response_handle: a #FirebaseAppCheckFirebaseAppCheckHostApiResponseHandle. + * @code: error code. + * @message: error message. + * @details: (allow-none): error details or %NULL. + * + * Responds with an error to FirebaseAppCheckHostApi.getToken. + */ +void firebase_app_check_firebase_app_check_host_api_respond_error_get_token( + FirebaseAppCheckFirebaseAppCheckHostApiResponseHandle* response_handle, + const gchar* code, const gchar* message, FlValue* details); + +/** + * firebase_app_check_firebase_app_check_host_api_respond_set_token_auto_refresh_enabled: + * @response_handle: a #FirebaseAppCheckFirebaseAppCheckHostApiResponseHandle. + * + * Responds to FirebaseAppCheckHostApi.setTokenAutoRefreshEnabled. + */ +void firebase_app_check_firebase_app_check_host_api_respond_set_token_auto_refresh_enabled( + FirebaseAppCheckFirebaseAppCheckHostApiResponseHandle* response_handle); + +/** + * firebase_app_check_firebase_app_check_host_api_respond_error_set_token_auto_refresh_enabled: + * @response_handle: a #FirebaseAppCheckFirebaseAppCheckHostApiResponseHandle. + * @code: error code. + * @message: error message. + * @details: (allow-none): error details or %NULL. + * + * Responds with an error to FirebaseAppCheckHostApi.setTokenAutoRefreshEnabled. + */ +void firebase_app_check_firebase_app_check_host_api_respond_error_set_token_auto_refresh_enabled( + FirebaseAppCheckFirebaseAppCheckHostApiResponseHandle* response_handle, + const gchar* code, const gchar* message, FlValue* details); + +/** + * firebase_app_check_firebase_app_check_host_api_respond_register_token_listener: + * @response_handle: a #FirebaseAppCheckFirebaseAppCheckHostApiResponseHandle. + * @return_value: location to write the value returned by this method. + * + * Responds to FirebaseAppCheckHostApi.registerTokenListener. + */ +void firebase_app_check_firebase_app_check_host_api_respond_register_token_listener( + FirebaseAppCheckFirebaseAppCheckHostApiResponseHandle* response_handle, + const gchar* return_value); + +/** + * firebase_app_check_firebase_app_check_host_api_respond_error_register_token_listener: + * @response_handle: a #FirebaseAppCheckFirebaseAppCheckHostApiResponseHandle. + * @code: error code. + * @message: error message. + * @details: (allow-none): error details or %NULL. + * + * Responds with an error to FirebaseAppCheckHostApi.registerTokenListener. + */ +void firebase_app_check_firebase_app_check_host_api_respond_error_register_token_listener( + FirebaseAppCheckFirebaseAppCheckHostApiResponseHandle* response_handle, + const gchar* code, const gchar* message, FlValue* details); + +/** + * firebase_app_check_firebase_app_check_host_api_respond_get_limited_use_app_check_token: + * @response_handle: a #FirebaseAppCheckFirebaseAppCheckHostApiResponseHandle. + * @return_value: location to write the value returned by this method. + * + * Responds to FirebaseAppCheckHostApi.getLimitedUseAppCheckToken. + */ +void firebase_app_check_firebase_app_check_host_api_respond_get_limited_use_app_check_token( + FirebaseAppCheckFirebaseAppCheckHostApiResponseHandle* response_handle, + const gchar* return_value); + +/** + * firebase_app_check_firebase_app_check_host_api_respond_error_get_limited_use_app_check_token: + * @response_handle: a #FirebaseAppCheckFirebaseAppCheckHostApiResponseHandle. + * @code: error code. + * @message: error message. + * @details: (allow-none): error details or %NULL. + * + * Responds with an error to FirebaseAppCheckHostApi.getLimitedUseAppCheckToken. + */ +void firebase_app_check_firebase_app_check_host_api_respond_error_get_limited_use_app_check_token( + FirebaseAppCheckFirebaseAppCheckHostApiResponseHandle* response_handle, + const gchar* code, const gchar* message, FlValue* details); + +G_END_DECLS + +#endif // PIGEON_MESSAGES_G_H_ diff --git a/packages/firebase_app_check/firebase_app_check/linux/plugin_version.h.in b/packages/firebase_app_check/firebase_app_check/linux/plugin_version.h.in new file mode 100644 index 000000000000..c692c1b3c1b1 --- /dev/null +++ b/packages/firebase_app_check/firebase_app_check/linux/plugin_version.h.in @@ -0,0 +1,13 @@ +// Copyright 2026, the Chromium project authors. Please see the AUTHORS file +// for details. All rights reserved. Use of this source code is governed by a +// BSD-style license that can be found in the LICENSE file. + +#ifndef PLUGIN_VERSION_CONFIG_H +#define PLUGIN_VERSION_CONFIG_H + +namespace firebase_app_check_linux { + +std::string getPluginVersion() { return "@PLUGIN_VERSION@"; } +} // namespace firebase_app_check_linux + +#endif // PLUGIN_VERSION_CONFIG_H diff --git a/packages/firebase_app_check/firebase_app_check/pubspec.yaml b/packages/firebase_app_check/firebase_app_check/pubspec.yaml index 0c74f49c0347..5a33f429e728 100644 --- a/packages/firebase_app_check/firebase_app_check/pubspec.yaml +++ b/packages/firebase_app_check/firebase_app_check/pubspec.yaml @@ -40,6 +40,8 @@ flutter: pluginClass: FirebaseAppCheckPlugin ios: pluginClass: FirebaseAppCheckPlugin + linux: + pluginClass: FirebaseAppCheckPlugin macos: pluginClass: FirebaseAppCheckPlugin web: diff --git a/packages/firebase_app_check/firebase_app_check_platform_interface/pigeons/messages.dart b/packages/firebase_app_check/firebase_app_check_platform_interface/pigeons/messages.dart index e84ff78ab5f4..b419b91c3c13 100644 --- a/packages/firebase_app_check/firebase_app_check_platform_interface/pigeons/messages.dart +++ b/packages/firebase_app_check/firebase_app_check_platform_interface/pigeons/messages.dart @@ -18,6 +18,12 @@ import 'package:pigeon/pigeon.dart'; cppHeaderOut: '../firebase_app_check/windows/messages.g.h', cppSourceOut: '../firebase_app_check/windows/messages.g.cpp', cppOptions: CppOptions(namespace: 'firebase_app_check_windows'), + gobjectHeaderOut: '../firebase_app_check/linux/messages.g.h', + gobjectSourceOut: '../firebase_app_check/linux/messages.g.cc', + gobjectOptions: GObjectOptions( + headerIncludePath: 'messages.g.h', + module: 'FirebaseAppCheck', + ), copyrightHeader: 'pigeons/copyright.txt', ), ) diff --git a/packages/firebase_auth/firebase_auth/example/.metadata b/packages/firebase_auth/firebase_auth/example/.metadata index 784ce1298249..2feffa0e65e4 100644 --- a/packages/firebase_auth/firebase_auth/example/.metadata +++ b/packages/firebase_auth/firebase_auth/example/.metadata @@ -18,6 +18,9 @@ migration: - platform: web create_revision: a14f74ff3a1cbd521163c5f03d68113d50af93d3 base_revision: a14f74ff3a1cbd521163c5f03d68113d50af93d3 + - platform: linux + create_revision: ad70ec4617166f1c38e5d2bfd388af71fda14f06 + base_revision: ad70ec4617166f1c38e5d2bfd388af71fda14f06 # User provided section diff --git a/packages/firebase_auth/firebase_auth/example/lib/firebase_options.dart b/packages/firebase_auth/firebase_auth/example/lib/firebase_options.dart index ba1a88dc9937..3e3f2547c6f6 100644 --- a/packages/firebase_auth/firebase_auth/example/lib/firebase_options.dart +++ b/packages/firebase_auth/firebase_auth/example/lib/firebase_options.dart @@ -32,11 +32,9 @@ class DefaultFirebaseOptions { return macos; case TargetPlatform.windows: return macos; + // TODO: Remove when FlutterFire CLI supports Linux case TargetPlatform.linux: - throw UnsupportedError( - 'DefaultFirebaseOptions have not been configured for linux - ' - 'you can reconfigure this by running the FlutterFire CLI again.', - ); + return android; default: throw UnsupportedError( 'DefaultFirebaseOptions are not supported for this platform.', diff --git a/packages/firebase_auth/firebase_auth/example/linux/.gitignore b/packages/firebase_auth/firebase_auth/example/linux/.gitignore new file mode 100644 index 000000000000..d3896c98444f --- /dev/null +++ b/packages/firebase_auth/firebase_auth/example/linux/.gitignore @@ -0,0 +1 @@ +flutter/ephemeral diff --git a/packages/firebase_auth/firebase_auth/example/linux/CMakeLists.txt b/packages/firebase_auth/firebase_auth/example/linux/CMakeLists.txt new file mode 100644 index 000000000000..01999257adf7 --- /dev/null +++ b/packages/firebase_auth/firebase_auth/example/linux/CMakeLists.txt @@ -0,0 +1,128 @@ +# Project-level configuration. +cmake_minimum_required(VERSION 3.13) +project(runner LANGUAGES CXX) + +# The name of the executable created for the application. Change this to change +# the on-disk name of your application. +set(BINARY_NAME "firebase_auth_example") +# The unique GTK application identifier for this application. See: +# https://wiki.gnome.org/HowDoI/ChooseApplicationID +set(APPLICATION_ID "io.flutter.plugins.firebase.auth.firebase_auth_example") + +# Explicitly opt in to modern CMake behaviors to avoid warnings with recent +# versions of CMake. +cmake_policy(SET CMP0063 NEW) + +# Load bundled libraries from the lib/ directory relative to the binary. +set(CMAKE_INSTALL_RPATH "$ORIGIN/lib") + +# Root filesystem for cross-building. +if(FLUTTER_TARGET_PLATFORM_SYSROOT) + set(CMAKE_SYSROOT ${FLUTTER_TARGET_PLATFORM_SYSROOT}) + set(CMAKE_FIND_ROOT_PATH ${CMAKE_SYSROOT}) + set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER) + set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY) + set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY) + set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY) +endif() + +# Define build configuration options. +if(NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES) + set(CMAKE_BUILD_TYPE "Debug" CACHE + STRING "Flutter build mode" FORCE) + set_property(CACHE CMAKE_BUILD_TYPE PROPERTY STRINGS + "Debug" "Profile" "Release") +endif() + +# Compilation settings that should be applied to most targets. +# +# Be cautious about adding new options here, as plugins use this function by +# default. In most cases, you should add new options to specific targets instead +# of modifying this function. +function(APPLY_STANDARD_SETTINGS TARGET) + target_compile_features(${TARGET} PUBLIC cxx_std_14) + target_compile_options(${TARGET} PRIVATE -Wall -Werror) + target_compile_options(${TARGET} PRIVATE "$<$>:-O3>") + target_compile_definitions(${TARGET} PRIVATE "$<$>:NDEBUG>") +endfunction() + +# Flutter library and tool build rules. +set(FLUTTER_MANAGED_DIR "${CMAKE_CURRENT_SOURCE_DIR}/flutter") +add_subdirectory(${FLUTTER_MANAGED_DIR}) + +# System-level dependencies. +find_package(PkgConfig REQUIRED) +pkg_check_modules(GTK REQUIRED IMPORTED_TARGET gtk+-3.0) + +# Application build; see runner/CMakeLists.txt. +add_subdirectory("runner") + +# Run the Flutter tool portions of the build. This must not be removed. +add_dependencies(${BINARY_NAME} flutter_assemble) + +# Only the install-generated bundle's copy of the executable will launch +# correctly, since the resources must in the right relative locations. To avoid +# people trying to run the unbundled copy, put it in a subdirectory instead of +# the default top-level location. +set_target_properties(${BINARY_NAME} + PROPERTIES + RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/intermediates_do_not_run" +) + + +# Generated plugin build rules, which manage building the plugins and adding +# them to the application. +include(flutter/generated_plugins.cmake) + + +# === Installation === +# By default, "installing" just makes a relocatable bundle in the build +# directory. +set(BUILD_BUNDLE_DIR "${PROJECT_BINARY_DIR}/bundle") +if(CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT) + set(CMAKE_INSTALL_PREFIX "${BUILD_BUNDLE_DIR}" CACHE PATH "..." FORCE) +endif() + +# Start with a clean build bundle directory every time. +install(CODE " + file(REMOVE_RECURSE \"${BUILD_BUNDLE_DIR}/\") + " COMPONENT Runtime) + +set(INSTALL_BUNDLE_DATA_DIR "${CMAKE_INSTALL_PREFIX}/data") +set(INSTALL_BUNDLE_LIB_DIR "${CMAKE_INSTALL_PREFIX}/lib") + +install(TARGETS ${BINARY_NAME} RUNTIME DESTINATION "${CMAKE_INSTALL_PREFIX}" + COMPONENT Runtime) + +install(FILES "${FLUTTER_ICU_DATA_FILE}" DESTINATION "${INSTALL_BUNDLE_DATA_DIR}" + COMPONENT Runtime) + +install(FILES "${FLUTTER_LIBRARY}" DESTINATION "${INSTALL_BUNDLE_LIB_DIR}" + COMPONENT Runtime) + +foreach(bundled_library ${PLUGIN_BUNDLED_LIBRARIES}) + install(FILES "${bundled_library}" + DESTINATION "${INSTALL_BUNDLE_LIB_DIR}" + COMPONENT Runtime) +endforeach(bundled_library) + +# Copy the native assets provided by the build.dart from all packages. +set(NATIVE_ASSETS_DIR "${PROJECT_BUILD_DIR}native_assets/linux/") +install(DIRECTORY "${NATIVE_ASSETS_DIR}" + DESTINATION "${INSTALL_BUNDLE_LIB_DIR}" + COMPONENT Runtime) + +# Fully re-copy the assets directory on each build to avoid having stale files +# from a previous install. +set(FLUTTER_ASSET_DIR_NAME "flutter_assets") +install(CODE " + file(REMOVE_RECURSE \"${INSTALL_BUNDLE_DATA_DIR}/${FLUTTER_ASSET_DIR_NAME}\") + " COMPONENT Runtime) +install(DIRECTORY "${PROJECT_BUILD_DIR}/${FLUTTER_ASSET_DIR_NAME}" + DESTINATION "${INSTALL_BUNDLE_DATA_DIR}" COMPONENT Runtime) + +# Install the AOT library on non-Debug builds only. +if(NOT CMAKE_BUILD_TYPE MATCHES "Debug") + install(FILES "${AOT_LIBRARY}" DESTINATION "${INSTALL_BUNDLE_LIB_DIR}" + COMPONENT Runtime) +endif() diff --git a/packages/firebase_auth/firebase_auth/example/linux/flutter/CMakeLists.txt b/packages/firebase_auth/firebase_auth/example/linux/flutter/CMakeLists.txt new file mode 100644 index 000000000000..d5bd01648a96 --- /dev/null +++ b/packages/firebase_auth/firebase_auth/example/linux/flutter/CMakeLists.txt @@ -0,0 +1,88 @@ +# This file controls Flutter-level build steps. It should not be edited. +cmake_minimum_required(VERSION 3.10) + +set(EPHEMERAL_DIR "${CMAKE_CURRENT_SOURCE_DIR}/ephemeral") + +# Configuration provided via flutter tool. +include(${EPHEMERAL_DIR}/generated_config.cmake) + +# TODO: Move the rest of this into files in ephemeral. See +# https://github.com/flutter/flutter/issues/57146. + +# Serves the same purpose as list(TRANSFORM ... PREPEND ...), +# which isn't available in 3.10. +function(list_prepend LIST_NAME PREFIX) + set(NEW_LIST "") + foreach(element ${${LIST_NAME}}) + list(APPEND NEW_LIST "${PREFIX}${element}") + endforeach(element) + set(${LIST_NAME} "${NEW_LIST}" PARENT_SCOPE) +endfunction() + +# === Flutter Library === +# System-level dependencies. +find_package(PkgConfig REQUIRED) +pkg_check_modules(GTK REQUIRED IMPORTED_TARGET gtk+-3.0) +pkg_check_modules(GLIB REQUIRED IMPORTED_TARGET glib-2.0) +pkg_check_modules(GIO REQUIRED IMPORTED_TARGET gio-2.0) + +set(FLUTTER_LIBRARY "${EPHEMERAL_DIR}/libflutter_linux_gtk.so") + +# Published to parent scope for install step. +set(FLUTTER_LIBRARY ${FLUTTER_LIBRARY} PARENT_SCOPE) +set(FLUTTER_ICU_DATA_FILE "${EPHEMERAL_DIR}/icudtl.dat" PARENT_SCOPE) +set(PROJECT_BUILD_DIR "${PROJECT_DIR}/build/" PARENT_SCOPE) +set(AOT_LIBRARY "${PROJECT_DIR}/build/lib/libapp.so" PARENT_SCOPE) + +list(APPEND FLUTTER_LIBRARY_HEADERS + "fl_basic_message_channel.h" + "fl_binary_codec.h" + "fl_binary_messenger.h" + "fl_dart_project.h" + "fl_engine.h" + "fl_json_message_codec.h" + "fl_json_method_codec.h" + "fl_message_codec.h" + "fl_method_call.h" + "fl_method_channel.h" + "fl_method_codec.h" + "fl_method_response.h" + "fl_plugin_registrar.h" + "fl_plugin_registry.h" + "fl_standard_message_codec.h" + "fl_standard_method_codec.h" + "fl_string_codec.h" + "fl_value.h" + "fl_view.h" + "flutter_linux.h" +) +list_prepend(FLUTTER_LIBRARY_HEADERS "${EPHEMERAL_DIR}/flutter_linux/") +add_library(flutter INTERFACE) +target_include_directories(flutter INTERFACE + "${EPHEMERAL_DIR}" +) +target_link_libraries(flutter INTERFACE "${FLUTTER_LIBRARY}") +target_link_libraries(flutter INTERFACE + PkgConfig::GTK + PkgConfig::GLIB + PkgConfig::GIO +) +add_dependencies(flutter flutter_assemble) + +# === Flutter tool backend === +# _phony_ is a non-existent file to force this command to run every time, +# since currently there's no way to get a full input/output list from the +# flutter tool. +add_custom_command( + OUTPUT ${FLUTTER_LIBRARY} ${FLUTTER_LIBRARY_HEADERS} + ${CMAKE_CURRENT_BINARY_DIR}/_phony_ + COMMAND ${CMAKE_COMMAND} -E env + ${FLUTTER_TOOL_ENVIRONMENT} + "${FLUTTER_ROOT}/packages/flutter_tools/bin/tool_backend.sh" + ${FLUTTER_TARGET_PLATFORM} ${CMAKE_BUILD_TYPE} + VERBATIM +) +add_custom_target(flutter_assemble DEPENDS + "${FLUTTER_LIBRARY}" + ${FLUTTER_LIBRARY_HEADERS} +) diff --git a/packages/firebase_auth/firebase_auth/example/linux/runner/CMakeLists.txt b/packages/firebase_auth/firebase_auth/example/linux/runner/CMakeLists.txt new file mode 100644 index 000000000000..e97dabc7028e --- /dev/null +++ b/packages/firebase_auth/firebase_auth/example/linux/runner/CMakeLists.txt @@ -0,0 +1,26 @@ +cmake_minimum_required(VERSION 3.13) +project(runner LANGUAGES CXX) + +# Define the application target. To change its name, change BINARY_NAME in the +# top-level CMakeLists.txt, not the value here, or `flutter run` will no longer +# work. +# +# Any new source files that you add to the application should be added here. +add_executable(${BINARY_NAME} + "main.cc" + "my_application.cc" + "${FLUTTER_MANAGED_DIR}/generated_plugin_registrant.cc" +) + +# Apply the standard set of build settings. This can be removed for applications +# that need different build settings. +apply_standard_settings(${BINARY_NAME}) + +# Add preprocessor definitions for the application ID. +add_definitions(-DAPPLICATION_ID="${APPLICATION_ID}") + +# Add dependency libraries. Add any application-specific dependencies here. +target_link_libraries(${BINARY_NAME} PRIVATE flutter) +target_link_libraries(${BINARY_NAME} PRIVATE PkgConfig::GTK) + +target_include_directories(${BINARY_NAME} PRIVATE "${CMAKE_SOURCE_DIR}") diff --git a/packages/firebase_auth/firebase_auth/example/linux/runner/main.cc b/packages/firebase_auth/firebase_auth/example/linux/runner/main.cc new file mode 100644 index 000000000000..54fde7b87fa0 --- /dev/null +++ b/packages/firebase_auth/firebase_auth/example/linux/runner/main.cc @@ -0,0 +1,10 @@ +// Copyright 2026, the Chromium project authors. Please see the AUTHORS file +// for details. All rights reserved. Use of this source code is governed by a +// BSD-style license that can be found in the LICENSE file. + +#include "my_application.h" + +int main(int argc, char** argv) { + g_autoptr(MyApplication) app = my_application_new(); + return g_application_run(G_APPLICATION(app), argc, argv); +} diff --git a/packages/firebase_auth/firebase_auth/example/linux/runner/my_application.cc b/packages/firebase_auth/firebase_auth/example/linux/runner/my_application.cc new file mode 100644 index 000000000000..10ce542af974 --- /dev/null +++ b/packages/firebase_auth/firebase_auth/example/linux/runner/my_application.cc @@ -0,0 +1,152 @@ +// Copyright 2026, the Chromium project authors. Please see the AUTHORS file +// for details. All rights reserved. Use of this source code is governed by a +// BSD-style license that can be found in the LICENSE file. + +#include "my_application.h" + +#include +#ifdef GDK_WINDOWING_X11 +#include +#endif + +#include "flutter/generated_plugin_registrant.h" + +struct _MyApplication { + GtkApplication parent_instance; + char** dart_entrypoint_arguments; +}; + +G_DEFINE_TYPE(MyApplication, my_application, GTK_TYPE_APPLICATION) + +// Called when first Flutter frame received. +static void first_frame_cb(MyApplication* self, FlView* view) { + gtk_widget_show(gtk_widget_get_toplevel(GTK_WIDGET(view))); +} + +// Implements GApplication::activate. +static void my_application_activate(GApplication* application) { + MyApplication* self = MY_APPLICATION(application); + GtkWindow* window = + GTK_WINDOW(gtk_application_window_new(GTK_APPLICATION(application))); + + // Use a header bar when running in GNOME as this is the common style used + // by applications and is the setup most users will be using (e.g. Ubuntu + // desktop). + // If running on X and not using GNOME then just use a traditional title bar + // in case the window manager does more exotic layout, e.g. tiling. + // If running on Wayland assume the header bar will work (may need changing + // if future cases occur). + gboolean use_header_bar = TRUE; +#ifdef GDK_WINDOWING_X11 + GdkScreen* screen = gtk_window_get_screen(window); + if (GDK_IS_X11_SCREEN(screen)) { + const gchar* wm_name = gdk_x11_screen_get_window_manager_name(screen); + if (g_strcmp0(wm_name, "GNOME Shell") != 0) { + use_header_bar = FALSE; + } + } +#endif + if (use_header_bar) { + GtkHeaderBar* header_bar = GTK_HEADER_BAR(gtk_header_bar_new()); + gtk_widget_show(GTK_WIDGET(header_bar)); + gtk_header_bar_set_title(header_bar, "firebase_auth_example"); + gtk_header_bar_set_show_close_button(header_bar, TRUE); + gtk_window_set_titlebar(window, GTK_WIDGET(header_bar)); + } else { + gtk_window_set_title(window, "firebase_auth_example"); + } + + gtk_window_set_default_size(window, 1280, 720); + + g_autoptr(FlDartProject) project = fl_dart_project_new(); + fl_dart_project_set_dart_entrypoint_arguments( + project, self->dart_entrypoint_arguments); + + FlView* view = fl_view_new(project); + GdkRGBA background_color; + // Background defaults to black, override it here if necessary, e.g. #00000000 + // for transparent. + gdk_rgba_parse(&background_color, "#000000"); + fl_view_set_background_color(view, &background_color); + gtk_widget_show(GTK_WIDGET(view)); + gtk_container_add(GTK_CONTAINER(window), GTK_WIDGET(view)); + + // Show the window when Flutter renders. + // Requires the view to be realized so we can start rendering. + g_signal_connect_swapped(view, "first-frame", G_CALLBACK(first_frame_cb), + self); + gtk_widget_realize(GTK_WIDGET(view)); + + fl_register_plugins(FL_PLUGIN_REGISTRY(view)); + + gtk_widget_grab_focus(GTK_WIDGET(view)); +} + +// Implements GApplication::local_command_line. +static gboolean my_application_local_command_line(GApplication* application, + gchar*** arguments, + int* exit_status) { + MyApplication* self = MY_APPLICATION(application); + // Strip out the first argument as it is the binary name. + self->dart_entrypoint_arguments = g_strdupv(*arguments + 1); + + g_autoptr(GError) error = nullptr; + if (!g_application_register(application, nullptr, &error)) { + g_warning("Failed to register: %s", error->message); + *exit_status = 1; + return TRUE; + } + + g_application_activate(application); + *exit_status = 0; + + return TRUE; +} + +// Implements GApplication::startup. +static void my_application_startup(GApplication* application) { + // MyApplication* self = MY_APPLICATION(object); + + // Perform any actions required at application startup. + + G_APPLICATION_CLASS(my_application_parent_class)->startup(application); +} + +// Implements GApplication::shutdown. +static void my_application_shutdown(GApplication* application) { + // MyApplication* self = MY_APPLICATION(object); + + // Perform any actions required at application shutdown. + + G_APPLICATION_CLASS(my_application_parent_class)->shutdown(application); +} + +// Implements GObject::dispose. +static void my_application_dispose(GObject* object) { + MyApplication* self = MY_APPLICATION(object); + g_clear_pointer(&self->dart_entrypoint_arguments, g_strfreev); + G_OBJECT_CLASS(my_application_parent_class)->dispose(object); +} + +static void my_application_class_init(MyApplicationClass* klass) { + G_APPLICATION_CLASS(klass)->activate = my_application_activate; + G_APPLICATION_CLASS(klass)->local_command_line = + my_application_local_command_line; + G_APPLICATION_CLASS(klass)->startup = my_application_startup; + G_APPLICATION_CLASS(klass)->shutdown = my_application_shutdown; + G_OBJECT_CLASS(klass)->dispose = my_application_dispose; +} + +static void my_application_init(MyApplication* self) {} + +MyApplication* my_application_new() { + // Set the program name to the application ID, which helps various systems + // like GTK and desktop environments map this running application to its + // corresponding .desktop file. This ensures better integration by allowing + // the application to be recognized beyond its binary name. + g_set_prgname(APPLICATION_ID); + + return MY_APPLICATION(g_object_new(my_application_get_type(), + "application-id", APPLICATION_ID, "flags", + G_APPLICATION_NON_UNIQUE, nullptr)); +} diff --git a/packages/firebase_auth/firebase_auth/example/linux/runner/my_application.h b/packages/firebase_auth/firebase_auth/example/linux/runner/my_application.h new file mode 100644 index 000000000000..a2ba75695cf5 --- /dev/null +++ b/packages/firebase_auth/firebase_auth/example/linux/runner/my_application.h @@ -0,0 +1,22 @@ +// Copyright 2026, the Chromium project authors. Please see the AUTHORS file +// for details. All rights reserved. Use of this source code is governed by a +// BSD-style license that can be found in the LICENSE file. + +#ifndef FLUTTER_MY_APPLICATION_H_ +#define FLUTTER_MY_APPLICATION_H_ + +#include + +G_DECLARE_FINAL_TYPE(MyApplication, my_application, MY, APPLICATION, + GtkApplication) + +/** + * my_application_new: + * + * Creates a new Flutter-based application. + * + * Returns: a new #MyApplication. + */ +MyApplication* my_application_new(); + +#endif // FLUTTER_MY_APPLICATION_H_ diff --git a/packages/firebase_auth/firebase_auth/example/pubspec.yaml b/packages/firebase_auth/firebase_auth/example/pubspec.yaml index cdbd0c86240a..0a8ecc9fc425 100644 --- a/packages/firebase_auth/firebase_auth/example/pubspec.yaml +++ b/packages/firebase_auth/firebase_auth/example/pubspec.yaml @@ -14,8 +14,8 @@ dependencies: flutter: sdk: flutter flutter_facebook_auth: ^7.1.5 - flutter_signin_button: ^2.0.0 - font_awesome_flutter: ^10.8.0 + flutter_signin_button: ^2.1.1 + font_awesome_flutter: ^11.0.0 google_sign_in: ^6.1.0 google_sign_in_dartio: ^0.3.0 diff --git a/packages/firebase_auth/firebase_auth/linux/CMakeLists.txt b/packages/firebase_auth/firebase_auth/linux/CMakeLists.txt new file mode 100644 index 000000000000..d9d4399d71ed --- /dev/null +++ b/packages/firebase_auth/firebase_auth/linux/CMakeLists.txt @@ -0,0 +1,96 @@ +# The Flutter tooling requires that developers have CMake 3.10 or later +# installed. You should not increase this version, as doing so will cause +# the plugin to fail to compile for some customers of the plugin. +cmake_minimum_required(VERSION 3.10) + +# Project-level configuration. +set(PROJECT_NAME "firebase_auth") +project(${PROJECT_NAME} LANGUAGES CXX) + +# This value is used when generating builds using this plugin, so it must +# not be changed +set(PLUGIN_NAME "firebase_auth_plugin") + +# Any new source files that you add to the plugin should be added here. +list(APPEND PLUGIN_SOURCES + "include/firebase_auth/firebase_auth_plugin.h" + "firebase_auth_plugin.cc" + "messages.g.cc" + "messages.g.h" +) + +# Read version from pubspec.yaml +file(STRINGS "../pubspec.yaml" pubspec_content) +foreach(line ${pubspec_content}) + string(FIND ${line} "version: " has_version) + + if("${has_version}" STREQUAL "0") + string(FIND ${line} ": " version_start_pos) + math(EXPR version_start_pos "${version_start_pos} + 2") + string(LENGTH ${line} version_end_pos) + math(EXPR len "${version_end_pos} - ${version_start_pos}") + string(SUBSTRING ${line} ${version_start_pos} ${len} PLUGIN_VERSION) + break() + endif() +endforeach(line) + +configure_file(plugin_version.h.in ${CMAKE_BINARY_DIR}/generated/firebase_auth/plugin_version.h) +include_directories(${CMAKE_BINARY_DIR}/generated/) + +# Define the plugin library target. Its name must not be changed (see comment +# on PLUGIN_NAME above). +# +# This is deliberately a STATIC library (unlike the SHARED library in the +# Flutter Linux plugin template) to mirror the Windows implementation; see the +# explanation in firebase_core/linux/CMakeLists.txt. The Firebase C++ SDK is +# added (via add_subdirectory) by the firebase_core plugin, which also exports +# the SDK include directories through the firebase_core_plugin target, so it +# is not re-added here — mirroring how the Windows CMakeLists consumes the +# SDK targets set up by firebase_core. +add_library(${PLUGIN_NAME} STATIC + ${PLUGIN_SOURCES} + ${CMAKE_BINARY_DIR}/generated/firebase_auth/plugin_version.h +) + +# Apply a standard set of build settings that are configured in the +# application-level CMakeLists.txt. This can be removed for plugins that want +# full control over build settings. +apply_standard_settings(${PLUGIN_NAME}) + +# Symbols are hidden by default to reduce the chance of accidental conflicts +# between plugins. This should not be removed; any symbols that should be +# exported should be explicitly exported with the FLUTTER_PLUGIN_EXPORT macro. +set_target_properties(${PLUGIN_NAME} PROPERTIES + CXX_VISIBILITY_PRESET hidden + POSITION_INDEPENDENT_CODE ON) +target_compile_definitions(${PLUGIN_NAME} PUBLIC FLUTTER_PLUGIN_IMPL) + +# Enable firebase-cpp-sdk's platform logging api. +target_compile_definitions(${PLUGIN_NAME} PRIVATE -DINTERNAL_EXPERIMENTAL=1) + +# Source include directories and library dependencies. Add any plugin-specific +# dependencies here. +# +# The firebase_auth SDK target carries its own Linux-specific interface +# dependencies (libsecret-1 for credential persistence) via the SDK's own +# CMakeLists.txt, so they do not need to be repeated here. +# NOTE: the Firebase SDK product archives are linked exclusively by the +# firebase_core_plugin target, which wraps all of them in a single +# -Wl,--start-group/--end-group (the archives have circular symbol +# dependencies that an ordered per-plugin link line cannot satisfy). +set(firebase_libs firebase_core_plugin) +set(ADDITIONAL_LIBS pthread) +target_link_libraries(${PLUGIN_NAME} PRIVATE "${firebase_libs}" "${ADDITIONAL_LIBS}") + +target_include_directories(${PLUGIN_NAME} INTERFACE + "${CMAKE_CURRENT_SOURCE_DIR}/include") +target_link_libraries(${PLUGIN_NAME} PRIVATE flutter) +target_link_libraries(${PLUGIN_NAME} PRIVATE PkgConfig::GTK) + +# List of absolute paths to libraries that should be bundled with the plugin. +# This list could contain prebuilt libraries, or libraries created by an +# external build triggered from this build file. +set(firebase_auth_bundled_libraries + "" + PARENT_SCOPE +) diff --git a/packages/firebase_auth/firebase_auth/linux/firebase_auth_plugin.cc b/packages/firebase_auth/firebase_auth/linux/firebase_auth_plugin.cc new file mode 100644 index 000000000000..4dcad9071c41 --- /dev/null +++ b/packages/firebase_auth/firebase_auth/linux/firebase_auth_plugin.cc @@ -0,0 +1,1487 @@ +// Copyright 2026, the Chromium project authors. Please see the AUTHORS file +// for details. All rights reserved. Use of this source code is governed by a +// BSD-style license that can be found in the LICENSE file. + +#include "include/firebase_auth/firebase_auth_plugin.h" + +#include + +#include +#include +#include +#include +#include +#include + +#include "firebase/app.h" +#include "firebase/auth.h" +#include "firebase/future.h" +#include "firebase/log.h" +#include "firebase/util.h" +#include "firebase/variant.h" +#include "firebase_auth/plugin_version.h" +#include "firebase_core/firebase_core_plugin.h" +#include "firebase_core/flutter_firebase_plugin.h" +#include "messages.g.h" + +using ::firebase::App; +using ::firebase::auth::Auth; +using ::firebase::auth::AuthError; + +static const char kLibraryName[] = "flutter-fire-auth"; +static const char kFLTFirebaseAuthChannelName[] = "firebase_auth_plugin"; + +#define FIREBASE_AUTH_PLUGIN(obj) \ + (G_TYPE_CHECK_INSTANCE_CAST((obj), firebase_auth_plugin_get_type(), \ + FirebaseAuthPlugin)) + +struct _FirebaseAuthPlugin { + GObject parent_instance; +}; + +G_DEFINE_TYPE(FirebaseAuthPlugin, firebase_auth_plugin, g_object_get_type()) + +// The messenger is kept for the lifetime of the engine, mirroring the static +// binaryMessenger member of the Windows implementation. +static FlBinaryMessenger* g_binary_messenger = nullptr; + +// Runs a std::function on the main (GLib) thread. Firebase C++ futures +// complete on SDK worker threads, but the Flutter Linux embedder requires all +// messenger/event-channel calls to happen on the platform thread. +static gboolean RunOnMainThreadCb(gpointer user_data) { + auto* function = static_cast*>(user_data); + (*function)(); + delete function; + return G_SOURCE_REMOVE; +} + +static void PostToMainThread(std::function function) { + g_idle_add(RunOnMainThreadCb, new std::function(std::move(function))); +} + +static Auth* GetAuthFromPigeon(FirebaseAuthAuthPigeonFirebaseApp* pigeon_app) { + App* app = App::GetInstance( + firebase_auth_auth_pigeon_firebase_app_get_app_name(pigeon_app)); + return Auth::GetAuth(app); +} + +static std::string GetAuthErrorCode(AuthError auth_error) { + switch (auth_error) { + case firebase::auth::kAuthErrorInvalidCustomToken: + return "invalid-custom-token"; + case firebase::auth::kAuthErrorCustomTokenMismatch: + return "custom-token-mismatch"; + case firebase::auth::kAuthErrorInvalidEmail: + return "invalid-email"; + case firebase::auth::kAuthErrorInvalidCredential: + return "invalid-credential"; + case firebase::auth::kAuthErrorUserDisabled: + return "user-disabled"; + case firebase::auth::kAuthErrorEmailAlreadyInUse: + return "email-already-in-use"; + case firebase::auth::kAuthErrorWrongPassword: + return "wrong-password"; + case firebase::auth::kAuthErrorTooManyRequests: + return "too-many-requests"; + case firebase::auth::kAuthErrorAccountExistsWithDifferentCredentials: + return "account-exists-with-different-credentials"; + case firebase::auth::kAuthErrorRequiresRecentLogin: + return "requires-recent-login"; + case firebase::auth::kAuthErrorProviderAlreadyLinked: + return "provider-already-linked"; + case firebase::auth::kAuthErrorNoSuchProvider: + return "no-such-provider"; + case firebase::auth::kAuthErrorInvalidUserToken: + return "invalid-user-token"; + case firebase::auth::kAuthErrorUserTokenExpired: + return "user-token-expired"; + case firebase::auth::kAuthErrorUserNotFound: + return "user-not-found"; + case firebase::auth::kAuthErrorInvalidApiKey: + return "invalid-api-key"; + case firebase::auth::kAuthErrorCredentialAlreadyInUse: + return "credential-already-in-use"; + case firebase::auth::kAuthErrorOperationNotAllowed: + return "operation-not-allowed"; + case firebase::auth::kAuthErrorWeakPassword: + return "weak-password"; + case firebase::auth::kAuthErrorAppNotAuthorized: + return "app-not-authorized"; + case firebase::auth::kAuthErrorExpiredActionCode: + return "expired-action-code"; + case firebase::auth::kAuthErrorInvalidActionCode: + return "invalid-action-code"; + case firebase::auth::kAuthErrorInvalidMessagePayload: + return "invalid-message-payload"; + case firebase::auth::kAuthErrorInvalidSender: + return "invalid-sender"; + case firebase::auth::kAuthErrorInvalidRecipientEmail: + return "invalid-recipient-email"; + case firebase::auth::kAuthErrorUnauthorizedDomain: + return "unauthorized-domain"; + case firebase::auth::kAuthErrorInvalidContinueUri: + return "invalid-continue-uri"; + case firebase::auth::kAuthErrorMissingContinueUri: + return "missing-continue-uri"; + case firebase::auth::kAuthErrorMissingEmail: + return "missing-email"; + case firebase::auth::kAuthErrorMissingPhoneNumber: + return "missing-phone-number"; + case firebase::auth::kAuthErrorInvalidPhoneNumber: + return "invalid-phone-number"; + case firebase::auth::kAuthErrorMissingVerificationCode: + return "missing-verification-code"; + case firebase::auth::kAuthErrorInvalidVerificationCode: + return "invalid-verification-code"; + case firebase::auth::kAuthErrorMissingVerificationId: + return "missing-verification-id"; + case firebase::auth::kAuthErrorInvalidVerificationId: + return "invalid-verification-id"; + case firebase::auth::kAuthErrorSessionExpired: + return "session-expired"; + case firebase::auth::kAuthErrorQuotaExceeded: + return "quota-exceeded"; + case firebase::auth::kAuthErrorMissingAppCredential: + return "missing-app-credential"; + case firebase::auth::kAuthErrorInvalidAppCredential: + return "invalid-app-credential"; + case firebase::auth::kAuthErrorMissingClientIdentifier: + return "missing-client-identifier"; + case firebase::auth::kAuthErrorTenantIdMismatch: + return "tenant-id-mismatch"; + case firebase::auth::kAuthErrorUnsupportedTenantOperation: + return "unsupported-tenant-operation"; + case firebase::auth::kAuthErrorUserMismatch: + return "user-mismatch"; + case firebase::auth::kAuthErrorNetworkRequestFailed: + return "network-request-failed"; + case firebase::auth::kAuthErrorNoSignedInUser: + return "no-signed-in-user"; + case firebase::auth::kAuthErrorCancelled: + return "cancelled"; + + default: + return "unknown-error"; + } +} + +// Converts a firebase::Variant map into an FlValue map. +// Ownership: returns a new reference (transfer full). +static FlValue* ConvertToFlValue(const firebase::Variant& variant); + +static FlValue* ConvertToFlValueMap( + const std::map& original_map) { + FlValue* converted_map = fl_value_new_map(); + for (const auto& kv : original_map) { + fl_value_set_take(converted_map, ConvertToFlValue(kv.first), + ConvertToFlValue(kv.second)); + } + return converted_map; +} + +// Converts a firebase::Variant to an FlValue. +// Ownership: returns a new reference (transfer full). +static FlValue* ConvertToFlValue(const firebase::Variant& variant) { + switch (variant.type()) { + case firebase::Variant::kTypeNull: + return fl_value_new_null(); + case firebase::Variant::kTypeInt64: + return fl_value_new_int(variant.int64_value()); + case firebase::Variant::kTypeDouble: + return fl_value_new_float(variant.double_value()); + case firebase::Variant::kTypeBool: + return fl_value_new_bool(variant.bool_value()); + case firebase::Variant::kTypeStaticString: + return fl_value_new_string(variant.string_value()); + case firebase::Variant::kTypeMutableString: + return fl_value_new_string(variant.mutable_string().c_str()); + case firebase::Variant::kTypeMap: + return ConvertToFlValueMap(variant.map()); + case firebase::Variant::kTypeStaticBlob: + case firebase::Variant::kTypeMutableBlob: + return fl_value_new_uint8_list(variant.blob_data(), variant.blob_size()); + default: + return fl_value_new_null(); + } +} + +// Converts a firebase user to the pigeon InternalUserInfo type. +// Ownership: returns a new reference (transfer full). +static FirebaseAuthInternalUserInfo* ParseUserInfo( + const firebase::auth::User& user) { + int64_t creation_timestamp = user.metadata().creation_timestamp; + int64_t last_sign_in_timestamp = user.metadata().last_sign_in_timestamp; + return firebase_auth_internal_user_info_new( + user.uid().c_str(), user.email().c_str(), user.display_name().c_str(), + user.photo_url().c_str(), user.phone_number().c_str(), + user.is_anonymous(), user.is_email_verified(), user.provider_id().c_str(), + /* tenant_id= */ nullptr, /* refresh_token= */ nullptr, + &creation_timestamp, &last_sign_in_timestamp); +} + +// Converts a provider user info entry to an FlValue map. +// Ownership: returns a new reference (transfer full). +static FlValue* ParseUserInfoToMap( + const firebase::auth::UserInfoInterface& user_info) { + FlValue* map = fl_value_new_map(); + fl_value_set_take(map, fl_value_new_string("displayName"), + fl_value_new_string(user_info.display_name().c_str())); + fl_value_set_take(map, fl_value_new_string("email"), + fl_value_new_string(user_info.email().c_str())); + fl_value_set_take(map, fl_value_new_string("isEmailVerified"), + fl_value_new_bool(TRUE)); + fl_value_set_take(map, fl_value_new_string("phoneNumber"), + fl_value_new_string(user_info.phone_number().c_str())); + fl_value_set_take(map, fl_value_new_string("photoUrl"), + fl_value_new_string(user_info.photo_url().c_str())); + fl_value_set_take(map, fl_value_new_string("uid"), + fl_value_new_string(user_info.uid().c_str())); + fl_value_set_take(map, fl_value_new_string("providerId"), + fl_value_new_string(user_info.provider_id().c_str())); + fl_value_set_take(map, fl_value_new_string("isAnonymous"), + fl_value_new_bool(FALSE)); + return map; +} + +// Converts the provider data of a user to an FlValue list of maps. +// Ownership: returns a new reference (transfer full). +static FlValue* ParseProviderData(const firebase::auth::User& user) { + FlValue* output = fl_value_new_list(); + for (const firebase::auth::UserInfoInterface& user_info : + user.provider_data()) { + fl_value_append_take(output, ParseUserInfoToMap(user_info)); + } + return output; +} + +// Converts a firebase user to the pigeon InternalUserDetails type. +// Ownership: returns a new reference (transfer full). +static FirebaseAuthInternalUserDetails* ParseUserDetails( + const firebase::auth::User& user) { + g_autoptr(FirebaseAuthInternalUserInfo) user_info = ParseUserInfo(user); + g_autoptr(FlValue) provider_data = ParseProviderData(user); + return firebase_auth_internal_user_details_new(user_info, provider_data); +} + +// Converts firebase AdditionalUserInfo to the pigeon type. +// Ownership: returns a new reference (transfer full). +static FirebaseAuthInternalAdditionalUserInfo* ParseAdditionalUserInfo( + const firebase::auth::AdditionalUserInfo& additional_user_info) { + g_autoptr(FlValue) profile = + ConvertToFlValueMap(additional_user_info.profile); + // Cannot know if the user is new or not with current API. + return firebase_auth_internal_additional_user_info_new( + /* is_new_user= */ FALSE, additional_user_info.provider_id.c_str(), + additional_user_info.user_name.c_str(), + /* authorization_code= */ nullptr, profile); +} + +// Converts a firebase AuthResult to the pigeon InternalUserCredential type. +// Ownership: returns a new reference (transfer full). +static FirebaseAuthInternalUserCredential* ParseAuthResult( + const firebase::auth::AuthResult* auth_result) { + g_autoptr(FirebaseAuthInternalUserDetails) user = + ParseUserDetails(auth_result->user); + g_autoptr(FirebaseAuthInternalAdditionalUserInfo) additional_user_info = + ParseAdditionalUserInfo(auth_result->additional_user_info); + return firebase_auth_internal_user_credential_new(user, additional_user_info, + /* credential= */ nullptr); +} + +// Generic helpers to complete pigeon responses from firebase futures. +// +// The response handle is referenced for the duration of the asynchronous +// operation and released on the main thread after responding. `Handle` is one +// of the pigeon *ResponseHandle GObject types. + +template +using ErrorRespondFn = void (*)(Handle*, const gchar*, const gchar*, FlValue*); + +template +static void RespondFutureError(const firebase::FutureBase& completed_future, + Handle* response_handle, + ErrorRespondFn respond_error) { + std::string code = + GetAuthErrorCode(static_cast(completed_future.error())); + std::string message = completed_future.error_message() != nullptr + ? completed_future.error_message() + : ""; + PostToMainThread([response_handle, respond_error, code, message]() { + respond_error(response_handle, code.c_str(), message.c_str(), nullptr); + g_object_unref(response_handle); + }); +} + +// Completes a Future with an empty pigeon response. +template +static void CompleteVoidFuture(firebase::Future future, + Handle* response_handle, + void (*respond)(Handle*), + ErrorRespondFn respond_error) { + g_object_ref(response_handle); + future.OnCompletion([response_handle, respond, respond_error]( + const firebase::Future& completed_future) { + // We are probably in a different thread right now. + if (completed_future.error() == 0) { + PostToMainThread([response_handle, respond]() { + respond(response_handle); + g_object_unref(response_handle); + }); + } else { + RespondFutureError(completed_future, response_handle, respond_error); + } + }); +} + +// Completes a Future with an InternalUserCredential response. +template +static void CompleteAuthResultFuture( + firebase::Future future, + Handle* response_handle, + void (*respond)(Handle*, FirebaseAuthInternalUserCredential*), + ErrorRespondFn respond_error) { + g_object_ref(response_handle); + future.OnCompletion([response_handle, respond, respond_error]( + const firebase::Future& + completed_future) { + // We are probably in a different thread right now. + if (completed_future.error() == 0) { + FirebaseAuthInternalUserCredential* credential = + ParseAuthResult(completed_future.result()); + PostToMainThread([response_handle, respond, credential]() { + respond(response_handle, credential); + g_object_unref(credential); + g_object_unref(response_handle); + }); + } else { + RespondFutureError(completed_future, response_handle, respond_error); + } + }); +} + +// Completes a Future with an InternalUserDetails response built from the +// current user of the given auth instance. +template +static void CompleteUserDetailsFuture( + firebase::Future future, Auth* firebase_auth, Handle* response_handle, + void (*respond)(Handle*, FirebaseAuthInternalUserDetails*), + ErrorRespondFn respond_error) { + g_object_ref(response_handle); + future.OnCompletion([response_handle, firebase_auth, respond, respond_error]( + const firebase::Future& completed_future) { + // We are probably in a different thread right now. + if (completed_future.error() == 0) { + FirebaseAuthInternalUserDetails* user = + ParseUserDetails(firebase_auth->current_user()); + PostToMainThread([response_handle, respond, user]() { + respond(response_handle, user); + g_object_unref(user); + g_object_unref(response_handle); + }); + } else { + RespondFutureError(completed_future, response_handle, respond_error); + } + }); +} + +// Event channels (auth-state / id-token). + +// Builds the event payload sent on the auth-state and id-token event +// channels: {"user": [userInfoFieldList, providerData]} or {"user": null}. +// The user info field list mirrors the pigeon encoding of InternalUserInfo +// (fields in declaration order), which is what the Dart side decodes with +// InternalUserInfo.decode(). +// Ownership: returns a new reference (transfer full). +static FlValue* BuildUserEventPayload(Auth* auth) { + firebase::auth::User user = auth->current_user(); + + FlValue* event = fl_value_new_map(); + if (user.is_valid()) { + FlValue* user_info_list = fl_value_new_list(); + fl_value_append_take(user_info_list, + fl_value_new_string(user.uid().c_str())); + fl_value_append_take(user_info_list, + fl_value_new_string(user.email().c_str())); + fl_value_append_take(user_info_list, + fl_value_new_string(user.display_name().c_str())); + fl_value_append_take(user_info_list, + fl_value_new_string(user.photo_url().c_str())); + fl_value_append_take(user_info_list, + fl_value_new_string(user.phone_number().c_str())); + fl_value_append_take(user_info_list, + fl_value_new_bool(user.is_anonymous())); + fl_value_append_take(user_info_list, + fl_value_new_bool(user.is_email_verified())); + fl_value_append_take(user_info_list, + fl_value_new_string(user.provider_id().c_str())); + fl_value_append_take(user_info_list, fl_value_new_null()); // tenantId + fl_value_append_take(user_info_list, fl_value_new_null()); // refreshToken + fl_value_append_take(user_info_list, + fl_value_new_int(user.metadata().creation_timestamp)); + fl_value_append_take( + user_info_list, + fl_value_new_int(user.metadata().last_sign_in_timestamp)); + + FlValue* user_details = fl_value_new_list(); + fl_value_append_take(user_details, user_info_list); + fl_value_append_take(user_details, ParseProviderData(user)); + fl_value_set_take(event, fl_value_new_string("user"), user_details); + } else { + fl_value_set_take(event, fl_value_new_string("user"), fl_value_new_null()); + } + return event; +} + +struct AuthEventChannel; + +class FlutterIdTokenListener : public firebase::auth::IdTokenListener { + public: + explicit FlutterIdTokenListener(AuthEventChannel* channel) + : channel_(channel) {} + void OnIdTokenChanged(Auth* auth) override; + + private: + AuthEventChannel* channel_; +}; + +class FlutterAuthStateListener : public firebase::auth::AuthStateListener { + public: + explicit FlutterAuthStateListener(AuthEventChannel* channel) + : channel_(channel) {} + void OnAuthStateChanged(Auth* auth) override; + + private: + AuthEventChannel* channel_; +}; + +// State for one auth event channel. Channels are created on demand per app +// (and kind) and kept for the lifetime of the process, mirroring the Windows +// implementation which never destroys its event channels. +struct AuthEventChannel { + FlEventChannel* channel = nullptr; // owned + // The messenger the channel was created on. Identifies the owning engine so + // a cached channel is not reused after the engine (and its messenger) has + // been recreated. + FlBinaryMessenger* messenger = nullptr; // weak + Auth* auth = nullptr; + bool is_id_token_channel = false; + FlutterIdTokenListener* id_token_listener = nullptr; + FlutterAuthStateListener* auth_state_listener = nullptr; +}; + +static void SendAuthEvent(AuthEventChannel* event_channel, Auth* auth) { + FlValue* event = BuildUserEventPayload(auth); + PostToMainThread([event_channel, event]() { + fl_event_channel_send(event_channel->channel, event, nullptr, nullptr); + fl_value_unref(event); + }); +} + +void FlutterIdTokenListener::OnIdTokenChanged(Auth* auth) { + SendAuthEvent(channel_, auth); +} + +void FlutterAuthStateListener::OnAuthStateChanged(Auth* auth) { + SendAuthEvent(channel_, auth); +} + +static FlMethodErrorResponse* AuthEventChannelListenCb(FlEventChannel* channel, + FlValue* args, + gpointer user_data) { + auto* event_channel = static_cast(user_data); + if (event_channel->is_id_token_channel) { + if (event_channel->id_token_listener == nullptr) { + event_channel->id_token_listener = + new FlutterIdTokenListener(event_channel); + event_channel->auth->AddIdTokenListener(event_channel->id_token_listener); + } + } else { + if (event_channel->auth_state_listener == nullptr) { + event_channel->auth_state_listener = + new FlutterAuthStateListener(event_channel); + event_channel->auth->AddAuthStateListener( + event_channel->auth_state_listener); + } + } + return nullptr; +} + +static FlMethodErrorResponse* AuthEventChannelCancelCb(FlEventChannel* channel, + FlValue* args, + gpointer user_data) { + auto* event_channel = static_cast(user_data); + if (event_channel->id_token_listener != nullptr) { + event_channel->auth->RemoveIdTokenListener( + event_channel->id_token_listener); + delete event_channel->id_token_listener; + event_channel->id_token_listener = nullptr; + } + if (event_channel->auth_state_listener != nullptr) { + event_channel->auth->RemoveAuthStateListener( + event_channel->auth_state_listener); + delete event_channel->auth_state_listener; + event_channel->auth_state_listener = nullptr; + } + return nullptr; +} + +// Creates (or reuses) the event channel with the given name and returns its +// name. The channel and its state are intentionally kept alive for the +// process lifetime, like on Windows. +static std::string SetupAuthEventChannel(Auth* auth, const std::string& name, + bool is_id_token_channel) { + static std::unordered_map* channels = + new std::unordered_map(); + + auto existing = channels->find(name); + if (existing != channels->end()) { + if (existing->second->messenger == g_binary_messenger) { + return name; + } + // The engine was recreated: the cached channel is bound to the previous + // messenger and can no longer reach Dart. Detach its SDK listeners and + // build a fresh channel on the current messenger (mirroring Windows, + // which rebinds the event channel on every registration call). The stale + // struct and FlEventChannel are intentionally leaked because queued + // main-thread events may still reference them. + AuthEventChannel* stale = existing->second; + if (stale->id_token_listener != nullptr) { + stale->auth->RemoveIdTokenListener(stale->id_token_listener); + stale->id_token_listener = nullptr; + } + if (stale->auth_state_listener != nullptr) { + stale->auth->RemoveAuthStateListener(stale->auth_state_listener); + stale->auth_state_listener = nullptr; + } + channels->erase(existing); + } + + auto* event_channel = new AuthEventChannel(); + event_channel->messenger = g_binary_messenger; + event_channel->auth = auth; + event_channel->is_id_token_channel = is_id_token_channel; + + g_autoptr(FlStandardMethodCodec) codec = fl_standard_method_codec_new(); + event_channel->channel = fl_event_channel_new( + g_binary_messenger, name.c_str(), FL_METHOD_CODEC(codec)); + fl_event_channel_set_stream_handlers( + event_channel->channel, AuthEventChannelListenCb, + AuthEventChannelCancelCb, event_channel, nullptr); + + (*channels)[name] = event_channel; + return name; +} + +// Credential helpers. + +// Provider type keys. +static const char kSignInMethodPassword[] = "password"; +static const char kSignInMethodEmailLink[] = "emailLink"; +static const char kSignInMethodFacebook[] = "facebook.com"; +static const char kSignInMethodGoogle[] = "google.com"; +static const char kSignInMethodTwitter[] = "twitter.com"; +static const char kSignInMethodGithub[] = "github.com"; +static const char kSignInMethodOAuth[] = "oauth"; + +// Credential argument keys. +static const char kArgumentProviderId[] = "providerId"; +static const char kArgumentSignInMethod[] = "signInMethod"; +static const char kArgumentSecret[] = "secret"; +static const char kArgumentIdToken[] = "idToken"; +static const char kArgumentAccessToken[] = "accessToken"; +static const char kArgumentRawNonce[] = "rawNonce"; +static const char kArgumentEmail[] = "email"; + +// Looks up a string value in an FlValue map; returns nullptr when absent or +// not a string (the equivalent of the optional extraction on Windows). +static const gchar* MapLookupString(FlValue* map, const char* key) { + FlValue* value = fl_value_lookup_string(map, key); + if (value != nullptr && fl_value_get_type(value) == FL_VALUE_TYPE_STRING) { + return fl_value_get_string(value); + } + return nullptr; +} + +static firebase::auth::Credential GetCredentialFromArguments( + FlValue* arguments) { + const gchar* sign_in_method_value = + MapLookupString(arguments, kArgumentSignInMethod); + if (sign_in_method_value == nullptr) { + return firebase::auth::Credential(); + } + std::string sign_in_method = sign_in_method_value; + + // Password Auth + if (sign_in_method == kSignInMethodPassword) { + const gchar* email = MapLookupString(arguments, kArgumentEmail); + const gchar* secret = MapLookupString(arguments, kArgumentSecret); + return firebase::auth::EmailAuthProvider::GetCredential(email, secret); + } + + // Email Link Auth + if (sign_in_method == kSignInMethodEmailLink) { + // Firebase C++ SDK doesn't have email link authentication. + g_warning( + "Email link authentication is not supported in the Firebase C++ " + "SDK."); + return firebase::auth::Credential(); + } + + const gchar* id_token = MapLookupString(arguments, kArgumentIdToken); + const gchar* access_token = MapLookupString(arguments, kArgumentAccessToken); + + // Facebook Auth + if (sign_in_method == kSignInMethodFacebook) { + return firebase::auth::FacebookAuthProvider::GetCredential(access_token); + } + + // Google Auth + if (sign_in_method == kSignInMethodGoogle) { + // Both accessToken and idToken arguments can be null. You can use one or + // the other + return firebase::auth::GoogleAuthProvider::GetCredential(id_token, + access_token); + } + + // Twitter Auth + if (sign_in_method == kSignInMethodTwitter) { + const gchar* secret = MapLookupString(arguments, kArgumentSecret); + return firebase::auth::TwitterAuthProvider::GetCredential(id_token, secret); + } + + // GitHub Auth + if (sign_in_method == kSignInMethodGithub) { + return firebase::auth::GitHubAuthProvider::GetCredential(access_token); + } + + // OAuth + if (sign_in_method == kSignInMethodOAuth) { + const gchar* provider_id = MapLookupString(arguments, kArgumentProviderId); + const gchar* raw_nonce = MapLookupString(arguments, kArgumentRawNonce); + // If rawNonce provided use corresponding credential builder + // e.g. AppleID auth through the webView + if (raw_nonce != nullptr) { + return firebase::auth::OAuthProvider::GetCredential( + provider_id, id_token, raw_nonce, access_token); + } else { + return firebase::auth::OAuthProvider::GetCredential(provider_id, id_token, + access_token); + } + } + + // If no known auth method matched + g_warning( + "Support for an auth provider with identifier '%s' is not implemented.", + sign_in_method.c_str()); + return firebase::auth::Credential(); +} + +static std::vector TransformFlValueList(FlValue* fl_list) { + std::vector transformed_list; + if (fl_list == nullptr || fl_value_get_type(fl_list) != FL_VALUE_TYPE_LIST) { + return transformed_list; + } + size_t length = fl_value_get_length(fl_list); + for (size_t i = 0; i < length; ++i) { + FlValue* value = fl_value_get_list_value(fl_list, i); + if (fl_value_get_type(value) == FL_VALUE_TYPE_STRING) { + transformed_list.push_back(fl_value_get_string(value)); + } + } + return transformed_list; +} + +static std::map TransformFlValueMap(FlValue* fl_map) { + std::map transformed_map; + if (fl_map == nullptr || fl_value_get_type(fl_map) != FL_VALUE_TYPE_MAP) { + return transformed_map; + } + size_t length = fl_value_get_length(fl_map); + for (size_t i = 0; i < length; ++i) { + FlValue* key = fl_value_get_map_key(fl_map, i); + FlValue* value = fl_value_get_map_value(fl_map, i); + if (fl_value_get_type(key) == FL_VALUE_TYPE_STRING && + fl_value_get_type(value) == FL_VALUE_TYPE_STRING) { + transformed_map[fl_value_get_string(key)] = fl_value_get_string(value); + } + } + return transformed_map; +} + +static firebase::auth::FederatedOAuthProviderData GetProviderDataFromArguments( + FirebaseAuthInternalSignInProvider* sign_in_provider) { + return firebase::auth::FederatedOAuthProviderData( + firebase_auth_internal_sign_in_provider_get_provider_id(sign_in_provider), + TransformFlValueList( + firebase_auth_internal_sign_in_provider_get_scopes(sign_in_provider)), + TransformFlValueMap( + firebase_auth_internal_sign_in_provider_get_custom_parameters( + sign_in_provider))); +} + +// FirebaseAuthHostApi implementation. + +static void HandleRegisterIdTokenListener( + FirebaseAuthAuthPigeonFirebaseApp* app, + FirebaseAuthFirebaseAuthHostApiResponseHandle* response_handle, + gpointer user_data) { + Auth* firebase_auth = GetAuthFromPigeon(app); + std::string name = std::string(kFLTFirebaseAuthChannelName) + "/id-token/" + + firebase_auth_auth_pigeon_firebase_app_get_app_name(app); + SetupAuthEventChannel(firebase_auth, name, /* is_id_token_channel= */ true); + firebase_auth_firebase_auth_host_api_respond_register_id_token_listener( + response_handle, name.c_str()); +} + +static void HandleRegisterAuthStateListener( + FirebaseAuthAuthPigeonFirebaseApp* app, + FirebaseAuthFirebaseAuthHostApiResponseHandle* response_handle, + gpointer user_data) { + Auth* firebase_auth = GetAuthFromPigeon(app); + std::string name = std::string(kFLTFirebaseAuthChannelName) + "/auth-state/" + + firebase_auth_auth_pigeon_firebase_app_get_app_name(app); + SetupAuthEventChannel(firebase_auth, name, /* is_id_token_channel= */ false); + firebase_auth_firebase_auth_host_api_respond_register_auth_state_listener( + response_handle, name.c_str()); +} + +static void HandleUseEmulator( + FirebaseAuthAuthPigeonFirebaseApp* app, const gchar* host, int64_t port, + FirebaseAuthFirebaseAuthHostApiResponseHandle* response_handle, + gpointer user_data) { + Auth* firebase_auth = GetAuthFromPigeon(app); + firebase_auth->UseEmulator(host, static_cast(port)); + firebase_auth_firebase_auth_host_api_respond_use_emulator(response_handle); +} + +static void HandleApplyActionCode( + FirebaseAuthAuthPigeonFirebaseApp* app, const gchar* code, + FirebaseAuthFirebaseAuthHostApiResponseHandle* response_handle, + gpointer user_data) { + firebase_auth_firebase_auth_host_api_respond_error_apply_action_code( + response_handle, "unimplemented", + "ApplyActionCode is not available on this platform yet.", nullptr); +} + +static void HandleCheckActionCode( + FirebaseAuthAuthPigeonFirebaseApp* app, const gchar* code, + FirebaseAuthFirebaseAuthHostApiResponseHandle* response_handle, + gpointer user_data) { + firebase_auth_firebase_auth_host_api_respond_error_check_action_code( + response_handle, "unimplemented", + "CheckActionCode is not available on this platform yet.", nullptr); +} + +static void HandleConfirmPasswordReset( + FirebaseAuthAuthPigeonFirebaseApp* app, const gchar* code, + const gchar* new_password, + FirebaseAuthFirebaseAuthHostApiResponseHandle* response_handle, + gpointer user_data) { + firebase_auth_firebase_auth_host_api_respond_error_confirm_password_reset( + response_handle, "unimplemented", + "ConfirmPasswordReset is not available on this platform yet.", nullptr); +} + +static void HandleCreateUserWithEmailAndPassword( + FirebaseAuthAuthPigeonFirebaseApp* app, const gchar* email, + const gchar* password, + FirebaseAuthFirebaseAuthHostApiResponseHandle* response_handle, + gpointer user_data) { + Auth* firebase_auth = GetAuthFromPigeon(app); + CompleteAuthResultFuture( + firebase_auth->CreateUserWithEmailAndPassword(email, password), + response_handle, + firebase_auth_firebase_auth_host_api_respond_create_user_with_email_and_password, + firebase_auth_firebase_auth_host_api_respond_error_create_user_with_email_and_password); +} + +static void HandleSignInAnonymously( + FirebaseAuthAuthPigeonFirebaseApp* app, + FirebaseAuthFirebaseAuthHostApiResponseHandle* response_handle, + gpointer user_data) { + Auth* firebase_auth = GetAuthFromPigeon(app); + CompleteAuthResultFuture( + firebase_auth->SignInAnonymously(), response_handle, + firebase_auth_firebase_auth_host_api_respond_sign_in_anonymously, + firebase_auth_firebase_auth_host_api_respond_error_sign_in_anonymously); +} + +static void HandleSignInWithCredential( + FirebaseAuthAuthPigeonFirebaseApp* app, FlValue* input, + FirebaseAuthFirebaseAuthHostApiResponseHandle* response_handle, + gpointer user_data) { + Auth* firebase_auth = GetAuthFromPigeon(app); + + firebase::Future sign_in_future = + firebase_auth->SignInWithCredential(GetCredentialFromArguments(input)); + + g_object_ref(response_handle); + sign_in_future.OnCompletion([response_handle]( + const firebase::Future& + completed_future) { + // We are probably in a different thread right now. + if (completed_future.error() == 0) { + // TODO: not the right return type from C++ SDK + g_autoptr(FirebaseAuthInternalUserInfo) user_info = + ParseUserInfo(*completed_future.result()); + g_autoptr(FlValue) provider_data = fl_value_new_list(); + g_autoptr(FirebaseAuthInternalUserDetails) user = + firebase_auth_internal_user_details_new(user_info, provider_data); + FirebaseAuthInternalUserCredential* user_credential = + firebase_auth_internal_user_credential_new( + user, /* additional_user_info= */ nullptr, + /* credential= */ nullptr); + PostToMainThread([response_handle, user_credential]() { + firebase_auth_firebase_auth_host_api_respond_sign_in_with_credential( + response_handle, user_credential); + g_object_unref(user_credential); + g_object_unref(response_handle); + }); + } else { + RespondFutureError( + completed_future, response_handle, + firebase_auth_firebase_auth_host_api_respond_error_sign_in_with_credential); + } + }); +} + +static void HandleSignInWithCustomToken( + FirebaseAuthAuthPigeonFirebaseApp* app, const gchar* token, + FirebaseAuthFirebaseAuthHostApiResponseHandle* response_handle, + gpointer user_data) { + Auth* firebase_auth = GetAuthFromPigeon(app); + CompleteAuthResultFuture( + firebase_auth->SignInWithCustomToken(token), response_handle, + firebase_auth_firebase_auth_host_api_respond_sign_in_with_custom_token, + firebase_auth_firebase_auth_host_api_respond_error_sign_in_with_custom_token); +} + +static void HandleSignInWithEmailAndPassword( + FirebaseAuthAuthPigeonFirebaseApp* app, const gchar* email, + const gchar* password, + FirebaseAuthFirebaseAuthHostApiResponseHandle* response_handle, + gpointer user_data) { + Auth* firebase_auth = GetAuthFromPigeon(app); + CompleteAuthResultFuture( + firebase_auth->SignInWithEmailAndPassword(email, password), + response_handle, + firebase_auth_firebase_auth_host_api_respond_sign_in_with_email_and_password, + firebase_auth_firebase_auth_host_api_respond_error_sign_in_with_email_and_password); +} + +static void HandleSignInWithEmailLink( + FirebaseAuthAuthPigeonFirebaseApp* app, const gchar* email, + const gchar* email_link, + FirebaseAuthFirebaseAuthHostApiResponseHandle* response_handle, + gpointer user_data) { + firebase_auth_firebase_auth_host_api_respond_error_sign_in_with_email_link( + response_handle, "unimplemented", + "SignInWithEmailLink is not available on this platform yet.", nullptr); +} + +static void HandleSignInWithProvider( + FirebaseAuthAuthPigeonFirebaseApp* app, + FirebaseAuthInternalSignInProvider* sign_in_provider, + FirebaseAuthFirebaseAuthHostApiResponseHandle* response_handle, + gpointer user_data) { + Auth* firebase_auth = GetAuthFromPigeon(app); + + // The provider must outlive the asynchronous sign-in operation, so it is + // heap-allocated and deleted when the future completes (the Windows + // implementation passes the address of a temporary, which is not valid + // C++). + auto* provider = new firebase::auth::FederatedOAuthProvider( + GetProviderDataFromArguments(sign_in_provider)); + + firebase::Future sign_in_future = + firebase_auth->SignInWithProvider(provider); + + g_object_ref(response_handle); + sign_in_future.OnCompletion([response_handle, + provider](const firebase::Future< + firebase::auth::AuthResult>& + completed_future) { + delete provider; + // We are probably in a different thread right now. + if (completed_future.error() == 0) { + FirebaseAuthInternalUserCredential* credential = + ParseAuthResult(completed_future.result()); + PostToMainThread([response_handle, credential]() { + firebase_auth_firebase_auth_host_api_respond_sign_in_with_provider( + response_handle, credential); + g_object_unref(credential); + g_object_unref(response_handle); + }); + } else { + RespondFutureError( + completed_future, response_handle, + firebase_auth_firebase_auth_host_api_respond_error_sign_in_with_provider); + } + }); +} + +static void HandleSignOut( + FirebaseAuthAuthPigeonFirebaseApp* app, + FirebaseAuthFirebaseAuthHostApiResponseHandle* response_handle, + gpointer user_data) { + Auth* firebase_auth = GetAuthFromPigeon(app); + firebase_auth->SignOut(); + firebase_auth_firebase_auth_host_api_respond_sign_out(response_handle); +} + +static void HandleFetchSignInMethodsForEmail( + FirebaseAuthAuthPigeonFirebaseApp* app, const gchar* email, + FirebaseAuthFirebaseAuthHostApiResponseHandle* response_handle, + gpointer user_data) { + Auth* firebase_auth = GetAuthFromPigeon(app); + + firebase::Future providers_future = + firebase_auth->FetchProvidersForEmail(email); + + g_object_ref(response_handle); + providers_future.OnCompletion([response_handle](const firebase::Future< + Auth::FetchProvidersResult>& + completed_future) { + // We are probably in a different thread right now. + if (completed_future.error() == 0) { + FlValue* providers = fl_value_new_list(); + for (const std::string& provider : completed_future.result()->providers) { + fl_value_append_take(providers, fl_value_new_string(provider.c_str())); + } + PostToMainThread([response_handle, providers]() { + firebase_auth_firebase_auth_host_api_respond_fetch_sign_in_methods_for_email( + response_handle, providers); + fl_value_unref(providers); + g_object_unref(response_handle); + }); + } else { + RespondFutureError( + completed_future, response_handle, + firebase_auth_firebase_auth_host_api_respond_error_fetch_sign_in_methods_for_email); + } + }); +} + +static void HandleSendPasswordResetEmail( + FirebaseAuthAuthPigeonFirebaseApp* app, const gchar* email, + FirebaseAuthInternalActionCodeSettings* action_code_settings, + FirebaseAuthFirebaseAuthHostApiResponseHandle* response_handle, + gpointer user_data) { + Auth* firebase_auth = GetAuthFromPigeon(app); + CompleteVoidFuture( + firebase_auth->SendPasswordResetEmail(email), response_handle, + firebase_auth_firebase_auth_host_api_respond_send_password_reset_email, + firebase_auth_firebase_auth_host_api_respond_error_send_password_reset_email); +} + +static void HandleSendSignInLinkToEmail( + FirebaseAuthAuthPigeonFirebaseApp* app, const gchar* email, + FirebaseAuthInternalActionCodeSettings* action_code_settings, + FirebaseAuthFirebaseAuthHostApiResponseHandle* response_handle, + gpointer user_data) { + firebase_auth_firebase_auth_host_api_respond_error_send_sign_in_link_to_email( + response_handle, "unimplemented", + "SendSignInLinkToEmail is not available on this platform yet.", nullptr); +} + +static void HandleSetLanguageCode( + FirebaseAuthAuthPigeonFirebaseApp* app, const gchar* language_code, + FirebaseAuthFirebaseAuthHostApiResponseHandle* response_handle, + gpointer user_data) { + Auth* firebase_auth = GetAuthFromPigeon(app); + + if (language_code == nullptr) { + firebase_auth->UseAppLanguage(); + firebase_auth_firebase_auth_host_api_respond_set_language_code( + response_handle, firebase_auth->language_code().c_str()); + return; + } + + firebase_auth->set_language_code(language_code); + firebase_auth_firebase_auth_host_api_respond_set_language_code( + response_handle, language_code); +} + +static void HandleSetSettings( + FirebaseAuthAuthPigeonFirebaseApp* app, + FirebaseAuthInternalFirebaseAuthSettings* settings, + FirebaseAuthFirebaseAuthHostApiResponseHandle* response_handle, + gpointer user_data) { + firebase_auth_firebase_auth_host_api_respond_error_set_settings( + response_handle, "unimplemented", + "SetSettings is not available on this platform yet.", nullptr); +} + +static void HandleVerifyPasswordResetCode( + FirebaseAuthAuthPigeonFirebaseApp* app, const gchar* code, + FirebaseAuthFirebaseAuthHostApiResponseHandle* response_handle, + gpointer user_data) { + firebase_auth_firebase_auth_host_api_respond_error_verify_password_reset_code( + response_handle, "unimplemented", + "VerifyPasswordResetCode is not available on this platform yet.", + nullptr); +} + +static void HandleVerifyPhoneNumber( + FirebaseAuthAuthPigeonFirebaseApp* app, + FirebaseAuthInternalVerifyPhoneNumberRequest* request, + FirebaseAuthFirebaseAuthHostApiResponseHandle* response_handle, + gpointer user_data) { + firebase_auth_firebase_auth_host_api_respond_error_verify_phone_number( + response_handle, "unimplemented", + "VerifyPhoneNumber is not available on this platform yet.", nullptr); +} + +static void HandleRevokeTokenWithAuthorizationCode( + FirebaseAuthAuthPigeonFirebaseApp* app, const gchar* authorization_code, + FirebaseAuthFirebaseAuthHostApiResponseHandle* response_handle, + gpointer user_data) { + firebase_auth_firebase_auth_host_api_respond_error_revoke_token_with_authorization_code( + response_handle, "unimplemented", + "RevokeTokenWithAuthorizationCode is not available on this platform " + "yet.", + nullptr); +} + +static void HandleRevokeAccessToken( + FirebaseAuthAuthPigeonFirebaseApp* app, const gchar* access_token, + FirebaseAuthFirebaseAuthHostApiResponseHandle* response_handle, + gpointer user_data) { + firebase_auth_firebase_auth_host_api_respond_error_revoke_access_token( + response_handle, "unimplemented", + "RevokeAccessToken is not available on this platform.", nullptr); +} + +static void HandleInitializeRecaptchaConfig( + FirebaseAuthAuthPigeonFirebaseApp* app, + FirebaseAuthFirebaseAuthHostApiResponseHandle* response_handle, + gpointer user_data) { + firebase_auth_firebase_auth_host_api_respond_error_initialize_recaptcha_config( + response_handle, "unimplemented", + "InitializeRecaptchaConfig is not available on this platform yet.", + nullptr); +} + +// FirebaseAuthUserHostApi implementation. + +static void HandleDelete( + FirebaseAuthAuthPigeonFirebaseApp* app, + FirebaseAuthFirebaseAuthUserHostApiResponseHandle* response_handle, + gpointer user_data) { + Auth* firebase_auth = GetAuthFromPigeon(app); + firebase::auth::User user = firebase_auth->current_user(); + CompleteVoidFuture( + user.Delete(), response_handle, + firebase_auth_firebase_auth_user_host_api_respond_delete, + firebase_auth_firebase_auth_user_host_api_respond_error_delete); +} + +static void HandleGetIdToken( + FirebaseAuthAuthPigeonFirebaseApp* app, gboolean force_refresh, + FirebaseAuthFirebaseAuthUserHostApiResponseHandle* response_handle, + gpointer user_data) { + Auth* firebase_auth = GetAuthFromPigeon(app); + firebase::auth::User user = firebase_auth->current_user(); + + firebase::Future token_future = user.GetToken(force_refresh); + + g_object_ref(response_handle); + token_future.OnCompletion([response_handle]( + const firebase::Future& + completed_future) { + // We are probably in a different thread right now. + if (completed_future.error() == 0) { + FirebaseAuthInternalIdTokenResult* token_result = + firebase_auth_internal_id_token_result_new( + completed_future.result()->c_str(), + /* expiration_timestamp= */ nullptr, + /* auth_timestamp= */ nullptr, + /* issued_at_timestamp= */ nullptr, + /* sign_in_provider= */ nullptr, /* claims= */ nullptr, + /* sign_in_second_factor= */ nullptr); + PostToMainThread([response_handle, token_result]() { + firebase_auth_firebase_auth_user_host_api_respond_get_id_token( + response_handle, token_result); + g_object_unref(token_result); + g_object_unref(response_handle); + }); + } else { + RespondFutureError( + completed_future, response_handle, + firebase_auth_firebase_auth_user_host_api_respond_error_get_id_token); + } + }); +} + +static void HandleLinkWithCredential( + FirebaseAuthAuthPigeonFirebaseApp* app, FlValue* input, + FirebaseAuthFirebaseAuthUserHostApiResponseHandle* response_handle, + gpointer user_data) { + Auth* firebase_auth = GetAuthFromPigeon(app); + firebase::auth::User user = firebase_auth->current_user(); + CompleteAuthResultFuture( + user.LinkWithCredential(GetCredentialFromArguments(input)), + response_handle, + firebase_auth_firebase_auth_user_host_api_respond_link_with_credential, + firebase_auth_firebase_auth_user_host_api_respond_error_link_with_credential); +} + +static void HandleLinkWithProvider( + FirebaseAuthAuthPigeonFirebaseApp* app, + FirebaseAuthInternalSignInProvider* sign_in_provider, + FirebaseAuthFirebaseAuthUserHostApiResponseHandle* response_handle, + gpointer user_data) { + Auth* firebase_auth = GetAuthFromPigeon(app); + firebase::auth::User user = firebase_auth->current_user(); + + // See HandleSignInWithProvider for the provider lifetime note. + auto* provider = new firebase::auth::FederatedOAuthProvider( + GetProviderDataFromArguments(sign_in_provider)); + + firebase::Future link_future = + user.LinkWithProvider(provider); + + g_object_ref(response_handle); + link_future.OnCompletion([response_handle, + provider](const firebase::Future< + firebase::auth::AuthResult>& + completed_future) { + delete provider; + // We are probably in a different thread right now. + if (completed_future.error() == 0) { + FirebaseAuthInternalUserCredential* credential = + ParseAuthResult(completed_future.result()); + PostToMainThread([response_handle, credential]() { + firebase_auth_firebase_auth_user_host_api_respond_link_with_provider( + response_handle, credential); + g_object_unref(credential); + g_object_unref(response_handle); + }); + } else { + RespondFutureError( + completed_future, response_handle, + firebase_auth_firebase_auth_user_host_api_respond_error_link_with_provider); + } + }); +} + +static void HandleReauthenticateWithCredential( + FirebaseAuthAuthPigeonFirebaseApp* app, FlValue* input, + FirebaseAuthFirebaseAuthUserHostApiResponseHandle* response_handle, + gpointer user_data) { + Auth* firebase_auth = GetAuthFromPigeon(app); + firebase::auth::User user = firebase_auth->current_user(); + + firebase::Future reauth_future = + user.Reauthenticate(GetCredentialFromArguments(input)); + + g_object_ref(response_handle); + reauth_future.OnCompletion([response_handle, + firebase_auth](const firebase::Future& + completed_future) { + // We are probably in a different thread right now. + if (completed_future.error() == 0) { + // The C++ SDK Reauthenticate() has no result payload, so the + // credential is rebuilt from the current user. (The Windows + // implementation never responds on success, leaving the Dart future + // hanging; responding here is a deliberate improvement.) + g_autoptr(FirebaseAuthInternalUserDetails) user_details = + ParseUserDetails(firebase_auth->current_user()); + FirebaseAuthInternalUserCredential* credential = + firebase_auth_internal_user_credential_new( + user_details, /* additional_user_info= */ nullptr, + /* credential= */ nullptr); + PostToMainThread([response_handle, credential]() { + firebase_auth_firebase_auth_user_host_api_respond_reauthenticate_with_credential( + response_handle, credential); + g_object_unref(credential); + g_object_unref(response_handle); + }); + } else { + RespondFutureError( + completed_future, response_handle, + firebase_auth_firebase_auth_user_host_api_respond_error_reauthenticate_with_credential); + } + }); +} + +static void HandleReauthenticateWithProvider( + FirebaseAuthAuthPigeonFirebaseApp* app, + FirebaseAuthInternalSignInProvider* sign_in_provider, + FirebaseAuthFirebaseAuthUserHostApiResponseHandle* response_handle, + gpointer user_data) { + Auth* firebase_auth = GetAuthFromPigeon(app); + firebase::auth::User user = firebase_auth->current_user(); + + // See HandleSignInWithProvider for the provider lifetime note. + auto* provider = new firebase::auth::FederatedOAuthProvider( + GetProviderDataFromArguments(sign_in_provider)); + + firebase::Future reauth_future = + user.ReauthenticateWithProvider(provider); + + g_object_ref(response_handle); + reauth_future.OnCompletion([response_handle, + provider](const firebase::Future< + firebase::auth::AuthResult>& + completed_future) { + delete provider; + // We are probably in a different thread right now. + if (completed_future.error() == 0) { + FirebaseAuthInternalUserCredential* credential = + ParseAuthResult(completed_future.result()); + PostToMainThread([response_handle, credential]() { + firebase_auth_firebase_auth_user_host_api_respond_reauthenticate_with_provider( + response_handle, credential); + g_object_unref(credential); + g_object_unref(response_handle); + }); + } else { + RespondFutureError( + completed_future, response_handle, + firebase_auth_firebase_auth_user_host_api_respond_error_reauthenticate_with_provider); + } + }); +} + +static void HandleReload( + FirebaseAuthAuthPigeonFirebaseApp* app, + FirebaseAuthFirebaseAuthUserHostApiResponseHandle* response_handle, + gpointer user_data) { + Auth* firebase_auth = GetAuthFromPigeon(app); + firebase::auth::User user = firebase_auth->current_user(); + CompleteUserDetailsFuture( + user.Reload(), firebase_auth, response_handle, + firebase_auth_firebase_auth_user_host_api_respond_reload, + firebase_auth_firebase_auth_user_host_api_respond_error_reload); +} + +static void HandleSendEmailVerification( + FirebaseAuthAuthPigeonFirebaseApp* app, + FirebaseAuthInternalActionCodeSettings* action_code_settings, + FirebaseAuthFirebaseAuthUserHostApiResponseHandle* response_handle, + gpointer user_data) { + Auth* firebase_auth = GetAuthFromPigeon(app); + firebase::auth::User user = firebase_auth->current_user(); + CompleteVoidFuture( + user.SendEmailVerification(), response_handle, + firebase_auth_firebase_auth_user_host_api_respond_send_email_verification, + firebase_auth_firebase_auth_user_host_api_respond_error_send_email_verification); +} + +static void HandleUnlink( + FirebaseAuthAuthPigeonFirebaseApp* app, const gchar* provider_id, + FirebaseAuthFirebaseAuthUserHostApiResponseHandle* response_handle, + gpointer user_data) { + Auth* firebase_auth = GetAuthFromPigeon(app); + firebase::auth::User user = firebase_auth->current_user(); + CompleteAuthResultFuture( + user.Unlink(provider_id), response_handle, + firebase_auth_firebase_auth_user_host_api_respond_unlink, + firebase_auth_firebase_auth_user_host_api_respond_error_unlink); +} + +static void HandleUpdateEmail( + FirebaseAuthAuthPigeonFirebaseApp* app, const gchar* new_email, + FirebaseAuthFirebaseAuthUserHostApiResponseHandle* response_handle, + gpointer user_data) { + Auth* firebase_auth = GetAuthFromPigeon(app); + firebase::auth::User user = firebase_auth->current_user(); + CompleteUserDetailsFuture( + user.SendEmailVerificationBeforeUpdatingEmail(new_email), firebase_auth, + response_handle, + firebase_auth_firebase_auth_user_host_api_respond_update_email, + firebase_auth_firebase_auth_user_host_api_respond_error_update_email); +} + +static void HandleUpdatePassword( + FirebaseAuthAuthPigeonFirebaseApp* app, const gchar* new_password, + FirebaseAuthFirebaseAuthUserHostApiResponseHandle* response_handle, + gpointer user_data) { + Auth* firebase_auth = GetAuthFromPigeon(app); + firebase::auth::User user = firebase_auth->current_user(); + CompleteUserDetailsFuture( + user.UpdatePassword(new_password), firebase_auth, response_handle, + firebase_auth_firebase_auth_user_host_api_respond_update_password, + firebase_auth_firebase_auth_user_host_api_respond_error_update_password); +} + +static void HandleUpdatePhoneNumber( + FirebaseAuthAuthPigeonFirebaseApp* app, FlValue* input, + FirebaseAuthFirebaseAuthUserHostApiResponseHandle* response_handle, + gpointer user_data) { + // The C++ SDK cannot construct a PhoneAuthCredential from a verificationId + // and smsCode (see the Windows TODO in getPhoneCredentialFromArguments), so + // this cannot be implemented on desktop yet. The Windows implementation + // attempts the call with an empty credential (and throws on unknown + // methods); responding with an error is a deliberate improvement. + firebase_auth_firebase_auth_user_host_api_respond_error_update_phone_number( + response_handle, "unimplemented", + "UpdatePhoneNumber is not available on this platform yet.", nullptr); +} + +static void HandleUpdateProfile( + FirebaseAuthAuthPigeonFirebaseApp* app, + FirebaseAuthInternalUserProfile* profile, + FirebaseAuthFirebaseAuthUserHostApiResponseHandle* response_handle, + gpointer user_data) { + Auth* firebase_auth = GetAuthFromPigeon(app); + firebase::auth::User user = firebase_auth->current_user(); + + firebase::auth::User::UserProfile user_profile; + + if (firebase_auth_internal_user_profile_get_display_name_changed(profile)) { + user_profile.display_name = + firebase_auth_internal_user_profile_get_display_name(profile); + } + if (firebase_auth_internal_user_profile_get_photo_url_changed(profile)) { + user_profile.photo_url = + firebase_auth_internal_user_profile_get_photo_url(profile); + } + + CompleteUserDetailsFuture( + user.UpdateUserProfile(user_profile), firebase_auth, response_handle, + firebase_auth_firebase_auth_user_host_api_respond_update_profile, + firebase_auth_firebase_auth_user_host_api_respond_error_update_profile); +} + +static void HandleVerifyBeforeUpdateEmail( + FirebaseAuthAuthPigeonFirebaseApp* app, const gchar* new_email, + FirebaseAuthInternalActionCodeSettings* action_code_settings, + FirebaseAuthFirebaseAuthUserHostApiResponseHandle* response_handle, + gpointer user_data) { + Auth* firebase_auth = GetAuthFromPigeon(app); + firebase::auth::User user = firebase_auth->current_user(); + + if (action_code_settings != nullptr) { + g_warning( + "Firebase C++ SDK does not support using `ActionCodeSettings` for " + "`verifyBeforeUpdateEmail()` API currently"); + } + + CompleteVoidFuture( + user.SendEmailVerificationBeforeUpdatingEmail(new_email), response_handle, + firebase_auth_firebase_auth_user_host_api_respond_verify_before_update_email, + firebase_auth_firebase_auth_user_host_api_respond_error_verify_before_update_email); +} + +// Method handler vtables. The entries are in the order the members are +// declared in the generated vtable structs. + +static const FirebaseAuthFirebaseAuthHostApiVTable kFirebaseAuthHostApiVTable = { + HandleRegisterIdTokenListener, // register_id_token_listener + HandleRegisterAuthStateListener, // register_auth_state_listener + HandleUseEmulator, // use_emulator + HandleApplyActionCode, // apply_action_code + HandleCheckActionCode, // check_action_code + HandleConfirmPasswordReset, // confirm_password_reset + HandleCreateUserWithEmailAndPassword, // create_user_with_email_and_password + HandleSignInAnonymously, // sign_in_anonymously + HandleSignInWithCredential, // sign_in_with_credential + HandleSignInWithCustomToken, // sign_in_with_custom_token + HandleSignInWithEmailAndPassword, // sign_in_with_email_and_password + HandleSignInWithEmailLink, // sign_in_with_email_link + HandleSignInWithProvider, // sign_in_with_provider + HandleSignOut, // sign_out + HandleFetchSignInMethodsForEmail, // fetch_sign_in_methods_for_email + HandleSendPasswordResetEmail, // send_password_reset_email + HandleSendSignInLinkToEmail, // send_sign_in_link_to_email + HandleSetLanguageCode, // set_language_code + HandleSetSettings, // set_settings + HandleVerifyPasswordResetCode, // verify_password_reset_code + HandleVerifyPhoneNumber, // verify_phone_number + HandleRevokeTokenWithAuthorizationCode, // revoke_token_with_authorization_code + HandleRevokeAccessToken, // revoke_access_token + HandleInitializeRecaptchaConfig, // initialize_recaptcha_config +}; + +static const FirebaseAuthFirebaseAuthUserHostApiVTable + kFirebaseAuthUserHostApiVTable = { + HandleDelete, // delete_ + HandleGetIdToken, // get_id_token + HandleLinkWithCredential, // link_with_credential + HandleLinkWithProvider, // link_with_provider + HandleReauthenticateWithCredential, // reauthenticate_with_credential + HandleReauthenticateWithProvider, // reauthenticate_with_provider + HandleReload, // reload + HandleSendEmailVerification, // send_email_verification + HandleUnlink, // unlink + HandleUpdateEmail, // update_email + HandleUpdatePassword, // update_password + HandleUpdatePhoneNumber, // update_phone_number + HandleUpdateProfile, // update_profile + HandleVerifyBeforeUpdateEmail, // verify_before_update_email +}; + +// FlutterFirebasePlugin implementation, mirroring the Windows plugin's +// GetPluginConstantsForFirebaseApp / DidReinitializeFirebaseCore. +class FirebaseAuthConstantsProvider : public FlutterFirebasePlugin { + public: + FlValue* GetPluginConstantsForFirebaseApp(const firebase::App& app) override { + FlValue* constants = fl_value_new_map(); + + Auth* auth = Auth::GetAuth(const_cast(&app)); + firebase::auth::User user = auth->current_user(); + + if (user.is_valid()) { + // [userInfoFieldList, providerData], the same shape the auth-state and + // id-token event channels send. + g_autoptr(FlValue) event = BuildUserEventPayload(auth); + FlValue* user_details = fl_value_lookup_string(event, "user"); + fl_value_set_take(constants, fl_value_new_string("APP_CURRENT_USER"), + fl_value_ref(user_details)); + } + + std::string language_code = auth->language_code(); + if (!language_code.empty()) { + fl_value_set_take(constants, fl_value_new_string("APP_LANGUAGE_CODE"), + fl_value_new_string(language_code.c_str())); + } + + return constants; + } + + void DidReinitializeFirebaseCore() override { + // No-op for now. Could be used to reset cached auth instances. + } +}; + +static void firebase_auth_plugin_dispose(GObject* object) { + G_OBJECT_CLASS(firebase_auth_plugin_parent_class)->dispose(object); +} + +static void firebase_auth_plugin_class_init(FirebaseAuthPluginClass* klass) { + G_OBJECT_CLASS(klass)->dispose = firebase_auth_plugin_dispose; +} + +static void firebase_auth_plugin_init(FirebaseAuthPlugin* self) {} + +void firebase_auth_plugin_register_with_registrar( + FlPluginRegistrar* registrar) { + FirebaseAuthPlugin* plugin = FIREBASE_AUTH_PLUGIN( + g_object_new(firebase_auth_plugin_get_type(), nullptr)); + + firebase::SetLogLevel(firebase::kLogLevelVerbose); + + FlBinaryMessenger* messenger = fl_plugin_registrar_get_messenger(registrar); + g_binary_messenger = messenger; + + firebase_auth_firebase_auth_host_api_set_method_handlers( + messenger, /* suffix= */ nullptr, &kFirebaseAuthHostApiVTable, + g_object_ref(plugin), g_object_unref); + firebase_auth_firebase_auth_user_host_api_set_method_handlers( + messenger, /* suffix= */ nullptr, &kFirebaseAuthUserHostApiVTable, + g_object_ref(plugin), g_object_unref); + // Note: like on Windows, the MultiFactor*, Totp* and GenerateInterfaces + // pigeon APIs are not implemented on this platform, so no handlers are + // registered for them. + + RegisterFlutterFirebasePlugin("plugins.flutter.io/firebase_auth", + new FirebaseAuthConstantsProvider()); + + g_object_unref(plugin); + + // Register for platform logging + App::RegisterLibrary( + kLibraryName, firebase_auth_linux::getPluginVersion().c_str(), nullptr); +} diff --git a/packages/firebase_auth/firebase_auth/linux/include/firebase_auth/firebase_auth_plugin.h b/packages/firebase_auth/firebase_auth/linux/include/firebase_auth/firebase_auth_plugin.h new file mode 100644 index 000000000000..eb11e9d41962 --- /dev/null +++ b/packages/firebase_auth/firebase_auth/linux/include/firebase_auth/firebase_auth_plugin.h @@ -0,0 +1,32 @@ +/* + * Copyright 2026, the Chromium project authors. Please see the AUTHORS file + * for details. All rights reserved. Use of this source code is governed by a + * BSD-style license that can be found in the LICENSE file. + */ + +#ifndef FLUTTER_PLUGIN_FIREBASE_AUTH_PLUGIN_H_ +#define FLUTTER_PLUGIN_FIREBASE_AUTH_PLUGIN_H_ + +#include + +G_BEGIN_DECLS + +#ifdef FLUTTER_PLUGIN_IMPL +#define FLUTTER_PLUGIN_EXPORT __attribute__((visibility("default"))) +#else +#define FLUTTER_PLUGIN_EXPORT +#endif + +typedef struct _FirebaseAuthPlugin FirebaseAuthPlugin; +typedef struct { + GObjectClass parent_class; +} FirebaseAuthPluginClass; + +FLUTTER_PLUGIN_EXPORT GType firebase_auth_plugin_get_type(); + +FLUTTER_PLUGIN_EXPORT void firebase_auth_plugin_register_with_registrar( + FlPluginRegistrar* registrar); + +G_END_DECLS + +#endif // FLUTTER_PLUGIN_FIREBASE_AUTH_PLUGIN_H_ diff --git a/packages/firebase_auth/firebase_auth/linux/messages.g.cc b/packages/firebase_auth/firebase_auth/linux/messages.g.cc new file mode 100644 index 000000000000..736fe9be981d --- /dev/null +++ b/packages/firebase_auth/firebase_auth/linux/messages.g.cc @@ -0,0 +1,12349 @@ +// Copyright 2023, the Chromium project authors. Please see the AUTHORS file +// for details. All rights reserved. Use of this source code is governed by a +// BSD-style license that can be found in the LICENSE file. +// Autogenerated from Pigeon (v26.3.4), do not edit directly. +// See also: https://pub.dev/packages/pigeon + +#include "messages.g.h" + +#include + +#include +static guint G_GNUC_UNUSED flpigeon_hash_double(double v) { + if (std::isnan(v)) { + return static_cast(0x7FF80000); + } + if (v == 0.0) { + v = 0.0; + } + union { + double d; + uint64_t u; + } u; + u.d = v; + return static_cast(u.u ^ (u.u >> 32)); +} +static gboolean G_GNUC_UNUSED flpigeon_equals_double(double a, double b) { + return (a == b) || (std::isnan(a) && std::isnan(b)); +} +static gboolean G_GNUC_UNUSED flpigeon_deep_equals(FlValue* a, FlValue* b) { + if (a == b) { + return TRUE; + } + if (a == nullptr || b == nullptr) { + return FALSE; + } + if (fl_value_get_type(a) != fl_value_get_type(b)) { + return FALSE; + } + switch (fl_value_get_type(a)) { + case FL_VALUE_TYPE_NULL: + return TRUE; + case FL_VALUE_TYPE_BOOL: + return fl_value_get_bool(a) == fl_value_get_bool(b); + case FL_VALUE_TYPE_INT: + return fl_value_get_int(a) == fl_value_get_int(b); + case FL_VALUE_TYPE_FLOAT: { + return flpigeon_equals_double(fl_value_get_float(a), + fl_value_get_float(b)); + } + case FL_VALUE_TYPE_STRING: + return g_strcmp0(fl_value_get_string(a), fl_value_get_string(b)) == 0; + case FL_VALUE_TYPE_UINT8_LIST: + return fl_value_get_length(a) == fl_value_get_length(b) && + memcmp(fl_value_get_uint8_list(a), fl_value_get_uint8_list(b), + fl_value_get_length(a)) == 0; + case FL_VALUE_TYPE_INT32_LIST: + return fl_value_get_length(a) == fl_value_get_length(b) && + memcmp(fl_value_get_int32_list(a), fl_value_get_int32_list(b), + fl_value_get_length(a) * sizeof(int32_t)) == 0; + case FL_VALUE_TYPE_INT64_LIST: + return fl_value_get_length(a) == fl_value_get_length(b) && + memcmp(fl_value_get_int64_list(a), fl_value_get_int64_list(b), + fl_value_get_length(a) * sizeof(int64_t)) == 0; + case FL_VALUE_TYPE_FLOAT_LIST: { + size_t len = fl_value_get_length(a); + if (len != fl_value_get_length(b)) { + return FALSE; + } + const double* a_data = fl_value_get_float_list(a); + const double* b_data = fl_value_get_float_list(b); + for (size_t i = 0; i < len; i++) { + if (!flpigeon_equals_double(a_data[i], b_data[i])) { + return FALSE; + } + } + return TRUE; + } + case FL_VALUE_TYPE_LIST: { + size_t len = fl_value_get_length(a); + if (len != fl_value_get_length(b)) { + return FALSE; + } + for (size_t i = 0; i < len; i++) { + if (!flpigeon_deep_equals(fl_value_get_list_value(a, i), + fl_value_get_list_value(b, i))) { + return FALSE; + } + } + return TRUE; + } + case FL_VALUE_TYPE_MAP: { + size_t len = fl_value_get_length(a); + if (len != fl_value_get_length(b)) { + return FALSE; + } + for (size_t i = 0; i < len; i++) { + FlValue* key = fl_value_get_map_key(a, i); + FlValue* val = fl_value_get_map_value(a, i); + gboolean found = FALSE; + for (size_t j = 0; j < len; j++) { + FlValue* b_key = fl_value_get_map_key(b, j); + if (flpigeon_deep_equals(key, b_key)) { + FlValue* b_val = fl_value_get_map_value(b, j); + if (flpigeon_deep_equals(val, b_val)) { + found = TRUE; + break; + } else { + return FALSE; + } + } + } + if (!found) { + return FALSE; + } + } + return TRUE; + } + default: + return FALSE; + } + return FALSE; +} +static guint G_GNUC_UNUSED flpigeon_deep_hash(FlValue* value) { + if (value == nullptr) { + return 0; + } + switch (fl_value_get_type(value)) { + case FL_VALUE_TYPE_NULL: + return 0; + case FL_VALUE_TYPE_BOOL: + return fl_value_get_bool(value) ? 1231 : 1237; + case FL_VALUE_TYPE_INT: { + int64_t v = fl_value_get_int(value); + return static_cast(v ^ (v >> 32)); + } + case FL_VALUE_TYPE_FLOAT: + return flpigeon_hash_double(fl_value_get_float(value)); + case FL_VALUE_TYPE_STRING: + return g_str_hash(fl_value_get_string(value)); + case FL_VALUE_TYPE_UINT8_LIST: { + guint result = 1; + size_t len = fl_value_get_length(value); + const uint8_t* data = fl_value_get_uint8_list(value); + for (size_t i = 0; i < len; i++) { + result = result * 31 + data[i]; + } + return result; + } + case FL_VALUE_TYPE_INT32_LIST: { + guint result = 1; + size_t len = fl_value_get_length(value); + const int32_t* data = fl_value_get_int32_list(value); + for (size_t i = 0; i < len; i++) { + result = result * 31 + static_cast(data[i]); + } + return result; + } + case FL_VALUE_TYPE_INT64_LIST: { + guint result = 1; + size_t len = fl_value_get_length(value); + const int64_t* data = fl_value_get_int64_list(value); + for (size_t i = 0; i < len; i++) { + result = result * 31 + static_cast(data[i] ^ (data[i] >> 32)); + } + return result; + } + case FL_VALUE_TYPE_FLOAT_LIST: { + guint result = 1; + size_t len = fl_value_get_length(value); + const double* data = fl_value_get_float_list(value); + for (size_t i = 0; i < len; i++) { + result = result * 31 + flpigeon_hash_double(data[i]); + } + return result; + } + case FL_VALUE_TYPE_LIST: { + guint result = 1; + size_t len = fl_value_get_length(value); + for (size_t i = 0; i < len; i++) { + result = + result * 31 + flpigeon_deep_hash(fl_value_get_list_value(value, i)); + } + return result; + } + case FL_VALUE_TYPE_MAP: { + guint result = 0; + size_t len = fl_value_get_length(value); + for (size_t i = 0; i < len; i++) { + result += ((flpigeon_deep_hash(fl_value_get_map_key(value, i)) * 31) ^ + flpigeon_deep_hash(fl_value_get_map_value(value, i))); + } + return result; + } + default: + return static_cast(fl_value_get_type(value)); + } + return 0; +} + +struct _FirebaseAuthInternalMultiFactorSession { + GObject parent_instance; + + gchar* id; +}; + +G_DEFINE_TYPE(FirebaseAuthInternalMultiFactorSession, + firebase_auth_internal_multi_factor_session, G_TYPE_OBJECT) + +static void firebase_auth_internal_multi_factor_session_dispose( + GObject* object) { + FirebaseAuthInternalMultiFactorSession* self = + FIREBASE_AUTH_INTERNAL_MULTI_FACTOR_SESSION(object); + g_clear_pointer(&self->id, g_free); + G_OBJECT_CLASS(firebase_auth_internal_multi_factor_session_parent_class) + ->dispose(object); +} + +static void firebase_auth_internal_multi_factor_session_init( + FirebaseAuthInternalMultiFactorSession* self) {} + +static void firebase_auth_internal_multi_factor_session_class_init( + FirebaseAuthInternalMultiFactorSessionClass* klass) { + G_OBJECT_CLASS(klass)->dispose = + firebase_auth_internal_multi_factor_session_dispose; +} + +FirebaseAuthInternalMultiFactorSession* +firebase_auth_internal_multi_factor_session_new(const gchar* id) { + FirebaseAuthInternalMultiFactorSession* self = + FIREBASE_AUTH_INTERNAL_MULTI_FACTOR_SESSION(g_object_new( + firebase_auth_internal_multi_factor_session_get_type(), nullptr)); + self->id = g_strdup(id); + return self; +} + +const gchar* firebase_auth_internal_multi_factor_session_get_id( + FirebaseAuthInternalMultiFactorSession* self) { + g_return_val_if_fail(FIREBASE_AUTH_IS_INTERNAL_MULTI_FACTOR_SESSION(self), + nullptr); + return self->id; +} + +static FlValue* firebase_auth_internal_multi_factor_session_to_list( + FirebaseAuthInternalMultiFactorSession* self) { + FlValue* values = fl_value_new_list(); + fl_value_append_take(values, fl_value_new_string(self->id)); + return values; +} + +static FirebaseAuthInternalMultiFactorSession* +firebase_auth_internal_multi_factor_session_new_from_list(FlValue* values) { + FlValue* value0 = fl_value_get_list_value(values, 0); + const gchar* id = fl_value_get_string(value0); + return firebase_auth_internal_multi_factor_session_new(id); +} + +gboolean firebase_auth_internal_multi_factor_session_equals( + FirebaseAuthInternalMultiFactorSession* a, + FirebaseAuthInternalMultiFactorSession* b) { + if (a == b) { + return TRUE; + } + if (a == nullptr || b == nullptr) { + return FALSE; + } + if (g_strcmp0(a->id, b->id) != 0) { + return FALSE; + } + return TRUE; +} + +guint firebase_auth_internal_multi_factor_session_hash( + FirebaseAuthInternalMultiFactorSession* self) { + g_return_val_if_fail(FIREBASE_AUTH_IS_INTERNAL_MULTI_FACTOR_SESSION(self), 0); + guint result = 0; + result = result * 31 + (self->id != nullptr ? g_str_hash(self->id) : 0); + return result; +} + +struct _FirebaseAuthInternalPhoneMultiFactorAssertion { + GObject parent_instance; + + gchar* verification_id; + gchar* verification_code; +}; + +G_DEFINE_TYPE(FirebaseAuthInternalPhoneMultiFactorAssertion, + firebase_auth_internal_phone_multi_factor_assertion, + G_TYPE_OBJECT) + +static void firebase_auth_internal_phone_multi_factor_assertion_dispose( + GObject* object) { + FirebaseAuthInternalPhoneMultiFactorAssertion* self = + FIREBASE_AUTH_INTERNAL_PHONE_MULTI_FACTOR_ASSERTION(object); + g_clear_pointer(&self->verification_id, g_free); + g_clear_pointer(&self->verification_code, g_free); + G_OBJECT_CLASS( + firebase_auth_internal_phone_multi_factor_assertion_parent_class) + ->dispose(object); +} + +static void firebase_auth_internal_phone_multi_factor_assertion_init( + FirebaseAuthInternalPhoneMultiFactorAssertion* self) {} + +static void firebase_auth_internal_phone_multi_factor_assertion_class_init( + FirebaseAuthInternalPhoneMultiFactorAssertionClass* klass) { + G_OBJECT_CLASS(klass)->dispose = + firebase_auth_internal_phone_multi_factor_assertion_dispose; +} + +FirebaseAuthInternalPhoneMultiFactorAssertion* +firebase_auth_internal_phone_multi_factor_assertion_new( + const gchar* verification_id, const gchar* verification_code) { + FirebaseAuthInternalPhoneMultiFactorAssertion* self = + FIREBASE_AUTH_INTERNAL_PHONE_MULTI_FACTOR_ASSERTION(g_object_new( + firebase_auth_internal_phone_multi_factor_assertion_get_type(), + nullptr)); + self->verification_id = g_strdup(verification_id); + self->verification_code = g_strdup(verification_code); + return self; +} + +const gchar* +firebase_auth_internal_phone_multi_factor_assertion_get_verification_id( + FirebaseAuthInternalPhoneMultiFactorAssertion* self) { + g_return_val_if_fail( + FIREBASE_AUTH_IS_INTERNAL_PHONE_MULTI_FACTOR_ASSERTION(self), nullptr); + return self->verification_id; +} + +const gchar* +firebase_auth_internal_phone_multi_factor_assertion_get_verification_code( + FirebaseAuthInternalPhoneMultiFactorAssertion* self) { + g_return_val_if_fail( + FIREBASE_AUTH_IS_INTERNAL_PHONE_MULTI_FACTOR_ASSERTION(self), nullptr); + return self->verification_code; +} + +static FlValue* firebase_auth_internal_phone_multi_factor_assertion_to_list( + FirebaseAuthInternalPhoneMultiFactorAssertion* self) { + FlValue* values = fl_value_new_list(); + fl_value_append_take(values, fl_value_new_string(self->verification_id)); + fl_value_append_take(values, fl_value_new_string(self->verification_code)); + return values; +} + +static FirebaseAuthInternalPhoneMultiFactorAssertion* +firebase_auth_internal_phone_multi_factor_assertion_new_from_list( + FlValue* values) { + FlValue* value0 = fl_value_get_list_value(values, 0); + const gchar* verification_id = fl_value_get_string(value0); + FlValue* value1 = fl_value_get_list_value(values, 1); + const gchar* verification_code = fl_value_get_string(value1); + return firebase_auth_internal_phone_multi_factor_assertion_new( + verification_id, verification_code); +} + +gboolean firebase_auth_internal_phone_multi_factor_assertion_equals( + FirebaseAuthInternalPhoneMultiFactorAssertion* a, + FirebaseAuthInternalPhoneMultiFactorAssertion* b) { + if (a == b) { + return TRUE; + } + if (a == nullptr || b == nullptr) { + return FALSE; + } + if (g_strcmp0(a->verification_id, b->verification_id) != 0) { + return FALSE; + } + if (g_strcmp0(a->verification_code, b->verification_code) != 0) { + return FALSE; + } + return TRUE; +} + +guint firebase_auth_internal_phone_multi_factor_assertion_hash( + FirebaseAuthInternalPhoneMultiFactorAssertion* self) { + g_return_val_if_fail( + FIREBASE_AUTH_IS_INTERNAL_PHONE_MULTI_FACTOR_ASSERTION(self), 0); + guint result = 0; + result = result * 31 + (self->verification_id != nullptr + ? g_str_hash(self->verification_id) + : 0); + result = result * 31 + (self->verification_code != nullptr + ? g_str_hash(self->verification_code) + : 0); + return result; +} + +struct _FirebaseAuthInternalMultiFactorInfo { + GObject parent_instance; + + gchar* display_name; + double enrollment_timestamp; + gchar* factor_id; + gchar* uid; + gchar* phone_number; +}; + +G_DEFINE_TYPE(FirebaseAuthInternalMultiFactorInfo, + firebase_auth_internal_multi_factor_info, G_TYPE_OBJECT) + +static void firebase_auth_internal_multi_factor_info_dispose(GObject* object) { + FirebaseAuthInternalMultiFactorInfo* self = + FIREBASE_AUTH_INTERNAL_MULTI_FACTOR_INFO(object); + g_clear_pointer(&self->display_name, g_free); + g_clear_pointer(&self->factor_id, g_free); + g_clear_pointer(&self->uid, g_free); + g_clear_pointer(&self->phone_number, g_free); + G_OBJECT_CLASS(firebase_auth_internal_multi_factor_info_parent_class) + ->dispose(object); +} + +static void firebase_auth_internal_multi_factor_info_init( + FirebaseAuthInternalMultiFactorInfo* self) {} + +static void firebase_auth_internal_multi_factor_info_class_init( + FirebaseAuthInternalMultiFactorInfoClass* klass) { + G_OBJECT_CLASS(klass)->dispose = + firebase_auth_internal_multi_factor_info_dispose; +} + +FirebaseAuthInternalMultiFactorInfo* +firebase_auth_internal_multi_factor_info_new(const gchar* display_name, + double enrollment_timestamp, + const gchar* factor_id, + const gchar* uid, + const gchar* phone_number) { + FirebaseAuthInternalMultiFactorInfo* self = + FIREBASE_AUTH_INTERNAL_MULTI_FACTOR_INFO(g_object_new( + firebase_auth_internal_multi_factor_info_get_type(), nullptr)); + if (display_name != nullptr) { + self->display_name = g_strdup(display_name); + } else { + self->display_name = nullptr; + } + self->enrollment_timestamp = enrollment_timestamp; + if (factor_id != nullptr) { + self->factor_id = g_strdup(factor_id); + } else { + self->factor_id = nullptr; + } + self->uid = g_strdup(uid); + if (phone_number != nullptr) { + self->phone_number = g_strdup(phone_number); + } else { + self->phone_number = nullptr; + } + return self; +} + +const gchar* firebase_auth_internal_multi_factor_info_get_display_name( + FirebaseAuthInternalMultiFactorInfo* self) { + g_return_val_if_fail(FIREBASE_AUTH_IS_INTERNAL_MULTI_FACTOR_INFO(self), + nullptr); + return self->display_name; +} + +double firebase_auth_internal_multi_factor_info_get_enrollment_timestamp( + FirebaseAuthInternalMultiFactorInfo* self) { + g_return_val_if_fail(FIREBASE_AUTH_IS_INTERNAL_MULTI_FACTOR_INFO(self), 0.0); + return self->enrollment_timestamp; +} + +const gchar* firebase_auth_internal_multi_factor_info_get_factor_id( + FirebaseAuthInternalMultiFactorInfo* self) { + g_return_val_if_fail(FIREBASE_AUTH_IS_INTERNAL_MULTI_FACTOR_INFO(self), + nullptr); + return self->factor_id; +} + +const gchar* firebase_auth_internal_multi_factor_info_get_uid( + FirebaseAuthInternalMultiFactorInfo* self) { + g_return_val_if_fail(FIREBASE_AUTH_IS_INTERNAL_MULTI_FACTOR_INFO(self), + nullptr); + return self->uid; +} + +const gchar* firebase_auth_internal_multi_factor_info_get_phone_number( + FirebaseAuthInternalMultiFactorInfo* self) { + g_return_val_if_fail(FIREBASE_AUTH_IS_INTERNAL_MULTI_FACTOR_INFO(self), + nullptr); + return self->phone_number; +} + +static FlValue* firebase_auth_internal_multi_factor_info_to_list( + FirebaseAuthInternalMultiFactorInfo* self) { + FlValue* values = fl_value_new_list(); + fl_value_append_take(values, self->display_name != nullptr + ? fl_value_new_string(self->display_name) + : fl_value_new_null()); + fl_value_append_take(values, fl_value_new_float(self->enrollment_timestamp)); + fl_value_append_take(values, self->factor_id != nullptr + ? fl_value_new_string(self->factor_id) + : fl_value_new_null()); + fl_value_append_take(values, fl_value_new_string(self->uid)); + fl_value_append_take(values, self->phone_number != nullptr + ? fl_value_new_string(self->phone_number) + : fl_value_new_null()); + return values; +} + +static FirebaseAuthInternalMultiFactorInfo* +firebase_auth_internal_multi_factor_info_new_from_list(FlValue* values) { + FlValue* value0 = fl_value_get_list_value(values, 0); + const gchar* display_name = nullptr; + if (fl_value_get_type(value0) != FL_VALUE_TYPE_NULL) { + display_name = fl_value_get_string(value0); + } + FlValue* value1 = fl_value_get_list_value(values, 1); + double enrollment_timestamp = fl_value_get_float(value1); + FlValue* value2 = fl_value_get_list_value(values, 2); + const gchar* factor_id = nullptr; + if (fl_value_get_type(value2) != FL_VALUE_TYPE_NULL) { + factor_id = fl_value_get_string(value2); + } + FlValue* value3 = fl_value_get_list_value(values, 3); + const gchar* uid = fl_value_get_string(value3); + FlValue* value4 = fl_value_get_list_value(values, 4); + const gchar* phone_number = nullptr; + if (fl_value_get_type(value4) != FL_VALUE_TYPE_NULL) { + phone_number = fl_value_get_string(value4); + } + return firebase_auth_internal_multi_factor_info_new( + display_name, enrollment_timestamp, factor_id, uid, phone_number); +} + +gboolean firebase_auth_internal_multi_factor_info_equals( + FirebaseAuthInternalMultiFactorInfo* a, + FirebaseAuthInternalMultiFactorInfo* b) { + if (a == b) { + return TRUE; + } + if (a == nullptr || b == nullptr) { + return FALSE; + } + if (g_strcmp0(a->display_name, b->display_name) != 0) { + return FALSE; + } + if (!flpigeon_equals_double(a->enrollment_timestamp, + b->enrollment_timestamp)) { + return FALSE; + } + if (g_strcmp0(a->factor_id, b->factor_id) != 0) { + return FALSE; + } + if (g_strcmp0(a->uid, b->uid) != 0) { + return FALSE; + } + if (g_strcmp0(a->phone_number, b->phone_number) != 0) { + return FALSE; + } + return TRUE; +} + +guint firebase_auth_internal_multi_factor_info_hash( + FirebaseAuthInternalMultiFactorInfo* self) { + g_return_val_if_fail(FIREBASE_AUTH_IS_INTERNAL_MULTI_FACTOR_INFO(self), 0); + guint result = 0; + result = result * 31 + + (self->display_name != nullptr ? g_str_hash(self->display_name) : 0); + result = result * 31 + flpigeon_hash_double(self->enrollment_timestamp); + result = result * 31 + + (self->factor_id != nullptr ? g_str_hash(self->factor_id) : 0); + result = result * 31 + (self->uid != nullptr ? g_str_hash(self->uid) : 0); + result = result * 31 + + (self->phone_number != nullptr ? g_str_hash(self->phone_number) : 0); + return result; +} + +struct _FirebaseAuthAuthPigeonFirebaseApp { + GObject parent_instance; + + gchar* app_name; + gchar* tenant_id; + gchar* custom_auth_domain; +}; + +G_DEFINE_TYPE(FirebaseAuthAuthPigeonFirebaseApp, + firebase_auth_auth_pigeon_firebase_app, G_TYPE_OBJECT) + +static void firebase_auth_auth_pigeon_firebase_app_dispose(GObject* object) { + FirebaseAuthAuthPigeonFirebaseApp* self = + FIREBASE_AUTH_AUTH_PIGEON_FIREBASE_APP(object); + g_clear_pointer(&self->app_name, g_free); + g_clear_pointer(&self->tenant_id, g_free); + g_clear_pointer(&self->custom_auth_domain, g_free); + G_OBJECT_CLASS(firebase_auth_auth_pigeon_firebase_app_parent_class) + ->dispose(object); +} + +static void firebase_auth_auth_pigeon_firebase_app_init( + FirebaseAuthAuthPigeonFirebaseApp* self) {} + +static void firebase_auth_auth_pigeon_firebase_app_class_init( + FirebaseAuthAuthPigeonFirebaseAppClass* klass) { + G_OBJECT_CLASS(klass)->dispose = + firebase_auth_auth_pigeon_firebase_app_dispose; +} + +FirebaseAuthAuthPigeonFirebaseApp* firebase_auth_auth_pigeon_firebase_app_new( + const gchar* app_name, const gchar* tenant_id, + const gchar* custom_auth_domain) { + FirebaseAuthAuthPigeonFirebaseApp* self = + FIREBASE_AUTH_AUTH_PIGEON_FIREBASE_APP(g_object_new( + firebase_auth_auth_pigeon_firebase_app_get_type(), nullptr)); + self->app_name = g_strdup(app_name); + if (tenant_id != nullptr) { + self->tenant_id = g_strdup(tenant_id); + } else { + self->tenant_id = nullptr; + } + if (custom_auth_domain != nullptr) { + self->custom_auth_domain = g_strdup(custom_auth_domain); + } else { + self->custom_auth_domain = nullptr; + } + return self; +} + +const gchar* firebase_auth_auth_pigeon_firebase_app_get_app_name( + FirebaseAuthAuthPigeonFirebaseApp* self) { + g_return_val_if_fail(FIREBASE_AUTH_IS_AUTH_PIGEON_FIREBASE_APP(self), + nullptr); + return self->app_name; +} + +const gchar* firebase_auth_auth_pigeon_firebase_app_get_tenant_id( + FirebaseAuthAuthPigeonFirebaseApp* self) { + g_return_val_if_fail(FIREBASE_AUTH_IS_AUTH_PIGEON_FIREBASE_APP(self), + nullptr); + return self->tenant_id; +} + +const gchar* firebase_auth_auth_pigeon_firebase_app_get_custom_auth_domain( + FirebaseAuthAuthPigeonFirebaseApp* self) { + g_return_val_if_fail(FIREBASE_AUTH_IS_AUTH_PIGEON_FIREBASE_APP(self), + nullptr); + return self->custom_auth_domain; +} + +static FlValue* firebase_auth_auth_pigeon_firebase_app_to_list( + FirebaseAuthAuthPigeonFirebaseApp* self) { + FlValue* values = fl_value_new_list(); + fl_value_append_take(values, fl_value_new_string(self->app_name)); + fl_value_append_take(values, self->tenant_id != nullptr + ? fl_value_new_string(self->tenant_id) + : fl_value_new_null()); + fl_value_append_take(values, + self->custom_auth_domain != nullptr + ? fl_value_new_string(self->custom_auth_domain) + : fl_value_new_null()); + return values; +} + +static FirebaseAuthAuthPigeonFirebaseApp* +firebase_auth_auth_pigeon_firebase_app_new_from_list(FlValue* values) { + FlValue* value0 = fl_value_get_list_value(values, 0); + const gchar* app_name = fl_value_get_string(value0); + FlValue* value1 = fl_value_get_list_value(values, 1); + const gchar* tenant_id = nullptr; + if (fl_value_get_type(value1) != FL_VALUE_TYPE_NULL) { + tenant_id = fl_value_get_string(value1); + } + FlValue* value2 = fl_value_get_list_value(values, 2); + const gchar* custom_auth_domain = nullptr; + if (fl_value_get_type(value2) != FL_VALUE_TYPE_NULL) { + custom_auth_domain = fl_value_get_string(value2); + } + return firebase_auth_auth_pigeon_firebase_app_new(app_name, tenant_id, + custom_auth_domain); +} + +gboolean firebase_auth_auth_pigeon_firebase_app_equals( + FirebaseAuthAuthPigeonFirebaseApp* a, + FirebaseAuthAuthPigeonFirebaseApp* b) { + if (a == b) { + return TRUE; + } + if (a == nullptr || b == nullptr) { + return FALSE; + } + if (g_strcmp0(a->app_name, b->app_name) != 0) { + return FALSE; + } + if (g_strcmp0(a->tenant_id, b->tenant_id) != 0) { + return FALSE; + } + if (g_strcmp0(a->custom_auth_domain, b->custom_auth_domain) != 0) { + return FALSE; + } + return TRUE; +} + +guint firebase_auth_auth_pigeon_firebase_app_hash( + FirebaseAuthAuthPigeonFirebaseApp* self) { + g_return_val_if_fail(FIREBASE_AUTH_IS_AUTH_PIGEON_FIREBASE_APP(self), 0); + guint result = 0; + result = result * 31 + + (self->app_name != nullptr ? g_str_hash(self->app_name) : 0); + result = result * 31 + + (self->tenant_id != nullptr ? g_str_hash(self->tenant_id) : 0); + result = result * 31 + (self->custom_auth_domain != nullptr + ? g_str_hash(self->custom_auth_domain) + : 0); + return result; +} + +struct _FirebaseAuthInternalActionCodeInfoData { + GObject parent_instance; + + gchar* email; + gchar* previous_email; +}; + +G_DEFINE_TYPE(FirebaseAuthInternalActionCodeInfoData, + firebase_auth_internal_action_code_info_data, G_TYPE_OBJECT) + +static void firebase_auth_internal_action_code_info_data_dispose( + GObject* object) { + FirebaseAuthInternalActionCodeInfoData* self = + FIREBASE_AUTH_INTERNAL_ACTION_CODE_INFO_DATA(object); + g_clear_pointer(&self->email, g_free); + g_clear_pointer(&self->previous_email, g_free); + G_OBJECT_CLASS(firebase_auth_internal_action_code_info_data_parent_class) + ->dispose(object); +} + +static void firebase_auth_internal_action_code_info_data_init( + FirebaseAuthInternalActionCodeInfoData* self) {} + +static void firebase_auth_internal_action_code_info_data_class_init( + FirebaseAuthInternalActionCodeInfoDataClass* klass) { + G_OBJECT_CLASS(klass)->dispose = + firebase_auth_internal_action_code_info_data_dispose; +} + +FirebaseAuthInternalActionCodeInfoData* +firebase_auth_internal_action_code_info_data_new(const gchar* email, + const gchar* previous_email) { + FirebaseAuthInternalActionCodeInfoData* self = + FIREBASE_AUTH_INTERNAL_ACTION_CODE_INFO_DATA(g_object_new( + firebase_auth_internal_action_code_info_data_get_type(), nullptr)); + if (email != nullptr) { + self->email = g_strdup(email); + } else { + self->email = nullptr; + } + if (previous_email != nullptr) { + self->previous_email = g_strdup(previous_email); + } else { + self->previous_email = nullptr; + } + return self; +} + +const gchar* firebase_auth_internal_action_code_info_data_get_email( + FirebaseAuthInternalActionCodeInfoData* self) { + g_return_val_if_fail(FIREBASE_AUTH_IS_INTERNAL_ACTION_CODE_INFO_DATA(self), + nullptr); + return self->email; +} + +const gchar* firebase_auth_internal_action_code_info_data_get_previous_email( + FirebaseAuthInternalActionCodeInfoData* self) { + g_return_val_if_fail(FIREBASE_AUTH_IS_INTERNAL_ACTION_CODE_INFO_DATA(self), + nullptr); + return self->previous_email; +} + +static FlValue* firebase_auth_internal_action_code_info_data_to_list( + FirebaseAuthInternalActionCodeInfoData* self) { + FlValue* values = fl_value_new_list(); + fl_value_append_take(values, self->email != nullptr + ? fl_value_new_string(self->email) + : fl_value_new_null()); + fl_value_append_take(values, self->previous_email != nullptr + ? fl_value_new_string(self->previous_email) + : fl_value_new_null()); + return values; +} + +static FirebaseAuthInternalActionCodeInfoData* +firebase_auth_internal_action_code_info_data_new_from_list(FlValue* values) { + FlValue* value0 = fl_value_get_list_value(values, 0); + const gchar* email = nullptr; + if (fl_value_get_type(value0) != FL_VALUE_TYPE_NULL) { + email = fl_value_get_string(value0); + } + FlValue* value1 = fl_value_get_list_value(values, 1); + const gchar* previous_email = nullptr; + if (fl_value_get_type(value1) != FL_VALUE_TYPE_NULL) { + previous_email = fl_value_get_string(value1); + } + return firebase_auth_internal_action_code_info_data_new(email, + previous_email); +} + +gboolean firebase_auth_internal_action_code_info_data_equals( + FirebaseAuthInternalActionCodeInfoData* a, + FirebaseAuthInternalActionCodeInfoData* b) { + if (a == b) { + return TRUE; + } + if (a == nullptr || b == nullptr) { + return FALSE; + } + if (g_strcmp0(a->email, b->email) != 0) { + return FALSE; + } + if (g_strcmp0(a->previous_email, b->previous_email) != 0) { + return FALSE; + } + return TRUE; +} + +guint firebase_auth_internal_action_code_info_data_hash( + FirebaseAuthInternalActionCodeInfoData* self) { + g_return_val_if_fail(FIREBASE_AUTH_IS_INTERNAL_ACTION_CODE_INFO_DATA(self), + 0); + guint result = 0; + result = result * 31 + (self->email != nullptr ? g_str_hash(self->email) : 0); + result = + result * 31 + + (self->previous_email != nullptr ? g_str_hash(self->previous_email) : 0); + return result; +} + +struct _FirebaseAuthInternalActionCodeInfo { + GObject parent_instance; + + FirebaseAuthActionCodeInfoOperation operation; + FirebaseAuthInternalActionCodeInfoData* data; +}; + +G_DEFINE_TYPE(FirebaseAuthInternalActionCodeInfo, + firebase_auth_internal_action_code_info, G_TYPE_OBJECT) + +static void firebase_auth_internal_action_code_info_dispose(GObject* object) { + FirebaseAuthInternalActionCodeInfo* self = + FIREBASE_AUTH_INTERNAL_ACTION_CODE_INFO(object); + g_clear_object(&self->data); + G_OBJECT_CLASS(firebase_auth_internal_action_code_info_parent_class) + ->dispose(object); +} + +static void firebase_auth_internal_action_code_info_init( + FirebaseAuthInternalActionCodeInfo* self) {} + +static void firebase_auth_internal_action_code_info_class_init( + FirebaseAuthInternalActionCodeInfoClass* klass) { + G_OBJECT_CLASS(klass)->dispose = + firebase_auth_internal_action_code_info_dispose; +} + +FirebaseAuthInternalActionCodeInfo* firebase_auth_internal_action_code_info_new( + FirebaseAuthActionCodeInfoOperation operation, + FirebaseAuthInternalActionCodeInfoData* data) { + FirebaseAuthInternalActionCodeInfo* self = + FIREBASE_AUTH_INTERNAL_ACTION_CODE_INFO(g_object_new( + firebase_auth_internal_action_code_info_get_type(), nullptr)); + self->operation = operation; + self->data = FIREBASE_AUTH_INTERNAL_ACTION_CODE_INFO_DATA(g_object_ref(data)); + return self; +} + +FirebaseAuthActionCodeInfoOperation +firebase_auth_internal_action_code_info_get_operation( + FirebaseAuthInternalActionCodeInfo* self) { + g_return_val_if_fail(FIREBASE_AUTH_IS_INTERNAL_ACTION_CODE_INFO(self), + static_cast(0)); + return self->operation; +} + +FirebaseAuthInternalActionCodeInfoData* +firebase_auth_internal_action_code_info_get_data( + FirebaseAuthInternalActionCodeInfo* self) { + g_return_val_if_fail(FIREBASE_AUTH_IS_INTERNAL_ACTION_CODE_INFO(self), + nullptr); + return self->data; +} + +static FlValue* firebase_auth_internal_action_code_info_to_list( + FirebaseAuthInternalActionCodeInfo* self) { + FlValue* values = fl_value_new_list(); + fl_value_append_take( + values, + fl_value_new_custom(firebase_auth_action_code_info_operation_type_id, + fl_value_new_int(self->operation), + (GDestroyNotify)fl_value_unref)); + fl_value_append_take(values, + fl_value_new_custom_object( + firebase_auth_internal_action_code_info_data_type_id, + G_OBJECT(self->data))); + return values; +} + +static FirebaseAuthInternalActionCodeInfo* +firebase_auth_internal_action_code_info_new_from_list(FlValue* values) { + FlValue* value0 = fl_value_get_list_value(values, 0); + FirebaseAuthActionCodeInfoOperation operation = + static_cast( + fl_value_get_int(reinterpret_cast( + const_cast(fl_value_get_custom_value(value0))))); + FlValue* value1 = fl_value_get_list_value(values, 1); + FirebaseAuthInternalActionCodeInfoData* data = + FIREBASE_AUTH_INTERNAL_ACTION_CODE_INFO_DATA( + fl_value_get_custom_value_object(value1)); + return firebase_auth_internal_action_code_info_new(operation, data); +} + +gboolean firebase_auth_internal_action_code_info_equals( + FirebaseAuthInternalActionCodeInfo* a, + FirebaseAuthInternalActionCodeInfo* b) { + if (a == b) { + return TRUE; + } + if (a == nullptr || b == nullptr) { + return FALSE; + } + if (a->operation != b->operation) { + return FALSE; + } + if (!firebase_auth_internal_action_code_info_data_equals(a->data, b->data)) { + return FALSE; + } + return TRUE; +} + +guint firebase_auth_internal_action_code_info_hash( + FirebaseAuthInternalActionCodeInfo* self) { + g_return_val_if_fail(FIREBASE_AUTH_IS_INTERNAL_ACTION_CODE_INFO(self), 0); + guint result = 0; + result = result * 31 + static_cast(self->operation); + result = result * 31 + + firebase_auth_internal_action_code_info_data_hash(self->data); + return result; +} + +struct _FirebaseAuthInternalAdditionalUserInfo { + GObject parent_instance; + + gboolean is_new_user; + gchar* provider_id; + gchar* username; + gchar* authorization_code; + FlValue* profile; +}; + +G_DEFINE_TYPE(FirebaseAuthInternalAdditionalUserInfo, + firebase_auth_internal_additional_user_info, G_TYPE_OBJECT) + +static void firebase_auth_internal_additional_user_info_dispose( + GObject* object) { + FirebaseAuthInternalAdditionalUserInfo* self = + FIREBASE_AUTH_INTERNAL_ADDITIONAL_USER_INFO(object); + g_clear_pointer(&self->provider_id, g_free); + g_clear_pointer(&self->username, g_free); + g_clear_pointer(&self->authorization_code, g_free); + g_clear_pointer(&self->profile, fl_value_unref); + G_OBJECT_CLASS(firebase_auth_internal_additional_user_info_parent_class) + ->dispose(object); +} + +static void firebase_auth_internal_additional_user_info_init( + FirebaseAuthInternalAdditionalUserInfo* self) {} + +static void firebase_auth_internal_additional_user_info_class_init( + FirebaseAuthInternalAdditionalUserInfoClass* klass) { + G_OBJECT_CLASS(klass)->dispose = + firebase_auth_internal_additional_user_info_dispose; +} + +FirebaseAuthInternalAdditionalUserInfo* +firebase_auth_internal_additional_user_info_new(gboolean is_new_user, + const gchar* provider_id, + const gchar* username, + const gchar* authorization_code, + FlValue* profile) { + FirebaseAuthInternalAdditionalUserInfo* self = + FIREBASE_AUTH_INTERNAL_ADDITIONAL_USER_INFO(g_object_new( + firebase_auth_internal_additional_user_info_get_type(), nullptr)); + self->is_new_user = is_new_user; + if (provider_id != nullptr) { + self->provider_id = g_strdup(provider_id); + } else { + self->provider_id = nullptr; + } + if (username != nullptr) { + self->username = g_strdup(username); + } else { + self->username = nullptr; + } + if (authorization_code != nullptr) { + self->authorization_code = g_strdup(authorization_code); + } else { + self->authorization_code = nullptr; + } + if (profile != nullptr) { + self->profile = fl_value_ref(profile); + } else { + self->profile = nullptr; + } + return self; +} + +gboolean firebase_auth_internal_additional_user_info_get_is_new_user( + FirebaseAuthInternalAdditionalUserInfo* self) { + g_return_val_if_fail(FIREBASE_AUTH_IS_INTERNAL_ADDITIONAL_USER_INFO(self), + FALSE); + return self->is_new_user; +} + +const gchar* firebase_auth_internal_additional_user_info_get_provider_id( + FirebaseAuthInternalAdditionalUserInfo* self) { + g_return_val_if_fail(FIREBASE_AUTH_IS_INTERNAL_ADDITIONAL_USER_INFO(self), + nullptr); + return self->provider_id; +} + +const gchar* firebase_auth_internal_additional_user_info_get_username( + FirebaseAuthInternalAdditionalUserInfo* self) { + g_return_val_if_fail(FIREBASE_AUTH_IS_INTERNAL_ADDITIONAL_USER_INFO(self), + nullptr); + return self->username; +} + +const gchar* firebase_auth_internal_additional_user_info_get_authorization_code( + FirebaseAuthInternalAdditionalUserInfo* self) { + g_return_val_if_fail(FIREBASE_AUTH_IS_INTERNAL_ADDITIONAL_USER_INFO(self), + nullptr); + return self->authorization_code; +} + +FlValue* firebase_auth_internal_additional_user_info_get_profile( + FirebaseAuthInternalAdditionalUserInfo* self) { + g_return_val_if_fail(FIREBASE_AUTH_IS_INTERNAL_ADDITIONAL_USER_INFO(self), + nullptr); + return self->profile; +} + +static FlValue* firebase_auth_internal_additional_user_info_to_list( + FirebaseAuthInternalAdditionalUserInfo* self) { + FlValue* values = fl_value_new_list(); + fl_value_append_take(values, fl_value_new_bool(self->is_new_user)); + fl_value_append_take(values, self->provider_id != nullptr + ? fl_value_new_string(self->provider_id) + : fl_value_new_null()); + fl_value_append_take(values, self->username != nullptr + ? fl_value_new_string(self->username) + : fl_value_new_null()); + fl_value_append_take(values, + self->authorization_code != nullptr + ? fl_value_new_string(self->authorization_code) + : fl_value_new_null()); + fl_value_append_take(values, self->profile != nullptr + ? fl_value_ref(self->profile) + : fl_value_new_null()); + return values; +} + +static FirebaseAuthInternalAdditionalUserInfo* +firebase_auth_internal_additional_user_info_new_from_list(FlValue* values) { + FlValue* value0 = fl_value_get_list_value(values, 0); + gboolean is_new_user = fl_value_get_bool(value0); + FlValue* value1 = fl_value_get_list_value(values, 1); + const gchar* provider_id = nullptr; + if (fl_value_get_type(value1) != FL_VALUE_TYPE_NULL) { + provider_id = fl_value_get_string(value1); + } + FlValue* value2 = fl_value_get_list_value(values, 2); + const gchar* username = nullptr; + if (fl_value_get_type(value2) != FL_VALUE_TYPE_NULL) { + username = fl_value_get_string(value2); + } + FlValue* value3 = fl_value_get_list_value(values, 3); + const gchar* authorization_code = nullptr; + if (fl_value_get_type(value3) != FL_VALUE_TYPE_NULL) { + authorization_code = fl_value_get_string(value3); + } + FlValue* value4 = fl_value_get_list_value(values, 4); + FlValue* profile = nullptr; + if (fl_value_get_type(value4) != FL_VALUE_TYPE_NULL) { + profile = value4; + } + return firebase_auth_internal_additional_user_info_new( + is_new_user, provider_id, username, authorization_code, profile); +} + +gboolean firebase_auth_internal_additional_user_info_equals( + FirebaseAuthInternalAdditionalUserInfo* a, + FirebaseAuthInternalAdditionalUserInfo* b) { + if (a == b) { + return TRUE; + } + if (a == nullptr || b == nullptr) { + return FALSE; + } + if (a->is_new_user != b->is_new_user) { + return FALSE; + } + if (g_strcmp0(a->provider_id, b->provider_id) != 0) { + return FALSE; + } + if (g_strcmp0(a->username, b->username) != 0) { + return FALSE; + } + if (g_strcmp0(a->authorization_code, b->authorization_code) != 0) { + return FALSE; + } + if (!flpigeon_deep_equals(a->profile, b->profile)) { + return FALSE; + } + return TRUE; +} + +guint firebase_auth_internal_additional_user_info_hash( + FirebaseAuthInternalAdditionalUserInfo* self) { + g_return_val_if_fail(FIREBASE_AUTH_IS_INTERNAL_ADDITIONAL_USER_INFO(self), 0); + guint result = 0; + result = result * 31 + static_cast(self->is_new_user); + result = result * 31 + + (self->provider_id != nullptr ? g_str_hash(self->provider_id) : 0); + result = result * 31 + + (self->username != nullptr ? g_str_hash(self->username) : 0); + result = result * 31 + (self->authorization_code != nullptr + ? g_str_hash(self->authorization_code) + : 0); + result = result * 31 + flpigeon_deep_hash(self->profile); + return result; +} + +struct _FirebaseAuthInternalAuthCredential { + GObject parent_instance; + + gchar* provider_id; + gchar* sign_in_method; + int64_t native_id; + gchar* access_token; +}; + +G_DEFINE_TYPE(FirebaseAuthInternalAuthCredential, + firebase_auth_internal_auth_credential, G_TYPE_OBJECT) + +static void firebase_auth_internal_auth_credential_dispose(GObject* object) { + FirebaseAuthInternalAuthCredential* self = + FIREBASE_AUTH_INTERNAL_AUTH_CREDENTIAL(object); + g_clear_pointer(&self->provider_id, g_free); + g_clear_pointer(&self->sign_in_method, g_free); + g_clear_pointer(&self->access_token, g_free); + G_OBJECT_CLASS(firebase_auth_internal_auth_credential_parent_class) + ->dispose(object); +} + +static void firebase_auth_internal_auth_credential_init( + FirebaseAuthInternalAuthCredential* self) {} + +static void firebase_auth_internal_auth_credential_class_init( + FirebaseAuthInternalAuthCredentialClass* klass) { + G_OBJECT_CLASS(klass)->dispose = + firebase_auth_internal_auth_credential_dispose; +} + +FirebaseAuthInternalAuthCredential* firebase_auth_internal_auth_credential_new( + const gchar* provider_id, const gchar* sign_in_method, int64_t native_id, + const gchar* access_token) { + FirebaseAuthInternalAuthCredential* self = + FIREBASE_AUTH_INTERNAL_AUTH_CREDENTIAL(g_object_new( + firebase_auth_internal_auth_credential_get_type(), nullptr)); + self->provider_id = g_strdup(provider_id); + self->sign_in_method = g_strdup(sign_in_method); + self->native_id = native_id; + if (access_token != nullptr) { + self->access_token = g_strdup(access_token); + } else { + self->access_token = nullptr; + } + return self; +} + +const gchar* firebase_auth_internal_auth_credential_get_provider_id( + FirebaseAuthInternalAuthCredential* self) { + g_return_val_if_fail(FIREBASE_AUTH_IS_INTERNAL_AUTH_CREDENTIAL(self), + nullptr); + return self->provider_id; +} + +const gchar* firebase_auth_internal_auth_credential_get_sign_in_method( + FirebaseAuthInternalAuthCredential* self) { + g_return_val_if_fail(FIREBASE_AUTH_IS_INTERNAL_AUTH_CREDENTIAL(self), + nullptr); + return self->sign_in_method; +} + +int64_t firebase_auth_internal_auth_credential_get_native_id( + FirebaseAuthInternalAuthCredential* self) { + g_return_val_if_fail(FIREBASE_AUTH_IS_INTERNAL_AUTH_CREDENTIAL(self), 0); + return self->native_id; +} + +const gchar* firebase_auth_internal_auth_credential_get_access_token( + FirebaseAuthInternalAuthCredential* self) { + g_return_val_if_fail(FIREBASE_AUTH_IS_INTERNAL_AUTH_CREDENTIAL(self), + nullptr); + return self->access_token; +} + +static FlValue* firebase_auth_internal_auth_credential_to_list( + FirebaseAuthInternalAuthCredential* self) { + FlValue* values = fl_value_new_list(); + fl_value_append_take(values, fl_value_new_string(self->provider_id)); + fl_value_append_take(values, fl_value_new_string(self->sign_in_method)); + fl_value_append_take(values, fl_value_new_int(self->native_id)); + fl_value_append_take(values, self->access_token != nullptr + ? fl_value_new_string(self->access_token) + : fl_value_new_null()); + return values; +} + +static FirebaseAuthInternalAuthCredential* +firebase_auth_internal_auth_credential_new_from_list(FlValue* values) { + FlValue* value0 = fl_value_get_list_value(values, 0); + const gchar* provider_id = fl_value_get_string(value0); + FlValue* value1 = fl_value_get_list_value(values, 1); + const gchar* sign_in_method = fl_value_get_string(value1); + FlValue* value2 = fl_value_get_list_value(values, 2); + int64_t native_id = fl_value_get_int(value2); + FlValue* value3 = fl_value_get_list_value(values, 3); + const gchar* access_token = nullptr; + if (fl_value_get_type(value3) != FL_VALUE_TYPE_NULL) { + access_token = fl_value_get_string(value3); + } + return firebase_auth_internal_auth_credential_new(provider_id, sign_in_method, + native_id, access_token); +} + +gboolean firebase_auth_internal_auth_credential_equals( + FirebaseAuthInternalAuthCredential* a, + FirebaseAuthInternalAuthCredential* b) { + if (a == b) { + return TRUE; + } + if (a == nullptr || b == nullptr) { + return FALSE; + } + if (g_strcmp0(a->provider_id, b->provider_id) != 0) { + return FALSE; + } + if (g_strcmp0(a->sign_in_method, b->sign_in_method) != 0) { + return FALSE; + } + if (a->native_id != b->native_id) { + return FALSE; + } + if (g_strcmp0(a->access_token, b->access_token) != 0) { + return FALSE; + } + return TRUE; +} + +guint firebase_auth_internal_auth_credential_hash( + FirebaseAuthInternalAuthCredential* self) { + g_return_val_if_fail(FIREBASE_AUTH_IS_INTERNAL_AUTH_CREDENTIAL(self), 0); + guint result = 0; + result = result * 31 + + (self->provider_id != nullptr ? g_str_hash(self->provider_id) : 0); + result = + result * 31 + + (self->sign_in_method != nullptr ? g_str_hash(self->sign_in_method) : 0); + result = result * 31 + static_cast(self->native_id); + result = result * 31 + + (self->access_token != nullptr ? g_str_hash(self->access_token) : 0); + return result; +} + +struct _FirebaseAuthInternalUserInfo { + GObject parent_instance; + + gchar* uid; + gchar* email; + gchar* display_name; + gchar* photo_url; + gchar* phone_number; + gboolean is_anonymous; + gboolean is_email_verified; + gchar* provider_id; + gchar* tenant_id; + gchar* refresh_token; + int64_t* creation_timestamp; + int64_t* last_sign_in_timestamp; +}; + +G_DEFINE_TYPE(FirebaseAuthInternalUserInfo, firebase_auth_internal_user_info, + G_TYPE_OBJECT) + +static void firebase_auth_internal_user_info_dispose(GObject* object) { + FirebaseAuthInternalUserInfo* self = FIREBASE_AUTH_INTERNAL_USER_INFO(object); + g_clear_pointer(&self->uid, g_free); + g_clear_pointer(&self->email, g_free); + g_clear_pointer(&self->display_name, g_free); + g_clear_pointer(&self->photo_url, g_free); + g_clear_pointer(&self->phone_number, g_free); + g_clear_pointer(&self->provider_id, g_free); + g_clear_pointer(&self->tenant_id, g_free); + g_clear_pointer(&self->refresh_token, g_free); + g_clear_pointer(&self->creation_timestamp, g_free); + g_clear_pointer(&self->last_sign_in_timestamp, g_free); + G_OBJECT_CLASS(firebase_auth_internal_user_info_parent_class) + ->dispose(object); +} + +static void firebase_auth_internal_user_info_init( + FirebaseAuthInternalUserInfo* self) {} + +static void firebase_auth_internal_user_info_class_init( + FirebaseAuthInternalUserInfoClass* klass) { + G_OBJECT_CLASS(klass)->dispose = firebase_auth_internal_user_info_dispose; +} + +FirebaseAuthInternalUserInfo* firebase_auth_internal_user_info_new( + const gchar* uid, const gchar* email, const gchar* display_name, + const gchar* photo_url, const gchar* phone_number, gboolean is_anonymous, + gboolean is_email_verified, const gchar* provider_id, + const gchar* tenant_id, const gchar* refresh_token, + int64_t* creation_timestamp, int64_t* last_sign_in_timestamp) { + FirebaseAuthInternalUserInfo* self = FIREBASE_AUTH_INTERNAL_USER_INFO( + g_object_new(firebase_auth_internal_user_info_get_type(), nullptr)); + self->uid = g_strdup(uid); + if (email != nullptr) { + self->email = g_strdup(email); + } else { + self->email = nullptr; + } + if (display_name != nullptr) { + self->display_name = g_strdup(display_name); + } else { + self->display_name = nullptr; + } + if (photo_url != nullptr) { + self->photo_url = g_strdup(photo_url); + } else { + self->photo_url = nullptr; + } + if (phone_number != nullptr) { + self->phone_number = g_strdup(phone_number); + } else { + self->phone_number = nullptr; + } + self->is_anonymous = is_anonymous; + self->is_email_verified = is_email_verified; + if (provider_id != nullptr) { + self->provider_id = g_strdup(provider_id); + } else { + self->provider_id = nullptr; + } + if (tenant_id != nullptr) { + self->tenant_id = g_strdup(tenant_id); + } else { + self->tenant_id = nullptr; + } + if (refresh_token != nullptr) { + self->refresh_token = g_strdup(refresh_token); + } else { + self->refresh_token = nullptr; + } + if (creation_timestamp != nullptr) { + self->creation_timestamp = static_cast(malloc(sizeof(int64_t))); + *self->creation_timestamp = *creation_timestamp; + } else { + self->creation_timestamp = nullptr; + } + if (last_sign_in_timestamp != nullptr) { + self->last_sign_in_timestamp = + static_cast(malloc(sizeof(int64_t))); + *self->last_sign_in_timestamp = *last_sign_in_timestamp; + } else { + self->last_sign_in_timestamp = nullptr; + } + return self; +} + +const gchar* firebase_auth_internal_user_info_get_uid( + FirebaseAuthInternalUserInfo* self) { + g_return_val_if_fail(FIREBASE_AUTH_IS_INTERNAL_USER_INFO(self), nullptr); + return self->uid; +} + +const gchar* firebase_auth_internal_user_info_get_email( + FirebaseAuthInternalUserInfo* self) { + g_return_val_if_fail(FIREBASE_AUTH_IS_INTERNAL_USER_INFO(self), nullptr); + return self->email; +} + +const gchar* firebase_auth_internal_user_info_get_display_name( + FirebaseAuthInternalUserInfo* self) { + g_return_val_if_fail(FIREBASE_AUTH_IS_INTERNAL_USER_INFO(self), nullptr); + return self->display_name; +} + +const gchar* firebase_auth_internal_user_info_get_photo_url( + FirebaseAuthInternalUserInfo* self) { + g_return_val_if_fail(FIREBASE_AUTH_IS_INTERNAL_USER_INFO(self), nullptr); + return self->photo_url; +} + +const gchar* firebase_auth_internal_user_info_get_phone_number( + FirebaseAuthInternalUserInfo* self) { + g_return_val_if_fail(FIREBASE_AUTH_IS_INTERNAL_USER_INFO(self), nullptr); + return self->phone_number; +} + +gboolean firebase_auth_internal_user_info_get_is_anonymous( + FirebaseAuthInternalUserInfo* self) { + g_return_val_if_fail(FIREBASE_AUTH_IS_INTERNAL_USER_INFO(self), FALSE); + return self->is_anonymous; +} + +gboolean firebase_auth_internal_user_info_get_is_email_verified( + FirebaseAuthInternalUserInfo* self) { + g_return_val_if_fail(FIREBASE_AUTH_IS_INTERNAL_USER_INFO(self), FALSE); + return self->is_email_verified; +} + +const gchar* firebase_auth_internal_user_info_get_provider_id( + FirebaseAuthInternalUserInfo* self) { + g_return_val_if_fail(FIREBASE_AUTH_IS_INTERNAL_USER_INFO(self), nullptr); + return self->provider_id; +} + +const gchar* firebase_auth_internal_user_info_get_tenant_id( + FirebaseAuthInternalUserInfo* self) { + g_return_val_if_fail(FIREBASE_AUTH_IS_INTERNAL_USER_INFO(self), nullptr); + return self->tenant_id; +} + +const gchar* firebase_auth_internal_user_info_get_refresh_token( + FirebaseAuthInternalUserInfo* self) { + g_return_val_if_fail(FIREBASE_AUTH_IS_INTERNAL_USER_INFO(self), nullptr); + return self->refresh_token; +} + +int64_t* firebase_auth_internal_user_info_get_creation_timestamp( + FirebaseAuthInternalUserInfo* self) { + g_return_val_if_fail(FIREBASE_AUTH_IS_INTERNAL_USER_INFO(self), nullptr); + return self->creation_timestamp; +} + +int64_t* firebase_auth_internal_user_info_get_last_sign_in_timestamp( + FirebaseAuthInternalUserInfo* self) { + g_return_val_if_fail(FIREBASE_AUTH_IS_INTERNAL_USER_INFO(self), nullptr); + return self->last_sign_in_timestamp; +} + +static FlValue* firebase_auth_internal_user_info_to_list( + FirebaseAuthInternalUserInfo* self) { + FlValue* values = fl_value_new_list(); + fl_value_append_take(values, fl_value_new_string(self->uid)); + fl_value_append_take(values, self->email != nullptr + ? fl_value_new_string(self->email) + : fl_value_new_null()); + fl_value_append_take(values, self->display_name != nullptr + ? fl_value_new_string(self->display_name) + : fl_value_new_null()); + fl_value_append_take(values, self->photo_url != nullptr + ? fl_value_new_string(self->photo_url) + : fl_value_new_null()); + fl_value_append_take(values, self->phone_number != nullptr + ? fl_value_new_string(self->phone_number) + : fl_value_new_null()); + fl_value_append_take(values, fl_value_new_bool(self->is_anonymous)); + fl_value_append_take(values, fl_value_new_bool(self->is_email_verified)); + fl_value_append_take(values, self->provider_id != nullptr + ? fl_value_new_string(self->provider_id) + : fl_value_new_null()); + fl_value_append_take(values, self->tenant_id != nullptr + ? fl_value_new_string(self->tenant_id) + : fl_value_new_null()); + fl_value_append_take(values, self->refresh_token != nullptr + ? fl_value_new_string(self->refresh_token) + : fl_value_new_null()); + fl_value_append_take(values, self->creation_timestamp != nullptr + ? fl_value_new_int(*self->creation_timestamp) + : fl_value_new_null()); + fl_value_append_take(values, + self->last_sign_in_timestamp != nullptr + ? fl_value_new_int(*self->last_sign_in_timestamp) + : fl_value_new_null()); + return values; +} + +static FirebaseAuthInternalUserInfo* +firebase_auth_internal_user_info_new_from_list(FlValue* values) { + FlValue* value0 = fl_value_get_list_value(values, 0); + const gchar* uid = fl_value_get_string(value0); + FlValue* value1 = fl_value_get_list_value(values, 1); + const gchar* email = nullptr; + if (fl_value_get_type(value1) != FL_VALUE_TYPE_NULL) { + email = fl_value_get_string(value1); + } + FlValue* value2 = fl_value_get_list_value(values, 2); + const gchar* display_name = nullptr; + if (fl_value_get_type(value2) != FL_VALUE_TYPE_NULL) { + display_name = fl_value_get_string(value2); + } + FlValue* value3 = fl_value_get_list_value(values, 3); + const gchar* photo_url = nullptr; + if (fl_value_get_type(value3) != FL_VALUE_TYPE_NULL) { + photo_url = fl_value_get_string(value3); + } + FlValue* value4 = fl_value_get_list_value(values, 4); + const gchar* phone_number = nullptr; + if (fl_value_get_type(value4) != FL_VALUE_TYPE_NULL) { + phone_number = fl_value_get_string(value4); + } + FlValue* value5 = fl_value_get_list_value(values, 5); + gboolean is_anonymous = fl_value_get_bool(value5); + FlValue* value6 = fl_value_get_list_value(values, 6); + gboolean is_email_verified = fl_value_get_bool(value6); + FlValue* value7 = fl_value_get_list_value(values, 7); + const gchar* provider_id = nullptr; + if (fl_value_get_type(value7) != FL_VALUE_TYPE_NULL) { + provider_id = fl_value_get_string(value7); + } + FlValue* value8 = fl_value_get_list_value(values, 8); + const gchar* tenant_id = nullptr; + if (fl_value_get_type(value8) != FL_VALUE_TYPE_NULL) { + tenant_id = fl_value_get_string(value8); + } + FlValue* value9 = fl_value_get_list_value(values, 9); + const gchar* refresh_token = nullptr; + if (fl_value_get_type(value9) != FL_VALUE_TYPE_NULL) { + refresh_token = fl_value_get_string(value9); + } + FlValue* value10 = fl_value_get_list_value(values, 10); + int64_t* creation_timestamp = nullptr; + int64_t creation_timestamp_value; + if (fl_value_get_type(value10) != FL_VALUE_TYPE_NULL) { + creation_timestamp_value = fl_value_get_int(value10); + creation_timestamp = &creation_timestamp_value; + } + FlValue* value11 = fl_value_get_list_value(values, 11); + int64_t* last_sign_in_timestamp = nullptr; + int64_t last_sign_in_timestamp_value; + if (fl_value_get_type(value11) != FL_VALUE_TYPE_NULL) { + last_sign_in_timestamp_value = fl_value_get_int(value11); + last_sign_in_timestamp = &last_sign_in_timestamp_value; + } + return firebase_auth_internal_user_info_new( + uid, email, display_name, photo_url, phone_number, is_anonymous, + is_email_verified, provider_id, tenant_id, refresh_token, + creation_timestamp, last_sign_in_timestamp); +} + +gboolean firebase_auth_internal_user_info_equals( + FirebaseAuthInternalUserInfo* a, FirebaseAuthInternalUserInfo* b) { + if (a == b) { + return TRUE; + } + if (a == nullptr || b == nullptr) { + return FALSE; + } + if (g_strcmp0(a->uid, b->uid) != 0) { + return FALSE; + } + if (g_strcmp0(a->email, b->email) != 0) { + return FALSE; + } + if (g_strcmp0(a->display_name, b->display_name) != 0) { + return FALSE; + } + if (g_strcmp0(a->photo_url, b->photo_url) != 0) { + return FALSE; + } + if (g_strcmp0(a->phone_number, b->phone_number) != 0) { + return FALSE; + } + if (a->is_anonymous != b->is_anonymous) { + return FALSE; + } + if (a->is_email_verified != b->is_email_verified) { + return FALSE; + } + if (g_strcmp0(a->provider_id, b->provider_id) != 0) { + return FALSE; + } + if (g_strcmp0(a->tenant_id, b->tenant_id) != 0) { + return FALSE; + } + if (g_strcmp0(a->refresh_token, b->refresh_token) != 0) { + return FALSE; + } + if ((a->creation_timestamp == nullptr) != + (b->creation_timestamp == nullptr)) { + return FALSE; + } + if (a->creation_timestamp != nullptr && + *a->creation_timestamp != *b->creation_timestamp) { + return FALSE; + } + if ((a->last_sign_in_timestamp == nullptr) != + (b->last_sign_in_timestamp == nullptr)) { + return FALSE; + } + if (a->last_sign_in_timestamp != nullptr && + *a->last_sign_in_timestamp != *b->last_sign_in_timestamp) { + return FALSE; + } + return TRUE; +} + +guint firebase_auth_internal_user_info_hash( + FirebaseAuthInternalUserInfo* self) { + g_return_val_if_fail(FIREBASE_AUTH_IS_INTERNAL_USER_INFO(self), 0); + guint result = 0; + result = result * 31 + (self->uid != nullptr ? g_str_hash(self->uid) : 0); + result = result * 31 + (self->email != nullptr ? g_str_hash(self->email) : 0); + result = result * 31 + + (self->display_name != nullptr ? g_str_hash(self->display_name) : 0); + result = result * 31 + + (self->photo_url != nullptr ? g_str_hash(self->photo_url) : 0); + result = result * 31 + + (self->phone_number != nullptr ? g_str_hash(self->phone_number) : 0); + result = result * 31 + static_cast(self->is_anonymous); + result = result * 31 + static_cast(self->is_email_verified); + result = result * 31 + + (self->provider_id != nullptr ? g_str_hash(self->provider_id) : 0); + result = result * 31 + + (self->tenant_id != nullptr ? g_str_hash(self->tenant_id) : 0); + result = + result * 31 + + (self->refresh_token != nullptr ? g_str_hash(self->refresh_token) : 0); + result = result * 31 + (self->creation_timestamp != nullptr + ? static_cast(*self->creation_timestamp) + : 0); + result = + result * 31 + (self->last_sign_in_timestamp != nullptr + ? static_cast(*self->last_sign_in_timestamp) + : 0); + return result; +} + +struct _FirebaseAuthInternalUserDetails { + GObject parent_instance; + + FirebaseAuthInternalUserInfo* user_info; + FlValue* provider_data; +}; + +G_DEFINE_TYPE(FirebaseAuthInternalUserDetails, + firebase_auth_internal_user_details, G_TYPE_OBJECT) + +static void firebase_auth_internal_user_details_dispose(GObject* object) { + FirebaseAuthInternalUserDetails* self = + FIREBASE_AUTH_INTERNAL_USER_DETAILS(object); + g_clear_object(&self->user_info); + g_clear_pointer(&self->provider_data, fl_value_unref); + G_OBJECT_CLASS(firebase_auth_internal_user_details_parent_class) + ->dispose(object); +} + +static void firebase_auth_internal_user_details_init( + FirebaseAuthInternalUserDetails* self) {} + +static void firebase_auth_internal_user_details_class_init( + FirebaseAuthInternalUserDetailsClass* klass) { + G_OBJECT_CLASS(klass)->dispose = firebase_auth_internal_user_details_dispose; +} + +FirebaseAuthInternalUserDetails* firebase_auth_internal_user_details_new( + FirebaseAuthInternalUserInfo* user_info, FlValue* provider_data) { + FirebaseAuthInternalUserDetails* self = FIREBASE_AUTH_INTERNAL_USER_DETAILS( + g_object_new(firebase_auth_internal_user_details_get_type(), nullptr)); + self->user_info = FIREBASE_AUTH_INTERNAL_USER_INFO(g_object_ref(user_info)); + self->provider_data = fl_value_ref(provider_data); + return self; +} + +FirebaseAuthInternalUserInfo* firebase_auth_internal_user_details_get_user_info( + FirebaseAuthInternalUserDetails* self) { + g_return_val_if_fail(FIREBASE_AUTH_IS_INTERNAL_USER_DETAILS(self), nullptr); + return self->user_info; +} + +FlValue* firebase_auth_internal_user_details_get_provider_data( + FirebaseAuthInternalUserDetails* self) { + g_return_val_if_fail(FIREBASE_AUTH_IS_INTERNAL_USER_DETAILS(self), nullptr); + return self->provider_data; +} + +static FlValue* firebase_auth_internal_user_details_to_list( + FirebaseAuthInternalUserDetails* self) { + FlValue* values = fl_value_new_list(); + fl_value_append_take(values, fl_value_new_custom_object( + firebase_auth_internal_user_info_type_id, + G_OBJECT(self->user_info))); + fl_value_append_take(values, fl_value_ref(self->provider_data)); + return values; +} + +static FirebaseAuthInternalUserDetails* +firebase_auth_internal_user_details_new_from_list(FlValue* values) { + FlValue* value0 = fl_value_get_list_value(values, 0); + FirebaseAuthInternalUserInfo* user_info = FIREBASE_AUTH_INTERNAL_USER_INFO( + fl_value_get_custom_value_object(value0)); + FlValue* value1 = fl_value_get_list_value(values, 1); + FlValue* provider_data = value1; + return firebase_auth_internal_user_details_new(user_info, provider_data); +} + +gboolean firebase_auth_internal_user_details_equals( + FirebaseAuthInternalUserDetails* a, FirebaseAuthInternalUserDetails* b) { + if (a == b) { + return TRUE; + } + if (a == nullptr || b == nullptr) { + return FALSE; + } + if (!firebase_auth_internal_user_info_equals(a->user_info, b->user_info)) { + return FALSE; + } + if (!flpigeon_deep_equals(a->provider_data, b->provider_data)) { + return FALSE; + } + return TRUE; +} + +guint firebase_auth_internal_user_details_hash( + FirebaseAuthInternalUserDetails* self) { + g_return_val_if_fail(FIREBASE_AUTH_IS_INTERNAL_USER_DETAILS(self), 0); + guint result = 0; + result = result * 31 + firebase_auth_internal_user_info_hash(self->user_info); + result = result * 31 + flpigeon_deep_hash(self->provider_data); + return result; +} + +struct _FirebaseAuthInternalUserCredential { + GObject parent_instance; + + FirebaseAuthInternalUserDetails* user; + FirebaseAuthInternalAdditionalUserInfo* additional_user_info; + FirebaseAuthInternalAuthCredential* credential; +}; + +G_DEFINE_TYPE(FirebaseAuthInternalUserCredential, + firebase_auth_internal_user_credential, G_TYPE_OBJECT) + +static void firebase_auth_internal_user_credential_dispose(GObject* object) { + FirebaseAuthInternalUserCredential* self = + FIREBASE_AUTH_INTERNAL_USER_CREDENTIAL(object); + g_clear_object(&self->user); + g_clear_object(&self->additional_user_info); + g_clear_object(&self->credential); + G_OBJECT_CLASS(firebase_auth_internal_user_credential_parent_class) + ->dispose(object); +} + +static void firebase_auth_internal_user_credential_init( + FirebaseAuthInternalUserCredential* self) {} + +static void firebase_auth_internal_user_credential_class_init( + FirebaseAuthInternalUserCredentialClass* klass) { + G_OBJECT_CLASS(klass)->dispose = + firebase_auth_internal_user_credential_dispose; +} + +FirebaseAuthInternalUserCredential* firebase_auth_internal_user_credential_new( + FirebaseAuthInternalUserDetails* user, + FirebaseAuthInternalAdditionalUserInfo* additional_user_info, + FirebaseAuthInternalAuthCredential* credential) { + FirebaseAuthInternalUserCredential* self = + FIREBASE_AUTH_INTERNAL_USER_CREDENTIAL(g_object_new( + firebase_auth_internal_user_credential_get_type(), nullptr)); + if (user != nullptr) { + self->user = FIREBASE_AUTH_INTERNAL_USER_DETAILS(g_object_ref(user)); + } else { + self->user = nullptr; + } + if (additional_user_info != nullptr) { + self->additional_user_info = FIREBASE_AUTH_INTERNAL_ADDITIONAL_USER_INFO( + g_object_ref(additional_user_info)); + } else { + self->additional_user_info = nullptr; + } + if (credential != nullptr) { + self->credential = + FIREBASE_AUTH_INTERNAL_AUTH_CREDENTIAL(g_object_ref(credential)); + } else { + self->credential = nullptr; + } + return self; +} + +FirebaseAuthInternalUserDetails* +firebase_auth_internal_user_credential_get_user( + FirebaseAuthInternalUserCredential* self) { + g_return_val_if_fail(FIREBASE_AUTH_IS_INTERNAL_USER_CREDENTIAL(self), + nullptr); + return self->user; +} + +FirebaseAuthInternalAdditionalUserInfo* +firebase_auth_internal_user_credential_get_additional_user_info( + FirebaseAuthInternalUserCredential* self) { + g_return_val_if_fail(FIREBASE_AUTH_IS_INTERNAL_USER_CREDENTIAL(self), + nullptr); + return self->additional_user_info; +} + +FirebaseAuthInternalAuthCredential* +firebase_auth_internal_user_credential_get_credential( + FirebaseAuthInternalUserCredential* self) { + g_return_val_if_fail(FIREBASE_AUTH_IS_INTERNAL_USER_CREDENTIAL(self), + nullptr); + return self->credential; +} + +static FlValue* firebase_auth_internal_user_credential_to_list( + FirebaseAuthInternalUserCredential* self) { + FlValue* values = fl_value_new_list(); + fl_value_append_take(values, + self->user != nullptr + ? fl_value_new_custom_object( + firebase_auth_internal_user_details_type_id, + G_OBJECT(self->user)) + : fl_value_new_null()); + fl_value_append_take( + values, self->additional_user_info != nullptr + ? fl_value_new_custom_object( + firebase_auth_internal_additional_user_info_type_id, + G_OBJECT(self->additional_user_info)) + : fl_value_new_null()); + fl_value_append_take(values, + self->credential != nullptr + ? fl_value_new_custom_object( + firebase_auth_internal_auth_credential_type_id, + G_OBJECT(self->credential)) + : fl_value_new_null()); + return values; +} + +static FirebaseAuthInternalUserCredential* +firebase_auth_internal_user_credential_new_from_list(FlValue* values) { + FlValue* value0 = fl_value_get_list_value(values, 0); + FirebaseAuthInternalUserDetails* user = nullptr; + if (fl_value_get_type(value0) != FL_VALUE_TYPE_NULL) { + user = FIREBASE_AUTH_INTERNAL_USER_DETAILS( + fl_value_get_custom_value_object(value0)); + } + FlValue* value1 = fl_value_get_list_value(values, 1); + FirebaseAuthInternalAdditionalUserInfo* additional_user_info = nullptr; + if (fl_value_get_type(value1) != FL_VALUE_TYPE_NULL) { + additional_user_info = FIREBASE_AUTH_INTERNAL_ADDITIONAL_USER_INFO( + fl_value_get_custom_value_object(value1)); + } + FlValue* value2 = fl_value_get_list_value(values, 2); + FirebaseAuthInternalAuthCredential* credential = nullptr; + if (fl_value_get_type(value2) != FL_VALUE_TYPE_NULL) { + credential = FIREBASE_AUTH_INTERNAL_AUTH_CREDENTIAL( + fl_value_get_custom_value_object(value2)); + } + return firebase_auth_internal_user_credential_new(user, additional_user_info, + credential); +} + +gboolean firebase_auth_internal_user_credential_equals( + FirebaseAuthInternalUserCredential* a, + FirebaseAuthInternalUserCredential* b) { + if (a == b) { + return TRUE; + } + if (a == nullptr || b == nullptr) { + return FALSE; + } + if (!firebase_auth_internal_user_details_equals(a->user, b->user)) { + return FALSE; + } + if (!firebase_auth_internal_additional_user_info_equals( + a->additional_user_info, b->additional_user_info)) { + return FALSE; + } + if (!firebase_auth_internal_auth_credential_equals(a->credential, + b->credential)) { + return FALSE; + } + return TRUE; +} + +guint firebase_auth_internal_user_credential_hash( + FirebaseAuthInternalUserCredential* self) { + g_return_val_if_fail(FIREBASE_AUTH_IS_INTERNAL_USER_CREDENTIAL(self), 0); + guint result = 0; + result = result * 31 + firebase_auth_internal_user_details_hash(self->user); + result = result * 31 + firebase_auth_internal_additional_user_info_hash( + self->additional_user_info); + result = result * 31 + + firebase_auth_internal_auth_credential_hash(self->credential); + return result; +} + +struct _FirebaseAuthInternalAuthCredentialInput { + GObject parent_instance; + + gchar* provider_id; + gchar* sign_in_method; + gchar* token; + gchar* access_token; +}; + +G_DEFINE_TYPE(FirebaseAuthInternalAuthCredentialInput, + firebase_auth_internal_auth_credential_input, G_TYPE_OBJECT) + +static void firebase_auth_internal_auth_credential_input_dispose( + GObject* object) { + FirebaseAuthInternalAuthCredentialInput* self = + FIREBASE_AUTH_INTERNAL_AUTH_CREDENTIAL_INPUT(object); + g_clear_pointer(&self->provider_id, g_free); + g_clear_pointer(&self->sign_in_method, g_free); + g_clear_pointer(&self->token, g_free); + g_clear_pointer(&self->access_token, g_free); + G_OBJECT_CLASS(firebase_auth_internal_auth_credential_input_parent_class) + ->dispose(object); +} + +static void firebase_auth_internal_auth_credential_input_init( + FirebaseAuthInternalAuthCredentialInput* self) {} + +static void firebase_auth_internal_auth_credential_input_class_init( + FirebaseAuthInternalAuthCredentialInputClass* klass) { + G_OBJECT_CLASS(klass)->dispose = + firebase_auth_internal_auth_credential_input_dispose; +} + +FirebaseAuthInternalAuthCredentialInput* +firebase_auth_internal_auth_credential_input_new(const gchar* provider_id, + const gchar* sign_in_method, + const gchar* token, + const gchar* access_token) { + FirebaseAuthInternalAuthCredentialInput* self = + FIREBASE_AUTH_INTERNAL_AUTH_CREDENTIAL_INPUT(g_object_new( + firebase_auth_internal_auth_credential_input_get_type(), nullptr)); + self->provider_id = g_strdup(provider_id); + self->sign_in_method = g_strdup(sign_in_method); + if (token != nullptr) { + self->token = g_strdup(token); + } else { + self->token = nullptr; + } + if (access_token != nullptr) { + self->access_token = g_strdup(access_token); + } else { + self->access_token = nullptr; + } + return self; +} + +const gchar* firebase_auth_internal_auth_credential_input_get_provider_id( + FirebaseAuthInternalAuthCredentialInput* self) { + g_return_val_if_fail(FIREBASE_AUTH_IS_INTERNAL_AUTH_CREDENTIAL_INPUT(self), + nullptr); + return self->provider_id; +} + +const gchar* firebase_auth_internal_auth_credential_input_get_sign_in_method( + FirebaseAuthInternalAuthCredentialInput* self) { + g_return_val_if_fail(FIREBASE_AUTH_IS_INTERNAL_AUTH_CREDENTIAL_INPUT(self), + nullptr); + return self->sign_in_method; +} + +const gchar* firebase_auth_internal_auth_credential_input_get_token( + FirebaseAuthInternalAuthCredentialInput* self) { + g_return_val_if_fail(FIREBASE_AUTH_IS_INTERNAL_AUTH_CREDENTIAL_INPUT(self), + nullptr); + return self->token; +} + +const gchar* firebase_auth_internal_auth_credential_input_get_access_token( + FirebaseAuthInternalAuthCredentialInput* self) { + g_return_val_if_fail(FIREBASE_AUTH_IS_INTERNAL_AUTH_CREDENTIAL_INPUT(self), + nullptr); + return self->access_token; +} + +static FlValue* firebase_auth_internal_auth_credential_input_to_list( + FirebaseAuthInternalAuthCredentialInput* self) { + FlValue* values = fl_value_new_list(); + fl_value_append_take(values, fl_value_new_string(self->provider_id)); + fl_value_append_take(values, fl_value_new_string(self->sign_in_method)); + fl_value_append_take(values, self->token != nullptr + ? fl_value_new_string(self->token) + : fl_value_new_null()); + fl_value_append_take(values, self->access_token != nullptr + ? fl_value_new_string(self->access_token) + : fl_value_new_null()); + return values; +} + +static FirebaseAuthInternalAuthCredentialInput* +firebase_auth_internal_auth_credential_input_new_from_list(FlValue* values) { + FlValue* value0 = fl_value_get_list_value(values, 0); + const gchar* provider_id = fl_value_get_string(value0); + FlValue* value1 = fl_value_get_list_value(values, 1); + const gchar* sign_in_method = fl_value_get_string(value1); + FlValue* value2 = fl_value_get_list_value(values, 2); + const gchar* token = nullptr; + if (fl_value_get_type(value2) != FL_VALUE_TYPE_NULL) { + token = fl_value_get_string(value2); + } + FlValue* value3 = fl_value_get_list_value(values, 3); + const gchar* access_token = nullptr; + if (fl_value_get_type(value3) != FL_VALUE_TYPE_NULL) { + access_token = fl_value_get_string(value3); + } + return firebase_auth_internal_auth_credential_input_new( + provider_id, sign_in_method, token, access_token); +} + +gboolean firebase_auth_internal_auth_credential_input_equals( + FirebaseAuthInternalAuthCredentialInput* a, + FirebaseAuthInternalAuthCredentialInput* b) { + if (a == b) { + return TRUE; + } + if (a == nullptr || b == nullptr) { + return FALSE; + } + if (g_strcmp0(a->provider_id, b->provider_id) != 0) { + return FALSE; + } + if (g_strcmp0(a->sign_in_method, b->sign_in_method) != 0) { + return FALSE; + } + if (g_strcmp0(a->token, b->token) != 0) { + return FALSE; + } + if (g_strcmp0(a->access_token, b->access_token) != 0) { + return FALSE; + } + return TRUE; +} + +guint firebase_auth_internal_auth_credential_input_hash( + FirebaseAuthInternalAuthCredentialInput* self) { + g_return_val_if_fail(FIREBASE_AUTH_IS_INTERNAL_AUTH_CREDENTIAL_INPUT(self), + 0); + guint result = 0; + result = result * 31 + + (self->provider_id != nullptr ? g_str_hash(self->provider_id) : 0); + result = + result * 31 + + (self->sign_in_method != nullptr ? g_str_hash(self->sign_in_method) : 0); + result = result * 31 + (self->token != nullptr ? g_str_hash(self->token) : 0); + result = result * 31 + + (self->access_token != nullptr ? g_str_hash(self->access_token) : 0); + return result; +} + +struct _FirebaseAuthInternalActionCodeSettings { + GObject parent_instance; + + gchar* url; + gchar* dynamic_link_domain; + gboolean handle_code_in_app; + gchar* i_o_s_bundle_id; + gchar* android_package_name; + gboolean android_install_app; + gchar* android_minimum_version; + gchar* link_domain; +}; + +G_DEFINE_TYPE(FirebaseAuthInternalActionCodeSettings, + firebase_auth_internal_action_code_settings, G_TYPE_OBJECT) + +static void firebase_auth_internal_action_code_settings_dispose( + GObject* object) { + FirebaseAuthInternalActionCodeSettings* self = + FIREBASE_AUTH_INTERNAL_ACTION_CODE_SETTINGS(object); + g_clear_pointer(&self->url, g_free); + g_clear_pointer(&self->dynamic_link_domain, g_free); + g_clear_pointer(&self->i_o_s_bundle_id, g_free); + g_clear_pointer(&self->android_package_name, g_free); + g_clear_pointer(&self->android_minimum_version, g_free); + g_clear_pointer(&self->link_domain, g_free); + G_OBJECT_CLASS(firebase_auth_internal_action_code_settings_parent_class) + ->dispose(object); +} + +static void firebase_auth_internal_action_code_settings_init( + FirebaseAuthInternalActionCodeSettings* self) {} + +static void firebase_auth_internal_action_code_settings_class_init( + FirebaseAuthInternalActionCodeSettingsClass* klass) { + G_OBJECT_CLASS(klass)->dispose = + firebase_auth_internal_action_code_settings_dispose; +} + +FirebaseAuthInternalActionCodeSettings* +firebase_auth_internal_action_code_settings_new( + const gchar* url, const gchar* dynamic_link_domain, + gboolean handle_code_in_app, const gchar* i_o_s_bundle_id, + const gchar* android_package_name, gboolean android_install_app, + const gchar* android_minimum_version, const gchar* link_domain) { + FirebaseAuthInternalActionCodeSettings* self = + FIREBASE_AUTH_INTERNAL_ACTION_CODE_SETTINGS(g_object_new( + firebase_auth_internal_action_code_settings_get_type(), nullptr)); + self->url = g_strdup(url); + if (dynamic_link_domain != nullptr) { + self->dynamic_link_domain = g_strdup(dynamic_link_domain); + } else { + self->dynamic_link_domain = nullptr; + } + self->handle_code_in_app = handle_code_in_app; + if (i_o_s_bundle_id != nullptr) { + self->i_o_s_bundle_id = g_strdup(i_o_s_bundle_id); + } else { + self->i_o_s_bundle_id = nullptr; + } + if (android_package_name != nullptr) { + self->android_package_name = g_strdup(android_package_name); + } else { + self->android_package_name = nullptr; + } + self->android_install_app = android_install_app; + if (android_minimum_version != nullptr) { + self->android_minimum_version = g_strdup(android_minimum_version); + } else { + self->android_minimum_version = nullptr; + } + if (link_domain != nullptr) { + self->link_domain = g_strdup(link_domain); + } else { + self->link_domain = nullptr; + } + return self; +} + +const gchar* firebase_auth_internal_action_code_settings_get_url( + FirebaseAuthInternalActionCodeSettings* self) { + g_return_val_if_fail(FIREBASE_AUTH_IS_INTERNAL_ACTION_CODE_SETTINGS(self), + nullptr); + return self->url; +} + +const gchar* +firebase_auth_internal_action_code_settings_get_dynamic_link_domain( + FirebaseAuthInternalActionCodeSettings* self) { + g_return_val_if_fail(FIREBASE_AUTH_IS_INTERNAL_ACTION_CODE_SETTINGS(self), + nullptr); + return self->dynamic_link_domain; +} + +gboolean firebase_auth_internal_action_code_settings_get_handle_code_in_app( + FirebaseAuthInternalActionCodeSettings* self) { + g_return_val_if_fail(FIREBASE_AUTH_IS_INTERNAL_ACTION_CODE_SETTINGS(self), + FALSE); + return self->handle_code_in_app; +} + +const gchar* firebase_auth_internal_action_code_settings_get_i_o_s_bundle_id( + FirebaseAuthInternalActionCodeSettings* self) { + g_return_val_if_fail(FIREBASE_AUTH_IS_INTERNAL_ACTION_CODE_SETTINGS(self), + nullptr); + return self->i_o_s_bundle_id; +} + +const gchar* +firebase_auth_internal_action_code_settings_get_android_package_name( + FirebaseAuthInternalActionCodeSettings* self) { + g_return_val_if_fail(FIREBASE_AUTH_IS_INTERNAL_ACTION_CODE_SETTINGS(self), + nullptr); + return self->android_package_name; +} + +gboolean firebase_auth_internal_action_code_settings_get_android_install_app( + FirebaseAuthInternalActionCodeSettings* self) { + g_return_val_if_fail(FIREBASE_AUTH_IS_INTERNAL_ACTION_CODE_SETTINGS(self), + FALSE); + return self->android_install_app; +} + +const gchar* +firebase_auth_internal_action_code_settings_get_android_minimum_version( + FirebaseAuthInternalActionCodeSettings* self) { + g_return_val_if_fail(FIREBASE_AUTH_IS_INTERNAL_ACTION_CODE_SETTINGS(self), + nullptr); + return self->android_minimum_version; +} + +const gchar* firebase_auth_internal_action_code_settings_get_link_domain( + FirebaseAuthInternalActionCodeSettings* self) { + g_return_val_if_fail(FIREBASE_AUTH_IS_INTERNAL_ACTION_CODE_SETTINGS(self), + nullptr); + return self->link_domain; +} + +static FlValue* firebase_auth_internal_action_code_settings_to_list( + FirebaseAuthInternalActionCodeSettings* self) { + FlValue* values = fl_value_new_list(); + fl_value_append_take(values, fl_value_new_string(self->url)); + fl_value_append_take(values, + self->dynamic_link_domain != nullptr + ? fl_value_new_string(self->dynamic_link_domain) + : fl_value_new_null()); + fl_value_append_take(values, fl_value_new_bool(self->handle_code_in_app)); + fl_value_append_take(values, self->i_o_s_bundle_id != nullptr + ? fl_value_new_string(self->i_o_s_bundle_id) + : fl_value_new_null()); + fl_value_append_take(values, + self->android_package_name != nullptr + ? fl_value_new_string(self->android_package_name) + : fl_value_new_null()); + fl_value_append_take(values, fl_value_new_bool(self->android_install_app)); + fl_value_append_take(values, + self->android_minimum_version != nullptr + ? fl_value_new_string(self->android_minimum_version) + : fl_value_new_null()); + fl_value_append_take(values, self->link_domain != nullptr + ? fl_value_new_string(self->link_domain) + : fl_value_new_null()); + return values; +} + +static FirebaseAuthInternalActionCodeSettings* +firebase_auth_internal_action_code_settings_new_from_list(FlValue* values) { + FlValue* value0 = fl_value_get_list_value(values, 0); + const gchar* url = fl_value_get_string(value0); + FlValue* value1 = fl_value_get_list_value(values, 1); + const gchar* dynamic_link_domain = nullptr; + if (fl_value_get_type(value1) != FL_VALUE_TYPE_NULL) { + dynamic_link_domain = fl_value_get_string(value1); + } + FlValue* value2 = fl_value_get_list_value(values, 2); + gboolean handle_code_in_app = fl_value_get_bool(value2); + FlValue* value3 = fl_value_get_list_value(values, 3); + const gchar* i_o_s_bundle_id = nullptr; + if (fl_value_get_type(value3) != FL_VALUE_TYPE_NULL) { + i_o_s_bundle_id = fl_value_get_string(value3); + } + FlValue* value4 = fl_value_get_list_value(values, 4); + const gchar* android_package_name = nullptr; + if (fl_value_get_type(value4) != FL_VALUE_TYPE_NULL) { + android_package_name = fl_value_get_string(value4); + } + FlValue* value5 = fl_value_get_list_value(values, 5); + gboolean android_install_app = fl_value_get_bool(value5); + FlValue* value6 = fl_value_get_list_value(values, 6); + const gchar* android_minimum_version = nullptr; + if (fl_value_get_type(value6) != FL_VALUE_TYPE_NULL) { + android_minimum_version = fl_value_get_string(value6); + } + FlValue* value7 = fl_value_get_list_value(values, 7); + const gchar* link_domain = nullptr; + if (fl_value_get_type(value7) != FL_VALUE_TYPE_NULL) { + link_domain = fl_value_get_string(value7); + } + return firebase_auth_internal_action_code_settings_new( + url, dynamic_link_domain, handle_code_in_app, i_o_s_bundle_id, + android_package_name, android_install_app, android_minimum_version, + link_domain); +} + +gboolean firebase_auth_internal_action_code_settings_equals( + FirebaseAuthInternalActionCodeSettings* a, + FirebaseAuthInternalActionCodeSettings* b) { + if (a == b) { + return TRUE; + } + if (a == nullptr || b == nullptr) { + return FALSE; + } + if (g_strcmp0(a->url, b->url) != 0) { + return FALSE; + } + if (g_strcmp0(a->dynamic_link_domain, b->dynamic_link_domain) != 0) { + return FALSE; + } + if (a->handle_code_in_app != b->handle_code_in_app) { + return FALSE; + } + if (g_strcmp0(a->i_o_s_bundle_id, b->i_o_s_bundle_id) != 0) { + return FALSE; + } + if (g_strcmp0(a->android_package_name, b->android_package_name) != 0) { + return FALSE; + } + if (a->android_install_app != b->android_install_app) { + return FALSE; + } + if (g_strcmp0(a->android_minimum_version, b->android_minimum_version) != 0) { + return FALSE; + } + if (g_strcmp0(a->link_domain, b->link_domain) != 0) { + return FALSE; + } + return TRUE; +} + +guint firebase_auth_internal_action_code_settings_hash( + FirebaseAuthInternalActionCodeSettings* self) { + g_return_val_if_fail(FIREBASE_AUTH_IS_INTERNAL_ACTION_CODE_SETTINGS(self), 0); + guint result = 0; + result = result * 31 + (self->url != nullptr ? g_str_hash(self->url) : 0); + result = result * 31 + (self->dynamic_link_domain != nullptr + ? g_str_hash(self->dynamic_link_domain) + : 0); + result = result * 31 + static_cast(self->handle_code_in_app); + result = result * 31 + (self->i_o_s_bundle_id != nullptr + ? g_str_hash(self->i_o_s_bundle_id) + : 0); + result = result * 31 + (self->android_package_name != nullptr + ? g_str_hash(self->android_package_name) + : 0); + result = result * 31 + static_cast(self->android_install_app); + result = result * 31 + (self->android_minimum_version != nullptr + ? g_str_hash(self->android_minimum_version) + : 0); + result = result * 31 + + (self->link_domain != nullptr ? g_str_hash(self->link_domain) : 0); + return result; +} + +struct _FirebaseAuthInternalFirebaseAuthSettings { + GObject parent_instance; + + gboolean app_verification_disabled_for_testing; + gchar* user_access_group; + gchar* phone_number; + gchar* sms_code; + gboolean* force_recaptcha_flow; +}; + +G_DEFINE_TYPE(FirebaseAuthInternalFirebaseAuthSettings, + firebase_auth_internal_firebase_auth_settings, G_TYPE_OBJECT) + +static void firebase_auth_internal_firebase_auth_settings_dispose( + GObject* object) { + FirebaseAuthInternalFirebaseAuthSettings* self = + FIREBASE_AUTH_INTERNAL_FIREBASE_AUTH_SETTINGS(object); + g_clear_pointer(&self->user_access_group, g_free); + g_clear_pointer(&self->phone_number, g_free); + g_clear_pointer(&self->sms_code, g_free); + g_clear_pointer(&self->force_recaptcha_flow, g_free); + G_OBJECT_CLASS(firebase_auth_internal_firebase_auth_settings_parent_class) + ->dispose(object); +} + +static void firebase_auth_internal_firebase_auth_settings_init( + FirebaseAuthInternalFirebaseAuthSettings* self) {} + +static void firebase_auth_internal_firebase_auth_settings_class_init( + FirebaseAuthInternalFirebaseAuthSettingsClass* klass) { + G_OBJECT_CLASS(klass)->dispose = + firebase_auth_internal_firebase_auth_settings_dispose; +} + +FirebaseAuthInternalFirebaseAuthSettings* +firebase_auth_internal_firebase_auth_settings_new( + gboolean app_verification_disabled_for_testing, + const gchar* user_access_group, const gchar* phone_number, + const gchar* sms_code, gboolean* force_recaptcha_flow) { + FirebaseAuthInternalFirebaseAuthSettings* self = + FIREBASE_AUTH_INTERNAL_FIREBASE_AUTH_SETTINGS(g_object_new( + firebase_auth_internal_firebase_auth_settings_get_type(), nullptr)); + self->app_verification_disabled_for_testing = + app_verification_disabled_for_testing; + if (user_access_group != nullptr) { + self->user_access_group = g_strdup(user_access_group); + } else { + self->user_access_group = nullptr; + } + if (phone_number != nullptr) { + self->phone_number = g_strdup(phone_number); + } else { + self->phone_number = nullptr; + } + if (sms_code != nullptr) { + self->sms_code = g_strdup(sms_code); + } else { + self->sms_code = nullptr; + } + if (force_recaptcha_flow != nullptr) { + self->force_recaptcha_flow = + static_cast(malloc(sizeof(gboolean))); + *self->force_recaptcha_flow = *force_recaptcha_flow; + } else { + self->force_recaptcha_flow = nullptr; + } + return self; +} + +gboolean +firebase_auth_internal_firebase_auth_settings_get_app_verification_disabled_for_testing( + FirebaseAuthInternalFirebaseAuthSettings* self) { + g_return_val_if_fail(FIREBASE_AUTH_IS_INTERNAL_FIREBASE_AUTH_SETTINGS(self), + FALSE); + return self->app_verification_disabled_for_testing; +} + +const gchar* +firebase_auth_internal_firebase_auth_settings_get_user_access_group( + FirebaseAuthInternalFirebaseAuthSettings* self) { + g_return_val_if_fail(FIREBASE_AUTH_IS_INTERNAL_FIREBASE_AUTH_SETTINGS(self), + nullptr); + return self->user_access_group; +} + +const gchar* firebase_auth_internal_firebase_auth_settings_get_phone_number( + FirebaseAuthInternalFirebaseAuthSettings* self) { + g_return_val_if_fail(FIREBASE_AUTH_IS_INTERNAL_FIREBASE_AUTH_SETTINGS(self), + nullptr); + return self->phone_number; +} + +const gchar* firebase_auth_internal_firebase_auth_settings_get_sms_code( + FirebaseAuthInternalFirebaseAuthSettings* self) { + g_return_val_if_fail(FIREBASE_AUTH_IS_INTERNAL_FIREBASE_AUTH_SETTINGS(self), + nullptr); + return self->sms_code; +} + +gboolean* +firebase_auth_internal_firebase_auth_settings_get_force_recaptcha_flow( + FirebaseAuthInternalFirebaseAuthSettings* self) { + g_return_val_if_fail(FIREBASE_AUTH_IS_INTERNAL_FIREBASE_AUTH_SETTINGS(self), + nullptr); + return self->force_recaptcha_flow; +} + +static FlValue* firebase_auth_internal_firebase_auth_settings_to_list( + FirebaseAuthInternalFirebaseAuthSettings* self) { + FlValue* values = fl_value_new_list(); + fl_value_append_take( + values, fl_value_new_bool(self->app_verification_disabled_for_testing)); + fl_value_append_take(values, + self->user_access_group != nullptr + ? fl_value_new_string(self->user_access_group) + : fl_value_new_null()); + fl_value_append_take(values, self->phone_number != nullptr + ? fl_value_new_string(self->phone_number) + : fl_value_new_null()); + fl_value_append_take(values, self->sms_code != nullptr + ? fl_value_new_string(self->sms_code) + : fl_value_new_null()); + fl_value_append_take(values, + self->force_recaptcha_flow != nullptr + ? fl_value_new_bool(*self->force_recaptcha_flow) + : fl_value_new_null()); + return values; +} + +static FirebaseAuthInternalFirebaseAuthSettings* +firebase_auth_internal_firebase_auth_settings_new_from_list(FlValue* values) { + FlValue* value0 = fl_value_get_list_value(values, 0); + gboolean app_verification_disabled_for_testing = fl_value_get_bool(value0); + FlValue* value1 = fl_value_get_list_value(values, 1); + const gchar* user_access_group = nullptr; + if (fl_value_get_type(value1) != FL_VALUE_TYPE_NULL) { + user_access_group = fl_value_get_string(value1); + } + FlValue* value2 = fl_value_get_list_value(values, 2); + const gchar* phone_number = nullptr; + if (fl_value_get_type(value2) != FL_VALUE_TYPE_NULL) { + phone_number = fl_value_get_string(value2); + } + FlValue* value3 = fl_value_get_list_value(values, 3); + const gchar* sms_code = nullptr; + if (fl_value_get_type(value3) != FL_VALUE_TYPE_NULL) { + sms_code = fl_value_get_string(value3); + } + FlValue* value4 = fl_value_get_list_value(values, 4); + gboolean* force_recaptcha_flow = nullptr; + gboolean force_recaptcha_flow_value; + if (fl_value_get_type(value4) != FL_VALUE_TYPE_NULL) { + force_recaptcha_flow_value = fl_value_get_bool(value4); + force_recaptcha_flow = &force_recaptcha_flow_value; + } + return firebase_auth_internal_firebase_auth_settings_new( + app_verification_disabled_for_testing, user_access_group, phone_number, + sms_code, force_recaptcha_flow); +} + +gboolean firebase_auth_internal_firebase_auth_settings_equals( + FirebaseAuthInternalFirebaseAuthSettings* a, + FirebaseAuthInternalFirebaseAuthSettings* b) { + if (a == b) { + return TRUE; + } + if (a == nullptr || b == nullptr) { + return FALSE; + } + if (a->app_verification_disabled_for_testing != + b->app_verification_disabled_for_testing) { + return FALSE; + } + if (g_strcmp0(a->user_access_group, b->user_access_group) != 0) { + return FALSE; + } + if (g_strcmp0(a->phone_number, b->phone_number) != 0) { + return FALSE; + } + if (g_strcmp0(a->sms_code, b->sms_code) != 0) { + return FALSE; + } + if ((a->force_recaptcha_flow == nullptr) != + (b->force_recaptcha_flow == nullptr)) { + return FALSE; + } + if (a->force_recaptcha_flow != nullptr && + *a->force_recaptcha_flow != *b->force_recaptcha_flow) { + return FALSE; + } + return TRUE; +} + +guint firebase_auth_internal_firebase_auth_settings_hash( + FirebaseAuthInternalFirebaseAuthSettings* self) { + g_return_val_if_fail(FIREBASE_AUTH_IS_INTERNAL_FIREBASE_AUTH_SETTINGS(self), + 0); + guint result = 0; + result = result * 31 + + static_cast(self->app_verification_disabled_for_testing); + result = result * 31 + (self->user_access_group != nullptr + ? g_str_hash(self->user_access_group) + : 0); + result = result * 31 + + (self->phone_number != nullptr ? g_str_hash(self->phone_number) : 0); + result = result * 31 + + (self->sms_code != nullptr ? g_str_hash(self->sms_code) : 0); + result = result * 31 + (self->force_recaptcha_flow != nullptr + ? static_cast(*self->force_recaptcha_flow) + : 0); + return result; +} + +struct _FirebaseAuthInternalSignInProvider { + GObject parent_instance; + + gchar* provider_id; + FlValue* scopes; + FlValue* custom_parameters; +}; + +G_DEFINE_TYPE(FirebaseAuthInternalSignInProvider, + firebase_auth_internal_sign_in_provider, G_TYPE_OBJECT) + +static void firebase_auth_internal_sign_in_provider_dispose(GObject* object) { + FirebaseAuthInternalSignInProvider* self = + FIREBASE_AUTH_INTERNAL_SIGN_IN_PROVIDER(object); + g_clear_pointer(&self->provider_id, g_free); + g_clear_pointer(&self->scopes, fl_value_unref); + g_clear_pointer(&self->custom_parameters, fl_value_unref); + G_OBJECT_CLASS(firebase_auth_internal_sign_in_provider_parent_class) + ->dispose(object); +} + +static void firebase_auth_internal_sign_in_provider_init( + FirebaseAuthInternalSignInProvider* self) {} + +static void firebase_auth_internal_sign_in_provider_class_init( + FirebaseAuthInternalSignInProviderClass* klass) { + G_OBJECT_CLASS(klass)->dispose = + firebase_auth_internal_sign_in_provider_dispose; +} + +FirebaseAuthInternalSignInProvider* firebase_auth_internal_sign_in_provider_new( + const gchar* provider_id, FlValue* scopes, FlValue* custom_parameters) { + FirebaseAuthInternalSignInProvider* self = + FIREBASE_AUTH_INTERNAL_SIGN_IN_PROVIDER(g_object_new( + firebase_auth_internal_sign_in_provider_get_type(), nullptr)); + self->provider_id = g_strdup(provider_id); + if (scopes != nullptr) { + self->scopes = fl_value_ref(scopes); + } else { + self->scopes = nullptr; + } + if (custom_parameters != nullptr) { + self->custom_parameters = fl_value_ref(custom_parameters); + } else { + self->custom_parameters = nullptr; + } + return self; +} + +const gchar* firebase_auth_internal_sign_in_provider_get_provider_id( + FirebaseAuthInternalSignInProvider* self) { + g_return_val_if_fail(FIREBASE_AUTH_IS_INTERNAL_SIGN_IN_PROVIDER(self), + nullptr); + return self->provider_id; +} + +FlValue* firebase_auth_internal_sign_in_provider_get_scopes( + FirebaseAuthInternalSignInProvider* self) { + g_return_val_if_fail(FIREBASE_AUTH_IS_INTERNAL_SIGN_IN_PROVIDER(self), + nullptr); + return self->scopes; +} + +FlValue* firebase_auth_internal_sign_in_provider_get_custom_parameters( + FirebaseAuthInternalSignInProvider* self) { + g_return_val_if_fail(FIREBASE_AUTH_IS_INTERNAL_SIGN_IN_PROVIDER(self), + nullptr); + return self->custom_parameters; +} + +static FlValue* firebase_auth_internal_sign_in_provider_to_list( + FirebaseAuthInternalSignInProvider* self) { + FlValue* values = fl_value_new_list(); + fl_value_append_take(values, fl_value_new_string(self->provider_id)); + fl_value_append_take(values, self->scopes != nullptr + ? fl_value_ref(self->scopes) + : fl_value_new_null()); + fl_value_append_take(values, self->custom_parameters != nullptr + ? fl_value_ref(self->custom_parameters) + : fl_value_new_null()); + return values; +} + +static FirebaseAuthInternalSignInProvider* +firebase_auth_internal_sign_in_provider_new_from_list(FlValue* values) { + FlValue* value0 = fl_value_get_list_value(values, 0); + const gchar* provider_id = fl_value_get_string(value0); + FlValue* value1 = fl_value_get_list_value(values, 1); + FlValue* scopes = nullptr; + if (fl_value_get_type(value1) != FL_VALUE_TYPE_NULL) { + scopes = value1; + } + FlValue* value2 = fl_value_get_list_value(values, 2); + FlValue* custom_parameters = nullptr; + if (fl_value_get_type(value2) != FL_VALUE_TYPE_NULL) { + custom_parameters = value2; + } + return firebase_auth_internal_sign_in_provider_new(provider_id, scopes, + custom_parameters); +} + +gboolean firebase_auth_internal_sign_in_provider_equals( + FirebaseAuthInternalSignInProvider* a, + FirebaseAuthInternalSignInProvider* b) { + if (a == b) { + return TRUE; + } + if (a == nullptr || b == nullptr) { + return FALSE; + } + if (g_strcmp0(a->provider_id, b->provider_id) != 0) { + return FALSE; + } + if (!flpigeon_deep_equals(a->scopes, b->scopes)) { + return FALSE; + } + if (!flpigeon_deep_equals(a->custom_parameters, b->custom_parameters)) { + return FALSE; + } + return TRUE; +} + +guint firebase_auth_internal_sign_in_provider_hash( + FirebaseAuthInternalSignInProvider* self) { + g_return_val_if_fail(FIREBASE_AUTH_IS_INTERNAL_SIGN_IN_PROVIDER(self), 0); + guint result = 0; + result = result * 31 + + (self->provider_id != nullptr ? g_str_hash(self->provider_id) : 0); + result = result * 31 + flpigeon_deep_hash(self->scopes); + result = result * 31 + flpigeon_deep_hash(self->custom_parameters); + return result; +} + +struct _FirebaseAuthInternalVerifyPhoneNumberRequest { + GObject parent_instance; + + gchar* phone_number; + int64_t timeout; + int64_t* force_resending_token; + gchar* auto_retrieved_sms_code_for_testing; + gchar* multi_factor_info_id; + gchar* multi_factor_session_id; +}; + +G_DEFINE_TYPE(FirebaseAuthInternalVerifyPhoneNumberRequest, + firebase_auth_internal_verify_phone_number_request, G_TYPE_OBJECT) + +static void firebase_auth_internal_verify_phone_number_request_dispose( + GObject* object) { + FirebaseAuthInternalVerifyPhoneNumberRequest* self = + FIREBASE_AUTH_INTERNAL_VERIFY_PHONE_NUMBER_REQUEST(object); + g_clear_pointer(&self->phone_number, g_free); + g_clear_pointer(&self->force_resending_token, g_free); + g_clear_pointer(&self->auto_retrieved_sms_code_for_testing, g_free); + g_clear_pointer(&self->multi_factor_info_id, g_free); + g_clear_pointer(&self->multi_factor_session_id, g_free); + G_OBJECT_CLASS( + firebase_auth_internal_verify_phone_number_request_parent_class) + ->dispose(object); +} + +static void firebase_auth_internal_verify_phone_number_request_init( + FirebaseAuthInternalVerifyPhoneNumberRequest* self) {} + +static void firebase_auth_internal_verify_phone_number_request_class_init( + FirebaseAuthInternalVerifyPhoneNumberRequestClass* klass) { + G_OBJECT_CLASS(klass)->dispose = + firebase_auth_internal_verify_phone_number_request_dispose; +} + +FirebaseAuthInternalVerifyPhoneNumberRequest* +firebase_auth_internal_verify_phone_number_request_new( + const gchar* phone_number, int64_t timeout, int64_t* force_resending_token, + const gchar* auto_retrieved_sms_code_for_testing, + const gchar* multi_factor_info_id, const gchar* multi_factor_session_id) { + FirebaseAuthInternalVerifyPhoneNumberRequest* self = + FIREBASE_AUTH_INTERNAL_VERIFY_PHONE_NUMBER_REQUEST(g_object_new( + firebase_auth_internal_verify_phone_number_request_get_type(), + nullptr)); + if (phone_number != nullptr) { + self->phone_number = g_strdup(phone_number); + } else { + self->phone_number = nullptr; + } + self->timeout = timeout; + if (force_resending_token != nullptr) { + self->force_resending_token = + static_cast(malloc(sizeof(int64_t))); + *self->force_resending_token = *force_resending_token; + } else { + self->force_resending_token = nullptr; + } + if (auto_retrieved_sms_code_for_testing != nullptr) { + self->auto_retrieved_sms_code_for_testing = + g_strdup(auto_retrieved_sms_code_for_testing); + } else { + self->auto_retrieved_sms_code_for_testing = nullptr; + } + if (multi_factor_info_id != nullptr) { + self->multi_factor_info_id = g_strdup(multi_factor_info_id); + } else { + self->multi_factor_info_id = nullptr; + } + if (multi_factor_session_id != nullptr) { + self->multi_factor_session_id = g_strdup(multi_factor_session_id); + } else { + self->multi_factor_session_id = nullptr; + } + return self; +} + +const gchar* +firebase_auth_internal_verify_phone_number_request_get_phone_number( + FirebaseAuthInternalVerifyPhoneNumberRequest* self) { + g_return_val_if_fail( + FIREBASE_AUTH_IS_INTERNAL_VERIFY_PHONE_NUMBER_REQUEST(self), nullptr); + return self->phone_number; +} + +int64_t firebase_auth_internal_verify_phone_number_request_get_timeout( + FirebaseAuthInternalVerifyPhoneNumberRequest* self) { + g_return_val_if_fail( + FIREBASE_AUTH_IS_INTERNAL_VERIFY_PHONE_NUMBER_REQUEST(self), 0); + return self->timeout; +} + +int64_t* +firebase_auth_internal_verify_phone_number_request_get_force_resending_token( + FirebaseAuthInternalVerifyPhoneNumberRequest* self) { + g_return_val_if_fail( + FIREBASE_AUTH_IS_INTERNAL_VERIFY_PHONE_NUMBER_REQUEST(self), nullptr); + return self->force_resending_token; +} + +const gchar* +firebase_auth_internal_verify_phone_number_request_get_auto_retrieved_sms_code_for_testing( + FirebaseAuthInternalVerifyPhoneNumberRequest* self) { + g_return_val_if_fail( + FIREBASE_AUTH_IS_INTERNAL_VERIFY_PHONE_NUMBER_REQUEST(self), nullptr); + return self->auto_retrieved_sms_code_for_testing; +} + +const gchar* +firebase_auth_internal_verify_phone_number_request_get_multi_factor_info_id( + FirebaseAuthInternalVerifyPhoneNumberRequest* self) { + g_return_val_if_fail( + FIREBASE_AUTH_IS_INTERNAL_VERIFY_PHONE_NUMBER_REQUEST(self), nullptr); + return self->multi_factor_info_id; +} + +const gchar* +firebase_auth_internal_verify_phone_number_request_get_multi_factor_session_id( + FirebaseAuthInternalVerifyPhoneNumberRequest* self) { + g_return_val_if_fail( + FIREBASE_AUTH_IS_INTERNAL_VERIFY_PHONE_NUMBER_REQUEST(self), nullptr); + return self->multi_factor_session_id; +} + +static FlValue* firebase_auth_internal_verify_phone_number_request_to_list( + FirebaseAuthInternalVerifyPhoneNumberRequest* self) { + FlValue* values = fl_value_new_list(); + fl_value_append_take(values, self->phone_number != nullptr + ? fl_value_new_string(self->phone_number) + : fl_value_new_null()); + fl_value_append_take(values, fl_value_new_int(self->timeout)); + fl_value_append_take(values, + self->force_resending_token != nullptr + ? fl_value_new_int(*self->force_resending_token) + : fl_value_new_null()); + fl_value_append_take( + values, + self->auto_retrieved_sms_code_for_testing != nullptr + ? fl_value_new_string(self->auto_retrieved_sms_code_for_testing) + : fl_value_new_null()); + fl_value_append_take(values, + self->multi_factor_info_id != nullptr + ? fl_value_new_string(self->multi_factor_info_id) + : fl_value_new_null()); + fl_value_append_take(values, + self->multi_factor_session_id != nullptr + ? fl_value_new_string(self->multi_factor_session_id) + : fl_value_new_null()); + return values; +} + +static FirebaseAuthInternalVerifyPhoneNumberRequest* +firebase_auth_internal_verify_phone_number_request_new_from_list( + FlValue* values) { + FlValue* value0 = fl_value_get_list_value(values, 0); + const gchar* phone_number = nullptr; + if (fl_value_get_type(value0) != FL_VALUE_TYPE_NULL) { + phone_number = fl_value_get_string(value0); + } + FlValue* value1 = fl_value_get_list_value(values, 1); + int64_t timeout = fl_value_get_int(value1); + FlValue* value2 = fl_value_get_list_value(values, 2); + int64_t* force_resending_token = nullptr; + int64_t force_resending_token_value; + if (fl_value_get_type(value2) != FL_VALUE_TYPE_NULL) { + force_resending_token_value = fl_value_get_int(value2); + force_resending_token = &force_resending_token_value; + } + FlValue* value3 = fl_value_get_list_value(values, 3); + const gchar* auto_retrieved_sms_code_for_testing = nullptr; + if (fl_value_get_type(value3) != FL_VALUE_TYPE_NULL) { + auto_retrieved_sms_code_for_testing = fl_value_get_string(value3); + } + FlValue* value4 = fl_value_get_list_value(values, 4); + const gchar* multi_factor_info_id = nullptr; + if (fl_value_get_type(value4) != FL_VALUE_TYPE_NULL) { + multi_factor_info_id = fl_value_get_string(value4); + } + FlValue* value5 = fl_value_get_list_value(values, 5); + const gchar* multi_factor_session_id = nullptr; + if (fl_value_get_type(value5) != FL_VALUE_TYPE_NULL) { + multi_factor_session_id = fl_value_get_string(value5); + } + return firebase_auth_internal_verify_phone_number_request_new( + phone_number, timeout, force_resending_token, + auto_retrieved_sms_code_for_testing, multi_factor_info_id, + multi_factor_session_id); +} + +gboolean firebase_auth_internal_verify_phone_number_request_equals( + FirebaseAuthInternalVerifyPhoneNumberRequest* a, + FirebaseAuthInternalVerifyPhoneNumberRequest* b) { + if (a == b) { + return TRUE; + } + if (a == nullptr || b == nullptr) { + return FALSE; + } + if (g_strcmp0(a->phone_number, b->phone_number) != 0) { + return FALSE; + } + if (a->timeout != b->timeout) { + return FALSE; + } + if ((a->force_resending_token == nullptr) != + (b->force_resending_token == nullptr)) { + return FALSE; + } + if (a->force_resending_token != nullptr && + *a->force_resending_token != *b->force_resending_token) { + return FALSE; + } + if (g_strcmp0(a->auto_retrieved_sms_code_for_testing, + b->auto_retrieved_sms_code_for_testing) != 0) { + return FALSE; + } + if (g_strcmp0(a->multi_factor_info_id, b->multi_factor_info_id) != 0) { + return FALSE; + } + if (g_strcmp0(a->multi_factor_session_id, b->multi_factor_session_id) != 0) { + return FALSE; + } + return TRUE; +} + +guint firebase_auth_internal_verify_phone_number_request_hash( + FirebaseAuthInternalVerifyPhoneNumberRequest* self) { + g_return_val_if_fail( + FIREBASE_AUTH_IS_INTERNAL_VERIFY_PHONE_NUMBER_REQUEST(self), 0); + guint result = 0; + result = result * 31 + + (self->phone_number != nullptr ? g_str_hash(self->phone_number) : 0); + result = result * 31 + static_cast(self->timeout); + result = result * 31 + (self->force_resending_token != nullptr + ? static_cast(*self->force_resending_token) + : 0); + result = + result * 31 + (self->auto_retrieved_sms_code_for_testing != nullptr + ? g_str_hash(self->auto_retrieved_sms_code_for_testing) + : 0); + result = result * 31 + (self->multi_factor_info_id != nullptr + ? g_str_hash(self->multi_factor_info_id) + : 0); + result = result * 31 + (self->multi_factor_session_id != nullptr + ? g_str_hash(self->multi_factor_session_id) + : 0); + return result; +} + +struct _FirebaseAuthInternalIdTokenResult { + GObject parent_instance; + + gchar* token; + int64_t* expiration_timestamp; + int64_t* auth_timestamp; + int64_t* issued_at_timestamp; + gchar* sign_in_provider; + FlValue* claims; + gchar* sign_in_second_factor; +}; + +G_DEFINE_TYPE(FirebaseAuthInternalIdTokenResult, + firebase_auth_internal_id_token_result, G_TYPE_OBJECT) + +static void firebase_auth_internal_id_token_result_dispose(GObject* object) { + FirebaseAuthInternalIdTokenResult* self = + FIREBASE_AUTH_INTERNAL_ID_TOKEN_RESULT(object); + g_clear_pointer(&self->token, g_free); + g_clear_pointer(&self->expiration_timestamp, g_free); + g_clear_pointer(&self->auth_timestamp, g_free); + g_clear_pointer(&self->issued_at_timestamp, g_free); + g_clear_pointer(&self->sign_in_provider, g_free); + g_clear_pointer(&self->claims, fl_value_unref); + g_clear_pointer(&self->sign_in_second_factor, g_free); + G_OBJECT_CLASS(firebase_auth_internal_id_token_result_parent_class) + ->dispose(object); +} + +static void firebase_auth_internal_id_token_result_init( + FirebaseAuthInternalIdTokenResult* self) {} + +static void firebase_auth_internal_id_token_result_class_init( + FirebaseAuthInternalIdTokenResultClass* klass) { + G_OBJECT_CLASS(klass)->dispose = + firebase_auth_internal_id_token_result_dispose; +} + +FirebaseAuthInternalIdTokenResult* firebase_auth_internal_id_token_result_new( + const gchar* token, int64_t* expiration_timestamp, int64_t* auth_timestamp, + int64_t* issued_at_timestamp, const gchar* sign_in_provider, + FlValue* claims, const gchar* sign_in_second_factor) { + FirebaseAuthInternalIdTokenResult* self = + FIREBASE_AUTH_INTERNAL_ID_TOKEN_RESULT(g_object_new( + firebase_auth_internal_id_token_result_get_type(), nullptr)); + if (token != nullptr) { + self->token = g_strdup(token); + } else { + self->token = nullptr; + } + if (expiration_timestamp != nullptr) { + self->expiration_timestamp = static_cast(malloc(sizeof(int64_t))); + *self->expiration_timestamp = *expiration_timestamp; + } else { + self->expiration_timestamp = nullptr; + } + if (auth_timestamp != nullptr) { + self->auth_timestamp = static_cast(malloc(sizeof(int64_t))); + *self->auth_timestamp = *auth_timestamp; + } else { + self->auth_timestamp = nullptr; + } + if (issued_at_timestamp != nullptr) { + self->issued_at_timestamp = static_cast(malloc(sizeof(int64_t))); + *self->issued_at_timestamp = *issued_at_timestamp; + } else { + self->issued_at_timestamp = nullptr; + } + if (sign_in_provider != nullptr) { + self->sign_in_provider = g_strdup(sign_in_provider); + } else { + self->sign_in_provider = nullptr; + } + if (claims != nullptr) { + self->claims = fl_value_ref(claims); + } else { + self->claims = nullptr; + } + if (sign_in_second_factor != nullptr) { + self->sign_in_second_factor = g_strdup(sign_in_second_factor); + } else { + self->sign_in_second_factor = nullptr; + } + return self; +} + +const gchar* firebase_auth_internal_id_token_result_get_token( + FirebaseAuthInternalIdTokenResult* self) { + g_return_val_if_fail(FIREBASE_AUTH_IS_INTERNAL_ID_TOKEN_RESULT(self), + nullptr); + return self->token; +} + +int64_t* firebase_auth_internal_id_token_result_get_expiration_timestamp( + FirebaseAuthInternalIdTokenResult* self) { + g_return_val_if_fail(FIREBASE_AUTH_IS_INTERNAL_ID_TOKEN_RESULT(self), + nullptr); + return self->expiration_timestamp; +} + +int64_t* firebase_auth_internal_id_token_result_get_auth_timestamp( + FirebaseAuthInternalIdTokenResult* self) { + g_return_val_if_fail(FIREBASE_AUTH_IS_INTERNAL_ID_TOKEN_RESULT(self), + nullptr); + return self->auth_timestamp; +} + +int64_t* firebase_auth_internal_id_token_result_get_issued_at_timestamp( + FirebaseAuthInternalIdTokenResult* self) { + g_return_val_if_fail(FIREBASE_AUTH_IS_INTERNAL_ID_TOKEN_RESULT(self), + nullptr); + return self->issued_at_timestamp; +} + +const gchar* firebase_auth_internal_id_token_result_get_sign_in_provider( + FirebaseAuthInternalIdTokenResult* self) { + g_return_val_if_fail(FIREBASE_AUTH_IS_INTERNAL_ID_TOKEN_RESULT(self), + nullptr); + return self->sign_in_provider; +} + +FlValue* firebase_auth_internal_id_token_result_get_claims( + FirebaseAuthInternalIdTokenResult* self) { + g_return_val_if_fail(FIREBASE_AUTH_IS_INTERNAL_ID_TOKEN_RESULT(self), + nullptr); + return self->claims; +} + +const gchar* firebase_auth_internal_id_token_result_get_sign_in_second_factor( + FirebaseAuthInternalIdTokenResult* self) { + g_return_val_if_fail(FIREBASE_AUTH_IS_INTERNAL_ID_TOKEN_RESULT(self), + nullptr); + return self->sign_in_second_factor; +} + +static FlValue* firebase_auth_internal_id_token_result_to_list( + FirebaseAuthInternalIdTokenResult* self) { + FlValue* values = fl_value_new_list(); + fl_value_append_take(values, self->token != nullptr + ? fl_value_new_string(self->token) + : fl_value_new_null()); + fl_value_append_take(values, + self->expiration_timestamp != nullptr + ? fl_value_new_int(*self->expiration_timestamp) + : fl_value_new_null()); + fl_value_append_take(values, self->auth_timestamp != nullptr + ? fl_value_new_int(*self->auth_timestamp) + : fl_value_new_null()); + fl_value_append_take(values, + self->issued_at_timestamp != nullptr + ? fl_value_new_int(*self->issued_at_timestamp) + : fl_value_new_null()); + fl_value_append_take(values, self->sign_in_provider != nullptr + ? fl_value_new_string(self->sign_in_provider) + : fl_value_new_null()); + fl_value_append_take(values, self->claims != nullptr + ? fl_value_ref(self->claims) + : fl_value_new_null()); + fl_value_append_take(values, + self->sign_in_second_factor != nullptr + ? fl_value_new_string(self->sign_in_second_factor) + : fl_value_new_null()); + return values; +} + +static FirebaseAuthInternalIdTokenResult* +firebase_auth_internal_id_token_result_new_from_list(FlValue* values) { + FlValue* value0 = fl_value_get_list_value(values, 0); + const gchar* token = nullptr; + if (fl_value_get_type(value0) != FL_VALUE_TYPE_NULL) { + token = fl_value_get_string(value0); + } + FlValue* value1 = fl_value_get_list_value(values, 1); + int64_t* expiration_timestamp = nullptr; + int64_t expiration_timestamp_value; + if (fl_value_get_type(value1) != FL_VALUE_TYPE_NULL) { + expiration_timestamp_value = fl_value_get_int(value1); + expiration_timestamp = &expiration_timestamp_value; + } + FlValue* value2 = fl_value_get_list_value(values, 2); + int64_t* auth_timestamp = nullptr; + int64_t auth_timestamp_value; + if (fl_value_get_type(value2) != FL_VALUE_TYPE_NULL) { + auth_timestamp_value = fl_value_get_int(value2); + auth_timestamp = &auth_timestamp_value; + } + FlValue* value3 = fl_value_get_list_value(values, 3); + int64_t* issued_at_timestamp = nullptr; + int64_t issued_at_timestamp_value; + if (fl_value_get_type(value3) != FL_VALUE_TYPE_NULL) { + issued_at_timestamp_value = fl_value_get_int(value3); + issued_at_timestamp = &issued_at_timestamp_value; + } + FlValue* value4 = fl_value_get_list_value(values, 4); + const gchar* sign_in_provider = nullptr; + if (fl_value_get_type(value4) != FL_VALUE_TYPE_NULL) { + sign_in_provider = fl_value_get_string(value4); + } + FlValue* value5 = fl_value_get_list_value(values, 5); + FlValue* claims = nullptr; + if (fl_value_get_type(value5) != FL_VALUE_TYPE_NULL) { + claims = value5; + } + FlValue* value6 = fl_value_get_list_value(values, 6); + const gchar* sign_in_second_factor = nullptr; + if (fl_value_get_type(value6) != FL_VALUE_TYPE_NULL) { + sign_in_second_factor = fl_value_get_string(value6); + } + return firebase_auth_internal_id_token_result_new( + token, expiration_timestamp, auth_timestamp, issued_at_timestamp, + sign_in_provider, claims, sign_in_second_factor); +} + +gboolean firebase_auth_internal_id_token_result_equals( + FirebaseAuthInternalIdTokenResult* a, + FirebaseAuthInternalIdTokenResult* b) { + if (a == b) { + return TRUE; + } + if (a == nullptr || b == nullptr) { + return FALSE; + } + if (g_strcmp0(a->token, b->token) != 0) { + return FALSE; + } + if ((a->expiration_timestamp == nullptr) != + (b->expiration_timestamp == nullptr)) { + return FALSE; + } + if (a->expiration_timestamp != nullptr && + *a->expiration_timestamp != *b->expiration_timestamp) { + return FALSE; + } + if ((a->auth_timestamp == nullptr) != (b->auth_timestamp == nullptr)) { + return FALSE; + } + if (a->auth_timestamp != nullptr && + *a->auth_timestamp != *b->auth_timestamp) { + return FALSE; + } + if ((a->issued_at_timestamp == nullptr) != + (b->issued_at_timestamp == nullptr)) { + return FALSE; + } + if (a->issued_at_timestamp != nullptr && + *a->issued_at_timestamp != *b->issued_at_timestamp) { + return FALSE; + } + if (g_strcmp0(a->sign_in_provider, b->sign_in_provider) != 0) { + return FALSE; + } + if (!flpigeon_deep_equals(a->claims, b->claims)) { + return FALSE; + } + if (g_strcmp0(a->sign_in_second_factor, b->sign_in_second_factor) != 0) { + return FALSE; + } + return TRUE; +} + +guint firebase_auth_internal_id_token_result_hash( + FirebaseAuthInternalIdTokenResult* self) { + g_return_val_if_fail(FIREBASE_AUTH_IS_INTERNAL_ID_TOKEN_RESULT(self), 0); + guint result = 0; + result = result * 31 + (self->token != nullptr ? g_str_hash(self->token) : 0); + result = result * 31 + (self->expiration_timestamp != nullptr + ? static_cast(*self->expiration_timestamp) + : 0); + result = result * 31 + (self->auth_timestamp != nullptr + ? static_cast(*self->auth_timestamp) + : 0); + result = result * 31 + (self->issued_at_timestamp != nullptr + ? static_cast(*self->issued_at_timestamp) + : 0); + result = result * 31 + (self->sign_in_provider != nullptr + ? g_str_hash(self->sign_in_provider) + : 0); + result = result * 31 + flpigeon_deep_hash(self->claims); + result = result * 31 + (self->sign_in_second_factor != nullptr + ? g_str_hash(self->sign_in_second_factor) + : 0); + return result; +} + +struct _FirebaseAuthInternalUserProfile { + GObject parent_instance; + + gchar* display_name; + gchar* photo_url; + gboolean display_name_changed; + gboolean photo_url_changed; +}; + +G_DEFINE_TYPE(FirebaseAuthInternalUserProfile, + firebase_auth_internal_user_profile, G_TYPE_OBJECT) + +static void firebase_auth_internal_user_profile_dispose(GObject* object) { + FirebaseAuthInternalUserProfile* self = + FIREBASE_AUTH_INTERNAL_USER_PROFILE(object); + g_clear_pointer(&self->display_name, g_free); + g_clear_pointer(&self->photo_url, g_free); + G_OBJECT_CLASS(firebase_auth_internal_user_profile_parent_class) + ->dispose(object); +} + +static void firebase_auth_internal_user_profile_init( + FirebaseAuthInternalUserProfile* self) {} + +static void firebase_auth_internal_user_profile_class_init( + FirebaseAuthInternalUserProfileClass* klass) { + G_OBJECT_CLASS(klass)->dispose = firebase_auth_internal_user_profile_dispose; +} + +FirebaseAuthInternalUserProfile* firebase_auth_internal_user_profile_new( + const gchar* display_name, const gchar* photo_url, + gboolean display_name_changed, gboolean photo_url_changed) { + FirebaseAuthInternalUserProfile* self = FIREBASE_AUTH_INTERNAL_USER_PROFILE( + g_object_new(firebase_auth_internal_user_profile_get_type(), nullptr)); + if (display_name != nullptr) { + self->display_name = g_strdup(display_name); + } else { + self->display_name = nullptr; + } + if (photo_url != nullptr) { + self->photo_url = g_strdup(photo_url); + } else { + self->photo_url = nullptr; + } + self->display_name_changed = display_name_changed; + self->photo_url_changed = photo_url_changed; + return self; +} + +const gchar* firebase_auth_internal_user_profile_get_display_name( + FirebaseAuthInternalUserProfile* self) { + g_return_val_if_fail(FIREBASE_AUTH_IS_INTERNAL_USER_PROFILE(self), nullptr); + return self->display_name; +} + +const gchar* firebase_auth_internal_user_profile_get_photo_url( + FirebaseAuthInternalUserProfile* self) { + g_return_val_if_fail(FIREBASE_AUTH_IS_INTERNAL_USER_PROFILE(self), nullptr); + return self->photo_url; +} + +gboolean firebase_auth_internal_user_profile_get_display_name_changed( + FirebaseAuthInternalUserProfile* self) { + g_return_val_if_fail(FIREBASE_AUTH_IS_INTERNAL_USER_PROFILE(self), FALSE); + return self->display_name_changed; +} + +gboolean firebase_auth_internal_user_profile_get_photo_url_changed( + FirebaseAuthInternalUserProfile* self) { + g_return_val_if_fail(FIREBASE_AUTH_IS_INTERNAL_USER_PROFILE(self), FALSE); + return self->photo_url_changed; +} + +static FlValue* firebase_auth_internal_user_profile_to_list( + FirebaseAuthInternalUserProfile* self) { + FlValue* values = fl_value_new_list(); + fl_value_append_take(values, self->display_name != nullptr + ? fl_value_new_string(self->display_name) + : fl_value_new_null()); + fl_value_append_take(values, self->photo_url != nullptr + ? fl_value_new_string(self->photo_url) + : fl_value_new_null()); + fl_value_append_take(values, fl_value_new_bool(self->display_name_changed)); + fl_value_append_take(values, fl_value_new_bool(self->photo_url_changed)); + return values; +} + +static FirebaseAuthInternalUserProfile* +firebase_auth_internal_user_profile_new_from_list(FlValue* values) { + FlValue* value0 = fl_value_get_list_value(values, 0); + const gchar* display_name = nullptr; + if (fl_value_get_type(value0) != FL_VALUE_TYPE_NULL) { + display_name = fl_value_get_string(value0); + } + FlValue* value1 = fl_value_get_list_value(values, 1); + const gchar* photo_url = nullptr; + if (fl_value_get_type(value1) != FL_VALUE_TYPE_NULL) { + photo_url = fl_value_get_string(value1); + } + FlValue* value2 = fl_value_get_list_value(values, 2); + gboolean display_name_changed = fl_value_get_bool(value2); + FlValue* value3 = fl_value_get_list_value(values, 3); + gboolean photo_url_changed = fl_value_get_bool(value3); + return firebase_auth_internal_user_profile_new( + display_name, photo_url, display_name_changed, photo_url_changed); +} + +gboolean firebase_auth_internal_user_profile_equals( + FirebaseAuthInternalUserProfile* a, FirebaseAuthInternalUserProfile* b) { + if (a == b) { + return TRUE; + } + if (a == nullptr || b == nullptr) { + return FALSE; + } + if (g_strcmp0(a->display_name, b->display_name) != 0) { + return FALSE; + } + if (g_strcmp0(a->photo_url, b->photo_url) != 0) { + return FALSE; + } + if (a->display_name_changed != b->display_name_changed) { + return FALSE; + } + if (a->photo_url_changed != b->photo_url_changed) { + return FALSE; + } + return TRUE; +} + +guint firebase_auth_internal_user_profile_hash( + FirebaseAuthInternalUserProfile* self) { + g_return_val_if_fail(FIREBASE_AUTH_IS_INTERNAL_USER_PROFILE(self), 0); + guint result = 0; + result = result * 31 + + (self->display_name != nullptr ? g_str_hash(self->display_name) : 0); + result = result * 31 + + (self->photo_url != nullptr ? g_str_hash(self->photo_url) : 0); + result = result * 31 + static_cast(self->display_name_changed); + result = result * 31 + static_cast(self->photo_url_changed); + return result; +} + +struct _FirebaseAuthInternalTotpSecret { + GObject parent_instance; + + int64_t* code_interval_seconds; + int64_t* code_length; + int64_t* enrollment_completion_deadline; + gchar* hashing_algorithm; + gchar* secret_key; +}; + +G_DEFINE_TYPE(FirebaseAuthInternalTotpSecret, + firebase_auth_internal_totp_secret, G_TYPE_OBJECT) + +static void firebase_auth_internal_totp_secret_dispose(GObject* object) { + FirebaseAuthInternalTotpSecret* self = + FIREBASE_AUTH_INTERNAL_TOTP_SECRET(object); + g_clear_pointer(&self->code_interval_seconds, g_free); + g_clear_pointer(&self->code_length, g_free); + g_clear_pointer(&self->enrollment_completion_deadline, g_free); + g_clear_pointer(&self->hashing_algorithm, g_free); + g_clear_pointer(&self->secret_key, g_free); + G_OBJECT_CLASS(firebase_auth_internal_totp_secret_parent_class) + ->dispose(object); +} + +static void firebase_auth_internal_totp_secret_init( + FirebaseAuthInternalTotpSecret* self) {} + +static void firebase_auth_internal_totp_secret_class_init( + FirebaseAuthInternalTotpSecretClass* klass) { + G_OBJECT_CLASS(klass)->dispose = firebase_auth_internal_totp_secret_dispose; +} + +FirebaseAuthInternalTotpSecret* firebase_auth_internal_totp_secret_new( + int64_t* code_interval_seconds, int64_t* code_length, + int64_t* enrollment_completion_deadline, const gchar* hashing_algorithm, + const gchar* secret_key) { + FirebaseAuthInternalTotpSecret* self = FIREBASE_AUTH_INTERNAL_TOTP_SECRET( + g_object_new(firebase_auth_internal_totp_secret_get_type(), nullptr)); + if (code_interval_seconds != nullptr) { + self->code_interval_seconds = + static_cast(malloc(sizeof(int64_t))); + *self->code_interval_seconds = *code_interval_seconds; + } else { + self->code_interval_seconds = nullptr; + } + if (code_length != nullptr) { + self->code_length = static_cast(malloc(sizeof(int64_t))); + *self->code_length = *code_length; + } else { + self->code_length = nullptr; + } + if (enrollment_completion_deadline != nullptr) { + self->enrollment_completion_deadline = + static_cast(malloc(sizeof(int64_t))); + *self->enrollment_completion_deadline = *enrollment_completion_deadline; + } else { + self->enrollment_completion_deadline = nullptr; + } + if (hashing_algorithm != nullptr) { + self->hashing_algorithm = g_strdup(hashing_algorithm); + } else { + self->hashing_algorithm = nullptr; + } + self->secret_key = g_strdup(secret_key); + return self; +} + +int64_t* firebase_auth_internal_totp_secret_get_code_interval_seconds( + FirebaseAuthInternalTotpSecret* self) { + g_return_val_if_fail(FIREBASE_AUTH_IS_INTERNAL_TOTP_SECRET(self), nullptr); + return self->code_interval_seconds; +} + +int64_t* firebase_auth_internal_totp_secret_get_code_length( + FirebaseAuthInternalTotpSecret* self) { + g_return_val_if_fail(FIREBASE_AUTH_IS_INTERNAL_TOTP_SECRET(self), nullptr); + return self->code_length; +} + +int64_t* firebase_auth_internal_totp_secret_get_enrollment_completion_deadline( + FirebaseAuthInternalTotpSecret* self) { + g_return_val_if_fail(FIREBASE_AUTH_IS_INTERNAL_TOTP_SECRET(self), nullptr); + return self->enrollment_completion_deadline; +} + +const gchar* firebase_auth_internal_totp_secret_get_hashing_algorithm( + FirebaseAuthInternalTotpSecret* self) { + g_return_val_if_fail(FIREBASE_AUTH_IS_INTERNAL_TOTP_SECRET(self), nullptr); + return self->hashing_algorithm; +} + +const gchar* firebase_auth_internal_totp_secret_get_secret_key( + FirebaseAuthInternalTotpSecret* self) { + g_return_val_if_fail(FIREBASE_AUTH_IS_INTERNAL_TOTP_SECRET(self), nullptr); + return self->secret_key; +} + +static FlValue* firebase_auth_internal_totp_secret_to_list( + FirebaseAuthInternalTotpSecret* self) { + FlValue* values = fl_value_new_list(); + fl_value_append_take(values, + self->code_interval_seconds != nullptr + ? fl_value_new_int(*self->code_interval_seconds) + : fl_value_new_null()); + fl_value_append_take(values, self->code_length != nullptr + ? fl_value_new_int(*self->code_length) + : fl_value_new_null()); + fl_value_append_take( + values, self->enrollment_completion_deadline != nullptr + ? fl_value_new_int(*self->enrollment_completion_deadline) + : fl_value_new_null()); + fl_value_append_take(values, + self->hashing_algorithm != nullptr + ? fl_value_new_string(self->hashing_algorithm) + : fl_value_new_null()); + fl_value_append_take(values, fl_value_new_string(self->secret_key)); + return values; +} + +static FirebaseAuthInternalTotpSecret* +firebase_auth_internal_totp_secret_new_from_list(FlValue* values) { + FlValue* value0 = fl_value_get_list_value(values, 0); + int64_t* code_interval_seconds = nullptr; + int64_t code_interval_seconds_value; + if (fl_value_get_type(value0) != FL_VALUE_TYPE_NULL) { + code_interval_seconds_value = fl_value_get_int(value0); + code_interval_seconds = &code_interval_seconds_value; + } + FlValue* value1 = fl_value_get_list_value(values, 1); + int64_t* code_length = nullptr; + int64_t code_length_value; + if (fl_value_get_type(value1) != FL_VALUE_TYPE_NULL) { + code_length_value = fl_value_get_int(value1); + code_length = &code_length_value; + } + FlValue* value2 = fl_value_get_list_value(values, 2); + int64_t* enrollment_completion_deadline = nullptr; + int64_t enrollment_completion_deadline_value; + if (fl_value_get_type(value2) != FL_VALUE_TYPE_NULL) { + enrollment_completion_deadline_value = fl_value_get_int(value2); + enrollment_completion_deadline = &enrollment_completion_deadline_value; + } + FlValue* value3 = fl_value_get_list_value(values, 3); + const gchar* hashing_algorithm = nullptr; + if (fl_value_get_type(value3) != FL_VALUE_TYPE_NULL) { + hashing_algorithm = fl_value_get_string(value3); + } + FlValue* value4 = fl_value_get_list_value(values, 4); + const gchar* secret_key = fl_value_get_string(value4); + return firebase_auth_internal_totp_secret_new( + code_interval_seconds, code_length, enrollment_completion_deadline, + hashing_algorithm, secret_key); +} + +gboolean firebase_auth_internal_totp_secret_equals( + FirebaseAuthInternalTotpSecret* a, FirebaseAuthInternalTotpSecret* b) { + if (a == b) { + return TRUE; + } + if (a == nullptr || b == nullptr) { + return FALSE; + } + if ((a->code_interval_seconds == nullptr) != + (b->code_interval_seconds == nullptr)) { + return FALSE; + } + if (a->code_interval_seconds != nullptr && + *a->code_interval_seconds != *b->code_interval_seconds) { + return FALSE; + } + if ((a->code_length == nullptr) != (b->code_length == nullptr)) { + return FALSE; + } + if (a->code_length != nullptr && *a->code_length != *b->code_length) { + return FALSE; + } + if ((a->enrollment_completion_deadline == nullptr) != + (b->enrollment_completion_deadline == nullptr)) { + return FALSE; + } + if (a->enrollment_completion_deadline != nullptr && + *a->enrollment_completion_deadline != + *b->enrollment_completion_deadline) { + return FALSE; + } + if (g_strcmp0(a->hashing_algorithm, b->hashing_algorithm) != 0) { + return FALSE; + } + if (g_strcmp0(a->secret_key, b->secret_key) != 0) { + return FALSE; + } + return TRUE; +} + +guint firebase_auth_internal_totp_secret_hash( + FirebaseAuthInternalTotpSecret* self) { + g_return_val_if_fail(FIREBASE_AUTH_IS_INTERNAL_TOTP_SECRET(self), 0); + guint result = 0; + result = result * 31 + (self->code_interval_seconds != nullptr + ? static_cast(*self->code_interval_seconds) + : 0); + result = result * 31 + (self->code_length != nullptr + ? static_cast(*self->code_length) + : 0); + result = result * 31 + + (self->enrollment_completion_deadline != nullptr + ? static_cast(*self->enrollment_completion_deadline) + : 0); + result = result * 31 + (self->hashing_algorithm != nullptr + ? g_str_hash(self->hashing_algorithm) + : 0); + result = result * 31 + + (self->secret_key != nullptr ? g_str_hash(self->secret_key) : 0); + return result; +} + +struct _FirebaseAuthMessageCodec { + FlStandardMessageCodec parent_instance; +}; + +G_DEFINE_TYPE(FirebaseAuthMessageCodec, firebase_auth_message_codec, + fl_standard_message_codec_get_type()) + +const int firebase_auth_action_code_info_operation_type_id = 129; +const int firebase_auth_internal_multi_factor_session_type_id = 130; +const int firebase_auth_internal_phone_multi_factor_assertion_type_id = 131; +const int firebase_auth_internal_multi_factor_info_type_id = 132; +const int firebase_auth_auth_pigeon_firebase_app_type_id = 133; +const int firebase_auth_internal_action_code_info_data_type_id = 134; +const int firebase_auth_internal_action_code_info_type_id = 135; +const int firebase_auth_internal_additional_user_info_type_id = 136; +const int firebase_auth_internal_auth_credential_type_id = 137; +const int firebase_auth_internal_user_info_type_id = 138; +const int firebase_auth_internal_user_details_type_id = 139; +const int firebase_auth_internal_user_credential_type_id = 140; +const int firebase_auth_internal_auth_credential_input_type_id = 141; +const int firebase_auth_internal_action_code_settings_type_id = 142; +const int firebase_auth_internal_firebase_auth_settings_type_id = 143; +const int firebase_auth_internal_sign_in_provider_type_id = 144; +const int firebase_auth_internal_verify_phone_number_request_type_id = 145; +const int firebase_auth_internal_id_token_result_type_id = 146; +const int firebase_auth_internal_user_profile_type_id = 147; +const int firebase_auth_internal_totp_secret_type_id = 148; + +static gboolean +firebase_auth_message_codec_write_firebase_auth_action_code_info_operation( + FlStandardMessageCodec* codec, GByteArray* buffer, FlValue* value, + GError** error) { + uint8_t type = firebase_auth_action_code_info_operation_type_id; + g_byte_array_append(buffer, &type, sizeof(uint8_t)); + return fl_standard_message_codec_write_value(codec, buffer, value, error); +} + +static gboolean +firebase_auth_message_codec_write_firebase_auth_internal_multi_factor_session( + FlStandardMessageCodec* codec, GByteArray* buffer, + FirebaseAuthInternalMultiFactorSession* value, GError** error) { + uint8_t type = firebase_auth_internal_multi_factor_session_type_id; + g_byte_array_append(buffer, &type, sizeof(uint8_t)); + g_autoptr(FlValue) values = + firebase_auth_internal_multi_factor_session_to_list(value); + return fl_standard_message_codec_write_value(codec, buffer, values, error); +} + +static gboolean +firebase_auth_message_codec_write_firebase_auth_internal_phone_multi_factor_assertion( + FlStandardMessageCodec* codec, GByteArray* buffer, + FirebaseAuthInternalPhoneMultiFactorAssertion* value, GError** error) { + uint8_t type = firebase_auth_internal_phone_multi_factor_assertion_type_id; + g_byte_array_append(buffer, &type, sizeof(uint8_t)); + g_autoptr(FlValue) values = + firebase_auth_internal_phone_multi_factor_assertion_to_list(value); + return fl_standard_message_codec_write_value(codec, buffer, values, error); +} + +static gboolean +firebase_auth_message_codec_write_firebase_auth_internal_multi_factor_info( + FlStandardMessageCodec* codec, GByteArray* buffer, + FirebaseAuthInternalMultiFactorInfo* value, GError** error) { + uint8_t type = firebase_auth_internal_multi_factor_info_type_id; + g_byte_array_append(buffer, &type, sizeof(uint8_t)); + g_autoptr(FlValue) values = + firebase_auth_internal_multi_factor_info_to_list(value); + return fl_standard_message_codec_write_value(codec, buffer, values, error); +} + +static gboolean +firebase_auth_message_codec_write_firebase_auth_auth_pigeon_firebase_app( + FlStandardMessageCodec* codec, GByteArray* buffer, + FirebaseAuthAuthPigeonFirebaseApp* value, GError** error) { + uint8_t type = firebase_auth_auth_pigeon_firebase_app_type_id; + g_byte_array_append(buffer, &type, sizeof(uint8_t)); + g_autoptr(FlValue) values = + firebase_auth_auth_pigeon_firebase_app_to_list(value); + return fl_standard_message_codec_write_value(codec, buffer, values, error); +} + +static gboolean +firebase_auth_message_codec_write_firebase_auth_internal_action_code_info_data( + FlStandardMessageCodec* codec, GByteArray* buffer, + FirebaseAuthInternalActionCodeInfoData* value, GError** error) { + uint8_t type = firebase_auth_internal_action_code_info_data_type_id; + g_byte_array_append(buffer, &type, sizeof(uint8_t)); + g_autoptr(FlValue) values = + firebase_auth_internal_action_code_info_data_to_list(value); + return fl_standard_message_codec_write_value(codec, buffer, values, error); +} + +static gboolean +firebase_auth_message_codec_write_firebase_auth_internal_action_code_info( + FlStandardMessageCodec* codec, GByteArray* buffer, + FirebaseAuthInternalActionCodeInfo* value, GError** error) { + uint8_t type = firebase_auth_internal_action_code_info_type_id; + g_byte_array_append(buffer, &type, sizeof(uint8_t)); + g_autoptr(FlValue) values = + firebase_auth_internal_action_code_info_to_list(value); + return fl_standard_message_codec_write_value(codec, buffer, values, error); +} + +static gboolean +firebase_auth_message_codec_write_firebase_auth_internal_additional_user_info( + FlStandardMessageCodec* codec, GByteArray* buffer, + FirebaseAuthInternalAdditionalUserInfo* value, GError** error) { + uint8_t type = firebase_auth_internal_additional_user_info_type_id; + g_byte_array_append(buffer, &type, sizeof(uint8_t)); + g_autoptr(FlValue) values = + firebase_auth_internal_additional_user_info_to_list(value); + return fl_standard_message_codec_write_value(codec, buffer, values, error); +} + +static gboolean +firebase_auth_message_codec_write_firebase_auth_internal_auth_credential( + FlStandardMessageCodec* codec, GByteArray* buffer, + FirebaseAuthInternalAuthCredential* value, GError** error) { + uint8_t type = firebase_auth_internal_auth_credential_type_id; + g_byte_array_append(buffer, &type, sizeof(uint8_t)); + g_autoptr(FlValue) values = + firebase_auth_internal_auth_credential_to_list(value); + return fl_standard_message_codec_write_value(codec, buffer, values, error); +} + +static gboolean +firebase_auth_message_codec_write_firebase_auth_internal_user_info( + FlStandardMessageCodec* codec, GByteArray* buffer, + FirebaseAuthInternalUserInfo* value, GError** error) { + uint8_t type = firebase_auth_internal_user_info_type_id; + g_byte_array_append(buffer, &type, sizeof(uint8_t)); + g_autoptr(FlValue) values = firebase_auth_internal_user_info_to_list(value); + return fl_standard_message_codec_write_value(codec, buffer, values, error); +} + +static gboolean +firebase_auth_message_codec_write_firebase_auth_internal_user_details( + FlStandardMessageCodec* codec, GByteArray* buffer, + FirebaseAuthInternalUserDetails* value, GError** error) { + uint8_t type = firebase_auth_internal_user_details_type_id; + g_byte_array_append(buffer, &type, sizeof(uint8_t)); + g_autoptr(FlValue) values = + firebase_auth_internal_user_details_to_list(value); + return fl_standard_message_codec_write_value(codec, buffer, values, error); +} + +static gboolean +firebase_auth_message_codec_write_firebase_auth_internal_user_credential( + FlStandardMessageCodec* codec, GByteArray* buffer, + FirebaseAuthInternalUserCredential* value, GError** error) { + uint8_t type = firebase_auth_internal_user_credential_type_id; + g_byte_array_append(buffer, &type, sizeof(uint8_t)); + g_autoptr(FlValue) values = + firebase_auth_internal_user_credential_to_list(value); + return fl_standard_message_codec_write_value(codec, buffer, values, error); +} + +static gboolean +firebase_auth_message_codec_write_firebase_auth_internal_auth_credential_input( + FlStandardMessageCodec* codec, GByteArray* buffer, + FirebaseAuthInternalAuthCredentialInput* value, GError** error) { + uint8_t type = firebase_auth_internal_auth_credential_input_type_id; + g_byte_array_append(buffer, &type, sizeof(uint8_t)); + g_autoptr(FlValue) values = + firebase_auth_internal_auth_credential_input_to_list(value); + return fl_standard_message_codec_write_value(codec, buffer, values, error); +} + +static gboolean +firebase_auth_message_codec_write_firebase_auth_internal_action_code_settings( + FlStandardMessageCodec* codec, GByteArray* buffer, + FirebaseAuthInternalActionCodeSettings* value, GError** error) { + uint8_t type = firebase_auth_internal_action_code_settings_type_id; + g_byte_array_append(buffer, &type, sizeof(uint8_t)); + g_autoptr(FlValue) values = + firebase_auth_internal_action_code_settings_to_list(value); + return fl_standard_message_codec_write_value(codec, buffer, values, error); +} + +static gboolean +firebase_auth_message_codec_write_firebase_auth_internal_firebase_auth_settings( + FlStandardMessageCodec* codec, GByteArray* buffer, + FirebaseAuthInternalFirebaseAuthSettings* value, GError** error) { + uint8_t type = firebase_auth_internal_firebase_auth_settings_type_id; + g_byte_array_append(buffer, &type, sizeof(uint8_t)); + g_autoptr(FlValue) values = + firebase_auth_internal_firebase_auth_settings_to_list(value); + return fl_standard_message_codec_write_value(codec, buffer, values, error); +} + +static gboolean +firebase_auth_message_codec_write_firebase_auth_internal_sign_in_provider( + FlStandardMessageCodec* codec, GByteArray* buffer, + FirebaseAuthInternalSignInProvider* value, GError** error) { + uint8_t type = firebase_auth_internal_sign_in_provider_type_id; + g_byte_array_append(buffer, &type, sizeof(uint8_t)); + g_autoptr(FlValue) values = + firebase_auth_internal_sign_in_provider_to_list(value); + return fl_standard_message_codec_write_value(codec, buffer, values, error); +} + +static gboolean +firebase_auth_message_codec_write_firebase_auth_internal_verify_phone_number_request( + FlStandardMessageCodec* codec, GByteArray* buffer, + FirebaseAuthInternalVerifyPhoneNumberRequest* value, GError** error) { + uint8_t type = firebase_auth_internal_verify_phone_number_request_type_id; + g_byte_array_append(buffer, &type, sizeof(uint8_t)); + g_autoptr(FlValue) values = + firebase_auth_internal_verify_phone_number_request_to_list(value); + return fl_standard_message_codec_write_value(codec, buffer, values, error); +} + +static gboolean +firebase_auth_message_codec_write_firebase_auth_internal_id_token_result( + FlStandardMessageCodec* codec, GByteArray* buffer, + FirebaseAuthInternalIdTokenResult* value, GError** error) { + uint8_t type = firebase_auth_internal_id_token_result_type_id; + g_byte_array_append(buffer, &type, sizeof(uint8_t)); + g_autoptr(FlValue) values = + firebase_auth_internal_id_token_result_to_list(value); + return fl_standard_message_codec_write_value(codec, buffer, values, error); +} + +static gboolean +firebase_auth_message_codec_write_firebase_auth_internal_user_profile( + FlStandardMessageCodec* codec, GByteArray* buffer, + FirebaseAuthInternalUserProfile* value, GError** error) { + uint8_t type = firebase_auth_internal_user_profile_type_id; + g_byte_array_append(buffer, &type, sizeof(uint8_t)); + g_autoptr(FlValue) values = + firebase_auth_internal_user_profile_to_list(value); + return fl_standard_message_codec_write_value(codec, buffer, values, error); +} + +static gboolean +firebase_auth_message_codec_write_firebase_auth_internal_totp_secret( + FlStandardMessageCodec* codec, GByteArray* buffer, + FirebaseAuthInternalTotpSecret* value, GError** error) { + uint8_t type = firebase_auth_internal_totp_secret_type_id; + g_byte_array_append(buffer, &type, sizeof(uint8_t)); + g_autoptr(FlValue) values = firebase_auth_internal_totp_secret_to_list(value); + return fl_standard_message_codec_write_value(codec, buffer, values, error); +} + +static gboolean firebase_auth_message_codec_write_value( + FlStandardMessageCodec* codec, GByteArray* buffer, FlValue* value, + GError** error) { + if (fl_value_get_type(value) == FL_VALUE_TYPE_CUSTOM) { + switch (fl_value_get_custom_type(value)) { + case firebase_auth_action_code_info_operation_type_id: + return firebase_auth_message_codec_write_firebase_auth_action_code_info_operation( + codec, buffer, + reinterpret_cast( + const_cast(fl_value_get_custom_value(value))), + error); + case firebase_auth_internal_multi_factor_session_type_id: + return firebase_auth_message_codec_write_firebase_auth_internal_multi_factor_session( + codec, buffer, + FIREBASE_AUTH_INTERNAL_MULTI_FACTOR_SESSION( + fl_value_get_custom_value_object(value)), + error); + case firebase_auth_internal_phone_multi_factor_assertion_type_id: + return firebase_auth_message_codec_write_firebase_auth_internal_phone_multi_factor_assertion( + codec, buffer, + FIREBASE_AUTH_INTERNAL_PHONE_MULTI_FACTOR_ASSERTION( + fl_value_get_custom_value_object(value)), + error); + case firebase_auth_internal_multi_factor_info_type_id: + return firebase_auth_message_codec_write_firebase_auth_internal_multi_factor_info( + codec, buffer, + FIREBASE_AUTH_INTERNAL_MULTI_FACTOR_INFO( + fl_value_get_custom_value_object(value)), + error); + case firebase_auth_auth_pigeon_firebase_app_type_id: + return firebase_auth_message_codec_write_firebase_auth_auth_pigeon_firebase_app( + codec, buffer, + FIREBASE_AUTH_AUTH_PIGEON_FIREBASE_APP( + fl_value_get_custom_value_object(value)), + error); + case firebase_auth_internal_action_code_info_data_type_id: + return firebase_auth_message_codec_write_firebase_auth_internal_action_code_info_data( + codec, buffer, + FIREBASE_AUTH_INTERNAL_ACTION_CODE_INFO_DATA( + fl_value_get_custom_value_object(value)), + error); + case firebase_auth_internal_action_code_info_type_id: + return firebase_auth_message_codec_write_firebase_auth_internal_action_code_info( + codec, buffer, + FIREBASE_AUTH_INTERNAL_ACTION_CODE_INFO( + fl_value_get_custom_value_object(value)), + error); + case firebase_auth_internal_additional_user_info_type_id: + return firebase_auth_message_codec_write_firebase_auth_internal_additional_user_info( + codec, buffer, + FIREBASE_AUTH_INTERNAL_ADDITIONAL_USER_INFO( + fl_value_get_custom_value_object(value)), + error); + case firebase_auth_internal_auth_credential_type_id: + return firebase_auth_message_codec_write_firebase_auth_internal_auth_credential( + codec, buffer, + FIREBASE_AUTH_INTERNAL_AUTH_CREDENTIAL( + fl_value_get_custom_value_object(value)), + error); + case firebase_auth_internal_user_info_type_id: + return firebase_auth_message_codec_write_firebase_auth_internal_user_info( + codec, buffer, + FIREBASE_AUTH_INTERNAL_USER_INFO( + fl_value_get_custom_value_object(value)), + error); + case firebase_auth_internal_user_details_type_id: + return firebase_auth_message_codec_write_firebase_auth_internal_user_details( + codec, buffer, + FIREBASE_AUTH_INTERNAL_USER_DETAILS( + fl_value_get_custom_value_object(value)), + error); + case firebase_auth_internal_user_credential_type_id: + return firebase_auth_message_codec_write_firebase_auth_internal_user_credential( + codec, buffer, + FIREBASE_AUTH_INTERNAL_USER_CREDENTIAL( + fl_value_get_custom_value_object(value)), + error); + case firebase_auth_internal_auth_credential_input_type_id: + return firebase_auth_message_codec_write_firebase_auth_internal_auth_credential_input( + codec, buffer, + FIREBASE_AUTH_INTERNAL_AUTH_CREDENTIAL_INPUT( + fl_value_get_custom_value_object(value)), + error); + case firebase_auth_internal_action_code_settings_type_id: + return firebase_auth_message_codec_write_firebase_auth_internal_action_code_settings( + codec, buffer, + FIREBASE_AUTH_INTERNAL_ACTION_CODE_SETTINGS( + fl_value_get_custom_value_object(value)), + error); + case firebase_auth_internal_firebase_auth_settings_type_id: + return firebase_auth_message_codec_write_firebase_auth_internal_firebase_auth_settings( + codec, buffer, + FIREBASE_AUTH_INTERNAL_FIREBASE_AUTH_SETTINGS( + fl_value_get_custom_value_object(value)), + error); + case firebase_auth_internal_sign_in_provider_type_id: + return firebase_auth_message_codec_write_firebase_auth_internal_sign_in_provider( + codec, buffer, + FIREBASE_AUTH_INTERNAL_SIGN_IN_PROVIDER( + fl_value_get_custom_value_object(value)), + error); + case firebase_auth_internal_verify_phone_number_request_type_id: + return firebase_auth_message_codec_write_firebase_auth_internal_verify_phone_number_request( + codec, buffer, + FIREBASE_AUTH_INTERNAL_VERIFY_PHONE_NUMBER_REQUEST( + fl_value_get_custom_value_object(value)), + error); + case firebase_auth_internal_id_token_result_type_id: + return firebase_auth_message_codec_write_firebase_auth_internal_id_token_result( + codec, buffer, + FIREBASE_AUTH_INTERNAL_ID_TOKEN_RESULT( + fl_value_get_custom_value_object(value)), + error); + case firebase_auth_internal_user_profile_type_id: + return firebase_auth_message_codec_write_firebase_auth_internal_user_profile( + codec, buffer, + FIREBASE_AUTH_INTERNAL_USER_PROFILE( + fl_value_get_custom_value_object(value)), + error); + case firebase_auth_internal_totp_secret_type_id: + return firebase_auth_message_codec_write_firebase_auth_internal_totp_secret( + codec, buffer, + FIREBASE_AUTH_INTERNAL_TOTP_SECRET( + fl_value_get_custom_value_object(value)), + error); + } + } + + return FL_STANDARD_MESSAGE_CODEC_CLASS( + firebase_auth_message_codec_parent_class) + ->write_value(codec, buffer, value, error); +} + +static FlValue* +firebase_auth_message_codec_read_firebase_auth_action_code_info_operation( + FlStandardMessageCodec* codec, GBytes* buffer, size_t* offset, + GError** error) { + return fl_value_new_custom( + firebase_auth_action_code_info_operation_type_id, + fl_standard_message_codec_read_value(codec, buffer, offset, error), + (GDestroyNotify)fl_value_unref); +} + +static FlValue* +firebase_auth_message_codec_read_firebase_auth_internal_multi_factor_session( + FlStandardMessageCodec* codec, GBytes* buffer, size_t* offset, + GError** error) { + g_autoptr(FlValue) values = + fl_standard_message_codec_read_value(codec, buffer, offset, error); + if (values == nullptr) { + return nullptr; + } + + g_autoptr(FirebaseAuthInternalMultiFactorSession) value = + firebase_auth_internal_multi_factor_session_new_from_list(values); + if (value == nullptr) { + g_set_error(error, FL_MESSAGE_CODEC_ERROR, FL_MESSAGE_CODEC_ERROR_FAILED, + "Invalid data received for MessageData"); + return nullptr; + } + + return fl_value_new_custom_object( + firebase_auth_internal_multi_factor_session_type_id, G_OBJECT(value)); +} + +static FlValue* +firebase_auth_message_codec_read_firebase_auth_internal_phone_multi_factor_assertion( + FlStandardMessageCodec* codec, GBytes* buffer, size_t* offset, + GError** error) { + g_autoptr(FlValue) values = + fl_standard_message_codec_read_value(codec, buffer, offset, error); + if (values == nullptr) { + return nullptr; + } + + g_autoptr(FirebaseAuthInternalPhoneMultiFactorAssertion) value = + firebase_auth_internal_phone_multi_factor_assertion_new_from_list(values); + if (value == nullptr) { + g_set_error(error, FL_MESSAGE_CODEC_ERROR, FL_MESSAGE_CODEC_ERROR_FAILED, + "Invalid data received for MessageData"); + return nullptr; + } + + return fl_value_new_custom_object( + firebase_auth_internal_phone_multi_factor_assertion_type_id, + G_OBJECT(value)); +} + +static FlValue* +firebase_auth_message_codec_read_firebase_auth_internal_multi_factor_info( + FlStandardMessageCodec* codec, GBytes* buffer, size_t* offset, + GError** error) { + g_autoptr(FlValue) values = + fl_standard_message_codec_read_value(codec, buffer, offset, error); + if (values == nullptr) { + return nullptr; + } + + g_autoptr(FirebaseAuthInternalMultiFactorInfo) value = + firebase_auth_internal_multi_factor_info_new_from_list(values); + if (value == nullptr) { + g_set_error(error, FL_MESSAGE_CODEC_ERROR, FL_MESSAGE_CODEC_ERROR_FAILED, + "Invalid data received for MessageData"); + return nullptr; + } + + return fl_value_new_custom_object( + firebase_auth_internal_multi_factor_info_type_id, G_OBJECT(value)); +} + +static FlValue* +firebase_auth_message_codec_read_firebase_auth_auth_pigeon_firebase_app( + FlStandardMessageCodec* codec, GBytes* buffer, size_t* offset, + GError** error) { + g_autoptr(FlValue) values = + fl_standard_message_codec_read_value(codec, buffer, offset, error); + if (values == nullptr) { + return nullptr; + } + + g_autoptr(FirebaseAuthAuthPigeonFirebaseApp) value = + firebase_auth_auth_pigeon_firebase_app_new_from_list(values); + if (value == nullptr) { + g_set_error(error, FL_MESSAGE_CODEC_ERROR, FL_MESSAGE_CODEC_ERROR_FAILED, + "Invalid data received for MessageData"); + return nullptr; + } + + return fl_value_new_custom_object( + firebase_auth_auth_pigeon_firebase_app_type_id, G_OBJECT(value)); +} + +static FlValue* +firebase_auth_message_codec_read_firebase_auth_internal_action_code_info_data( + FlStandardMessageCodec* codec, GBytes* buffer, size_t* offset, + GError** error) { + g_autoptr(FlValue) values = + fl_standard_message_codec_read_value(codec, buffer, offset, error); + if (values == nullptr) { + return nullptr; + } + + g_autoptr(FirebaseAuthInternalActionCodeInfoData) value = + firebase_auth_internal_action_code_info_data_new_from_list(values); + if (value == nullptr) { + g_set_error(error, FL_MESSAGE_CODEC_ERROR, FL_MESSAGE_CODEC_ERROR_FAILED, + "Invalid data received for MessageData"); + return nullptr; + } + + return fl_value_new_custom_object( + firebase_auth_internal_action_code_info_data_type_id, G_OBJECT(value)); +} + +static FlValue* +firebase_auth_message_codec_read_firebase_auth_internal_action_code_info( + FlStandardMessageCodec* codec, GBytes* buffer, size_t* offset, + GError** error) { + g_autoptr(FlValue) values = + fl_standard_message_codec_read_value(codec, buffer, offset, error); + if (values == nullptr) { + return nullptr; + } + + g_autoptr(FirebaseAuthInternalActionCodeInfo) value = + firebase_auth_internal_action_code_info_new_from_list(values); + if (value == nullptr) { + g_set_error(error, FL_MESSAGE_CODEC_ERROR, FL_MESSAGE_CODEC_ERROR_FAILED, + "Invalid data received for MessageData"); + return nullptr; + } + + return fl_value_new_custom_object( + firebase_auth_internal_action_code_info_type_id, G_OBJECT(value)); +} + +static FlValue* +firebase_auth_message_codec_read_firebase_auth_internal_additional_user_info( + FlStandardMessageCodec* codec, GBytes* buffer, size_t* offset, + GError** error) { + g_autoptr(FlValue) values = + fl_standard_message_codec_read_value(codec, buffer, offset, error); + if (values == nullptr) { + return nullptr; + } + + g_autoptr(FirebaseAuthInternalAdditionalUserInfo) value = + firebase_auth_internal_additional_user_info_new_from_list(values); + if (value == nullptr) { + g_set_error(error, FL_MESSAGE_CODEC_ERROR, FL_MESSAGE_CODEC_ERROR_FAILED, + "Invalid data received for MessageData"); + return nullptr; + } + + return fl_value_new_custom_object( + firebase_auth_internal_additional_user_info_type_id, G_OBJECT(value)); +} + +static FlValue* +firebase_auth_message_codec_read_firebase_auth_internal_auth_credential( + FlStandardMessageCodec* codec, GBytes* buffer, size_t* offset, + GError** error) { + g_autoptr(FlValue) values = + fl_standard_message_codec_read_value(codec, buffer, offset, error); + if (values == nullptr) { + return nullptr; + } + + g_autoptr(FirebaseAuthInternalAuthCredential) value = + firebase_auth_internal_auth_credential_new_from_list(values); + if (value == nullptr) { + g_set_error(error, FL_MESSAGE_CODEC_ERROR, FL_MESSAGE_CODEC_ERROR_FAILED, + "Invalid data received for MessageData"); + return nullptr; + } + + return fl_value_new_custom_object( + firebase_auth_internal_auth_credential_type_id, G_OBJECT(value)); +} + +static FlValue* +firebase_auth_message_codec_read_firebase_auth_internal_user_info( + FlStandardMessageCodec* codec, GBytes* buffer, size_t* offset, + GError** error) { + g_autoptr(FlValue) values = + fl_standard_message_codec_read_value(codec, buffer, offset, error); + if (values == nullptr) { + return nullptr; + } + + g_autoptr(FirebaseAuthInternalUserInfo) value = + firebase_auth_internal_user_info_new_from_list(values); + if (value == nullptr) { + g_set_error(error, FL_MESSAGE_CODEC_ERROR, FL_MESSAGE_CODEC_ERROR_FAILED, + "Invalid data received for MessageData"); + return nullptr; + } + + return fl_value_new_custom_object(firebase_auth_internal_user_info_type_id, + G_OBJECT(value)); +} + +static FlValue* +firebase_auth_message_codec_read_firebase_auth_internal_user_details( + FlStandardMessageCodec* codec, GBytes* buffer, size_t* offset, + GError** error) { + g_autoptr(FlValue) values = + fl_standard_message_codec_read_value(codec, buffer, offset, error); + if (values == nullptr) { + return nullptr; + } + + g_autoptr(FirebaseAuthInternalUserDetails) value = + firebase_auth_internal_user_details_new_from_list(values); + if (value == nullptr) { + g_set_error(error, FL_MESSAGE_CODEC_ERROR, FL_MESSAGE_CODEC_ERROR_FAILED, + "Invalid data received for MessageData"); + return nullptr; + } + + return fl_value_new_custom_object(firebase_auth_internal_user_details_type_id, + G_OBJECT(value)); +} + +static FlValue* +firebase_auth_message_codec_read_firebase_auth_internal_user_credential( + FlStandardMessageCodec* codec, GBytes* buffer, size_t* offset, + GError** error) { + g_autoptr(FlValue) values = + fl_standard_message_codec_read_value(codec, buffer, offset, error); + if (values == nullptr) { + return nullptr; + } + + g_autoptr(FirebaseAuthInternalUserCredential) value = + firebase_auth_internal_user_credential_new_from_list(values); + if (value == nullptr) { + g_set_error(error, FL_MESSAGE_CODEC_ERROR, FL_MESSAGE_CODEC_ERROR_FAILED, + "Invalid data received for MessageData"); + return nullptr; + } + + return fl_value_new_custom_object( + firebase_auth_internal_user_credential_type_id, G_OBJECT(value)); +} + +static FlValue* +firebase_auth_message_codec_read_firebase_auth_internal_auth_credential_input( + FlStandardMessageCodec* codec, GBytes* buffer, size_t* offset, + GError** error) { + g_autoptr(FlValue) values = + fl_standard_message_codec_read_value(codec, buffer, offset, error); + if (values == nullptr) { + return nullptr; + } + + g_autoptr(FirebaseAuthInternalAuthCredentialInput) value = + firebase_auth_internal_auth_credential_input_new_from_list(values); + if (value == nullptr) { + g_set_error(error, FL_MESSAGE_CODEC_ERROR, FL_MESSAGE_CODEC_ERROR_FAILED, + "Invalid data received for MessageData"); + return nullptr; + } + + return fl_value_new_custom_object( + firebase_auth_internal_auth_credential_input_type_id, G_OBJECT(value)); +} + +static FlValue* +firebase_auth_message_codec_read_firebase_auth_internal_action_code_settings( + FlStandardMessageCodec* codec, GBytes* buffer, size_t* offset, + GError** error) { + g_autoptr(FlValue) values = + fl_standard_message_codec_read_value(codec, buffer, offset, error); + if (values == nullptr) { + return nullptr; + } + + g_autoptr(FirebaseAuthInternalActionCodeSettings) value = + firebase_auth_internal_action_code_settings_new_from_list(values); + if (value == nullptr) { + g_set_error(error, FL_MESSAGE_CODEC_ERROR, FL_MESSAGE_CODEC_ERROR_FAILED, + "Invalid data received for MessageData"); + return nullptr; + } + + return fl_value_new_custom_object( + firebase_auth_internal_action_code_settings_type_id, G_OBJECT(value)); +} + +static FlValue* +firebase_auth_message_codec_read_firebase_auth_internal_firebase_auth_settings( + FlStandardMessageCodec* codec, GBytes* buffer, size_t* offset, + GError** error) { + g_autoptr(FlValue) values = + fl_standard_message_codec_read_value(codec, buffer, offset, error); + if (values == nullptr) { + return nullptr; + } + + g_autoptr(FirebaseAuthInternalFirebaseAuthSettings) value = + firebase_auth_internal_firebase_auth_settings_new_from_list(values); + if (value == nullptr) { + g_set_error(error, FL_MESSAGE_CODEC_ERROR, FL_MESSAGE_CODEC_ERROR_FAILED, + "Invalid data received for MessageData"); + return nullptr; + } + + return fl_value_new_custom_object( + firebase_auth_internal_firebase_auth_settings_type_id, G_OBJECT(value)); +} + +static FlValue* +firebase_auth_message_codec_read_firebase_auth_internal_sign_in_provider( + FlStandardMessageCodec* codec, GBytes* buffer, size_t* offset, + GError** error) { + g_autoptr(FlValue) values = + fl_standard_message_codec_read_value(codec, buffer, offset, error); + if (values == nullptr) { + return nullptr; + } + + g_autoptr(FirebaseAuthInternalSignInProvider) value = + firebase_auth_internal_sign_in_provider_new_from_list(values); + if (value == nullptr) { + g_set_error(error, FL_MESSAGE_CODEC_ERROR, FL_MESSAGE_CODEC_ERROR_FAILED, + "Invalid data received for MessageData"); + return nullptr; + } + + return fl_value_new_custom_object( + firebase_auth_internal_sign_in_provider_type_id, G_OBJECT(value)); +} + +static FlValue* +firebase_auth_message_codec_read_firebase_auth_internal_verify_phone_number_request( + FlStandardMessageCodec* codec, GBytes* buffer, size_t* offset, + GError** error) { + g_autoptr(FlValue) values = + fl_standard_message_codec_read_value(codec, buffer, offset, error); + if (values == nullptr) { + return nullptr; + } + + g_autoptr(FirebaseAuthInternalVerifyPhoneNumberRequest) value = + firebase_auth_internal_verify_phone_number_request_new_from_list(values); + if (value == nullptr) { + g_set_error(error, FL_MESSAGE_CODEC_ERROR, FL_MESSAGE_CODEC_ERROR_FAILED, + "Invalid data received for MessageData"); + return nullptr; + } + + return fl_value_new_custom_object( + firebase_auth_internal_verify_phone_number_request_type_id, + G_OBJECT(value)); +} + +static FlValue* +firebase_auth_message_codec_read_firebase_auth_internal_id_token_result( + FlStandardMessageCodec* codec, GBytes* buffer, size_t* offset, + GError** error) { + g_autoptr(FlValue) values = + fl_standard_message_codec_read_value(codec, buffer, offset, error); + if (values == nullptr) { + return nullptr; + } + + g_autoptr(FirebaseAuthInternalIdTokenResult) value = + firebase_auth_internal_id_token_result_new_from_list(values); + if (value == nullptr) { + g_set_error(error, FL_MESSAGE_CODEC_ERROR, FL_MESSAGE_CODEC_ERROR_FAILED, + "Invalid data received for MessageData"); + return nullptr; + } + + return fl_value_new_custom_object( + firebase_auth_internal_id_token_result_type_id, G_OBJECT(value)); +} + +static FlValue* +firebase_auth_message_codec_read_firebase_auth_internal_user_profile( + FlStandardMessageCodec* codec, GBytes* buffer, size_t* offset, + GError** error) { + g_autoptr(FlValue) values = + fl_standard_message_codec_read_value(codec, buffer, offset, error); + if (values == nullptr) { + return nullptr; + } + + g_autoptr(FirebaseAuthInternalUserProfile) value = + firebase_auth_internal_user_profile_new_from_list(values); + if (value == nullptr) { + g_set_error(error, FL_MESSAGE_CODEC_ERROR, FL_MESSAGE_CODEC_ERROR_FAILED, + "Invalid data received for MessageData"); + return nullptr; + } + + return fl_value_new_custom_object(firebase_auth_internal_user_profile_type_id, + G_OBJECT(value)); +} + +static FlValue* +firebase_auth_message_codec_read_firebase_auth_internal_totp_secret( + FlStandardMessageCodec* codec, GBytes* buffer, size_t* offset, + GError** error) { + g_autoptr(FlValue) values = + fl_standard_message_codec_read_value(codec, buffer, offset, error); + if (values == nullptr) { + return nullptr; + } + + g_autoptr(FirebaseAuthInternalTotpSecret) value = + firebase_auth_internal_totp_secret_new_from_list(values); + if (value == nullptr) { + g_set_error(error, FL_MESSAGE_CODEC_ERROR, FL_MESSAGE_CODEC_ERROR_FAILED, + "Invalid data received for MessageData"); + return nullptr; + } + + return fl_value_new_custom_object(firebase_auth_internal_totp_secret_type_id, + G_OBJECT(value)); +} + +static FlValue* firebase_auth_message_codec_read_value_of_type( + FlStandardMessageCodec* codec, GBytes* buffer, size_t* offset, int type, + GError** error) { + switch (type) { + case firebase_auth_action_code_info_operation_type_id: + return firebase_auth_message_codec_read_firebase_auth_action_code_info_operation( + codec, buffer, offset, error); + case firebase_auth_internal_multi_factor_session_type_id: + return firebase_auth_message_codec_read_firebase_auth_internal_multi_factor_session( + codec, buffer, offset, error); + case firebase_auth_internal_phone_multi_factor_assertion_type_id: + return firebase_auth_message_codec_read_firebase_auth_internal_phone_multi_factor_assertion( + codec, buffer, offset, error); + case firebase_auth_internal_multi_factor_info_type_id: + return firebase_auth_message_codec_read_firebase_auth_internal_multi_factor_info( + codec, buffer, offset, error); + case firebase_auth_auth_pigeon_firebase_app_type_id: + return firebase_auth_message_codec_read_firebase_auth_auth_pigeon_firebase_app( + codec, buffer, offset, error); + case firebase_auth_internal_action_code_info_data_type_id: + return firebase_auth_message_codec_read_firebase_auth_internal_action_code_info_data( + codec, buffer, offset, error); + case firebase_auth_internal_action_code_info_type_id: + return firebase_auth_message_codec_read_firebase_auth_internal_action_code_info( + codec, buffer, offset, error); + case firebase_auth_internal_additional_user_info_type_id: + return firebase_auth_message_codec_read_firebase_auth_internal_additional_user_info( + codec, buffer, offset, error); + case firebase_auth_internal_auth_credential_type_id: + return firebase_auth_message_codec_read_firebase_auth_internal_auth_credential( + codec, buffer, offset, error); + case firebase_auth_internal_user_info_type_id: + return firebase_auth_message_codec_read_firebase_auth_internal_user_info( + codec, buffer, offset, error); + case firebase_auth_internal_user_details_type_id: + return firebase_auth_message_codec_read_firebase_auth_internal_user_details( + codec, buffer, offset, error); + case firebase_auth_internal_user_credential_type_id: + return firebase_auth_message_codec_read_firebase_auth_internal_user_credential( + codec, buffer, offset, error); + case firebase_auth_internal_auth_credential_input_type_id: + return firebase_auth_message_codec_read_firebase_auth_internal_auth_credential_input( + codec, buffer, offset, error); + case firebase_auth_internal_action_code_settings_type_id: + return firebase_auth_message_codec_read_firebase_auth_internal_action_code_settings( + codec, buffer, offset, error); + case firebase_auth_internal_firebase_auth_settings_type_id: + return firebase_auth_message_codec_read_firebase_auth_internal_firebase_auth_settings( + codec, buffer, offset, error); + case firebase_auth_internal_sign_in_provider_type_id: + return firebase_auth_message_codec_read_firebase_auth_internal_sign_in_provider( + codec, buffer, offset, error); + case firebase_auth_internal_verify_phone_number_request_type_id: + return firebase_auth_message_codec_read_firebase_auth_internal_verify_phone_number_request( + codec, buffer, offset, error); + case firebase_auth_internal_id_token_result_type_id: + return firebase_auth_message_codec_read_firebase_auth_internal_id_token_result( + codec, buffer, offset, error); + case firebase_auth_internal_user_profile_type_id: + return firebase_auth_message_codec_read_firebase_auth_internal_user_profile( + codec, buffer, offset, error); + case firebase_auth_internal_totp_secret_type_id: + return firebase_auth_message_codec_read_firebase_auth_internal_totp_secret( + codec, buffer, offset, error); + default: + return FL_STANDARD_MESSAGE_CODEC_CLASS( + firebase_auth_message_codec_parent_class) + ->read_value_of_type(codec, buffer, offset, type, error); + } +} + +static void firebase_auth_message_codec_init(FirebaseAuthMessageCodec* self) {} + +static void firebase_auth_message_codec_class_init( + FirebaseAuthMessageCodecClass* klass) { + FL_STANDARD_MESSAGE_CODEC_CLASS(klass)->write_value = + firebase_auth_message_codec_write_value; + FL_STANDARD_MESSAGE_CODEC_CLASS(klass)->read_value_of_type = + firebase_auth_message_codec_read_value_of_type; +} + +static FirebaseAuthMessageCodec* firebase_auth_message_codec_new() { + FirebaseAuthMessageCodec* self = FIREBASE_AUTH_MESSAGE_CODEC( + g_object_new(firebase_auth_message_codec_get_type(), nullptr)); + return self; +} + +struct _FirebaseAuthFirebaseAuthHostApiResponseHandle { + GObject parent_instance; + + FlBasicMessageChannel* channel; + FlBasicMessageChannelResponseHandle* response_handle; +}; + +G_DEFINE_TYPE(FirebaseAuthFirebaseAuthHostApiResponseHandle, + firebase_auth_firebase_auth_host_api_response_handle, + G_TYPE_OBJECT) + +static void firebase_auth_firebase_auth_host_api_response_handle_dispose( + GObject* object) { + FirebaseAuthFirebaseAuthHostApiResponseHandle* self = + FIREBASE_AUTH_FIREBASE_AUTH_HOST_API_RESPONSE_HANDLE(object); + g_clear_object(&self->channel); + g_clear_object(&self->response_handle); + G_OBJECT_CLASS( + firebase_auth_firebase_auth_host_api_response_handle_parent_class) + ->dispose(object); +} + +static void firebase_auth_firebase_auth_host_api_response_handle_init( + FirebaseAuthFirebaseAuthHostApiResponseHandle* self) {} + +static void firebase_auth_firebase_auth_host_api_response_handle_class_init( + FirebaseAuthFirebaseAuthHostApiResponseHandleClass* klass) { + G_OBJECT_CLASS(klass)->dispose = + firebase_auth_firebase_auth_host_api_response_handle_dispose; +} + +static FirebaseAuthFirebaseAuthHostApiResponseHandle* +firebase_auth_firebase_auth_host_api_response_handle_new( + FlBasicMessageChannel* channel, + FlBasicMessageChannelResponseHandle* response_handle) { + FirebaseAuthFirebaseAuthHostApiResponseHandle* self = + FIREBASE_AUTH_FIREBASE_AUTH_HOST_API_RESPONSE_HANDLE(g_object_new( + firebase_auth_firebase_auth_host_api_response_handle_get_type(), + nullptr)); + self->channel = FL_BASIC_MESSAGE_CHANNEL(g_object_ref(channel)); + self->response_handle = + FL_BASIC_MESSAGE_CHANNEL_RESPONSE_HANDLE(g_object_ref(response_handle)); + return self; +} + +G_DECLARE_FINAL_TYPE( + FirebaseAuthFirebaseAuthHostApiRegisterIdTokenListenerResponse, + firebase_auth_firebase_auth_host_api_register_id_token_listener_response, + FIREBASE_AUTH, FIREBASE_AUTH_HOST_API_REGISTER_ID_TOKEN_LISTENER_RESPONSE, + GObject) + +struct _FirebaseAuthFirebaseAuthHostApiRegisterIdTokenListenerResponse { + GObject parent_instance; + + FlValue* value; +}; + +G_DEFINE_TYPE( + FirebaseAuthFirebaseAuthHostApiRegisterIdTokenListenerResponse, + firebase_auth_firebase_auth_host_api_register_id_token_listener_response, + G_TYPE_OBJECT) + +static void +firebase_auth_firebase_auth_host_api_register_id_token_listener_response_dispose( + GObject* object) { + FirebaseAuthFirebaseAuthHostApiRegisterIdTokenListenerResponse* self = + FIREBASE_AUTH_FIREBASE_AUTH_HOST_API_REGISTER_ID_TOKEN_LISTENER_RESPONSE( + object); + g_clear_pointer(&self->value, fl_value_unref); + G_OBJECT_CLASS( + firebase_auth_firebase_auth_host_api_register_id_token_listener_response_parent_class) + ->dispose(object); +} + +static void +firebase_auth_firebase_auth_host_api_register_id_token_listener_response_init( + FirebaseAuthFirebaseAuthHostApiRegisterIdTokenListenerResponse* self) {} + +static void +firebase_auth_firebase_auth_host_api_register_id_token_listener_response_class_init( + FirebaseAuthFirebaseAuthHostApiRegisterIdTokenListenerResponseClass* + klass) { + G_OBJECT_CLASS(klass)->dispose = + firebase_auth_firebase_auth_host_api_register_id_token_listener_response_dispose; +} + +static FirebaseAuthFirebaseAuthHostApiRegisterIdTokenListenerResponse* +firebase_auth_firebase_auth_host_api_register_id_token_listener_response_new( + const gchar* return_value) { + FirebaseAuthFirebaseAuthHostApiRegisterIdTokenListenerResponse* self = + FIREBASE_AUTH_FIREBASE_AUTH_HOST_API_REGISTER_ID_TOKEN_LISTENER_RESPONSE( + g_object_new( + firebase_auth_firebase_auth_host_api_register_id_token_listener_response_get_type(), + nullptr)); + self->value = fl_value_new_list(); + fl_value_append_take(self->value, fl_value_new_string(return_value)); + return self; +} + +static FirebaseAuthFirebaseAuthHostApiRegisterIdTokenListenerResponse* +firebase_auth_firebase_auth_host_api_register_id_token_listener_response_new_error( + const gchar* code, const gchar* message, FlValue* details) { + FirebaseAuthFirebaseAuthHostApiRegisterIdTokenListenerResponse* self = + FIREBASE_AUTH_FIREBASE_AUTH_HOST_API_REGISTER_ID_TOKEN_LISTENER_RESPONSE( + g_object_new( + firebase_auth_firebase_auth_host_api_register_id_token_listener_response_get_type(), + nullptr)); + self->value = fl_value_new_list(); + fl_value_append_take(self->value, fl_value_new_string(code)); + fl_value_append_take(self->value, + fl_value_new_string(message != nullptr ? message : "")); + fl_value_append_take(self->value, details != nullptr ? fl_value_ref(details) + : fl_value_new_null()); + return self; +} + +G_DECLARE_FINAL_TYPE( + FirebaseAuthFirebaseAuthHostApiRegisterAuthStateListenerResponse, + firebase_auth_firebase_auth_host_api_register_auth_state_listener_response, + FIREBASE_AUTH, FIREBASE_AUTH_HOST_API_REGISTER_AUTH_STATE_LISTENER_RESPONSE, + GObject) + +struct _FirebaseAuthFirebaseAuthHostApiRegisterAuthStateListenerResponse { + GObject parent_instance; + + FlValue* value; +}; + +G_DEFINE_TYPE( + FirebaseAuthFirebaseAuthHostApiRegisterAuthStateListenerResponse, + firebase_auth_firebase_auth_host_api_register_auth_state_listener_response, + G_TYPE_OBJECT) + +static void +firebase_auth_firebase_auth_host_api_register_auth_state_listener_response_dispose( + GObject* object) { + FirebaseAuthFirebaseAuthHostApiRegisterAuthStateListenerResponse* self = + FIREBASE_AUTH_FIREBASE_AUTH_HOST_API_REGISTER_AUTH_STATE_LISTENER_RESPONSE( + object); + g_clear_pointer(&self->value, fl_value_unref); + G_OBJECT_CLASS( + firebase_auth_firebase_auth_host_api_register_auth_state_listener_response_parent_class) + ->dispose(object); +} + +static void +firebase_auth_firebase_auth_host_api_register_auth_state_listener_response_init( + FirebaseAuthFirebaseAuthHostApiRegisterAuthStateListenerResponse* self) {} + +static void +firebase_auth_firebase_auth_host_api_register_auth_state_listener_response_class_init( + FirebaseAuthFirebaseAuthHostApiRegisterAuthStateListenerResponseClass* + klass) { + G_OBJECT_CLASS(klass)->dispose = + firebase_auth_firebase_auth_host_api_register_auth_state_listener_response_dispose; +} + +static FirebaseAuthFirebaseAuthHostApiRegisterAuthStateListenerResponse* +firebase_auth_firebase_auth_host_api_register_auth_state_listener_response_new( + const gchar* return_value) { + FirebaseAuthFirebaseAuthHostApiRegisterAuthStateListenerResponse* self = + FIREBASE_AUTH_FIREBASE_AUTH_HOST_API_REGISTER_AUTH_STATE_LISTENER_RESPONSE( + g_object_new( + firebase_auth_firebase_auth_host_api_register_auth_state_listener_response_get_type(), + nullptr)); + self->value = fl_value_new_list(); + fl_value_append_take(self->value, fl_value_new_string(return_value)); + return self; +} + +static FirebaseAuthFirebaseAuthHostApiRegisterAuthStateListenerResponse* +firebase_auth_firebase_auth_host_api_register_auth_state_listener_response_new_error( + const gchar* code, const gchar* message, FlValue* details) { + FirebaseAuthFirebaseAuthHostApiRegisterAuthStateListenerResponse* self = + FIREBASE_AUTH_FIREBASE_AUTH_HOST_API_REGISTER_AUTH_STATE_LISTENER_RESPONSE( + g_object_new( + firebase_auth_firebase_auth_host_api_register_auth_state_listener_response_get_type(), + nullptr)); + self->value = fl_value_new_list(); + fl_value_append_take(self->value, fl_value_new_string(code)); + fl_value_append_take(self->value, + fl_value_new_string(message != nullptr ? message : "")); + fl_value_append_take(self->value, details != nullptr ? fl_value_ref(details) + : fl_value_new_null()); + return self; +} + +G_DECLARE_FINAL_TYPE(FirebaseAuthFirebaseAuthHostApiUseEmulatorResponse, + firebase_auth_firebase_auth_host_api_use_emulator_response, + FIREBASE_AUTH, + FIREBASE_AUTH_HOST_API_USE_EMULATOR_RESPONSE, GObject) + +struct _FirebaseAuthFirebaseAuthHostApiUseEmulatorResponse { + GObject parent_instance; + + FlValue* value; +}; + +G_DEFINE_TYPE(FirebaseAuthFirebaseAuthHostApiUseEmulatorResponse, + firebase_auth_firebase_auth_host_api_use_emulator_response, + G_TYPE_OBJECT) + +static void firebase_auth_firebase_auth_host_api_use_emulator_response_dispose( + GObject* object) { + FirebaseAuthFirebaseAuthHostApiUseEmulatorResponse* self = + FIREBASE_AUTH_FIREBASE_AUTH_HOST_API_USE_EMULATOR_RESPONSE(object); + g_clear_pointer(&self->value, fl_value_unref); + G_OBJECT_CLASS( + firebase_auth_firebase_auth_host_api_use_emulator_response_parent_class) + ->dispose(object); +} + +static void firebase_auth_firebase_auth_host_api_use_emulator_response_init( + FirebaseAuthFirebaseAuthHostApiUseEmulatorResponse* self) {} + +static void +firebase_auth_firebase_auth_host_api_use_emulator_response_class_init( + FirebaseAuthFirebaseAuthHostApiUseEmulatorResponseClass* klass) { + G_OBJECT_CLASS(klass)->dispose = + firebase_auth_firebase_auth_host_api_use_emulator_response_dispose; +} + +static FirebaseAuthFirebaseAuthHostApiUseEmulatorResponse* +firebase_auth_firebase_auth_host_api_use_emulator_response_new() { + FirebaseAuthFirebaseAuthHostApiUseEmulatorResponse* self = + FIREBASE_AUTH_FIREBASE_AUTH_HOST_API_USE_EMULATOR_RESPONSE(g_object_new( + firebase_auth_firebase_auth_host_api_use_emulator_response_get_type(), + nullptr)); + self->value = fl_value_new_list(); + fl_value_append_take(self->value, fl_value_new_null()); + return self; +} + +static FirebaseAuthFirebaseAuthHostApiUseEmulatorResponse* +firebase_auth_firebase_auth_host_api_use_emulator_response_new_error( + const gchar* code, const gchar* message, FlValue* details) { + FirebaseAuthFirebaseAuthHostApiUseEmulatorResponse* self = + FIREBASE_AUTH_FIREBASE_AUTH_HOST_API_USE_EMULATOR_RESPONSE(g_object_new( + firebase_auth_firebase_auth_host_api_use_emulator_response_get_type(), + nullptr)); + self->value = fl_value_new_list(); + fl_value_append_take(self->value, fl_value_new_string(code)); + fl_value_append_take(self->value, + fl_value_new_string(message != nullptr ? message : "")); + fl_value_append_take(self->value, details != nullptr ? fl_value_ref(details) + : fl_value_new_null()); + return self; +} + +G_DECLARE_FINAL_TYPE( + FirebaseAuthFirebaseAuthHostApiApplyActionCodeResponse, + firebase_auth_firebase_auth_host_api_apply_action_code_response, + FIREBASE_AUTH, FIREBASE_AUTH_HOST_API_APPLY_ACTION_CODE_RESPONSE, GObject) + +struct _FirebaseAuthFirebaseAuthHostApiApplyActionCodeResponse { + GObject parent_instance; + + FlValue* value; +}; + +G_DEFINE_TYPE(FirebaseAuthFirebaseAuthHostApiApplyActionCodeResponse, + firebase_auth_firebase_auth_host_api_apply_action_code_response, + G_TYPE_OBJECT) + +static void +firebase_auth_firebase_auth_host_api_apply_action_code_response_dispose( + GObject* object) { + FirebaseAuthFirebaseAuthHostApiApplyActionCodeResponse* self = + FIREBASE_AUTH_FIREBASE_AUTH_HOST_API_APPLY_ACTION_CODE_RESPONSE(object); + g_clear_pointer(&self->value, fl_value_unref); + G_OBJECT_CLASS( + firebase_auth_firebase_auth_host_api_apply_action_code_response_parent_class) + ->dispose(object); +} + +static void +firebase_auth_firebase_auth_host_api_apply_action_code_response_init( + FirebaseAuthFirebaseAuthHostApiApplyActionCodeResponse* self) {} + +static void +firebase_auth_firebase_auth_host_api_apply_action_code_response_class_init( + FirebaseAuthFirebaseAuthHostApiApplyActionCodeResponseClass* klass) { + G_OBJECT_CLASS(klass)->dispose = + firebase_auth_firebase_auth_host_api_apply_action_code_response_dispose; +} + +static FirebaseAuthFirebaseAuthHostApiApplyActionCodeResponse* +firebase_auth_firebase_auth_host_api_apply_action_code_response_new() { + FirebaseAuthFirebaseAuthHostApiApplyActionCodeResponse* self = + FIREBASE_AUTH_FIREBASE_AUTH_HOST_API_APPLY_ACTION_CODE_RESPONSE(g_object_new( + firebase_auth_firebase_auth_host_api_apply_action_code_response_get_type(), + nullptr)); + self->value = fl_value_new_list(); + fl_value_append_take(self->value, fl_value_new_null()); + return self; +} + +static FirebaseAuthFirebaseAuthHostApiApplyActionCodeResponse* +firebase_auth_firebase_auth_host_api_apply_action_code_response_new_error( + const gchar* code, const gchar* message, FlValue* details) { + FirebaseAuthFirebaseAuthHostApiApplyActionCodeResponse* self = + FIREBASE_AUTH_FIREBASE_AUTH_HOST_API_APPLY_ACTION_CODE_RESPONSE(g_object_new( + firebase_auth_firebase_auth_host_api_apply_action_code_response_get_type(), + nullptr)); + self->value = fl_value_new_list(); + fl_value_append_take(self->value, fl_value_new_string(code)); + fl_value_append_take(self->value, + fl_value_new_string(message != nullptr ? message : "")); + fl_value_append_take(self->value, details != nullptr ? fl_value_ref(details) + : fl_value_new_null()); + return self; +} + +G_DECLARE_FINAL_TYPE( + FirebaseAuthFirebaseAuthHostApiCheckActionCodeResponse, + firebase_auth_firebase_auth_host_api_check_action_code_response, + FIREBASE_AUTH, FIREBASE_AUTH_HOST_API_CHECK_ACTION_CODE_RESPONSE, GObject) + +struct _FirebaseAuthFirebaseAuthHostApiCheckActionCodeResponse { + GObject parent_instance; + + FlValue* value; +}; + +G_DEFINE_TYPE(FirebaseAuthFirebaseAuthHostApiCheckActionCodeResponse, + firebase_auth_firebase_auth_host_api_check_action_code_response, + G_TYPE_OBJECT) + +static void +firebase_auth_firebase_auth_host_api_check_action_code_response_dispose( + GObject* object) { + FirebaseAuthFirebaseAuthHostApiCheckActionCodeResponse* self = + FIREBASE_AUTH_FIREBASE_AUTH_HOST_API_CHECK_ACTION_CODE_RESPONSE(object); + g_clear_pointer(&self->value, fl_value_unref); + G_OBJECT_CLASS( + firebase_auth_firebase_auth_host_api_check_action_code_response_parent_class) + ->dispose(object); +} + +static void +firebase_auth_firebase_auth_host_api_check_action_code_response_init( + FirebaseAuthFirebaseAuthHostApiCheckActionCodeResponse* self) {} + +static void +firebase_auth_firebase_auth_host_api_check_action_code_response_class_init( + FirebaseAuthFirebaseAuthHostApiCheckActionCodeResponseClass* klass) { + G_OBJECT_CLASS(klass)->dispose = + firebase_auth_firebase_auth_host_api_check_action_code_response_dispose; +} + +static FirebaseAuthFirebaseAuthHostApiCheckActionCodeResponse* +firebase_auth_firebase_auth_host_api_check_action_code_response_new( + FirebaseAuthInternalActionCodeInfo* return_value) { + FirebaseAuthFirebaseAuthHostApiCheckActionCodeResponse* self = + FIREBASE_AUTH_FIREBASE_AUTH_HOST_API_CHECK_ACTION_CODE_RESPONSE(g_object_new( + firebase_auth_firebase_auth_host_api_check_action_code_response_get_type(), + nullptr)); + self->value = fl_value_new_list(); + fl_value_append_take(self->value, + fl_value_new_custom_object( + firebase_auth_internal_action_code_info_type_id, + G_OBJECT(return_value))); + return self; +} + +static FirebaseAuthFirebaseAuthHostApiCheckActionCodeResponse* +firebase_auth_firebase_auth_host_api_check_action_code_response_new_error( + const gchar* code, const gchar* message, FlValue* details) { + FirebaseAuthFirebaseAuthHostApiCheckActionCodeResponse* self = + FIREBASE_AUTH_FIREBASE_AUTH_HOST_API_CHECK_ACTION_CODE_RESPONSE(g_object_new( + firebase_auth_firebase_auth_host_api_check_action_code_response_get_type(), + nullptr)); + self->value = fl_value_new_list(); + fl_value_append_take(self->value, fl_value_new_string(code)); + fl_value_append_take(self->value, + fl_value_new_string(message != nullptr ? message : "")); + fl_value_append_take(self->value, details != nullptr ? fl_value_ref(details) + : fl_value_new_null()); + return self; +} + +G_DECLARE_FINAL_TYPE( + FirebaseAuthFirebaseAuthHostApiConfirmPasswordResetResponse, + firebase_auth_firebase_auth_host_api_confirm_password_reset_response, + FIREBASE_AUTH, FIREBASE_AUTH_HOST_API_CONFIRM_PASSWORD_RESET_RESPONSE, + GObject) + +struct _FirebaseAuthFirebaseAuthHostApiConfirmPasswordResetResponse { + GObject parent_instance; + + FlValue* value; +}; + +G_DEFINE_TYPE( + FirebaseAuthFirebaseAuthHostApiConfirmPasswordResetResponse, + firebase_auth_firebase_auth_host_api_confirm_password_reset_response, + G_TYPE_OBJECT) + +static void +firebase_auth_firebase_auth_host_api_confirm_password_reset_response_dispose( + GObject* object) { + FirebaseAuthFirebaseAuthHostApiConfirmPasswordResetResponse* self = + FIREBASE_AUTH_FIREBASE_AUTH_HOST_API_CONFIRM_PASSWORD_RESET_RESPONSE( + object); + g_clear_pointer(&self->value, fl_value_unref); + G_OBJECT_CLASS( + firebase_auth_firebase_auth_host_api_confirm_password_reset_response_parent_class) + ->dispose(object); +} + +static void +firebase_auth_firebase_auth_host_api_confirm_password_reset_response_init( + FirebaseAuthFirebaseAuthHostApiConfirmPasswordResetResponse* self) {} + +static void +firebase_auth_firebase_auth_host_api_confirm_password_reset_response_class_init( + FirebaseAuthFirebaseAuthHostApiConfirmPasswordResetResponseClass* klass) { + G_OBJECT_CLASS(klass)->dispose = + firebase_auth_firebase_auth_host_api_confirm_password_reset_response_dispose; +} + +static FirebaseAuthFirebaseAuthHostApiConfirmPasswordResetResponse* +firebase_auth_firebase_auth_host_api_confirm_password_reset_response_new() { + FirebaseAuthFirebaseAuthHostApiConfirmPasswordResetResponse* self = + FIREBASE_AUTH_FIREBASE_AUTH_HOST_API_CONFIRM_PASSWORD_RESET_RESPONSE(g_object_new( + firebase_auth_firebase_auth_host_api_confirm_password_reset_response_get_type(), + nullptr)); + self->value = fl_value_new_list(); + fl_value_append_take(self->value, fl_value_new_null()); + return self; +} + +static FirebaseAuthFirebaseAuthHostApiConfirmPasswordResetResponse* +firebase_auth_firebase_auth_host_api_confirm_password_reset_response_new_error( + const gchar* code, const gchar* message, FlValue* details) { + FirebaseAuthFirebaseAuthHostApiConfirmPasswordResetResponse* self = + FIREBASE_AUTH_FIREBASE_AUTH_HOST_API_CONFIRM_PASSWORD_RESET_RESPONSE(g_object_new( + firebase_auth_firebase_auth_host_api_confirm_password_reset_response_get_type(), + nullptr)); + self->value = fl_value_new_list(); + fl_value_append_take(self->value, fl_value_new_string(code)); + fl_value_append_take(self->value, + fl_value_new_string(message != nullptr ? message : "")); + fl_value_append_take(self->value, details != nullptr ? fl_value_ref(details) + : fl_value_new_null()); + return self; +} + +G_DECLARE_FINAL_TYPE( + FirebaseAuthFirebaseAuthHostApiCreateUserWithEmailAndPasswordResponse, + firebase_auth_firebase_auth_host_api_create_user_with_email_and_password_response, + FIREBASE_AUTH, + FIREBASE_AUTH_HOST_API_CREATE_USER_WITH_EMAIL_AND_PASSWORD_RESPONSE, + GObject) + +struct _FirebaseAuthFirebaseAuthHostApiCreateUserWithEmailAndPasswordResponse { + GObject parent_instance; + + FlValue* value; +}; + +G_DEFINE_TYPE( + FirebaseAuthFirebaseAuthHostApiCreateUserWithEmailAndPasswordResponse, + firebase_auth_firebase_auth_host_api_create_user_with_email_and_password_response, + G_TYPE_OBJECT) + +static void +firebase_auth_firebase_auth_host_api_create_user_with_email_and_password_response_dispose( + GObject* object) { + FirebaseAuthFirebaseAuthHostApiCreateUserWithEmailAndPasswordResponse* self = + FIREBASE_AUTH_FIREBASE_AUTH_HOST_API_CREATE_USER_WITH_EMAIL_AND_PASSWORD_RESPONSE( + object); + g_clear_pointer(&self->value, fl_value_unref); + G_OBJECT_CLASS( + firebase_auth_firebase_auth_host_api_create_user_with_email_and_password_response_parent_class) + ->dispose(object); +} + +static void +firebase_auth_firebase_auth_host_api_create_user_with_email_and_password_response_init( + FirebaseAuthFirebaseAuthHostApiCreateUserWithEmailAndPasswordResponse* + self) {} + +static void +firebase_auth_firebase_auth_host_api_create_user_with_email_and_password_response_class_init( + FirebaseAuthFirebaseAuthHostApiCreateUserWithEmailAndPasswordResponseClass* + klass) { + G_OBJECT_CLASS(klass)->dispose = + firebase_auth_firebase_auth_host_api_create_user_with_email_and_password_response_dispose; +} + +static FirebaseAuthFirebaseAuthHostApiCreateUserWithEmailAndPasswordResponse* +firebase_auth_firebase_auth_host_api_create_user_with_email_and_password_response_new( + FirebaseAuthInternalUserCredential* return_value) { + FirebaseAuthFirebaseAuthHostApiCreateUserWithEmailAndPasswordResponse* self = + FIREBASE_AUTH_FIREBASE_AUTH_HOST_API_CREATE_USER_WITH_EMAIL_AND_PASSWORD_RESPONSE( + g_object_new( + firebase_auth_firebase_auth_host_api_create_user_with_email_and_password_response_get_type(), + nullptr)); + self->value = fl_value_new_list(); + fl_value_append_take( + self->value, + fl_value_new_custom_object(firebase_auth_internal_user_credential_type_id, + G_OBJECT(return_value))); + return self; +} + +static FirebaseAuthFirebaseAuthHostApiCreateUserWithEmailAndPasswordResponse* +firebase_auth_firebase_auth_host_api_create_user_with_email_and_password_response_new_error( + const gchar* code, const gchar* message, FlValue* details) { + FirebaseAuthFirebaseAuthHostApiCreateUserWithEmailAndPasswordResponse* self = + FIREBASE_AUTH_FIREBASE_AUTH_HOST_API_CREATE_USER_WITH_EMAIL_AND_PASSWORD_RESPONSE( + g_object_new( + firebase_auth_firebase_auth_host_api_create_user_with_email_and_password_response_get_type(), + nullptr)); + self->value = fl_value_new_list(); + fl_value_append_take(self->value, fl_value_new_string(code)); + fl_value_append_take(self->value, + fl_value_new_string(message != nullptr ? message : "")); + fl_value_append_take(self->value, details != nullptr ? fl_value_ref(details) + : fl_value_new_null()); + return self; +} + +G_DECLARE_FINAL_TYPE( + FirebaseAuthFirebaseAuthHostApiSignInAnonymouslyResponse, + firebase_auth_firebase_auth_host_api_sign_in_anonymously_response, + FIREBASE_AUTH, FIREBASE_AUTH_HOST_API_SIGN_IN_ANONYMOUSLY_RESPONSE, GObject) + +struct _FirebaseAuthFirebaseAuthHostApiSignInAnonymouslyResponse { + GObject parent_instance; + + FlValue* value; +}; + +G_DEFINE_TYPE(FirebaseAuthFirebaseAuthHostApiSignInAnonymouslyResponse, + firebase_auth_firebase_auth_host_api_sign_in_anonymously_response, + G_TYPE_OBJECT) + +static void +firebase_auth_firebase_auth_host_api_sign_in_anonymously_response_dispose( + GObject* object) { + FirebaseAuthFirebaseAuthHostApiSignInAnonymouslyResponse* self = + FIREBASE_AUTH_FIREBASE_AUTH_HOST_API_SIGN_IN_ANONYMOUSLY_RESPONSE(object); + g_clear_pointer(&self->value, fl_value_unref); + G_OBJECT_CLASS( + firebase_auth_firebase_auth_host_api_sign_in_anonymously_response_parent_class) + ->dispose(object); +} + +static void +firebase_auth_firebase_auth_host_api_sign_in_anonymously_response_init( + FirebaseAuthFirebaseAuthHostApiSignInAnonymouslyResponse* self) {} + +static void +firebase_auth_firebase_auth_host_api_sign_in_anonymously_response_class_init( + FirebaseAuthFirebaseAuthHostApiSignInAnonymouslyResponseClass* klass) { + G_OBJECT_CLASS(klass)->dispose = + firebase_auth_firebase_auth_host_api_sign_in_anonymously_response_dispose; +} + +static FirebaseAuthFirebaseAuthHostApiSignInAnonymouslyResponse* +firebase_auth_firebase_auth_host_api_sign_in_anonymously_response_new( + FirebaseAuthInternalUserCredential* return_value) { + FirebaseAuthFirebaseAuthHostApiSignInAnonymouslyResponse* self = + FIREBASE_AUTH_FIREBASE_AUTH_HOST_API_SIGN_IN_ANONYMOUSLY_RESPONSE(g_object_new( + firebase_auth_firebase_auth_host_api_sign_in_anonymously_response_get_type(), + nullptr)); + self->value = fl_value_new_list(); + fl_value_append_take( + self->value, + fl_value_new_custom_object(firebase_auth_internal_user_credential_type_id, + G_OBJECT(return_value))); + return self; +} + +static FirebaseAuthFirebaseAuthHostApiSignInAnonymouslyResponse* +firebase_auth_firebase_auth_host_api_sign_in_anonymously_response_new_error( + const gchar* code, const gchar* message, FlValue* details) { + FirebaseAuthFirebaseAuthHostApiSignInAnonymouslyResponse* self = + FIREBASE_AUTH_FIREBASE_AUTH_HOST_API_SIGN_IN_ANONYMOUSLY_RESPONSE(g_object_new( + firebase_auth_firebase_auth_host_api_sign_in_anonymously_response_get_type(), + nullptr)); + self->value = fl_value_new_list(); + fl_value_append_take(self->value, fl_value_new_string(code)); + fl_value_append_take(self->value, + fl_value_new_string(message != nullptr ? message : "")); + fl_value_append_take(self->value, details != nullptr ? fl_value_ref(details) + : fl_value_new_null()); + return self; +} + +G_DECLARE_FINAL_TYPE( + FirebaseAuthFirebaseAuthHostApiSignInWithCredentialResponse, + firebase_auth_firebase_auth_host_api_sign_in_with_credential_response, + FIREBASE_AUTH, FIREBASE_AUTH_HOST_API_SIGN_IN_WITH_CREDENTIAL_RESPONSE, + GObject) + +struct _FirebaseAuthFirebaseAuthHostApiSignInWithCredentialResponse { + GObject parent_instance; + + FlValue* value; +}; + +G_DEFINE_TYPE( + FirebaseAuthFirebaseAuthHostApiSignInWithCredentialResponse, + firebase_auth_firebase_auth_host_api_sign_in_with_credential_response, + G_TYPE_OBJECT) + +static void +firebase_auth_firebase_auth_host_api_sign_in_with_credential_response_dispose( + GObject* object) { + FirebaseAuthFirebaseAuthHostApiSignInWithCredentialResponse* self = + FIREBASE_AUTH_FIREBASE_AUTH_HOST_API_SIGN_IN_WITH_CREDENTIAL_RESPONSE( + object); + g_clear_pointer(&self->value, fl_value_unref); + G_OBJECT_CLASS( + firebase_auth_firebase_auth_host_api_sign_in_with_credential_response_parent_class) + ->dispose(object); +} + +static void +firebase_auth_firebase_auth_host_api_sign_in_with_credential_response_init( + FirebaseAuthFirebaseAuthHostApiSignInWithCredentialResponse* self) {} + +static void +firebase_auth_firebase_auth_host_api_sign_in_with_credential_response_class_init( + FirebaseAuthFirebaseAuthHostApiSignInWithCredentialResponseClass* klass) { + G_OBJECT_CLASS(klass)->dispose = + firebase_auth_firebase_auth_host_api_sign_in_with_credential_response_dispose; +} + +static FirebaseAuthFirebaseAuthHostApiSignInWithCredentialResponse* +firebase_auth_firebase_auth_host_api_sign_in_with_credential_response_new( + FirebaseAuthInternalUserCredential* return_value) { + FirebaseAuthFirebaseAuthHostApiSignInWithCredentialResponse* self = + FIREBASE_AUTH_FIREBASE_AUTH_HOST_API_SIGN_IN_WITH_CREDENTIAL_RESPONSE( + g_object_new( + firebase_auth_firebase_auth_host_api_sign_in_with_credential_response_get_type(), + nullptr)); + self->value = fl_value_new_list(); + fl_value_append_take( + self->value, + fl_value_new_custom_object(firebase_auth_internal_user_credential_type_id, + G_OBJECT(return_value))); + return self; +} + +static FirebaseAuthFirebaseAuthHostApiSignInWithCredentialResponse* +firebase_auth_firebase_auth_host_api_sign_in_with_credential_response_new_error( + const gchar* code, const gchar* message, FlValue* details) { + FirebaseAuthFirebaseAuthHostApiSignInWithCredentialResponse* self = + FIREBASE_AUTH_FIREBASE_AUTH_HOST_API_SIGN_IN_WITH_CREDENTIAL_RESPONSE( + g_object_new( + firebase_auth_firebase_auth_host_api_sign_in_with_credential_response_get_type(), + nullptr)); + self->value = fl_value_new_list(); + fl_value_append_take(self->value, fl_value_new_string(code)); + fl_value_append_take(self->value, + fl_value_new_string(message != nullptr ? message : "")); + fl_value_append_take(self->value, details != nullptr ? fl_value_ref(details) + : fl_value_new_null()); + return self; +} + +G_DECLARE_FINAL_TYPE( + FirebaseAuthFirebaseAuthHostApiSignInWithCustomTokenResponse, + firebase_auth_firebase_auth_host_api_sign_in_with_custom_token_response, + FIREBASE_AUTH, FIREBASE_AUTH_HOST_API_SIGN_IN_WITH_CUSTOM_TOKEN_RESPONSE, + GObject) + +struct _FirebaseAuthFirebaseAuthHostApiSignInWithCustomTokenResponse { + GObject parent_instance; + + FlValue* value; +}; + +G_DEFINE_TYPE( + FirebaseAuthFirebaseAuthHostApiSignInWithCustomTokenResponse, + firebase_auth_firebase_auth_host_api_sign_in_with_custom_token_response, + G_TYPE_OBJECT) + +static void +firebase_auth_firebase_auth_host_api_sign_in_with_custom_token_response_dispose( + GObject* object) { + FirebaseAuthFirebaseAuthHostApiSignInWithCustomTokenResponse* self = + FIREBASE_AUTH_FIREBASE_AUTH_HOST_API_SIGN_IN_WITH_CUSTOM_TOKEN_RESPONSE( + object); + g_clear_pointer(&self->value, fl_value_unref); + G_OBJECT_CLASS( + firebase_auth_firebase_auth_host_api_sign_in_with_custom_token_response_parent_class) + ->dispose(object); +} + +static void +firebase_auth_firebase_auth_host_api_sign_in_with_custom_token_response_init( + FirebaseAuthFirebaseAuthHostApiSignInWithCustomTokenResponse* self) {} + +static void +firebase_auth_firebase_auth_host_api_sign_in_with_custom_token_response_class_init( + FirebaseAuthFirebaseAuthHostApiSignInWithCustomTokenResponseClass* klass) { + G_OBJECT_CLASS(klass)->dispose = + firebase_auth_firebase_auth_host_api_sign_in_with_custom_token_response_dispose; +} + +static FirebaseAuthFirebaseAuthHostApiSignInWithCustomTokenResponse* +firebase_auth_firebase_auth_host_api_sign_in_with_custom_token_response_new( + FirebaseAuthInternalUserCredential* return_value) { + FirebaseAuthFirebaseAuthHostApiSignInWithCustomTokenResponse* self = + FIREBASE_AUTH_FIREBASE_AUTH_HOST_API_SIGN_IN_WITH_CUSTOM_TOKEN_RESPONSE( + g_object_new( + firebase_auth_firebase_auth_host_api_sign_in_with_custom_token_response_get_type(), + nullptr)); + self->value = fl_value_new_list(); + fl_value_append_take( + self->value, + fl_value_new_custom_object(firebase_auth_internal_user_credential_type_id, + G_OBJECT(return_value))); + return self; +} + +static FirebaseAuthFirebaseAuthHostApiSignInWithCustomTokenResponse* +firebase_auth_firebase_auth_host_api_sign_in_with_custom_token_response_new_error( + const gchar* code, const gchar* message, FlValue* details) { + FirebaseAuthFirebaseAuthHostApiSignInWithCustomTokenResponse* self = + FIREBASE_AUTH_FIREBASE_AUTH_HOST_API_SIGN_IN_WITH_CUSTOM_TOKEN_RESPONSE( + g_object_new( + firebase_auth_firebase_auth_host_api_sign_in_with_custom_token_response_get_type(), + nullptr)); + self->value = fl_value_new_list(); + fl_value_append_take(self->value, fl_value_new_string(code)); + fl_value_append_take(self->value, + fl_value_new_string(message != nullptr ? message : "")); + fl_value_append_take(self->value, details != nullptr ? fl_value_ref(details) + : fl_value_new_null()); + return self; +} + +G_DECLARE_FINAL_TYPE( + FirebaseAuthFirebaseAuthHostApiSignInWithEmailAndPasswordResponse, + firebase_auth_firebase_auth_host_api_sign_in_with_email_and_password_response, + FIREBASE_AUTH, + FIREBASE_AUTH_HOST_API_SIGN_IN_WITH_EMAIL_AND_PASSWORD_RESPONSE, GObject) + +struct _FirebaseAuthFirebaseAuthHostApiSignInWithEmailAndPasswordResponse { + GObject parent_instance; + + FlValue* value; +}; + +G_DEFINE_TYPE( + FirebaseAuthFirebaseAuthHostApiSignInWithEmailAndPasswordResponse, + firebase_auth_firebase_auth_host_api_sign_in_with_email_and_password_response, + G_TYPE_OBJECT) + +static void +firebase_auth_firebase_auth_host_api_sign_in_with_email_and_password_response_dispose( + GObject* object) { + FirebaseAuthFirebaseAuthHostApiSignInWithEmailAndPasswordResponse* self = + FIREBASE_AUTH_FIREBASE_AUTH_HOST_API_SIGN_IN_WITH_EMAIL_AND_PASSWORD_RESPONSE( + object); + g_clear_pointer(&self->value, fl_value_unref); + G_OBJECT_CLASS( + firebase_auth_firebase_auth_host_api_sign_in_with_email_and_password_response_parent_class) + ->dispose(object); +} + +static void +firebase_auth_firebase_auth_host_api_sign_in_with_email_and_password_response_init( + FirebaseAuthFirebaseAuthHostApiSignInWithEmailAndPasswordResponse* self) {} + +static void +firebase_auth_firebase_auth_host_api_sign_in_with_email_and_password_response_class_init( + FirebaseAuthFirebaseAuthHostApiSignInWithEmailAndPasswordResponseClass* + klass) { + G_OBJECT_CLASS(klass)->dispose = + firebase_auth_firebase_auth_host_api_sign_in_with_email_and_password_response_dispose; +} + +static FirebaseAuthFirebaseAuthHostApiSignInWithEmailAndPasswordResponse* +firebase_auth_firebase_auth_host_api_sign_in_with_email_and_password_response_new( + FirebaseAuthInternalUserCredential* return_value) { + FirebaseAuthFirebaseAuthHostApiSignInWithEmailAndPasswordResponse* self = + FIREBASE_AUTH_FIREBASE_AUTH_HOST_API_SIGN_IN_WITH_EMAIL_AND_PASSWORD_RESPONSE( + g_object_new( + firebase_auth_firebase_auth_host_api_sign_in_with_email_and_password_response_get_type(), + nullptr)); + self->value = fl_value_new_list(); + fl_value_append_take( + self->value, + fl_value_new_custom_object(firebase_auth_internal_user_credential_type_id, + G_OBJECT(return_value))); + return self; +} + +static FirebaseAuthFirebaseAuthHostApiSignInWithEmailAndPasswordResponse* +firebase_auth_firebase_auth_host_api_sign_in_with_email_and_password_response_new_error( + const gchar* code, const gchar* message, FlValue* details) { + FirebaseAuthFirebaseAuthHostApiSignInWithEmailAndPasswordResponse* self = + FIREBASE_AUTH_FIREBASE_AUTH_HOST_API_SIGN_IN_WITH_EMAIL_AND_PASSWORD_RESPONSE( + g_object_new( + firebase_auth_firebase_auth_host_api_sign_in_with_email_and_password_response_get_type(), + nullptr)); + self->value = fl_value_new_list(); + fl_value_append_take(self->value, fl_value_new_string(code)); + fl_value_append_take(self->value, + fl_value_new_string(message != nullptr ? message : "")); + fl_value_append_take(self->value, details != nullptr ? fl_value_ref(details) + : fl_value_new_null()); + return self; +} + +G_DECLARE_FINAL_TYPE( + FirebaseAuthFirebaseAuthHostApiSignInWithEmailLinkResponse, + firebase_auth_firebase_auth_host_api_sign_in_with_email_link_response, + FIREBASE_AUTH, FIREBASE_AUTH_HOST_API_SIGN_IN_WITH_EMAIL_LINK_RESPONSE, + GObject) + +struct _FirebaseAuthFirebaseAuthHostApiSignInWithEmailLinkResponse { + GObject parent_instance; + + FlValue* value; +}; + +G_DEFINE_TYPE( + FirebaseAuthFirebaseAuthHostApiSignInWithEmailLinkResponse, + firebase_auth_firebase_auth_host_api_sign_in_with_email_link_response, + G_TYPE_OBJECT) + +static void +firebase_auth_firebase_auth_host_api_sign_in_with_email_link_response_dispose( + GObject* object) { + FirebaseAuthFirebaseAuthHostApiSignInWithEmailLinkResponse* self = + FIREBASE_AUTH_FIREBASE_AUTH_HOST_API_SIGN_IN_WITH_EMAIL_LINK_RESPONSE( + object); + g_clear_pointer(&self->value, fl_value_unref); + G_OBJECT_CLASS( + firebase_auth_firebase_auth_host_api_sign_in_with_email_link_response_parent_class) + ->dispose(object); +} + +static void +firebase_auth_firebase_auth_host_api_sign_in_with_email_link_response_init( + FirebaseAuthFirebaseAuthHostApiSignInWithEmailLinkResponse* self) {} + +static void +firebase_auth_firebase_auth_host_api_sign_in_with_email_link_response_class_init( + FirebaseAuthFirebaseAuthHostApiSignInWithEmailLinkResponseClass* klass) { + G_OBJECT_CLASS(klass)->dispose = + firebase_auth_firebase_auth_host_api_sign_in_with_email_link_response_dispose; +} + +static FirebaseAuthFirebaseAuthHostApiSignInWithEmailLinkResponse* +firebase_auth_firebase_auth_host_api_sign_in_with_email_link_response_new( + FirebaseAuthInternalUserCredential* return_value) { + FirebaseAuthFirebaseAuthHostApiSignInWithEmailLinkResponse* self = + FIREBASE_AUTH_FIREBASE_AUTH_HOST_API_SIGN_IN_WITH_EMAIL_LINK_RESPONSE( + g_object_new( + firebase_auth_firebase_auth_host_api_sign_in_with_email_link_response_get_type(), + nullptr)); + self->value = fl_value_new_list(); + fl_value_append_take( + self->value, + fl_value_new_custom_object(firebase_auth_internal_user_credential_type_id, + G_OBJECT(return_value))); + return self; +} + +static FirebaseAuthFirebaseAuthHostApiSignInWithEmailLinkResponse* +firebase_auth_firebase_auth_host_api_sign_in_with_email_link_response_new_error( + const gchar* code, const gchar* message, FlValue* details) { + FirebaseAuthFirebaseAuthHostApiSignInWithEmailLinkResponse* self = + FIREBASE_AUTH_FIREBASE_AUTH_HOST_API_SIGN_IN_WITH_EMAIL_LINK_RESPONSE( + g_object_new( + firebase_auth_firebase_auth_host_api_sign_in_with_email_link_response_get_type(), + nullptr)); + self->value = fl_value_new_list(); + fl_value_append_take(self->value, fl_value_new_string(code)); + fl_value_append_take(self->value, + fl_value_new_string(message != nullptr ? message : "")); + fl_value_append_take(self->value, details != nullptr ? fl_value_ref(details) + : fl_value_new_null()); + return self; +} + +G_DECLARE_FINAL_TYPE( + FirebaseAuthFirebaseAuthHostApiSignInWithProviderResponse, + firebase_auth_firebase_auth_host_api_sign_in_with_provider_response, + FIREBASE_AUTH, FIREBASE_AUTH_HOST_API_SIGN_IN_WITH_PROVIDER_RESPONSE, + GObject) + +struct _FirebaseAuthFirebaseAuthHostApiSignInWithProviderResponse { + GObject parent_instance; + + FlValue* value; +}; + +G_DEFINE_TYPE( + FirebaseAuthFirebaseAuthHostApiSignInWithProviderResponse, + firebase_auth_firebase_auth_host_api_sign_in_with_provider_response, + G_TYPE_OBJECT) + +static void +firebase_auth_firebase_auth_host_api_sign_in_with_provider_response_dispose( + GObject* object) { + FirebaseAuthFirebaseAuthHostApiSignInWithProviderResponse* self = + FIREBASE_AUTH_FIREBASE_AUTH_HOST_API_SIGN_IN_WITH_PROVIDER_RESPONSE( + object); + g_clear_pointer(&self->value, fl_value_unref); + G_OBJECT_CLASS( + firebase_auth_firebase_auth_host_api_sign_in_with_provider_response_parent_class) + ->dispose(object); +} + +static void +firebase_auth_firebase_auth_host_api_sign_in_with_provider_response_init( + FirebaseAuthFirebaseAuthHostApiSignInWithProviderResponse* self) {} + +static void +firebase_auth_firebase_auth_host_api_sign_in_with_provider_response_class_init( + FirebaseAuthFirebaseAuthHostApiSignInWithProviderResponseClass* klass) { + G_OBJECT_CLASS(klass)->dispose = + firebase_auth_firebase_auth_host_api_sign_in_with_provider_response_dispose; +} + +static FirebaseAuthFirebaseAuthHostApiSignInWithProviderResponse* +firebase_auth_firebase_auth_host_api_sign_in_with_provider_response_new( + FirebaseAuthInternalUserCredential* return_value) { + FirebaseAuthFirebaseAuthHostApiSignInWithProviderResponse* self = + FIREBASE_AUTH_FIREBASE_AUTH_HOST_API_SIGN_IN_WITH_PROVIDER_RESPONSE(g_object_new( + firebase_auth_firebase_auth_host_api_sign_in_with_provider_response_get_type(), + nullptr)); + self->value = fl_value_new_list(); + fl_value_append_take( + self->value, + fl_value_new_custom_object(firebase_auth_internal_user_credential_type_id, + G_OBJECT(return_value))); + return self; +} + +static FirebaseAuthFirebaseAuthHostApiSignInWithProviderResponse* +firebase_auth_firebase_auth_host_api_sign_in_with_provider_response_new_error( + const gchar* code, const gchar* message, FlValue* details) { + FirebaseAuthFirebaseAuthHostApiSignInWithProviderResponse* self = + FIREBASE_AUTH_FIREBASE_AUTH_HOST_API_SIGN_IN_WITH_PROVIDER_RESPONSE(g_object_new( + firebase_auth_firebase_auth_host_api_sign_in_with_provider_response_get_type(), + nullptr)); + self->value = fl_value_new_list(); + fl_value_append_take(self->value, fl_value_new_string(code)); + fl_value_append_take(self->value, + fl_value_new_string(message != nullptr ? message : "")); + fl_value_append_take(self->value, details != nullptr ? fl_value_ref(details) + : fl_value_new_null()); + return self; +} + +G_DECLARE_FINAL_TYPE(FirebaseAuthFirebaseAuthHostApiSignOutResponse, + firebase_auth_firebase_auth_host_api_sign_out_response, + FIREBASE_AUTH, FIREBASE_AUTH_HOST_API_SIGN_OUT_RESPONSE, + GObject) + +struct _FirebaseAuthFirebaseAuthHostApiSignOutResponse { + GObject parent_instance; + + FlValue* value; +}; + +G_DEFINE_TYPE(FirebaseAuthFirebaseAuthHostApiSignOutResponse, + firebase_auth_firebase_auth_host_api_sign_out_response, + G_TYPE_OBJECT) + +static void firebase_auth_firebase_auth_host_api_sign_out_response_dispose( + GObject* object) { + FirebaseAuthFirebaseAuthHostApiSignOutResponse* self = + FIREBASE_AUTH_FIREBASE_AUTH_HOST_API_SIGN_OUT_RESPONSE(object); + g_clear_pointer(&self->value, fl_value_unref); + G_OBJECT_CLASS( + firebase_auth_firebase_auth_host_api_sign_out_response_parent_class) + ->dispose(object); +} + +static void firebase_auth_firebase_auth_host_api_sign_out_response_init( + FirebaseAuthFirebaseAuthHostApiSignOutResponse* self) {} + +static void firebase_auth_firebase_auth_host_api_sign_out_response_class_init( + FirebaseAuthFirebaseAuthHostApiSignOutResponseClass* klass) { + G_OBJECT_CLASS(klass)->dispose = + firebase_auth_firebase_auth_host_api_sign_out_response_dispose; +} + +static FirebaseAuthFirebaseAuthHostApiSignOutResponse* +firebase_auth_firebase_auth_host_api_sign_out_response_new() { + FirebaseAuthFirebaseAuthHostApiSignOutResponse* self = + FIREBASE_AUTH_FIREBASE_AUTH_HOST_API_SIGN_OUT_RESPONSE(g_object_new( + firebase_auth_firebase_auth_host_api_sign_out_response_get_type(), + nullptr)); + self->value = fl_value_new_list(); + fl_value_append_take(self->value, fl_value_new_null()); + return self; +} + +static FirebaseAuthFirebaseAuthHostApiSignOutResponse* +firebase_auth_firebase_auth_host_api_sign_out_response_new_error( + const gchar* code, const gchar* message, FlValue* details) { + FirebaseAuthFirebaseAuthHostApiSignOutResponse* self = + FIREBASE_AUTH_FIREBASE_AUTH_HOST_API_SIGN_OUT_RESPONSE(g_object_new( + firebase_auth_firebase_auth_host_api_sign_out_response_get_type(), + nullptr)); + self->value = fl_value_new_list(); + fl_value_append_take(self->value, fl_value_new_string(code)); + fl_value_append_take(self->value, + fl_value_new_string(message != nullptr ? message : "")); + fl_value_append_take(self->value, details != nullptr ? fl_value_ref(details) + : fl_value_new_null()); + return self; +} + +G_DECLARE_FINAL_TYPE( + FirebaseAuthFirebaseAuthHostApiFetchSignInMethodsForEmailResponse, + firebase_auth_firebase_auth_host_api_fetch_sign_in_methods_for_email_response, + FIREBASE_AUTH, + FIREBASE_AUTH_HOST_API_FETCH_SIGN_IN_METHODS_FOR_EMAIL_RESPONSE, GObject) + +struct _FirebaseAuthFirebaseAuthHostApiFetchSignInMethodsForEmailResponse { + GObject parent_instance; + + FlValue* value; +}; + +G_DEFINE_TYPE( + FirebaseAuthFirebaseAuthHostApiFetchSignInMethodsForEmailResponse, + firebase_auth_firebase_auth_host_api_fetch_sign_in_methods_for_email_response, + G_TYPE_OBJECT) + +static void +firebase_auth_firebase_auth_host_api_fetch_sign_in_methods_for_email_response_dispose( + GObject* object) { + FirebaseAuthFirebaseAuthHostApiFetchSignInMethodsForEmailResponse* self = + FIREBASE_AUTH_FIREBASE_AUTH_HOST_API_FETCH_SIGN_IN_METHODS_FOR_EMAIL_RESPONSE( + object); + g_clear_pointer(&self->value, fl_value_unref); + G_OBJECT_CLASS( + firebase_auth_firebase_auth_host_api_fetch_sign_in_methods_for_email_response_parent_class) + ->dispose(object); +} + +static void +firebase_auth_firebase_auth_host_api_fetch_sign_in_methods_for_email_response_init( + FirebaseAuthFirebaseAuthHostApiFetchSignInMethodsForEmailResponse* self) {} + +static void +firebase_auth_firebase_auth_host_api_fetch_sign_in_methods_for_email_response_class_init( + FirebaseAuthFirebaseAuthHostApiFetchSignInMethodsForEmailResponseClass* + klass) { + G_OBJECT_CLASS(klass)->dispose = + firebase_auth_firebase_auth_host_api_fetch_sign_in_methods_for_email_response_dispose; +} + +static FirebaseAuthFirebaseAuthHostApiFetchSignInMethodsForEmailResponse* +firebase_auth_firebase_auth_host_api_fetch_sign_in_methods_for_email_response_new( + FlValue* return_value) { + FirebaseAuthFirebaseAuthHostApiFetchSignInMethodsForEmailResponse* self = + FIREBASE_AUTH_FIREBASE_AUTH_HOST_API_FETCH_SIGN_IN_METHODS_FOR_EMAIL_RESPONSE( + g_object_new( + firebase_auth_firebase_auth_host_api_fetch_sign_in_methods_for_email_response_get_type(), + nullptr)); + self->value = fl_value_new_list(); + fl_value_append_take(self->value, fl_value_ref(return_value)); + return self; +} + +static FirebaseAuthFirebaseAuthHostApiFetchSignInMethodsForEmailResponse* +firebase_auth_firebase_auth_host_api_fetch_sign_in_methods_for_email_response_new_error( + const gchar* code, const gchar* message, FlValue* details) { + FirebaseAuthFirebaseAuthHostApiFetchSignInMethodsForEmailResponse* self = + FIREBASE_AUTH_FIREBASE_AUTH_HOST_API_FETCH_SIGN_IN_METHODS_FOR_EMAIL_RESPONSE( + g_object_new( + firebase_auth_firebase_auth_host_api_fetch_sign_in_methods_for_email_response_get_type(), + nullptr)); + self->value = fl_value_new_list(); + fl_value_append_take(self->value, fl_value_new_string(code)); + fl_value_append_take(self->value, + fl_value_new_string(message != nullptr ? message : "")); + fl_value_append_take(self->value, details != nullptr ? fl_value_ref(details) + : fl_value_new_null()); + return self; +} + +G_DECLARE_FINAL_TYPE( + FirebaseAuthFirebaseAuthHostApiSendPasswordResetEmailResponse, + firebase_auth_firebase_auth_host_api_send_password_reset_email_response, + FIREBASE_AUTH, FIREBASE_AUTH_HOST_API_SEND_PASSWORD_RESET_EMAIL_RESPONSE, + GObject) + +struct _FirebaseAuthFirebaseAuthHostApiSendPasswordResetEmailResponse { + GObject parent_instance; + + FlValue* value; +}; + +G_DEFINE_TYPE( + FirebaseAuthFirebaseAuthHostApiSendPasswordResetEmailResponse, + firebase_auth_firebase_auth_host_api_send_password_reset_email_response, + G_TYPE_OBJECT) + +static void +firebase_auth_firebase_auth_host_api_send_password_reset_email_response_dispose( + GObject* object) { + FirebaseAuthFirebaseAuthHostApiSendPasswordResetEmailResponse* self = + FIREBASE_AUTH_FIREBASE_AUTH_HOST_API_SEND_PASSWORD_RESET_EMAIL_RESPONSE( + object); + g_clear_pointer(&self->value, fl_value_unref); + G_OBJECT_CLASS( + firebase_auth_firebase_auth_host_api_send_password_reset_email_response_parent_class) + ->dispose(object); +} + +static void +firebase_auth_firebase_auth_host_api_send_password_reset_email_response_init( + FirebaseAuthFirebaseAuthHostApiSendPasswordResetEmailResponse* self) {} + +static void +firebase_auth_firebase_auth_host_api_send_password_reset_email_response_class_init( + FirebaseAuthFirebaseAuthHostApiSendPasswordResetEmailResponseClass* klass) { + G_OBJECT_CLASS(klass)->dispose = + firebase_auth_firebase_auth_host_api_send_password_reset_email_response_dispose; +} + +static FirebaseAuthFirebaseAuthHostApiSendPasswordResetEmailResponse* +firebase_auth_firebase_auth_host_api_send_password_reset_email_response_new() { + FirebaseAuthFirebaseAuthHostApiSendPasswordResetEmailResponse* self = + FIREBASE_AUTH_FIREBASE_AUTH_HOST_API_SEND_PASSWORD_RESET_EMAIL_RESPONSE( + g_object_new( + firebase_auth_firebase_auth_host_api_send_password_reset_email_response_get_type(), + nullptr)); + self->value = fl_value_new_list(); + fl_value_append_take(self->value, fl_value_new_null()); + return self; +} + +static FirebaseAuthFirebaseAuthHostApiSendPasswordResetEmailResponse* +firebase_auth_firebase_auth_host_api_send_password_reset_email_response_new_error( + const gchar* code, const gchar* message, FlValue* details) { + FirebaseAuthFirebaseAuthHostApiSendPasswordResetEmailResponse* self = + FIREBASE_AUTH_FIREBASE_AUTH_HOST_API_SEND_PASSWORD_RESET_EMAIL_RESPONSE( + g_object_new( + firebase_auth_firebase_auth_host_api_send_password_reset_email_response_get_type(), + nullptr)); + self->value = fl_value_new_list(); + fl_value_append_take(self->value, fl_value_new_string(code)); + fl_value_append_take(self->value, + fl_value_new_string(message != nullptr ? message : "")); + fl_value_append_take(self->value, details != nullptr ? fl_value_ref(details) + : fl_value_new_null()); + return self; +} + +G_DECLARE_FINAL_TYPE( + FirebaseAuthFirebaseAuthHostApiSendSignInLinkToEmailResponse, + firebase_auth_firebase_auth_host_api_send_sign_in_link_to_email_response, + FIREBASE_AUTH, FIREBASE_AUTH_HOST_API_SEND_SIGN_IN_LINK_TO_EMAIL_RESPONSE, + GObject) + +struct _FirebaseAuthFirebaseAuthHostApiSendSignInLinkToEmailResponse { + GObject parent_instance; + + FlValue* value; +}; + +G_DEFINE_TYPE( + FirebaseAuthFirebaseAuthHostApiSendSignInLinkToEmailResponse, + firebase_auth_firebase_auth_host_api_send_sign_in_link_to_email_response, + G_TYPE_OBJECT) + +static void +firebase_auth_firebase_auth_host_api_send_sign_in_link_to_email_response_dispose( + GObject* object) { + FirebaseAuthFirebaseAuthHostApiSendSignInLinkToEmailResponse* self = + FIREBASE_AUTH_FIREBASE_AUTH_HOST_API_SEND_SIGN_IN_LINK_TO_EMAIL_RESPONSE( + object); + g_clear_pointer(&self->value, fl_value_unref); + G_OBJECT_CLASS( + firebase_auth_firebase_auth_host_api_send_sign_in_link_to_email_response_parent_class) + ->dispose(object); +} + +static void +firebase_auth_firebase_auth_host_api_send_sign_in_link_to_email_response_init( + FirebaseAuthFirebaseAuthHostApiSendSignInLinkToEmailResponse* self) {} + +static void +firebase_auth_firebase_auth_host_api_send_sign_in_link_to_email_response_class_init( + FirebaseAuthFirebaseAuthHostApiSendSignInLinkToEmailResponseClass* klass) { + G_OBJECT_CLASS(klass)->dispose = + firebase_auth_firebase_auth_host_api_send_sign_in_link_to_email_response_dispose; +} + +static FirebaseAuthFirebaseAuthHostApiSendSignInLinkToEmailResponse* +firebase_auth_firebase_auth_host_api_send_sign_in_link_to_email_response_new() { + FirebaseAuthFirebaseAuthHostApiSendSignInLinkToEmailResponse* self = + FIREBASE_AUTH_FIREBASE_AUTH_HOST_API_SEND_SIGN_IN_LINK_TO_EMAIL_RESPONSE( + g_object_new( + firebase_auth_firebase_auth_host_api_send_sign_in_link_to_email_response_get_type(), + nullptr)); + self->value = fl_value_new_list(); + fl_value_append_take(self->value, fl_value_new_null()); + return self; +} + +static FirebaseAuthFirebaseAuthHostApiSendSignInLinkToEmailResponse* +firebase_auth_firebase_auth_host_api_send_sign_in_link_to_email_response_new_error( + const gchar* code, const gchar* message, FlValue* details) { + FirebaseAuthFirebaseAuthHostApiSendSignInLinkToEmailResponse* self = + FIREBASE_AUTH_FIREBASE_AUTH_HOST_API_SEND_SIGN_IN_LINK_TO_EMAIL_RESPONSE( + g_object_new( + firebase_auth_firebase_auth_host_api_send_sign_in_link_to_email_response_get_type(), + nullptr)); + self->value = fl_value_new_list(); + fl_value_append_take(self->value, fl_value_new_string(code)); + fl_value_append_take(self->value, + fl_value_new_string(message != nullptr ? message : "")); + fl_value_append_take(self->value, details != nullptr ? fl_value_ref(details) + : fl_value_new_null()); + return self; +} + +G_DECLARE_FINAL_TYPE( + FirebaseAuthFirebaseAuthHostApiSetLanguageCodeResponse, + firebase_auth_firebase_auth_host_api_set_language_code_response, + FIREBASE_AUTH, FIREBASE_AUTH_HOST_API_SET_LANGUAGE_CODE_RESPONSE, GObject) + +struct _FirebaseAuthFirebaseAuthHostApiSetLanguageCodeResponse { + GObject parent_instance; + + FlValue* value; +}; + +G_DEFINE_TYPE(FirebaseAuthFirebaseAuthHostApiSetLanguageCodeResponse, + firebase_auth_firebase_auth_host_api_set_language_code_response, + G_TYPE_OBJECT) + +static void +firebase_auth_firebase_auth_host_api_set_language_code_response_dispose( + GObject* object) { + FirebaseAuthFirebaseAuthHostApiSetLanguageCodeResponse* self = + FIREBASE_AUTH_FIREBASE_AUTH_HOST_API_SET_LANGUAGE_CODE_RESPONSE(object); + g_clear_pointer(&self->value, fl_value_unref); + G_OBJECT_CLASS( + firebase_auth_firebase_auth_host_api_set_language_code_response_parent_class) + ->dispose(object); +} + +static void +firebase_auth_firebase_auth_host_api_set_language_code_response_init( + FirebaseAuthFirebaseAuthHostApiSetLanguageCodeResponse* self) {} + +static void +firebase_auth_firebase_auth_host_api_set_language_code_response_class_init( + FirebaseAuthFirebaseAuthHostApiSetLanguageCodeResponseClass* klass) { + G_OBJECT_CLASS(klass)->dispose = + firebase_auth_firebase_auth_host_api_set_language_code_response_dispose; +} + +static FirebaseAuthFirebaseAuthHostApiSetLanguageCodeResponse* +firebase_auth_firebase_auth_host_api_set_language_code_response_new( + const gchar* return_value) { + FirebaseAuthFirebaseAuthHostApiSetLanguageCodeResponse* self = + FIREBASE_AUTH_FIREBASE_AUTH_HOST_API_SET_LANGUAGE_CODE_RESPONSE(g_object_new( + firebase_auth_firebase_auth_host_api_set_language_code_response_get_type(), + nullptr)); + self->value = fl_value_new_list(); + fl_value_append_take(self->value, fl_value_new_string(return_value)); + return self; +} + +static FirebaseAuthFirebaseAuthHostApiSetLanguageCodeResponse* +firebase_auth_firebase_auth_host_api_set_language_code_response_new_error( + const gchar* code, const gchar* message, FlValue* details) { + FirebaseAuthFirebaseAuthHostApiSetLanguageCodeResponse* self = + FIREBASE_AUTH_FIREBASE_AUTH_HOST_API_SET_LANGUAGE_CODE_RESPONSE(g_object_new( + firebase_auth_firebase_auth_host_api_set_language_code_response_get_type(), + nullptr)); + self->value = fl_value_new_list(); + fl_value_append_take(self->value, fl_value_new_string(code)); + fl_value_append_take(self->value, + fl_value_new_string(message != nullptr ? message : "")); + fl_value_append_take(self->value, details != nullptr ? fl_value_ref(details) + : fl_value_new_null()); + return self; +} + +G_DECLARE_FINAL_TYPE(FirebaseAuthFirebaseAuthHostApiSetSettingsResponse, + firebase_auth_firebase_auth_host_api_set_settings_response, + FIREBASE_AUTH, + FIREBASE_AUTH_HOST_API_SET_SETTINGS_RESPONSE, GObject) + +struct _FirebaseAuthFirebaseAuthHostApiSetSettingsResponse { + GObject parent_instance; + + FlValue* value; +}; + +G_DEFINE_TYPE(FirebaseAuthFirebaseAuthHostApiSetSettingsResponse, + firebase_auth_firebase_auth_host_api_set_settings_response, + G_TYPE_OBJECT) + +static void firebase_auth_firebase_auth_host_api_set_settings_response_dispose( + GObject* object) { + FirebaseAuthFirebaseAuthHostApiSetSettingsResponse* self = + FIREBASE_AUTH_FIREBASE_AUTH_HOST_API_SET_SETTINGS_RESPONSE(object); + g_clear_pointer(&self->value, fl_value_unref); + G_OBJECT_CLASS( + firebase_auth_firebase_auth_host_api_set_settings_response_parent_class) + ->dispose(object); +} + +static void firebase_auth_firebase_auth_host_api_set_settings_response_init( + FirebaseAuthFirebaseAuthHostApiSetSettingsResponse* self) {} + +static void +firebase_auth_firebase_auth_host_api_set_settings_response_class_init( + FirebaseAuthFirebaseAuthHostApiSetSettingsResponseClass* klass) { + G_OBJECT_CLASS(klass)->dispose = + firebase_auth_firebase_auth_host_api_set_settings_response_dispose; +} + +static FirebaseAuthFirebaseAuthHostApiSetSettingsResponse* +firebase_auth_firebase_auth_host_api_set_settings_response_new() { + FirebaseAuthFirebaseAuthHostApiSetSettingsResponse* self = + FIREBASE_AUTH_FIREBASE_AUTH_HOST_API_SET_SETTINGS_RESPONSE(g_object_new( + firebase_auth_firebase_auth_host_api_set_settings_response_get_type(), + nullptr)); + self->value = fl_value_new_list(); + fl_value_append_take(self->value, fl_value_new_null()); + return self; +} + +static FirebaseAuthFirebaseAuthHostApiSetSettingsResponse* +firebase_auth_firebase_auth_host_api_set_settings_response_new_error( + const gchar* code, const gchar* message, FlValue* details) { + FirebaseAuthFirebaseAuthHostApiSetSettingsResponse* self = + FIREBASE_AUTH_FIREBASE_AUTH_HOST_API_SET_SETTINGS_RESPONSE(g_object_new( + firebase_auth_firebase_auth_host_api_set_settings_response_get_type(), + nullptr)); + self->value = fl_value_new_list(); + fl_value_append_take(self->value, fl_value_new_string(code)); + fl_value_append_take(self->value, + fl_value_new_string(message != nullptr ? message : "")); + fl_value_append_take(self->value, details != nullptr ? fl_value_ref(details) + : fl_value_new_null()); + return self; +} + +G_DECLARE_FINAL_TYPE( + FirebaseAuthFirebaseAuthHostApiVerifyPasswordResetCodeResponse, + firebase_auth_firebase_auth_host_api_verify_password_reset_code_response, + FIREBASE_AUTH, FIREBASE_AUTH_HOST_API_VERIFY_PASSWORD_RESET_CODE_RESPONSE, + GObject) + +struct _FirebaseAuthFirebaseAuthHostApiVerifyPasswordResetCodeResponse { + GObject parent_instance; + + FlValue* value; +}; + +G_DEFINE_TYPE( + FirebaseAuthFirebaseAuthHostApiVerifyPasswordResetCodeResponse, + firebase_auth_firebase_auth_host_api_verify_password_reset_code_response, + G_TYPE_OBJECT) + +static void +firebase_auth_firebase_auth_host_api_verify_password_reset_code_response_dispose( + GObject* object) { + FirebaseAuthFirebaseAuthHostApiVerifyPasswordResetCodeResponse* self = + FIREBASE_AUTH_FIREBASE_AUTH_HOST_API_VERIFY_PASSWORD_RESET_CODE_RESPONSE( + object); + g_clear_pointer(&self->value, fl_value_unref); + G_OBJECT_CLASS( + firebase_auth_firebase_auth_host_api_verify_password_reset_code_response_parent_class) + ->dispose(object); +} + +static void +firebase_auth_firebase_auth_host_api_verify_password_reset_code_response_init( + FirebaseAuthFirebaseAuthHostApiVerifyPasswordResetCodeResponse* self) {} + +static void +firebase_auth_firebase_auth_host_api_verify_password_reset_code_response_class_init( + FirebaseAuthFirebaseAuthHostApiVerifyPasswordResetCodeResponseClass* + klass) { + G_OBJECT_CLASS(klass)->dispose = + firebase_auth_firebase_auth_host_api_verify_password_reset_code_response_dispose; +} + +static FirebaseAuthFirebaseAuthHostApiVerifyPasswordResetCodeResponse* +firebase_auth_firebase_auth_host_api_verify_password_reset_code_response_new( + const gchar* return_value) { + FirebaseAuthFirebaseAuthHostApiVerifyPasswordResetCodeResponse* self = + FIREBASE_AUTH_FIREBASE_AUTH_HOST_API_VERIFY_PASSWORD_RESET_CODE_RESPONSE( + g_object_new( + firebase_auth_firebase_auth_host_api_verify_password_reset_code_response_get_type(), + nullptr)); + self->value = fl_value_new_list(); + fl_value_append_take(self->value, fl_value_new_string(return_value)); + return self; +} + +static FirebaseAuthFirebaseAuthHostApiVerifyPasswordResetCodeResponse* +firebase_auth_firebase_auth_host_api_verify_password_reset_code_response_new_error( + const gchar* code, const gchar* message, FlValue* details) { + FirebaseAuthFirebaseAuthHostApiVerifyPasswordResetCodeResponse* self = + FIREBASE_AUTH_FIREBASE_AUTH_HOST_API_VERIFY_PASSWORD_RESET_CODE_RESPONSE( + g_object_new( + firebase_auth_firebase_auth_host_api_verify_password_reset_code_response_get_type(), + nullptr)); + self->value = fl_value_new_list(); + fl_value_append_take(self->value, fl_value_new_string(code)); + fl_value_append_take(self->value, + fl_value_new_string(message != nullptr ? message : "")); + fl_value_append_take(self->value, details != nullptr ? fl_value_ref(details) + : fl_value_new_null()); + return self; +} + +G_DECLARE_FINAL_TYPE( + FirebaseAuthFirebaseAuthHostApiVerifyPhoneNumberResponse, + firebase_auth_firebase_auth_host_api_verify_phone_number_response, + FIREBASE_AUTH, FIREBASE_AUTH_HOST_API_VERIFY_PHONE_NUMBER_RESPONSE, GObject) + +struct _FirebaseAuthFirebaseAuthHostApiVerifyPhoneNumberResponse { + GObject parent_instance; + + FlValue* value; +}; + +G_DEFINE_TYPE(FirebaseAuthFirebaseAuthHostApiVerifyPhoneNumberResponse, + firebase_auth_firebase_auth_host_api_verify_phone_number_response, + G_TYPE_OBJECT) + +static void +firebase_auth_firebase_auth_host_api_verify_phone_number_response_dispose( + GObject* object) { + FirebaseAuthFirebaseAuthHostApiVerifyPhoneNumberResponse* self = + FIREBASE_AUTH_FIREBASE_AUTH_HOST_API_VERIFY_PHONE_NUMBER_RESPONSE(object); + g_clear_pointer(&self->value, fl_value_unref); + G_OBJECT_CLASS( + firebase_auth_firebase_auth_host_api_verify_phone_number_response_parent_class) + ->dispose(object); +} + +static void +firebase_auth_firebase_auth_host_api_verify_phone_number_response_init( + FirebaseAuthFirebaseAuthHostApiVerifyPhoneNumberResponse* self) {} + +static void +firebase_auth_firebase_auth_host_api_verify_phone_number_response_class_init( + FirebaseAuthFirebaseAuthHostApiVerifyPhoneNumberResponseClass* klass) { + G_OBJECT_CLASS(klass)->dispose = + firebase_auth_firebase_auth_host_api_verify_phone_number_response_dispose; +} + +static FirebaseAuthFirebaseAuthHostApiVerifyPhoneNumberResponse* +firebase_auth_firebase_auth_host_api_verify_phone_number_response_new( + const gchar* return_value) { + FirebaseAuthFirebaseAuthHostApiVerifyPhoneNumberResponse* self = + FIREBASE_AUTH_FIREBASE_AUTH_HOST_API_VERIFY_PHONE_NUMBER_RESPONSE(g_object_new( + firebase_auth_firebase_auth_host_api_verify_phone_number_response_get_type(), + nullptr)); + self->value = fl_value_new_list(); + fl_value_append_take(self->value, fl_value_new_string(return_value)); + return self; +} + +static FirebaseAuthFirebaseAuthHostApiVerifyPhoneNumberResponse* +firebase_auth_firebase_auth_host_api_verify_phone_number_response_new_error( + const gchar* code, const gchar* message, FlValue* details) { + FirebaseAuthFirebaseAuthHostApiVerifyPhoneNumberResponse* self = + FIREBASE_AUTH_FIREBASE_AUTH_HOST_API_VERIFY_PHONE_NUMBER_RESPONSE(g_object_new( + firebase_auth_firebase_auth_host_api_verify_phone_number_response_get_type(), + nullptr)); + self->value = fl_value_new_list(); + fl_value_append_take(self->value, fl_value_new_string(code)); + fl_value_append_take(self->value, + fl_value_new_string(message != nullptr ? message : "")); + fl_value_append_take(self->value, details != nullptr ? fl_value_ref(details) + : fl_value_new_null()); + return self; +} + +G_DECLARE_FINAL_TYPE( + FirebaseAuthFirebaseAuthHostApiRevokeTokenWithAuthorizationCodeResponse, + firebase_auth_firebase_auth_host_api_revoke_token_with_authorization_code_response, + FIREBASE_AUTH, + FIREBASE_AUTH_HOST_API_REVOKE_TOKEN_WITH_AUTHORIZATION_CODE_RESPONSE, + GObject) + +struct + _FirebaseAuthFirebaseAuthHostApiRevokeTokenWithAuthorizationCodeResponse { + GObject parent_instance; + + FlValue* value; +}; + +G_DEFINE_TYPE( + FirebaseAuthFirebaseAuthHostApiRevokeTokenWithAuthorizationCodeResponse, + firebase_auth_firebase_auth_host_api_revoke_token_with_authorization_code_response, + G_TYPE_OBJECT) + +static void +firebase_auth_firebase_auth_host_api_revoke_token_with_authorization_code_response_dispose( + GObject* object) { + FirebaseAuthFirebaseAuthHostApiRevokeTokenWithAuthorizationCodeResponse* self = + FIREBASE_AUTH_FIREBASE_AUTH_HOST_API_REVOKE_TOKEN_WITH_AUTHORIZATION_CODE_RESPONSE( + object); + g_clear_pointer(&self->value, fl_value_unref); + G_OBJECT_CLASS( + firebase_auth_firebase_auth_host_api_revoke_token_with_authorization_code_response_parent_class) + ->dispose(object); +} + +static void +firebase_auth_firebase_auth_host_api_revoke_token_with_authorization_code_response_init( + FirebaseAuthFirebaseAuthHostApiRevokeTokenWithAuthorizationCodeResponse* + self) {} + +static void +firebase_auth_firebase_auth_host_api_revoke_token_with_authorization_code_response_class_init( + FirebaseAuthFirebaseAuthHostApiRevokeTokenWithAuthorizationCodeResponseClass* + klass) { + G_OBJECT_CLASS(klass)->dispose = + firebase_auth_firebase_auth_host_api_revoke_token_with_authorization_code_response_dispose; +} + +static FirebaseAuthFirebaseAuthHostApiRevokeTokenWithAuthorizationCodeResponse* +firebase_auth_firebase_auth_host_api_revoke_token_with_authorization_code_response_new() { + FirebaseAuthFirebaseAuthHostApiRevokeTokenWithAuthorizationCodeResponse* self = + FIREBASE_AUTH_FIREBASE_AUTH_HOST_API_REVOKE_TOKEN_WITH_AUTHORIZATION_CODE_RESPONSE( + g_object_new( + firebase_auth_firebase_auth_host_api_revoke_token_with_authorization_code_response_get_type(), + nullptr)); + self->value = fl_value_new_list(); + fl_value_append_take(self->value, fl_value_new_null()); + return self; +} + +static FirebaseAuthFirebaseAuthHostApiRevokeTokenWithAuthorizationCodeResponse* +firebase_auth_firebase_auth_host_api_revoke_token_with_authorization_code_response_new_error( + const gchar* code, const gchar* message, FlValue* details) { + FirebaseAuthFirebaseAuthHostApiRevokeTokenWithAuthorizationCodeResponse* self = + FIREBASE_AUTH_FIREBASE_AUTH_HOST_API_REVOKE_TOKEN_WITH_AUTHORIZATION_CODE_RESPONSE( + g_object_new( + firebase_auth_firebase_auth_host_api_revoke_token_with_authorization_code_response_get_type(), + nullptr)); + self->value = fl_value_new_list(); + fl_value_append_take(self->value, fl_value_new_string(code)); + fl_value_append_take(self->value, + fl_value_new_string(message != nullptr ? message : "")); + fl_value_append_take(self->value, details != nullptr ? fl_value_ref(details) + : fl_value_new_null()); + return self; +} + +G_DECLARE_FINAL_TYPE( + FirebaseAuthFirebaseAuthHostApiRevokeAccessTokenResponse, + firebase_auth_firebase_auth_host_api_revoke_access_token_response, + FIREBASE_AUTH, FIREBASE_AUTH_HOST_API_REVOKE_ACCESS_TOKEN_RESPONSE, GObject) + +struct _FirebaseAuthFirebaseAuthHostApiRevokeAccessTokenResponse { + GObject parent_instance; + + FlValue* value; +}; + +G_DEFINE_TYPE(FirebaseAuthFirebaseAuthHostApiRevokeAccessTokenResponse, + firebase_auth_firebase_auth_host_api_revoke_access_token_response, + G_TYPE_OBJECT) + +static void +firebase_auth_firebase_auth_host_api_revoke_access_token_response_dispose( + GObject* object) { + FirebaseAuthFirebaseAuthHostApiRevokeAccessTokenResponse* self = + FIREBASE_AUTH_FIREBASE_AUTH_HOST_API_REVOKE_ACCESS_TOKEN_RESPONSE(object); + g_clear_pointer(&self->value, fl_value_unref); + G_OBJECT_CLASS( + firebase_auth_firebase_auth_host_api_revoke_access_token_response_parent_class) + ->dispose(object); +} + +static void +firebase_auth_firebase_auth_host_api_revoke_access_token_response_init( + FirebaseAuthFirebaseAuthHostApiRevokeAccessTokenResponse* self) {} + +static void +firebase_auth_firebase_auth_host_api_revoke_access_token_response_class_init( + FirebaseAuthFirebaseAuthHostApiRevokeAccessTokenResponseClass* klass) { + G_OBJECT_CLASS(klass)->dispose = + firebase_auth_firebase_auth_host_api_revoke_access_token_response_dispose; +} + +static FirebaseAuthFirebaseAuthHostApiRevokeAccessTokenResponse* +firebase_auth_firebase_auth_host_api_revoke_access_token_response_new() { + FirebaseAuthFirebaseAuthHostApiRevokeAccessTokenResponse* self = + FIREBASE_AUTH_FIREBASE_AUTH_HOST_API_REVOKE_ACCESS_TOKEN_RESPONSE(g_object_new( + firebase_auth_firebase_auth_host_api_revoke_access_token_response_get_type(), + nullptr)); + self->value = fl_value_new_list(); + fl_value_append_take(self->value, fl_value_new_null()); + return self; +} + +static FirebaseAuthFirebaseAuthHostApiRevokeAccessTokenResponse* +firebase_auth_firebase_auth_host_api_revoke_access_token_response_new_error( + const gchar* code, const gchar* message, FlValue* details) { + FirebaseAuthFirebaseAuthHostApiRevokeAccessTokenResponse* self = + FIREBASE_AUTH_FIREBASE_AUTH_HOST_API_REVOKE_ACCESS_TOKEN_RESPONSE(g_object_new( + firebase_auth_firebase_auth_host_api_revoke_access_token_response_get_type(), + nullptr)); + self->value = fl_value_new_list(); + fl_value_append_take(self->value, fl_value_new_string(code)); + fl_value_append_take(self->value, + fl_value_new_string(message != nullptr ? message : "")); + fl_value_append_take(self->value, details != nullptr ? fl_value_ref(details) + : fl_value_new_null()); + return self; +} + +G_DECLARE_FINAL_TYPE( + FirebaseAuthFirebaseAuthHostApiInitializeRecaptchaConfigResponse, + firebase_auth_firebase_auth_host_api_initialize_recaptcha_config_response, + FIREBASE_AUTH, FIREBASE_AUTH_HOST_API_INITIALIZE_RECAPTCHA_CONFIG_RESPONSE, + GObject) + +struct _FirebaseAuthFirebaseAuthHostApiInitializeRecaptchaConfigResponse { + GObject parent_instance; + + FlValue* value; +}; + +G_DEFINE_TYPE( + FirebaseAuthFirebaseAuthHostApiInitializeRecaptchaConfigResponse, + firebase_auth_firebase_auth_host_api_initialize_recaptcha_config_response, + G_TYPE_OBJECT) + +static void +firebase_auth_firebase_auth_host_api_initialize_recaptcha_config_response_dispose( + GObject* object) { + FirebaseAuthFirebaseAuthHostApiInitializeRecaptchaConfigResponse* self = + FIREBASE_AUTH_FIREBASE_AUTH_HOST_API_INITIALIZE_RECAPTCHA_CONFIG_RESPONSE( + object); + g_clear_pointer(&self->value, fl_value_unref); + G_OBJECT_CLASS( + firebase_auth_firebase_auth_host_api_initialize_recaptcha_config_response_parent_class) + ->dispose(object); +} + +static void +firebase_auth_firebase_auth_host_api_initialize_recaptcha_config_response_init( + FirebaseAuthFirebaseAuthHostApiInitializeRecaptchaConfigResponse* self) {} + +static void +firebase_auth_firebase_auth_host_api_initialize_recaptcha_config_response_class_init( + FirebaseAuthFirebaseAuthHostApiInitializeRecaptchaConfigResponseClass* + klass) { + G_OBJECT_CLASS(klass)->dispose = + firebase_auth_firebase_auth_host_api_initialize_recaptcha_config_response_dispose; +} + +static FirebaseAuthFirebaseAuthHostApiInitializeRecaptchaConfigResponse* +firebase_auth_firebase_auth_host_api_initialize_recaptcha_config_response_new() { + FirebaseAuthFirebaseAuthHostApiInitializeRecaptchaConfigResponse* self = + FIREBASE_AUTH_FIREBASE_AUTH_HOST_API_INITIALIZE_RECAPTCHA_CONFIG_RESPONSE( + g_object_new( + firebase_auth_firebase_auth_host_api_initialize_recaptcha_config_response_get_type(), + nullptr)); + self->value = fl_value_new_list(); + fl_value_append_take(self->value, fl_value_new_null()); + return self; +} + +static FirebaseAuthFirebaseAuthHostApiInitializeRecaptchaConfigResponse* +firebase_auth_firebase_auth_host_api_initialize_recaptcha_config_response_new_error( + const gchar* code, const gchar* message, FlValue* details) { + FirebaseAuthFirebaseAuthHostApiInitializeRecaptchaConfigResponse* self = + FIREBASE_AUTH_FIREBASE_AUTH_HOST_API_INITIALIZE_RECAPTCHA_CONFIG_RESPONSE( + g_object_new( + firebase_auth_firebase_auth_host_api_initialize_recaptcha_config_response_get_type(), + nullptr)); + self->value = fl_value_new_list(); + fl_value_append_take(self->value, fl_value_new_string(code)); + fl_value_append_take(self->value, + fl_value_new_string(message != nullptr ? message : "")); + fl_value_append_take(self->value, details != nullptr ? fl_value_ref(details) + : fl_value_new_null()); + return self; +} + +struct _FirebaseAuthFirebaseAuthHostApi { + GObject parent_instance; + + const FirebaseAuthFirebaseAuthHostApiVTable* vtable; + gpointer user_data; + GDestroyNotify user_data_free_func; +}; + +G_DEFINE_TYPE(FirebaseAuthFirebaseAuthHostApi, + firebase_auth_firebase_auth_host_api, G_TYPE_OBJECT) + +static void firebase_auth_firebase_auth_host_api_dispose(GObject* object) { + FirebaseAuthFirebaseAuthHostApi* self = + FIREBASE_AUTH_FIREBASE_AUTH_HOST_API(object); + if (self->user_data != nullptr) { + self->user_data_free_func(self->user_data); + } + self->user_data = nullptr; + G_OBJECT_CLASS(firebase_auth_firebase_auth_host_api_parent_class) + ->dispose(object); +} + +static void firebase_auth_firebase_auth_host_api_init( + FirebaseAuthFirebaseAuthHostApi* self) {} + +static void firebase_auth_firebase_auth_host_api_class_init( + FirebaseAuthFirebaseAuthHostApiClass* klass) { + G_OBJECT_CLASS(klass)->dispose = firebase_auth_firebase_auth_host_api_dispose; +} + +static FirebaseAuthFirebaseAuthHostApi* +firebase_auth_firebase_auth_host_api_new( + const FirebaseAuthFirebaseAuthHostApiVTable* vtable, gpointer user_data, + GDestroyNotify user_data_free_func) { + FirebaseAuthFirebaseAuthHostApi* self = FIREBASE_AUTH_FIREBASE_AUTH_HOST_API( + g_object_new(firebase_auth_firebase_auth_host_api_get_type(), nullptr)); + self->vtable = vtable; + self->user_data = user_data; + self->user_data_free_func = user_data_free_func; + return self; +} + +static void firebase_auth_firebase_auth_host_api_register_id_token_listener_cb( + FlBasicMessageChannel* channel, FlValue* message_, + FlBasicMessageChannelResponseHandle* response_handle, gpointer user_data) { + FirebaseAuthFirebaseAuthHostApi* self = + FIREBASE_AUTH_FIREBASE_AUTH_HOST_API(user_data); + + if (self->vtable == nullptr || + self->vtable->register_id_token_listener == nullptr) { + return; + } + + FlValue* value0 = fl_value_get_list_value(message_, 0); + FirebaseAuthAuthPigeonFirebaseApp* app = + FIREBASE_AUTH_AUTH_PIGEON_FIREBASE_APP( + fl_value_get_custom_value_object(value0)); + g_autoptr(FirebaseAuthFirebaseAuthHostApiResponseHandle) handle = + firebase_auth_firebase_auth_host_api_response_handle_new(channel, + response_handle); + self->vtable->register_id_token_listener(app, handle, self->user_data); +} + +static void +firebase_auth_firebase_auth_host_api_register_auth_state_listener_cb( + FlBasicMessageChannel* channel, FlValue* message_, + FlBasicMessageChannelResponseHandle* response_handle, gpointer user_data) { + FirebaseAuthFirebaseAuthHostApi* self = + FIREBASE_AUTH_FIREBASE_AUTH_HOST_API(user_data); + + if (self->vtable == nullptr || + self->vtable->register_auth_state_listener == nullptr) { + return; + } + + FlValue* value0 = fl_value_get_list_value(message_, 0); + FirebaseAuthAuthPigeonFirebaseApp* app = + FIREBASE_AUTH_AUTH_PIGEON_FIREBASE_APP( + fl_value_get_custom_value_object(value0)); + g_autoptr(FirebaseAuthFirebaseAuthHostApiResponseHandle) handle = + firebase_auth_firebase_auth_host_api_response_handle_new(channel, + response_handle); + self->vtable->register_auth_state_listener(app, handle, self->user_data); +} + +static void firebase_auth_firebase_auth_host_api_use_emulator_cb( + FlBasicMessageChannel* channel, FlValue* message_, + FlBasicMessageChannelResponseHandle* response_handle, gpointer user_data) { + FirebaseAuthFirebaseAuthHostApi* self = + FIREBASE_AUTH_FIREBASE_AUTH_HOST_API(user_data); + + if (self->vtable == nullptr || self->vtable->use_emulator == nullptr) { + return; + } + + FlValue* value0 = fl_value_get_list_value(message_, 0); + FirebaseAuthAuthPigeonFirebaseApp* app = + FIREBASE_AUTH_AUTH_PIGEON_FIREBASE_APP( + fl_value_get_custom_value_object(value0)); + FlValue* value1 = fl_value_get_list_value(message_, 1); + const gchar* host = fl_value_get_string(value1); + FlValue* value2 = fl_value_get_list_value(message_, 2); + int64_t port = fl_value_get_int(value2); + g_autoptr(FirebaseAuthFirebaseAuthHostApiResponseHandle) handle = + firebase_auth_firebase_auth_host_api_response_handle_new(channel, + response_handle); + self->vtable->use_emulator(app, host, port, handle, self->user_data); +} + +static void firebase_auth_firebase_auth_host_api_apply_action_code_cb( + FlBasicMessageChannel* channel, FlValue* message_, + FlBasicMessageChannelResponseHandle* response_handle, gpointer user_data) { + FirebaseAuthFirebaseAuthHostApi* self = + FIREBASE_AUTH_FIREBASE_AUTH_HOST_API(user_data); + + if (self->vtable == nullptr || self->vtable->apply_action_code == nullptr) { + return; + } + + FlValue* value0 = fl_value_get_list_value(message_, 0); + FirebaseAuthAuthPigeonFirebaseApp* app = + FIREBASE_AUTH_AUTH_PIGEON_FIREBASE_APP( + fl_value_get_custom_value_object(value0)); + FlValue* value1 = fl_value_get_list_value(message_, 1); + const gchar* code = fl_value_get_string(value1); + g_autoptr(FirebaseAuthFirebaseAuthHostApiResponseHandle) handle = + firebase_auth_firebase_auth_host_api_response_handle_new(channel, + response_handle); + self->vtable->apply_action_code(app, code, handle, self->user_data); +} + +static void firebase_auth_firebase_auth_host_api_check_action_code_cb( + FlBasicMessageChannel* channel, FlValue* message_, + FlBasicMessageChannelResponseHandle* response_handle, gpointer user_data) { + FirebaseAuthFirebaseAuthHostApi* self = + FIREBASE_AUTH_FIREBASE_AUTH_HOST_API(user_data); + + if (self->vtable == nullptr || self->vtable->check_action_code == nullptr) { + return; + } + + FlValue* value0 = fl_value_get_list_value(message_, 0); + FirebaseAuthAuthPigeonFirebaseApp* app = + FIREBASE_AUTH_AUTH_PIGEON_FIREBASE_APP( + fl_value_get_custom_value_object(value0)); + FlValue* value1 = fl_value_get_list_value(message_, 1); + const gchar* code = fl_value_get_string(value1); + g_autoptr(FirebaseAuthFirebaseAuthHostApiResponseHandle) handle = + firebase_auth_firebase_auth_host_api_response_handle_new(channel, + response_handle); + self->vtable->check_action_code(app, code, handle, self->user_data); +} + +static void firebase_auth_firebase_auth_host_api_confirm_password_reset_cb( + FlBasicMessageChannel* channel, FlValue* message_, + FlBasicMessageChannelResponseHandle* response_handle, gpointer user_data) { + FirebaseAuthFirebaseAuthHostApi* self = + FIREBASE_AUTH_FIREBASE_AUTH_HOST_API(user_data); + + if (self->vtable == nullptr || + self->vtable->confirm_password_reset == nullptr) { + return; + } + + FlValue* value0 = fl_value_get_list_value(message_, 0); + FirebaseAuthAuthPigeonFirebaseApp* app = + FIREBASE_AUTH_AUTH_PIGEON_FIREBASE_APP( + fl_value_get_custom_value_object(value0)); + FlValue* value1 = fl_value_get_list_value(message_, 1); + const gchar* code = fl_value_get_string(value1); + FlValue* value2 = fl_value_get_list_value(message_, 2); + const gchar* new_password = fl_value_get_string(value2); + g_autoptr(FirebaseAuthFirebaseAuthHostApiResponseHandle) handle = + firebase_auth_firebase_auth_host_api_response_handle_new(channel, + response_handle); + self->vtable->confirm_password_reset(app, code, new_password, handle, + self->user_data); +} + +static void +firebase_auth_firebase_auth_host_api_create_user_with_email_and_password_cb( + FlBasicMessageChannel* channel, FlValue* message_, + FlBasicMessageChannelResponseHandle* response_handle, gpointer user_data) { + FirebaseAuthFirebaseAuthHostApi* self = + FIREBASE_AUTH_FIREBASE_AUTH_HOST_API(user_data); + + if (self->vtable == nullptr || + self->vtable->create_user_with_email_and_password == nullptr) { + return; + } + + FlValue* value0 = fl_value_get_list_value(message_, 0); + FirebaseAuthAuthPigeonFirebaseApp* app = + FIREBASE_AUTH_AUTH_PIGEON_FIREBASE_APP( + fl_value_get_custom_value_object(value0)); + FlValue* value1 = fl_value_get_list_value(message_, 1); + const gchar* email = fl_value_get_string(value1); + FlValue* value2 = fl_value_get_list_value(message_, 2); + const gchar* password = fl_value_get_string(value2); + g_autoptr(FirebaseAuthFirebaseAuthHostApiResponseHandle) handle = + firebase_auth_firebase_auth_host_api_response_handle_new(channel, + response_handle); + self->vtable->create_user_with_email_and_password(app, email, password, + handle, self->user_data); +} + +static void firebase_auth_firebase_auth_host_api_sign_in_anonymously_cb( + FlBasicMessageChannel* channel, FlValue* message_, + FlBasicMessageChannelResponseHandle* response_handle, gpointer user_data) { + FirebaseAuthFirebaseAuthHostApi* self = + FIREBASE_AUTH_FIREBASE_AUTH_HOST_API(user_data); + + if (self->vtable == nullptr || self->vtable->sign_in_anonymously == nullptr) { + return; + } + + FlValue* value0 = fl_value_get_list_value(message_, 0); + FirebaseAuthAuthPigeonFirebaseApp* app = + FIREBASE_AUTH_AUTH_PIGEON_FIREBASE_APP( + fl_value_get_custom_value_object(value0)); + g_autoptr(FirebaseAuthFirebaseAuthHostApiResponseHandle) handle = + firebase_auth_firebase_auth_host_api_response_handle_new(channel, + response_handle); + self->vtable->sign_in_anonymously(app, handle, self->user_data); +} + +static void firebase_auth_firebase_auth_host_api_sign_in_with_credential_cb( + FlBasicMessageChannel* channel, FlValue* message_, + FlBasicMessageChannelResponseHandle* response_handle, gpointer user_data) { + FirebaseAuthFirebaseAuthHostApi* self = + FIREBASE_AUTH_FIREBASE_AUTH_HOST_API(user_data); + + if (self->vtable == nullptr || + self->vtable->sign_in_with_credential == nullptr) { + return; + } + + FlValue* value0 = fl_value_get_list_value(message_, 0); + FirebaseAuthAuthPigeonFirebaseApp* app = + FIREBASE_AUTH_AUTH_PIGEON_FIREBASE_APP( + fl_value_get_custom_value_object(value0)); + FlValue* value1 = fl_value_get_list_value(message_, 1); + FlValue* input = value1; + g_autoptr(FirebaseAuthFirebaseAuthHostApiResponseHandle) handle = + firebase_auth_firebase_auth_host_api_response_handle_new(channel, + response_handle); + self->vtable->sign_in_with_credential(app, input, handle, self->user_data); +} + +static void firebase_auth_firebase_auth_host_api_sign_in_with_custom_token_cb( + FlBasicMessageChannel* channel, FlValue* message_, + FlBasicMessageChannelResponseHandle* response_handle, gpointer user_data) { + FirebaseAuthFirebaseAuthHostApi* self = + FIREBASE_AUTH_FIREBASE_AUTH_HOST_API(user_data); + + if (self->vtable == nullptr || + self->vtable->sign_in_with_custom_token == nullptr) { + return; + } + + FlValue* value0 = fl_value_get_list_value(message_, 0); + FirebaseAuthAuthPigeonFirebaseApp* app = + FIREBASE_AUTH_AUTH_PIGEON_FIREBASE_APP( + fl_value_get_custom_value_object(value0)); + FlValue* value1 = fl_value_get_list_value(message_, 1); + const gchar* token = fl_value_get_string(value1); + g_autoptr(FirebaseAuthFirebaseAuthHostApiResponseHandle) handle = + firebase_auth_firebase_auth_host_api_response_handle_new(channel, + response_handle); + self->vtable->sign_in_with_custom_token(app, token, handle, self->user_data); +} + +static void +firebase_auth_firebase_auth_host_api_sign_in_with_email_and_password_cb( + FlBasicMessageChannel* channel, FlValue* message_, + FlBasicMessageChannelResponseHandle* response_handle, gpointer user_data) { + FirebaseAuthFirebaseAuthHostApi* self = + FIREBASE_AUTH_FIREBASE_AUTH_HOST_API(user_data); + + if (self->vtable == nullptr || + self->vtable->sign_in_with_email_and_password == nullptr) { + return; + } + + FlValue* value0 = fl_value_get_list_value(message_, 0); + FirebaseAuthAuthPigeonFirebaseApp* app = + FIREBASE_AUTH_AUTH_PIGEON_FIREBASE_APP( + fl_value_get_custom_value_object(value0)); + FlValue* value1 = fl_value_get_list_value(message_, 1); + const gchar* email = fl_value_get_string(value1); + FlValue* value2 = fl_value_get_list_value(message_, 2); + const gchar* password = fl_value_get_string(value2); + g_autoptr(FirebaseAuthFirebaseAuthHostApiResponseHandle) handle = + firebase_auth_firebase_auth_host_api_response_handle_new(channel, + response_handle); + self->vtable->sign_in_with_email_and_password(app, email, password, handle, + self->user_data); +} + +static void firebase_auth_firebase_auth_host_api_sign_in_with_email_link_cb( + FlBasicMessageChannel* channel, FlValue* message_, + FlBasicMessageChannelResponseHandle* response_handle, gpointer user_data) { + FirebaseAuthFirebaseAuthHostApi* self = + FIREBASE_AUTH_FIREBASE_AUTH_HOST_API(user_data); + + if (self->vtable == nullptr || + self->vtable->sign_in_with_email_link == nullptr) { + return; + } + + FlValue* value0 = fl_value_get_list_value(message_, 0); + FirebaseAuthAuthPigeonFirebaseApp* app = + FIREBASE_AUTH_AUTH_PIGEON_FIREBASE_APP( + fl_value_get_custom_value_object(value0)); + FlValue* value1 = fl_value_get_list_value(message_, 1); + const gchar* email = fl_value_get_string(value1); + FlValue* value2 = fl_value_get_list_value(message_, 2); + const gchar* email_link = fl_value_get_string(value2); + g_autoptr(FirebaseAuthFirebaseAuthHostApiResponseHandle) handle = + firebase_auth_firebase_auth_host_api_response_handle_new(channel, + response_handle); + self->vtable->sign_in_with_email_link(app, email, email_link, handle, + self->user_data); +} + +static void firebase_auth_firebase_auth_host_api_sign_in_with_provider_cb( + FlBasicMessageChannel* channel, FlValue* message_, + FlBasicMessageChannelResponseHandle* response_handle, gpointer user_data) { + FirebaseAuthFirebaseAuthHostApi* self = + FIREBASE_AUTH_FIREBASE_AUTH_HOST_API(user_data); + + if (self->vtable == nullptr || + self->vtable->sign_in_with_provider == nullptr) { + return; + } + + FlValue* value0 = fl_value_get_list_value(message_, 0); + FirebaseAuthAuthPigeonFirebaseApp* app = + FIREBASE_AUTH_AUTH_PIGEON_FIREBASE_APP( + fl_value_get_custom_value_object(value0)); + FlValue* value1 = fl_value_get_list_value(message_, 1); + FirebaseAuthInternalSignInProvider* sign_in_provider = + FIREBASE_AUTH_INTERNAL_SIGN_IN_PROVIDER( + fl_value_get_custom_value_object(value1)); + g_autoptr(FirebaseAuthFirebaseAuthHostApiResponseHandle) handle = + firebase_auth_firebase_auth_host_api_response_handle_new(channel, + response_handle); + self->vtable->sign_in_with_provider(app, sign_in_provider, handle, + self->user_data); +} + +static void firebase_auth_firebase_auth_host_api_sign_out_cb( + FlBasicMessageChannel* channel, FlValue* message_, + FlBasicMessageChannelResponseHandle* response_handle, gpointer user_data) { + FirebaseAuthFirebaseAuthHostApi* self = + FIREBASE_AUTH_FIREBASE_AUTH_HOST_API(user_data); + + if (self->vtable == nullptr || self->vtable->sign_out == nullptr) { + return; + } + + FlValue* value0 = fl_value_get_list_value(message_, 0); + FirebaseAuthAuthPigeonFirebaseApp* app = + FIREBASE_AUTH_AUTH_PIGEON_FIREBASE_APP( + fl_value_get_custom_value_object(value0)); + g_autoptr(FirebaseAuthFirebaseAuthHostApiResponseHandle) handle = + firebase_auth_firebase_auth_host_api_response_handle_new(channel, + response_handle); + self->vtable->sign_out(app, handle, self->user_data); +} + +static void +firebase_auth_firebase_auth_host_api_fetch_sign_in_methods_for_email_cb( + FlBasicMessageChannel* channel, FlValue* message_, + FlBasicMessageChannelResponseHandle* response_handle, gpointer user_data) { + FirebaseAuthFirebaseAuthHostApi* self = + FIREBASE_AUTH_FIREBASE_AUTH_HOST_API(user_data); + + if (self->vtable == nullptr || + self->vtable->fetch_sign_in_methods_for_email == nullptr) { + return; + } + + FlValue* value0 = fl_value_get_list_value(message_, 0); + FirebaseAuthAuthPigeonFirebaseApp* app = + FIREBASE_AUTH_AUTH_PIGEON_FIREBASE_APP( + fl_value_get_custom_value_object(value0)); + FlValue* value1 = fl_value_get_list_value(message_, 1); + const gchar* email = fl_value_get_string(value1); + g_autoptr(FirebaseAuthFirebaseAuthHostApiResponseHandle) handle = + firebase_auth_firebase_auth_host_api_response_handle_new(channel, + response_handle); + self->vtable->fetch_sign_in_methods_for_email(app, email, handle, + self->user_data); +} + +static void firebase_auth_firebase_auth_host_api_send_password_reset_email_cb( + FlBasicMessageChannel* channel, FlValue* message_, + FlBasicMessageChannelResponseHandle* response_handle, gpointer user_data) { + FirebaseAuthFirebaseAuthHostApi* self = + FIREBASE_AUTH_FIREBASE_AUTH_HOST_API(user_data); + + if (self->vtable == nullptr || + self->vtable->send_password_reset_email == nullptr) { + return; + } + + FlValue* value0 = fl_value_get_list_value(message_, 0); + FirebaseAuthAuthPigeonFirebaseApp* app = + FIREBASE_AUTH_AUTH_PIGEON_FIREBASE_APP( + fl_value_get_custom_value_object(value0)); + FlValue* value1 = fl_value_get_list_value(message_, 1); + const gchar* email = fl_value_get_string(value1); + FlValue* value2 = fl_value_get_list_value(message_, 2); + FirebaseAuthInternalActionCodeSettings* action_code_settings = + FIREBASE_AUTH_INTERNAL_ACTION_CODE_SETTINGS( + fl_value_get_custom_value_object(value2)); + g_autoptr(FirebaseAuthFirebaseAuthHostApiResponseHandle) handle = + firebase_auth_firebase_auth_host_api_response_handle_new(channel, + response_handle); + self->vtable->send_password_reset_email(app, email, action_code_settings, + handle, self->user_data); +} + +static void firebase_auth_firebase_auth_host_api_send_sign_in_link_to_email_cb( + FlBasicMessageChannel* channel, FlValue* message_, + FlBasicMessageChannelResponseHandle* response_handle, gpointer user_data) { + FirebaseAuthFirebaseAuthHostApi* self = + FIREBASE_AUTH_FIREBASE_AUTH_HOST_API(user_data); + + if (self->vtable == nullptr || + self->vtable->send_sign_in_link_to_email == nullptr) { + return; + } + + FlValue* value0 = fl_value_get_list_value(message_, 0); + FirebaseAuthAuthPigeonFirebaseApp* app = + FIREBASE_AUTH_AUTH_PIGEON_FIREBASE_APP( + fl_value_get_custom_value_object(value0)); + FlValue* value1 = fl_value_get_list_value(message_, 1); + const gchar* email = fl_value_get_string(value1); + FlValue* value2 = fl_value_get_list_value(message_, 2); + FirebaseAuthInternalActionCodeSettings* action_code_settings = + FIREBASE_AUTH_INTERNAL_ACTION_CODE_SETTINGS( + fl_value_get_custom_value_object(value2)); + g_autoptr(FirebaseAuthFirebaseAuthHostApiResponseHandle) handle = + firebase_auth_firebase_auth_host_api_response_handle_new(channel, + response_handle); + self->vtable->send_sign_in_link_to_email(app, email, action_code_settings, + handle, self->user_data); +} + +static void firebase_auth_firebase_auth_host_api_set_language_code_cb( + FlBasicMessageChannel* channel, FlValue* message_, + FlBasicMessageChannelResponseHandle* response_handle, gpointer user_data) { + FirebaseAuthFirebaseAuthHostApi* self = + FIREBASE_AUTH_FIREBASE_AUTH_HOST_API(user_data); + + if (self->vtable == nullptr || self->vtable->set_language_code == nullptr) { + return; + } + + FlValue* value0 = fl_value_get_list_value(message_, 0); + FirebaseAuthAuthPigeonFirebaseApp* app = + FIREBASE_AUTH_AUTH_PIGEON_FIREBASE_APP( + fl_value_get_custom_value_object(value0)); + FlValue* value1 = fl_value_get_list_value(message_, 1); + const gchar* language_code = fl_value_get_string(value1); + g_autoptr(FirebaseAuthFirebaseAuthHostApiResponseHandle) handle = + firebase_auth_firebase_auth_host_api_response_handle_new(channel, + response_handle); + self->vtable->set_language_code(app, language_code, handle, self->user_data); +} + +static void firebase_auth_firebase_auth_host_api_set_settings_cb( + FlBasicMessageChannel* channel, FlValue* message_, + FlBasicMessageChannelResponseHandle* response_handle, gpointer user_data) { + FirebaseAuthFirebaseAuthHostApi* self = + FIREBASE_AUTH_FIREBASE_AUTH_HOST_API(user_data); + + if (self->vtable == nullptr || self->vtable->set_settings == nullptr) { + return; + } + + FlValue* value0 = fl_value_get_list_value(message_, 0); + FirebaseAuthAuthPigeonFirebaseApp* app = + FIREBASE_AUTH_AUTH_PIGEON_FIREBASE_APP( + fl_value_get_custom_value_object(value0)); + FlValue* value1 = fl_value_get_list_value(message_, 1); + FirebaseAuthInternalFirebaseAuthSettings* settings = + FIREBASE_AUTH_INTERNAL_FIREBASE_AUTH_SETTINGS( + fl_value_get_custom_value_object(value1)); + g_autoptr(FirebaseAuthFirebaseAuthHostApiResponseHandle) handle = + firebase_auth_firebase_auth_host_api_response_handle_new(channel, + response_handle); + self->vtable->set_settings(app, settings, handle, self->user_data); +} + +static void firebase_auth_firebase_auth_host_api_verify_password_reset_code_cb( + FlBasicMessageChannel* channel, FlValue* message_, + FlBasicMessageChannelResponseHandle* response_handle, gpointer user_data) { + FirebaseAuthFirebaseAuthHostApi* self = + FIREBASE_AUTH_FIREBASE_AUTH_HOST_API(user_data); + + if (self->vtable == nullptr || + self->vtable->verify_password_reset_code == nullptr) { + return; + } + + FlValue* value0 = fl_value_get_list_value(message_, 0); + FirebaseAuthAuthPigeonFirebaseApp* app = + FIREBASE_AUTH_AUTH_PIGEON_FIREBASE_APP( + fl_value_get_custom_value_object(value0)); + FlValue* value1 = fl_value_get_list_value(message_, 1); + const gchar* code = fl_value_get_string(value1); + g_autoptr(FirebaseAuthFirebaseAuthHostApiResponseHandle) handle = + firebase_auth_firebase_auth_host_api_response_handle_new(channel, + response_handle); + self->vtable->verify_password_reset_code(app, code, handle, self->user_data); +} + +static void firebase_auth_firebase_auth_host_api_verify_phone_number_cb( + FlBasicMessageChannel* channel, FlValue* message_, + FlBasicMessageChannelResponseHandle* response_handle, gpointer user_data) { + FirebaseAuthFirebaseAuthHostApi* self = + FIREBASE_AUTH_FIREBASE_AUTH_HOST_API(user_data); + + if (self->vtable == nullptr || self->vtable->verify_phone_number == nullptr) { + return; + } + + FlValue* value0 = fl_value_get_list_value(message_, 0); + FirebaseAuthAuthPigeonFirebaseApp* app = + FIREBASE_AUTH_AUTH_PIGEON_FIREBASE_APP( + fl_value_get_custom_value_object(value0)); + FlValue* value1 = fl_value_get_list_value(message_, 1); + FirebaseAuthInternalVerifyPhoneNumberRequest* request = + FIREBASE_AUTH_INTERNAL_VERIFY_PHONE_NUMBER_REQUEST( + fl_value_get_custom_value_object(value1)); + g_autoptr(FirebaseAuthFirebaseAuthHostApiResponseHandle) handle = + firebase_auth_firebase_auth_host_api_response_handle_new(channel, + response_handle); + self->vtable->verify_phone_number(app, request, handle, self->user_data); +} + +static void +firebase_auth_firebase_auth_host_api_revoke_token_with_authorization_code_cb( + FlBasicMessageChannel* channel, FlValue* message_, + FlBasicMessageChannelResponseHandle* response_handle, gpointer user_data) { + FirebaseAuthFirebaseAuthHostApi* self = + FIREBASE_AUTH_FIREBASE_AUTH_HOST_API(user_data); + + if (self->vtable == nullptr || + self->vtable->revoke_token_with_authorization_code == nullptr) { + return; + } + + FlValue* value0 = fl_value_get_list_value(message_, 0); + FirebaseAuthAuthPigeonFirebaseApp* app = + FIREBASE_AUTH_AUTH_PIGEON_FIREBASE_APP( + fl_value_get_custom_value_object(value0)); + FlValue* value1 = fl_value_get_list_value(message_, 1); + const gchar* authorization_code = fl_value_get_string(value1); + g_autoptr(FirebaseAuthFirebaseAuthHostApiResponseHandle) handle = + firebase_auth_firebase_auth_host_api_response_handle_new(channel, + response_handle); + self->vtable->revoke_token_with_authorization_code(app, authorization_code, + handle, self->user_data); +} + +static void firebase_auth_firebase_auth_host_api_revoke_access_token_cb( + FlBasicMessageChannel* channel, FlValue* message_, + FlBasicMessageChannelResponseHandle* response_handle, gpointer user_data) { + FirebaseAuthFirebaseAuthHostApi* self = + FIREBASE_AUTH_FIREBASE_AUTH_HOST_API(user_data); + + if (self->vtable == nullptr || self->vtable->revoke_access_token == nullptr) { + return; + } + + FlValue* value0 = fl_value_get_list_value(message_, 0); + FirebaseAuthAuthPigeonFirebaseApp* app = + FIREBASE_AUTH_AUTH_PIGEON_FIREBASE_APP( + fl_value_get_custom_value_object(value0)); + FlValue* value1 = fl_value_get_list_value(message_, 1); + const gchar* access_token = fl_value_get_string(value1); + g_autoptr(FirebaseAuthFirebaseAuthHostApiResponseHandle) handle = + firebase_auth_firebase_auth_host_api_response_handle_new(channel, + response_handle); + self->vtable->revoke_access_token(app, access_token, handle, self->user_data); +} + +static void firebase_auth_firebase_auth_host_api_initialize_recaptcha_config_cb( + FlBasicMessageChannel* channel, FlValue* message_, + FlBasicMessageChannelResponseHandle* response_handle, gpointer user_data) { + FirebaseAuthFirebaseAuthHostApi* self = + FIREBASE_AUTH_FIREBASE_AUTH_HOST_API(user_data); + + if (self->vtable == nullptr || + self->vtable->initialize_recaptcha_config == nullptr) { + return; + } + + FlValue* value0 = fl_value_get_list_value(message_, 0); + FirebaseAuthAuthPigeonFirebaseApp* app = + FIREBASE_AUTH_AUTH_PIGEON_FIREBASE_APP( + fl_value_get_custom_value_object(value0)); + g_autoptr(FirebaseAuthFirebaseAuthHostApiResponseHandle) handle = + firebase_auth_firebase_auth_host_api_response_handle_new(channel, + response_handle); + self->vtable->initialize_recaptcha_config(app, handle, self->user_data); +} + +void firebase_auth_firebase_auth_host_api_set_method_handlers( + FlBinaryMessenger* messenger, const gchar* suffix, + const FirebaseAuthFirebaseAuthHostApiVTable* vtable, gpointer user_data, + GDestroyNotify user_data_free_func) { + g_autofree gchar* dot_suffix = + suffix != nullptr ? g_strdup_printf(".%s", suffix) : g_strdup(""); + g_autoptr(FirebaseAuthFirebaseAuthHostApi) api_data = + firebase_auth_firebase_auth_host_api_new(vtable, user_data, + user_data_free_func); + + g_autoptr(FirebaseAuthMessageCodec) codec = firebase_auth_message_codec_new(); + g_autofree gchar* register_id_token_listener_channel_name = g_strdup_printf( + "dev.flutter.pigeon.firebase_auth_platform_interface.FirebaseAuthHostApi." + "registerIdTokenListener%s", + dot_suffix); + g_autoptr(FlBasicMessageChannel) register_id_token_listener_channel = + fl_basic_message_channel_new(messenger, + register_id_token_listener_channel_name, + FL_MESSAGE_CODEC(codec)); + fl_basic_message_channel_set_message_handler( + register_id_token_listener_channel, + firebase_auth_firebase_auth_host_api_register_id_token_listener_cb, + g_object_ref(api_data), g_object_unref); + g_autofree gchar* register_auth_state_listener_channel_name = g_strdup_printf( + "dev.flutter.pigeon.firebase_auth_platform_interface.FirebaseAuthHostApi." + "registerAuthStateListener%s", + dot_suffix); + g_autoptr(FlBasicMessageChannel) register_auth_state_listener_channel = + fl_basic_message_channel_new(messenger, + register_auth_state_listener_channel_name, + FL_MESSAGE_CODEC(codec)); + fl_basic_message_channel_set_message_handler( + register_auth_state_listener_channel, + firebase_auth_firebase_auth_host_api_register_auth_state_listener_cb, + g_object_ref(api_data), g_object_unref); + g_autofree gchar* use_emulator_channel_name = g_strdup_printf( + "dev.flutter.pigeon.firebase_auth_platform_interface.FirebaseAuthHostApi." + "useEmulator%s", + dot_suffix); + g_autoptr(FlBasicMessageChannel) use_emulator_channel = + fl_basic_message_channel_new(messenger, use_emulator_channel_name, + FL_MESSAGE_CODEC(codec)); + fl_basic_message_channel_set_message_handler( + use_emulator_channel, + firebase_auth_firebase_auth_host_api_use_emulator_cb, + g_object_ref(api_data), g_object_unref); + g_autofree gchar* apply_action_code_channel_name = g_strdup_printf( + "dev.flutter.pigeon.firebase_auth_platform_interface.FirebaseAuthHostApi." + "applyActionCode%s", + dot_suffix); + g_autoptr(FlBasicMessageChannel) apply_action_code_channel = + fl_basic_message_channel_new(messenger, apply_action_code_channel_name, + FL_MESSAGE_CODEC(codec)); + fl_basic_message_channel_set_message_handler( + apply_action_code_channel, + firebase_auth_firebase_auth_host_api_apply_action_code_cb, + g_object_ref(api_data), g_object_unref); + g_autofree gchar* check_action_code_channel_name = g_strdup_printf( + "dev.flutter.pigeon.firebase_auth_platform_interface.FirebaseAuthHostApi." + "checkActionCode%s", + dot_suffix); + g_autoptr(FlBasicMessageChannel) check_action_code_channel = + fl_basic_message_channel_new(messenger, check_action_code_channel_name, + FL_MESSAGE_CODEC(codec)); + fl_basic_message_channel_set_message_handler( + check_action_code_channel, + firebase_auth_firebase_auth_host_api_check_action_code_cb, + g_object_ref(api_data), g_object_unref); + g_autofree gchar* confirm_password_reset_channel_name = g_strdup_printf( + "dev.flutter.pigeon.firebase_auth_platform_interface.FirebaseAuthHostApi." + "confirmPasswordReset%s", + dot_suffix); + g_autoptr(FlBasicMessageChannel) confirm_password_reset_channel = + fl_basic_message_channel_new(messenger, + confirm_password_reset_channel_name, + FL_MESSAGE_CODEC(codec)); + fl_basic_message_channel_set_message_handler( + confirm_password_reset_channel, + firebase_auth_firebase_auth_host_api_confirm_password_reset_cb, + g_object_ref(api_data), g_object_unref); + g_autofree gchar* create_user_with_email_and_password_channel_name = + g_strdup_printf( + "dev.flutter.pigeon.firebase_auth_platform_interface." + "FirebaseAuthHostApi.createUserWithEmailAndPassword%s", + dot_suffix); + g_autoptr(FlBasicMessageChannel) create_user_with_email_and_password_channel = + fl_basic_message_channel_new( + messenger, create_user_with_email_and_password_channel_name, + FL_MESSAGE_CODEC(codec)); + fl_basic_message_channel_set_message_handler( + create_user_with_email_and_password_channel, + firebase_auth_firebase_auth_host_api_create_user_with_email_and_password_cb, + g_object_ref(api_data), g_object_unref); + g_autofree gchar* sign_in_anonymously_channel_name = g_strdup_printf( + "dev.flutter.pigeon.firebase_auth_platform_interface.FirebaseAuthHostApi." + "signInAnonymously%s", + dot_suffix); + g_autoptr(FlBasicMessageChannel) sign_in_anonymously_channel = + fl_basic_message_channel_new(messenger, sign_in_anonymously_channel_name, + FL_MESSAGE_CODEC(codec)); + fl_basic_message_channel_set_message_handler( + sign_in_anonymously_channel, + firebase_auth_firebase_auth_host_api_sign_in_anonymously_cb, + g_object_ref(api_data), g_object_unref); + g_autofree gchar* sign_in_with_credential_channel_name = g_strdup_printf( + "dev.flutter.pigeon.firebase_auth_platform_interface.FirebaseAuthHostApi." + "signInWithCredential%s", + dot_suffix); + g_autoptr(FlBasicMessageChannel) sign_in_with_credential_channel = + fl_basic_message_channel_new(messenger, + sign_in_with_credential_channel_name, + FL_MESSAGE_CODEC(codec)); + fl_basic_message_channel_set_message_handler( + sign_in_with_credential_channel, + firebase_auth_firebase_auth_host_api_sign_in_with_credential_cb, + g_object_ref(api_data), g_object_unref); + g_autofree gchar* sign_in_with_custom_token_channel_name = g_strdup_printf( + "dev.flutter.pigeon.firebase_auth_platform_interface.FirebaseAuthHostApi." + "signInWithCustomToken%s", + dot_suffix); + g_autoptr(FlBasicMessageChannel) sign_in_with_custom_token_channel = + fl_basic_message_channel_new(messenger, + sign_in_with_custom_token_channel_name, + FL_MESSAGE_CODEC(codec)); + fl_basic_message_channel_set_message_handler( + sign_in_with_custom_token_channel, + firebase_auth_firebase_auth_host_api_sign_in_with_custom_token_cb, + g_object_ref(api_data), g_object_unref); + g_autofree gchar* sign_in_with_email_and_password_channel_name = + g_strdup_printf( + "dev.flutter.pigeon.firebase_auth_platform_interface." + "FirebaseAuthHostApi.signInWithEmailAndPassword%s", + dot_suffix); + g_autoptr(FlBasicMessageChannel) sign_in_with_email_and_password_channel = + fl_basic_message_channel_new(messenger, + sign_in_with_email_and_password_channel_name, + FL_MESSAGE_CODEC(codec)); + fl_basic_message_channel_set_message_handler( + sign_in_with_email_and_password_channel, + firebase_auth_firebase_auth_host_api_sign_in_with_email_and_password_cb, + g_object_ref(api_data), g_object_unref); + g_autofree gchar* sign_in_with_email_link_channel_name = g_strdup_printf( + "dev.flutter.pigeon.firebase_auth_platform_interface.FirebaseAuthHostApi." + "signInWithEmailLink%s", + dot_suffix); + g_autoptr(FlBasicMessageChannel) sign_in_with_email_link_channel = + fl_basic_message_channel_new(messenger, + sign_in_with_email_link_channel_name, + FL_MESSAGE_CODEC(codec)); + fl_basic_message_channel_set_message_handler( + sign_in_with_email_link_channel, + firebase_auth_firebase_auth_host_api_sign_in_with_email_link_cb, + g_object_ref(api_data), g_object_unref); + g_autofree gchar* sign_in_with_provider_channel_name = g_strdup_printf( + "dev.flutter.pigeon.firebase_auth_platform_interface.FirebaseAuthHostApi." + "signInWithProvider%s", + dot_suffix); + g_autoptr(FlBasicMessageChannel) sign_in_with_provider_channel = + fl_basic_message_channel_new(messenger, + sign_in_with_provider_channel_name, + FL_MESSAGE_CODEC(codec)); + fl_basic_message_channel_set_message_handler( + sign_in_with_provider_channel, + firebase_auth_firebase_auth_host_api_sign_in_with_provider_cb, + g_object_ref(api_data), g_object_unref); + g_autofree gchar* sign_out_channel_name = g_strdup_printf( + "dev.flutter.pigeon.firebase_auth_platform_interface.FirebaseAuthHostApi." + "signOut%s", + dot_suffix); + g_autoptr(FlBasicMessageChannel) sign_out_channel = + fl_basic_message_channel_new(messenger, sign_out_channel_name, + FL_MESSAGE_CODEC(codec)); + fl_basic_message_channel_set_message_handler( + sign_out_channel, firebase_auth_firebase_auth_host_api_sign_out_cb, + g_object_ref(api_data), g_object_unref); + g_autofree gchar* fetch_sign_in_methods_for_email_channel_name = + g_strdup_printf( + "dev.flutter.pigeon.firebase_auth_platform_interface." + "FirebaseAuthHostApi.fetchSignInMethodsForEmail%s", + dot_suffix); + g_autoptr(FlBasicMessageChannel) fetch_sign_in_methods_for_email_channel = + fl_basic_message_channel_new(messenger, + fetch_sign_in_methods_for_email_channel_name, + FL_MESSAGE_CODEC(codec)); + fl_basic_message_channel_set_message_handler( + fetch_sign_in_methods_for_email_channel, + firebase_auth_firebase_auth_host_api_fetch_sign_in_methods_for_email_cb, + g_object_ref(api_data), g_object_unref); + g_autofree gchar* send_password_reset_email_channel_name = g_strdup_printf( + "dev.flutter.pigeon.firebase_auth_platform_interface.FirebaseAuthHostApi." + "sendPasswordResetEmail%s", + dot_suffix); + g_autoptr(FlBasicMessageChannel) send_password_reset_email_channel = + fl_basic_message_channel_new(messenger, + send_password_reset_email_channel_name, + FL_MESSAGE_CODEC(codec)); + fl_basic_message_channel_set_message_handler( + send_password_reset_email_channel, + firebase_auth_firebase_auth_host_api_send_password_reset_email_cb, + g_object_ref(api_data), g_object_unref); + g_autofree gchar* send_sign_in_link_to_email_channel_name = g_strdup_printf( + "dev.flutter.pigeon.firebase_auth_platform_interface.FirebaseAuthHostApi." + "sendSignInLinkToEmail%s", + dot_suffix); + g_autoptr(FlBasicMessageChannel) send_sign_in_link_to_email_channel = + fl_basic_message_channel_new(messenger, + send_sign_in_link_to_email_channel_name, + FL_MESSAGE_CODEC(codec)); + fl_basic_message_channel_set_message_handler( + send_sign_in_link_to_email_channel, + firebase_auth_firebase_auth_host_api_send_sign_in_link_to_email_cb, + g_object_ref(api_data), g_object_unref); + g_autofree gchar* set_language_code_channel_name = g_strdup_printf( + "dev.flutter.pigeon.firebase_auth_platform_interface.FirebaseAuthHostApi." + "setLanguageCode%s", + dot_suffix); + g_autoptr(FlBasicMessageChannel) set_language_code_channel = + fl_basic_message_channel_new(messenger, set_language_code_channel_name, + FL_MESSAGE_CODEC(codec)); + fl_basic_message_channel_set_message_handler( + set_language_code_channel, + firebase_auth_firebase_auth_host_api_set_language_code_cb, + g_object_ref(api_data), g_object_unref); + g_autofree gchar* set_settings_channel_name = g_strdup_printf( + "dev.flutter.pigeon.firebase_auth_platform_interface.FirebaseAuthHostApi." + "setSettings%s", + dot_suffix); + g_autoptr(FlBasicMessageChannel) set_settings_channel = + fl_basic_message_channel_new(messenger, set_settings_channel_name, + FL_MESSAGE_CODEC(codec)); + fl_basic_message_channel_set_message_handler( + set_settings_channel, + firebase_auth_firebase_auth_host_api_set_settings_cb, + g_object_ref(api_data), g_object_unref); + g_autofree gchar* verify_password_reset_code_channel_name = g_strdup_printf( + "dev.flutter.pigeon.firebase_auth_platform_interface.FirebaseAuthHostApi." + "verifyPasswordResetCode%s", + dot_suffix); + g_autoptr(FlBasicMessageChannel) verify_password_reset_code_channel = + fl_basic_message_channel_new(messenger, + verify_password_reset_code_channel_name, + FL_MESSAGE_CODEC(codec)); + fl_basic_message_channel_set_message_handler( + verify_password_reset_code_channel, + firebase_auth_firebase_auth_host_api_verify_password_reset_code_cb, + g_object_ref(api_data), g_object_unref); + g_autofree gchar* verify_phone_number_channel_name = g_strdup_printf( + "dev.flutter.pigeon.firebase_auth_platform_interface.FirebaseAuthHostApi." + "verifyPhoneNumber%s", + dot_suffix); + g_autoptr(FlBasicMessageChannel) verify_phone_number_channel = + fl_basic_message_channel_new(messenger, verify_phone_number_channel_name, + FL_MESSAGE_CODEC(codec)); + fl_basic_message_channel_set_message_handler( + verify_phone_number_channel, + firebase_auth_firebase_auth_host_api_verify_phone_number_cb, + g_object_ref(api_data), g_object_unref); + g_autofree gchar* revoke_token_with_authorization_code_channel_name = + g_strdup_printf( + "dev.flutter.pigeon.firebase_auth_platform_interface." + "FirebaseAuthHostApi.revokeTokenWithAuthorizationCode%s", + dot_suffix); + g_autoptr(FlBasicMessageChannel) + revoke_token_with_authorization_code_channel = + fl_basic_message_channel_new( + messenger, revoke_token_with_authorization_code_channel_name, + FL_MESSAGE_CODEC(codec)); + fl_basic_message_channel_set_message_handler( + revoke_token_with_authorization_code_channel, + firebase_auth_firebase_auth_host_api_revoke_token_with_authorization_code_cb, + g_object_ref(api_data), g_object_unref); + g_autofree gchar* revoke_access_token_channel_name = g_strdup_printf( + "dev.flutter.pigeon.firebase_auth_platform_interface.FirebaseAuthHostApi." + "revokeAccessToken%s", + dot_suffix); + g_autoptr(FlBasicMessageChannel) revoke_access_token_channel = + fl_basic_message_channel_new(messenger, revoke_access_token_channel_name, + FL_MESSAGE_CODEC(codec)); + fl_basic_message_channel_set_message_handler( + revoke_access_token_channel, + firebase_auth_firebase_auth_host_api_revoke_access_token_cb, + g_object_ref(api_data), g_object_unref); + g_autofree gchar* initialize_recaptcha_config_channel_name = g_strdup_printf( + "dev.flutter.pigeon.firebase_auth_platform_interface.FirebaseAuthHostApi." + "initializeRecaptchaConfig%s", + dot_suffix); + g_autoptr(FlBasicMessageChannel) initialize_recaptcha_config_channel = + fl_basic_message_channel_new(messenger, + initialize_recaptcha_config_channel_name, + FL_MESSAGE_CODEC(codec)); + fl_basic_message_channel_set_message_handler( + initialize_recaptcha_config_channel, + firebase_auth_firebase_auth_host_api_initialize_recaptcha_config_cb, + g_object_ref(api_data), g_object_unref); +} + +void firebase_auth_firebase_auth_host_api_clear_method_handlers( + FlBinaryMessenger* messenger, const gchar* suffix) { + g_autofree gchar* dot_suffix = + suffix != nullptr ? g_strdup_printf(".%s", suffix) : g_strdup(""); + + g_autoptr(FirebaseAuthMessageCodec) codec = firebase_auth_message_codec_new(); + g_autofree gchar* register_id_token_listener_channel_name = g_strdup_printf( + "dev.flutter.pigeon.firebase_auth_platform_interface.FirebaseAuthHostApi." + "registerIdTokenListener%s", + dot_suffix); + g_autoptr(FlBasicMessageChannel) register_id_token_listener_channel = + fl_basic_message_channel_new(messenger, + register_id_token_listener_channel_name, + FL_MESSAGE_CODEC(codec)); + fl_basic_message_channel_set_message_handler( + register_id_token_listener_channel, nullptr, nullptr, nullptr); + g_autofree gchar* register_auth_state_listener_channel_name = g_strdup_printf( + "dev.flutter.pigeon.firebase_auth_platform_interface.FirebaseAuthHostApi." + "registerAuthStateListener%s", + dot_suffix); + g_autoptr(FlBasicMessageChannel) register_auth_state_listener_channel = + fl_basic_message_channel_new(messenger, + register_auth_state_listener_channel_name, + FL_MESSAGE_CODEC(codec)); + fl_basic_message_channel_set_message_handler( + register_auth_state_listener_channel, nullptr, nullptr, nullptr); + g_autofree gchar* use_emulator_channel_name = g_strdup_printf( + "dev.flutter.pigeon.firebase_auth_platform_interface.FirebaseAuthHostApi." + "useEmulator%s", + dot_suffix); + g_autoptr(FlBasicMessageChannel) use_emulator_channel = + fl_basic_message_channel_new(messenger, use_emulator_channel_name, + FL_MESSAGE_CODEC(codec)); + fl_basic_message_channel_set_message_handler(use_emulator_channel, nullptr, + nullptr, nullptr); + g_autofree gchar* apply_action_code_channel_name = g_strdup_printf( + "dev.flutter.pigeon.firebase_auth_platform_interface.FirebaseAuthHostApi." + "applyActionCode%s", + dot_suffix); + g_autoptr(FlBasicMessageChannel) apply_action_code_channel = + fl_basic_message_channel_new(messenger, apply_action_code_channel_name, + FL_MESSAGE_CODEC(codec)); + fl_basic_message_channel_set_message_handler(apply_action_code_channel, + nullptr, nullptr, nullptr); + g_autofree gchar* check_action_code_channel_name = g_strdup_printf( + "dev.flutter.pigeon.firebase_auth_platform_interface.FirebaseAuthHostApi." + "checkActionCode%s", + dot_suffix); + g_autoptr(FlBasicMessageChannel) check_action_code_channel = + fl_basic_message_channel_new(messenger, check_action_code_channel_name, + FL_MESSAGE_CODEC(codec)); + fl_basic_message_channel_set_message_handler(check_action_code_channel, + nullptr, nullptr, nullptr); + g_autofree gchar* confirm_password_reset_channel_name = g_strdup_printf( + "dev.flutter.pigeon.firebase_auth_platform_interface.FirebaseAuthHostApi." + "confirmPasswordReset%s", + dot_suffix); + g_autoptr(FlBasicMessageChannel) confirm_password_reset_channel = + fl_basic_message_channel_new(messenger, + confirm_password_reset_channel_name, + FL_MESSAGE_CODEC(codec)); + fl_basic_message_channel_set_message_handler(confirm_password_reset_channel, + nullptr, nullptr, nullptr); + g_autofree gchar* create_user_with_email_and_password_channel_name = + g_strdup_printf( + "dev.flutter.pigeon.firebase_auth_platform_interface." + "FirebaseAuthHostApi.createUserWithEmailAndPassword%s", + dot_suffix); + g_autoptr(FlBasicMessageChannel) create_user_with_email_and_password_channel = + fl_basic_message_channel_new( + messenger, create_user_with_email_and_password_channel_name, + FL_MESSAGE_CODEC(codec)); + fl_basic_message_channel_set_message_handler( + create_user_with_email_and_password_channel, nullptr, nullptr, nullptr); + g_autofree gchar* sign_in_anonymously_channel_name = g_strdup_printf( + "dev.flutter.pigeon.firebase_auth_platform_interface.FirebaseAuthHostApi." + "signInAnonymously%s", + dot_suffix); + g_autoptr(FlBasicMessageChannel) sign_in_anonymously_channel = + fl_basic_message_channel_new(messenger, sign_in_anonymously_channel_name, + FL_MESSAGE_CODEC(codec)); + fl_basic_message_channel_set_message_handler(sign_in_anonymously_channel, + nullptr, nullptr, nullptr); + g_autofree gchar* sign_in_with_credential_channel_name = g_strdup_printf( + "dev.flutter.pigeon.firebase_auth_platform_interface.FirebaseAuthHostApi." + "signInWithCredential%s", + dot_suffix); + g_autoptr(FlBasicMessageChannel) sign_in_with_credential_channel = + fl_basic_message_channel_new(messenger, + sign_in_with_credential_channel_name, + FL_MESSAGE_CODEC(codec)); + fl_basic_message_channel_set_message_handler(sign_in_with_credential_channel, + nullptr, nullptr, nullptr); + g_autofree gchar* sign_in_with_custom_token_channel_name = g_strdup_printf( + "dev.flutter.pigeon.firebase_auth_platform_interface.FirebaseAuthHostApi." + "signInWithCustomToken%s", + dot_suffix); + g_autoptr(FlBasicMessageChannel) sign_in_with_custom_token_channel = + fl_basic_message_channel_new(messenger, + sign_in_with_custom_token_channel_name, + FL_MESSAGE_CODEC(codec)); + fl_basic_message_channel_set_message_handler( + sign_in_with_custom_token_channel, nullptr, nullptr, nullptr); + g_autofree gchar* sign_in_with_email_and_password_channel_name = + g_strdup_printf( + "dev.flutter.pigeon.firebase_auth_platform_interface." + "FirebaseAuthHostApi.signInWithEmailAndPassword%s", + dot_suffix); + g_autoptr(FlBasicMessageChannel) sign_in_with_email_and_password_channel = + fl_basic_message_channel_new(messenger, + sign_in_with_email_and_password_channel_name, + FL_MESSAGE_CODEC(codec)); + fl_basic_message_channel_set_message_handler( + sign_in_with_email_and_password_channel, nullptr, nullptr, nullptr); + g_autofree gchar* sign_in_with_email_link_channel_name = g_strdup_printf( + "dev.flutter.pigeon.firebase_auth_platform_interface.FirebaseAuthHostApi." + "signInWithEmailLink%s", + dot_suffix); + g_autoptr(FlBasicMessageChannel) sign_in_with_email_link_channel = + fl_basic_message_channel_new(messenger, + sign_in_with_email_link_channel_name, + FL_MESSAGE_CODEC(codec)); + fl_basic_message_channel_set_message_handler(sign_in_with_email_link_channel, + nullptr, nullptr, nullptr); + g_autofree gchar* sign_in_with_provider_channel_name = g_strdup_printf( + "dev.flutter.pigeon.firebase_auth_platform_interface.FirebaseAuthHostApi." + "signInWithProvider%s", + dot_suffix); + g_autoptr(FlBasicMessageChannel) sign_in_with_provider_channel = + fl_basic_message_channel_new(messenger, + sign_in_with_provider_channel_name, + FL_MESSAGE_CODEC(codec)); + fl_basic_message_channel_set_message_handler(sign_in_with_provider_channel, + nullptr, nullptr, nullptr); + g_autofree gchar* sign_out_channel_name = g_strdup_printf( + "dev.flutter.pigeon.firebase_auth_platform_interface.FirebaseAuthHostApi." + "signOut%s", + dot_suffix); + g_autoptr(FlBasicMessageChannel) sign_out_channel = + fl_basic_message_channel_new(messenger, sign_out_channel_name, + FL_MESSAGE_CODEC(codec)); + fl_basic_message_channel_set_message_handler(sign_out_channel, nullptr, + nullptr, nullptr); + g_autofree gchar* fetch_sign_in_methods_for_email_channel_name = + g_strdup_printf( + "dev.flutter.pigeon.firebase_auth_platform_interface." + "FirebaseAuthHostApi.fetchSignInMethodsForEmail%s", + dot_suffix); + g_autoptr(FlBasicMessageChannel) fetch_sign_in_methods_for_email_channel = + fl_basic_message_channel_new(messenger, + fetch_sign_in_methods_for_email_channel_name, + FL_MESSAGE_CODEC(codec)); + fl_basic_message_channel_set_message_handler( + fetch_sign_in_methods_for_email_channel, nullptr, nullptr, nullptr); + g_autofree gchar* send_password_reset_email_channel_name = g_strdup_printf( + "dev.flutter.pigeon.firebase_auth_platform_interface.FirebaseAuthHostApi." + "sendPasswordResetEmail%s", + dot_suffix); + g_autoptr(FlBasicMessageChannel) send_password_reset_email_channel = + fl_basic_message_channel_new(messenger, + send_password_reset_email_channel_name, + FL_MESSAGE_CODEC(codec)); + fl_basic_message_channel_set_message_handler( + send_password_reset_email_channel, nullptr, nullptr, nullptr); + g_autofree gchar* send_sign_in_link_to_email_channel_name = g_strdup_printf( + "dev.flutter.pigeon.firebase_auth_platform_interface.FirebaseAuthHostApi." + "sendSignInLinkToEmail%s", + dot_suffix); + g_autoptr(FlBasicMessageChannel) send_sign_in_link_to_email_channel = + fl_basic_message_channel_new(messenger, + send_sign_in_link_to_email_channel_name, + FL_MESSAGE_CODEC(codec)); + fl_basic_message_channel_set_message_handler( + send_sign_in_link_to_email_channel, nullptr, nullptr, nullptr); + g_autofree gchar* set_language_code_channel_name = g_strdup_printf( + "dev.flutter.pigeon.firebase_auth_platform_interface.FirebaseAuthHostApi." + "setLanguageCode%s", + dot_suffix); + g_autoptr(FlBasicMessageChannel) set_language_code_channel = + fl_basic_message_channel_new(messenger, set_language_code_channel_name, + FL_MESSAGE_CODEC(codec)); + fl_basic_message_channel_set_message_handler(set_language_code_channel, + nullptr, nullptr, nullptr); + g_autofree gchar* set_settings_channel_name = g_strdup_printf( + "dev.flutter.pigeon.firebase_auth_platform_interface.FirebaseAuthHostApi." + "setSettings%s", + dot_suffix); + g_autoptr(FlBasicMessageChannel) set_settings_channel = + fl_basic_message_channel_new(messenger, set_settings_channel_name, + FL_MESSAGE_CODEC(codec)); + fl_basic_message_channel_set_message_handler(set_settings_channel, nullptr, + nullptr, nullptr); + g_autofree gchar* verify_password_reset_code_channel_name = g_strdup_printf( + "dev.flutter.pigeon.firebase_auth_platform_interface.FirebaseAuthHostApi." + "verifyPasswordResetCode%s", + dot_suffix); + g_autoptr(FlBasicMessageChannel) verify_password_reset_code_channel = + fl_basic_message_channel_new(messenger, + verify_password_reset_code_channel_name, + FL_MESSAGE_CODEC(codec)); + fl_basic_message_channel_set_message_handler( + verify_password_reset_code_channel, nullptr, nullptr, nullptr); + g_autofree gchar* verify_phone_number_channel_name = g_strdup_printf( + "dev.flutter.pigeon.firebase_auth_platform_interface.FirebaseAuthHostApi." + "verifyPhoneNumber%s", + dot_suffix); + g_autoptr(FlBasicMessageChannel) verify_phone_number_channel = + fl_basic_message_channel_new(messenger, verify_phone_number_channel_name, + FL_MESSAGE_CODEC(codec)); + fl_basic_message_channel_set_message_handler(verify_phone_number_channel, + nullptr, nullptr, nullptr); + g_autofree gchar* revoke_token_with_authorization_code_channel_name = + g_strdup_printf( + "dev.flutter.pigeon.firebase_auth_platform_interface." + "FirebaseAuthHostApi.revokeTokenWithAuthorizationCode%s", + dot_suffix); + g_autoptr(FlBasicMessageChannel) + revoke_token_with_authorization_code_channel = + fl_basic_message_channel_new( + messenger, revoke_token_with_authorization_code_channel_name, + FL_MESSAGE_CODEC(codec)); + fl_basic_message_channel_set_message_handler( + revoke_token_with_authorization_code_channel, nullptr, nullptr, nullptr); + g_autofree gchar* revoke_access_token_channel_name = g_strdup_printf( + "dev.flutter.pigeon.firebase_auth_platform_interface.FirebaseAuthHostApi." + "revokeAccessToken%s", + dot_suffix); + g_autoptr(FlBasicMessageChannel) revoke_access_token_channel = + fl_basic_message_channel_new(messenger, revoke_access_token_channel_name, + FL_MESSAGE_CODEC(codec)); + fl_basic_message_channel_set_message_handler(revoke_access_token_channel, + nullptr, nullptr, nullptr); + g_autofree gchar* initialize_recaptcha_config_channel_name = g_strdup_printf( + "dev.flutter.pigeon.firebase_auth_platform_interface.FirebaseAuthHostApi." + "initializeRecaptchaConfig%s", + dot_suffix); + g_autoptr(FlBasicMessageChannel) initialize_recaptcha_config_channel = + fl_basic_message_channel_new(messenger, + initialize_recaptcha_config_channel_name, + FL_MESSAGE_CODEC(codec)); + fl_basic_message_channel_set_message_handler( + initialize_recaptcha_config_channel, nullptr, nullptr, nullptr); +} + +void firebase_auth_firebase_auth_host_api_respond_register_id_token_listener( + FirebaseAuthFirebaseAuthHostApiResponseHandle* response_handle, + const gchar* return_value) { + g_autoptr( + FirebaseAuthFirebaseAuthHostApiRegisterIdTokenListenerResponse) response = + firebase_auth_firebase_auth_host_api_register_id_token_listener_response_new( + return_value); + g_autoptr(GError) error = nullptr; + if (!fl_basic_message_channel_respond(response_handle->channel, + response_handle->response_handle, + response->value, &error)) { + g_warning("Failed to send response to %s.%s: %s", "FirebaseAuthHostApi", + "registerIdTokenListener", error->message); + } +} + +void firebase_auth_firebase_auth_host_api_respond_error_register_id_token_listener( + FirebaseAuthFirebaseAuthHostApiResponseHandle* response_handle, + const gchar* code, const gchar* message, FlValue* details) { + g_autoptr( + FirebaseAuthFirebaseAuthHostApiRegisterIdTokenListenerResponse) response = + firebase_auth_firebase_auth_host_api_register_id_token_listener_response_new_error( + code, message, details); + g_autoptr(GError) error = nullptr; + if (!fl_basic_message_channel_respond(response_handle->channel, + response_handle->response_handle, + response->value, &error)) { + g_warning("Failed to send response to %s.%s: %s", "FirebaseAuthHostApi", + "registerIdTokenListener", error->message); + } +} + +void firebase_auth_firebase_auth_host_api_respond_register_auth_state_listener( + FirebaseAuthFirebaseAuthHostApiResponseHandle* response_handle, + const gchar* return_value) { + g_autoptr( + FirebaseAuthFirebaseAuthHostApiRegisterAuthStateListenerResponse) response = + firebase_auth_firebase_auth_host_api_register_auth_state_listener_response_new( + return_value); + g_autoptr(GError) error = nullptr; + if (!fl_basic_message_channel_respond(response_handle->channel, + response_handle->response_handle, + response->value, &error)) { + g_warning("Failed to send response to %s.%s: %s", "FirebaseAuthHostApi", + "registerAuthStateListener", error->message); + } +} + +void firebase_auth_firebase_auth_host_api_respond_error_register_auth_state_listener( + FirebaseAuthFirebaseAuthHostApiResponseHandle* response_handle, + const gchar* code, const gchar* message, FlValue* details) { + g_autoptr( + FirebaseAuthFirebaseAuthHostApiRegisterAuthStateListenerResponse) response = + firebase_auth_firebase_auth_host_api_register_auth_state_listener_response_new_error( + code, message, details); + g_autoptr(GError) error = nullptr; + if (!fl_basic_message_channel_respond(response_handle->channel, + response_handle->response_handle, + response->value, &error)) { + g_warning("Failed to send response to %s.%s: %s", "FirebaseAuthHostApi", + "registerAuthStateListener", error->message); + } +} + +void firebase_auth_firebase_auth_host_api_respond_use_emulator( + FirebaseAuthFirebaseAuthHostApiResponseHandle* response_handle) { + g_autoptr(FirebaseAuthFirebaseAuthHostApiUseEmulatorResponse) response = + firebase_auth_firebase_auth_host_api_use_emulator_response_new(); + g_autoptr(GError) error = nullptr; + if (!fl_basic_message_channel_respond(response_handle->channel, + response_handle->response_handle, + response->value, &error)) { + g_warning("Failed to send response to %s.%s: %s", "FirebaseAuthHostApi", + "useEmulator", error->message); + } +} + +void firebase_auth_firebase_auth_host_api_respond_error_use_emulator( + FirebaseAuthFirebaseAuthHostApiResponseHandle* response_handle, + const gchar* code, const gchar* message, FlValue* details) { + g_autoptr(FirebaseAuthFirebaseAuthHostApiUseEmulatorResponse) response = + firebase_auth_firebase_auth_host_api_use_emulator_response_new_error( + code, message, details); + g_autoptr(GError) error = nullptr; + if (!fl_basic_message_channel_respond(response_handle->channel, + response_handle->response_handle, + response->value, &error)) { + g_warning("Failed to send response to %s.%s: %s", "FirebaseAuthHostApi", + "useEmulator", error->message); + } +} + +void firebase_auth_firebase_auth_host_api_respond_apply_action_code( + FirebaseAuthFirebaseAuthHostApiResponseHandle* response_handle) { + g_autoptr(FirebaseAuthFirebaseAuthHostApiApplyActionCodeResponse) response = + firebase_auth_firebase_auth_host_api_apply_action_code_response_new(); + g_autoptr(GError) error = nullptr; + if (!fl_basic_message_channel_respond(response_handle->channel, + response_handle->response_handle, + response->value, &error)) { + g_warning("Failed to send response to %s.%s: %s", "FirebaseAuthHostApi", + "applyActionCode", error->message); + } +} + +void firebase_auth_firebase_auth_host_api_respond_error_apply_action_code( + FirebaseAuthFirebaseAuthHostApiResponseHandle* response_handle, + const gchar* code, const gchar* message, FlValue* details) { + g_autoptr(FirebaseAuthFirebaseAuthHostApiApplyActionCodeResponse) response = + firebase_auth_firebase_auth_host_api_apply_action_code_response_new_error( + code, message, details); + g_autoptr(GError) error = nullptr; + if (!fl_basic_message_channel_respond(response_handle->channel, + response_handle->response_handle, + response->value, &error)) { + g_warning("Failed to send response to %s.%s: %s", "FirebaseAuthHostApi", + "applyActionCode", error->message); + } +} + +void firebase_auth_firebase_auth_host_api_respond_check_action_code( + FirebaseAuthFirebaseAuthHostApiResponseHandle* response_handle, + FirebaseAuthInternalActionCodeInfo* return_value) { + g_autoptr(FirebaseAuthFirebaseAuthHostApiCheckActionCodeResponse) response = + firebase_auth_firebase_auth_host_api_check_action_code_response_new( + return_value); + g_autoptr(GError) error = nullptr; + if (!fl_basic_message_channel_respond(response_handle->channel, + response_handle->response_handle, + response->value, &error)) { + g_warning("Failed to send response to %s.%s: %s", "FirebaseAuthHostApi", + "checkActionCode", error->message); + } +} + +void firebase_auth_firebase_auth_host_api_respond_error_check_action_code( + FirebaseAuthFirebaseAuthHostApiResponseHandle* response_handle, + const gchar* code, const gchar* message, FlValue* details) { + g_autoptr(FirebaseAuthFirebaseAuthHostApiCheckActionCodeResponse) response = + firebase_auth_firebase_auth_host_api_check_action_code_response_new_error( + code, message, details); + g_autoptr(GError) error = nullptr; + if (!fl_basic_message_channel_respond(response_handle->channel, + response_handle->response_handle, + response->value, &error)) { + g_warning("Failed to send response to %s.%s: %s", "FirebaseAuthHostApi", + "checkActionCode", error->message); + } +} + +void firebase_auth_firebase_auth_host_api_respond_confirm_password_reset( + FirebaseAuthFirebaseAuthHostApiResponseHandle* response_handle) { + g_autoptr( + FirebaseAuthFirebaseAuthHostApiConfirmPasswordResetResponse) response = + firebase_auth_firebase_auth_host_api_confirm_password_reset_response_new(); + g_autoptr(GError) error = nullptr; + if (!fl_basic_message_channel_respond(response_handle->channel, + response_handle->response_handle, + response->value, &error)) { + g_warning("Failed to send response to %s.%s: %s", "FirebaseAuthHostApi", + "confirmPasswordReset", error->message); + } +} + +void firebase_auth_firebase_auth_host_api_respond_error_confirm_password_reset( + FirebaseAuthFirebaseAuthHostApiResponseHandle* response_handle, + const gchar* code, const gchar* message, FlValue* details) { + g_autoptr( + FirebaseAuthFirebaseAuthHostApiConfirmPasswordResetResponse) response = + firebase_auth_firebase_auth_host_api_confirm_password_reset_response_new_error( + code, message, details); + g_autoptr(GError) error = nullptr; + if (!fl_basic_message_channel_respond(response_handle->channel, + response_handle->response_handle, + response->value, &error)) { + g_warning("Failed to send response to %s.%s: %s", "FirebaseAuthHostApi", + "confirmPasswordReset", error->message); + } +} + +void firebase_auth_firebase_auth_host_api_respond_create_user_with_email_and_password( + FirebaseAuthFirebaseAuthHostApiResponseHandle* response_handle, + FirebaseAuthInternalUserCredential* return_value) { + g_autoptr( + FirebaseAuthFirebaseAuthHostApiCreateUserWithEmailAndPasswordResponse) + response = + firebase_auth_firebase_auth_host_api_create_user_with_email_and_password_response_new( + return_value); + g_autoptr(GError) error = nullptr; + if (!fl_basic_message_channel_respond(response_handle->channel, + response_handle->response_handle, + response->value, &error)) { + g_warning("Failed to send response to %s.%s: %s", "FirebaseAuthHostApi", + "createUserWithEmailAndPassword", error->message); + } +} + +void firebase_auth_firebase_auth_host_api_respond_error_create_user_with_email_and_password( + FirebaseAuthFirebaseAuthHostApiResponseHandle* response_handle, + const gchar* code, const gchar* message, FlValue* details) { + g_autoptr( + FirebaseAuthFirebaseAuthHostApiCreateUserWithEmailAndPasswordResponse) + response = + firebase_auth_firebase_auth_host_api_create_user_with_email_and_password_response_new_error( + code, message, details); + g_autoptr(GError) error = nullptr; + if (!fl_basic_message_channel_respond(response_handle->channel, + response_handle->response_handle, + response->value, &error)) { + g_warning("Failed to send response to %s.%s: %s", "FirebaseAuthHostApi", + "createUserWithEmailAndPassword", error->message); + } +} + +void firebase_auth_firebase_auth_host_api_respond_sign_in_anonymously( + FirebaseAuthFirebaseAuthHostApiResponseHandle* response_handle, + FirebaseAuthInternalUserCredential* return_value) { + g_autoptr(FirebaseAuthFirebaseAuthHostApiSignInAnonymouslyResponse) response = + firebase_auth_firebase_auth_host_api_sign_in_anonymously_response_new( + return_value); + g_autoptr(GError) error = nullptr; + if (!fl_basic_message_channel_respond(response_handle->channel, + response_handle->response_handle, + response->value, &error)) { + g_warning("Failed to send response to %s.%s: %s", "FirebaseAuthHostApi", + "signInAnonymously", error->message); + } +} + +void firebase_auth_firebase_auth_host_api_respond_error_sign_in_anonymously( + FirebaseAuthFirebaseAuthHostApiResponseHandle* response_handle, + const gchar* code, const gchar* message, FlValue* details) { + g_autoptr(FirebaseAuthFirebaseAuthHostApiSignInAnonymouslyResponse) response = + firebase_auth_firebase_auth_host_api_sign_in_anonymously_response_new_error( + code, message, details); + g_autoptr(GError) error = nullptr; + if (!fl_basic_message_channel_respond(response_handle->channel, + response_handle->response_handle, + response->value, &error)) { + g_warning("Failed to send response to %s.%s: %s", "FirebaseAuthHostApi", + "signInAnonymously", error->message); + } +} + +void firebase_auth_firebase_auth_host_api_respond_sign_in_with_credential( + FirebaseAuthFirebaseAuthHostApiResponseHandle* response_handle, + FirebaseAuthInternalUserCredential* return_value) { + g_autoptr( + FirebaseAuthFirebaseAuthHostApiSignInWithCredentialResponse) response = + firebase_auth_firebase_auth_host_api_sign_in_with_credential_response_new( + return_value); + g_autoptr(GError) error = nullptr; + if (!fl_basic_message_channel_respond(response_handle->channel, + response_handle->response_handle, + response->value, &error)) { + g_warning("Failed to send response to %s.%s: %s", "FirebaseAuthHostApi", + "signInWithCredential", error->message); + } +} + +void firebase_auth_firebase_auth_host_api_respond_error_sign_in_with_credential( + FirebaseAuthFirebaseAuthHostApiResponseHandle* response_handle, + const gchar* code, const gchar* message, FlValue* details) { + g_autoptr( + FirebaseAuthFirebaseAuthHostApiSignInWithCredentialResponse) response = + firebase_auth_firebase_auth_host_api_sign_in_with_credential_response_new_error( + code, message, details); + g_autoptr(GError) error = nullptr; + if (!fl_basic_message_channel_respond(response_handle->channel, + response_handle->response_handle, + response->value, &error)) { + g_warning("Failed to send response to %s.%s: %s", "FirebaseAuthHostApi", + "signInWithCredential", error->message); + } +} + +void firebase_auth_firebase_auth_host_api_respond_sign_in_with_custom_token( + FirebaseAuthFirebaseAuthHostApiResponseHandle* response_handle, + FirebaseAuthInternalUserCredential* return_value) { + g_autoptr( + FirebaseAuthFirebaseAuthHostApiSignInWithCustomTokenResponse) response = + firebase_auth_firebase_auth_host_api_sign_in_with_custom_token_response_new( + return_value); + g_autoptr(GError) error = nullptr; + if (!fl_basic_message_channel_respond(response_handle->channel, + response_handle->response_handle, + response->value, &error)) { + g_warning("Failed to send response to %s.%s: %s", "FirebaseAuthHostApi", + "signInWithCustomToken", error->message); + } +} + +void firebase_auth_firebase_auth_host_api_respond_error_sign_in_with_custom_token( + FirebaseAuthFirebaseAuthHostApiResponseHandle* response_handle, + const gchar* code, const gchar* message, FlValue* details) { + g_autoptr( + FirebaseAuthFirebaseAuthHostApiSignInWithCustomTokenResponse) response = + firebase_auth_firebase_auth_host_api_sign_in_with_custom_token_response_new_error( + code, message, details); + g_autoptr(GError) error = nullptr; + if (!fl_basic_message_channel_respond(response_handle->channel, + response_handle->response_handle, + response->value, &error)) { + g_warning("Failed to send response to %s.%s: %s", "FirebaseAuthHostApi", + "signInWithCustomToken", error->message); + } +} + +void firebase_auth_firebase_auth_host_api_respond_sign_in_with_email_and_password( + FirebaseAuthFirebaseAuthHostApiResponseHandle* response_handle, + FirebaseAuthInternalUserCredential* return_value) { + g_autoptr( + FirebaseAuthFirebaseAuthHostApiSignInWithEmailAndPasswordResponse) response = + firebase_auth_firebase_auth_host_api_sign_in_with_email_and_password_response_new( + return_value); + g_autoptr(GError) error = nullptr; + if (!fl_basic_message_channel_respond(response_handle->channel, + response_handle->response_handle, + response->value, &error)) { + g_warning("Failed to send response to %s.%s: %s", "FirebaseAuthHostApi", + "signInWithEmailAndPassword", error->message); + } +} + +void firebase_auth_firebase_auth_host_api_respond_error_sign_in_with_email_and_password( + FirebaseAuthFirebaseAuthHostApiResponseHandle* response_handle, + const gchar* code, const gchar* message, FlValue* details) { + g_autoptr( + FirebaseAuthFirebaseAuthHostApiSignInWithEmailAndPasswordResponse) response = + firebase_auth_firebase_auth_host_api_sign_in_with_email_and_password_response_new_error( + code, message, details); + g_autoptr(GError) error = nullptr; + if (!fl_basic_message_channel_respond(response_handle->channel, + response_handle->response_handle, + response->value, &error)) { + g_warning("Failed to send response to %s.%s: %s", "FirebaseAuthHostApi", + "signInWithEmailAndPassword", error->message); + } +} + +void firebase_auth_firebase_auth_host_api_respond_sign_in_with_email_link( + FirebaseAuthFirebaseAuthHostApiResponseHandle* response_handle, + FirebaseAuthInternalUserCredential* return_value) { + g_autoptr( + FirebaseAuthFirebaseAuthHostApiSignInWithEmailLinkResponse) response = + firebase_auth_firebase_auth_host_api_sign_in_with_email_link_response_new( + return_value); + g_autoptr(GError) error = nullptr; + if (!fl_basic_message_channel_respond(response_handle->channel, + response_handle->response_handle, + response->value, &error)) { + g_warning("Failed to send response to %s.%s: %s", "FirebaseAuthHostApi", + "signInWithEmailLink", error->message); + } +} + +void firebase_auth_firebase_auth_host_api_respond_error_sign_in_with_email_link( + FirebaseAuthFirebaseAuthHostApiResponseHandle* response_handle, + const gchar* code, const gchar* message, FlValue* details) { + g_autoptr( + FirebaseAuthFirebaseAuthHostApiSignInWithEmailLinkResponse) response = + firebase_auth_firebase_auth_host_api_sign_in_with_email_link_response_new_error( + code, message, details); + g_autoptr(GError) error = nullptr; + if (!fl_basic_message_channel_respond(response_handle->channel, + response_handle->response_handle, + response->value, &error)) { + g_warning("Failed to send response to %s.%s: %s", "FirebaseAuthHostApi", + "signInWithEmailLink", error->message); + } +} + +void firebase_auth_firebase_auth_host_api_respond_sign_in_with_provider( + FirebaseAuthFirebaseAuthHostApiResponseHandle* response_handle, + FirebaseAuthInternalUserCredential* return_value) { + g_autoptr( + FirebaseAuthFirebaseAuthHostApiSignInWithProviderResponse) response = + firebase_auth_firebase_auth_host_api_sign_in_with_provider_response_new( + return_value); + g_autoptr(GError) error = nullptr; + if (!fl_basic_message_channel_respond(response_handle->channel, + response_handle->response_handle, + response->value, &error)) { + g_warning("Failed to send response to %s.%s: %s", "FirebaseAuthHostApi", + "signInWithProvider", error->message); + } +} + +void firebase_auth_firebase_auth_host_api_respond_error_sign_in_with_provider( + FirebaseAuthFirebaseAuthHostApiResponseHandle* response_handle, + const gchar* code, const gchar* message, FlValue* details) { + g_autoptr( + FirebaseAuthFirebaseAuthHostApiSignInWithProviderResponse) response = + firebase_auth_firebase_auth_host_api_sign_in_with_provider_response_new_error( + code, message, details); + g_autoptr(GError) error = nullptr; + if (!fl_basic_message_channel_respond(response_handle->channel, + response_handle->response_handle, + response->value, &error)) { + g_warning("Failed to send response to %s.%s: %s", "FirebaseAuthHostApi", + "signInWithProvider", error->message); + } +} + +void firebase_auth_firebase_auth_host_api_respond_sign_out( + FirebaseAuthFirebaseAuthHostApiResponseHandle* response_handle) { + g_autoptr(FirebaseAuthFirebaseAuthHostApiSignOutResponse) response = + firebase_auth_firebase_auth_host_api_sign_out_response_new(); + g_autoptr(GError) error = nullptr; + if (!fl_basic_message_channel_respond(response_handle->channel, + response_handle->response_handle, + response->value, &error)) { + g_warning("Failed to send response to %s.%s: %s", "FirebaseAuthHostApi", + "signOut", error->message); + } +} + +void firebase_auth_firebase_auth_host_api_respond_error_sign_out( + FirebaseAuthFirebaseAuthHostApiResponseHandle* response_handle, + const gchar* code, const gchar* message, FlValue* details) { + g_autoptr(FirebaseAuthFirebaseAuthHostApiSignOutResponse) response = + firebase_auth_firebase_auth_host_api_sign_out_response_new_error( + code, message, details); + g_autoptr(GError) error = nullptr; + if (!fl_basic_message_channel_respond(response_handle->channel, + response_handle->response_handle, + response->value, &error)) { + g_warning("Failed to send response to %s.%s: %s", "FirebaseAuthHostApi", + "signOut", error->message); + } +} + +void firebase_auth_firebase_auth_host_api_respond_fetch_sign_in_methods_for_email( + FirebaseAuthFirebaseAuthHostApiResponseHandle* response_handle, + FlValue* return_value) { + g_autoptr( + FirebaseAuthFirebaseAuthHostApiFetchSignInMethodsForEmailResponse) response = + firebase_auth_firebase_auth_host_api_fetch_sign_in_methods_for_email_response_new( + return_value); + g_autoptr(GError) error = nullptr; + if (!fl_basic_message_channel_respond(response_handle->channel, + response_handle->response_handle, + response->value, &error)) { + g_warning("Failed to send response to %s.%s: %s", "FirebaseAuthHostApi", + "fetchSignInMethodsForEmail", error->message); + } +} + +void firebase_auth_firebase_auth_host_api_respond_error_fetch_sign_in_methods_for_email( + FirebaseAuthFirebaseAuthHostApiResponseHandle* response_handle, + const gchar* code, const gchar* message, FlValue* details) { + g_autoptr( + FirebaseAuthFirebaseAuthHostApiFetchSignInMethodsForEmailResponse) response = + firebase_auth_firebase_auth_host_api_fetch_sign_in_methods_for_email_response_new_error( + code, message, details); + g_autoptr(GError) error = nullptr; + if (!fl_basic_message_channel_respond(response_handle->channel, + response_handle->response_handle, + response->value, &error)) { + g_warning("Failed to send response to %s.%s: %s", "FirebaseAuthHostApi", + "fetchSignInMethodsForEmail", error->message); + } +} + +void firebase_auth_firebase_auth_host_api_respond_send_password_reset_email( + FirebaseAuthFirebaseAuthHostApiResponseHandle* response_handle) { + g_autoptr( + FirebaseAuthFirebaseAuthHostApiSendPasswordResetEmailResponse) response = + firebase_auth_firebase_auth_host_api_send_password_reset_email_response_new(); + g_autoptr(GError) error = nullptr; + if (!fl_basic_message_channel_respond(response_handle->channel, + response_handle->response_handle, + response->value, &error)) { + g_warning("Failed to send response to %s.%s: %s", "FirebaseAuthHostApi", + "sendPasswordResetEmail", error->message); + } +} + +void firebase_auth_firebase_auth_host_api_respond_error_send_password_reset_email( + FirebaseAuthFirebaseAuthHostApiResponseHandle* response_handle, + const gchar* code, const gchar* message, FlValue* details) { + g_autoptr( + FirebaseAuthFirebaseAuthHostApiSendPasswordResetEmailResponse) response = + firebase_auth_firebase_auth_host_api_send_password_reset_email_response_new_error( + code, message, details); + g_autoptr(GError) error = nullptr; + if (!fl_basic_message_channel_respond(response_handle->channel, + response_handle->response_handle, + response->value, &error)) { + g_warning("Failed to send response to %s.%s: %s", "FirebaseAuthHostApi", + "sendPasswordResetEmail", error->message); + } +} + +void firebase_auth_firebase_auth_host_api_respond_send_sign_in_link_to_email( + FirebaseAuthFirebaseAuthHostApiResponseHandle* response_handle) { + g_autoptr( + FirebaseAuthFirebaseAuthHostApiSendSignInLinkToEmailResponse) response = + firebase_auth_firebase_auth_host_api_send_sign_in_link_to_email_response_new(); + g_autoptr(GError) error = nullptr; + if (!fl_basic_message_channel_respond(response_handle->channel, + response_handle->response_handle, + response->value, &error)) { + g_warning("Failed to send response to %s.%s: %s", "FirebaseAuthHostApi", + "sendSignInLinkToEmail", error->message); + } +} + +void firebase_auth_firebase_auth_host_api_respond_error_send_sign_in_link_to_email( + FirebaseAuthFirebaseAuthHostApiResponseHandle* response_handle, + const gchar* code, const gchar* message, FlValue* details) { + g_autoptr( + FirebaseAuthFirebaseAuthHostApiSendSignInLinkToEmailResponse) response = + firebase_auth_firebase_auth_host_api_send_sign_in_link_to_email_response_new_error( + code, message, details); + g_autoptr(GError) error = nullptr; + if (!fl_basic_message_channel_respond(response_handle->channel, + response_handle->response_handle, + response->value, &error)) { + g_warning("Failed to send response to %s.%s: %s", "FirebaseAuthHostApi", + "sendSignInLinkToEmail", error->message); + } +} + +void firebase_auth_firebase_auth_host_api_respond_set_language_code( + FirebaseAuthFirebaseAuthHostApiResponseHandle* response_handle, + const gchar* return_value) { + g_autoptr(FirebaseAuthFirebaseAuthHostApiSetLanguageCodeResponse) response = + firebase_auth_firebase_auth_host_api_set_language_code_response_new( + return_value); + g_autoptr(GError) error = nullptr; + if (!fl_basic_message_channel_respond(response_handle->channel, + response_handle->response_handle, + response->value, &error)) { + g_warning("Failed to send response to %s.%s: %s", "FirebaseAuthHostApi", + "setLanguageCode", error->message); + } +} + +void firebase_auth_firebase_auth_host_api_respond_error_set_language_code( + FirebaseAuthFirebaseAuthHostApiResponseHandle* response_handle, + const gchar* code, const gchar* message, FlValue* details) { + g_autoptr(FirebaseAuthFirebaseAuthHostApiSetLanguageCodeResponse) response = + firebase_auth_firebase_auth_host_api_set_language_code_response_new_error( + code, message, details); + g_autoptr(GError) error = nullptr; + if (!fl_basic_message_channel_respond(response_handle->channel, + response_handle->response_handle, + response->value, &error)) { + g_warning("Failed to send response to %s.%s: %s", "FirebaseAuthHostApi", + "setLanguageCode", error->message); + } +} + +void firebase_auth_firebase_auth_host_api_respond_set_settings( + FirebaseAuthFirebaseAuthHostApiResponseHandle* response_handle) { + g_autoptr(FirebaseAuthFirebaseAuthHostApiSetSettingsResponse) response = + firebase_auth_firebase_auth_host_api_set_settings_response_new(); + g_autoptr(GError) error = nullptr; + if (!fl_basic_message_channel_respond(response_handle->channel, + response_handle->response_handle, + response->value, &error)) { + g_warning("Failed to send response to %s.%s: %s", "FirebaseAuthHostApi", + "setSettings", error->message); + } +} + +void firebase_auth_firebase_auth_host_api_respond_error_set_settings( + FirebaseAuthFirebaseAuthHostApiResponseHandle* response_handle, + const gchar* code, const gchar* message, FlValue* details) { + g_autoptr(FirebaseAuthFirebaseAuthHostApiSetSettingsResponse) response = + firebase_auth_firebase_auth_host_api_set_settings_response_new_error( + code, message, details); + g_autoptr(GError) error = nullptr; + if (!fl_basic_message_channel_respond(response_handle->channel, + response_handle->response_handle, + response->value, &error)) { + g_warning("Failed to send response to %s.%s: %s", "FirebaseAuthHostApi", + "setSettings", error->message); + } +} + +void firebase_auth_firebase_auth_host_api_respond_verify_password_reset_code( + FirebaseAuthFirebaseAuthHostApiResponseHandle* response_handle, + const gchar* return_value) { + g_autoptr( + FirebaseAuthFirebaseAuthHostApiVerifyPasswordResetCodeResponse) response = + firebase_auth_firebase_auth_host_api_verify_password_reset_code_response_new( + return_value); + g_autoptr(GError) error = nullptr; + if (!fl_basic_message_channel_respond(response_handle->channel, + response_handle->response_handle, + response->value, &error)) { + g_warning("Failed to send response to %s.%s: %s", "FirebaseAuthHostApi", + "verifyPasswordResetCode", error->message); + } +} + +void firebase_auth_firebase_auth_host_api_respond_error_verify_password_reset_code( + FirebaseAuthFirebaseAuthHostApiResponseHandle* response_handle, + const gchar* code, const gchar* message, FlValue* details) { + g_autoptr( + FirebaseAuthFirebaseAuthHostApiVerifyPasswordResetCodeResponse) response = + firebase_auth_firebase_auth_host_api_verify_password_reset_code_response_new_error( + code, message, details); + g_autoptr(GError) error = nullptr; + if (!fl_basic_message_channel_respond(response_handle->channel, + response_handle->response_handle, + response->value, &error)) { + g_warning("Failed to send response to %s.%s: %s", "FirebaseAuthHostApi", + "verifyPasswordResetCode", error->message); + } +} + +void firebase_auth_firebase_auth_host_api_respond_verify_phone_number( + FirebaseAuthFirebaseAuthHostApiResponseHandle* response_handle, + const gchar* return_value) { + g_autoptr(FirebaseAuthFirebaseAuthHostApiVerifyPhoneNumberResponse) response = + firebase_auth_firebase_auth_host_api_verify_phone_number_response_new( + return_value); + g_autoptr(GError) error = nullptr; + if (!fl_basic_message_channel_respond(response_handle->channel, + response_handle->response_handle, + response->value, &error)) { + g_warning("Failed to send response to %s.%s: %s", "FirebaseAuthHostApi", + "verifyPhoneNumber", error->message); + } +} + +void firebase_auth_firebase_auth_host_api_respond_error_verify_phone_number( + FirebaseAuthFirebaseAuthHostApiResponseHandle* response_handle, + const gchar* code, const gchar* message, FlValue* details) { + g_autoptr(FirebaseAuthFirebaseAuthHostApiVerifyPhoneNumberResponse) response = + firebase_auth_firebase_auth_host_api_verify_phone_number_response_new_error( + code, message, details); + g_autoptr(GError) error = nullptr; + if (!fl_basic_message_channel_respond(response_handle->channel, + response_handle->response_handle, + response->value, &error)) { + g_warning("Failed to send response to %s.%s: %s", "FirebaseAuthHostApi", + "verifyPhoneNumber", error->message); + } +} + +void firebase_auth_firebase_auth_host_api_respond_revoke_token_with_authorization_code( + FirebaseAuthFirebaseAuthHostApiResponseHandle* response_handle) { + g_autoptr( + FirebaseAuthFirebaseAuthHostApiRevokeTokenWithAuthorizationCodeResponse) response = + firebase_auth_firebase_auth_host_api_revoke_token_with_authorization_code_response_new(); + g_autoptr(GError) error = nullptr; + if (!fl_basic_message_channel_respond(response_handle->channel, + response_handle->response_handle, + response->value, &error)) { + g_warning("Failed to send response to %s.%s: %s", "FirebaseAuthHostApi", + "revokeTokenWithAuthorizationCode", error->message); + } +} + +void firebase_auth_firebase_auth_host_api_respond_error_revoke_token_with_authorization_code( + FirebaseAuthFirebaseAuthHostApiResponseHandle* response_handle, + const gchar* code, const gchar* message, FlValue* details) { + g_autoptr( + FirebaseAuthFirebaseAuthHostApiRevokeTokenWithAuthorizationCodeResponse) + response = + firebase_auth_firebase_auth_host_api_revoke_token_with_authorization_code_response_new_error( + code, message, details); + g_autoptr(GError) error = nullptr; + if (!fl_basic_message_channel_respond(response_handle->channel, + response_handle->response_handle, + response->value, &error)) { + g_warning("Failed to send response to %s.%s: %s", "FirebaseAuthHostApi", + "revokeTokenWithAuthorizationCode", error->message); + } +} + +void firebase_auth_firebase_auth_host_api_respond_revoke_access_token( + FirebaseAuthFirebaseAuthHostApiResponseHandle* response_handle) { + g_autoptr(FirebaseAuthFirebaseAuthHostApiRevokeAccessTokenResponse) response = + firebase_auth_firebase_auth_host_api_revoke_access_token_response_new(); + g_autoptr(GError) error = nullptr; + if (!fl_basic_message_channel_respond(response_handle->channel, + response_handle->response_handle, + response->value, &error)) { + g_warning("Failed to send response to %s.%s: %s", "FirebaseAuthHostApi", + "revokeAccessToken", error->message); + } +} + +void firebase_auth_firebase_auth_host_api_respond_error_revoke_access_token( + FirebaseAuthFirebaseAuthHostApiResponseHandle* response_handle, + const gchar* code, const gchar* message, FlValue* details) { + g_autoptr(FirebaseAuthFirebaseAuthHostApiRevokeAccessTokenResponse) response = + firebase_auth_firebase_auth_host_api_revoke_access_token_response_new_error( + code, message, details); + g_autoptr(GError) error = nullptr; + if (!fl_basic_message_channel_respond(response_handle->channel, + response_handle->response_handle, + response->value, &error)) { + g_warning("Failed to send response to %s.%s: %s", "FirebaseAuthHostApi", + "revokeAccessToken", error->message); + } +} + +void firebase_auth_firebase_auth_host_api_respond_initialize_recaptcha_config( + FirebaseAuthFirebaseAuthHostApiResponseHandle* response_handle) { + g_autoptr( + FirebaseAuthFirebaseAuthHostApiInitializeRecaptchaConfigResponse) response = + firebase_auth_firebase_auth_host_api_initialize_recaptcha_config_response_new(); + g_autoptr(GError) error = nullptr; + if (!fl_basic_message_channel_respond(response_handle->channel, + response_handle->response_handle, + response->value, &error)) { + g_warning("Failed to send response to %s.%s: %s", "FirebaseAuthHostApi", + "initializeRecaptchaConfig", error->message); + } +} + +void firebase_auth_firebase_auth_host_api_respond_error_initialize_recaptcha_config( + FirebaseAuthFirebaseAuthHostApiResponseHandle* response_handle, + const gchar* code, const gchar* message, FlValue* details) { + g_autoptr( + FirebaseAuthFirebaseAuthHostApiInitializeRecaptchaConfigResponse) response = + firebase_auth_firebase_auth_host_api_initialize_recaptcha_config_response_new_error( + code, message, details); + g_autoptr(GError) error = nullptr; + if (!fl_basic_message_channel_respond(response_handle->channel, + response_handle->response_handle, + response->value, &error)) { + g_warning("Failed to send response to %s.%s: %s", "FirebaseAuthHostApi", + "initializeRecaptchaConfig", error->message); + } +} + +struct _FirebaseAuthFirebaseAuthUserHostApiResponseHandle { + GObject parent_instance; + + FlBasicMessageChannel* channel; + FlBasicMessageChannelResponseHandle* response_handle; +}; + +G_DEFINE_TYPE(FirebaseAuthFirebaseAuthUserHostApiResponseHandle, + firebase_auth_firebase_auth_user_host_api_response_handle, + G_TYPE_OBJECT) + +static void firebase_auth_firebase_auth_user_host_api_response_handle_dispose( + GObject* object) { + FirebaseAuthFirebaseAuthUserHostApiResponseHandle* self = + FIREBASE_AUTH_FIREBASE_AUTH_USER_HOST_API_RESPONSE_HANDLE(object); + g_clear_object(&self->channel); + g_clear_object(&self->response_handle); + G_OBJECT_CLASS( + firebase_auth_firebase_auth_user_host_api_response_handle_parent_class) + ->dispose(object); +} + +static void firebase_auth_firebase_auth_user_host_api_response_handle_init( + FirebaseAuthFirebaseAuthUserHostApiResponseHandle* self) {} + +static void +firebase_auth_firebase_auth_user_host_api_response_handle_class_init( + FirebaseAuthFirebaseAuthUserHostApiResponseHandleClass* klass) { + G_OBJECT_CLASS(klass)->dispose = + firebase_auth_firebase_auth_user_host_api_response_handle_dispose; +} + +static FirebaseAuthFirebaseAuthUserHostApiResponseHandle* +firebase_auth_firebase_auth_user_host_api_response_handle_new( + FlBasicMessageChannel* channel, + FlBasicMessageChannelResponseHandle* response_handle) { + FirebaseAuthFirebaseAuthUserHostApiResponseHandle* self = + FIREBASE_AUTH_FIREBASE_AUTH_USER_HOST_API_RESPONSE_HANDLE(g_object_new( + firebase_auth_firebase_auth_user_host_api_response_handle_get_type(), + nullptr)); + self->channel = FL_BASIC_MESSAGE_CHANNEL(g_object_ref(channel)); + self->response_handle = + FL_BASIC_MESSAGE_CHANNEL_RESPONSE_HANDLE(g_object_ref(response_handle)); + return self; +} + +G_DECLARE_FINAL_TYPE(FirebaseAuthFirebaseAuthUserHostApiDeleteResponse, + firebase_auth_firebase_auth_user_host_api_delete_response, + FIREBASE_AUTH, FIREBASE_AUTH_USER_HOST_API_DELETE_RESPONSE, + GObject) + +struct _FirebaseAuthFirebaseAuthUserHostApiDeleteResponse { + GObject parent_instance; + + FlValue* value; +}; + +G_DEFINE_TYPE(FirebaseAuthFirebaseAuthUserHostApiDeleteResponse, + firebase_auth_firebase_auth_user_host_api_delete_response, + G_TYPE_OBJECT) + +static void firebase_auth_firebase_auth_user_host_api_delete_response_dispose( + GObject* object) { + FirebaseAuthFirebaseAuthUserHostApiDeleteResponse* self = + FIREBASE_AUTH_FIREBASE_AUTH_USER_HOST_API_DELETE_RESPONSE(object); + g_clear_pointer(&self->value, fl_value_unref); + G_OBJECT_CLASS( + firebase_auth_firebase_auth_user_host_api_delete_response_parent_class) + ->dispose(object); +} + +static void firebase_auth_firebase_auth_user_host_api_delete_response_init( + FirebaseAuthFirebaseAuthUserHostApiDeleteResponse* self) {} + +static void +firebase_auth_firebase_auth_user_host_api_delete_response_class_init( + FirebaseAuthFirebaseAuthUserHostApiDeleteResponseClass* klass) { + G_OBJECT_CLASS(klass)->dispose = + firebase_auth_firebase_auth_user_host_api_delete_response_dispose; +} + +static FirebaseAuthFirebaseAuthUserHostApiDeleteResponse* +firebase_auth_firebase_auth_user_host_api_delete_response_new() { + FirebaseAuthFirebaseAuthUserHostApiDeleteResponse* self = + FIREBASE_AUTH_FIREBASE_AUTH_USER_HOST_API_DELETE_RESPONSE(g_object_new( + firebase_auth_firebase_auth_user_host_api_delete_response_get_type(), + nullptr)); + self->value = fl_value_new_list(); + fl_value_append_take(self->value, fl_value_new_null()); + return self; +} + +static FirebaseAuthFirebaseAuthUserHostApiDeleteResponse* +firebase_auth_firebase_auth_user_host_api_delete_response_new_error( + const gchar* code, const gchar* message, FlValue* details) { + FirebaseAuthFirebaseAuthUserHostApiDeleteResponse* self = + FIREBASE_AUTH_FIREBASE_AUTH_USER_HOST_API_DELETE_RESPONSE(g_object_new( + firebase_auth_firebase_auth_user_host_api_delete_response_get_type(), + nullptr)); + self->value = fl_value_new_list(); + fl_value_append_take(self->value, fl_value_new_string(code)); + fl_value_append_take(self->value, + fl_value_new_string(message != nullptr ? message : "")); + fl_value_append_take(self->value, details != nullptr ? fl_value_ref(details) + : fl_value_new_null()); + return self; +} + +G_DECLARE_FINAL_TYPE( + FirebaseAuthFirebaseAuthUserHostApiGetIdTokenResponse, + firebase_auth_firebase_auth_user_host_api_get_id_token_response, + FIREBASE_AUTH, FIREBASE_AUTH_USER_HOST_API_GET_ID_TOKEN_RESPONSE, GObject) + +struct _FirebaseAuthFirebaseAuthUserHostApiGetIdTokenResponse { + GObject parent_instance; + + FlValue* value; +}; + +G_DEFINE_TYPE(FirebaseAuthFirebaseAuthUserHostApiGetIdTokenResponse, + firebase_auth_firebase_auth_user_host_api_get_id_token_response, + G_TYPE_OBJECT) + +static void +firebase_auth_firebase_auth_user_host_api_get_id_token_response_dispose( + GObject* object) { + FirebaseAuthFirebaseAuthUserHostApiGetIdTokenResponse* self = + FIREBASE_AUTH_FIREBASE_AUTH_USER_HOST_API_GET_ID_TOKEN_RESPONSE(object); + g_clear_pointer(&self->value, fl_value_unref); + G_OBJECT_CLASS( + firebase_auth_firebase_auth_user_host_api_get_id_token_response_parent_class) + ->dispose(object); +} + +static void +firebase_auth_firebase_auth_user_host_api_get_id_token_response_init( + FirebaseAuthFirebaseAuthUserHostApiGetIdTokenResponse* self) {} + +static void +firebase_auth_firebase_auth_user_host_api_get_id_token_response_class_init( + FirebaseAuthFirebaseAuthUserHostApiGetIdTokenResponseClass* klass) { + G_OBJECT_CLASS(klass)->dispose = + firebase_auth_firebase_auth_user_host_api_get_id_token_response_dispose; +} + +static FirebaseAuthFirebaseAuthUserHostApiGetIdTokenResponse* +firebase_auth_firebase_auth_user_host_api_get_id_token_response_new( + FirebaseAuthInternalIdTokenResult* return_value) { + FirebaseAuthFirebaseAuthUserHostApiGetIdTokenResponse* self = + FIREBASE_AUTH_FIREBASE_AUTH_USER_HOST_API_GET_ID_TOKEN_RESPONSE(g_object_new( + firebase_auth_firebase_auth_user_host_api_get_id_token_response_get_type(), + nullptr)); + self->value = fl_value_new_list(); + fl_value_append_take( + self->value, + fl_value_new_custom_object(firebase_auth_internal_id_token_result_type_id, + G_OBJECT(return_value))); + return self; +} + +static FirebaseAuthFirebaseAuthUserHostApiGetIdTokenResponse* +firebase_auth_firebase_auth_user_host_api_get_id_token_response_new_error( + const gchar* code, const gchar* message, FlValue* details) { + FirebaseAuthFirebaseAuthUserHostApiGetIdTokenResponse* self = + FIREBASE_AUTH_FIREBASE_AUTH_USER_HOST_API_GET_ID_TOKEN_RESPONSE(g_object_new( + firebase_auth_firebase_auth_user_host_api_get_id_token_response_get_type(), + nullptr)); + self->value = fl_value_new_list(); + fl_value_append_take(self->value, fl_value_new_string(code)); + fl_value_append_take(self->value, + fl_value_new_string(message != nullptr ? message : "")); + fl_value_append_take(self->value, details != nullptr ? fl_value_ref(details) + : fl_value_new_null()); + return self; +} + +G_DECLARE_FINAL_TYPE( + FirebaseAuthFirebaseAuthUserHostApiLinkWithCredentialResponse, + firebase_auth_firebase_auth_user_host_api_link_with_credential_response, + FIREBASE_AUTH, FIREBASE_AUTH_USER_HOST_API_LINK_WITH_CREDENTIAL_RESPONSE, + GObject) + +struct _FirebaseAuthFirebaseAuthUserHostApiLinkWithCredentialResponse { + GObject parent_instance; + + FlValue* value; +}; + +G_DEFINE_TYPE( + FirebaseAuthFirebaseAuthUserHostApiLinkWithCredentialResponse, + firebase_auth_firebase_auth_user_host_api_link_with_credential_response, + G_TYPE_OBJECT) + +static void +firebase_auth_firebase_auth_user_host_api_link_with_credential_response_dispose( + GObject* object) { + FirebaseAuthFirebaseAuthUserHostApiLinkWithCredentialResponse* self = + FIREBASE_AUTH_FIREBASE_AUTH_USER_HOST_API_LINK_WITH_CREDENTIAL_RESPONSE( + object); + g_clear_pointer(&self->value, fl_value_unref); + G_OBJECT_CLASS( + firebase_auth_firebase_auth_user_host_api_link_with_credential_response_parent_class) + ->dispose(object); +} + +static void +firebase_auth_firebase_auth_user_host_api_link_with_credential_response_init( + FirebaseAuthFirebaseAuthUserHostApiLinkWithCredentialResponse* self) {} + +static void +firebase_auth_firebase_auth_user_host_api_link_with_credential_response_class_init( + FirebaseAuthFirebaseAuthUserHostApiLinkWithCredentialResponseClass* klass) { + G_OBJECT_CLASS(klass)->dispose = + firebase_auth_firebase_auth_user_host_api_link_with_credential_response_dispose; +} + +static FirebaseAuthFirebaseAuthUserHostApiLinkWithCredentialResponse* +firebase_auth_firebase_auth_user_host_api_link_with_credential_response_new( + FirebaseAuthInternalUserCredential* return_value) { + FirebaseAuthFirebaseAuthUserHostApiLinkWithCredentialResponse* self = + FIREBASE_AUTH_FIREBASE_AUTH_USER_HOST_API_LINK_WITH_CREDENTIAL_RESPONSE( + g_object_new( + firebase_auth_firebase_auth_user_host_api_link_with_credential_response_get_type(), + nullptr)); + self->value = fl_value_new_list(); + fl_value_append_take( + self->value, + fl_value_new_custom_object(firebase_auth_internal_user_credential_type_id, + G_OBJECT(return_value))); + return self; +} + +static FirebaseAuthFirebaseAuthUserHostApiLinkWithCredentialResponse* +firebase_auth_firebase_auth_user_host_api_link_with_credential_response_new_error( + const gchar* code, const gchar* message, FlValue* details) { + FirebaseAuthFirebaseAuthUserHostApiLinkWithCredentialResponse* self = + FIREBASE_AUTH_FIREBASE_AUTH_USER_HOST_API_LINK_WITH_CREDENTIAL_RESPONSE( + g_object_new( + firebase_auth_firebase_auth_user_host_api_link_with_credential_response_get_type(), + nullptr)); + self->value = fl_value_new_list(); + fl_value_append_take(self->value, fl_value_new_string(code)); + fl_value_append_take(self->value, + fl_value_new_string(message != nullptr ? message : "")); + fl_value_append_take(self->value, details != nullptr ? fl_value_ref(details) + : fl_value_new_null()); + return self; +} + +G_DECLARE_FINAL_TYPE( + FirebaseAuthFirebaseAuthUserHostApiLinkWithProviderResponse, + firebase_auth_firebase_auth_user_host_api_link_with_provider_response, + FIREBASE_AUTH, FIREBASE_AUTH_USER_HOST_API_LINK_WITH_PROVIDER_RESPONSE, + GObject) + +struct _FirebaseAuthFirebaseAuthUserHostApiLinkWithProviderResponse { + GObject parent_instance; + + FlValue* value; +}; + +G_DEFINE_TYPE( + FirebaseAuthFirebaseAuthUserHostApiLinkWithProviderResponse, + firebase_auth_firebase_auth_user_host_api_link_with_provider_response, + G_TYPE_OBJECT) + +static void +firebase_auth_firebase_auth_user_host_api_link_with_provider_response_dispose( + GObject* object) { + FirebaseAuthFirebaseAuthUserHostApiLinkWithProviderResponse* self = + FIREBASE_AUTH_FIREBASE_AUTH_USER_HOST_API_LINK_WITH_PROVIDER_RESPONSE( + object); + g_clear_pointer(&self->value, fl_value_unref); + G_OBJECT_CLASS( + firebase_auth_firebase_auth_user_host_api_link_with_provider_response_parent_class) + ->dispose(object); +} + +static void +firebase_auth_firebase_auth_user_host_api_link_with_provider_response_init( + FirebaseAuthFirebaseAuthUserHostApiLinkWithProviderResponse* self) {} + +static void +firebase_auth_firebase_auth_user_host_api_link_with_provider_response_class_init( + FirebaseAuthFirebaseAuthUserHostApiLinkWithProviderResponseClass* klass) { + G_OBJECT_CLASS(klass)->dispose = + firebase_auth_firebase_auth_user_host_api_link_with_provider_response_dispose; +} + +static FirebaseAuthFirebaseAuthUserHostApiLinkWithProviderResponse* +firebase_auth_firebase_auth_user_host_api_link_with_provider_response_new( + FirebaseAuthInternalUserCredential* return_value) { + FirebaseAuthFirebaseAuthUserHostApiLinkWithProviderResponse* self = + FIREBASE_AUTH_FIREBASE_AUTH_USER_HOST_API_LINK_WITH_PROVIDER_RESPONSE( + g_object_new( + firebase_auth_firebase_auth_user_host_api_link_with_provider_response_get_type(), + nullptr)); + self->value = fl_value_new_list(); + fl_value_append_take( + self->value, + fl_value_new_custom_object(firebase_auth_internal_user_credential_type_id, + G_OBJECT(return_value))); + return self; +} + +static FirebaseAuthFirebaseAuthUserHostApiLinkWithProviderResponse* +firebase_auth_firebase_auth_user_host_api_link_with_provider_response_new_error( + const gchar* code, const gchar* message, FlValue* details) { + FirebaseAuthFirebaseAuthUserHostApiLinkWithProviderResponse* self = + FIREBASE_AUTH_FIREBASE_AUTH_USER_HOST_API_LINK_WITH_PROVIDER_RESPONSE( + g_object_new( + firebase_auth_firebase_auth_user_host_api_link_with_provider_response_get_type(), + nullptr)); + self->value = fl_value_new_list(); + fl_value_append_take(self->value, fl_value_new_string(code)); + fl_value_append_take(self->value, + fl_value_new_string(message != nullptr ? message : "")); + fl_value_append_take(self->value, details != nullptr ? fl_value_ref(details) + : fl_value_new_null()); + return self; +} + +G_DECLARE_FINAL_TYPE( + FirebaseAuthFirebaseAuthUserHostApiReauthenticateWithCredentialResponse, + firebase_auth_firebase_auth_user_host_api_reauthenticate_with_credential_response, + FIREBASE_AUTH, + FIREBASE_AUTH_USER_HOST_API_REAUTHENTICATE_WITH_CREDENTIAL_RESPONSE, + GObject) + +struct + _FirebaseAuthFirebaseAuthUserHostApiReauthenticateWithCredentialResponse { + GObject parent_instance; + + FlValue* value; +}; + +G_DEFINE_TYPE( + FirebaseAuthFirebaseAuthUserHostApiReauthenticateWithCredentialResponse, + firebase_auth_firebase_auth_user_host_api_reauthenticate_with_credential_response, + G_TYPE_OBJECT) + +static void +firebase_auth_firebase_auth_user_host_api_reauthenticate_with_credential_response_dispose( + GObject* object) { + FirebaseAuthFirebaseAuthUserHostApiReauthenticateWithCredentialResponse* self = + FIREBASE_AUTH_FIREBASE_AUTH_USER_HOST_API_REAUTHENTICATE_WITH_CREDENTIAL_RESPONSE( + object); + g_clear_pointer(&self->value, fl_value_unref); + G_OBJECT_CLASS( + firebase_auth_firebase_auth_user_host_api_reauthenticate_with_credential_response_parent_class) + ->dispose(object); +} + +static void +firebase_auth_firebase_auth_user_host_api_reauthenticate_with_credential_response_init( + FirebaseAuthFirebaseAuthUserHostApiReauthenticateWithCredentialResponse* + self) {} + +static void +firebase_auth_firebase_auth_user_host_api_reauthenticate_with_credential_response_class_init( + FirebaseAuthFirebaseAuthUserHostApiReauthenticateWithCredentialResponseClass* + klass) { + G_OBJECT_CLASS(klass)->dispose = + firebase_auth_firebase_auth_user_host_api_reauthenticate_with_credential_response_dispose; +} + +static FirebaseAuthFirebaseAuthUserHostApiReauthenticateWithCredentialResponse* +firebase_auth_firebase_auth_user_host_api_reauthenticate_with_credential_response_new( + FirebaseAuthInternalUserCredential* return_value) { + FirebaseAuthFirebaseAuthUserHostApiReauthenticateWithCredentialResponse* self = + FIREBASE_AUTH_FIREBASE_AUTH_USER_HOST_API_REAUTHENTICATE_WITH_CREDENTIAL_RESPONSE( + g_object_new( + firebase_auth_firebase_auth_user_host_api_reauthenticate_with_credential_response_get_type(), + nullptr)); + self->value = fl_value_new_list(); + fl_value_append_take( + self->value, + fl_value_new_custom_object(firebase_auth_internal_user_credential_type_id, + G_OBJECT(return_value))); + return self; +} + +static FirebaseAuthFirebaseAuthUserHostApiReauthenticateWithCredentialResponse* +firebase_auth_firebase_auth_user_host_api_reauthenticate_with_credential_response_new_error( + const gchar* code, const gchar* message, FlValue* details) { + FirebaseAuthFirebaseAuthUserHostApiReauthenticateWithCredentialResponse* self = + FIREBASE_AUTH_FIREBASE_AUTH_USER_HOST_API_REAUTHENTICATE_WITH_CREDENTIAL_RESPONSE( + g_object_new( + firebase_auth_firebase_auth_user_host_api_reauthenticate_with_credential_response_get_type(), + nullptr)); + self->value = fl_value_new_list(); + fl_value_append_take(self->value, fl_value_new_string(code)); + fl_value_append_take(self->value, + fl_value_new_string(message != nullptr ? message : "")); + fl_value_append_take(self->value, details != nullptr ? fl_value_ref(details) + : fl_value_new_null()); + return self; +} + +G_DECLARE_FINAL_TYPE( + FirebaseAuthFirebaseAuthUserHostApiReauthenticateWithProviderResponse, + firebase_auth_firebase_auth_user_host_api_reauthenticate_with_provider_response, + FIREBASE_AUTH, + FIREBASE_AUTH_USER_HOST_API_REAUTHENTICATE_WITH_PROVIDER_RESPONSE, GObject) + +struct _FirebaseAuthFirebaseAuthUserHostApiReauthenticateWithProviderResponse { + GObject parent_instance; + + FlValue* value; +}; + +G_DEFINE_TYPE( + FirebaseAuthFirebaseAuthUserHostApiReauthenticateWithProviderResponse, + firebase_auth_firebase_auth_user_host_api_reauthenticate_with_provider_response, + G_TYPE_OBJECT) + +static void +firebase_auth_firebase_auth_user_host_api_reauthenticate_with_provider_response_dispose( + GObject* object) { + FirebaseAuthFirebaseAuthUserHostApiReauthenticateWithProviderResponse* self = + FIREBASE_AUTH_FIREBASE_AUTH_USER_HOST_API_REAUTHENTICATE_WITH_PROVIDER_RESPONSE( + object); + g_clear_pointer(&self->value, fl_value_unref); + G_OBJECT_CLASS( + firebase_auth_firebase_auth_user_host_api_reauthenticate_with_provider_response_parent_class) + ->dispose(object); +} + +static void +firebase_auth_firebase_auth_user_host_api_reauthenticate_with_provider_response_init( + FirebaseAuthFirebaseAuthUserHostApiReauthenticateWithProviderResponse* + self) {} + +static void +firebase_auth_firebase_auth_user_host_api_reauthenticate_with_provider_response_class_init( + FirebaseAuthFirebaseAuthUserHostApiReauthenticateWithProviderResponseClass* + klass) { + G_OBJECT_CLASS(klass)->dispose = + firebase_auth_firebase_auth_user_host_api_reauthenticate_with_provider_response_dispose; +} + +static FirebaseAuthFirebaseAuthUserHostApiReauthenticateWithProviderResponse* +firebase_auth_firebase_auth_user_host_api_reauthenticate_with_provider_response_new( + FirebaseAuthInternalUserCredential* return_value) { + FirebaseAuthFirebaseAuthUserHostApiReauthenticateWithProviderResponse* self = + FIREBASE_AUTH_FIREBASE_AUTH_USER_HOST_API_REAUTHENTICATE_WITH_PROVIDER_RESPONSE( + g_object_new( + firebase_auth_firebase_auth_user_host_api_reauthenticate_with_provider_response_get_type(), + nullptr)); + self->value = fl_value_new_list(); + fl_value_append_take( + self->value, + fl_value_new_custom_object(firebase_auth_internal_user_credential_type_id, + G_OBJECT(return_value))); + return self; +} + +static FirebaseAuthFirebaseAuthUserHostApiReauthenticateWithProviderResponse* +firebase_auth_firebase_auth_user_host_api_reauthenticate_with_provider_response_new_error( + const gchar* code, const gchar* message, FlValue* details) { + FirebaseAuthFirebaseAuthUserHostApiReauthenticateWithProviderResponse* self = + FIREBASE_AUTH_FIREBASE_AUTH_USER_HOST_API_REAUTHENTICATE_WITH_PROVIDER_RESPONSE( + g_object_new( + firebase_auth_firebase_auth_user_host_api_reauthenticate_with_provider_response_get_type(), + nullptr)); + self->value = fl_value_new_list(); + fl_value_append_take(self->value, fl_value_new_string(code)); + fl_value_append_take(self->value, + fl_value_new_string(message != nullptr ? message : "")); + fl_value_append_take(self->value, details != nullptr ? fl_value_ref(details) + : fl_value_new_null()); + return self; +} + +G_DECLARE_FINAL_TYPE(FirebaseAuthFirebaseAuthUserHostApiReloadResponse, + firebase_auth_firebase_auth_user_host_api_reload_response, + FIREBASE_AUTH, FIREBASE_AUTH_USER_HOST_API_RELOAD_RESPONSE, + GObject) + +struct _FirebaseAuthFirebaseAuthUserHostApiReloadResponse { + GObject parent_instance; + + FlValue* value; +}; + +G_DEFINE_TYPE(FirebaseAuthFirebaseAuthUserHostApiReloadResponse, + firebase_auth_firebase_auth_user_host_api_reload_response, + G_TYPE_OBJECT) + +static void firebase_auth_firebase_auth_user_host_api_reload_response_dispose( + GObject* object) { + FirebaseAuthFirebaseAuthUserHostApiReloadResponse* self = + FIREBASE_AUTH_FIREBASE_AUTH_USER_HOST_API_RELOAD_RESPONSE(object); + g_clear_pointer(&self->value, fl_value_unref); + G_OBJECT_CLASS( + firebase_auth_firebase_auth_user_host_api_reload_response_parent_class) + ->dispose(object); +} + +static void firebase_auth_firebase_auth_user_host_api_reload_response_init( + FirebaseAuthFirebaseAuthUserHostApiReloadResponse* self) {} + +static void +firebase_auth_firebase_auth_user_host_api_reload_response_class_init( + FirebaseAuthFirebaseAuthUserHostApiReloadResponseClass* klass) { + G_OBJECT_CLASS(klass)->dispose = + firebase_auth_firebase_auth_user_host_api_reload_response_dispose; +} + +static FirebaseAuthFirebaseAuthUserHostApiReloadResponse* +firebase_auth_firebase_auth_user_host_api_reload_response_new( + FirebaseAuthInternalUserDetails* return_value) { + FirebaseAuthFirebaseAuthUserHostApiReloadResponse* self = + FIREBASE_AUTH_FIREBASE_AUTH_USER_HOST_API_RELOAD_RESPONSE(g_object_new( + firebase_auth_firebase_auth_user_host_api_reload_response_get_type(), + nullptr)); + self->value = fl_value_new_list(); + fl_value_append_take( + self->value, + fl_value_new_custom_object(firebase_auth_internal_user_details_type_id, + G_OBJECT(return_value))); + return self; +} + +static FirebaseAuthFirebaseAuthUserHostApiReloadResponse* +firebase_auth_firebase_auth_user_host_api_reload_response_new_error( + const gchar* code, const gchar* message, FlValue* details) { + FirebaseAuthFirebaseAuthUserHostApiReloadResponse* self = + FIREBASE_AUTH_FIREBASE_AUTH_USER_HOST_API_RELOAD_RESPONSE(g_object_new( + firebase_auth_firebase_auth_user_host_api_reload_response_get_type(), + nullptr)); + self->value = fl_value_new_list(); + fl_value_append_take(self->value, fl_value_new_string(code)); + fl_value_append_take(self->value, + fl_value_new_string(message != nullptr ? message : "")); + fl_value_append_take(self->value, details != nullptr ? fl_value_ref(details) + : fl_value_new_null()); + return self; +} + +G_DECLARE_FINAL_TYPE( + FirebaseAuthFirebaseAuthUserHostApiSendEmailVerificationResponse, + firebase_auth_firebase_auth_user_host_api_send_email_verification_response, + FIREBASE_AUTH, FIREBASE_AUTH_USER_HOST_API_SEND_EMAIL_VERIFICATION_RESPONSE, + GObject) + +struct _FirebaseAuthFirebaseAuthUserHostApiSendEmailVerificationResponse { + GObject parent_instance; + + FlValue* value; +}; + +G_DEFINE_TYPE( + FirebaseAuthFirebaseAuthUserHostApiSendEmailVerificationResponse, + firebase_auth_firebase_auth_user_host_api_send_email_verification_response, + G_TYPE_OBJECT) + +static void +firebase_auth_firebase_auth_user_host_api_send_email_verification_response_dispose( + GObject* object) { + FirebaseAuthFirebaseAuthUserHostApiSendEmailVerificationResponse* self = + FIREBASE_AUTH_FIREBASE_AUTH_USER_HOST_API_SEND_EMAIL_VERIFICATION_RESPONSE( + object); + g_clear_pointer(&self->value, fl_value_unref); + G_OBJECT_CLASS( + firebase_auth_firebase_auth_user_host_api_send_email_verification_response_parent_class) + ->dispose(object); +} + +static void +firebase_auth_firebase_auth_user_host_api_send_email_verification_response_init( + FirebaseAuthFirebaseAuthUserHostApiSendEmailVerificationResponse* self) {} + +static void +firebase_auth_firebase_auth_user_host_api_send_email_verification_response_class_init( + FirebaseAuthFirebaseAuthUserHostApiSendEmailVerificationResponseClass* + klass) { + G_OBJECT_CLASS(klass)->dispose = + firebase_auth_firebase_auth_user_host_api_send_email_verification_response_dispose; +} + +static FirebaseAuthFirebaseAuthUserHostApiSendEmailVerificationResponse* +firebase_auth_firebase_auth_user_host_api_send_email_verification_response_new() { + FirebaseAuthFirebaseAuthUserHostApiSendEmailVerificationResponse* self = + FIREBASE_AUTH_FIREBASE_AUTH_USER_HOST_API_SEND_EMAIL_VERIFICATION_RESPONSE( + g_object_new( + firebase_auth_firebase_auth_user_host_api_send_email_verification_response_get_type(), + nullptr)); + self->value = fl_value_new_list(); + fl_value_append_take(self->value, fl_value_new_null()); + return self; +} + +static FirebaseAuthFirebaseAuthUserHostApiSendEmailVerificationResponse* +firebase_auth_firebase_auth_user_host_api_send_email_verification_response_new_error( + const gchar* code, const gchar* message, FlValue* details) { + FirebaseAuthFirebaseAuthUserHostApiSendEmailVerificationResponse* self = + FIREBASE_AUTH_FIREBASE_AUTH_USER_HOST_API_SEND_EMAIL_VERIFICATION_RESPONSE( + g_object_new( + firebase_auth_firebase_auth_user_host_api_send_email_verification_response_get_type(), + nullptr)); + self->value = fl_value_new_list(); + fl_value_append_take(self->value, fl_value_new_string(code)); + fl_value_append_take(self->value, + fl_value_new_string(message != nullptr ? message : "")); + fl_value_append_take(self->value, details != nullptr ? fl_value_ref(details) + : fl_value_new_null()); + return self; +} + +G_DECLARE_FINAL_TYPE(FirebaseAuthFirebaseAuthUserHostApiUnlinkResponse, + firebase_auth_firebase_auth_user_host_api_unlink_response, + FIREBASE_AUTH, FIREBASE_AUTH_USER_HOST_API_UNLINK_RESPONSE, + GObject) + +struct _FirebaseAuthFirebaseAuthUserHostApiUnlinkResponse { + GObject parent_instance; + + FlValue* value; +}; + +G_DEFINE_TYPE(FirebaseAuthFirebaseAuthUserHostApiUnlinkResponse, + firebase_auth_firebase_auth_user_host_api_unlink_response, + G_TYPE_OBJECT) + +static void firebase_auth_firebase_auth_user_host_api_unlink_response_dispose( + GObject* object) { + FirebaseAuthFirebaseAuthUserHostApiUnlinkResponse* self = + FIREBASE_AUTH_FIREBASE_AUTH_USER_HOST_API_UNLINK_RESPONSE(object); + g_clear_pointer(&self->value, fl_value_unref); + G_OBJECT_CLASS( + firebase_auth_firebase_auth_user_host_api_unlink_response_parent_class) + ->dispose(object); +} + +static void firebase_auth_firebase_auth_user_host_api_unlink_response_init( + FirebaseAuthFirebaseAuthUserHostApiUnlinkResponse* self) {} + +static void +firebase_auth_firebase_auth_user_host_api_unlink_response_class_init( + FirebaseAuthFirebaseAuthUserHostApiUnlinkResponseClass* klass) { + G_OBJECT_CLASS(klass)->dispose = + firebase_auth_firebase_auth_user_host_api_unlink_response_dispose; +} + +static FirebaseAuthFirebaseAuthUserHostApiUnlinkResponse* +firebase_auth_firebase_auth_user_host_api_unlink_response_new( + FirebaseAuthInternalUserCredential* return_value) { + FirebaseAuthFirebaseAuthUserHostApiUnlinkResponse* self = + FIREBASE_AUTH_FIREBASE_AUTH_USER_HOST_API_UNLINK_RESPONSE(g_object_new( + firebase_auth_firebase_auth_user_host_api_unlink_response_get_type(), + nullptr)); + self->value = fl_value_new_list(); + fl_value_append_take( + self->value, + fl_value_new_custom_object(firebase_auth_internal_user_credential_type_id, + G_OBJECT(return_value))); + return self; +} + +static FirebaseAuthFirebaseAuthUserHostApiUnlinkResponse* +firebase_auth_firebase_auth_user_host_api_unlink_response_new_error( + const gchar* code, const gchar* message, FlValue* details) { + FirebaseAuthFirebaseAuthUserHostApiUnlinkResponse* self = + FIREBASE_AUTH_FIREBASE_AUTH_USER_HOST_API_UNLINK_RESPONSE(g_object_new( + firebase_auth_firebase_auth_user_host_api_unlink_response_get_type(), + nullptr)); + self->value = fl_value_new_list(); + fl_value_append_take(self->value, fl_value_new_string(code)); + fl_value_append_take(self->value, + fl_value_new_string(message != nullptr ? message : "")); + fl_value_append_take(self->value, details != nullptr ? fl_value_ref(details) + : fl_value_new_null()); + return self; +} + +G_DECLARE_FINAL_TYPE( + FirebaseAuthFirebaseAuthUserHostApiUpdateEmailResponse, + firebase_auth_firebase_auth_user_host_api_update_email_response, + FIREBASE_AUTH, FIREBASE_AUTH_USER_HOST_API_UPDATE_EMAIL_RESPONSE, GObject) + +struct _FirebaseAuthFirebaseAuthUserHostApiUpdateEmailResponse { + GObject parent_instance; + + FlValue* value; +}; + +G_DEFINE_TYPE(FirebaseAuthFirebaseAuthUserHostApiUpdateEmailResponse, + firebase_auth_firebase_auth_user_host_api_update_email_response, + G_TYPE_OBJECT) + +static void +firebase_auth_firebase_auth_user_host_api_update_email_response_dispose( + GObject* object) { + FirebaseAuthFirebaseAuthUserHostApiUpdateEmailResponse* self = + FIREBASE_AUTH_FIREBASE_AUTH_USER_HOST_API_UPDATE_EMAIL_RESPONSE(object); + g_clear_pointer(&self->value, fl_value_unref); + G_OBJECT_CLASS( + firebase_auth_firebase_auth_user_host_api_update_email_response_parent_class) + ->dispose(object); +} + +static void +firebase_auth_firebase_auth_user_host_api_update_email_response_init( + FirebaseAuthFirebaseAuthUserHostApiUpdateEmailResponse* self) {} + +static void +firebase_auth_firebase_auth_user_host_api_update_email_response_class_init( + FirebaseAuthFirebaseAuthUserHostApiUpdateEmailResponseClass* klass) { + G_OBJECT_CLASS(klass)->dispose = + firebase_auth_firebase_auth_user_host_api_update_email_response_dispose; +} + +static FirebaseAuthFirebaseAuthUserHostApiUpdateEmailResponse* +firebase_auth_firebase_auth_user_host_api_update_email_response_new( + FirebaseAuthInternalUserDetails* return_value) { + FirebaseAuthFirebaseAuthUserHostApiUpdateEmailResponse* self = + FIREBASE_AUTH_FIREBASE_AUTH_USER_HOST_API_UPDATE_EMAIL_RESPONSE(g_object_new( + firebase_auth_firebase_auth_user_host_api_update_email_response_get_type(), + nullptr)); + self->value = fl_value_new_list(); + fl_value_append_take( + self->value, + fl_value_new_custom_object(firebase_auth_internal_user_details_type_id, + G_OBJECT(return_value))); + return self; +} + +static FirebaseAuthFirebaseAuthUserHostApiUpdateEmailResponse* +firebase_auth_firebase_auth_user_host_api_update_email_response_new_error( + const gchar* code, const gchar* message, FlValue* details) { + FirebaseAuthFirebaseAuthUserHostApiUpdateEmailResponse* self = + FIREBASE_AUTH_FIREBASE_AUTH_USER_HOST_API_UPDATE_EMAIL_RESPONSE(g_object_new( + firebase_auth_firebase_auth_user_host_api_update_email_response_get_type(), + nullptr)); + self->value = fl_value_new_list(); + fl_value_append_take(self->value, fl_value_new_string(code)); + fl_value_append_take(self->value, + fl_value_new_string(message != nullptr ? message : "")); + fl_value_append_take(self->value, details != nullptr ? fl_value_ref(details) + : fl_value_new_null()); + return self; +} + +G_DECLARE_FINAL_TYPE( + FirebaseAuthFirebaseAuthUserHostApiUpdatePasswordResponse, + firebase_auth_firebase_auth_user_host_api_update_password_response, + FIREBASE_AUTH, FIREBASE_AUTH_USER_HOST_API_UPDATE_PASSWORD_RESPONSE, + GObject) + +struct _FirebaseAuthFirebaseAuthUserHostApiUpdatePasswordResponse { + GObject parent_instance; + + FlValue* value; +}; + +G_DEFINE_TYPE( + FirebaseAuthFirebaseAuthUserHostApiUpdatePasswordResponse, + firebase_auth_firebase_auth_user_host_api_update_password_response, + G_TYPE_OBJECT) + +static void +firebase_auth_firebase_auth_user_host_api_update_password_response_dispose( + GObject* object) { + FirebaseAuthFirebaseAuthUserHostApiUpdatePasswordResponse* self = + FIREBASE_AUTH_FIREBASE_AUTH_USER_HOST_API_UPDATE_PASSWORD_RESPONSE( + object); + g_clear_pointer(&self->value, fl_value_unref); + G_OBJECT_CLASS( + firebase_auth_firebase_auth_user_host_api_update_password_response_parent_class) + ->dispose(object); +} + +static void +firebase_auth_firebase_auth_user_host_api_update_password_response_init( + FirebaseAuthFirebaseAuthUserHostApiUpdatePasswordResponse* self) {} + +static void +firebase_auth_firebase_auth_user_host_api_update_password_response_class_init( + FirebaseAuthFirebaseAuthUserHostApiUpdatePasswordResponseClass* klass) { + G_OBJECT_CLASS(klass)->dispose = + firebase_auth_firebase_auth_user_host_api_update_password_response_dispose; +} + +static FirebaseAuthFirebaseAuthUserHostApiUpdatePasswordResponse* +firebase_auth_firebase_auth_user_host_api_update_password_response_new( + FirebaseAuthInternalUserDetails* return_value) { + FirebaseAuthFirebaseAuthUserHostApiUpdatePasswordResponse* self = + FIREBASE_AUTH_FIREBASE_AUTH_USER_HOST_API_UPDATE_PASSWORD_RESPONSE(g_object_new( + firebase_auth_firebase_auth_user_host_api_update_password_response_get_type(), + nullptr)); + self->value = fl_value_new_list(); + fl_value_append_take( + self->value, + fl_value_new_custom_object(firebase_auth_internal_user_details_type_id, + G_OBJECT(return_value))); + return self; +} + +static FirebaseAuthFirebaseAuthUserHostApiUpdatePasswordResponse* +firebase_auth_firebase_auth_user_host_api_update_password_response_new_error( + const gchar* code, const gchar* message, FlValue* details) { + FirebaseAuthFirebaseAuthUserHostApiUpdatePasswordResponse* self = + FIREBASE_AUTH_FIREBASE_AUTH_USER_HOST_API_UPDATE_PASSWORD_RESPONSE(g_object_new( + firebase_auth_firebase_auth_user_host_api_update_password_response_get_type(), + nullptr)); + self->value = fl_value_new_list(); + fl_value_append_take(self->value, fl_value_new_string(code)); + fl_value_append_take(self->value, + fl_value_new_string(message != nullptr ? message : "")); + fl_value_append_take(self->value, details != nullptr ? fl_value_ref(details) + : fl_value_new_null()); + return self; +} + +G_DECLARE_FINAL_TYPE( + FirebaseAuthFirebaseAuthUserHostApiUpdatePhoneNumberResponse, + firebase_auth_firebase_auth_user_host_api_update_phone_number_response, + FIREBASE_AUTH, FIREBASE_AUTH_USER_HOST_API_UPDATE_PHONE_NUMBER_RESPONSE, + GObject) + +struct _FirebaseAuthFirebaseAuthUserHostApiUpdatePhoneNumberResponse { + GObject parent_instance; + + FlValue* value; +}; + +G_DEFINE_TYPE( + FirebaseAuthFirebaseAuthUserHostApiUpdatePhoneNumberResponse, + firebase_auth_firebase_auth_user_host_api_update_phone_number_response, + G_TYPE_OBJECT) + +static void +firebase_auth_firebase_auth_user_host_api_update_phone_number_response_dispose( + GObject* object) { + FirebaseAuthFirebaseAuthUserHostApiUpdatePhoneNumberResponse* self = + FIREBASE_AUTH_FIREBASE_AUTH_USER_HOST_API_UPDATE_PHONE_NUMBER_RESPONSE( + object); + g_clear_pointer(&self->value, fl_value_unref); + G_OBJECT_CLASS( + firebase_auth_firebase_auth_user_host_api_update_phone_number_response_parent_class) + ->dispose(object); +} + +static void +firebase_auth_firebase_auth_user_host_api_update_phone_number_response_init( + FirebaseAuthFirebaseAuthUserHostApiUpdatePhoneNumberResponse* self) {} + +static void +firebase_auth_firebase_auth_user_host_api_update_phone_number_response_class_init( + FirebaseAuthFirebaseAuthUserHostApiUpdatePhoneNumberResponseClass* klass) { + G_OBJECT_CLASS(klass)->dispose = + firebase_auth_firebase_auth_user_host_api_update_phone_number_response_dispose; +} + +static FirebaseAuthFirebaseAuthUserHostApiUpdatePhoneNumberResponse* +firebase_auth_firebase_auth_user_host_api_update_phone_number_response_new( + FirebaseAuthInternalUserDetails* return_value) { + FirebaseAuthFirebaseAuthUserHostApiUpdatePhoneNumberResponse* self = + FIREBASE_AUTH_FIREBASE_AUTH_USER_HOST_API_UPDATE_PHONE_NUMBER_RESPONSE( + g_object_new( + firebase_auth_firebase_auth_user_host_api_update_phone_number_response_get_type(), + nullptr)); + self->value = fl_value_new_list(); + fl_value_append_take( + self->value, + fl_value_new_custom_object(firebase_auth_internal_user_details_type_id, + G_OBJECT(return_value))); + return self; +} + +static FirebaseAuthFirebaseAuthUserHostApiUpdatePhoneNumberResponse* +firebase_auth_firebase_auth_user_host_api_update_phone_number_response_new_error( + const gchar* code, const gchar* message, FlValue* details) { + FirebaseAuthFirebaseAuthUserHostApiUpdatePhoneNumberResponse* self = + FIREBASE_AUTH_FIREBASE_AUTH_USER_HOST_API_UPDATE_PHONE_NUMBER_RESPONSE( + g_object_new( + firebase_auth_firebase_auth_user_host_api_update_phone_number_response_get_type(), + nullptr)); + self->value = fl_value_new_list(); + fl_value_append_take(self->value, fl_value_new_string(code)); + fl_value_append_take(self->value, + fl_value_new_string(message != nullptr ? message : "")); + fl_value_append_take(self->value, details != nullptr ? fl_value_ref(details) + : fl_value_new_null()); + return self; +} + +G_DECLARE_FINAL_TYPE( + FirebaseAuthFirebaseAuthUserHostApiUpdateProfileResponse, + firebase_auth_firebase_auth_user_host_api_update_profile_response, + FIREBASE_AUTH, FIREBASE_AUTH_USER_HOST_API_UPDATE_PROFILE_RESPONSE, GObject) + +struct _FirebaseAuthFirebaseAuthUserHostApiUpdateProfileResponse { + GObject parent_instance; + + FlValue* value; +}; + +G_DEFINE_TYPE(FirebaseAuthFirebaseAuthUserHostApiUpdateProfileResponse, + firebase_auth_firebase_auth_user_host_api_update_profile_response, + G_TYPE_OBJECT) + +static void +firebase_auth_firebase_auth_user_host_api_update_profile_response_dispose( + GObject* object) { + FirebaseAuthFirebaseAuthUserHostApiUpdateProfileResponse* self = + FIREBASE_AUTH_FIREBASE_AUTH_USER_HOST_API_UPDATE_PROFILE_RESPONSE(object); + g_clear_pointer(&self->value, fl_value_unref); + G_OBJECT_CLASS( + firebase_auth_firebase_auth_user_host_api_update_profile_response_parent_class) + ->dispose(object); +} + +static void +firebase_auth_firebase_auth_user_host_api_update_profile_response_init( + FirebaseAuthFirebaseAuthUserHostApiUpdateProfileResponse* self) {} + +static void +firebase_auth_firebase_auth_user_host_api_update_profile_response_class_init( + FirebaseAuthFirebaseAuthUserHostApiUpdateProfileResponseClass* klass) { + G_OBJECT_CLASS(klass)->dispose = + firebase_auth_firebase_auth_user_host_api_update_profile_response_dispose; +} + +static FirebaseAuthFirebaseAuthUserHostApiUpdateProfileResponse* +firebase_auth_firebase_auth_user_host_api_update_profile_response_new( + FirebaseAuthInternalUserDetails* return_value) { + FirebaseAuthFirebaseAuthUserHostApiUpdateProfileResponse* self = + FIREBASE_AUTH_FIREBASE_AUTH_USER_HOST_API_UPDATE_PROFILE_RESPONSE(g_object_new( + firebase_auth_firebase_auth_user_host_api_update_profile_response_get_type(), + nullptr)); + self->value = fl_value_new_list(); + fl_value_append_take( + self->value, + fl_value_new_custom_object(firebase_auth_internal_user_details_type_id, + G_OBJECT(return_value))); + return self; +} + +static FirebaseAuthFirebaseAuthUserHostApiUpdateProfileResponse* +firebase_auth_firebase_auth_user_host_api_update_profile_response_new_error( + const gchar* code, const gchar* message, FlValue* details) { + FirebaseAuthFirebaseAuthUserHostApiUpdateProfileResponse* self = + FIREBASE_AUTH_FIREBASE_AUTH_USER_HOST_API_UPDATE_PROFILE_RESPONSE(g_object_new( + firebase_auth_firebase_auth_user_host_api_update_profile_response_get_type(), + nullptr)); + self->value = fl_value_new_list(); + fl_value_append_take(self->value, fl_value_new_string(code)); + fl_value_append_take(self->value, + fl_value_new_string(message != nullptr ? message : "")); + fl_value_append_take(self->value, details != nullptr ? fl_value_ref(details) + : fl_value_new_null()); + return self; +} + +G_DECLARE_FINAL_TYPE( + FirebaseAuthFirebaseAuthUserHostApiVerifyBeforeUpdateEmailResponse, + firebase_auth_firebase_auth_user_host_api_verify_before_update_email_response, + FIREBASE_AUTH, + FIREBASE_AUTH_USER_HOST_API_VERIFY_BEFORE_UPDATE_EMAIL_RESPONSE, GObject) + +struct _FirebaseAuthFirebaseAuthUserHostApiVerifyBeforeUpdateEmailResponse { + GObject parent_instance; + + FlValue* value; +}; + +G_DEFINE_TYPE( + FirebaseAuthFirebaseAuthUserHostApiVerifyBeforeUpdateEmailResponse, + firebase_auth_firebase_auth_user_host_api_verify_before_update_email_response, + G_TYPE_OBJECT) + +static void +firebase_auth_firebase_auth_user_host_api_verify_before_update_email_response_dispose( + GObject* object) { + FirebaseAuthFirebaseAuthUserHostApiVerifyBeforeUpdateEmailResponse* self = + FIREBASE_AUTH_FIREBASE_AUTH_USER_HOST_API_VERIFY_BEFORE_UPDATE_EMAIL_RESPONSE( + object); + g_clear_pointer(&self->value, fl_value_unref); + G_OBJECT_CLASS( + firebase_auth_firebase_auth_user_host_api_verify_before_update_email_response_parent_class) + ->dispose(object); +} + +static void +firebase_auth_firebase_auth_user_host_api_verify_before_update_email_response_init( + FirebaseAuthFirebaseAuthUserHostApiVerifyBeforeUpdateEmailResponse* self) {} + +static void +firebase_auth_firebase_auth_user_host_api_verify_before_update_email_response_class_init( + FirebaseAuthFirebaseAuthUserHostApiVerifyBeforeUpdateEmailResponseClass* + klass) { + G_OBJECT_CLASS(klass)->dispose = + firebase_auth_firebase_auth_user_host_api_verify_before_update_email_response_dispose; +} + +static FirebaseAuthFirebaseAuthUserHostApiVerifyBeforeUpdateEmailResponse* +firebase_auth_firebase_auth_user_host_api_verify_before_update_email_response_new() { + FirebaseAuthFirebaseAuthUserHostApiVerifyBeforeUpdateEmailResponse* self = + FIREBASE_AUTH_FIREBASE_AUTH_USER_HOST_API_VERIFY_BEFORE_UPDATE_EMAIL_RESPONSE( + g_object_new( + firebase_auth_firebase_auth_user_host_api_verify_before_update_email_response_get_type(), + nullptr)); + self->value = fl_value_new_list(); + fl_value_append_take(self->value, fl_value_new_null()); + return self; +} + +static FirebaseAuthFirebaseAuthUserHostApiVerifyBeforeUpdateEmailResponse* +firebase_auth_firebase_auth_user_host_api_verify_before_update_email_response_new_error( + const gchar* code, const gchar* message, FlValue* details) { + FirebaseAuthFirebaseAuthUserHostApiVerifyBeforeUpdateEmailResponse* self = + FIREBASE_AUTH_FIREBASE_AUTH_USER_HOST_API_VERIFY_BEFORE_UPDATE_EMAIL_RESPONSE( + g_object_new( + firebase_auth_firebase_auth_user_host_api_verify_before_update_email_response_get_type(), + nullptr)); + self->value = fl_value_new_list(); + fl_value_append_take(self->value, fl_value_new_string(code)); + fl_value_append_take(self->value, + fl_value_new_string(message != nullptr ? message : "")); + fl_value_append_take(self->value, details != nullptr ? fl_value_ref(details) + : fl_value_new_null()); + return self; +} + +struct _FirebaseAuthFirebaseAuthUserHostApi { + GObject parent_instance; + + const FirebaseAuthFirebaseAuthUserHostApiVTable* vtable; + gpointer user_data; + GDestroyNotify user_data_free_func; +}; + +G_DEFINE_TYPE(FirebaseAuthFirebaseAuthUserHostApi, + firebase_auth_firebase_auth_user_host_api, G_TYPE_OBJECT) + +static void firebase_auth_firebase_auth_user_host_api_dispose(GObject* object) { + FirebaseAuthFirebaseAuthUserHostApi* self = + FIREBASE_AUTH_FIREBASE_AUTH_USER_HOST_API(object); + if (self->user_data != nullptr) { + self->user_data_free_func(self->user_data); + } + self->user_data = nullptr; + G_OBJECT_CLASS(firebase_auth_firebase_auth_user_host_api_parent_class) + ->dispose(object); +} + +static void firebase_auth_firebase_auth_user_host_api_init( + FirebaseAuthFirebaseAuthUserHostApi* self) {} + +static void firebase_auth_firebase_auth_user_host_api_class_init( + FirebaseAuthFirebaseAuthUserHostApiClass* klass) { + G_OBJECT_CLASS(klass)->dispose = + firebase_auth_firebase_auth_user_host_api_dispose; +} + +static FirebaseAuthFirebaseAuthUserHostApi* +firebase_auth_firebase_auth_user_host_api_new( + const FirebaseAuthFirebaseAuthUserHostApiVTable* vtable, gpointer user_data, + GDestroyNotify user_data_free_func) { + FirebaseAuthFirebaseAuthUserHostApi* self = + FIREBASE_AUTH_FIREBASE_AUTH_USER_HOST_API(g_object_new( + firebase_auth_firebase_auth_user_host_api_get_type(), nullptr)); + self->vtable = vtable; + self->user_data = user_data; + self->user_data_free_func = user_data_free_func; + return self; +} + +static void firebase_auth_firebase_auth_user_host_api_delete_cb( + FlBasicMessageChannel* channel, FlValue* message_, + FlBasicMessageChannelResponseHandle* response_handle, gpointer user_data) { + FirebaseAuthFirebaseAuthUserHostApi* self = + FIREBASE_AUTH_FIREBASE_AUTH_USER_HOST_API(user_data); + + if (self->vtable == nullptr || self->vtable->delete_ == nullptr) { + return; + } + + FlValue* value0 = fl_value_get_list_value(message_, 0); + FirebaseAuthAuthPigeonFirebaseApp* app = + FIREBASE_AUTH_AUTH_PIGEON_FIREBASE_APP( + fl_value_get_custom_value_object(value0)); + g_autoptr(FirebaseAuthFirebaseAuthUserHostApiResponseHandle) handle = + firebase_auth_firebase_auth_user_host_api_response_handle_new( + channel, response_handle); + self->vtable->delete_(app, handle, self->user_data); +} + +static void firebase_auth_firebase_auth_user_host_api_get_id_token_cb( + FlBasicMessageChannel* channel, FlValue* message_, + FlBasicMessageChannelResponseHandle* response_handle, gpointer user_data) { + FirebaseAuthFirebaseAuthUserHostApi* self = + FIREBASE_AUTH_FIREBASE_AUTH_USER_HOST_API(user_data); + + if (self->vtable == nullptr || self->vtable->get_id_token == nullptr) { + return; + } + + FlValue* value0 = fl_value_get_list_value(message_, 0); + FirebaseAuthAuthPigeonFirebaseApp* app = + FIREBASE_AUTH_AUTH_PIGEON_FIREBASE_APP( + fl_value_get_custom_value_object(value0)); + FlValue* value1 = fl_value_get_list_value(message_, 1); + gboolean force_refresh = fl_value_get_bool(value1); + g_autoptr(FirebaseAuthFirebaseAuthUserHostApiResponseHandle) handle = + firebase_auth_firebase_auth_user_host_api_response_handle_new( + channel, response_handle); + self->vtable->get_id_token(app, force_refresh, handle, self->user_data); +} + +static void firebase_auth_firebase_auth_user_host_api_link_with_credential_cb( + FlBasicMessageChannel* channel, FlValue* message_, + FlBasicMessageChannelResponseHandle* response_handle, gpointer user_data) { + FirebaseAuthFirebaseAuthUserHostApi* self = + FIREBASE_AUTH_FIREBASE_AUTH_USER_HOST_API(user_data); + + if (self->vtable == nullptr || + self->vtable->link_with_credential == nullptr) { + return; + } + + FlValue* value0 = fl_value_get_list_value(message_, 0); + FirebaseAuthAuthPigeonFirebaseApp* app = + FIREBASE_AUTH_AUTH_PIGEON_FIREBASE_APP( + fl_value_get_custom_value_object(value0)); + FlValue* value1 = fl_value_get_list_value(message_, 1); + FlValue* input = value1; + g_autoptr(FirebaseAuthFirebaseAuthUserHostApiResponseHandle) handle = + firebase_auth_firebase_auth_user_host_api_response_handle_new( + channel, response_handle); + self->vtable->link_with_credential(app, input, handle, self->user_data); +} + +static void firebase_auth_firebase_auth_user_host_api_link_with_provider_cb( + FlBasicMessageChannel* channel, FlValue* message_, + FlBasicMessageChannelResponseHandle* response_handle, gpointer user_data) { + FirebaseAuthFirebaseAuthUserHostApi* self = + FIREBASE_AUTH_FIREBASE_AUTH_USER_HOST_API(user_data); + + if (self->vtable == nullptr || self->vtable->link_with_provider == nullptr) { + return; + } + + FlValue* value0 = fl_value_get_list_value(message_, 0); + FirebaseAuthAuthPigeonFirebaseApp* app = + FIREBASE_AUTH_AUTH_PIGEON_FIREBASE_APP( + fl_value_get_custom_value_object(value0)); + FlValue* value1 = fl_value_get_list_value(message_, 1); + FirebaseAuthInternalSignInProvider* sign_in_provider = + FIREBASE_AUTH_INTERNAL_SIGN_IN_PROVIDER( + fl_value_get_custom_value_object(value1)); + g_autoptr(FirebaseAuthFirebaseAuthUserHostApiResponseHandle) handle = + firebase_auth_firebase_auth_user_host_api_response_handle_new( + channel, response_handle); + self->vtable->link_with_provider(app, sign_in_provider, handle, + self->user_data); +} + +static void +firebase_auth_firebase_auth_user_host_api_reauthenticate_with_credential_cb( + FlBasicMessageChannel* channel, FlValue* message_, + FlBasicMessageChannelResponseHandle* response_handle, gpointer user_data) { + FirebaseAuthFirebaseAuthUserHostApi* self = + FIREBASE_AUTH_FIREBASE_AUTH_USER_HOST_API(user_data); + + if (self->vtable == nullptr || + self->vtable->reauthenticate_with_credential == nullptr) { + return; + } + + FlValue* value0 = fl_value_get_list_value(message_, 0); + FirebaseAuthAuthPigeonFirebaseApp* app = + FIREBASE_AUTH_AUTH_PIGEON_FIREBASE_APP( + fl_value_get_custom_value_object(value0)); + FlValue* value1 = fl_value_get_list_value(message_, 1); + FlValue* input = value1; + g_autoptr(FirebaseAuthFirebaseAuthUserHostApiResponseHandle) handle = + firebase_auth_firebase_auth_user_host_api_response_handle_new( + channel, response_handle); + self->vtable->reauthenticate_with_credential(app, input, handle, + self->user_data); +} + +static void +firebase_auth_firebase_auth_user_host_api_reauthenticate_with_provider_cb( + FlBasicMessageChannel* channel, FlValue* message_, + FlBasicMessageChannelResponseHandle* response_handle, gpointer user_data) { + FirebaseAuthFirebaseAuthUserHostApi* self = + FIREBASE_AUTH_FIREBASE_AUTH_USER_HOST_API(user_data); + + if (self->vtable == nullptr || + self->vtable->reauthenticate_with_provider == nullptr) { + return; + } + + FlValue* value0 = fl_value_get_list_value(message_, 0); + FirebaseAuthAuthPigeonFirebaseApp* app = + FIREBASE_AUTH_AUTH_PIGEON_FIREBASE_APP( + fl_value_get_custom_value_object(value0)); + FlValue* value1 = fl_value_get_list_value(message_, 1); + FirebaseAuthInternalSignInProvider* sign_in_provider = + FIREBASE_AUTH_INTERNAL_SIGN_IN_PROVIDER( + fl_value_get_custom_value_object(value1)); + g_autoptr(FirebaseAuthFirebaseAuthUserHostApiResponseHandle) handle = + firebase_auth_firebase_auth_user_host_api_response_handle_new( + channel, response_handle); + self->vtable->reauthenticate_with_provider(app, sign_in_provider, handle, + self->user_data); +} + +static void firebase_auth_firebase_auth_user_host_api_reload_cb( + FlBasicMessageChannel* channel, FlValue* message_, + FlBasicMessageChannelResponseHandle* response_handle, gpointer user_data) { + FirebaseAuthFirebaseAuthUserHostApi* self = + FIREBASE_AUTH_FIREBASE_AUTH_USER_HOST_API(user_data); + + if (self->vtable == nullptr || self->vtable->reload == nullptr) { + return; + } + + FlValue* value0 = fl_value_get_list_value(message_, 0); + FirebaseAuthAuthPigeonFirebaseApp* app = + FIREBASE_AUTH_AUTH_PIGEON_FIREBASE_APP( + fl_value_get_custom_value_object(value0)); + g_autoptr(FirebaseAuthFirebaseAuthUserHostApiResponseHandle) handle = + firebase_auth_firebase_auth_user_host_api_response_handle_new( + channel, response_handle); + self->vtable->reload(app, handle, self->user_data); +} + +static void +firebase_auth_firebase_auth_user_host_api_send_email_verification_cb( + FlBasicMessageChannel* channel, FlValue* message_, + FlBasicMessageChannelResponseHandle* response_handle, gpointer user_data) { + FirebaseAuthFirebaseAuthUserHostApi* self = + FIREBASE_AUTH_FIREBASE_AUTH_USER_HOST_API(user_data); + + if (self->vtable == nullptr || + self->vtable->send_email_verification == nullptr) { + return; + } + + FlValue* value0 = fl_value_get_list_value(message_, 0); + FirebaseAuthAuthPigeonFirebaseApp* app = + FIREBASE_AUTH_AUTH_PIGEON_FIREBASE_APP( + fl_value_get_custom_value_object(value0)); + FlValue* value1 = fl_value_get_list_value(message_, 1); + FirebaseAuthInternalActionCodeSettings* action_code_settings = + FIREBASE_AUTH_INTERNAL_ACTION_CODE_SETTINGS( + fl_value_get_custom_value_object(value1)); + g_autoptr(FirebaseAuthFirebaseAuthUserHostApiResponseHandle) handle = + firebase_auth_firebase_auth_user_host_api_response_handle_new( + channel, response_handle); + self->vtable->send_email_verification(app, action_code_settings, handle, + self->user_data); +} + +static void firebase_auth_firebase_auth_user_host_api_unlink_cb( + FlBasicMessageChannel* channel, FlValue* message_, + FlBasicMessageChannelResponseHandle* response_handle, gpointer user_data) { + FirebaseAuthFirebaseAuthUserHostApi* self = + FIREBASE_AUTH_FIREBASE_AUTH_USER_HOST_API(user_data); + + if (self->vtable == nullptr || self->vtable->unlink == nullptr) { + return; + } + + FlValue* value0 = fl_value_get_list_value(message_, 0); + FirebaseAuthAuthPigeonFirebaseApp* app = + FIREBASE_AUTH_AUTH_PIGEON_FIREBASE_APP( + fl_value_get_custom_value_object(value0)); + FlValue* value1 = fl_value_get_list_value(message_, 1); + const gchar* provider_id = fl_value_get_string(value1); + g_autoptr(FirebaseAuthFirebaseAuthUserHostApiResponseHandle) handle = + firebase_auth_firebase_auth_user_host_api_response_handle_new( + channel, response_handle); + self->vtable->unlink(app, provider_id, handle, self->user_data); +} + +static void firebase_auth_firebase_auth_user_host_api_update_email_cb( + FlBasicMessageChannel* channel, FlValue* message_, + FlBasicMessageChannelResponseHandle* response_handle, gpointer user_data) { + FirebaseAuthFirebaseAuthUserHostApi* self = + FIREBASE_AUTH_FIREBASE_AUTH_USER_HOST_API(user_data); + + if (self->vtable == nullptr || self->vtable->update_email == nullptr) { + return; + } + + FlValue* value0 = fl_value_get_list_value(message_, 0); + FirebaseAuthAuthPigeonFirebaseApp* app = + FIREBASE_AUTH_AUTH_PIGEON_FIREBASE_APP( + fl_value_get_custom_value_object(value0)); + FlValue* value1 = fl_value_get_list_value(message_, 1); + const gchar* new_email = fl_value_get_string(value1); + g_autoptr(FirebaseAuthFirebaseAuthUserHostApiResponseHandle) handle = + firebase_auth_firebase_auth_user_host_api_response_handle_new( + channel, response_handle); + self->vtable->update_email(app, new_email, handle, self->user_data); +} + +static void firebase_auth_firebase_auth_user_host_api_update_password_cb( + FlBasicMessageChannel* channel, FlValue* message_, + FlBasicMessageChannelResponseHandle* response_handle, gpointer user_data) { + FirebaseAuthFirebaseAuthUserHostApi* self = + FIREBASE_AUTH_FIREBASE_AUTH_USER_HOST_API(user_data); + + if (self->vtable == nullptr || self->vtable->update_password == nullptr) { + return; + } + + FlValue* value0 = fl_value_get_list_value(message_, 0); + FirebaseAuthAuthPigeonFirebaseApp* app = + FIREBASE_AUTH_AUTH_PIGEON_FIREBASE_APP( + fl_value_get_custom_value_object(value0)); + FlValue* value1 = fl_value_get_list_value(message_, 1); + const gchar* new_password = fl_value_get_string(value1); + g_autoptr(FirebaseAuthFirebaseAuthUserHostApiResponseHandle) handle = + firebase_auth_firebase_auth_user_host_api_response_handle_new( + channel, response_handle); + self->vtable->update_password(app, new_password, handle, self->user_data); +} + +static void firebase_auth_firebase_auth_user_host_api_update_phone_number_cb( + FlBasicMessageChannel* channel, FlValue* message_, + FlBasicMessageChannelResponseHandle* response_handle, gpointer user_data) { + FirebaseAuthFirebaseAuthUserHostApi* self = + FIREBASE_AUTH_FIREBASE_AUTH_USER_HOST_API(user_data); + + if (self->vtable == nullptr || self->vtable->update_phone_number == nullptr) { + return; + } + + FlValue* value0 = fl_value_get_list_value(message_, 0); + FirebaseAuthAuthPigeonFirebaseApp* app = + FIREBASE_AUTH_AUTH_PIGEON_FIREBASE_APP( + fl_value_get_custom_value_object(value0)); + FlValue* value1 = fl_value_get_list_value(message_, 1); + FlValue* input = value1; + g_autoptr(FirebaseAuthFirebaseAuthUserHostApiResponseHandle) handle = + firebase_auth_firebase_auth_user_host_api_response_handle_new( + channel, response_handle); + self->vtable->update_phone_number(app, input, handle, self->user_data); +} + +static void firebase_auth_firebase_auth_user_host_api_update_profile_cb( + FlBasicMessageChannel* channel, FlValue* message_, + FlBasicMessageChannelResponseHandle* response_handle, gpointer user_data) { + FirebaseAuthFirebaseAuthUserHostApi* self = + FIREBASE_AUTH_FIREBASE_AUTH_USER_HOST_API(user_data); + + if (self->vtable == nullptr || self->vtable->update_profile == nullptr) { + return; + } + + FlValue* value0 = fl_value_get_list_value(message_, 0); + FirebaseAuthAuthPigeonFirebaseApp* app = + FIREBASE_AUTH_AUTH_PIGEON_FIREBASE_APP( + fl_value_get_custom_value_object(value0)); + FlValue* value1 = fl_value_get_list_value(message_, 1); + FirebaseAuthInternalUserProfile* profile = + FIREBASE_AUTH_INTERNAL_USER_PROFILE( + fl_value_get_custom_value_object(value1)); + g_autoptr(FirebaseAuthFirebaseAuthUserHostApiResponseHandle) handle = + firebase_auth_firebase_auth_user_host_api_response_handle_new( + channel, response_handle); + self->vtable->update_profile(app, profile, handle, self->user_data); +} + +static void +firebase_auth_firebase_auth_user_host_api_verify_before_update_email_cb( + FlBasicMessageChannel* channel, FlValue* message_, + FlBasicMessageChannelResponseHandle* response_handle, gpointer user_data) { + FirebaseAuthFirebaseAuthUserHostApi* self = + FIREBASE_AUTH_FIREBASE_AUTH_USER_HOST_API(user_data); + + if (self->vtable == nullptr || + self->vtable->verify_before_update_email == nullptr) { + return; + } + + FlValue* value0 = fl_value_get_list_value(message_, 0); + FirebaseAuthAuthPigeonFirebaseApp* app = + FIREBASE_AUTH_AUTH_PIGEON_FIREBASE_APP( + fl_value_get_custom_value_object(value0)); + FlValue* value1 = fl_value_get_list_value(message_, 1); + const gchar* new_email = fl_value_get_string(value1); + FlValue* value2 = fl_value_get_list_value(message_, 2); + FirebaseAuthInternalActionCodeSettings* action_code_settings = + FIREBASE_AUTH_INTERNAL_ACTION_CODE_SETTINGS( + fl_value_get_custom_value_object(value2)); + g_autoptr(FirebaseAuthFirebaseAuthUserHostApiResponseHandle) handle = + firebase_auth_firebase_auth_user_host_api_response_handle_new( + channel, response_handle); + self->vtable->verify_before_update_email(app, new_email, action_code_settings, + handle, self->user_data); +} + +void firebase_auth_firebase_auth_user_host_api_set_method_handlers( + FlBinaryMessenger* messenger, const gchar* suffix, + const FirebaseAuthFirebaseAuthUserHostApiVTable* vtable, gpointer user_data, + GDestroyNotify user_data_free_func) { + g_autofree gchar* dot_suffix = + suffix != nullptr ? g_strdup_printf(".%s", suffix) : g_strdup(""); + g_autoptr(FirebaseAuthFirebaseAuthUserHostApi) api_data = + firebase_auth_firebase_auth_user_host_api_new(vtable, user_data, + user_data_free_func); + + g_autoptr(FirebaseAuthMessageCodec) codec = firebase_auth_message_codec_new(); + g_autofree gchar* delete_channel_name = g_strdup_printf( + "dev.flutter.pigeon.firebase_auth_platform_interface." + "FirebaseAuthUserHostApi.delete%s", + dot_suffix); + g_autoptr(FlBasicMessageChannel) delete_channel = + fl_basic_message_channel_new(messenger, delete_channel_name, + FL_MESSAGE_CODEC(codec)); + fl_basic_message_channel_set_message_handler( + delete_channel, firebase_auth_firebase_auth_user_host_api_delete_cb, + g_object_ref(api_data), g_object_unref); + g_autofree gchar* get_id_token_channel_name = g_strdup_printf( + "dev.flutter.pigeon.firebase_auth_platform_interface." + "FirebaseAuthUserHostApi.getIdToken%s", + dot_suffix); + g_autoptr(FlBasicMessageChannel) get_id_token_channel = + fl_basic_message_channel_new(messenger, get_id_token_channel_name, + FL_MESSAGE_CODEC(codec)); + fl_basic_message_channel_set_message_handler( + get_id_token_channel, + firebase_auth_firebase_auth_user_host_api_get_id_token_cb, + g_object_ref(api_data), g_object_unref); + g_autofree gchar* link_with_credential_channel_name = g_strdup_printf( + "dev.flutter.pigeon.firebase_auth_platform_interface." + "FirebaseAuthUserHostApi.linkWithCredential%s", + dot_suffix); + g_autoptr(FlBasicMessageChannel) link_with_credential_channel = + fl_basic_message_channel_new(messenger, link_with_credential_channel_name, + FL_MESSAGE_CODEC(codec)); + fl_basic_message_channel_set_message_handler( + link_with_credential_channel, + firebase_auth_firebase_auth_user_host_api_link_with_credential_cb, + g_object_ref(api_data), g_object_unref); + g_autofree gchar* link_with_provider_channel_name = g_strdup_printf( + "dev.flutter.pigeon.firebase_auth_platform_interface." + "FirebaseAuthUserHostApi.linkWithProvider%s", + dot_suffix); + g_autoptr(FlBasicMessageChannel) link_with_provider_channel = + fl_basic_message_channel_new(messenger, link_with_provider_channel_name, + FL_MESSAGE_CODEC(codec)); + fl_basic_message_channel_set_message_handler( + link_with_provider_channel, + firebase_auth_firebase_auth_user_host_api_link_with_provider_cb, + g_object_ref(api_data), g_object_unref); + g_autofree gchar* reauthenticate_with_credential_channel_name = + g_strdup_printf( + "dev.flutter.pigeon.firebase_auth_platform_interface." + "FirebaseAuthUserHostApi.reauthenticateWithCredential%s", + dot_suffix); + g_autoptr(FlBasicMessageChannel) reauthenticate_with_credential_channel = + fl_basic_message_channel_new(messenger, + reauthenticate_with_credential_channel_name, + FL_MESSAGE_CODEC(codec)); + fl_basic_message_channel_set_message_handler( + reauthenticate_with_credential_channel, + firebase_auth_firebase_auth_user_host_api_reauthenticate_with_credential_cb, + g_object_ref(api_data), g_object_unref); + g_autofree gchar* reauthenticate_with_provider_channel_name = g_strdup_printf( + "dev.flutter.pigeon.firebase_auth_platform_interface." + "FirebaseAuthUserHostApi.reauthenticateWithProvider%s", + dot_suffix); + g_autoptr(FlBasicMessageChannel) reauthenticate_with_provider_channel = + fl_basic_message_channel_new(messenger, + reauthenticate_with_provider_channel_name, + FL_MESSAGE_CODEC(codec)); + fl_basic_message_channel_set_message_handler( + reauthenticate_with_provider_channel, + firebase_auth_firebase_auth_user_host_api_reauthenticate_with_provider_cb, + g_object_ref(api_data), g_object_unref); + g_autofree gchar* reload_channel_name = g_strdup_printf( + "dev.flutter.pigeon.firebase_auth_platform_interface." + "FirebaseAuthUserHostApi.reload%s", + dot_suffix); + g_autoptr(FlBasicMessageChannel) reload_channel = + fl_basic_message_channel_new(messenger, reload_channel_name, + FL_MESSAGE_CODEC(codec)); + fl_basic_message_channel_set_message_handler( + reload_channel, firebase_auth_firebase_auth_user_host_api_reload_cb, + g_object_ref(api_data), g_object_unref); + g_autofree gchar* send_email_verification_channel_name = g_strdup_printf( + "dev.flutter.pigeon.firebase_auth_platform_interface." + "FirebaseAuthUserHostApi.sendEmailVerification%s", + dot_suffix); + g_autoptr(FlBasicMessageChannel) send_email_verification_channel = + fl_basic_message_channel_new(messenger, + send_email_verification_channel_name, + FL_MESSAGE_CODEC(codec)); + fl_basic_message_channel_set_message_handler( + send_email_verification_channel, + firebase_auth_firebase_auth_user_host_api_send_email_verification_cb, + g_object_ref(api_data), g_object_unref); + g_autofree gchar* unlink_channel_name = g_strdup_printf( + "dev.flutter.pigeon.firebase_auth_platform_interface." + "FirebaseAuthUserHostApi.unlink%s", + dot_suffix); + g_autoptr(FlBasicMessageChannel) unlink_channel = + fl_basic_message_channel_new(messenger, unlink_channel_name, + FL_MESSAGE_CODEC(codec)); + fl_basic_message_channel_set_message_handler( + unlink_channel, firebase_auth_firebase_auth_user_host_api_unlink_cb, + g_object_ref(api_data), g_object_unref); + g_autofree gchar* update_email_channel_name = g_strdup_printf( + "dev.flutter.pigeon.firebase_auth_platform_interface." + "FirebaseAuthUserHostApi.updateEmail%s", + dot_suffix); + g_autoptr(FlBasicMessageChannel) update_email_channel = + fl_basic_message_channel_new(messenger, update_email_channel_name, + FL_MESSAGE_CODEC(codec)); + fl_basic_message_channel_set_message_handler( + update_email_channel, + firebase_auth_firebase_auth_user_host_api_update_email_cb, + g_object_ref(api_data), g_object_unref); + g_autofree gchar* update_password_channel_name = g_strdup_printf( + "dev.flutter.pigeon.firebase_auth_platform_interface." + "FirebaseAuthUserHostApi.updatePassword%s", + dot_suffix); + g_autoptr(FlBasicMessageChannel) update_password_channel = + fl_basic_message_channel_new(messenger, update_password_channel_name, + FL_MESSAGE_CODEC(codec)); + fl_basic_message_channel_set_message_handler( + update_password_channel, + firebase_auth_firebase_auth_user_host_api_update_password_cb, + g_object_ref(api_data), g_object_unref); + g_autofree gchar* update_phone_number_channel_name = g_strdup_printf( + "dev.flutter.pigeon.firebase_auth_platform_interface." + "FirebaseAuthUserHostApi.updatePhoneNumber%s", + dot_suffix); + g_autoptr(FlBasicMessageChannel) update_phone_number_channel = + fl_basic_message_channel_new(messenger, update_phone_number_channel_name, + FL_MESSAGE_CODEC(codec)); + fl_basic_message_channel_set_message_handler( + update_phone_number_channel, + firebase_auth_firebase_auth_user_host_api_update_phone_number_cb, + g_object_ref(api_data), g_object_unref); + g_autofree gchar* update_profile_channel_name = g_strdup_printf( + "dev.flutter.pigeon.firebase_auth_platform_interface." + "FirebaseAuthUserHostApi.updateProfile%s", + dot_suffix); + g_autoptr(FlBasicMessageChannel) update_profile_channel = + fl_basic_message_channel_new(messenger, update_profile_channel_name, + FL_MESSAGE_CODEC(codec)); + fl_basic_message_channel_set_message_handler( + update_profile_channel, + firebase_auth_firebase_auth_user_host_api_update_profile_cb, + g_object_ref(api_data), g_object_unref); + g_autofree gchar* verify_before_update_email_channel_name = g_strdup_printf( + "dev.flutter.pigeon.firebase_auth_platform_interface." + "FirebaseAuthUserHostApi.verifyBeforeUpdateEmail%s", + dot_suffix); + g_autoptr(FlBasicMessageChannel) verify_before_update_email_channel = + fl_basic_message_channel_new(messenger, + verify_before_update_email_channel_name, + FL_MESSAGE_CODEC(codec)); + fl_basic_message_channel_set_message_handler( + verify_before_update_email_channel, + firebase_auth_firebase_auth_user_host_api_verify_before_update_email_cb, + g_object_ref(api_data), g_object_unref); +} + +void firebase_auth_firebase_auth_user_host_api_clear_method_handlers( + FlBinaryMessenger* messenger, const gchar* suffix) { + g_autofree gchar* dot_suffix = + suffix != nullptr ? g_strdup_printf(".%s", suffix) : g_strdup(""); + + g_autoptr(FirebaseAuthMessageCodec) codec = firebase_auth_message_codec_new(); + g_autofree gchar* delete_channel_name = g_strdup_printf( + "dev.flutter.pigeon.firebase_auth_platform_interface." + "FirebaseAuthUserHostApi.delete%s", + dot_suffix); + g_autoptr(FlBasicMessageChannel) delete_channel = + fl_basic_message_channel_new(messenger, delete_channel_name, + FL_MESSAGE_CODEC(codec)); + fl_basic_message_channel_set_message_handler(delete_channel, nullptr, nullptr, + nullptr); + g_autofree gchar* get_id_token_channel_name = g_strdup_printf( + "dev.flutter.pigeon.firebase_auth_platform_interface." + "FirebaseAuthUserHostApi.getIdToken%s", + dot_suffix); + g_autoptr(FlBasicMessageChannel) get_id_token_channel = + fl_basic_message_channel_new(messenger, get_id_token_channel_name, + FL_MESSAGE_CODEC(codec)); + fl_basic_message_channel_set_message_handler(get_id_token_channel, nullptr, + nullptr, nullptr); + g_autofree gchar* link_with_credential_channel_name = g_strdup_printf( + "dev.flutter.pigeon.firebase_auth_platform_interface." + "FirebaseAuthUserHostApi.linkWithCredential%s", + dot_suffix); + g_autoptr(FlBasicMessageChannel) link_with_credential_channel = + fl_basic_message_channel_new(messenger, link_with_credential_channel_name, + FL_MESSAGE_CODEC(codec)); + fl_basic_message_channel_set_message_handler(link_with_credential_channel, + nullptr, nullptr, nullptr); + g_autofree gchar* link_with_provider_channel_name = g_strdup_printf( + "dev.flutter.pigeon.firebase_auth_platform_interface." + "FirebaseAuthUserHostApi.linkWithProvider%s", + dot_suffix); + g_autoptr(FlBasicMessageChannel) link_with_provider_channel = + fl_basic_message_channel_new(messenger, link_with_provider_channel_name, + FL_MESSAGE_CODEC(codec)); + fl_basic_message_channel_set_message_handler(link_with_provider_channel, + nullptr, nullptr, nullptr); + g_autofree gchar* reauthenticate_with_credential_channel_name = + g_strdup_printf( + "dev.flutter.pigeon.firebase_auth_platform_interface." + "FirebaseAuthUserHostApi.reauthenticateWithCredential%s", + dot_suffix); + g_autoptr(FlBasicMessageChannel) reauthenticate_with_credential_channel = + fl_basic_message_channel_new(messenger, + reauthenticate_with_credential_channel_name, + FL_MESSAGE_CODEC(codec)); + fl_basic_message_channel_set_message_handler( + reauthenticate_with_credential_channel, nullptr, nullptr, nullptr); + g_autofree gchar* reauthenticate_with_provider_channel_name = g_strdup_printf( + "dev.flutter.pigeon.firebase_auth_platform_interface." + "FirebaseAuthUserHostApi.reauthenticateWithProvider%s", + dot_suffix); + g_autoptr(FlBasicMessageChannel) reauthenticate_with_provider_channel = + fl_basic_message_channel_new(messenger, + reauthenticate_with_provider_channel_name, + FL_MESSAGE_CODEC(codec)); + fl_basic_message_channel_set_message_handler( + reauthenticate_with_provider_channel, nullptr, nullptr, nullptr); + g_autofree gchar* reload_channel_name = g_strdup_printf( + "dev.flutter.pigeon.firebase_auth_platform_interface." + "FirebaseAuthUserHostApi.reload%s", + dot_suffix); + g_autoptr(FlBasicMessageChannel) reload_channel = + fl_basic_message_channel_new(messenger, reload_channel_name, + FL_MESSAGE_CODEC(codec)); + fl_basic_message_channel_set_message_handler(reload_channel, nullptr, nullptr, + nullptr); + g_autofree gchar* send_email_verification_channel_name = g_strdup_printf( + "dev.flutter.pigeon.firebase_auth_platform_interface." + "FirebaseAuthUserHostApi.sendEmailVerification%s", + dot_suffix); + g_autoptr(FlBasicMessageChannel) send_email_verification_channel = + fl_basic_message_channel_new(messenger, + send_email_verification_channel_name, + FL_MESSAGE_CODEC(codec)); + fl_basic_message_channel_set_message_handler(send_email_verification_channel, + nullptr, nullptr, nullptr); + g_autofree gchar* unlink_channel_name = g_strdup_printf( + "dev.flutter.pigeon.firebase_auth_platform_interface." + "FirebaseAuthUserHostApi.unlink%s", + dot_suffix); + g_autoptr(FlBasicMessageChannel) unlink_channel = + fl_basic_message_channel_new(messenger, unlink_channel_name, + FL_MESSAGE_CODEC(codec)); + fl_basic_message_channel_set_message_handler(unlink_channel, nullptr, nullptr, + nullptr); + g_autofree gchar* update_email_channel_name = g_strdup_printf( + "dev.flutter.pigeon.firebase_auth_platform_interface." + "FirebaseAuthUserHostApi.updateEmail%s", + dot_suffix); + g_autoptr(FlBasicMessageChannel) update_email_channel = + fl_basic_message_channel_new(messenger, update_email_channel_name, + FL_MESSAGE_CODEC(codec)); + fl_basic_message_channel_set_message_handler(update_email_channel, nullptr, + nullptr, nullptr); + g_autofree gchar* update_password_channel_name = g_strdup_printf( + "dev.flutter.pigeon.firebase_auth_platform_interface." + "FirebaseAuthUserHostApi.updatePassword%s", + dot_suffix); + g_autoptr(FlBasicMessageChannel) update_password_channel = + fl_basic_message_channel_new(messenger, update_password_channel_name, + FL_MESSAGE_CODEC(codec)); + fl_basic_message_channel_set_message_handler(update_password_channel, nullptr, + nullptr, nullptr); + g_autofree gchar* update_phone_number_channel_name = g_strdup_printf( + "dev.flutter.pigeon.firebase_auth_platform_interface." + "FirebaseAuthUserHostApi.updatePhoneNumber%s", + dot_suffix); + g_autoptr(FlBasicMessageChannel) update_phone_number_channel = + fl_basic_message_channel_new(messenger, update_phone_number_channel_name, + FL_MESSAGE_CODEC(codec)); + fl_basic_message_channel_set_message_handler(update_phone_number_channel, + nullptr, nullptr, nullptr); + g_autofree gchar* update_profile_channel_name = g_strdup_printf( + "dev.flutter.pigeon.firebase_auth_platform_interface." + "FirebaseAuthUserHostApi.updateProfile%s", + dot_suffix); + g_autoptr(FlBasicMessageChannel) update_profile_channel = + fl_basic_message_channel_new(messenger, update_profile_channel_name, + FL_MESSAGE_CODEC(codec)); + fl_basic_message_channel_set_message_handler(update_profile_channel, nullptr, + nullptr, nullptr); + g_autofree gchar* verify_before_update_email_channel_name = g_strdup_printf( + "dev.flutter.pigeon.firebase_auth_platform_interface." + "FirebaseAuthUserHostApi.verifyBeforeUpdateEmail%s", + dot_suffix); + g_autoptr(FlBasicMessageChannel) verify_before_update_email_channel = + fl_basic_message_channel_new(messenger, + verify_before_update_email_channel_name, + FL_MESSAGE_CODEC(codec)); + fl_basic_message_channel_set_message_handler( + verify_before_update_email_channel, nullptr, nullptr, nullptr); +} + +void firebase_auth_firebase_auth_user_host_api_respond_delete( + FirebaseAuthFirebaseAuthUserHostApiResponseHandle* response_handle) { + g_autoptr(FirebaseAuthFirebaseAuthUserHostApiDeleteResponse) response = + firebase_auth_firebase_auth_user_host_api_delete_response_new(); + g_autoptr(GError) error = nullptr; + if (!fl_basic_message_channel_respond(response_handle->channel, + response_handle->response_handle, + response->value, &error)) { + g_warning("Failed to send response to %s.%s: %s", "FirebaseAuthUserHostApi", + "delete", error->message); + } +} + +void firebase_auth_firebase_auth_user_host_api_respond_error_delete( + FirebaseAuthFirebaseAuthUserHostApiResponseHandle* response_handle, + const gchar* code, const gchar* message, FlValue* details) { + g_autoptr(FirebaseAuthFirebaseAuthUserHostApiDeleteResponse) response = + firebase_auth_firebase_auth_user_host_api_delete_response_new_error( + code, message, details); + g_autoptr(GError) error = nullptr; + if (!fl_basic_message_channel_respond(response_handle->channel, + response_handle->response_handle, + response->value, &error)) { + g_warning("Failed to send response to %s.%s: %s", "FirebaseAuthUserHostApi", + "delete", error->message); + } +} + +void firebase_auth_firebase_auth_user_host_api_respond_get_id_token( + FirebaseAuthFirebaseAuthUserHostApiResponseHandle* response_handle, + FirebaseAuthInternalIdTokenResult* return_value) { + g_autoptr(FirebaseAuthFirebaseAuthUserHostApiGetIdTokenResponse) response = + firebase_auth_firebase_auth_user_host_api_get_id_token_response_new( + return_value); + g_autoptr(GError) error = nullptr; + if (!fl_basic_message_channel_respond(response_handle->channel, + response_handle->response_handle, + response->value, &error)) { + g_warning("Failed to send response to %s.%s: %s", "FirebaseAuthUserHostApi", + "getIdToken", error->message); + } +} + +void firebase_auth_firebase_auth_user_host_api_respond_error_get_id_token( + FirebaseAuthFirebaseAuthUserHostApiResponseHandle* response_handle, + const gchar* code, const gchar* message, FlValue* details) { + g_autoptr(FirebaseAuthFirebaseAuthUserHostApiGetIdTokenResponse) response = + firebase_auth_firebase_auth_user_host_api_get_id_token_response_new_error( + code, message, details); + g_autoptr(GError) error = nullptr; + if (!fl_basic_message_channel_respond(response_handle->channel, + response_handle->response_handle, + response->value, &error)) { + g_warning("Failed to send response to %s.%s: %s", "FirebaseAuthUserHostApi", + "getIdToken", error->message); + } +} + +void firebase_auth_firebase_auth_user_host_api_respond_link_with_credential( + FirebaseAuthFirebaseAuthUserHostApiResponseHandle* response_handle, + FirebaseAuthInternalUserCredential* return_value) { + g_autoptr( + FirebaseAuthFirebaseAuthUserHostApiLinkWithCredentialResponse) response = + firebase_auth_firebase_auth_user_host_api_link_with_credential_response_new( + return_value); + g_autoptr(GError) error = nullptr; + if (!fl_basic_message_channel_respond(response_handle->channel, + response_handle->response_handle, + response->value, &error)) { + g_warning("Failed to send response to %s.%s: %s", "FirebaseAuthUserHostApi", + "linkWithCredential", error->message); + } +} + +void firebase_auth_firebase_auth_user_host_api_respond_error_link_with_credential( + FirebaseAuthFirebaseAuthUserHostApiResponseHandle* response_handle, + const gchar* code, const gchar* message, FlValue* details) { + g_autoptr( + FirebaseAuthFirebaseAuthUserHostApiLinkWithCredentialResponse) response = + firebase_auth_firebase_auth_user_host_api_link_with_credential_response_new_error( + code, message, details); + g_autoptr(GError) error = nullptr; + if (!fl_basic_message_channel_respond(response_handle->channel, + response_handle->response_handle, + response->value, &error)) { + g_warning("Failed to send response to %s.%s: %s", "FirebaseAuthUserHostApi", + "linkWithCredential", error->message); + } +} + +void firebase_auth_firebase_auth_user_host_api_respond_link_with_provider( + FirebaseAuthFirebaseAuthUserHostApiResponseHandle* response_handle, + FirebaseAuthInternalUserCredential* return_value) { + g_autoptr( + FirebaseAuthFirebaseAuthUserHostApiLinkWithProviderResponse) response = + firebase_auth_firebase_auth_user_host_api_link_with_provider_response_new( + return_value); + g_autoptr(GError) error = nullptr; + if (!fl_basic_message_channel_respond(response_handle->channel, + response_handle->response_handle, + response->value, &error)) { + g_warning("Failed to send response to %s.%s: %s", "FirebaseAuthUserHostApi", + "linkWithProvider", error->message); + } +} + +void firebase_auth_firebase_auth_user_host_api_respond_error_link_with_provider( + FirebaseAuthFirebaseAuthUserHostApiResponseHandle* response_handle, + const gchar* code, const gchar* message, FlValue* details) { + g_autoptr( + FirebaseAuthFirebaseAuthUserHostApiLinkWithProviderResponse) response = + firebase_auth_firebase_auth_user_host_api_link_with_provider_response_new_error( + code, message, details); + g_autoptr(GError) error = nullptr; + if (!fl_basic_message_channel_respond(response_handle->channel, + response_handle->response_handle, + response->value, &error)) { + g_warning("Failed to send response to %s.%s: %s", "FirebaseAuthUserHostApi", + "linkWithProvider", error->message); + } +} + +void firebase_auth_firebase_auth_user_host_api_respond_reauthenticate_with_credential( + FirebaseAuthFirebaseAuthUserHostApiResponseHandle* response_handle, + FirebaseAuthInternalUserCredential* return_value) { + g_autoptr( + FirebaseAuthFirebaseAuthUserHostApiReauthenticateWithCredentialResponse) + response = + firebase_auth_firebase_auth_user_host_api_reauthenticate_with_credential_response_new( + return_value); + g_autoptr(GError) error = nullptr; + if (!fl_basic_message_channel_respond(response_handle->channel, + response_handle->response_handle, + response->value, &error)) { + g_warning("Failed to send response to %s.%s: %s", "FirebaseAuthUserHostApi", + "reauthenticateWithCredential", error->message); + } +} + +void firebase_auth_firebase_auth_user_host_api_respond_error_reauthenticate_with_credential( + FirebaseAuthFirebaseAuthUserHostApiResponseHandle* response_handle, + const gchar* code, const gchar* message, FlValue* details) { + g_autoptr( + FirebaseAuthFirebaseAuthUserHostApiReauthenticateWithCredentialResponse) + response = + firebase_auth_firebase_auth_user_host_api_reauthenticate_with_credential_response_new_error( + code, message, details); + g_autoptr(GError) error = nullptr; + if (!fl_basic_message_channel_respond(response_handle->channel, + response_handle->response_handle, + response->value, &error)) { + g_warning("Failed to send response to %s.%s: %s", "FirebaseAuthUserHostApi", + "reauthenticateWithCredential", error->message); + } +} + +void firebase_auth_firebase_auth_user_host_api_respond_reauthenticate_with_provider( + FirebaseAuthFirebaseAuthUserHostApiResponseHandle* response_handle, + FirebaseAuthInternalUserCredential* return_value) { + g_autoptr( + FirebaseAuthFirebaseAuthUserHostApiReauthenticateWithProviderResponse) + response = + firebase_auth_firebase_auth_user_host_api_reauthenticate_with_provider_response_new( + return_value); + g_autoptr(GError) error = nullptr; + if (!fl_basic_message_channel_respond(response_handle->channel, + response_handle->response_handle, + response->value, &error)) { + g_warning("Failed to send response to %s.%s: %s", "FirebaseAuthUserHostApi", + "reauthenticateWithProvider", error->message); + } +} + +void firebase_auth_firebase_auth_user_host_api_respond_error_reauthenticate_with_provider( + FirebaseAuthFirebaseAuthUserHostApiResponseHandle* response_handle, + const gchar* code, const gchar* message, FlValue* details) { + g_autoptr( + FirebaseAuthFirebaseAuthUserHostApiReauthenticateWithProviderResponse) + response = + firebase_auth_firebase_auth_user_host_api_reauthenticate_with_provider_response_new_error( + code, message, details); + g_autoptr(GError) error = nullptr; + if (!fl_basic_message_channel_respond(response_handle->channel, + response_handle->response_handle, + response->value, &error)) { + g_warning("Failed to send response to %s.%s: %s", "FirebaseAuthUserHostApi", + "reauthenticateWithProvider", error->message); + } +} + +void firebase_auth_firebase_auth_user_host_api_respond_reload( + FirebaseAuthFirebaseAuthUserHostApiResponseHandle* response_handle, + FirebaseAuthInternalUserDetails* return_value) { + g_autoptr(FirebaseAuthFirebaseAuthUserHostApiReloadResponse) response = + firebase_auth_firebase_auth_user_host_api_reload_response_new( + return_value); + g_autoptr(GError) error = nullptr; + if (!fl_basic_message_channel_respond(response_handle->channel, + response_handle->response_handle, + response->value, &error)) { + g_warning("Failed to send response to %s.%s: %s", "FirebaseAuthUserHostApi", + "reload", error->message); + } +} + +void firebase_auth_firebase_auth_user_host_api_respond_error_reload( + FirebaseAuthFirebaseAuthUserHostApiResponseHandle* response_handle, + const gchar* code, const gchar* message, FlValue* details) { + g_autoptr(FirebaseAuthFirebaseAuthUserHostApiReloadResponse) response = + firebase_auth_firebase_auth_user_host_api_reload_response_new_error( + code, message, details); + g_autoptr(GError) error = nullptr; + if (!fl_basic_message_channel_respond(response_handle->channel, + response_handle->response_handle, + response->value, &error)) { + g_warning("Failed to send response to %s.%s: %s", "FirebaseAuthUserHostApi", + "reload", error->message); + } +} + +void firebase_auth_firebase_auth_user_host_api_respond_send_email_verification( + FirebaseAuthFirebaseAuthUserHostApiResponseHandle* response_handle) { + g_autoptr( + FirebaseAuthFirebaseAuthUserHostApiSendEmailVerificationResponse) response = + firebase_auth_firebase_auth_user_host_api_send_email_verification_response_new(); + g_autoptr(GError) error = nullptr; + if (!fl_basic_message_channel_respond(response_handle->channel, + response_handle->response_handle, + response->value, &error)) { + g_warning("Failed to send response to %s.%s: %s", "FirebaseAuthUserHostApi", + "sendEmailVerification", error->message); + } +} + +void firebase_auth_firebase_auth_user_host_api_respond_error_send_email_verification( + FirebaseAuthFirebaseAuthUserHostApiResponseHandle* response_handle, + const gchar* code, const gchar* message, FlValue* details) { + g_autoptr( + FirebaseAuthFirebaseAuthUserHostApiSendEmailVerificationResponse) response = + firebase_auth_firebase_auth_user_host_api_send_email_verification_response_new_error( + code, message, details); + g_autoptr(GError) error = nullptr; + if (!fl_basic_message_channel_respond(response_handle->channel, + response_handle->response_handle, + response->value, &error)) { + g_warning("Failed to send response to %s.%s: %s", "FirebaseAuthUserHostApi", + "sendEmailVerification", error->message); + } +} + +void firebase_auth_firebase_auth_user_host_api_respond_unlink( + FirebaseAuthFirebaseAuthUserHostApiResponseHandle* response_handle, + FirebaseAuthInternalUserCredential* return_value) { + g_autoptr(FirebaseAuthFirebaseAuthUserHostApiUnlinkResponse) response = + firebase_auth_firebase_auth_user_host_api_unlink_response_new( + return_value); + g_autoptr(GError) error = nullptr; + if (!fl_basic_message_channel_respond(response_handle->channel, + response_handle->response_handle, + response->value, &error)) { + g_warning("Failed to send response to %s.%s: %s", "FirebaseAuthUserHostApi", + "unlink", error->message); + } +} + +void firebase_auth_firebase_auth_user_host_api_respond_error_unlink( + FirebaseAuthFirebaseAuthUserHostApiResponseHandle* response_handle, + const gchar* code, const gchar* message, FlValue* details) { + g_autoptr(FirebaseAuthFirebaseAuthUserHostApiUnlinkResponse) response = + firebase_auth_firebase_auth_user_host_api_unlink_response_new_error( + code, message, details); + g_autoptr(GError) error = nullptr; + if (!fl_basic_message_channel_respond(response_handle->channel, + response_handle->response_handle, + response->value, &error)) { + g_warning("Failed to send response to %s.%s: %s", "FirebaseAuthUserHostApi", + "unlink", error->message); + } +} + +void firebase_auth_firebase_auth_user_host_api_respond_update_email( + FirebaseAuthFirebaseAuthUserHostApiResponseHandle* response_handle, + FirebaseAuthInternalUserDetails* return_value) { + g_autoptr(FirebaseAuthFirebaseAuthUserHostApiUpdateEmailResponse) response = + firebase_auth_firebase_auth_user_host_api_update_email_response_new( + return_value); + g_autoptr(GError) error = nullptr; + if (!fl_basic_message_channel_respond(response_handle->channel, + response_handle->response_handle, + response->value, &error)) { + g_warning("Failed to send response to %s.%s: %s", "FirebaseAuthUserHostApi", + "updateEmail", error->message); + } +} + +void firebase_auth_firebase_auth_user_host_api_respond_error_update_email( + FirebaseAuthFirebaseAuthUserHostApiResponseHandle* response_handle, + const gchar* code, const gchar* message, FlValue* details) { + g_autoptr(FirebaseAuthFirebaseAuthUserHostApiUpdateEmailResponse) response = + firebase_auth_firebase_auth_user_host_api_update_email_response_new_error( + code, message, details); + g_autoptr(GError) error = nullptr; + if (!fl_basic_message_channel_respond(response_handle->channel, + response_handle->response_handle, + response->value, &error)) { + g_warning("Failed to send response to %s.%s: %s", "FirebaseAuthUserHostApi", + "updateEmail", error->message); + } +} + +void firebase_auth_firebase_auth_user_host_api_respond_update_password( + FirebaseAuthFirebaseAuthUserHostApiResponseHandle* response_handle, + FirebaseAuthInternalUserDetails* return_value) { + g_autoptr( + FirebaseAuthFirebaseAuthUserHostApiUpdatePasswordResponse) response = + firebase_auth_firebase_auth_user_host_api_update_password_response_new( + return_value); + g_autoptr(GError) error = nullptr; + if (!fl_basic_message_channel_respond(response_handle->channel, + response_handle->response_handle, + response->value, &error)) { + g_warning("Failed to send response to %s.%s: %s", "FirebaseAuthUserHostApi", + "updatePassword", error->message); + } +} + +void firebase_auth_firebase_auth_user_host_api_respond_error_update_password( + FirebaseAuthFirebaseAuthUserHostApiResponseHandle* response_handle, + const gchar* code, const gchar* message, FlValue* details) { + g_autoptr( + FirebaseAuthFirebaseAuthUserHostApiUpdatePasswordResponse) response = + firebase_auth_firebase_auth_user_host_api_update_password_response_new_error( + code, message, details); + g_autoptr(GError) error = nullptr; + if (!fl_basic_message_channel_respond(response_handle->channel, + response_handle->response_handle, + response->value, &error)) { + g_warning("Failed to send response to %s.%s: %s", "FirebaseAuthUserHostApi", + "updatePassword", error->message); + } +} + +void firebase_auth_firebase_auth_user_host_api_respond_update_phone_number( + FirebaseAuthFirebaseAuthUserHostApiResponseHandle* response_handle, + FirebaseAuthInternalUserDetails* return_value) { + g_autoptr( + FirebaseAuthFirebaseAuthUserHostApiUpdatePhoneNumberResponse) response = + firebase_auth_firebase_auth_user_host_api_update_phone_number_response_new( + return_value); + g_autoptr(GError) error = nullptr; + if (!fl_basic_message_channel_respond(response_handle->channel, + response_handle->response_handle, + response->value, &error)) { + g_warning("Failed to send response to %s.%s: %s", "FirebaseAuthUserHostApi", + "updatePhoneNumber", error->message); + } +} + +void firebase_auth_firebase_auth_user_host_api_respond_error_update_phone_number( + FirebaseAuthFirebaseAuthUserHostApiResponseHandle* response_handle, + const gchar* code, const gchar* message, FlValue* details) { + g_autoptr( + FirebaseAuthFirebaseAuthUserHostApiUpdatePhoneNumberResponse) response = + firebase_auth_firebase_auth_user_host_api_update_phone_number_response_new_error( + code, message, details); + g_autoptr(GError) error = nullptr; + if (!fl_basic_message_channel_respond(response_handle->channel, + response_handle->response_handle, + response->value, &error)) { + g_warning("Failed to send response to %s.%s: %s", "FirebaseAuthUserHostApi", + "updatePhoneNumber", error->message); + } +} + +void firebase_auth_firebase_auth_user_host_api_respond_update_profile( + FirebaseAuthFirebaseAuthUserHostApiResponseHandle* response_handle, + FirebaseAuthInternalUserDetails* return_value) { + g_autoptr(FirebaseAuthFirebaseAuthUserHostApiUpdateProfileResponse) response = + firebase_auth_firebase_auth_user_host_api_update_profile_response_new( + return_value); + g_autoptr(GError) error = nullptr; + if (!fl_basic_message_channel_respond(response_handle->channel, + response_handle->response_handle, + response->value, &error)) { + g_warning("Failed to send response to %s.%s: %s", "FirebaseAuthUserHostApi", + "updateProfile", error->message); + } +} + +void firebase_auth_firebase_auth_user_host_api_respond_error_update_profile( + FirebaseAuthFirebaseAuthUserHostApiResponseHandle* response_handle, + const gchar* code, const gchar* message, FlValue* details) { + g_autoptr(FirebaseAuthFirebaseAuthUserHostApiUpdateProfileResponse) response = + firebase_auth_firebase_auth_user_host_api_update_profile_response_new_error( + code, message, details); + g_autoptr(GError) error = nullptr; + if (!fl_basic_message_channel_respond(response_handle->channel, + response_handle->response_handle, + response->value, &error)) { + g_warning("Failed to send response to %s.%s: %s", "FirebaseAuthUserHostApi", + "updateProfile", error->message); + } +} + +void firebase_auth_firebase_auth_user_host_api_respond_verify_before_update_email( + FirebaseAuthFirebaseAuthUserHostApiResponseHandle* response_handle) { + g_autoptr( + FirebaseAuthFirebaseAuthUserHostApiVerifyBeforeUpdateEmailResponse) response = + firebase_auth_firebase_auth_user_host_api_verify_before_update_email_response_new(); + g_autoptr(GError) error = nullptr; + if (!fl_basic_message_channel_respond(response_handle->channel, + response_handle->response_handle, + response->value, &error)) { + g_warning("Failed to send response to %s.%s: %s", "FirebaseAuthUserHostApi", + "verifyBeforeUpdateEmail", error->message); + } +} + +void firebase_auth_firebase_auth_user_host_api_respond_error_verify_before_update_email( + FirebaseAuthFirebaseAuthUserHostApiResponseHandle* response_handle, + const gchar* code, const gchar* message, FlValue* details) { + g_autoptr( + FirebaseAuthFirebaseAuthUserHostApiVerifyBeforeUpdateEmailResponse) response = + firebase_auth_firebase_auth_user_host_api_verify_before_update_email_response_new_error( + code, message, details); + g_autoptr(GError) error = nullptr; + if (!fl_basic_message_channel_respond(response_handle->channel, + response_handle->response_handle, + response->value, &error)) { + g_warning("Failed to send response to %s.%s: %s", "FirebaseAuthUserHostApi", + "verifyBeforeUpdateEmail", error->message); + } +} + +struct _FirebaseAuthMultiFactorUserHostApiResponseHandle { + GObject parent_instance; + + FlBasicMessageChannel* channel; + FlBasicMessageChannelResponseHandle* response_handle; +}; + +G_DEFINE_TYPE(FirebaseAuthMultiFactorUserHostApiResponseHandle, + firebase_auth_multi_factor_user_host_api_response_handle, + G_TYPE_OBJECT) + +static void firebase_auth_multi_factor_user_host_api_response_handle_dispose( + GObject* object) { + FirebaseAuthMultiFactorUserHostApiResponseHandle* self = + FIREBASE_AUTH_MULTI_FACTOR_USER_HOST_API_RESPONSE_HANDLE(object); + g_clear_object(&self->channel); + g_clear_object(&self->response_handle); + G_OBJECT_CLASS( + firebase_auth_multi_factor_user_host_api_response_handle_parent_class) + ->dispose(object); +} + +static void firebase_auth_multi_factor_user_host_api_response_handle_init( + FirebaseAuthMultiFactorUserHostApiResponseHandle* self) {} + +static void firebase_auth_multi_factor_user_host_api_response_handle_class_init( + FirebaseAuthMultiFactorUserHostApiResponseHandleClass* klass) { + G_OBJECT_CLASS(klass)->dispose = + firebase_auth_multi_factor_user_host_api_response_handle_dispose; +} + +static FirebaseAuthMultiFactorUserHostApiResponseHandle* +firebase_auth_multi_factor_user_host_api_response_handle_new( + FlBasicMessageChannel* channel, + FlBasicMessageChannelResponseHandle* response_handle) { + FirebaseAuthMultiFactorUserHostApiResponseHandle* self = + FIREBASE_AUTH_MULTI_FACTOR_USER_HOST_API_RESPONSE_HANDLE(g_object_new( + firebase_auth_multi_factor_user_host_api_response_handle_get_type(), + nullptr)); + self->channel = FL_BASIC_MESSAGE_CHANNEL(g_object_ref(channel)); + self->response_handle = + FL_BASIC_MESSAGE_CHANNEL_RESPONSE_HANDLE(g_object_ref(response_handle)); + return self; +} + +G_DECLARE_FINAL_TYPE( + FirebaseAuthMultiFactorUserHostApiEnrollPhoneResponse, + firebase_auth_multi_factor_user_host_api_enroll_phone_response, + FIREBASE_AUTH, MULTI_FACTOR_USER_HOST_API_ENROLL_PHONE_RESPONSE, GObject) + +struct _FirebaseAuthMultiFactorUserHostApiEnrollPhoneResponse { + GObject parent_instance; + + FlValue* value; +}; + +G_DEFINE_TYPE(FirebaseAuthMultiFactorUserHostApiEnrollPhoneResponse, + firebase_auth_multi_factor_user_host_api_enroll_phone_response, + G_TYPE_OBJECT) + +static void +firebase_auth_multi_factor_user_host_api_enroll_phone_response_dispose( + GObject* object) { + FirebaseAuthMultiFactorUserHostApiEnrollPhoneResponse* self = + FIREBASE_AUTH_MULTI_FACTOR_USER_HOST_API_ENROLL_PHONE_RESPONSE(object); + g_clear_pointer(&self->value, fl_value_unref); + G_OBJECT_CLASS( + firebase_auth_multi_factor_user_host_api_enroll_phone_response_parent_class) + ->dispose(object); +} + +static void firebase_auth_multi_factor_user_host_api_enroll_phone_response_init( + FirebaseAuthMultiFactorUserHostApiEnrollPhoneResponse* self) {} + +static void +firebase_auth_multi_factor_user_host_api_enroll_phone_response_class_init( + FirebaseAuthMultiFactorUserHostApiEnrollPhoneResponseClass* klass) { + G_OBJECT_CLASS(klass)->dispose = + firebase_auth_multi_factor_user_host_api_enroll_phone_response_dispose; +} + +static FirebaseAuthMultiFactorUserHostApiEnrollPhoneResponse* +firebase_auth_multi_factor_user_host_api_enroll_phone_response_new() { + FirebaseAuthMultiFactorUserHostApiEnrollPhoneResponse* self = + FIREBASE_AUTH_MULTI_FACTOR_USER_HOST_API_ENROLL_PHONE_RESPONSE(g_object_new( + firebase_auth_multi_factor_user_host_api_enroll_phone_response_get_type(), + nullptr)); + self->value = fl_value_new_list(); + fl_value_append_take(self->value, fl_value_new_null()); + return self; +} + +static FirebaseAuthMultiFactorUserHostApiEnrollPhoneResponse* +firebase_auth_multi_factor_user_host_api_enroll_phone_response_new_error( + const gchar* code, const gchar* message, FlValue* details) { + FirebaseAuthMultiFactorUserHostApiEnrollPhoneResponse* self = + FIREBASE_AUTH_MULTI_FACTOR_USER_HOST_API_ENROLL_PHONE_RESPONSE(g_object_new( + firebase_auth_multi_factor_user_host_api_enroll_phone_response_get_type(), + nullptr)); + self->value = fl_value_new_list(); + fl_value_append_take(self->value, fl_value_new_string(code)); + fl_value_append_take(self->value, + fl_value_new_string(message != nullptr ? message : "")); + fl_value_append_take(self->value, details != nullptr ? fl_value_ref(details) + : fl_value_new_null()); + return self; +} + +G_DECLARE_FINAL_TYPE( + FirebaseAuthMultiFactorUserHostApiEnrollTotpResponse, + firebase_auth_multi_factor_user_host_api_enroll_totp_response, + FIREBASE_AUTH, MULTI_FACTOR_USER_HOST_API_ENROLL_TOTP_RESPONSE, GObject) + +struct _FirebaseAuthMultiFactorUserHostApiEnrollTotpResponse { + GObject parent_instance; + + FlValue* value; +}; + +G_DEFINE_TYPE(FirebaseAuthMultiFactorUserHostApiEnrollTotpResponse, + firebase_auth_multi_factor_user_host_api_enroll_totp_response, + G_TYPE_OBJECT) + +static void +firebase_auth_multi_factor_user_host_api_enroll_totp_response_dispose( + GObject* object) { + FirebaseAuthMultiFactorUserHostApiEnrollTotpResponse* self = + FIREBASE_AUTH_MULTI_FACTOR_USER_HOST_API_ENROLL_TOTP_RESPONSE(object); + g_clear_pointer(&self->value, fl_value_unref); + G_OBJECT_CLASS( + firebase_auth_multi_factor_user_host_api_enroll_totp_response_parent_class) + ->dispose(object); +} + +static void firebase_auth_multi_factor_user_host_api_enroll_totp_response_init( + FirebaseAuthMultiFactorUserHostApiEnrollTotpResponse* self) {} + +static void +firebase_auth_multi_factor_user_host_api_enroll_totp_response_class_init( + FirebaseAuthMultiFactorUserHostApiEnrollTotpResponseClass* klass) { + G_OBJECT_CLASS(klass)->dispose = + firebase_auth_multi_factor_user_host_api_enroll_totp_response_dispose; +} + +static FirebaseAuthMultiFactorUserHostApiEnrollTotpResponse* +firebase_auth_multi_factor_user_host_api_enroll_totp_response_new() { + FirebaseAuthMultiFactorUserHostApiEnrollTotpResponse* self = + FIREBASE_AUTH_MULTI_FACTOR_USER_HOST_API_ENROLL_TOTP_RESPONSE(g_object_new( + firebase_auth_multi_factor_user_host_api_enroll_totp_response_get_type(), + nullptr)); + self->value = fl_value_new_list(); + fl_value_append_take(self->value, fl_value_new_null()); + return self; +} + +static FirebaseAuthMultiFactorUserHostApiEnrollTotpResponse* +firebase_auth_multi_factor_user_host_api_enroll_totp_response_new_error( + const gchar* code, const gchar* message, FlValue* details) { + FirebaseAuthMultiFactorUserHostApiEnrollTotpResponse* self = + FIREBASE_AUTH_MULTI_FACTOR_USER_HOST_API_ENROLL_TOTP_RESPONSE(g_object_new( + firebase_auth_multi_factor_user_host_api_enroll_totp_response_get_type(), + nullptr)); + self->value = fl_value_new_list(); + fl_value_append_take(self->value, fl_value_new_string(code)); + fl_value_append_take(self->value, + fl_value_new_string(message != nullptr ? message : "")); + fl_value_append_take(self->value, details != nullptr ? fl_value_ref(details) + : fl_value_new_null()); + return self; +} + +G_DECLARE_FINAL_TYPE( + FirebaseAuthMultiFactorUserHostApiGetSessionResponse, + firebase_auth_multi_factor_user_host_api_get_session_response, + FIREBASE_AUTH, MULTI_FACTOR_USER_HOST_API_GET_SESSION_RESPONSE, GObject) + +struct _FirebaseAuthMultiFactorUserHostApiGetSessionResponse { + GObject parent_instance; + + FlValue* value; +}; + +G_DEFINE_TYPE(FirebaseAuthMultiFactorUserHostApiGetSessionResponse, + firebase_auth_multi_factor_user_host_api_get_session_response, + G_TYPE_OBJECT) + +static void +firebase_auth_multi_factor_user_host_api_get_session_response_dispose( + GObject* object) { + FirebaseAuthMultiFactorUserHostApiGetSessionResponse* self = + FIREBASE_AUTH_MULTI_FACTOR_USER_HOST_API_GET_SESSION_RESPONSE(object); + g_clear_pointer(&self->value, fl_value_unref); + G_OBJECT_CLASS( + firebase_auth_multi_factor_user_host_api_get_session_response_parent_class) + ->dispose(object); +} + +static void firebase_auth_multi_factor_user_host_api_get_session_response_init( + FirebaseAuthMultiFactorUserHostApiGetSessionResponse* self) {} + +static void +firebase_auth_multi_factor_user_host_api_get_session_response_class_init( + FirebaseAuthMultiFactorUserHostApiGetSessionResponseClass* klass) { + G_OBJECT_CLASS(klass)->dispose = + firebase_auth_multi_factor_user_host_api_get_session_response_dispose; +} + +static FirebaseAuthMultiFactorUserHostApiGetSessionResponse* +firebase_auth_multi_factor_user_host_api_get_session_response_new( + FirebaseAuthInternalMultiFactorSession* return_value) { + FirebaseAuthMultiFactorUserHostApiGetSessionResponse* self = + FIREBASE_AUTH_MULTI_FACTOR_USER_HOST_API_GET_SESSION_RESPONSE(g_object_new( + firebase_auth_multi_factor_user_host_api_get_session_response_get_type(), + nullptr)); + self->value = fl_value_new_list(); + fl_value_append_take(self->value, + fl_value_new_custom_object( + firebase_auth_internal_multi_factor_session_type_id, + G_OBJECT(return_value))); + return self; +} + +static FirebaseAuthMultiFactorUserHostApiGetSessionResponse* +firebase_auth_multi_factor_user_host_api_get_session_response_new_error( + const gchar* code, const gchar* message, FlValue* details) { + FirebaseAuthMultiFactorUserHostApiGetSessionResponse* self = + FIREBASE_AUTH_MULTI_FACTOR_USER_HOST_API_GET_SESSION_RESPONSE(g_object_new( + firebase_auth_multi_factor_user_host_api_get_session_response_get_type(), + nullptr)); + self->value = fl_value_new_list(); + fl_value_append_take(self->value, fl_value_new_string(code)); + fl_value_append_take(self->value, + fl_value_new_string(message != nullptr ? message : "")); + fl_value_append_take(self->value, details != nullptr ? fl_value_ref(details) + : fl_value_new_null()); + return self; +} + +G_DECLARE_FINAL_TYPE(FirebaseAuthMultiFactorUserHostApiUnenrollResponse, + firebase_auth_multi_factor_user_host_api_unenroll_response, + FIREBASE_AUTH, + MULTI_FACTOR_USER_HOST_API_UNENROLL_RESPONSE, GObject) + +struct _FirebaseAuthMultiFactorUserHostApiUnenrollResponse { + GObject parent_instance; + + FlValue* value; +}; + +G_DEFINE_TYPE(FirebaseAuthMultiFactorUserHostApiUnenrollResponse, + firebase_auth_multi_factor_user_host_api_unenroll_response, + G_TYPE_OBJECT) + +static void firebase_auth_multi_factor_user_host_api_unenroll_response_dispose( + GObject* object) { + FirebaseAuthMultiFactorUserHostApiUnenrollResponse* self = + FIREBASE_AUTH_MULTI_FACTOR_USER_HOST_API_UNENROLL_RESPONSE(object); + g_clear_pointer(&self->value, fl_value_unref); + G_OBJECT_CLASS( + firebase_auth_multi_factor_user_host_api_unenroll_response_parent_class) + ->dispose(object); +} + +static void firebase_auth_multi_factor_user_host_api_unenroll_response_init( + FirebaseAuthMultiFactorUserHostApiUnenrollResponse* self) {} + +static void +firebase_auth_multi_factor_user_host_api_unenroll_response_class_init( + FirebaseAuthMultiFactorUserHostApiUnenrollResponseClass* klass) { + G_OBJECT_CLASS(klass)->dispose = + firebase_auth_multi_factor_user_host_api_unenroll_response_dispose; +} + +static FirebaseAuthMultiFactorUserHostApiUnenrollResponse* +firebase_auth_multi_factor_user_host_api_unenroll_response_new() { + FirebaseAuthMultiFactorUserHostApiUnenrollResponse* self = + FIREBASE_AUTH_MULTI_FACTOR_USER_HOST_API_UNENROLL_RESPONSE(g_object_new( + firebase_auth_multi_factor_user_host_api_unenroll_response_get_type(), + nullptr)); + self->value = fl_value_new_list(); + fl_value_append_take(self->value, fl_value_new_null()); + return self; +} + +static FirebaseAuthMultiFactorUserHostApiUnenrollResponse* +firebase_auth_multi_factor_user_host_api_unenroll_response_new_error( + const gchar* code, const gchar* message, FlValue* details) { + FirebaseAuthMultiFactorUserHostApiUnenrollResponse* self = + FIREBASE_AUTH_MULTI_FACTOR_USER_HOST_API_UNENROLL_RESPONSE(g_object_new( + firebase_auth_multi_factor_user_host_api_unenroll_response_get_type(), + nullptr)); + self->value = fl_value_new_list(); + fl_value_append_take(self->value, fl_value_new_string(code)); + fl_value_append_take(self->value, + fl_value_new_string(message != nullptr ? message : "")); + fl_value_append_take(self->value, details != nullptr ? fl_value_ref(details) + : fl_value_new_null()); + return self; +} + +G_DECLARE_FINAL_TYPE( + FirebaseAuthMultiFactorUserHostApiGetEnrolledFactorsResponse, + firebase_auth_multi_factor_user_host_api_get_enrolled_factors_response, + FIREBASE_AUTH, MULTI_FACTOR_USER_HOST_API_GET_ENROLLED_FACTORS_RESPONSE, + GObject) + +struct _FirebaseAuthMultiFactorUserHostApiGetEnrolledFactorsResponse { + GObject parent_instance; + + FlValue* value; +}; + +G_DEFINE_TYPE( + FirebaseAuthMultiFactorUserHostApiGetEnrolledFactorsResponse, + firebase_auth_multi_factor_user_host_api_get_enrolled_factors_response, + G_TYPE_OBJECT) + +static void +firebase_auth_multi_factor_user_host_api_get_enrolled_factors_response_dispose( + GObject* object) { + FirebaseAuthMultiFactorUserHostApiGetEnrolledFactorsResponse* self = + FIREBASE_AUTH_MULTI_FACTOR_USER_HOST_API_GET_ENROLLED_FACTORS_RESPONSE( + object); + g_clear_pointer(&self->value, fl_value_unref); + G_OBJECT_CLASS( + firebase_auth_multi_factor_user_host_api_get_enrolled_factors_response_parent_class) + ->dispose(object); +} + +static void +firebase_auth_multi_factor_user_host_api_get_enrolled_factors_response_init( + FirebaseAuthMultiFactorUserHostApiGetEnrolledFactorsResponse* self) {} + +static void +firebase_auth_multi_factor_user_host_api_get_enrolled_factors_response_class_init( + FirebaseAuthMultiFactorUserHostApiGetEnrolledFactorsResponseClass* klass) { + G_OBJECT_CLASS(klass)->dispose = + firebase_auth_multi_factor_user_host_api_get_enrolled_factors_response_dispose; +} + +static FirebaseAuthMultiFactorUserHostApiGetEnrolledFactorsResponse* +firebase_auth_multi_factor_user_host_api_get_enrolled_factors_response_new( + FlValue* return_value) { + FirebaseAuthMultiFactorUserHostApiGetEnrolledFactorsResponse* self = + FIREBASE_AUTH_MULTI_FACTOR_USER_HOST_API_GET_ENROLLED_FACTORS_RESPONSE( + g_object_new( + firebase_auth_multi_factor_user_host_api_get_enrolled_factors_response_get_type(), + nullptr)); + self->value = fl_value_new_list(); + fl_value_append_take(self->value, fl_value_ref(return_value)); + return self; +} + +static FirebaseAuthMultiFactorUserHostApiGetEnrolledFactorsResponse* +firebase_auth_multi_factor_user_host_api_get_enrolled_factors_response_new_error( + const gchar* code, const gchar* message, FlValue* details) { + FirebaseAuthMultiFactorUserHostApiGetEnrolledFactorsResponse* self = + FIREBASE_AUTH_MULTI_FACTOR_USER_HOST_API_GET_ENROLLED_FACTORS_RESPONSE( + g_object_new( + firebase_auth_multi_factor_user_host_api_get_enrolled_factors_response_get_type(), + nullptr)); + self->value = fl_value_new_list(); + fl_value_append_take(self->value, fl_value_new_string(code)); + fl_value_append_take(self->value, + fl_value_new_string(message != nullptr ? message : "")); + fl_value_append_take(self->value, details != nullptr ? fl_value_ref(details) + : fl_value_new_null()); + return self; +} + +struct _FirebaseAuthMultiFactorUserHostApi { + GObject parent_instance; + + const FirebaseAuthMultiFactorUserHostApiVTable* vtable; + gpointer user_data; + GDestroyNotify user_data_free_func; +}; + +G_DEFINE_TYPE(FirebaseAuthMultiFactorUserHostApi, + firebase_auth_multi_factor_user_host_api, G_TYPE_OBJECT) + +static void firebase_auth_multi_factor_user_host_api_dispose(GObject* object) { + FirebaseAuthMultiFactorUserHostApi* self = + FIREBASE_AUTH_MULTI_FACTOR_USER_HOST_API(object); + if (self->user_data != nullptr) { + self->user_data_free_func(self->user_data); + } + self->user_data = nullptr; + G_OBJECT_CLASS(firebase_auth_multi_factor_user_host_api_parent_class) + ->dispose(object); +} + +static void firebase_auth_multi_factor_user_host_api_init( + FirebaseAuthMultiFactorUserHostApi* self) {} + +static void firebase_auth_multi_factor_user_host_api_class_init( + FirebaseAuthMultiFactorUserHostApiClass* klass) { + G_OBJECT_CLASS(klass)->dispose = + firebase_auth_multi_factor_user_host_api_dispose; +} + +static FirebaseAuthMultiFactorUserHostApi* +firebase_auth_multi_factor_user_host_api_new( + const FirebaseAuthMultiFactorUserHostApiVTable* vtable, gpointer user_data, + GDestroyNotify user_data_free_func) { + FirebaseAuthMultiFactorUserHostApi* self = + FIREBASE_AUTH_MULTI_FACTOR_USER_HOST_API(g_object_new( + firebase_auth_multi_factor_user_host_api_get_type(), nullptr)); + self->vtable = vtable; + self->user_data = user_data; + self->user_data_free_func = user_data_free_func; + return self; +} + +static void firebase_auth_multi_factor_user_host_api_enroll_phone_cb( + FlBasicMessageChannel* channel, FlValue* message_, + FlBasicMessageChannelResponseHandle* response_handle, gpointer user_data) { + FirebaseAuthMultiFactorUserHostApi* self = + FIREBASE_AUTH_MULTI_FACTOR_USER_HOST_API(user_data); + + if (self->vtable == nullptr || self->vtable->enroll_phone == nullptr) { + return; + } + + FlValue* value0 = fl_value_get_list_value(message_, 0); + FirebaseAuthAuthPigeonFirebaseApp* app = + FIREBASE_AUTH_AUTH_PIGEON_FIREBASE_APP( + fl_value_get_custom_value_object(value0)); + FlValue* value1 = fl_value_get_list_value(message_, 1); + FirebaseAuthInternalPhoneMultiFactorAssertion* assertion = + FIREBASE_AUTH_INTERNAL_PHONE_MULTI_FACTOR_ASSERTION( + fl_value_get_custom_value_object(value1)); + FlValue* value2 = fl_value_get_list_value(message_, 2); + const gchar* display_name = fl_value_get_string(value2); + g_autoptr(FirebaseAuthMultiFactorUserHostApiResponseHandle) handle = + firebase_auth_multi_factor_user_host_api_response_handle_new( + channel, response_handle); + self->vtable->enroll_phone(app, assertion, display_name, handle, + self->user_data); +} + +static void firebase_auth_multi_factor_user_host_api_enroll_totp_cb( + FlBasicMessageChannel* channel, FlValue* message_, + FlBasicMessageChannelResponseHandle* response_handle, gpointer user_data) { + FirebaseAuthMultiFactorUserHostApi* self = + FIREBASE_AUTH_MULTI_FACTOR_USER_HOST_API(user_data); + + if (self->vtable == nullptr || self->vtable->enroll_totp == nullptr) { + return; + } + + FlValue* value0 = fl_value_get_list_value(message_, 0); + FirebaseAuthAuthPigeonFirebaseApp* app = + FIREBASE_AUTH_AUTH_PIGEON_FIREBASE_APP( + fl_value_get_custom_value_object(value0)); + FlValue* value1 = fl_value_get_list_value(message_, 1); + const gchar* assertion_id = fl_value_get_string(value1); + FlValue* value2 = fl_value_get_list_value(message_, 2); + const gchar* display_name = fl_value_get_string(value2); + g_autoptr(FirebaseAuthMultiFactorUserHostApiResponseHandle) handle = + firebase_auth_multi_factor_user_host_api_response_handle_new( + channel, response_handle); + self->vtable->enroll_totp(app, assertion_id, display_name, handle, + self->user_data); +} + +static void firebase_auth_multi_factor_user_host_api_get_session_cb( + FlBasicMessageChannel* channel, FlValue* message_, + FlBasicMessageChannelResponseHandle* response_handle, gpointer user_data) { + FirebaseAuthMultiFactorUserHostApi* self = + FIREBASE_AUTH_MULTI_FACTOR_USER_HOST_API(user_data); + + if (self->vtable == nullptr || self->vtable->get_session == nullptr) { + return; + } + + FlValue* value0 = fl_value_get_list_value(message_, 0); + FirebaseAuthAuthPigeonFirebaseApp* app = + FIREBASE_AUTH_AUTH_PIGEON_FIREBASE_APP( + fl_value_get_custom_value_object(value0)); + g_autoptr(FirebaseAuthMultiFactorUserHostApiResponseHandle) handle = + firebase_auth_multi_factor_user_host_api_response_handle_new( + channel, response_handle); + self->vtable->get_session(app, handle, self->user_data); +} + +static void firebase_auth_multi_factor_user_host_api_unenroll_cb( + FlBasicMessageChannel* channel, FlValue* message_, + FlBasicMessageChannelResponseHandle* response_handle, gpointer user_data) { + FirebaseAuthMultiFactorUserHostApi* self = + FIREBASE_AUTH_MULTI_FACTOR_USER_HOST_API(user_data); + + if (self->vtable == nullptr || self->vtable->unenroll == nullptr) { + return; + } + + FlValue* value0 = fl_value_get_list_value(message_, 0); + FirebaseAuthAuthPigeonFirebaseApp* app = + FIREBASE_AUTH_AUTH_PIGEON_FIREBASE_APP( + fl_value_get_custom_value_object(value0)); + FlValue* value1 = fl_value_get_list_value(message_, 1); + const gchar* factor_uid = fl_value_get_string(value1); + g_autoptr(FirebaseAuthMultiFactorUserHostApiResponseHandle) handle = + firebase_auth_multi_factor_user_host_api_response_handle_new( + channel, response_handle); + self->vtable->unenroll(app, factor_uid, handle, self->user_data); +} + +static void firebase_auth_multi_factor_user_host_api_get_enrolled_factors_cb( + FlBasicMessageChannel* channel, FlValue* message_, + FlBasicMessageChannelResponseHandle* response_handle, gpointer user_data) { + FirebaseAuthMultiFactorUserHostApi* self = + FIREBASE_AUTH_MULTI_FACTOR_USER_HOST_API(user_data); + + if (self->vtable == nullptr || + self->vtable->get_enrolled_factors == nullptr) { + return; + } + + FlValue* value0 = fl_value_get_list_value(message_, 0); + FirebaseAuthAuthPigeonFirebaseApp* app = + FIREBASE_AUTH_AUTH_PIGEON_FIREBASE_APP( + fl_value_get_custom_value_object(value0)); + g_autoptr(FirebaseAuthMultiFactorUserHostApiResponseHandle) handle = + firebase_auth_multi_factor_user_host_api_response_handle_new( + channel, response_handle); + self->vtable->get_enrolled_factors(app, handle, self->user_data); +} + +void firebase_auth_multi_factor_user_host_api_set_method_handlers( + FlBinaryMessenger* messenger, const gchar* suffix, + const FirebaseAuthMultiFactorUserHostApiVTable* vtable, gpointer user_data, + GDestroyNotify user_data_free_func) { + g_autofree gchar* dot_suffix = + suffix != nullptr ? g_strdup_printf(".%s", suffix) : g_strdup(""); + g_autoptr(FirebaseAuthMultiFactorUserHostApi) api_data = + firebase_auth_multi_factor_user_host_api_new(vtable, user_data, + user_data_free_func); + + g_autoptr(FirebaseAuthMessageCodec) codec = firebase_auth_message_codec_new(); + g_autofree gchar* enroll_phone_channel_name = g_strdup_printf( + "dev.flutter.pigeon.firebase_auth_platform_interface." + "MultiFactorUserHostApi.enrollPhone%s", + dot_suffix); + g_autoptr(FlBasicMessageChannel) enroll_phone_channel = + fl_basic_message_channel_new(messenger, enroll_phone_channel_name, + FL_MESSAGE_CODEC(codec)); + fl_basic_message_channel_set_message_handler( + enroll_phone_channel, + firebase_auth_multi_factor_user_host_api_enroll_phone_cb, + g_object_ref(api_data), g_object_unref); + g_autofree gchar* enroll_totp_channel_name = g_strdup_printf( + "dev.flutter.pigeon.firebase_auth_platform_interface." + "MultiFactorUserHostApi.enrollTotp%s", + dot_suffix); + g_autoptr(FlBasicMessageChannel) enroll_totp_channel = + fl_basic_message_channel_new(messenger, enroll_totp_channel_name, + FL_MESSAGE_CODEC(codec)); + fl_basic_message_channel_set_message_handler( + enroll_totp_channel, + firebase_auth_multi_factor_user_host_api_enroll_totp_cb, + g_object_ref(api_data), g_object_unref); + g_autofree gchar* get_session_channel_name = g_strdup_printf( + "dev.flutter.pigeon.firebase_auth_platform_interface." + "MultiFactorUserHostApi.getSession%s", + dot_suffix); + g_autoptr(FlBasicMessageChannel) get_session_channel = + fl_basic_message_channel_new(messenger, get_session_channel_name, + FL_MESSAGE_CODEC(codec)); + fl_basic_message_channel_set_message_handler( + get_session_channel, + firebase_auth_multi_factor_user_host_api_get_session_cb, + g_object_ref(api_data), g_object_unref); + g_autofree gchar* unenroll_channel_name = g_strdup_printf( + "dev.flutter.pigeon.firebase_auth_platform_interface." + "MultiFactorUserHostApi.unenroll%s", + dot_suffix); + g_autoptr(FlBasicMessageChannel) unenroll_channel = + fl_basic_message_channel_new(messenger, unenroll_channel_name, + FL_MESSAGE_CODEC(codec)); + fl_basic_message_channel_set_message_handler( + unenroll_channel, firebase_auth_multi_factor_user_host_api_unenroll_cb, + g_object_ref(api_data), g_object_unref); + g_autofree gchar* get_enrolled_factors_channel_name = g_strdup_printf( + "dev.flutter.pigeon.firebase_auth_platform_interface." + "MultiFactorUserHostApi.getEnrolledFactors%s", + dot_suffix); + g_autoptr(FlBasicMessageChannel) get_enrolled_factors_channel = + fl_basic_message_channel_new(messenger, get_enrolled_factors_channel_name, + FL_MESSAGE_CODEC(codec)); + fl_basic_message_channel_set_message_handler( + get_enrolled_factors_channel, + firebase_auth_multi_factor_user_host_api_get_enrolled_factors_cb, + g_object_ref(api_data), g_object_unref); +} + +void firebase_auth_multi_factor_user_host_api_clear_method_handlers( + FlBinaryMessenger* messenger, const gchar* suffix) { + g_autofree gchar* dot_suffix = + suffix != nullptr ? g_strdup_printf(".%s", suffix) : g_strdup(""); + + g_autoptr(FirebaseAuthMessageCodec) codec = firebase_auth_message_codec_new(); + g_autofree gchar* enroll_phone_channel_name = g_strdup_printf( + "dev.flutter.pigeon.firebase_auth_platform_interface." + "MultiFactorUserHostApi.enrollPhone%s", + dot_suffix); + g_autoptr(FlBasicMessageChannel) enroll_phone_channel = + fl_basic_message_channel_new(messenger, enroll_phone_channel_name, + FL_MESSAGE_CODEC(codec)); + fl_basic_message_channel_set_message_handler(enroll_phone_channel, nullptr, + nullptr, nullptr); + g_autofree gchar* enroll_totp_channel_name = g_strdup_printf( + "dev.flutter.pigeon.firebase_auth_platform_interface." + "MultiFactorUserHostApi.enrollTotp%s", + dot_suffix); + g_autoptr(FlBasicMessageChannel) enroll_totp_channel = + fl_basic_message_channel_new(messenger, enroll_totp_channel_name, + FL_MESSAGE_CODEC(codec)); + fl_basic_message_channel_set_message_handler(enroll_totp_channel, nullptr, + nullptr, nullptr); + g_autofree gchar* get_session_channel_name = g_strdup_printf( + "dev.flutter.pigeon.firebase_auth_platform_interface." + "MultiFactorUserHostApi.getSession%s", + dot_suffix); + g_autoptr(FlBasicMessageChannel) get_session_channel = + fl_basic_message_channel_new(messenger, get_session_channel_name, + FL_MESSAGE_CODEC(codec)); + fl_basic_message_channel_set_message_handler(get_session_channel, nullptr, + nullptr, nullptr); + g_autofree gchar* unenroll_channel_name = g_strdup_printf( + "dev.flutter.pigeon.firebase_auth_platform_interface." + "MultiFactorUserHostApi.unenroll%s", + dot_suffix); + g_autoptr(FlBasicMessageChannel) unenroll_channel = + fl_basic_message_channel_new(messenger, unenroll_channel_name, + FL_MESSAGE_CODEC(codec)); + fl_basic_message_channel_set_message_handler(unenroll_channel, nullptr, + nullptr, nullptr); + g_autofree gchar* get_enrolled_factors_channel_name = g_strdup_printf( + "dev.flutter.pigeon.firebase_auth_platform_interface." + "MultiFactorUserHostApi.getEnrolledFactors%s", + dot_suffix); + g_autoptr(FlBasicMessageChannel) get_enrolled_factors_channel = + fl_basic_message_channel_new(messenger, get_enrolled_factors_channel_name, + FL_MESSAGE_CODEC(codec)); + fl_basic_message_channel_set_message_handler(get_enrolled_factors_channel, + nullptr, nullptr, nullptr); +} + +void firebase_auth_multi_factor_user_host_api_respond_enroll_phone( + FirebaseAuthMultiFactorUserHostApiResponseHandle* response_handle) { + g_autoptr(FirebaseAuthMultiFactorUserHostApiEnrollPhoneResponse) response = + firebase_auth_multi_factor_user_host_api_enroll_phone_response_new(); + g_autoptr(GError) error = nullptr; + if (!fl_basic_message_channel_respond(response_handle->channel, + response_handle->response_handle, + response->value, &error)) { + g_warning("Failed to send response to %s.%s: %s", "MultiFactorUserHostApi", + "enrollPhone", error->message); + } +} + +void firebase_auth_multi_factor_user_host_api_respond_error_enroll_phone( + FirebaseAuthMultiFactorUserHostApiResponseHandle* response_handle, + const gchar* code, const gchar* message, FlValue* details) { + g_autoptr(FirebaseAuthMultiFactorUserHostApiEnrollPhoneResponse) response = + firebase_auth_multi_factor_user_host_api_enroll_phone_response_new_error( + code, message, details); + g_autoptr(GError) error = nullptr; + if (!fl_basic_message_channel_respond(response_handle->channel, + response_handle->response_handle, + response->value, &error)) { + g_warning("Failed to send response to %s.%s: %s", "MultiFactorUserHostApi", + "enrollPhone", error->message); + } +} + +void firebase_auth_multi_factor_user_host_api_respond_enroll_totp( + FirebaseAuthMultiFactorUserHostApiResponseHandle* response_handle) { + g_autoptr(FirebaseAuthMultiFactorUserHostApiEnrollTotpResponse) response = + firebase_auth_multi_factor_user_host_api_enroll_totp_response_new(); + g_autoptr(GError) error = nullptr; + if (!fl_basic_message_channel_respond(response_handle->channel, + response_handle->response_handle, + response->value, &error)) { + g_warning("Failed to send response to %s.%s: %s", "MultiFactorUserHostApi", + "enrollTotp", error->message); + } +} + +void firebase_auth_multi_factor_user_host_api_respond_error_enroll_totp( + FirebaseAuthMultiFactorUserHostApiResponseHandle* response_handle, + const gchar* code, const gchar* message, FlValue* details) { + g_autoptr(FirebaseAuthMultiFactorUserHostApiEnrollTotpResponse) response = + firebase_auth_multi_factor_user_host_api_enroll_totp_response_new_error( + code, message, details); + g_autoptr(GError) error = nullptr; + if (!fl_basic_message_channel_respond(response_handle->channel, + response_handle->response_handle, + response->value, &error)) { + g_warning("Failed to send response to %s.%s: %s", "MultiFactorUserHostApi", + "enrollTotp", error->message); + } +} + +void firebase_auth_multi_factor_user_host_api_respond_get_session( + FirebaseAuthMultiFactorUserHostApiResponseHandle* response_handle, + FirebaseAuthInternalMultiFactorSession* return_value) { + g_autoptr(FirebaseAuthMultiFactorUserHostApiGetSessionResponse) response = + firebase_auth_multi_factor_user_host_api_get_session_response_new( + return_value); + g_autoptr(GError) error = nullptr; + if (!fl_basic_message_channel_respond(response_handle->channel, + response_handle->response_handle, + response->value, &error)) { + g_warning("Failed to send response to %s.%s: %s", "MultiFactorUserHostApi", + "getSession", error->message); + } +} + +void firebase_auth_multi_factor_user_host_api_respond_error_get_session( + FirebaseAuthMultiFactorUserHostApiResponseHandle* response_handle, + const gchar* code, const gchar* message, FlValue* details) { + g_autoptr(FirebaseAuthMultiFactorUserHostApiGetSessionResponse) response = + firebase_auth_multi_factor_user_host_api_get_session_response_new_error( + code, message, details); + g_autoptr(GError) error = nullptr; + if (!fl_basic_message_channel_respond(response_handle->channel, + response_handle->response_handle, + response->value, &error)) { + g_warning("Failed to send response to %s.%s: %s", "MultiFactorUserHostApi", + "getSession", error->message); + } +} + +void firebase_auth_multi_factor_user_host_api_respond_unenroll( + FirebaseAuthMultiFactorUserHostApiResponseHandle* response_handle) { + g_autoptr(FirebaseAuthMultiFactorUserHostApiUnenrollResponse) response = + firebase_auth_multi_factor_user_host_api_unenroll_response_new(); + g_autoptr(GError) error = nullptr; + if (!fl_basic_message_channel_respond(response_handle->channel, + response_handle->response_handle, + response->value, &error)) { + g_warning("Failed to send response to %s.%s: %s", "MultiFactorUserHostApi", + "unenroll", error->message); + } +} + +void firebase_auth_multi_factor_user_host_api_respond_error_unenroll( + FirebaseAuthMultiFactorUserHostApiResponseHandle* response_handle, + const gchar* code, const gchar* message, FlValue* details) { + g_autoptr(FirebaseAuthMultiFactorUserHostApiUnenrollResponse) response = + firebase_auth_multi_factor_user_host_api_unenroll_response_new_error( + code, message, details); + g_autoptr(GError) error = nullptr; + if (!fl_basic_message_channel_respond(response_handle->channel, + response_handle->response_handle, + response->value, &error)) { + g_warning("Failed to send response to %s.%s: %s", "MultiFactorUserHostApi", + "unenroll", error->message); + } +} + +void firebase_auth_multi_factor_user_host_api_respond_get_enrolled_factors( + FirebaseAuthMultiFactorUserHostApiResponseHandle* response_handle, + FlValue* return_value) { + g_autoptr( + FirebaseAuthMultiFactorUserHostApiGetEnrolledFactorsResponse) response = + firebase_auth_multi_factor_user_host_api_get_enrolled_factors_response_new( + return_value); + g_autoptr(GError) error = nullptr; + if (!fl_basic_message_channel_respond(response_handle->channel, + response_handle->response_handle, + response->value, &error)) { + g_warning("Failed to send response to %s.%s: %s", "MultiFactorUserHostApi", + "getEnrolledFactors", error->message); + } +} + +void firebase_auth_multi_factor_user_host_api_respond_error_get_enrolled_factors( + FirebaseAuthMultiFactorUserHostApiResponseHandle* response_handle, + const gchar* code, const gchar* message, FlValue* details) { + g_autoptr( + FirebaseAuthMultiFactorUserHostApiGetEnrolledFactorsResponse) response = + firebase_auth_multi_factor_user_host_api_get_enrolled_factors_response_new_error( + code, message, details); + g_autoptr(GError) error = nullptr; + if (!fl_basic_message_channel_respond(response_handle->channel, + response_handle->response_handle, + response->value, &error)) { + g_warning("Failed to send response to %s.%s: %s", "MultiFactorUserHostApi", + "getEnrolledFactors", error->message); + } +} + +struct _FirebaseAuthMultiFactoResolverHostApiResponseHandle { + GObject parent_instance; + + FlBasicMessageChannel* channel; + FlBasicMessageChannelResponseHandle* response_handle; +}; + +G_DEFINE_TYPE(FirebaseAuthMultiFactoResolverHostApiResponseHandle, + firebase_auth_multi_facto_resolver_host_api_response_handle, + G_TYPE_OBJECT) + +static void firebase_auth_multi_facto_resolver_host_api_response_handle_dispose( + GObject* object) { + FirebaseAuthMultiFactoResolverHostApiResponseHandle* self = + FIREBASE_AUTH_MULTI_FACTO_RESOLVER_HOST_API_RESPONSE_HANDLE(object); + g_clear_object(&self->channel); + g_clear_object(&self->response_handle); + G_OBJECT_CLASS( + firebase_auth_multi_facto_resolver_host_api_response_handle_parent_class) + ->dispose(object); +} + +static void firebase_auth_multi_facto_resolver_host_api_response_handle_init( + FirebaseAuthMultiFactoResolverHostApiResponseHandle* self) {} + +static void +firebase_auth_multi_facto_resolver_host_api_response_handle_class_init( + FirebaseAuthMultiFactoResolverHostApiResponseHandleClass* klass) { + G_OBJECT_CLASS(klass)->dispose = + firebase_auth_multi_facto_resolver_host_api_response_handle_dispose; +} + +static FirebaseAuthMultiFactoResolverHostApiResponseHandle* +firebase_auth_multi_facto_resolver_host_api_response_handle_new( + FlBasicMessageChannel* channel, + FlBasicMessageChannelResponseHandle* response_handle) { + FirebaseAuthMultiFactoResolverHostApiResponseHandle* self = + FIREBASE_AUTH_MULTI_FACTO_RESOLVER_HOST_API_RESPONSE_HANDLE(g_object_new( + firebase_auth_multi_facto_resolver_host_api_response_handle_get_type(), + nullptr)); + self->channel = FL_BASIC_MESSAGE_CHANNEL(g_object_ref(channel)); + self->response_handle = + FL_BASIC_MESSAGE_CHANNEL_RESPONSE_HANDLE(g_object_ref(response_handle)); + return self; +} + +G_DECLARE_FINAL_TYPE( + FirebaseAuthMultiFactoResolverHostApiResolveSignInResponse, + firebase_auth_multi_facto_resolver_host_api_resolve_sign_in_response, + FIREBASE_AUTH, MULTI_FACTO_RESOLVER_HOST_API_RESOLVE_SIGN_IN_RESPONSE, + GObject) + +struct _FirebaseAuthMultiFactoResolverHostApiResolveSignInResponse { + GObject parent_instance; + + FlValue* value; +}; + +G_DEFINE_TYPE( + FirebaseAuthMultiFactoResolverHostApiResolveSignInResponse, + firebase_auth_multi_facto_resolver_host_api_resolve_sign_in_response, + G_TYPE_OBJECT) + +static void +firebase_auth_multi_facto_resolver_host_api_resolve_sign_in_response_dispose( + GObject* object) { + FirebaseAuthMultiFactoResolverHostApiResolveSignInResponse* self = + FIREBASE_AUTH_MULTI_FACTO_RESOLVER_HOST_API_RESOLVE_SIGN_IN_RESPONSE( + object); + g_clear_pointer(&self->value, fl_value_unref); + G_OBJECT_CLASS( + firebase_auth_multi_facto_resolver_host_api_resolve_sign_in_response_parent_class) + ->dispose(object); +} + +static void +firebase_auth_multi_facto_resolver_host_api_resolve_sign_in_response_init( + FirebaseAuthMultiFactoResolverHostApiResolveSignInResponse* self) {} + +static void +firebase_auth_multi_facto_resolver_host_api_resolve_sign_in_response_class_init( + FirebaseAuthMultiFactoResolverHostApiResolveSignInResponseClass* klass) { + G_OBJECT_CLASS(klass)->dispose = + firebase_auth_multi_facto_resolver_host_api_resolve_sign_in_response_dispose; +} + +static FirebaseAuthMultiFactoResolverHostApiResolveSignInResponse* +firebase_auth_multi_facto_resolver_host_api_resolve_sign_in_response_new( + FirebaseAuthInternalUserCredential* return_value) { + FirebaseAuthMultiFactoResolverHostApiResolveSignInResponse* self = + FIREBASE_AUTH_MULTI_FACTO_RESOLVER_HOST_API_RESOLVE_SIGN_IN_RESPONSE(g_object_new( + firebase_auth_multi_facto_resolver_host_api_resolve_sign_in_response_get_type(), + nullptr)); + self->value = fl_value_new_list(); + fl_value_append_take( + self->value, + fl_value_new_custom_object(firebase_auth_internal_user_credential_type_id, + G_OBJECT(return_value))); + return self; +} + +static FirebaseAuthMultiFactoResolverHostApiResolveSignInResponse* +firebase_auth_multi_facto_resolver_host_api_resolve_sign_in_response_new_error( + const gchar* code, const gchar* message, FlValue* details) { + FirebaseAuthMultiFactoResolverHostApiResolveSignInResponse* self = + FIREBASE_AUTH_MULTI_FACTO_RESOLVER_HOST_API_RESOLVE_SIGN_IN_RESPONSE(g_object_new( + firebase_auth_multi_facto_resolver_host_api_resolve_sign_in_response_get_type(), + nullptr)); + self->value = fl_value_new_list(); + fl_value_append_take(self->value, fl_value_new_string(code)); + fl_value_append_take(self->value, + fl_value_new_string(message != nullptr ? message : "")); + fl_value_append_take(self->value, details != nullptr ? fl_value_ref(details) + : fl_value_new_null()); + return self; +} + +struct _FirebaseAuthMultiFactoResolverHostApi { + GObject parent_instance; + + const FirebaseAuthMultiFactoResolverHostApiVTable* vtable; + gpointer user_data; + GDestroyNotify user_data_free_func; +}; + +G_DEFINE_TYPE(FirebaseAuthMultiFactoResolverHostApi, + firebase_auth_multi_facto_resolver_host_api, G_TYPE_OBJECT) + +static void firebase_auth_multi_facto_resolver_host_api_dispose( + GObject* object) { + FirebaseAuthMultiFactoResolverHostApi* self = + FIREBASE_AUTH_MULTI_FACTO_RESOLVER_HOST_API(object); + if (self->user_data != nullptr) { + self->user_data_free_func(self->user_data); + } + self->user_data = nullptr; + G_OBJECT_CLASS(firebase_auth_multi_facto_resolver_host_api_parent_class) + ->dispose(object); +} + +static void firebase_auth_multi_facto_resolver_host_api_init( + FirebaseAuthMultiFactoResolverHostApi* self) {} + +static void firebase_auth_multi_facto_resolver_host_api_class_init( + FirebaseAuthMultiFactoResolverHostApiClass* klass) { + G_OBJECT_CLASS(klass)->dispose = + firebase_auth_multi_facto_resolver_host_api_dispose; +} + +static FirebaseAuthMultiFactoResolverHostApi* +firebase_auth_multi_facto_resolver_host_api_new( + const FirebaseAuthMultiFactoResolverHostApiVTable* vtable, + gpointer user_data, GDestroyNotify user_data_free_func) { + FirebaseAuthMultiFactoResolverHostApi* self = + FIREBASE_AUTH_MULTI_FACTO_RESOLVER_HOST_API(g_object_new( + firebase_auth_multi_facto_resolver_host_api_get_type(), nullptr)); + self->vtable = vtable; + self->user_data = user_data; + self->user_data_free_func = user_data_free_func; + return self; +} + +static void firebase_auth_multi_facto_resolver_host_api_resolve_sign_in_cb( + FlBasicMessageChannel* channel, FlValue* message_, + FlBasicMessageChannelResponseHandle* response_handle, gpointer user_data) { + FirebaseAuthMultiFactoResolverHostApi* self = + FIREBASE_AUTH_MULTI_FACTO_RESOLVER_HOST_API(user_data); + + if (self->vtable == nullptr || self->vtable->resolve_sign_in == nullptr) { + return; + } + + FlValue* value0 = fl_value_get_list_value(message_, 0); + const gchar* resolver_id = fl_value_get_string(value0); + FlValue* value1 = fl_value_get_list_value(message_, 1); + FirebaseAuthInternalPhoneMultiFactorAssertion* assertion = + FIREBASE_AUTH_INTERNAL_PHONE_MULTI_FACTOR_ASSERTION( + fl_value_get_custom_value_object(value1)); + FlValue* value2 = fl_value_get_list_value(message_, 2); + const gchar* totp_assertion_id = fl_value_get_string(value2); + g_autoptr(FirebaseAuthMultiFactoResolverHostApiResponseHandle) handle = + firebase_auth_multi_facto_resolver_host_api_response_handle_new( + channel, response_handle); + self->vtable->resolve_sign_in(resolver_id, assertion, totp_assertion_id, + handle, self->user_data); +} + +void firebase_auth_multi_facto_resolver_host_api_set_method_handlers( + FlBinaryMessenger* messenger, const gchar* suffix, + const FirebaseAuthMultiFactoResolverHostApiVTable* vtable, + gpointer user_data, GDestroyNotify user_data_free_func) { + g_autofree gchar* dot_suffix = + suffix != nullptr ? g_strdup_printf(".%s", suffix) : g_strdup(""); + g_autoptr(FirebaseAuthMultiFactoResolverHostApi) api_data = + firebase_auth_multi_facto_resolver_host_api_new(vtable, user_data, + user_data_free_func); + + g_autoptr(FirebaseAuthMessageCodec) codec = firebase_auth_message_codec_new(); + g_autofree gchar* resolve_sign_in_channel_name = g_strdup_printf( + "dev.flutter.pigeon.firebase_auth_platform_interface." + "MultiFactoResolverHostApi.resolveSignIn%s", + dot_suffix); + g_autoptr(FlBasicMessageChannel) resolve_sign_in_channel = + fl_basic_message_channel_new(messenger, resolve_sign_in_channel_name, + FL_MESSAGE_CODEC(codec)); + fl_basic_message_channel_set_message_handler( + resolve_sign_in_channel, + firebase_auth_multi_facto_resolver_host_api_resolve_sign_in_cb, + g_object_ref(api_data), g_object_unref); +} + +void firebase_auth_multi_facto_resolver_host_api_clear_method_handlers( + FlBinaryMessenger* messenger, const gchar* suffix) { + g_autofree gchar* dot_suffix = + suffix != nullptr ? g_strdup_printf(".%s", suffix) : g_strdup(""); + + g_autoptr(FirebaseAuthMessageCodec) codec = firebase_auth_message_codec_new(); + g_autofree gchar* resolve_sign_in_channel_name = g_strdup_printf( + "dev.flutter.pigeon.firebase_auth_platform_interface." + "MultiFactoResolverHostApi.resolveSignIn%s", + dot_suffix); + g_autoptr(FlBasicMessageChannel) resolve_sign_in_channel = + fl_basic_message_channel_new(messenger, resolve_sign_in_channel_name, + FL_MESSAGE_CODEC(codec)); + fl_basic_message_channel_set_message_handler(resolve_sign_in_channel, nullptr, + nullptr, nullptr); +} + +void firebase_auth_multi_facto_resolver_host_api_respond_resolve_sign_in( + FirebaseAuthMultiFactoResolverHostApiResponseHandle* response_handle, + FirebaseAuthInternalUserCredential* return_value) { + g_autoptr( + FirebaseAuthMultiFactoResolverHostApiResolveSignInResponse) response = + firebase_auth_multi_facto_resolver_host_api_resolve_sign_in_response_new( + return_value); + g_autoptr(GError) error = nullptr; + if (!fl_basic_message_channel_respond(response_handle->channel, + response_handle->response_handle, + response->value, &error)) { + g_warning("Failed to send response to %s.%s: %s", + "MultiFactoResolverHostApi", "resolveSignIn", error->message); + } +} + +void firebase_auth_multi_facto_resolver_host_api_respond_error_resolve_sign_in( + FirebaseAuthMultiFactoResolverHostApiResponseHandle* response_handle, + const gchar* code, const gchar* message, FlValue* details) { + g_autoptr( + FirebaseAuthMultiFactoResolverHostApiResolveSignInResponse) response = + firebase_auth_multi_facto_resolver_host_api_resolve_sign_in_response_new_error( + code, message, details); + g_autoptr(GError) error = nullptr; + if (!fl_basic_message_channel_respond(response_handle->channel, + response_handle->response_handle, + response->value, &error)) { + g_warning("Failed to send response to %s.%s: %s", + "MultiFactoResolverHostApi", "resolveSignIn", error->message); + } +} + +struct _FirebaseAuthMultiFactorTotpHostApiResponseHandle { + GObject parent_instance; + + FlBasicMessageChannel* channel; + FlBasicMessageChannelResponseHandle* response_handle; +}; + +G_DEFINE_TYPE(FirebaseAuthMultiFactorTotpHostApiResponseHandle, + firebase_auth_multi_factor_totp_host_api_response_handle, + G_TYPE_OBJECT) + +static void firebase_auth_multi_factor_totp_host_api_response_handle_dispose( + GObject* object) { + FirebaseAuthMultiFactorTotpHostApiResponseHandle* self = + FIREBASE_AUTH_MULTI_FACTOR_TOTP_HOST_API_RESPONSE_HANDLE(object); + g_clear_object(&self->channel); + g_clear_object(&self->response_handle); + G_OBJECT_CLASS( + firebase_auth_multi_factor_totp_host_api_response_handle_parent_class) + ->dispose(object); +} + +static void firebase_auth_multi_factor_totp_host_api_response_handle_init( + FirebaseAuthMultiFactorTotpHostApiResponseHandle* self) {} + +static void firebase_auth_multi_factor_totp_host_api_response_handle_class_init( + FirebaseAuthMultiFactorTotpHostApiResponseHandleClass* klass) { + G_OBJECT_CLASS(klass)->dispose = + firebase_auth_multi_factor_totp_host_api_response_handle_dispose; +} + +static FirebaseAuthMultiFactorTotpHostApiResponseHandle* +firebase_auth_multi_factor_totp_host_api_response_handle_new( + FlBasicMessageChannel* channel, + FlBasicMessageChannelResponseHandle* response_handle) { + FirebaseAuthMultiFactorTotpHostApiResponseHandle* self = + FIREBASE_AUTH_MULTI_FACTOR_TOTP_HOST_API_RESPONSE_HANDLE(g_object_new( + firebase_auth_multi_factor_totp_host_api_response_handle_get_type(), + nullptr)); + self->channel = FL_BASIC_MESSAGE_CHANNEL(g_object_ref(channel)); + self->response_handle = + FL_BASIC_MESSAGE_CHANNEL_RESPONSE_HANDLE(g_object_ref(response_handle)); + return self; +} + +G_DECLARE_FINAL_TYPE( + FirebaseAuthMultiFactorTotpHostApiGenerateSecretResponse, + firebase_auth_multi_factor_totp_host_api_generate_secret_response, + FIREBASE_AUTH, MULTI_FACTOR_TOTP_HOST_API_GENERATE_SECRET_RESPONSE, GObject) + +struct _FirebaseAuthMultiFactorTotpHostApiGenerateSecretResponse { + GObject parent_instance; + + FlValue* value; +}; + +G_DEFINE_TYPE(FirebaseAuthMultiFactorTotpHostApiGenerateSecretResponse, + firebase_auth_multi_factor_totp_host_api_generate_secret_response, + G_TYPE_OBJECT) + +static void +firebase_auth_multi_factor_totp_host_api_generate_secret_response_dispose( + GObject* object) { + FirebaseAuthMultiFactorTotpHostApiGenerateSecretResponse* self = + FIREBASE_AUTH_MULTI_FACTOR_TOTP_HOST_API_GENERATE_SECRET_RESPONSE(object); + g_clear_pointer(&self->value, fl_value_unref); + G_OBJECT_CLASS( + firebase_auth_multi_factor_totp_host_api_generate_secret_response_parent_class) + ->dispose(object); +} + +static void +firebase_auth_multi_factor_totp_host_api_generate_secret_response_init( + FirebaseAuthMultiFactorTotpHostApiGenerateSecretResponse* self) {} + +static void +firebase_auth_multi_factor_totp_host_api_generate_secret_response_class_init( + FirebaseAuthMultiFactorTotpHostApiGenerateSecretResponseClass* klass) { + G_OBJECT_CLASS(klass)->dispose = + firebase_auth_multi_factor_totp_host_api_generate_secret_response_dispose; +} + +static FirebaseAuthMultiFactorTotpHostApiGenerateSecretResponse* +firebase_auth_multi_factor_totp_host_api_generate_secret_response_new( + FirebaseAuthInternalTotpSecret* return_value) { + FirebaseAuthMultiFactorTotpHostApiGenerateSecretResponse* self = + FIREBASE_AUTH_MULTI_FACTOR_TOTP_HOST_API_GENERATE_SECRET_RESPONSE(g_object_new( + firebase_auth_multi_factor_totp_host_api_generate_secret_response_get_type(), + nullptr)); + self->value = fl_value_new_list(); + fl_value_append_take( + self->value, + fl_value_new_custom_object(firebase_auth_internal_totp_secret_type_id, + G_OBJECT(return_value))); + return self; +} + +static FirebaseAuthMultiFactorTotpHostApiGenerateSecretResponse* +firebase_auth_multi_factor_totp_host_api_generate_secret_response_new_error( + const gchar* code, const gchar* message, FlValue* details) { + FirebaseAuthMultiFactorTotpHostApiGenerateSecretResponse* self = + FIREBASE_AUTH_MULTI_FACTOR_TOTP_HOST_API_GENERATE_SECRET_RESPONSE(g_object_new( + firebase_auth_multi_factor_totp_host_api_generate_secret_response_get_type(), + nullptr)); + self->value = fl_value_new_list(); + fl_value_append_take(self->value, fl_value_new_string(code)); + fl_value_append_take(self->value, + fl_value_new_string(message != nullptr ? message : "")); + fl_value_append_take(self->value, details != nullptr ? fl_value_ref(details) + : fl_value_new_null()); + return self; +} + +G_DECLARE_FINAL_TYPE( + FirebaseAuthMultiFactorTotpHostApiGetAssertionForEnrollmentResponse, + firebase_auth_multi_factor_totp_host_api_get_assertion_for_enrollment_response, + FIREBASE_AUTH, + MULTI_FACTOR_TOTP_HOST_API_GET_ASSERTION_FOR_ENROLLMENT_RESPONSE, GObject) + +struct _FirebaseAuthMultiFactorTotpHostApiGetAssertionForEnrollmentResponse { + GObject parent_instance; + + FlValue* value; +}; + +G_DEFINE_TYPE( + FirebaseAuthMultiFactorTotpHostApiGetAssertionForEnrollmentResponse, + firebase_auth_multi_factor_totp_host_api_get_assertion_for_enrollment_response, + G_TYPE_OBJECT) + +static void +firebase_auth_multi_factor_totp_host_api_get_assertion_for_enrollment_response_dispose( + GObject* object) { + FirebaseAuthMultiFactorTotpHostApiGetAssertionForEnrollmentResponse* self = + FIREBASE_AUTH_MULTI_FACTOR_TOTP_HOST_API_GET_ASSERTION_FOR_ENROLLMENT_RESPONSE( + object); + g_clear_pointer(&self->value, fl_value_unref); + G_OBJECT_CLASS( + firebase_auth_multi_factor_totp_host_api_get_assertion_for_enrollment_response_parent_class) + ->dispose(object); +} + +static void +firebase_auth_multi_factor_totp_host_api_get_assertion_for_enrollment_response_init( + FirebaseAuthMultiFactorTotpHostApiGetAssertionForEnrollmentResponse* self) { +} + +static void +firebase_auth_multi_factor_totp_host_api_get_assertion_for_enrollment_response_class_init( + FirebaseAuthMultiFactorTotpHostApiGetAssertionForEnrollmentResponseClass* + klass) { + G_OBJECT_CLASS(klass)->dispose = + firebase_auth_multi_factor_totp_host_api_get_assertion_for_enrollment_response_dispose; +} + +static FirebaseAuthMultiFactorTotpHostApiGetAssertionForEnrollmentResponse* +firebase_auth_multi_factor_totp_host_api_get_assertion_for_enrollment_response_new( + const gchar* return_value) { + FirebaseAuthMultiFactorTotpHostApiGetAssertionForEnrollmentResponse* self = + FIREBASE_AUTH_MULTI_FACTOR_TOTP_HOST_API_GET_ASSERTION_FOR_ENROLLMENT_RESPONSE( + g_object_new( + firebase_auth_multi_factor_totp_host_api_get_assertion_for_enrollment_response_get_type(), + nullptr)); + self->value = fl_value_new_list(); + fl_value_append_take(self->value, fl_value_new_string(return_value)); + return self; +} + +static FirebaseAuthMultiFactorTotpHostApiGetAssertionForEnrollmentResponse* +firebase_auth_multi_factor_totp_host_api_get_assertion_for_enrollment_response_new_error( + const gchar* code, const gchar* message, FlValue* details) { + FirebaseAuthMultiFactorTotpHostApiGetAssertionForEnrollmentResponse* self = + FIREBASE_AUTH_MULTI_FACTOR_TOTP_HOST_API_GET_ASSERTION_FOR_ENROLLMENT_RESPONSE( + g_object_new( + firebase_auth_multi_factor_totp_host_api_get_assertion_for_enrollment_response_get_type(), + nullptr)); + self->value = fl_value_new_list(); + fl_value_append_take(self->value, fl_value_new_string(code)); + fl_value_append_take(self->value, + fl_value_new_string(message != nullptr ? message : "")); + fl_value_append_take(self->value, details != nullptr ? fl_value_ref(details) + : fl_value_new_null()); + return self; +} + +G_DECLARE_FINAL_TYPE( + FirebaseAuthMultiFactorTotpHostApiGetAssertionForSignInResponse, + firebase_auth_multi_factor_totp_host_api_get_assertion_for_sign_in_response, + FIREBASE_AUTH, + MULTI_FACTOR_TOTP_HOST_API_GET_ASSERTION_FOR_SIGN_IN_RESPONSE, GObject) + +struct _FirebaseAuthMultiFactorTotpHostApiGetAssertionForSignInResponse { + GObject parent_instance; + + FlValue* value; +}; + +G_DEFINE_TYPE( + FirebaseAuthMultiFactorTotpHostApiGetAssertionForSignInResponse, + firebase_auth_multi_factor_totp_host_api_get_assertion_for_sign_in_response, + G_TYPE_OBJECT) + +static void +firebase_auth_multi_factor_totp_host_api_get_assertion_for_sign_in_response_dispose( + GObject* object) { + FirebaseAuthMultiFactorTotpHostApiGetAssertionForSignInResponse* self = + FIREBASE_AUTH_MULTI_FACTOR_TOTP_HOST_API_GET_ASSERTION_FOR_SIGN_IN_RESPONSE( + object); + g_clear_pointer(&self->value, fl_value_unref); + G_OBJECT_CLASS( + firebase_auth_multi_factor_totp_host_api_get_assertion_for_sign_in_response_parent_class) + ->dispose(object); +} + +static void +firebase_auth_multi_factor_totp_host_api_get_assertion_for_sign_in_response_init( + FirebaseAuthMultiFactorTotpHostApiGetAssertionForSignInResponse* self) {} + +static void +firebase_auth_multi_factor_totp_host_api_get_assertion_for_sign_in_response_class_init( + FirebaseAuthMultiFactorTotpHostApiGetAssertionForSignInResponseClass* + klass) { + G_OBJECT_CLASS(klass)->dispose = + firebase_auth_multi_factor_totp_host_api_get_assertion_for_sign_in_response_dispose; +} + +static FirebaseAuthMultiFactorTotpHostApiGetAssertionForSignInResponse* +firebase_auth_multi_factor_totp_host_api_get_assertion_for_sign_in_response_new( + const gchar* return_value) { + FirebaseAuthMultiFactorTotpHostApiGetAssertionForSignInResponse* self = + FIREBASE_AUTH_MULTI_FACTOR_TOTP_HOST_API_GET_ASSERTION_FOR_SIGN_IN_RESPONSE( + g_object_new( + firebase_auth_multi_factor_totp_host_api_get_assertion_for_sign_in_response_get_type(), + nullptr)); + self->value = fl_value_new_list(); + fl_value_append_take(self->value, fl_value_new_string(return_value)); + return self; +} + +static FirebaseAuthMultiFactorTotpHostApiGetAssertionForSignInResponse* +firebase_auth_multi_factor_totp_host_api_get_assertion_for_sign_in_response_new_error( + const gchar* code, const gchar* message, FlValue* details) { + FirebaseAuthMultiFactorTotpHostApiGetAssertionForSignInResponse* self = + FIREBASE_AUTH_MULTI_FACTOR_TOTP_HOST_API_GET_ASSERTION_FOR_SIGN_IN_RESPONSE( + g_object_new( + firebase_auth_multi_factor_totp_host_api_get_assertion_for_sign_in_response_get_type(), + nullptr)); + self->value = fl_value_new_list(); + fl_value_append_take(self->value, fl_value_new_string(code)); + fl_value_append_take(self->value, + fl_value_new_string(message != nullptr ? message : "")); + fl_value_append_take(self->value, details != nullptr ? fl_value_ref(details) + : fl_value_new_null()); + return self; +} + +struct _FirebaseAuthMultiFactorTotpHostApi { + GObject parent_instance; + + const FirebaseAuthMultiFactorTotpHostApiVTable* vtable; + gpointer user_data; + GDestroyNotify user_data_free_func; +}; + +G_DEFINE_TYPE(FirebaseAuthMultiFactorTotpHostApi, + firebase_auth_multi_factor_totp_host_api, G_TYPE_OBJECT) + +static void firebase_auth_multi_factor_totp_host_api_dispose(GObject* object) { + FirebaseAuthMultiFactorTotpHostApi* self = + FIREBASE_AUTH_MULTI_FACTOR_TOTP_HOST_API(object); + if (self->user_data != nullptr) { + self->user_data_free_func(self->user_data); + } + self->user_data = nullptr; + G_OBJECT_CLASS(firebase_auth_multi_factor_totp_host_api_parent_class) + ->dispose(object); +} + +static void firebase_auth_multi_factor_totp_host_api_init( + FirebaseAuthMultiFactorTotpHostApi* self) {} + +static void firebase_auth_multi_factor_totp_host_api_class_init( + FirebaseAuthMultiFactorTotpHostApiClass* klass) { + G_OBJECT_CLASS(klass)->dispose = + firebase_auth_multi_factor_totp_host_api_dispose; +} + +static FirebaseAuthMultiFactorTotpHostApi* +firebase_auth_multi_factor_totp_host_api_new( + const FirebaseAuthMultiFactorTotpHostApiVTable* vtable, gpointer user_data, + GDestroyNotify user_data_free_func) { + FirebaseAuthMultiFactorTotpHostApi* self = + FIREBASE_AUTH_MULTI_FACTOR_TOTP_HOST_API(g_object_new( + firebase_auth_multi_factor_totp_host_api_get_type(), nullptr)); + self->vtable = vtable; + self->user_data = user_data; + self->user_data_free_func = user_data_free_func; + return self; +} + +static void firebase_auth_multi_factor_totp_host_api_generate_secret_cb( + FlBasicMessageChannel* channel, FlValue* message_, + FlBasicMessageChannelResponseHandle* response_handle, gpointer user_data) { + FirebaseAuthMultiFactorTotpHostApi* self = + FIREBASE_AUTH_MULTI_FACTOR_TOTP_HOST_API(user_data); + + if (self->vtable == nullptr || self->vtable->generate_secret == nullptr) { + return; + } + + FlValue* value0 = fl_value_get_list_value(message_, 0); + const gchar* session_id = fl_value_get_string(value0); + g_autoptr(FirebaseAuthMultiFactorTotpHostApiResponseHandle) handle = + firebase_auth_multi_factor_totp_host_api_response_handle_new( + channel, response_handle); + self->vtable->generate_secret(session_id, handle, self->user_data); +} + +static void +firebase_auth_multi_factor_totp_host_api_get_assertion_for_enrollment_cb( + FlBasicMessageChannel* channel, FlValue* message_, + FlBasicMessageChannelResponseHandle* response_handle, gpointer user_data) { + FirebaseAuthMultiFactorTotpHostApi* self = + FIREBASE_AUTH_MULTI_FACTOR_TOTP_HOST_API(user_data); + + if (self->vtable == nullptr || + self->vtable->get_assertion_for_enrollment == nullptr) { + return; + } + + FlValue* value0 = fl_value_get_list_value(message_, 0); + const gchar* secret_key = fl_value_get_string(value0); + FlValue* value1 = fl_value_get_list_value(message_, 1); + const gchar* one_time_password = fl_value_get_string(value1); + g_autoptr(FirebaseAuthMultiFactorTotpHostApiResponseHandle) handle = + firebase_auth_multi_factor_totp_host_api_response_handle_new( + channel, response_handle); + self->vtable->get_assertion_for_enrollment(secret_key, one_time_password, + handle, self->user_data); +} + +static void +firebase_auth_multi_factor_totp_host_api_get_assertion_for_sign_in_cb( + FlBasicMessageChannel* channel, FlValue* message_, + FlBasicMessageChannelResponseHandle* response_handle, gpointer user_data) { + FirebaseAuthMultiFactorTotpHostApi* self = + FIREBASE_AUTH_MULTI_FACTOR_TOTP_HOST_API(user_data); + + if (self->vtable == nullptr || + self->vtable->get_assertion_for_sign_in == nullptr) { + return; + } + + FlValue* value0 = fl_value_get_list_value(message_, 0); + const gchar* enrollment_id = fl_value_get_string(value0); + FlValue* value1 = fl_value_get_list_value(message_, 1); + const gchar* one_time_password = fl_value_get_string(value1); + g_autoptr(FirebaseAuthMultiFactorTotpHostApiResponseHandle) handle = + firebase_auth_multi_factor_totp_host_api_response_handle_new( + channel, response_handle); + self->vtable->get_assertion_for_sign_in(enrollment_id, one_time_password, + handle, self->user_data); +} + +void firebase_auth_multi_factor_totp_host_api_set_method_handlers( + FlBinaryMessenger* messenger, const gchar* suffix, + const FirebaseAuthMultiFactorTotpHostApiVTable* vtable, gpointer user_data, + GDestroyNotify user_data_free_func) { + g_autofree gchar* dot_suffix = + suffix != nullptr ? g_strdup_printf(".%s", suffix) : g_strdup(""); + g_autoptr(FirebaseAuthMultiFactorTotpHostApi) api_data = + firebase_auth_multi_factor_totp_host_api_new(vtable, user_data, + user_data_free_func); + + g_autoptr(FirebaseAuthMessageCodec) codec = firebase_auth_message_codec_new(); + g_autofree gchar* generate_secret_channel_name = g_strdup_printf( + "dev.flutter.pigeon.firebase_auth_platform_interface." + "MultiFactorTotpHostApi.generateSecret%s", + dot_suffix); + g_autoptr(FlBasicMessageChannel) generate_secret_channel = + fl_basic_message_channel_new(messenger, generate_secret_channel_name, + FL_MESSAGE_CODEC(codec)); + fl_basic_message_channel_set_message_handler( + generate_secret_channel, + firebase_auth_multi_factor_totp_host_api_generate_secret_cb, + g_object_ref(api_data), g_object_unref); + g_autofree gchar* get_assertion_for_enrollment_channel_name = g_strdup_printf( + "dev.flutter.pigeon.firebase_auth_platform_interface." + "MultiFactorTotpHostApi.getAssertionForEnrollment%s", + dot_suffix); + g_autoptr(FlBasicMessageChannel) get_assertion_for_enrollment_channel = + fl_basic_message_channel_new(messenger, + get_assertion_for_enrollment_channel_name, + FL_MESSAGE_CODEC(codec)); + fl_basic_message_channel_set_message_handler( + get_assertion_for_enrollment_channel, + firebase_auth_multi_factor_totp_host_api_get_assertion_for_enrollment_cb, + g_object_ref(api_data), g_object_unref); + g_autofree gchar* get_assertion_for_sign_in_channel_name = g_strdup_printf( + "dev.flutter.pigeon.firebase_auth_platform_interface." + "MultiFactorTotpHostApi.getAssertionForSignIn%s", + dot_suffix); + g_autoptr(FlBasicMessageChannel) get_assertion_for_sign_in_channel = + fl_basic_message_channel_new(messenger, + get_assertion_for_sign_in_channel_name, + FL_MESSAGE_CODEC(codec)); + fl_basic_message_channel_set_message_handler( + get_assertion_for_sign_in_channel, + firebase_auth_multi_factor_totp_host_api_get_assertion_for_sign_in_cb, + g_object_ref(api_data), g_object_unref); +} + +void firebase_auth_multi_factor_totp_host_api_clear_method_handlers( + FlBinaryMessenger* messenger, const gchar* suffix) { + g_autofree gchar* dot_suffix = + suffix != nullptr ? g_strdup_printf(".%s", suffix) : g_strdup(""); + + g_autoptr(FirebaseAuthMessageCodec) codec = firebase_auth_message_codec_new(); + g_autofree gchar* generate_secret_channel_name = g_strdup_printf( + "dev.flutter.pigeon.firebase_auth_platform_interface." + "MultiFactorTotpHostApi.generateSecret%s", + dot_suffix); + g_autoptr(FlBasicMessageChannel) generate_secret_channel = + fl_basic_message_channel_new(messenger, generate_secret_channel_name, + FL_MESSAGE_CODEC(codec)); + fl_basic_message_channel_set_message_handler(generate_secret_channel, nullptr, + nullptr, nullptr); + g_autofree gchar* get_assertion_for_enrollment_channel_name = g_strdup_printf( + "dev.flutter.pigeon.firebase_auth_platform_interface." + "MultiFactorTotpHostApi.getAssertionForEnrollment%s", + dot_suffix); + g_autoptr(FlBasicMessageChannel) get_assertion_for_enrollment_channel = + fl_basic_message_channel_new(messenger, + get_assertion_for_enrollment_channel_name, + FL_MESSAGE_CODEC(codec)); + fl_basic_message_channel_set_message_handler( + get_assertion_for_enrollment_channel, nullptr, nullptr, nullptr); + g_autofree gchar* get_assertion_for_sign_in_channel_name = g_strdup_printf( + "dev.flutter.pigeon.firebase_auth_platform_interface." + "MultiFactorTotpHostApi.getAssertionForSignIn%s", + dot_suffix); + g_autoptr(FlBasicMessageChannel) get_assertion_for_sign_in_channel = + fl_basic_message_channel_new(messenger, + get_assertion_for_sign_in_channel_name, + FL_MESSAGE_CODEC(codec)); + fl_basic_message_channel_set_message_handler( + get_assertion_for_sign_in_channel, nullptr, nullptr, nullptr); +} + +void firebase_auth_multi_factor_totp_host_api_respond_generate_secret( + FirebaseAuthMultiFactorTotpHostApiResponseHandle* response_handle, + FirebaseAuthInternalTotpSecret* return_value) { + g_autoptr(FirebaseAuthMultiFactorTotpHostApiGenerateSecretResponse) response = + firebase_auth_multi_factor_totp_host_api_generate_secret_response_new( + return_value); + g_autoptr(GError) error = nullptr; + if (!fl_basic_message_channel_respond(response_handle->channel, + response_handle->response_handle, + response->value, &error)) { + g_warning("Failed to send response to %s.%s: %s", "MultiFactorTotpHostApi", + "generateSecret", error->message); + } +} + +void firebase_auth_multi_factor_totp_host_api_respond_error_generate_secret( + FirebaseAuthMultiFactorTotpHostApiResponseHandle* response_handle, + const gchar* code, const gchar* message, FlValue* details) { + g_autoptr(FirebaseAuthMultiFactorTotpHostApiGenerateSecretResponse) response = + firebase_auth_multi_factor_totp_host_api_generate_secret_response_new_error( + code, message, details); + g_autoptr(GError) error = nullptr; + if (!fl_basic_message_channel_respond(response_handle->channel, + response_handle->response_handle, + response->value, &error)) { + g_warning("Failed to send response to %s.%s: %s", "MultiFactorTotpHostApi", + "generateSecret", error->message); + } +} + +void firebase_auth_multi_factor_totp_host_api_respond_get_assertion_for_enrollment( + FirebaseAuthMultiFactorTotpHostApiResponseHandle* response_handle, + const gchar* return_value) { + g_autoptr(FirebaseAuthMultiFactorTotpHostApiGetAssertionForEnrollmentResponse) + response = + firebase_auth_multi_factor_totp_host_api_get_assertion_for_enrollment_response_new( + return_value); + g_autoptr(GError) error = nullptr; + if (!fl_basic_message_channel_respond(response_handle->channel, + response_handle->response_handle, + response->value, &error)) { + g_warning("Failed to send response to %s.%s: %s", "MultiFactorTotpHostApi", + "getAssertionForEnrollment", error->message); + } +} + +void firebase_auth_multi_factor_totp_host_api_respond_error_get_assertion_for_enrollment( + FirebaseAuthMultiFactorTotpHostApiResponseHandle* response_handle, + const gchar* code, const gchar* message, FlValue* details) { + g_autoptr(FirebaseAuthMultiFactorTotpHostApiGetAssertionForEnrollmentResponse) + response = + firebase_auth_multi_factor_totp_host_api_get_assertion_for_enrollment_response_new_error( + code, message, details); + g_autoptr(GError) error = nullptr; + if (!fl_basic_message_channel_respond(response_handle->channel, + response_handle->response_handle, + response->value, &error)) { + g_warning("Failed to send response to %s.%s: %s", "MultiFactorTotpHostApi", + "getAssertionForEnrollment", error->message); + } +} + +void firebase_auth_multi_factor_totp_host_api_respond_get_assertion_for_sign_in( + FirebaseAuthMultiFactorTotpHostApiResponseHandle* response_handle, + const gchar* return_value) { + g_autoptr( + FirebaseAuthMultiFactorTotpHostApiGetAssertionForSignInResponse) response = + firebase_auth_multi_factor_totp_host_api_get_assertion_for_sign_in_response_new( + return_value); + g_autoptr(GError) error = nullptr; + if (!fl_basic_message_channel_respond(response_handle->channel, + response_handle->response_handle, + response->value, &error)) { + g_warning("Failed to send response to %s.%s: %s", "MultiFactorTotpHostApi", + "getAssertionForSignIn", error->message); + } +} + +void firebase_auth_multi_factor_totp_host_api_respond_error_get_assertion_for_sign_in( + FirebaseAuthMultiFactorTotpHostApiResponseHandle* response_handle, + const gchar* code, const gchar* message, FlValue* details) { + g_autoptr( + FirebaseAuthMultiFactorTotpHostApiGetAssertionForSignInResponse) response = + firebase_auth_multi_factor_totp_host_api_get_assertion_for_sign_in_response_new_error( + code, message, details); + g_autoptr(GError) error = nullptr; + if (!fl_basic_message_channel_respond(response_handle->channel, + response_handle->response_handle, + response->value, &error)) { + g_warning("Failed to send response to %s.%s: %s", "MultiFactorTotpHostApi", + "getAssertionForSignIn", error->message); + } +} + +struct _FirebaseAuthMultiFactorTotpSecretHostApiResponseHandle { + GObject parent_instance; + + FlBasicMessageChannel* channel; + FlBasicMessageChannelResponseHandle* response_handle; +}; + +G_DEFINE_TYPE(FirebaseAuthMultiFactorTotpSecretHostApiResponseHandle, + firebase_auth_multi_factor_totp_secret_host_api_response_handle, + G_TYPE_OBJECT) + +static void +firebase_auth_multi_factor_totp_secret_host_api_response_handle_dispose( + GObject* object) { + FirebaseAuthMultiFactorTotpSecretHostApiResponseHandle* self = + FIREBASE_AUTH_MULTI_FACTOR_TOTP_SECRET_HOST_API_RESPONSE_HANDLE(object); + g_clear_object(&self->channel); + g_clear_object(&self->response_handle); + G_OBJECT_CLASS( + firebase_auth_multi_factor_totp_secret_host_api_response_handle_parent_class) + ->dispose(object); +} + +static void +firebase_auth_multi_factor_totp_secret_host_api_response_handle_init( + FirebaseAuthMultiFactorTotpSecretHostApiResponseHandle* self) {} + +static void +firebase_auth_multi_factor_totp_secret_host_api_response_handle_class_init( + FirebaseAuthMultiFactorTotpSecretHostApiResponseHandleClass* klass) { + G_OBJECT_CLASS(klass)->dispose = + firebase_auth_multi_factor_totp_secret_host_api_response_handle_dispose; +} + +static FirebaseAuthMultiFactorTotpSecretHostApiResponseHandle* +firebase_auth_multi_factor_totp_secret_host_api_response_handle_new( + FlBasicMessageChannel* channel, + FlBasicMessageChannelResponseHandle* response_handle) { + FirebaseAuthMultiFactorTotpSecretHostApiResponseHandle* self = + FIREBASE_AUTH_MULTI_FACTOR_TOTP_SECRET_HOST_API_RESPONSE_HANDLE(g_object_new( + firebase_auth_multi_factor_totp_secret_host_api_response_handle_get_type(), + nullptr)); + self->channel = FL_BASIC_MESSAGE_CHANNEL(g_object_ref(channel)); + self->response_handle = + FL_BASIC_MESSAGE_CHANNEL_RESPONSE_HANDLE(g_object_ref(response_handle)); + return self; +} + +G_DECLARE_FINAL_TYPE( + FirebaseAuthMultiFactorTotpSecretHostApiGenerateQrCodeUrlResponse, + firebase_auth_multi_factor_totp_secret_host_api_generate_qr_code_url_response, + FIREBASE_AUTH, + MULTI_FACTOR_TOTP_SECRET_HOST_API_GENERATE_QR_CODE_URL_RESPONSE, GObject) + +struct _FirebaseAuthMultiFactorTotpSecretHostApiGenerateQrCodeUrlResponse { + GObject parent_instance; + + FlValue* value; +}; + +G_DEFINE_TYPE( + FirebaseAuthMultiFactorTotpSecretHostApiGenerateQrCodeUrlResponse, + firebase_auth_multi_factor_totp_secret_host_api_generate_qr_code_url_response, + G_TYPE_OBJECT) + +static void +firebase_auth_multi_factor_totp_secret_host_api_generate_qr_code_url_response_dispose( + GObject* object) { + FirebaseAuthMultiFactorTotpSecretHostApiGenerateQrCodeUrlResponse* self = + FIREBASE_AUTH_MULTI_FACTOR_TOTP_SECRET_HOST_API_GENERATE_QR_CODE_URL_RESPONSE( + object); + g_clear_pointer(&self->value, fl_value_unref); + G_OBJECT_CLASS( + firebase_auth_multi_factor_totp_secret_host_api_generate_qr_code_url_response_parent_class) + ->dispose(object); +} + +static void +firebase_auth_multi_factor_totp_secret_host_api_generate_qr_code_url_response_init( + FirebaseAuthMultiFactorTotpSecretHostApiGenerateQrCodeUrlResponse* self) {} + +static void +firebase_auth_multi_factor_totp_secret_host_api_generate_qr_code_url_response_class_init( + FirebaseAuthMultiFactorTotpSecretHostApiGenerateQrCodeUrlResponseClass* + klass) { + G_OBJECT_CLASS(klass)->dispose = + firebase_auth_multi_factor_totp_secret_host_api_generate_qr_code_url_response_dispose; +} + +static FirebaseAuthMultiFactorTotpSecretHostApiGenerateQrCodeUrlResponse* +firebase_auth_multi_factor_totp_secret_host_api_generate_qr_code_url_response_new( + const gchar* return_value) { + FirebaseAuthMultiFactorTotpSecretHostApiGenerateQrCodeUrlResponse* self = + FIREBASE_AUTH_MULTI_FACTOR_TOTP_SECRET_HOST_API_GENERATE_QR_CODE_URL_RESPONSE( + g_object_new( + firebase_auth_multi_factor_totp_secret_host_api_generate_qr_code_url_response_get_type(), + nullptr)); + self->value = fl_value_new_list(); + fl_value_append_take(self->value, fl_value_new_string(return_value)); + return self; +} + +static FirebaseAuthMultiFactorTotpSecretHostApiGenerateQrCodeUrlResponse* +firebase_auth_multi_factor_totp_secret_host_api_generate_qr_code_url_response_new_error( + const gchar* code, const gchar* message, FlValue* details) { + FirebaseAuthMultiFactorTotpSecretHostApiGenerateQrCodeUrlResponse* self = + FIREBASE_AUTH_MULTI_FACTOR_TOTP_SECRET_HOST_API_GENERATE_QR_CODE_URL_RESPONSE( + g_object_new( + firebase_auth_multi_factor_totp_secret_host_api_generate_qr_code_url_response_get_type(), + nullptr)); + self->value = fl_value_new_list(); + fl_value_append_take(self->value, fl_value_new_string(code)); + fl_value_append_take(self->value, + fl_value_new_string(message != nullptr ? message : "")); + fl_value_append_take(self->value, details != nullptr ? fl_value_ref(details) + : fl_value_new_null()); + return self; +} + +G_DECLARE_FINAL_TYPE( + FirebaseAuthMultiFactorTotpSecretHostApiOpenInOtpAppResponse, + firebase_auth_multi_factor_totp_secret_host_api_open_in_otp_app_response, + FIREBASE_AUTH, MULTI_FACTOR_TOTP_SECRET_HOST_API_OPEN_IN_OTP_APP_RESPONSE, + GObject) + +struct _FirebaseAuthMultiFactorTotpSecretHostApiOpenInOtpAppResponse { + GObject parent_instance; + + FlValue* value; +}; + +G_DEFINE_TYPE( + FirebaseAuthMultiFactorTotpSecretHostApiOpenInOtpAppResponse, + firebase_auth_multi_factor_totp_secret_host_api_open_in_otp_app_response, + G_TYPE_OBJECT) + +static void +firebase_auth_multi_factor_totp_secret_host_api_open_in_otp_app_response_dispose( + GObject* object) { + FirebaseAuthMultiFactorTotpSecretHostApiOpenInOtpAppResponse* self = + FIREBASE_AUTH_MULTI_FACTOR_TOTP_SECRET_HOST_API_OPEN_IN_OTP_APP_RESPONSE( + object); + g_clear_pointer(&self->value, fl_value_unref); + G_OBJECT_CLASS( + firebase_auth_multi_factor_totp_secret_host_api_open_in_otp_app_response_parent_class) + ->dispose(object); +} + +static void +firebase_auth_multi_factor_totp_secret_host_api_open_in_otp_app_response_init( + FirebaseAuthMultiFactorTotpSecretHostApiOpenInOtpAppResponse* self) {} + +static void +firebase_auth_multi_factor_totp_secret_host_api_open_in_otp_app_response_class_init( + FirebaseAuthMultiFactorTotpSecretHostApiOpenInOtpAppResponseClass* klass) { + G_OBJECT_CLASS(klass)->dispose = + firebase_auth_multi_factor_totp_secret_host_api_open_in_otp_app_response_dispose; +} + +static FirebaseAuthMultiFactorTotpSecretHostApiOpenInOtpAppResponse* +firebase_auth_multi_factor_totp_secret_host_api_open_in_otp_app_response_new() { + FirebaseAuthMultiFactorTotpSecretHostApiOpenInOtpAppResponse* self = + FIREBASE_AUTH_MULTI_FACTOR_TOTP_SECRET_HOST_API_OPEN_IN_OTP_APP_RESPONSE( + g_object_new( + firebase_auth_multi_factor_totp_secret_host_api_open_in_otp_app_response_get_type(), + nullptr)); + self->value = fl_value_new_list(); + fl_value_append_take(self->value, fl_value_new_null()); + return self; +} + +static FirebaseAuthMultiFactorTotpSecretHostApiOpenInOtpAppResponse* +firebase_auth_multi_factor_totp_secret_host_api_open_in_otp_app_response_new_error( + const gchar* code, const gchar* message, FlValue* details) { + FirebaseAuthMultiFactorTotpSecretHostApiOpenInOtpAppResponse* self = + FIREBASE_AUTH_MULTI_FACTOR_TOTP_SECRET_HOST_API_OPEN_IN_OTP_APP_RESPONSE( + g_object_new( + firebase_auth_multi_factor_totp_secret_host_api_open_in_otp_app_response_get_type(), + nullptr)); + self->value = fl_value_new_list(); + fl_value_append_take(self->value, fl_value_new_string(code)); + fl_value_append_take(self->value, + fl_value_new_string(message != nullptr ? message : "")); + fl_value_append_take(self->value, details != nullptr ? fl_value_ref(details) + : fl_value_new_null()); + return self; +} + +struct _FirebaseAuthMultiFactorTotpSecretHostApi { + GObject parent_instance; + + const FirebaseAuthMultiFactorTotpSecretHostApiVTable* vtable; + gpointer user_data; + GDestroyNotify user_data_free_func; +}; + +G_DEFINE_TYPE(FirebaseAuthMultiFactorTotpSecretHostApi, + firebase_auth_multi_factor_totp_secret_host_api, G_TYPE_OBJECT) + +static void firebase_auth_multi_factor_totp_secret_host_api_dispose( + GObject* object) { + FirebaseAuthMultiFactorTotpSecretHostApi* self = + FIREBASE_AUTH_MULTI_FACTOR_TOTP_SECRET_HOST_API(object); + if (self->user_data != nullptr) { + self->user_data_free_func(self->user_data); + } + self->user_data = nullptr; + G_OBJECT_CLASS(firebase_auth_multi_factor_totp_secret_host_api_parent_class) + ->dispose(object); +} + +static void firebase_auth_multi_factor_totp_secret_host_api_init( + FirebaseAuthMultiFactorTotpSecretHostApi* self) {} + +static void firebase_auth_multi_factor_totp_secret_host_api_class_init( + FirebaseAuthMultiFactorTotpSecretHostApiClass* klass) { + G_OBJECT_CLASS(klass)->dispose = + firebase_auth_multi_factor_totp_secret_host_api_dispose; +} + +static FirebaseAuthMultiFactorTotpSecretHostApi* +firebase_auth_multi_factor_totp_secret_host_api_new( + const FirebaseAuthMultiFactorTotpSecretHostApiVTable* vtable, + gpointer user_data, GDestroyNotify user_data_free_func) { + FirebaseAuthMultiFactorTotpSecretHostApi* self = + FIREBASE_AUTH_MULTI_FACTOR_TOTP_SECRET_HOST_API(g_object_new( + firebase_auth_multi_factor_totp_secret_host_api_get_type(), nullptr)); + self->vtable = vtable; + self->user_data = user_data; + self->user_data_free_func = user_data_free_func; + return self; +} + +static void +firebase_auth_multi_factor_totp_secret_host_api_generate_qr_code_url_cb( + FlBasicMessageChannel* channel, FlValue* message_, + FlBasicMessageChannelResponseHandle* response_handle, gpointer user_data) { + FirebaseAuthMultiFactorTotpSecretHostApi* self = + FIREBASE_AUTH_MULTI_FACTOR_TOTP_SECRET_HOST_API(user_data); + + if (self->vtable == nullptr || + self->vtable->generate_qr_code_url == nullptr) { + return; + } + + FlValue* value0 = fl_value_get_list_value(message_, 0); + const gchar* secret_key = fl_value_get_string(value0); + FlValue* value1 = fl_value_get_list_value(message_, 1); + const gchar* account_name = fl_value_get_string(value1); + FlValue* value2 = fl_value_get_list_value(message_, 2); + const gchar* issuer = fl_value_get_string(value2); + g_autoptr(FirebaseAuthMultiFactorTotpSecretHostApiResponseHandle) handle = + firebase_auth_multi_factor_totp_secret_host_api_response_handle_new( + channel, response_handle); + self->vtable->generate_qr_code_url(secret_key, account_name, issuer, handle, + self->user_data); +} + +static void firebase_auth_multi_factor_totp_secret_host_api_open_in_otp_app_cb( + FlBasicMessageChannel* channel, FlValue* message_, + FlBasicMessageChannelResponseHandle* response_handle, gpointer user_data) { + FirebaseAuthMultiFactorTotpSecretHostApi* self = + FIREBASE_AUTH_MULTI_FACTOR_TOTP_SECRET_HOST_API(user_data); + + if (self->vtable == nullptr || self->vtable->open_in_otp_app == nullptr) { + return; + } + + FlValue* value0 = fl_value_get_list_value(message_, 0); + const gchar* secret_key = fl_value_get_string(value0); + FlValue* value1 = fl_value_get_list_value(message_, 1); + const gchar* qr_code_url = fl_value_get_string(value1); + g_autoptr(FirebaseAuthMultiFactorTotpSecretHostApiResponseHandle) handle = + firebase_auth_multi_factor_totp_secret_host_api_response_handle_new( + channel, response_handle); + self->vtable->open_in_otp_app(secret_key, qr_code_url, handle, + self->user_data); +} + +void firebase_auth_multi_factor_totp_secret_host_api_set_method_handlers( + FlBinaryMessenger* messenger, const gchar* suffix, + const FirebaseAuthMultiFactorTotpSecretHostApiVTable* vtable, + gpointer user_data, GDestroyNotify user_data_free_func) { + g_autofree gchar* dot_suffix = + suffix != nullptr ? g_strdup_printf(".%s", suffix) : g_strdup(""); + g_autoptr(FirebaseAuthMultiFactorTotpSecretHostApi) api_data = + firebase_auth_multi_factor_totp_secret_host_api_new(vtable, user_data, + user_data_free_func); + + g_autoptr(FirebaseAuthMessageCodec) codec = firebase_auth_message_codec_new(); + g_autofree gchar* generate_qr_code_url_channel_name = g_strdup_printf( + "dev.flutter.pigeon.firebase_auth_platform_interface." + "MultiFactorTotpSecretHostApi.generateQrCodeUrl%s", + dot_suffix); + g_autoptr(FlBasicMessageChannel) generate_qr_code_url_channel = + fl_basic_message_channel_new(messenger, generate_qr_code_url_channel_name, + FL_MESSAGE_CODEC(codec)); + fl_basic_message_channel_set_message_handler( + generate_qr_code_url_channel, + firebase_auth_multi_factor_totp_secret_host_api_generate_qr_code_url_cb, + g_object_ref(api_data), g_object_unref); + g_autofree gchar* open_in_otp_app_channel_name = g_strdup_printf( + "dev.flutter.pigeon.firebase_auth_platform_interface." + "MultiFactorTotpSecretHostApi.openInOtpApp%s", + dot_suffix); + g_autoptr(FlBasicMessageChannel) open_in_otp_app_channel = + fl_basic_message_channel_new(messenger, open_in_otp_app_channel_name, + FL_MESSAGE_CODEC(codec)); + fl_basic_message_channel_set_message_handler( + open_in_otp_app_channel, + firebase_auth_multi_factor_totp_secret_host_api_open_in_otp_app_cb, + g_object_ref(api_data), g_object_unref); +} + +void firebase_auth_multi_factor_totp_secret_host_api_clear_method_handlers( + FlBinaryMessenger* messenger, const gchar* suffix) { + g_autofree gchar* dot_suffix = + suffix != nullptr ? g_strdup_printf(".%s", suffix) : g_strdup(""); + + g_autoptr(FirebaseAuthMessageCodec) codec = firebase_auth_message_codec_new(); + g_autofree gchar* generate_qr_code_url_channel_name = g_strdup_printf( + "dev.flutter.pigeon.firebase_auth_platform_interface." + "MultiFactorTotpSecretHostApi.generateQrCodeUrl%s", + dot_suffix); + g_autoptr(FlBasicMessageChannel) generate_qr_code_url_channel = + fl_basic_message_channel_new(messenger, generate_qr_code_url_channel_name, + FL_MESSAGE_CODEC(codec)); + fl_basic_message_channel_set_message_handler(generate_qr_code_url_channel, + nullptr, nullptr, nullptr); + g_autofree gchar* open_in_otp_app_channel_name = g_strdup_printf( + "dev.flutter.pigeon.firebase_auth_platform_interface." + "MultiFactorTotpSecretHostApi.openInOtpApp%s", + dot_suffix); + g_autoptr(FlBasicMessageChannel) open_in_otp_app_channel = + fl_basic_message_channel_new(messenger, open_in_otp_app_channel_name, + FL_MESSAGE_CODEC(codec)); + fl_basic_message_channel_set_message_handler(open_in_otp_app_channel, nullptr, + nullptr, nullptr); +} + +void firebase_auth_multi_factor_totp_secret_host_api_respond_generate_qr_code_url( + FirebaseAuthMultiFactorTotpSecretHostApiResponseHandle* response_handle, + const gchar* return_value) { + g_autoptr( + FirebaseAuthMultiFactorTotpSecretHostApiGenerateQrCodeUrlResponse) response = + firebase_auth_multi_factor_totp_secret_host_api_generate_qr_code_url_response_new( + return_value); + g_autoptr(GError) error = nullptr; + if (!fl_basic_message_channel_respond(response_handle->channel, + response_handle->response_handle, + response->value, &error)) { + g_warning("Failed to send response to %s.%s: %s", + "MultiFactorTotpSecretHostApi", "generateQrCodeUrl", + error->message); + } +} + +void firebase_auth_multi_factor_totp_secret_host_api_respond_error_generate_qr_code_url( + FirebaseAuthMultiFactorTotpSecretHostApiResponseHandle* response_handle, + const gchar* code, const gchar* message, FlValue* details) { + g_autoptr( + FirebaseAuthMultiFactorTotpSecretHostApiGenerateQrCodeUrlResponse) response = + firebase_auth_multi_factor_totp_secret_host_api_generate_qr_code_url_response_new_error( + code, message, details); + g_autoptr(GError) error = nullptr; + if (!fl_basic_message_channel_respond(response_handle->channel, + response_handle->response_handle, + response->value, &error)) { + g_warning("Failed to send response to %s.%s: %s", + "MultiFactorTotpSecretHostApi", "generateQrCodeUrl", + error->message); + } +} + +void firebase_auth_multi_factor_totp_secret_host_api_respond_open_in_otp_app( + FirebaseAuthMultiFactorTotpSecretHostApiResponseHandle* response_handle) { + g_autoptr( + FirebaseAuthMultiFactorTotpSecretHostApiOpenInOtpAppResponse) response = + firebase_auth_multi_factor_totp_secret_host_api_open_in_otp_app_response_new(); + g_autoptr(GError) error = nullptr; + if (!fl_basic_message_channel_respond(response_handle->channel, + response_handle->response_handle, + response->value, &error)) { + g_warning("Failed to send response to %s.%s: %s", + "MultiFactorTotpSecretHostApi", "openInOtpApp", error->message); + } +} + +void firebase_auth_multi_factor_totp_secret_host_api_respond_error_open_in_otp_app( + FirebaseAuthMultiFactorTotpSecretHostApiResponseHandle* response_handle, + const gchar* code, const gchar* message, FlValue* details) { + g_autoptr( + FirebaseAuthMultiFactorTotpSecretHostApiOpenInOtpAppResponse) response = + firebase_auth_multi_factor_totp_secret_host_api_open_in_otp_app_response_new_error( + code, message, details); + g_autoptr(GError) error = nullptr; + if (!fl_basic_message_channel_respond(response_handle->channel, + response_handle->response_handle, + response->value, &error)) { + g_warning("Failed to send response to %s.%s: %s", + "MultiFactorTotpSecretHostApi", "openInOtpApp", error->message); + } +} + +struct _FirebaseAuthGenerateInterfacesPigeonInterfaceResponse { + GObject parent_instance; + + FlValue* value; +}; + +G_DEFINE_TYPE(FirebaseAuthGenerateInterfacesPigeonInterfaceResponse, + firebase_auth_generate_interfaces_pigeon_interface_response, + G_TYPE_OBJECT) + +static void firebase_auth_generate_interfaces_pigeon_interface_response_dispose( + GObject* object) { + FirebaseAuthGenerateInterfacesPigeonInterfaceResponse* self = + FIREBASE_AUTH_GENERATE_INTERFACES_PIGEON_INTERFACE_RESPONSE(object); + g_clear_pointer(&self->value, fl_value_unref); + G_OBJECT_CLASS( + firebase_auth_generate_interfaces_pigeon_interface_response_parent_class) + ->dispose(object); +} + +static void firebase_auth_generate_interfaces_pigeon_interface_response_init( + FirebaseAuthGenerateInterfacesPigeonInterfaceResponse* self) {} + +static void +firebase_auth_generate_interfaces_pigeon_interface_response_class_init( + FirebaseAuthGenerateInterfacesPigeonInterfaceResponseClass* klass) { + G_OBJECT_CLASS(klass)->dispose = + firebase_auth_generate_interfaces_pigeon_interface_response_dispose; +} + +FirebaseAuthGenerateInterfacesPigeonInterfaceResponse* +firebase_auth_generate_interfaces_pigeon_interface_response_new() { + FirebaseAuthGenerateInterfacesPigeonInterfaceResponse* self = + FIREBASE_AUTH_GENERATE_INTERFACES_PIGEON_INTERFACE_RESPONSE(g_object_new( + firebase_auth_generate_interfaces_pigeon_interface_response_get_type(), + nullptr)); + self->value = fl_value_new_list(); + fl_value_append_take(self->value, fl_value_new_null()); + return self; +} + +FirebaseAuthGenerateInterfacesPigeonInterfaceResponse* +firebase_auth_generate_interfaces_pigeon_interface_response_new_error( + const gchar* code, const gchar* message, FlValue* details) { + FirebaseAuthGenerateInterfacesPigeonInterfaceResponse* self = + FIREBASE_AUTH_GENERATE_INTERFACES_PIGEON_INTERFACE_RESPONSE(g_object_new( + firebase_auth_generate_interfaces_pigeon_interface_response_get_type(), + nullptr)); + self->value = fl_value_new_list(); + fl_value_append_take(self->value, fl_value_new_string(code)); + fl_value_append_take(self->value, + fl_value_new_string(message != nullptr ? message : "")); + fl_value_append_take(self->value, details != nullptr ? fl_value_ref(details) + : fl_value_new_null()); + return self; +} + +struct _FirebaseAuthGenerateInterfaces { + GObject parent_instance; + + const FirebaseAuthGenerateInterfacesVTable* vtable; + gpointer user_data; + GDestroyNotify user_data_free_func; +}; + +G_DEFINE_TYPE(FirebaseAuthGenerateInterfaces, firebase_auth_generate_interfaces, + G_TYPE_OBJECT) + +static void firebase_auth_generate_interfaces_dispose(GObject* object) { + FirebaseAuthGenerateInterfaces* self = + FIREBASE_AUTH_GENERATE_INTERFACES(object); + if (self->user_data != nullptr) { + self->user_data_free_func(self->user_data); + } + self->user_data = nullptr; + G_OBJECT_CLASS(firebase_auth_generate_interfaces_parent_class) + ->dispose(object); +} + +static void firebase_auth_generate_interfaces_init( + FirebaseAuthGenerateInterfaces* self) {} + +static void firebase_auth_generate_interfaces_class_init( + FirebaseAuthGenerateInterfacesClass* klass) { + G_OBJECT_CLASS(klass)->dispose = firebase_auth_generate_interfaces_dispose; +} + +static FirebaseAuthGenerateInterfaces* firebase_auth_generate_interfaces_new( + const FirebaseAuthGenerateInterfacesVTable* vtable, gpointer user_data, + GDestroyNotify user_data_free_func) { + FirebaseAuthGenerateInterfaces* self = FIREBASE_AUTH_GENERATE_INTERFACES( + g_object_new(firebase_auth_generate_interfaces_get_type(), nullptr)); + self->vtable = vtable; + self->user_data = user_data; + self->user_data_free_func = user_data_free_func; + return self; +} + +static void firebase_auth_generate_interfaces_pigeon_interface_cb( + FlBasicMessageChannel* channel, FlValue* message_, + FlBasicMessageChannelResponseHandle* response_handle, gpointer user_data) { + FirebaseAuthGenerateInterfaces* self = + FIREBASE_AUTH_GENERATE_INTERFACES(user_data); + + if (self->vtable == nullptr || self->vtable->pigeon_interface == nullptr) { + return; + } + + FlValue* value0 = fl_value_get_list_value(message_, 0); + FirebaseAuthInternalMultiFactorInfo* info = + FIREBASE_AUTH_INTERNAL_MULTI_FACTOR_INFO( + fl_value_get_custom_value_object(value0)); + g_autoptr(FirebaseAuthGenerateInterfacesPigeonInterfaceResponse) response = + self->vtable->pigeon_interface(info, self->user_data); + if (response == nullptr) { + g_warning("No response returned to %s.%s", "GenerateInterfaces", + "pigeonInterface"); + return; + } + + g_autoptr(GError) error = NULL; + if (!fl_basic_message_channel_respond(channel, response_handle, + response->value, &error)) { + g_warning("Failed to send response to %s.%s: %s", "GenerateInterfaces", + "pigeonInterface", error->message); + } +} + +void firebase_auth_generate_interfaces_set_method_handlers( + FlBinaryMessenger* messenger, const gchar* suffix, + const FirebaseAuthGenerateInterfacesVTable* vtable, gpointer user_data, + GDestroyNotify user_data_free_func) { + g_autofree gchar* dot_suffix = + suffix != nullptr ? g_strdup_printf(".%s", suffix) : g_strdup(""); + g_autoptr(FirebaseAuthGenerateInterfaces) api_data = + firebase_auth_generate_interfaces_new(vtable, user_data, + user_data_free_func); + + g_autoptr(FirebaseAuthMessageCodec) codec = firebase_auth_message_codec_new(); + g_autofree gchar* pigeon_interface_channel_name = g_strdup_printf( + "dev.flutter.pigeon.firebase_auth_platform_interface.GenerateInterfaces." + "pigeonInterface%s", + dot_suffix); + g_autoptr(FlBasicMessageChannel) pigeon_interface_channel = + fl_basic_message_channel_new(messenger, pigeon_interface_channel_name, + FL_MESSAGE_CODEC(codec)); + fl_basic_message_channel_set_message_handler( + pigeon_interface_channel, + firebase_auth_generate_interfaces_pigeon_interface_cb, + g_object_ref(api_data), g_object_unref); +} + +void firebase_auth_generate_interfaces_clear_method_handlers( + FlBinaryMessenger* messenger, const gchar* suffix) { + g_autofree gchar* dot_suffix = + suffix != nullptr ? g_strdup_printf(".%s", suffix) : g_strdup(""); + + g_autoptr(FirebaseAuthMessageCodec) codec = firebase_auth_message_codec_new(); + g_autofree gchar* pigeon_interface_channel_name = g_strdup_printf( + "dev.flutter.pigeon.firebase_auth_platform_interface.GenerateInterfaces." + "pigeonInterface%s", + dot_suffix); + g_autoptr(FlBasicMessageChannel) pigeon_interface_channel = + fl_basic_message_channel_new(messenger, pigeon_interface_channel_name, + FL_MESSAGE_CODEC(codec)); + fl_basic_message_channel_set_message_handler(pigeon_interface_channel, + nullptr, nullptr, nullptr); +} diff --git a/packages/firebase_auth/firebase_auth/linux/messages.g.h b/packages/firebase_auth/firebase_auth/linux/messages.g.h new file mode 100644 index 000000000000..008d0659a708 --- /dev/null +++ b/packages/firebase_auth/firebase_auth/linux/messages.g.h @@ -0,0 +1,3656 @@ +// Copyright 2023, the Chromium project authors. Please see the AUTHORS file +// for details. All rights reserved. Use of this source code is governed by a +// BSD-style license that can be found in the LICENSE file. +// Autogenerated from Pigeon (v26.3.4), do not edit directly. +// See also: https://pub.dev/packages/pigeon + +#ifndef PIGEON_MESSAGES_G_H_ +#define PIGEON_MESSAGES_G_H_ + +#include + +G_BEGIN_DECLS + +/** + * FirebaseAuthActionCodeInfoOperation: + * FIREBASE_AUTH_PLATFORM_INTERFACE_ACTION_CODE_INFO_OPERATION_UNKNOWN: + * Unknown operation. + * FIREBASE_AUTH_PLATFORM_INTERFACE_ACTION_CODE_INFO_OPERATION_PASSWORD_RESET: + * Password reset code generated via [sendPasswordResetEmail]. + * FIREBASE_AUTH_PLATFORM_INTERFACE_ACTION_CODE_INFO_OPERATION_VERIFY_EMAIL: + * Email verification code generated via [User.sendEmailVerification]. + * FIREBASE_AUTH_PLATFORM_INTERFACE_ACTION_CODE_INFO_OPERATION_RECOVER_EMAIL: + * Email change revocation code generated via [User.updateEmail]. + * FIREBASE_AUTH_PLATFORM_INTERFACE_ACTION_CODE_INFO_OPERATION_EMAIL_SIGN_IN: + * Email sign in code generated via [sendSignInLinkToEmail]. + * FIREBASE_AUTH_PLATFORM_INTERFACE_ACTION_CODE_INFO_OPERATION_VERIFY_AND_CHANGE_EMAIL: + * Verify and change email code generated via [User.verifyBeforeUpdateEmail]. + * FIREBASE_AUTH_PLATFORM_INTERFACE_ACTION_CODE_INFO_OPERATION_REVERT_SECOND_FACTOR_ADDITION: + * Action code for reverting second factor addition. + * + * The type of operation that generated the action code from calling + * [checkActionCode]. + */ +typedef enum { + FIREBASE_AUTH_PLATFORM_INTERFACE_ACTION_CODE_INFO_OPERATION_UNKNOWN = 0, + FIREBASE_AUTH_PLATFORM_INTERFACE_ACTION_CODE_INFO_OPERATION_PASSWORD_RESET = + 1, + FIREBASE_AUTH_PLATFORM_INTERFACE_ACTION_CODE_INFO_OPERATION_VERIFY_EMAIL = 2, + FIREBASE_AUTH_PLATFORM_INTERFACE_ACTION_CODE_INFO_OPERATION_RECOVER_EMAIL = 3, + FIREBASE_AUTH_PLATFORM_INTERFACE_ACTION_CODE_INFO_OPERATION_EMAIL_SIGN_IN = 4, + FIREBASE_AUTH_PLATFORM_INTERFACE_ACTION_CODE_INFO_OPERATION_VERIFY_AND_CHANGE_EMAIL = + 5, + FIREBASE_AUTH_PLATFORM_INTERFACE_ACTION_CODE_INFO_OPERATION_REVERT_SECOND_FACTOR_ADDITION = + 6 +} FirebaseAuthActionCodeInfoOperation; + +/** + * FirebaseAuthInternalMultiFactorSession: + * + */ + +G_DECLARE_FINAL_TYPE(FirebaseAuthInternalMultiFactorSession, + firebase_auth_internal_multi_factor_session, FIREBASE_AUTH, + INTERNAL_MULTI_FACTOR_SESSION, GObject) + +/** + * firebase_auth_internal_multi_factor_session_new: + * id: field in this object. + * + * Creates a new #InternalMultiFactorSession object. + * + * Returns: a new #FirebaseAuthInternalMultiFactorSession + */ +FirebaseAuthInternalMultiFactorSession* +firebase_auth_internal_multi_factor_session_new(const gchar* id); + +/** + * firebase_auth_internal_multi_factor_session_get_id + * @object: a #FirebaseAuthInternalMultiFactorSession. + * + * Gets the value of the id field of @object. + * + * Returns: the field value. + */ +const gchar* firebase_auth_internal_multi_factor_session_get_id( + FirebaseAuthInternalMultiFactorSession* object); + +/** + * firebase_auth_internal_multi_factor_session_equals: + * @a: a #FirebaseAuthInternalMultiFactorSession. + * @b: another #FirebaseAuthInternalMultiFactorSession. + * + * Checks if two #FirebaseAuthInternalMultiFactorSession objects are equal. + * + * Returns: TRUE if @a and @b are equal. + */ +gboolean firebase_auth_internal_multi_factor_session_equals( + FirebaseAuthInternalMultiFactorSession* a, + FirebaseAuthInternalMultiFactorSession* b); + +/** + * firebase_auth_internal_multi_factor_session_hash: + * @object: a #FirebaseAuthInternalMultiFactorSession. + * + * Calculates a hash code for a #FirebaseAuthInternalMultiFactorSession object. + * + * Returns: the hash code. + */ +guint firebase_auth_internal_multi_factor_session_hash( + FirebaseAuthInternalMultiFactorSession* object); + +/** + * FirebaseAuthInternalPhoneMultiFactorAssertion: + * + */ + +G_DECLARE_FINAL_TYPE(FirebaseAuthInternalPhoneMultiFactorAssertion, + firebase_auth_internal_phone_multi_factor_assertion, + FIREBASE_AUTH, INTERNAL_PHONE_MULTI_FACTOR_ASSERTION, + GObject) + +/** + * firebase_auth_internal_phone_multi_factor_assertion_new: + * verification_id: field in this object. + * verification_code: field in this object. + * + * Creates a new #InternalPhoneMultiFactorAssertion object. + * + * Returns: a new #FirebaseAuthInternalPhoneMultiFactorAssertion + */ +FirebaseAuthInternalPhoneMultiFactorAssertion* +firebase_auth_internal_phone_multi_factor_assertion_new( + const gchar* verification_id, const gchar* verification_code); + +/** + * firebase_auth_internal_phone_multi_factor_assertion_get_verification_id + * @object: a #FirebaseAuthInternalPhoneMultiFactorAssertion. + * + * Gets the value of the verificationId field of @object. + * + * Returns: the field value. + */ +const gchar* +firebase_auth_internal_phone_multi_factor_assertion_get_verification_id( + FirebaseAuthInternalPhoneMultiFactorAssertion* object); + +/** + * firebase_auth_internal_phone_multi_factor_assertion_get_verification_code + * @object: a #FirebaseAuthInternalPhoneMultiFactorAssertion. + * + * Gets the value of the verificationCode field of @object. + * + * Returns: the field value. + */ +const gchar* +firebase_auth_internal_phone_multi_factor_assertion_get_verification_code( + FirebaseAuthInternalPhoneMultiFactorAssertion* object); + +/** + * firebase_auth_internal_phone_multi_factor_assertion_equals: + * @a: a #FirebaseAuthInternalPhoneMultiFactorAssertion. + * @b: another #FirebaseAuthInternalPhoneMultiFactorAssertion. + * + * Checks if two #FirebaseAuthInternalPhoneMultiFactorAssertion objects are + * equal. + * + * Returns: TRUE if @a and @b are equal. + */ +gboolean firebase_auth_internal_phone_multi_factor_assertion_equals( + FirebaseAuthInternalPhoneMultiFactorAssertion* a, + FirebaseAuthInternalPhoneMultiFactorAssertion* b); + +/** + * firebase_auth_internal_phone_multi_factor_assertion_hash: + * @object: a #FirebaseAuthInternalPhoneMultiFactorAssertion. + * + * Calculates a hash code for a #FirebaseAuthInternalPhoneMultiFactorAssertion + * object. + * + * Returns: the hash code. + */ +guint firebase_auth_internal_phone_multi_factor_assertion_hash( + FirebaseAuthInternalPhoneMultiFactorAssertion* object); + +/** + * FirebaseAuthInternalMultiFactorInfo: + * + */ + +G_DECLARE_FINAL_TYPE(FirebaseAuthInternalMultiFactorInfo, + firebase_auth_internal_multi_factor_info, FIREBASE_AUTH, + INTERNAL_MULTI_FACTOR_INFO, GObject) + +/** + * firebase_auth_internal_multi_factor_info_new: + * display_name: field in this object. + * enrollment_timestamp: field in this object. + * factor_id: field in this object. + * uid: field in this object. + * phone_number: field in this object. + * + * Creates a new #InternalMultiFactorInfo object. + * + * Returns: a new #FirebaseAuthInternalMultiFactorInfo + */ +FirebaseAuthInternalMultiFactorInfo* +firebase_auth_internal_multi_factor_info_new(const gchar* display_name, + double enrollment_timestamp, + const gchar* factor_id, + const gchar* uid, + const gchar* phone_number); + +/** + * firebase_auth_internal_multi_factor_info_get_display_name + * @object: a #FirebaseAuthInternalMultiFactorInfo. + * + * Gets the value of the displayName field of @object. + * + * Returns: the field value. + */ +const gchar* firebase_auth_internal_multi_factor_info_get_display_name( + FirebaseAuthInternalMultiFactorInfo* object); + +/** + * firebase_auth_internal_multi_factor_info_get_enrollment_timestamp + * @object: a #FirebaseAuthInternalMultiFactorInfo. + * + * Gets the value of the enrollmentTimestamp field of @object. + * + * Returns: the field value. + */ +double firebase_auth_internal_multi_factor_info_get_enrollment_timestamp( + FirebaseAuthInternalMultiFactorInfo* object); + +/** + * firebase_auth_internal_multi_factor_info_get_factor_id + * @object: a #FirebaseAuthInternalMultiFactorInfo. + * + * Gets the value of the factorId field of @object. + * + * Returns: the field value. + */ +const gchar* firebase_auth_internal_multi_factor_info_get_factor_id( + FirebaseAuthInternalMultiFactorInfo* object); + +/** + * firebase_auth_internal_multi_factor_info_get_uid + * @object: a #FirebaseAuthInternalMultiFactorInfo. + * + * Gets the value of the uid field of @object. + * + * Returns: the field value. + */ +const gchar* firebase_auth_internal_multi_factor_info_get_uid( + FirebaseAuthInternalMultiFactorInfo* object); + +/** + * firebase_auth_internal_multi_factor_info_get_phone_number + * @object: a #FirebaseAuthInternalMultiFactorInfo. + * + * Gets the value of the phoneNumber field of @object. + * + * Returns: the field value. + */ +const gchar* firebase_auth_internal_multi_factor_info_get_phone_number( + FirebaseAuthInternalMultiFactorInfo* object); + +/** + * firebase_auth_internal_multi_factor_info_equals: + * @a: a #FirebaseAuthInternalMultiFactorInfo. + * @b: another #FirebaseAuthInternalMultiFactorInfo. + * + * Checks if two #FirebaseAuthInternalMultiFactorInfo objects are equal. + * + * Returns: TRUE if @a and @b are equal. + */ +gboolean firebase_auth_internal_multi_factor_info_equals( + FirebaseAuthInternalMultiFactorInfo* a, + FirebaseAuthInternalMultiFactorInfo* b); + +/** + * firebase_auth_internal_multi_factor_info_hash: + * @object: a #FirebaseAuthInternalMultiFactorInfo. + * + * Calculates a hash code for a #FirebaseAuthInternalMultiFactorInfo object. + * + * Returns: the hash code. + */ +guint firebase_auth_internal_multi_factor_info_hash( + FirebaseAuthInternalMultiFactorInfo* object); + +/** + * FirebaseAuthAuthPigeonFirebaseApp: + * + */ + +G_DECLARE_FINAL_TYPE(FirebaseAuthAuthPigeonFirebaseApp, + firebase_auth_auth_pigeon_firebase_app, FIREBASE_AUTH, + AUTH_PIGEON_FIREBASE_APP, GObject) + +/** + * firebase_auth_auth_pigeon_firebase_app_new: + * app_name: field in this object. + * tenant_id: field in this object. + * custom_auth_domain: field in this object. + * + * Creates a new #AuthPigeonFirebaseApp object. + * + * Returns: a new #FirebaseAuthAuthPigeonFirebaseApp + */ +FirebaseAuthAuthPigeonFirebaseApp* firebase_auth_auth_pigeon_firebase_app_new( + const gchar* app_name, const gchar* tenant_id, + const gchar* custom_auth_domain); + +/** + * firebase_auth_auth_pigeon_firebase_app_get_app_name + * @object: a #FirebaseAuthAuthPigeonFirebaseApp. + * + * Gets the value of the appName field of @object. + * + * Returns: the field value. + */ +const gchar* firebase_auth_auth_pigeon_firebase_app_get_app_name( + FirebaseAuthAuthPigeonFirebaseApp* object); + +/** + * firebase_auth_auth_pigeon_firebase_app_get_tenant_id + * @object: a #FirebaseAuthAuthPigeonFirebaseApp. + * + * Gets the value of the tenantId field of @object. + * + * Returns: the field value. + */ +const gchar* firebase_auth_auth_pigeon_firebase_app_get_tenant_id( + FirebaseAuthAuthPigeonFirebaseApp* object); + +/** + * firebase_auth_auth_pigeon_firebase_app_get_custom_auth_domain + * @object: a #FirebaseAuthAuthPigeonFirebaseApp. + * + * Gets the value of the customAuthDomain field of @object. + * + * Returns: the field value. + */ +const gchar* firebase_auth_auth_pigeon_firebase_app_get_custom_auth_domain( + FirebaseAuthAuthPigeonFirebaseApp* object); + +/** + * firebase_auth_auth_pigeon_firebase_app_equals: + * @a: a #FirebaseAuthAuthPigeonFirebaseApp. + * @b: another #FirebaseAuthAuthPigeonFirebaseApp. + * + * Checks if two #FirebaseAuthAuthPigeonFirebaseApp objects are equal. + * + * Returns: TRUE if @a and @b are equal. + */ +gboolean firebase_auth_auth_pigeon_firebase_app_equals( + FirebaseAuthAuthPigeonFirebaseApp* a, FirebaseAuthAuthPigeonFirebaseApp* b); + +/** + * firebase_auth_auth_pigeon_firebase_app_hash: + * @object: a #FirebaseAuthAuthPigeonFirebaseApp. + * + * Calculates a hash code for a #FirebaseAuthAuthPigeonFirebaseApp object. + * + * Returns: the hash code. + */ +guint firebase_auth_auth_pigeon_firebase_app_hash( + FirebaseAuthAuthPigeonFirebaseApp* object); + +/** + * FirebaseAuthInternalActionCodeInfoData: + * + */ + +G_DECLARE_FINAL_TYPE(FirebaseAuthInternalActionCodeInfoData, + firebase_auth_internal_action_code_info_data, + FIREBASE_AUTH, INTERNAL_ACTION_CODE_INFO_DATA, GObject) + +/** + * firebase_auth_internal_action_code_info_data_new: + * email: field in this object. + * previous_email: field in this object. + * + * Creates a new #InternalActionCodeInfoData object. + * + * Returns: a new #FirebaseAuthInternalActionCodeInfoData + */ +FirebaseAuthInternalActionCodeInfoData* +firebase_auth_internal_action_code_info_data_new(const gchar* email, + const gchar* previous_email); + +/** + * firebase_auth_internal_action_code_info_data_get_email + * @object: a #FirebaseAuthInternalActionCodeInfoData. + * + * Gets the value of the email field of @object. + * + * Returns: the field value. + */ +const gchar* firebase_auth_internal_action_code_info_data_get_email( + FirebaseAuthInternalActionCodeInfoData* object); + +/** + * firebase_auth_internal_action_code_info_data_get_previous_email + * @object: a #FirebaseAuthInternalActionCodeInfoData. + * + * Gets the value of the previousEmail field of @object. + * + * Returns: the field value. + */ +const gchar* firebase_auth_internal_action_code_info_data_get_previous_email( + FirebaseAuthInternalActionCodeInfoData* object); + +/** + * firebase_auth_internal_action_code_info_data_equals: + * @a: a #FirebaseAuthInternalActionCodeInfoData. + * @b: another #FirebaseAuthInternalActionCodeInfoData. + * + * Checks if two #FirebaseAuthInternalActionCodeInfoData objects are equal. + * + * Returns: TRUE if @a and @b are equal. + */ +gboolean firebase_auth_internal_action_code_info_data_equals( + FirebaseAuthInternalActionCodeInfoData* a, + FirebaseAuthInternalActionCodeInfoData* b); + +/** + * firebase_auth_internal_action_code_info_data_hash: + * @object: a #FirebaseAuthInternalActionCodeInfoData. + * + * Calculates a hash code for a #FirebaseAuthInternalActionCodeInfoData object. + * + * Returns: the hash code. + */ +guint firebase_auth_internal_action_code_info_data_hash( + FirebaseAuthInternalActionCodeInfoData* object); + +/** + * FirebaseAuthInternalActionCodeInfo: + * + */ + +G_DECLARE_FINAL_TYPE(FirebaseAuthInternalActionCodeInfo, + firebase_auth_internal_action_code_info, FIREBASE_AUTH, + INTERNAL_ACTION_CODE_INFO, GObject) + +/** + * firebase_auth_internal_action_code_info_new: + * operation: field in this object. + * data: field in this object. + * + * Creates a new #InternalActionCodeInfo object. + * + * Returns: a new #FirebaseAuthInternalActionCodeInfo + */ +FirebaseAuthInternalActionCodeInfo* firebase_auth_internal_action_code_info_new( + FirebaseAuthActionCodeInfoOperation operation, + FirebaseAuthInternalActionCodeInfoData* data); + +/** + * firebase_auth_internal_action_code_info_get_operation + * @object: a #FirebaseAuthInternalActionCodeInfo. + * + * Gets the value of the operation field of @object. + * + * Returns: the field value. + */ +FirebaseAuthActionCodeInfoOperation +firebase_auth_internal_action_code_info_get_operation( + FirebaseAuthInternalActionCodeInfo* object); + +/** + * firebase_auth_internal_action_code_info_get_data + * @object: a #FirebaseAuthInternalActionCodeInfo. + * + * Gets the value of the data field of @object. + * + * Returns: the field value. + */ +FirebaseAuthInternalActionCodeInfoData* +firebase_auth_internal_action_code_info_get_data( + FirebaseAuthInternalActionCodeInfo* object); + +/** + * firebase_auth_internal_action_code_info_equals: + * @a: a #FirebaseAuthInternalActionCodeInfo. + * @b: another #FirebaseAuthInternalActionCodeInfo. + * + * Checks if two #FirebaseAuthInternalActionCodeInfo objects are equal. + * + * Returns: TRUE if @a and @b are equal. + */ +gboolean firebase_auth_internal_action_code_info_equals( + FirebaseAuthInternalActionCodeInfo* a, + FirebaseAuthInternalActionCodeInfo* b); + +/** + * firebase_auth_internal_action_code_info_hash: + * @object: a #FirebaseAuthInternalActionCodeInfo. + * + * Calculates a hash code for a #FirebaseAuthInternalActionCodeInfo object. + * + * Returns: the hash code. + */ +guint firebase_auth_internal_action_code_info_hash( + FirebaseAuthInternalActionCodeInfo* object); + +/** + * FirebaseAuthInternalAdditionalUserInfo: + * + */ + +G_DECLARE_FINAL_TYPE(FirebaseAuthInternalAdditionalUserInfo, + firebase_auth_internal_additional_user_info, FIREBASE_AUTH, + INTERNAL_ADDITIONAL_USER_INFO, GObject) + +/** + * firebase_auth_internal_additional_user_info_new: + * is_new_user: field in this object. + * provider_id: field in this object. + * username: field in this object. + * authorization_code: field in this object. + * profile: field in this object. + * + * Creates a new #InternalAdditionalUserInfo object. + * + * Returns: a new #FirebaseAuthInternalAdditionalUserInfo + */ +FirebaseAuthInternalAdditionalUserInfo* +firebase_auth_internal_additional_user_info_new(gboolean is_new_user, + const gchar* provider_id, + const gchar* username, + const gchar* authorization_code, + FlValue* profile); + +/** + * firebase_auth_internal_additional_user_info_get_is_new_user + * @object: a #FirebaseAuthInternalAdditionalUserInfo. + * + * Gets the value of the isNewUser field of @object. + * + * Returns: the field value. + */ +gboolean firebase_auth_internal_additional_user_info_get_is_new_user( + FirebaseAuthInternalAdditionalUserInfo* object); + +/** + * firebase_auth_internal_additional_user_info_get_provider_id + * @object: a #FirebaseAuthInternalAdditionalUserInfo. + * + * Gets the value of the providerId field of @object. + * + * Returns: the field value. + */ +const gchar* firebase_auth_internal_additional_user_info_get_provider_id( + FirebaseAuthInternalAdditionalUserInfo* object); + +/** + * firebase_auth_internal_additional_user_info_get_username + * @object: a #FirebaseAuthInternalAdditionalUserInfo. + * + * Gets the value of the username field of @object. + * + * Returns: the field value. + */ +const gchar* firebase_auth_internal_additional_user_info_get_username( + FirebaseAuthInternalAdditionalUserInfo* object); + +/** + * firebase_auth_internal_additional_user_info_get_authorization_code + * @object: a #FirebaseAuthInternalAdditionalUserInfo. + * + * Gets the value of the authorizationCode field of @object. + * + * Returns: the field value. + */ +const gchar* firebase_auth_internal_additional_user_info_get_authorization_code( + FirebaseAuthInternalAdditionalUserInfo* object); + +/** + * firebase_auth_internal_additional_user_info_get_profile + * @object: a #FirebaseAuthInternalAdditionalUserInfo. + * + * Gets the value of the profile field of @object. + * + * Returns: the field value. + */ +FlValue* firebase_auth_internal_additional_user_info_get_profile( + FirebaseAuthInternalAdditionalUserInfo* object); + +/** + * firebase_auth_internal_additional_user_info_equals: + * @a: a #FirebaseAuthInternalAdditionalUserInfo. + * @b: another #FirebaseAuthInternalAdditionalUserInfo. + * + * Checks if two #FirebaseAuthInternalAdditionalUserInfo objects are equal. + * + * Returns: TRUE if @a and @b are equal. + */ +gboolean firebase_auth_internal_additional_user_info_equals( + FirebaseAuthInternalAdditionalUserInfo* a, + FirebaseAuthInternalAdditionalUserInfo* b); + +/** + * firebase_auth_internal_additional_user_info_hash: + * @object: a #FirebaseAuthInternalAdditionalUserInfo. + * + * Calculates a hash code for a #FirebaseAuthInternalAdditionalUserInfo object. + * + * Returns: the hash code. + */ +guint firebase_auth_internal_additional_user_info_hash( + FirebaseAuthInternalAdditionalUserInfo* object); + +/** + * FirebaseAuthInternalAuthCredential: + * + */ + +G_DECLARE_FINAL_TYPE(FirebaseAuthInternalAuthCredential, + firebase_auth_internal_auth_credential, FIREBASE_AUTH, + INTERNAL_AUTH_CREDENTIAL, GObject) + +/** + * firebase_auth_internal_auth_credential_new: + * provider_id: field in this object. + * sign_in_method: field in this object. + * native_id: field in this object. + * access_token: field in this object. + * + * Creates a new #InternalAuthCredential object. + * + * Returns: a new #FirebaseAuthInternalAuthCredential + */ +FirebaseAuthInternalAuthCredential* firebase_auth_internal_auth_credential_new( + const gchar* provider_id, const gchar* sign_in_method, int64_t native_id, + const gchar* access_token); + +/** + * firebase_auth_internal_auth_credential_get_provider_id + * @object: a #FirebaseAuthInternalAuthCredential. + * + * Gets the value of the providerId field of @object. + * + * Returns: the field value. + */ +const gchar* firebase_auth_internal_auth_credential_get_provider_id( + FirebaseAuthInternalAuthCredential* object); + +/** + * firebase_auth_internal_auth_credential_get_sign_in_method + * @object: a #FirebaseAuthInternalAuthCredential. + * + * Gets the value of the signInMethod field of @object. + * + * Returns: the field value. + */ +const gchar* firebase_auth_internal_auth_credential_get_sign_in_method( + FirebaseAuthInternalAuthCredential* object); + +/** + * firebase_auth_internal_auth_credential_get_native_id + * @object: a #FirebaseAuthInternalAuthCredential. + * + * Gets the value of the nativeId field of @object. + * + * Returns: the field value. + */ +int64_t firebase_auth_internal_auth_credential_get_native_id( + FirebaseAuthInternalAuthCredential* object); + +/** + * firebase_auth_internal_auth_credential_get_access_token + * @object: a #FirebaseAuthInternalAuthCredential. + * + * Gets the value of the accessToken field of @object. + * + * Returns: the field value. + */ +const gchar* firebase_auth_internal_auth_credential_get_access_token( + FirebaseAuthInternalAuthCredential* object); + +/** + * firebase_auth_internal_auth_credential_equals: + * @a: a #FirebaseAuthInternalAuthCredential. + * @b: another #FirebaseAuthInternalAuthCredential. + * + * Checks if two #FirebaseAuthInternalAuthCredential objects are equal. + * + * Returns: TRUE if @a and @b are equal. + */ +gboolean firebase_auth_internal_auth_credential_equals( + FirebaseAuthInternalAuthCredential* a, + FirebaseAuthInternalAuthCredential* b); + +/** + * firebase_auth_internal_auth_credential_hash: + * @object: a #FirebaseAuthInternalAuthCredential. + * + * Calculates a hash code for a #FirebaseAuthInternalAuthCredential object. + * + * Returns: the hash code. + */ +guint firebase_auth_internal_auth_credential_hash( + FirebaseAuthInternalAuthCredential* object); + +/** + * FirebaseAuthInternalUserInfo: + * + */ + +G_DECLARE_FINAL_TYPE(FirebaseAuthInternalUserInfo, + firebase_auth_internal_user_info, FIREBASE_AUTH, + INTERNAL_USER_INFO, GObject) + +/** + * firebase_auth_internal_user_info_new: + * uid: field in this object. + * email: field in this object. + * display_name: field in this object. + * photo_url: field in this object. + * phone_number: field in this object. + * is_anonymous: field in this object. + * is_email_verified: field in this object. + * provider_id: field in this object. + * tenant_id: field in this object. + * refresh_token: field in this object. + * creation_timestamp: field in this object. + * last_sign_in_timestamp: field in this object. + * + * Creates a new #InternalUserInfo object. + * + * Returns: a new #FirebaseAuthInternalUserInfo + */ +FirebaseAuthInternalUserInfo* firebase_auth_internal_user_info_new( + const gchar* uid, const gchar* email, const gchar* display_name, + const gchar* photo_url, const gchar* phone_number, gboolean is_anonymous, + gboolean is_email_verified, const gchar* provider_id, + const gchar* tenant_id, const gchar* refresh_token, + int64_t* creation_timestamp, int64_t* last_sign_in_timestamp); + +/** + * firebase_auth_internal_user_info_get_uid + * @object: a #FirebaseAuthInternalUserInfo. + * + * Gets the value of the uid field of @object. + * + * Returns: the field value. + */ +const gchar* firebase_auth_internal_user_info_get_uid( + FirebaseAuthInternalUserInfo* object); + +/** + * firebase_auth_internal_user_info_get_email + * @object: a #FirebaseAuthInternalUserInfo. + * + * Gets the value of the email field of @object. + * + * Returns: the field value. + */ +const gchar* firebase_auth_internal_user_info_get_email( + FirebaseAuthInternalUserInfo* object); + +/** + * firebase_auth_internal_user_info_get_display_name + * @object: a #FirebaseAuthInternalUserInfo. + * + * Gets the value of the displayName field of @object. + * + * Returns: the field value. + */ +const gchar* firebase_auth_internal_user_info_get_display_name( + FirebaseAuthInternalUserInfo* object); + +/** + * firebase_auth_internal_user_info_get_photo_url + * @object: a #FirebaseAuthInternalUserInfo. + * + * Gets the value of the photoUrl field of @object. + * + * Returns: the field value. + */ +const gchar* firebase_auth_internal_user_info_get_photo_url( + FirebaseAuthInternalUserInfo* object); + +/** + * firebase_auth_internal_user_info_get_phone_number + * @object: a #FirebaseAuthInternalUserInfo. + * + * Gets the value of the phoneNumber field of @object. + * + * Returns: the field value. + */ +const gchar* firebase_auth_internal_user_info_get_phone_number( + FirebaseAuthInternalUserInfo* object); + +/** + * firebase_auth_internal_user_info_get_is_anonymous + * @object: a #FirebaseAuthInternalUserInfo. + * + * Gets the value of the isAnonymous field of @object. + * + * Returns: the field value. + */ +gboolean firebase_auth_internal_user_info_get_is_anonymous( + FirebaseAuthInternalUserInfo* object); + +/** + * firebase_auth_internal_user_info_get_is_email_verified + * @object: a #FirebaseAuthInternalUserInfo. + * + * Gets the value of the isEmailVerified field of @object. + * + * Returns: the field value. + */ +gboolean firebase_auth_internal_user_info_get_is_email_verified( + FirebaseAuthInternalUserInfo* object); + +/** + * firebase_auth_internal_user_info_get_provider_id + * @object: a #FirebaseAuthInternalUserInfo. + * + * Gets the value of the providerId field of @object. + * + * Returns: the field value. + */ +const gchar* firebase_auth_internal_user_info_get_provider_id( + FirebaseAuthInternalUserInfo* object); + +/** + * firebase_auth_internal_user_info_get_tenant_id + * @object: a #FirebaseAuthInternalUserInfo. + * + * Gets the value of the tenantId field of @object. + * + * Returns: the field value. + */ +const gchar* firebase_auth_internal_user_info_get_tenant_id( + FirebaseAuthInternalUserInfo* object); + +/** + * firebase_auth_internal_user_info_get_refresh_token + * @object: a #FirebaseAuthInternalUserInfo. + * + * Gets the value of the refreshToken field of @object. + * + * Returns: the field value. + */ +const gchar* firebase_auth_internal_user_info_get_refresh_token( + FirebaseAuthInternalUserInfo* object); + +/** + * firebase_auth_internal_user_info_get_creation_timestamp + * @object: a #FirebaseAuthInternalUserInfo. + * + * Gets the value of the creationTimestamp field of @object. + * + * Returns: the field value. + */ +int64_t* firebase_auth_internal_user_info_get_creation_timestamp( + FirebaseAuthInternalUserInfo* object); + +/** + * firebase_auth_internal_user_info_get_last_sign_in_timestamp + * @object: a #FirebaseAuthInternalUserInfo. + * + * Gets the value of the lastSignInTimestamp field of @object. + * + * Returns: the field value. + */ +int64_t* firebase_auth_internal_user_info_get_last_sign_in_timestamp( + FirebaseAuthInternalUserInfo* object); + +/** + * firebase_auth_internal_user_info_equals: + * @a: a #FirebaseAuthInternalUserInfo. + * @b: another #FirebaseAuthInternalUserInfo. + * + * Checks if two #FirebaseAuthInternalUserInfo objects are equal. + * + * Returns: TRUE if @a and @b are equal. + */ +gboolean firebase_auth_internal_user_info_equals( + FirebaseAuthInternalUserInfo* a, FirebaseAuthInternalUserInfo* b); + +/** + * firebase_auth_internal_user_info_hash: + * @object: a #FirebaseAuthInternalUserInfo. + * + * Calculates a hash code for a #FirebaseAuthInternalUserInfo object. + * + * Returns: the hash code. + */ +guint firebase_auth_internal_user_info_hash( + FirebaseAuthInternalUserInfo* object); + +/** + * FirebaseAuthInternalUserDetails: + * + */ + +G_DECLARE_FINAL_TYPE(FirebaseAuthInternalUserDetails, + firebase_auth_internal_user_details, FIREBASE_AUTH, + INTERNAL_USER_DETAILS, GObject) + +/** + * firebase_auth_internal_user_details_new: + * user_info: field in this object. + * provider_data: field in this object. + * + * Creates a new #InternalUserDetails object. + * + * Returns: a new #FirebaseAuthInternalUserDetails + */ +FirebaseAuthInternalUserDetails* firebase_auth_internal_user_details_new( + FirebaseAuthInternalUserInfo* user_info, FlValue* provider_data); + +/** + * firebase_auth_internal_user_details_get_user_info + * @object: a #FirebaseAuthInternalUserDetails. + * + * Gets the value of the userInfo field of @object. + * + * Returns: the field value. + */ +FirebaseAuthInternalUserInfo* firebase_auth_internal_user_details_get_user_info( + FirebaseAuthInternalUserDetails* object); + +/** + * firebase_auth_internal_user_details_get_provider_data + * @object: a #FirebaseAuthInternalUserDetails. + * + * Gets the value of the providerData field of @object. + * + * Returns: the field value. + */ +FlValue* firebase_auth_internal_user_details_get_provider_data( + FirebaseAuthInternalUserDetails* object); + +/** + * firebase_auth_internal_user_details_equals: + * @a: a #FirebaseAuthInternalUserDetails. + * @b: another #FirebaseAuthInternalUserDetails. + * + * Checks if two #FirebaseAuthInternalUserDetails objects are equal. + * + * Returns: TRUE if @a and @b are equal. + */ +gboolean firebase_auth_internal_user_details_equals( + FirebaseAuthInternalUserDetails* a, FirebaseAuthInternalUserDetails* b); + +/** + * firebase_auth_internal_user_details_hash: + * @object: a #FirebaseAuthInternalUserDetails. + * + * Calculates a hash code for a #FirebaseAuthInternalUserDetails object. + * + * Returns: the hash code. + */ +guint firebase_auth_internal_user_details_hash( + FirebaseAuthInternalUserDetails* object); + +/** + * FirebaseAuthInternalUserCredential: + * + */ + +G_DECLARE_FINAL_TYPE(FirebaseAuthInternalUserCredential, + firebase_auth_internal_user_credential, FIREBASE_AUTH, + INTERNAL_USER_CREDENTIAL, GObject) + +/** + * firebase_auth_internal_user_credential_new: + * user: field in this object. + * additional_user_info: field in this object. + * credential: field in this object. + * + * Creates a new #InternalUserCredential object. + * + * Returns: a new #FirebaseAuthInternalUserCredential + */ +FirebaseAuthInternalUserCredential* firebase_auth_internal_user_credential_new( + FirebaseAuthInternalUserDetails* user, + FirebaseAuthInternalAdditionalUserInfo* additional_user_info, + FirebaseAuthInternalAuthCredential* credential); + +/** + * firebase_auth_internal_user_credential_get_user + * @object: a #FirebaseAuthInternalUserCredential. + * + * Gets the value of the user field of @object. + * + * Returns: the field value. + */ +FirebaseAuthInternalUserDetails* +firebase_auth_internal_user_credential_get_user( + FirebaseAuthInternalUserCredential* object); + +/** + * firebase_auth_internal_user_credential_get_additional_user_info + * @object: a #FirebaseAuthInternalUserCredential. + * + * Gets the value of the additionalUserInfo field of @object. + * + * Returns: the field value. + */ +FirebaseAuthInternalAdditionalUserInfo* +firebase_auth_internal_user_credential_get_additional_user_info( + FirebaseAuthInternalUserCredential* object); + +/** + * firebase_auth_internal_user_credential_get_credential + * @object: a #FirebaseAuthInternalUserCredential. + * + * Gets the value of the credential field of @object. + * + * Returns: the field value. + */ +FirebaseAuthInternalAuthCredential* +firebase_auth_internal_user_credential_get_credential( + FirebaseAuthInternalUserCredential* object); + +/** + * firebase_auth_internal_user_credential_equals: + * @a: a #FirebaseAuthInternalUserCredential. + * @b: another #FirebaseAuthInternalUserCredential. + * + * Checks if two #FirebaseAuthInternalUserCredential objects are equal. + * + * Returns: TRUE if @a and @b are equal. + */ +gboolean firebase_auth_internal_user_credential_equals( + FirebaseAuthInternalUserCredential* a, + FirebaseAuthInternalUserCredential* b); + +/** + * firebase_auth_internal_user_credential_hash: + * @object: a #FirebaseAuthInternalUserCredential. + * + * Calculates a hash code for a #FirebaseAuthInternalUserCredential object. + * + * Returns: the hash code. + */ +guint firebase_auth_internal_user_credential_hash( + FirebaseAuthInternalUserCredential* object); + +/** + * FirebaseAuthInternalAuthCredentialInput: + * + */ + +G_DECLARE_FINAL_TYPE(FirebaseAuthInternalAuthCredentialInput, + firebase_auth_internal_auth_credential_input, + FIREBASE_AUTH, INTERNAL_AUTH_CREDENTIAL_INPUT, GObject) + +/** + * firebase_auth_internal_auth_credential_input_new: + * provider_id: field in this object. + * sign_in_method: field in this object. + * token: field in this object. + * access_token: field in this object. + * + * Creates a new #InternalAuthCredentialInput object. + * + * Returns: a new #FirebaseAuthInternalAuthCredentialInput + */ +FirebaseAuthInternalAuthCredentialInput* +firebase_auth_internal_auth_credential_input_new(const gchar* provider_id, + const gchar* sign_in_method, + const gchar* token, + const gchar* access_token); + +/** + * firebase_auth_internal_auth_credential_input_get_provider_id + * @object: a #FirebaseAuthInternalAuthCredentialInput. + * + * Gets the value of the providerId field of @object. + * + * Returns: the field value. + */ +const gchar* firebase_auth_internal_auth_credential_input_get_provider_id( + FirebaseAuthInternalAuthCredentialInput* object); + +/** + * firebase_auth_internal_auth_credential_input_get_sign_in_method + * @object: a #FirebaseAuthInternalAuthCredentialInput. + * + * Gets the value of the signInMethod field of @object. + * + * Returns: the field value. + */ +const gchar* firebase_auth_internal_auth_credential_input_get_sign_in_method( + FirebaseAuthInternalAuthCredentialInput* object); + +/** + * firebase_auth_internal_auth_credential_input_get_token + * @object: a #FirebaseAuthInternalAuthCredentialInput. + * + * Gets the value of the token field of @object. + * + * Returns: the field value. + */ +const gchar* firebase_auth_internal_auth_credential_input_get_token( + FirebaseAuthInternalAuthCredentialInput* object); + +/** + * firebase_auth_internal_auth_credential_input_get_access_token + * @object: a #FirebaseAuthInternalAuthCredentialInput. + * + * Gets the value of the accessToken field of @object. + * + * Returns: the field value. + */ +const gchar* firebase_auth_internal_auth_credential_input_get_access_token( + FirebaseAuthInternalAuthCredentialInput* object); + +/** + * firebase_auth_internal_auth_credential_input_equals: + * @a: a #FirebaseAuthInternalAuthCredentialInput. + * @b: another #FirebaseAuthInternalAuthCredentialInput. + * + * Checks if two #FirebaseAuthInternalAuthCredentialInput objects are equal. + * + * Returns: TRUE if @a and @b are equal. + */ +gboolean firebase_auth_internal_auth_credential_input_equals( + FirebaseAuthInternalAuthCredentialInput* a, + FirebaseAuthInternalAuthCredentialInput* b); + +/** + * firebase_auth_internal_auth_credential_input_hash: + * @object: a #FirebaseAuthInternalAuthCredentialInput. + * + * Calculates a hash code for a #FirebaseAuthInternalAuthCredentialInput object. + * + * Returns: the hash code. + */ +guint firebase_auth_internal_auth_credential_input_hash( + FirebaseAuthInternalAuthCredentialInput* object); + +/** + * FirebaseAuthInternalActionCodeSettings: + * + */ + +G_DECLARE_FINAL_TYPE(FirebaseAuthInternalActionCodeSettings, + firebase_auth_internal_action_code_settings, FIREBASE_AUTH, + INTERNAL_ACTION_CODE_SETTINGS, GObject) + +/** + * firebase_auth_internal_action_code_settings_new: + * url: field in this object. + * dynamic_link_domain: field in this object. + * handle_code_in_app: field in this object. + * i_o_s_bundle_id: field in this object. + * android_package_name: field in this object. + * android_install_app: field in this object. + * android_minimum_version: field in this object. + * link_domain: field in this object. + * + * Creates a new #InternalActionCodeSettings object. + * + * Returns: a new #FirebaseAuthInternalActionCodeSettings + */ +FirebaseAuthInternalActionCodeSettings* +firebase_auth_internal_action_code_settings_new( + const gchar* url, const gchar* dynamic_link_domain, + gboolean handle_code_in_app, const gchar* i_o_s_bundle_id, + const gchar* android_package_name, gboolean android_install_app, + const gchar* android_minimum_version, const gchar* link_domain); + +/** + * firebase_auth_internal_action_code_settings_get_url + * @object: a #FirebaseAuthInternalActionCodeSettings. + * + * Gets the value of the url field of @object. + * + * Returns: the field value. + */ +const gchar* firebase_auth_internal_action_code_settings_get_url( + FirebaseAuthInternalActionCodeSettings* object); + +/** + * firebase_auth_internal_action_code_settings_get_dynamic_link_domain + * @object: a #FirebaseAuthInternalActionCodeSettings. + * + * Gets the value of the dynamicLinkDomain field of @object. + * + * Returns: the field value. + */ +const gchar* +firebase_auth_internal_action_code_settings_get_dynamic_link_domain( + FirebaseAuthInternalActionCodeSettings* object); + +/** + * firebase_auth_internal_action_code_settings_get_handle_code_in_app + * @object: a #FirebaseAuthInternalActionCodeSettings. + * + * Gets the value of the handleCodeInApp field of @object. + * + * Returns: the field value. + */ +gboolean firebase_auth_internal_action_code_settings_get_handle_code_in_app( + FirebaseAuthInternalActionCodeSettings* object); + +/** + * firebase_auth_internal_action_code_settings_get_i_o_s_bundle_id + * @object: a #FirebaseAuthInternalActionCodeSettings. + * + * Gets the value of the iOSBundleId field of @object. + * + * Returns: the field value. + */ +const gchar* firebase_auth_internal_action_code_settings_get_i_o_s_bundle_id( + FirebaseAuthInternalActionCodeSettings* object); + +/** + * firebase_auth_internal_action_code_settings_get_android_package_name + * @object: a #FirebaseAuthInternalActionCodeSettings. + * + * Gets the value of the androidPackageName field of @object. + * + * Returns: the field value. + */ +const gchar* +firebase_auth_internal_action_code_settings_get_android_package_name( + FirebaseAuthInternalActionCodeSettings* object); + +/** + * firebase_auth_internal_action_code_settings_get_android_install_app + * @object: a #FirebaseAuthInternalActionCodeSettings. + * + * Gets the value of the androidInstallApp field of @object. + * + * Returns: the field value. + */ +gboolean firebase_auth_internal_action_code_settings_get_android_install_app( + FirebaseAuthInternalActionCodeSettings* object); + +/** + * firebase_auth_internal_action_code_settings_get_android_minimum_version + * @object: a #FirebaseAuthInternalActionCodeSettings. + * + * Gets the value of the androidMinimumVersion field of @object. + * + * Returns: the field value. + */ +const gchar* +firebase_auth_internal_action_code_settings_get_android_minimum_version( + FirebaseAuthInternalActionCodeSettings* object); + +/** + * firebase_auth_internal_action_code_settings_get_link_domain + * @object: a #FirebaseAuthInternalActionCodeSettings. + * + * Gets the value of the linkDomain field of @object. + * + * Returns: the field value. + */ +const gchar* firebase_auth_internal_action_code_settings_get_link_domain( + FirebaseAuthInternalActionCodeSettings* object); + +/** + * firebase_auth_internal_action_code_settings_equals: + * @a: a #FirebaseAuthInternalActionCodeSettings. + * @b: another #FirebaseAuthInternalActionCodeSettings. + * + * Checks if two #FirebaseAuthInternalActionCodeSettings objects are equal. + * + * Returns: TRUE if @a and @b are equal. + */ +gboolean firebase_auth_internal_action_code_settings_equals( + FirebaseAuthInternalActionCodeSettings* a, + FirebaseAuthInternalActionCodeSettings* b); + +/** + * firebase_auth_internal_action_code_settings_hash: + * @object: a #FirebaseAuthInternalActionCodeSettings. + * + * Calculates a hash code for a #FirebaseAuthInternalActionCodeSettings object. + * + * Returns: the hash code. + */ +guint firebase_auth_internal_action_code_settings_hash( + FirebaseAuthInternalActionCodeSettings* object); + +/** + * FirebaseAuthInternalFirebaseAuthSettings: + * + */ + +G_DECLARE_FINAL_TYPE(FirebaseAuthInternalFirebaseAuthSettings, + firebase_auth_internal_firebase_auth_settings, + FIREBASE_AUTH, INTERNAL_FIREBASE_AUTH_SETTINGS, GObject) + +/** + * firebase_auth_internal_firebase_auth_settings_new: + * app_verification_disabled_for_testing: field in this object. + * user_access_group: field in this object. + * phone_number: field in this object. + * sms_code: field in this object. + * force_recaptcha_flow: field in this object. + * + * Creates a new #InternalFirebaseAuthSettings object. + * + * Returns: a new #FirebaseAuthInternalFirebaseAuthSettings + */ +FirebaseAuthInternalFirebaseAuthSettings* +firebase_auth_internal_firebase_auth_settings_new( + gboolean app_verification_disabled_for_testing, + const gchar* user_access_group, const gchar* phone_number, + const gchar* sms_code, gboolean* force_recaptcha_flow); + +/** + * firebase_auth_internal_firebase_auth_settings_get_app_verification_disabled_for_testing + * @object: a #FirebaseAuthInternalFirebaseAuthSettings. + * + * Gets the value of the appVerificationDisabledForTesting field of @object. + * + * Returns: the field value. + */ +gboolean +firebase_auth_internal_firebase_auth_settings_get_app_verification_disabled_for_testing( + FirebaseAuthInternalFirebaseAuthSettings* object); + +/** + * firebase_auth_internal_firebase_auth_settings_get_user_access_group + * @object: a #FirebaseAuthInternalFirebaseAuthSettings. + * + * Gets the value of the userAccessGroup field of @object. + * + * Returns: the field value. + */ +const gchar* +firebase_auth_internal_firebase_auth_settings_get_user_access_group( + FirebaseAuthInternalFirebaseAuthSettings* object); + +/** + * firebase_auth_internal_firebase_auth_settings_get_phone_number + * @object: a #FirebaseAuthInternalFirebaseAuthSettings. + * + * Gets the value of the phoneNumber field of @object. + * + * Returns: the field value. + */ +const gchar* firebase_auth_internal_firebase_auth_settings_get_phone_number( + FirebaseAuthInternalFirebaseAuthSettings* object); + +/** + * firebase_auth_internal_firebase_auth_settings_get_sms_code + * @object: a #FirebaseAuthInternalFirebaseAuthSettings. + * + * Gets the value of the smsCode field of @object. + * + * Returns: the field value. + */ +const gchar* firebase_auth_internal_firebase_auth_settings_get_sms_code( + FirebaseAuthInternalFirebaseAuthSettings* object); + +/** + * firebase_auth_internal_firebase_auth_settings_get_force_recaptcha_flow + * @object: a #FirebaseAuthInternalFirebaseAuthSettings. + * + * Gets the value of the forceRecaptchaFlow field of @object. + * + * Returns: the field value. + */ +gboolean* +firebase_auth_internal_firebase_auth_settings_get_force_recaptcha_flow( + FirebaseAuthInternalFirebaseAuthSettings* object); + +/** + * firebase_auth_internal_firebase_auth_settings_equals: + * @a: a #FirebaseAuthInternalFirebaseAuthSettings. + * @b: another #FirebaseAuthInternalFirebaseAuthSettings. + * + * Checks if two #FirebaseAuthInternalFirebaseAuthSettings objects are equal. + * + * Returns: TRUE if @a and @b are equal. + */ +gboolean firebase_auth_internal_firebase_auth_settings_equals( + FirebaseAuthInternalFirebaseAuthSettings* a, + FirebaseAuthInternalFirebaseAuthSettings* b); + +/** + * firebase_auth_internal_firebase_auth_settings_hash: + * @object: a #FirebaseAuthInternalFirebaseAuthSettings. + * + * Calculates a hash code for a #FirebaseAuthInternalFirebaseAuthSettings + * object. + * + * Returns: the hash code. + */ +guint firebase_auth_internal_firebase_auth_settings_hash( + FirebaseAuthInternalFirebaseAuthSettings* object); + +/** + * FirebaseAuthInternalSignInProvider: + * + */ + +G_DECLARE_FINAL_TYPE(FirebaseAuthInternalSignInProvider, + firebase_auth_internal_sign_in_provider, FIREBASE_AUTH, + INTERNAL_SIGN_IN_PROVIDER, GObject) + +/** + * firebase_auth_internal_sign_in_provider_new: + * provider_id: field in this object. + * scopes: field in this object. + * custom_parameters: field in this object. + * + * Creates a new #InternalSignInProvider object. + * + * Returns: a new #FirebaseAuthInternalSignInProvider + */ +FirebaseAuthInternalSignInProvider* firebase_auth_internal_sign_in_provider_new( + const gchar* provider_id, FlValue* scopes, FlValue* custom_parameters); + +/** + * firebase_auth_internal_sign_in_provider_get_provider_id + * @object: a #FirebaseAuthInternalSignInProvider. + * + * Gets the value of the providerId field of @object. + * + * Returns: the field value. + */ +const gchar* firebase_auth_internal_sign_in_provider_get_provider_id( + FirebaseAuthInternalSignInProvider* object); + +/** + * firebase_auth_internal_sign_in_provider_get_scopes + * @object: a #FirebaseAuthInternalSignInProvider. + * + * Gets the value of the scopes field of @object. + * + * Returns: the field value. + */ +FlValue* firebase_auth_internal_sign_in_provider_get_scopes( + FirebaseAuthInternalSignInProvider* object); + +/** + * firebase_auth_internal_sign_in_provider_get_custom_parameters + * @object: a #FirebaseAuthInternalSignInProvider. + * + * Gets the value of the customParameters field of @object. + * + * Returns: the field value. + */ +FlValue* firebase_auth_internal_sign_in_provider_get_custom_parameters( + FirebaseAuthInternalSignInProvider* object); + +/** + * firebase_auth_internal_sign_in_provider_equals: + * @a: a #FirebaseAuthInternalSignInProvider. + * @b: another #FirebaseAuthInternalSignInProvider. + * + * Checks if two #FirebaseAuthInternalSignInProvider objects are equal. + * + * Returns: TRUE if @a and @b are equal. + */ +gboolean firebase_auth_internal_sign_in_provider_equals( + FirebaseAuthInternalSignInProvider* a, + FirebaseAuthInternalSignInProvider* b); + +/** + * firebase_auth_internal_sign_in_provider_hash: + * @object: a #FirebaseAuthInternalSignInProvider. + * + * Calculates a hash code for a #FirebaseAuthInternalSignInProvider object. + * + * Returns: the hash code. + */ +guint firebase_auth_internal_sign_in_provider_hash( + FirebaseAuthInternalSignInProvider* object); + +/** + * FirebaseAuthInternalVerifyPhoneNumberRequest: + * + */ + +G_DECLARE_FINAL_TYPE(FirebaseAuthInternalVerifyPhoneNumberRequest, + firebase_auth_internal_verify_phone_number_request, + FIREBASE_AUTH, INTERNAL_VERIFY_PHONE_NUMBER_REQUEST, + GObject) + +/** + * firebase_auth_internal_verify_phone_number_request_new: + * phone_number: field in this object. + * timeout: field in this object. + * force_resending_token: field in this object. + * auto_retrieved_sms_code_for_testing: field in this object. + * multi_factor_info_id: field in this object. + * multi_factor_session_id: field in this object. + * + * Creates a new #InternalVerifyPhoneNumberRequest object. + * + * Returns: a new #FirebaseAuthInternalVerifyPhoneNumberRequest + */ +FirebaseAuthInternalVerifyPhoneNumberRequest* +firebase_auth_internal_verify_phone_number_request_new( + const gchar* phone_number, int64_t timeout, int64_t* force_resending_token, + const gchar* auto_retrieved_sms_code_for_testing, + const gchar* multi_factor_info_id, const gchar* multi_factor_session_id); + +/** + * firebase_auth_internal_verify_phone_number_request_get_phone_number + * @object: a #FirebaseAuthInternalVerifyPhoneNumberRequest. + * + * Gets the value of the phoneNumber field of @object. + * + * Returns: the field value. + */ +const gchar* +firebase_auth_internal_verify_phone_number_request_get_phone_number( + FirebaseAuthInternalVerifyPhoneNumberRequest* object); + +/** + * firebase_auth_internal_verify_phone_number_request_get_timeout + * @object: a #FirebaseAuthInternalVerifyPhoneNumberRequest. + * + * Gets the value of the timeout field of @object. + * + * Returns: the field value. + */ +int64_t firebase_auth_internal_verify_phone_number_request_get_timeout( + FirebaseAuthInternalVerifyPhoneNumberRequest* object); + +/** + * firebase_auth_internal_verify_phone_number_request_get_force_resending_token + * @object: a #FirebaseAuthInternalVerifyPhoneNumberRequest. + * + * Gets the value of the forceResendingToken field of @object. + * + * Returns: the field value. + */ +int64_t* +firebase_auth_internal_verify_phone_number_request_get_force_resending_token( + FirebaseAuthInternalVerifyPhoneNumberRequest* object); + +/** + * firebase_auth_internal_verify_phone_number_request_get_auto_retrieved_sms_code_for_testing + * @object: a #FirebaseAuthInternalVerifyPhoneNumberRequest. + * + * Gets the value of the autoRetrievedSmsCodeForTesting field of @object. + * + * Returns: the field value. + */ +const gchar* +firebase_auth_internal_verify_phone_number_request_get_auto_retrieved_sms_code_for_testing( + FirebaseAuthInternalVerifyPhoneNumberRequest* object); + +/** + * firebase_auth_internal_verify_phone_number_request_get_multi_factor_info_id + * @object: a #FirebaseAuthInternalVerifyPhoneNumberRequest. + * + * Gets the value of the multiFactorInfoId field of @object. + * + * Returns: the field value. + */ +const gchar* +firebase_auth_internal_verify_phone_number_request_get_multi_factor_info_id( + FirebaseAuthInternalVerifyPhoneNumberRequest* object); + +/** + * firebase_auth_internal_verify_phone_number_request_get_multi_factor_session_id + * @object: a #FirebaseAuthInternalVerifyPhoneNumberRequest. + * + * Gets the value of the multiFactorSessionId field of @object. + * + * Returns: the field value. + */ +const gchar* +firebase_auth_internal_verify_phone_number_request_get_multi_factor_session_id( + FirebaseAuthInternalVerifyPhoneNumberRequest* object); + +/** + * firebase_auth_internal_verify_phone_number_request_equals: + * @a: a #FirebaseAuthInternalVerifyPhoneNumberRequest. + * @b: another #FirebaseAuthInternalVerifyPhoneNumberRequest. + * + * Checks if two #FirebaseAuthInternalVerifyPhoneNumberRequest objects are + * equal. + * + * Returns: TRUE if @a and @b are equal. + */ +gboolean firebase_auth_internal_verify_phone_number_request_equals( + FirebaseAuthInternalVerifyPhoneNumberRequest* a, + FirebaseAuthInternalVerifyPhoneNumberRequest* b); + +/** + * firebase_auth_internal_verify_phone_number_request_hash: + * @object: a #FirebaseAuthInternalVerifyPhoneNumberRequest. + * + * Calculates a hash code for a #FirebaseAuthInternalVerifyPhoneNumberRequest + * object. + * + * Returns: the hash code. + */ +guint firebase_auth_internal_verify_phone_number_request_hash( + FirebaseAuthInternalVerifyPhoneNumberRequest* object); + +/** + * FirebaseAuthInternalIdTokenResult: + * + */ + +G_DECLARE_FINAL_TYPE(FirebaseAuthInternalIdTokenResult, + firebase_auth_internal_id_token_result, FIREBASE_AUTH, + INTERNAL_ID_TOKEN_RESULT, GObject) + +/** + * firebase_auth_internal_id_token_result_new: + * token: field in this object. + * expiration_timestamp: field in this object. + * auth_timestamp: field in this object. + * issued_at_timestamp: field in this object. + * sign_in_provider: field in this object. + * claims: field in this object. + * sign_in_second_factor: field in this object. + * + * Creates a new #InternalIdTokenResult object. + * + * Returns: a new #FirebaseAuthInternalIdTokenResult + */ +FirebaseAuthInternalIdTokenResult* firebase_auth_internal_id_token_result_new( + const gchar* token, int64_t* expiration_timestamp, int64_t* auth_timestamp, + int64_t* issued_at_timestamp, const gchar* sign_in_provider, + FlValue* claims, const gchar* sign_in_second_factor); + +/** + * firebase_auth_internal_id_token_result_get_token + * @object: a #FirebaseAuthInternalIdTokenResult. + * + * Gets the value of the token field of @object. + * + * Returns: the field value. + */ +const gchar* firebase_auth_internal_id_token_result_get_token( + FirebaseAuthInternalIdTokenResult* object); + +/** + * firebase_auth_internal_id_token_result_get_expiration_timestamp + * @object: a #FirebaseAuthInternalIdTokenResult. + * + * Gets the value of the expirationTimestamp field of @object. + * + * Returns: the field value. + */ +int64_t* firebase_auth_internal_id_token_result_get_expiration_timestamp( + FirebaseAuthInternalIdTokenResult* object); + +/** + * firebase_auth_internal_id_token_result_get_auth_timestamp + * @object: a #FirebaseAuthInternalIdTokenResult. + * + * Gets the value of the authTimestamp field of @object. + * + * Returns: the field value. + */ +int64_t* firebase_auth_internal_id_token_result_get_auth_timestamp( + FirebaseAuthInternalIdTokenResult* object); + +/** + * firebase_auth_internal_id_token_result_get_issued_at_timestamp + * @object: a #FirebaseAuthInternalIdTokenResult. + * + * Gets the value of the issuedAtTimestamp field of @object. + * + * Returns: the field value. + */ +int64_t* firebase_auth_internal_id_token_result_get_issued_at_timestamp( + FirebaseAuthInternalIdTokenResult* object); + +/** + * firebase_auth_internal_id_token_result_get_sign_in_provider + * @object: a #FirebaseAuthInternalIdTokenResult. + * + * Gets the value of the signInProvider field of @object. + * + * Returns: the field value. + */ +const gchar* firebase_auth_internal_id_token_result_get_sign_in_provider( + FirebaseAuthInternalIdTokenResult* object); + +/** + * firebase_auth_internal_id_token_result_get_claims + * @object: a #FirebaseAuthInternalIdTokenResult. + * + * Gets the value of the claims field of @object. + * + * Returns: the field value. + */ +FlValue* firebase_auth_internal_id_token_result_get_claims( + FirebaseAuthInternalIdTokenResult* object); + +/** + * firebase_auth_internal_id_token_result_get_sign_in_second_factor + * @object: a #FirebaseAuthInternalIdTokenResult. + * + * Gets the value of the signInSecondFactor field of @object. + * + * Returns: the field value. + */ +const gchar* firebase_auth_internal_id_token_result_get_sign_in_second_factor( + FirebaseAuthInternalIdTokenResult* object); + +/** + * firebase_auth_internal_id_token_result_equals: + * @a: a #FirebaseAuthInternalIdTokenResult. + * @b: another #FirebaseAuthInternalIdTokenResult. + * + * Checks if two #FirebaseAuthInternalIdTokenResult objects are equal. + * + * Returns: TRUE if @a and @b are equal. + */ +gboolean firebase_auth_internal_id_token_result_equals( + FirebaseAuthInternalIdTokenResult* a, FirebaseAuthInternalIdTokenResult* b); + +/** + * firebase_auth_internal_id_token_result_hash: + * @object: a #FirebaseAuthInternalIdTokenResult. + * + * Calculates a hash code for a #FirebaseAuthInternalIdTokenResult object. + * + * Returns: the hash code. + */ +guint firebase_auth_internal_id_token_result_hash( + FirebaseAuthInternalIdTokenResult* object); + +/** + * FirebaseAuthInternalUserProfile: + * + */ + +G_DECLARE_FINAL_TYPE(FirebaseAuthInternalUserProfile, + firebase_auth_internal_user_profile, FIREBASE_AUTH, + INTERNAL_USER_PROFILE, GObject) + +/** + * firebase_auth_internal_user_profile_new: + * display_name: field in this object. + * photo_url: field in this object. + * display_name_changed: field in this object. + * photo_url_changed: field in this object. + * + * Creates a new #InternalUserProfile object. + * + * Returns: a new #FirebaseAuthInternalUserProfile + */ +FirebaseAuthInternalUserProfile* firebase_auth_internal_user_profile_new( + const gchar* display_name, const gchar* photo_url, + gboolean display_name_changed, gboolean photo_url_changed); + +/** + * firebase_auth_internal_user_profile_get_display_name + * @object: a #FirebaseAuthInternalUserProfile. + * + * Gets the value of the displayName field of @object. + * + * Returns: the field value. + */ +const gchar* firebase_auth_internal_user_profile_get_display_name( + FirebaseAuthInternalUserProfile* object); + +/** + * firebase_auth_internal_user_profile_get_photo_url + * @object: a #FirebaseAuthInternalUserProfile. + * + * Gets the value of the photoUrl field of @object. + * + * Returns: the field value. + */ +const gchar* firebase_auth_internal_user_profile_get_photo_url( + FirebaseAuthInternalUserProfile* object); + +/** + * firebase_auth_internal_user_profile_get_display_name_changed + * @object: a #FirebaseAuthInternalUserProfile. + * + * Gets the value of the displayNameChanged field of @object. + * + * Returns: the field value. + */ +gboolean firebase_auth_internal_user_profile_get_display_name_changed( + FirebaseAuthInternalUserProfile* object); + +/** + * firebase_auth_internal_user_profile_get_photo_url_changed + * @object: a #FirebaseAuthInternalUserProfile. + * + * Gets the value of the photoUrlChanged field of @object. + * + * Returns: the field value. + */ +gboolean firebase_auth_internal_user_profile_get_photo_url_changed( + FirebaseAuthInternalUserProfile* object); + +/** + * firebase_auth_internal_user_profile_equals: + * @a: a #FirebaseAuthInternalUserProfile. + * @b: another #FirebaseAuthInternalUserProfile. + * + * Checks if two #FirebaseAuthInternalUserProfile objects are equal. + * + * Returns: TRUE if @a and @b are equal. + */ +gboolean firebase_auth_internal_user_profile_equals( + FirebaseAuthInternalUserProfile* a, FirebaseAuthInternalUserProfile* b); + +/** + * firebase_auth_internal_user_profile_hash: + * @object: a #FirebaseAuthInternalUserProfile. + * + * Calculates a hash code for a #FirebaseAuthInternalUserProfile object. + * + * Returns: the hash code. + */ +guint firebase_auth_internal_user_profile_hash( + FirebaseAuthInternalUserProfile* object); + +/** + * FirebaseAuthInternalTotpSecret: + * + */ + +G_DECLARE_FINAL_TYPE(FirebaseAuthInternalTotpSecret, + firebase_auth_internal_totp_secret, FIREBASE_AUTH, + INTERNAL_TOTP_SECRET, GObject) + +/** + * firebase_auth_internal_totp_secret_new: + * code_interval_seconds: field in this object. + * code_length: field in this object. + * enrollment_completion_deadline: field in this object. + * hashing_algorithm: field in this object. + * secret_key: field in this object. + * + * Creates a new #InternalTotpSecret object. + * + * Returns: a new #FirebaseAuthInternalTotpSecret + */ +FirebaseAuthInternalTotpSecret* firebase_auth_internal_totp_secret_new( + int64_t* code_interval_seconds, int64_t* code_length, + int64_t* enrollment_completion_deadline, const gchar* hashing_algorithm, + const gchar* secret_key); + +/** + * firebase_auth_internal_totp_secret_get_code_interval_seconds + * @object: a #FirebaseAuthInternalTotpSecret. + * + * Gets the value of the codeIntervalSeconds field of @object. + * + * Returns: the field value. + */ +int64_t* firebase_auth_internal_totp_secret_get_code_interval_seconds( + FirebaseAuthInternalTotpSecret* object); + +/** + * firebase_auth_internal_totp_secret_get_code_length + * @object: a #FirebaseAuthInternalTotpSecret. + * + * Gets the value of the codeLength field of @object. + * + * Returns: the field value. + */ +int64_t* firebase_auth_internal_totp_secret_get_code_length( + FirebaseAuthInternalTotpSecret* object); + +/** + * firebase_auth_internal_totp_secret_get_enrollment_completion_deadline + * @object: a #FirebaseAuthInternalTotpSecret. + * + * Gets the value of the enrollmentCompletionDeadline field of @object. + * + * Returns: the field value. + */ +int64_t* firebase_auth_internal_totp_secret_get_enrollment_completion_deadline( + FirebaseAuthInternalTotpSecret* object); + +/** + * firebase_auth_internal_totp_secret_get_hashing_algorithm + * @object: a #FirebaseAuthInternalTotpSecret. + * + * Gets the value of the hashingAlgorithm field of @object. + * + * Returns: the field value. + */ +const gchar* firebase_auth_internal_totp_secret_get_hashing_algorithm( + FirebaseAuthInternalTotpSecret* object); + +/** + * firebase_auth_internal_totp_secret_get_secret_key + * @object: a #FirebaseAuthInternalTotpSecret. + * + * Gets the value of the secretKey field of @object. + * + * Returns: the field value. + */ +const gchar* firebase_auth_internal_totp_secret_get_secret_key( + FirebaseAuthInternalTotpSecret* object); + +/** + * firebase_auth_internal_totp_secret_equals: + * @a: a #FirebaseAuthInternalTotpSecret. + * @b: another #FirebaseAuthInternalTotpSecret. + * + * Checks if two #FirebaseAuthInternalTotpSecret objects are equal. + * + * Returns: TRUE if @a and @b are equal. + */ +gboolean firebase_auth_internal_totp_secret_equals( + FirebaseAuthInternalTotpSecret* a, FirebaseAuthInternalTotpSecret* b); + +/** + * firebase_auth_internal_totp_secret_hash: + * @object: a #FirebaseAuthInternalTotpSecret. + * + * Calculates a hash code for a #FirebaseAuthInternalTotpSecret object. + * + * Returns: the hash code. + */ +guint firebase_auth_internal_totp_secret_hash( + FirebaseAuthInternalTotpSecret* object); + +G_DECLARE_FINAL_TYPE(FirebaseAuthMessageCodec, firebase_auth_message_codec, + FIREBASE_AUTH, MESSAGE_CODEC, FlStandardMessageCodec) + +/** + * Custom type ID constants: + * + * Constants used to identify custom types in the codec. + * They are used in the codec to encode and decode custom types. + * They may be used in custom object creation functions to identify the type. + */ +extern const int firebase_auth_action_code_info_operation_type_id; +extern const int firebase_auth_internal_multi_factor_session_type_id; +extern const int firebase_auth_internal_phone_multi_factor_assertion_type_id; +extern const int firebase_auth_internal_multi_factor_info_type_id; +extern const int firebase_auth_auth_pigeon_firebase_app_type_id; +extern const int firebase_auth_internal_action_code_info_data_type_id; +extern const int firebase_auth_internal_action_code_info_type_id; +extern const int firebase_auth_internal_additional_user_info_type_id; +extern const int firebase_auth_internal_auth_credential_type_id; +extern const int firebase_auth_internal_user_info_type_id; +extern const int firebase_auth_internal_user_details_type_id; +extern const int firebase_auth_internal_user_credential_type_id; +extern const int firebase_auth_internal_auth_credential_input_type_id; +extern const int firebase_auth_internal_action_code_settings_type_id; +extern const int firebase_auth_internal_firebase_auth_settings_type_id; +extern const int firebase_auth_internal_sign_in_provider_type_id; +extern const int firebase_auth_internal_verify_phone_number_request_type_id; +extern const int firebase_auth_internal_id_token_result_type_id; +extern const int firebase_auth_internal_user_profile_type_id; +extern const int firebase_auth_internal_totp_secret_type_id; + +G_DECLARE_FINAL_TYPE(FirebaseAuthFirebaseAuthHostApi, + firebase_auth_firebase_auth_host_api, FIREBASE_AUTH, + FIREBASE_AUTH_HOST_API, GObject) + +G_DECLARE_FINAL_TYPE(FirebaseAuthFirebaseAuthHostApiResponseHandle, + firebase_auth_firebase_auth_host_api_response_handle, + FIREBASE_AUTH, FIREBASE_AUTH_HOST_API_RESPONSE_HANDLE, + GObject) + +/** + * FirebaseAuthFirebaseAuthHostApiVTable: + * + * Table of functions exposed by FirebaseAuthHostApi to be implemented by the + * API provider. + */ +typedef struct { + void (*register_id_token_listener)( + FirebaseAuthAuthPigeonFirebaseApp* app, + FirebaseAuthFirebaseAuthHostApiResponseHandle* response_handle, + gpointer user_data); + void (*register_auth_state_listener)( + FirebaseAuthAuthPigeonFirebaseApp* app, + FirebaseAuthFirebaseAuthHostApiResponseHandle* response_handle, + gpointer user_data); + void (*use_emulator)( + FirebaseAuthAuthPigeonFirebaseApp* app, const gchar* host, int64_t port, + FirebaseAuthFirebaseAuthHostApiResponseHandle* response_handle, + gpointer user_data); + void (*apply_action_code)( + FirebaseAuthAuthPigeonFirebaseApp* app, const gchar* code, + FirebaseAuthFirebaseAuthHostApiResponseHandle* response_handle, + gpointer user_data); + void (*check_action_code)( + FirebaseAuthAuthPigeonFirebaseApp* app, const gchar* code, + FirebaseAuthFirebaseAuthHostApiResponseHandle* response_handle, + gpointer user_data); + void (*confirm_password_reset)( + FirebaseAuthAuthPigeonFirebaseApp* app, const gchar* code, + const gchar* new_password, + FirebaseAuthFirebaseAuthHostApiResponseHandle* response_handle, + gpointer user_data); + void (*create_user_with_email_and_password)( + FirebaseAuthAuthPigeonFirebaseApp* app, const gchar* email, + const gchar* password, + FirebaseAuthFirebaseAuthHostApiResponseHandle* response_handle, + gpointer user_data); + void (*sign_in_anonymously)( + FirebaseAuthAuthPigeonFirebaseApp* app, + FirebaseAuthFirebaseAuthHostApiResponseHandle* response_handle, + gpointer user_data); + void (*sign_in_with_credential)( + FirebaseAuthAuthPigeonFirebaseApp* app, FlValue* input, + FirebaseAuthFirebaseAuthHostApiResponseHandle* response_handle, + gpointer user_data); + void (*sign_in_with_custom_token)( + FirebaseAuthAuthPigeonFirebaseApp* app, const gchar* token, + FirebaseAuthFirebaseAuthHostApiResponseHandle* response_handle, + gpointer user_data); + void (*sign_in_with_email_and_password)( + FirebaseAuthAuthPigeonFirebaseApp* app, const gchar* email, + const gchar* password, + FirebaseAuthFirebaseAuthHostApiResponseHandle* response_handle, + gpointer user_data); + void (*sign_in_with_email_link)( + FirebaseAuthAuthPigeonFirebaseApp* app, const gchar* email, + const gchar* email_link, + FirebaseAuthFirebaseAuthHostApiResponseHandle* response_handle, + gpointer user_data); + void (*sign_in_with_provider)( + FirebaseAuthAuthPigeonFirebaseApp* app, + FirebaseAuthInternalSignInProvider* sign_in_provider, + FirebaseAuthFirebaseAuthHostApiResponseHandle* response_handle, + gpointer user_data); + void (*sign_out)( + FirebaseAuthAuthPigeonFirebaseApp* app, + FirebaseAuthFirebaseAuthHostApiResponseHandle* response_handle, + gpointer user_data); + void (*fetch_sign_in_methods_for_email)( + FirebaseAuthAuthPigeonFirebaseApp* app, const gchar* email, + FirebaseAuthFirebaseAuthHostApiResponseHandle* response_handle, + gpointer user_data); + void (*send_password_reset_email)( + FirebaseAuthAuthPigeonFirebaseApp* app, const gchar* email, + FirebaseAuthInternalActionCodeSettings* action_code_settings, + FirebaseAuthFirebaseAuthHostApiResponseHandle* response_handle, + gpointer user_data); + void (*send_sign_in_link_to_email)( + FirebaseAuthAuthPigeonFirebaseApp* app, const gchar* email, + FirebaseAuthInternalActionCodeSettings* action_code_settings, + FirebaseAuthFirebaseAuthHostApiResponseHandle* response_handle, + gpointer user_data); + void (*set_language_code)( + FirebaseAuthAuthPigeonFirebaseApp* app, const gchar* language_code, + FirebaseAuthFirebaseAuthHostApiResponseHandle* response_handle, + gpointer user_data); + void (*set_settings)( + FirebaseAuthAuthPigeonFirebaseApp* app, + FirebaseAuthInternalFirebaseAuthSettings* settings, + FirebaseAuthFirebaseAuthHostApiResponseHandle* response_handle, + gpointer user_data); + void (*verify_password_reset_code)( + FirebaseAuthAuthPigeonFirebaseApp* app, const gchar* code, + FirebaseAuthFirebaseAuthHostApiResponseHandle* response_handle, + gpointer user_data); + void (*verify_phone_number)( + FirebaseAuthAuthPigeonFirebaseApp* app, + FirebaseAuthInternalVerifyPhoneNumberRequest* request, + FirebaseAuthFirebaseAuthHostApiResponseHandle* response_handle, + gpointer user_data); + void (*revoke_token_with_authorization_code)( + FirebaseAuthAuthPigeonFirebaseApp* app, const gchar* authorization_code, + FirebaseAuthFirebaseAuthHostApiResponseHandle* response_handle, + gpointer user_data); + void (*revoke_access_token)( + FirebaseAuthAuthPigeonFirebaseApp* app, const gchar* access_token, + FirebaseAuthFirebaseAuthHostApiResponseHandle* response_handle, + gpointer user_data); + void (*initialize_recaptcha_config)( + FirebaseAuthAuthPigeonFirebaseApp* app, + FirebaseAuthFirebaseAuthHostApiResponseHandle* response_handle, + gpointer user_data); +} FirebaseAuthFirebaseAuthHostApiVTable; + +/** + * firebase_auth_firebase_auth_host_api_set_method_handlers: + * + * @messenger: an #FlBinaryMessenger. + * @suffix: (allow-none): a suffix to add to the API or %NULL for none. + * @vtable: implementations of the methods in this API. + * @user_data: (closure): user data to pass to the functions in @vtable. + * @user_data_free_func: (allow-none): a function which gets called to free + * @user_data, or %NULL. + * + * Connects the method handlers in the FirebaseAuthHostApi API. + */ +void firebase_auth_firebase_auth_host_api_set_method_handlers( + FlBinaryMessenger* messenger, const gchar* suffix, + const FirebaseAuthFirebaseAuthHostApiVTable* vtable, gpointer user_data, + GDestroyNotify user_data_free_func); + +/** + * firebase_auth_firebase_auth_host_api_clear_method_handlers: + * + * @messenger: an #FlBinaryMessenger. + * @suffix: (allow-none): a suffix to add to the API or %NULL for none. + * + * Clears the method handlers in the FirebaseAuthHostApi API. + */ +void firebase_auth_firebase_auth_host_api_clear_method_handlers( + FlBinaryMessenger* messenger, const gchar* suffix); + +/** + * firebase_auth_firebase_auth_host_api_respond_register_id_token_listener: + * @response_handle: a #FirebaseAuthFirebaseAuthHostApiResponseHandle. + * @return_value: location to write the value returned by this method. + * + * Responds to FirebaseAuthHostApi.registerIdTokenListener. + */ +void firebase_auth_firebase_auth_host_api_respond_register_id_token_listener( + FirebaseAuthFirebaseAuthHostApiResponseHandle* response_handle, + const gchar* return_value); + +/** + * firebase_auth_firebase_auth_host_api_respond_error_register_id_token_listener: + * @response_handle: a #FirebaseAuthFirebaseAuthHostApiResponseHandle. + * @code: error code. + * @message: error message. + * @details: (allow-none): error details or %NULL. + * + * Responds with an error to FirebaseAuthHostApi.registerIdTokenListener. + */ +void firebase_auth_firebase_auth_host_api_respond_error_register_id_token_listener( + FirebaseAuthFirebaseAuthHostApiResponseHandle* response_handle, + const gchar* code, const gchar* message, FlValue* details); + +/** + * firebase_auth_firebase_auth_host_api_respond_register_auth_state_listener: + * @response_handle: a #FirebaseAuthFirebaseAuthHostApiResponseHandle. + * @return_value: location to write the value returned by this method. + * + * Responds to FirebaseAuthHostApi.registerAuthStateListener. + */ +void firebase_auth_firebase_auth_host_api_respond_register_auth_state_listener( + FirebaseAuthFirebaseAuthHostApiResponseHandle* response_handle, + const gchar* return_value); + +/** + * firebase_auth_firebase_auth_host_api_respond_error_register_auth_state_listener: + * @response_handle: a #FirebaseAuthFirebaseAuthHostApiResponseHandle. + * @code: error code. + * @message: error message. + * @details: (allow-none): error details or %NULL. + * + * Responds with an error to FirebaseAuthHostApi.registerAuthStateListener. + */ +void firebase_auth_firebase_auth_host_api_respond_error_register_auth_state_listener( + FirebaseAuthFirebaseAuthHostApiResponseHandle* response_handle, + const gchar* code, const gchar* message, FlValue* details); + +/** + * firebase_auth_firebase_auth_host_api_respond_use_emulator: + * @response_handle: a #FirebaseAuthFirebaseAuthHostApiResponseHandle. + * + * Responds to FirebaseAuthHostApi.useEmulator. + */ +void firebase_auth_firebase_auth_host_api_respond_use_emulator( + FirebaseAuthFirebaseAuthHostApiResponseHandle* response_handle); + +/** + * firebase_auth_firebase_auth_host_api_respond_error_use_emulator: + * @response_handle: a #FirebaseAuthFirebaseAuthHostApiResponseHandle. + * @code: error code. + * @message: error message. + * @details: (allow-none): error details or %NULL. + * + * Responds with an error to FirebaseAuthHostApi.useEmulator. + */ +void firebase_auth_firebase_auth_host_api_respond_error_use_emulator( + FirebaseAuthFirebaseAuthHostApiResponseHandle* response_handle, + const gchar* code, const gchar* message, FlValue* details); + +/** + * firebase_auth_firebase_auth_host_api_respond_apply_action_code: + * @response_handle: a #FirebaseAuthFirebaseAuthHostApiResponseHandle. + * + * Responds to FirebaseAuthHostApi.applyActionCode. + */ +void firebase_auth_firebase_auth_host_api_respond_apply_action_code( + FirebaseAuthFirebaseAuthHostApiResponseHandle* response_handle); + +/** + * firebase_auth_firebase_auth_host_api_respond_error_apply_action_code: + * @response_handle: a #FirebaseAuthFirebaseAuthHostApiResponseHandle. + * @code: error code. + * @message: error message. + * @details: (allow-none): error details or %NULL. + * + * Responds with an error to FirebaseAuthHostApi.applyActionCode. + */ +void firebase_auth_firebase_auth_host_api_respond_error_apply_action_code( + FirebaseAuthFirebaseAuthHostApiResponseHandle* response_handle, + const gchar* code, const gchar* message, FlValue* details); + +/** + * firebase_auth_firebase_auth_host_api_respond_check_action_code: + * @response_handle: a #FirebaseAuthFirebaseAuthHostApiResponseHandle. + * @return_value: location to write the value returned by this method. + * + * Responds to FirebaseAuthHostApi.checkActionCode. + */ +void firebase_auth_firebase_auth_host_api_respond_check_action_code( + FirebaseAuthFirebaseAuthHostApiResponseHandle* response_handle, + FirebaseAuthInternalActionCodeInfo* return_value); + +/** + * firebase_auth_firebase_auth_host_api_respond_error_check_action_code: + * @response_handle: a #FirebaseAuthFirebaseAuthHostApiResponseHandle. + * @code: error code. + * @message: error message. + * @details: (allow-none): error details or %NULL. + * + * Responds with an error to FirebaseAuthHostApi.checkActionCode. + */ +void firebase_auth_firebase_auth_host_api_respond_error_check_action_code( + FirebaseAuthFirebaseAuthHostApiResponseHandle* response_handle, + const gchar* code, const gchar* message, FlValue* details); + +/** + * firebase_auth_firebase_auth_host_api_respond_confirm_password_reset: + * @response_handle: a #FirebaseAuthFirebaseAuthHostApiResponseHandle. + * + * Responds to FirebaseAuthHostApi.confirmPasswordReset. + */ +void firebase_auth_firebase_auth_host_api_respond_confirm_password_reset( + FirebaseAuthFirebaseAuthHostApiResponseHandle* response_handle); + +/** + * firebase_auth_firebase_auth_host_api_respond_error_confirm_password_reset: + * @response_handle: a #FirebaseAuthFirebaseAuthHostApiResponseHandle. + * @code: error code. + * @message: error message. + * @details: (allow-none): error details or %NULL. + * + * Responds with an error to FirebaseAuthHostApi.confirmPasswordReset. + */ +void firebase_auth_firebase_auth_host_api_respond_error_confirm_password_reset( + FirebaseAuthFirebaseAuthHostApiResponseHandle* response_handle, + const gchar* code, const gchar* message, FlValue* details); + +/** + * firebase_auth_firebase_auth_host_api_respond_create_user_with_email_and_password: + * @response_handle: a #FirebaseAuthFirebaseAuthHostApiResponseHandle. + * @return_value: location to write the value returned by this method. + * + * Responds to FirebaseAuthHostApi.createUserWithEmailAndPassword. + */ +void firebase_auth_firebase_auth_host_api_respond_create_user_with_email_and_password( + FirebaseAuthFirebaseAuthHostApiResponseHandle* response_handle, + FirebaseAuthInternalUserCredential* return_value); + +/** + * firebase_auth_firebase_auth_host_api_respond_error_create_user_with_email_and_password: + * @response_handle: a #FirebaseAuthFirebaseAuthHostApiResponseHandle. + * @code: error code. + * @message: error message. + * @details: (allow-none): error details or %NULL. + * + * Responds with an error to FirebaseAuthHostApi.createUserWithEmailAndPassword. + */ +void firebase_auth_firebase_auth_host_api_respond_error_create_user_with_email_and_password( + FirebaseAuthFirebaseAuthHostApiResponseHandle* response_handle, + const gchar* code, const gchar* message, FlValue* details); + +/** + * firebase_auth_firebase_auth_host_api_respond_sign_in_anonymously: + * @response_handle: a #FirebaseAuthFirebaseAuthHostApiResponseHandle. + * @return_value: location to write the value returned by this method. + * + * Responds to FirebaseAuthHostApi.signInAnonymously. + */ +void firebase_auth_firebase_auth_host_api_respond_sign_in_anonymously( + FirebaseAuthFirebaseAuthHostApiResponseHandle* response_handle, + FirebaseAuthInternalUserCredential* return_value); + +/** + * firebase_auth_firebase_auth_host_api_respond_error_sign_in_anonymously: + * @response_handle: a #FirebaseAuthFirebaseAuthHostApiResponseHandle. + * @code: error code. + * @message: error message. + * @details: (allow-none): error details or %NULL. + * + * Responds with an error to FirebaseAuthHostApi.signInAnonymously. + */ +void firebase_auth_firebase_auth_host_api_respond_error_sign_in_anonymously( + FirebaseAuthFirebaseAuthHostApiResponseHandle* response_handle, + const gchar* code, const gchar* message, FlValue* details); + +/** + * firebase_auth_firebase_auth_host_api_respond_sign_in_with_credential: + * @response_handle: a #FirebaseAuthFirebaseAuthHostApiResponseHandle. + * @return_value: location to write the value returned by this method. + * + * Responds to FirebaseAuthHostApi.signInWithCredential. + */ +void firebase_auth_firebase_auth_host_api_respond_sign_in_with_credential( + FirebaseAuthFirebaseAuthHostApiResponseHandle* response_handle, + FirebaseAuthInternalUserCredential* return_value); + +/** + * firebase_auth_firebase_auth_host_api_respond_error_sign_in_with_credential: + * @response_handle: a #FirebaseAuthFirebaseAuthHostApiResponseHandle. + * @code: error code. + * @message: error message. + * @details: (allow-none): error details or %NULL. + * + * Responds with an error to FirebaseAuthHostApi.signInWithCredential. + */ +void firebase_auth_firebase_auth_host_api_respond_error_sign_in_with_credential( + FirebaseAuthFirebaseAuthHostApiResponseHandle* response_handle, + const gchar* code, const gchar* message, FlValue* details); + +/** + * firebase_auth_firebase_auth_host_api_respond_sign_in_with_custom_token: + * @response_handle: a #FirebaseAuthFirebaseAuthHostApiResponseHandle. + * @return_value: location to write the value returned by this method. + * + * Responds to FirebaseAuthHostApi.signInWithCustomToken. + */ +void firebase_auth_firebase_auth_host_api_respond_sign_in_with_custom_token( + FirebaseAuthFirebaseAuthHostApiResponseHandle* response_handle, + FirebaseAuthInternalUserCredential* return_value); + +/** + * firebase_auth_firebase_auth_host_api_respond_error_sign_in_with_custom_token: + * @response_handle: a #FirebaseAuthFirebaseAuthHostApiResponseHandle. + * @code: error code. + * @message: error message. + * @details: (allow-none): error details or %NULL. + * + * Responds with an error to FirebaseAuthHostApi.signInWithCustomToken. + */ +void firebase_auth_firebase_auth_host_api_respond_error_sign_in_with_custom_token( + FirebaseAuthFirebaseAuthHostApiResponseHandle* response_handle, + const gchar* code, const gchar* message, FlValue* details); + +/** + * firebase_auth_firebase_auth_host_api_respond_sign_in_with_email_and_password: + * @response_handle: a #FirebaseAuthFirebaseAuthHostApiResponseHandle. + * @return_value: location to write the value returned by this method. + * + * Responds to FirebaseAuthHostApi.signInWithEmailAndPassword. + */ +void firebase_auth_firebase_auth_host_api_respond_sign_in_with_email_and_password( + FirebaseAuthFirebaseAuthHostApiResponseHandle* response_handle, + FirebaseAuthInternalUserCredential* return_value); + +/** + * firebase_auth_firebase_auth_host_api_respond_error_sign_in_with_email_and_password: + * @response_handle: a #FirebaseAuthFirebaseAuthHostApiResponseHandle. + * @code: error code. + * @message: error message. + * @details: (allow-none): error details or %NULL. + * + * Responds with an error to FirebaseAuthHostApi.signInWithEmailAndPassword. + */ +void firebase_auth_firebase_auth_host_api_respond_error_sign_in_with_email_and_password( + FirebaseAuthFirebaseAuthHostApiResponseHandle* response_handle, + const gchar* code, const gchar* message, FlValue* details); + +/** + * firebase_auth_firebase_auth_host_api_respond_sign_in_with_email_link: + * @response_handle: a #FirebaseAuthFirebaseAuthHostApiResponseHandle. + * @return_value: location to write the value returned by this method. + * + * Responds to FirebaseAuthHostApi.signInWithEmailLink. + */ +void firebase_auth_firebase_auth_host_api_respond_sign_in_with_email_link( + FirebaseAuthFirebaseAuthHostApiResponseHandle* response_handle, + FirebaseAuthInternalUserCredential* return_value); + +/** + * firebase_auth_firebase_auth_host_api_respond_error_sign_in_with_email_link: + * @response_handle: a #FirebaseAuthFirebaseAuthHostApiResponseHandle. + * @code: error code. + * @message: error message. + * @details: (allow-none): error details or %NULL. + * + * Responds with an error to FirebaseAuthHostApi.signInWithEmailLink. + */ +void firebase_auth_firebase_auth_host_api_respond_error_sign_in_with_email_link( + FirebaseAuthFirebaseAuthHostApiResponseHandle* response_handle, + const gchar* code, const gchar* message, FlValue* details); + +/** + * firebase_auth_firebase_auth_host_api_respond_sign_in_with_provider: + * @response_handle: a #FirebaseAuthFirebaseAuthHostApiResponseHandle. + * @return_value: location to write the value returned by this method. + * + * Responds to FirebaseAuthHostApi.signInWithProvider. + */ +void firebase_auth_firebase_auth_host_api_respond_sign_in_with_provider( + FirebaseAuthFirebaseAuthHostApiResponseHandle* response_handle, + FirebaseAuthInternalUserCredential* return_value); + +/** + * firebase_auth_firebase_auth_host_api_respond_error_sign_in_with_provider: + * @response_handle: a #FirebaseAuthFirebaseAuthHostApiResponseHandle. + * @code: error code. + * @message: error message. + * @details: (allow-none): error details or %NULL. + * + * Responds with an error to FirebaseAuthHostApi.signInWithProvider. + */ +void firebase_auth_firebase_auth_host_api_respond_error_sign_in_with_provider( + FirebaseAuthFirebaseAuthHostApiResponseHandle* response_handle, + const gchar* code, const gchar* message, FlValue* details); + +/** + * firebase_auth_firebase_auth_host_api_respond_sign_out: + * @response_handle: a #FirebaseAuthFirebaseAuthHostApiResponseHandle. + * + * Responds to FirebaseAuthHostApi.signOut. + */ +void firebase_auth_firebase_auth_host_api_respond_sign_out( + FirebaseAuthFirebaseAuthHostApiResponseHandle* response_handle); + +/** + * firebase_auth_firebase_auth_host_api_respond_error_sign_out: + * @response_handle: a #FirebaseAuthFirebaseAuthHostApiResponseHandle. + * @code: error code. + * @message: error message. + * @details: (allow-none): error details or %NULL. + * + * Responds with an error to FirebaseAuthHostApi.signOut. + */ +void firebase_auth_firebase_auth_host_api_respond_error_sign_out( + FirebaseAuthFirebaseAuthHostApiResponseHandle* response_handle, + const gchar* code, const gchar* message, FlValue* details); + +/** + * firebase_auth_firebase_auth_host_api_respond_fetch_sign_in_methods_for_email: + * @response_handle: a #FirebaseAuthFirebaseAuthHostApiResponseHandle. + * @return_value: location to write the value returned by this method. + * + * Responds to FirebaseAuthHostApi.fetchSignInMethodsForEmail. + */ +void firebase_auth_firebase_auth_host_api_respond_fetch_sign_in_methods_for_email( + FirebaseAuthFirebaseAuthHostApiResponseHandle* response_handle, + FlValue* return_value); + +/** + * firebase_auth_firebase_auth_host_api_respond_error_fetch_sign_in_methods_for_email: + * @response_handle: a #FirebaseAuthFirebaseAuthHostApiResponseHandle. + * @code: error code. + * @message: error message. + * @details: (allow-none): error details or %NULL. + * + * Responds with an error to FirebaseAuthHostApi.fetchSignInMethodsForEmail. + */ +void firebase_auth_firebase_auth_host_api_respond_error_fetch_sign_in_methods_for_email( + FirebaseAuthFirebaseAuthHostApiResponseHandle* response_handle, + const gchar* code, const gchar* message, FlValue* details); + +/** + * firebase_auth_firebase_auth_host_api_respond_send_password_reset_email: + * @response_handle: a #FirebaseAuthFirebaseAuthHostApiResponseHandle. + * + * Responds to FirebaseAuthHostApi.sendPasswordResetEmail. + */ +void firebase_auth_firebase_auth_host_api_respond_send_password_reset_email( + FirebaseAuthFirebaseAuthHostApiResponseHandle* response_handle); + +/** + * firebase_auth_firebase_auth_host_api_respond_error_send_password_reset_email: + * @response_handle: a #FirebaseAuthFirebaseAuthHostApiResponseHandle. + * @code: error code. + * @message: error message. + * @details: (allow-none): error details or %NULL. + * + * Responds with an error to FirebaseAuthHostApi.sendPasswordResetEmail. + */ +void firebase_auth_firebase_auth_host_api_respond_error_send_password_reset_email( + FirebaseAuthFirebaseAuthHostApiResponseHandle* response_handle, + const gchar* code, const gchar* message, FlValue* details); + +/** + * firebase_auth_firebase_auth_host_api_respond_send_sign_in_link_to_email: + * @response_handle: a #FirebaseAuthFirebaseAuthHostApiResponseHandle. + * + * Responds to FirebaseAuthHostApi.sendSignInLinkToEmail. + */ +void firebase_auth_firebase_auth_host_api_respond_send_sign_in_link_to_email( + FirebaseAuthFirebaseAuthHostApiResponseHandle* response_handle); + +/** + * firebase_auth_firebase_auth_host_api_respond_error_send_sign_in_link_to_email: + * @response_handle: a #FirebaseAuthFirebaseAuthHostApiResponseHandle. + * @code: error code. + * @message: error message. + * @details: (allow-none): error details or %NULL. + * + * Responds with an error to FirebaseAuthHostApi.sendSignInLinkToEmail. + */ +void firebase_auth_firebase_auth_host_api_respond_error_send_sign_in_link_to_email( + FirebaseAuthFirebaseAuthHostApiResponseHandle* response_handle, + const gchar* code, const gchar* message, FlValue* details); + +/** + * firebase_auth_firebase_auth_host_api_respond_set_language_code: + * @response_handle: a #FirebaseAuthFirebaseAuthHostApiResponseHandle. + * @return_value: location to write the value returned by this method. + * + * Responds to FirebaseAuthHostApi.setLanguageCode. + */ +void firebase_auth_firebase_auth_host_api_respond_set_language_code( + FirebaseAuthFirebaseAuthHostApiResponseHandle* response_handle, + const gchar* return_value); + +/** + * firebase_auth_firebase_auth_host_api_respond_error_set_language_code: + * @response_handle: a #FirebaseAuthFirebaseAuthHostApiResponseHandle. + * @code: error code. + * @message: error message. + * @details: (allow-none): error details or %NULL. + * + * Responds with an error to FirebaseAuthHostApi.setLanguageCode. + */ +void firebase_auth_firebase_auth_host_api_respond_error_set_language_code( + FirebaseAuthFirebaseAuthHostApiResponseHandle* response_handle, + const gchar* code, const gchar* message, FlValue* details); + +/** + * firebase_auth_firebase_auth_host_api_respond_set_settings: + * @response_handle: a #FirebaseAuthFirebaseAuthHostApiResponseHandle. + * + * Responds to FirebaseAuthHostApi.setSettings. + */ +void firebase_auth_firebase_auth_host_api_respond_set_settings( + FirebaseAuthFirebaseAuthHostApiResponseHandle* response_handle); + +/** + * firebase_auth_firebase_auth_host_api_respond_error_set_settings: + * @response_handle: a #FirebaseAuthFirebaseAuthHostApiResponseHandle. + * @code: error code. + * @message: error message. + * @details: (allow-none): error details or %NULL. + * + * Responds with an error to FirebaseAuthHostApi.setSettings. + */ +void firebase_auth_firebase_auth_host_api_respond_error_set_settings( + FirebaseAuthFirebaseAuthHostApiResponseHandle* response_handle, + const gchar* code, const gchar* message, FlValue* details); + +/** + * firebase_auth_firebase_auth_host_api_respond_verify_password_reset_code: + * @response_handle: a #FirebaseAuthFirebaseAuthHostApiResponseHandle. + * @return_value: location to write the value returned by this method. + * + * Responds to FirebaseAuthHostApi.verifyPasswordResetCode. + */ +void firebase_auth_firebase_auth_host_api_respond_verify_password_reset_code( + FirebaseAuthFirebaseAuthHostApiResponseHandle* response_handle, + const gchar* return_value); + +/** + * firebase_auth_firebase_auth_host_api_respond_error_verify_password_reset_code: + * @response_handle: a #FirebaseAuthFirebaseAuthHostApiResponseHandle. + * @code: error code. + * @message: error message. + * @details: (allow-none): error details or %NULL. + * + * Responds with an error to FirebaseAuthHostApi.verifyPasswordResetCode. + */ +void firebase_auth_firebase_auth_host_api_respond_error_verify_password_reset_code( + FirebaseAuthFirebaseAuthHostApiResponseHandle* response_handle, + const gchar* code, const gchar* message, FlValue* details); + +/** + * firebase_auth_firebase_auth_host_api_respond_verify_phone_number: + * @response_handle: a #FirebaseAuthFirebaseAuthHostApiResponseHandle. + * @return_value: location to write the value returned by this method. + * + * Responds to FirebaseAuthHostApi.verifyPhoneNumber. + */ +void firebase_auth_firebase_auth_host_api_respond_verify_phone_number( + FirebaseAuthFirebaseAuthHostApiResponseHandle* response_handle, + const gchar* return_value); + +/** + * firebase_auth_firebase_auth_host_api_respond_error_verify_phone_number: + * @response_handle: a #FirebaseAuthFirebaseAuthHostApiResponseHandle. + * @code: error code. + * @message: error message. + * @details: (allow-none): error details or %NULL. + * + * Responds with an error to FirebaseAuthHostApi.verifyPhoneNumber. + */ +void firebase_auth_firebase_auth_host_api_respond_error_verify_phone_number( + FirebaseAuthFirebaseAuthHostApiResponseHandle* response_handle, + const gchar* code, const gchar* message, FlValue* details); + +/** + * firebase_auth_firebase_auth_host_api_respond_revoke_token_with_authorization_code: + * @response_handle: a #FirebaseAuthFirebaseAuthHostApiResponseHandle. + * + * Responds to FirebaseAuthHostApi.revokeTokenWithAuthorizationCode. + */ +void firebase_auth_firebase_auth_host_api_respond_revoke_token_with_authorization_code( + FirebaseAuthFirebaseAuthHostApiResponseHandle* response_handle); + +/** + * firebase_auth_firebase_auth_host_api_respond_error_revoke_token_with_authorization_code: + * @response_handle: a #FirebaseAuthFirebaseAuthHostApiResponseHandle. + * @code: error code. + * @message: error message. + * @details: (allow-none): error details or %NULL. + * + * Responds with an error to + * FirebaseAuthHostApi.revokeTokenWithAuthorizationCode. + */ +void firebase_auth_firebase_auth_host_api_respond_error_revoke_token_with_authorization_code( + FirebaseAuthFirebaseAuthHostApiResponseHandle* response_handle, + const gchar* code, const gchar* message, FlValue* details); + +/** + * firebase_auth_firebase_auth_host_api_respond_revoke_access_token: + * @response_handle: a #FirebaseAuthFirebaseAuthHostApiResponseHandle. + * + * Responds to FirebaseAuthHostApi.revokeAccessToken. + */ +void firebase_auth_firebase_auth_host_api_respond_revoke_access_token( + FirebaseAuthFirebaseAuthHostApiResponseHandle* response_handle); + +/** + * firebase_auth_firebase_auth_host_api_respond_error_revoke_access_token: + * @response_handle: a #FirebaseAuthFirebaseAuthHostApiResponseHandle. + * @code: error code. + * @message: error message. + * @details: (allow-none): error details or %NULL. + * + * Responds with an error to FirebaseAuthHostApi.revokeAccessToken. + */ +void firebase_auth_firebase_auth_host_api_respond_error_revoke_access_token( + FirebaseAuthFirebaseAuthHostApiResponseHandle* response_handle, + const gchar* code, const gchar* message, FlValue* details); + +/** + * firebase_auth_firebase_auth_host_api_respond_initialize_recaptcha_config: + * @response_handle: a #FirebaseAuthFirebaseAuthHostApiResponseHandle. + * + * Responds to FirebaseAuthHostApi.initializeRecaptchaConfig. + */ +void firebase_auth_firebase_auth_host_api_respond_initialize_recaptcha_config( + FirebaseAuthFirebaseAuthHostApiResponseHandle* response_handle); + +/** + * firebase_auth_firebase_auth_host_api_respond_error_initialize_recaptcha_config: + * @response_handle: a #FirebaseAuthFirebaseAuthHostApiResponseHandle. + * @code: error code. + * @message: error message. + * @details: (allow-none): error details or %NULL. + * + * Responds with an error to FirebaseAuthHostApi.initializeRecaptchaConfig. + */ +void firebase_auth_firebase_auth_host_api_respond_error_initialize_recaptcha_config( + FirebaseAuthFirebaseAuthHostApiResponseHandle* response_handle, + const gchar* code, const gchar* message, FlValue* details); + +G_DECLARE_FINAL_TYPE(FirebaseAuthFirebaseAuthUserHostApi, + firebase_auth_firebase_auth_user_host_api, FIREBASE_AUTH, + FIREBASE_AUTH_USER_HOST_API, GObject) + +G_DECLARE_FINAL_TYPE(FirebaseAuthFirebaseAuthUserHostApiResponseHandle, + firebase_auth_firebase_auth_user_host_api_response_handle, + FIREBASE_AUTH, FIREBASE_AUTH_USER_HOST_API_RESPONSE_HANDLE, + GObject) + +/** + * FirebaseAuthFirebaseAuthUserHostApiVTable: + * + * Table of functions exposed by FirebaseAuthUserHostApi to be implemented by + * the API provider. + */ +typedef struct { + void (*delete_)( + FirebaseAuthAuthPigeonFirebaseApp* app, + FirebaseAuthFirebaseAuthUserHostApiResponseHandle* response_handle, + gpointer user_data); + void (*get_id_token)( + FirebaseAuthAuthPigeonFirebaseApp* app, gboolean force_refresh, + FirebaseAuthFirebaseAuthUserHostApiResponseHandle* response_handle, + gpointer user_data); + void (*link_with_credential)( + FirebaseAuthAuthPigeonFirebaseApp* app, FlValue* input, + FirebaseAuthFirebaseAuthUserHostApiResponseHandle* response_handle, + gpointer user_data); + void (*link_with_provider)( + FirebaseAuthAuthPigeonFirebaseApp* app, + FirebaseAuthInternalSignInProvider* sign_in_provider, + FirebaseAuthFirebaseAuthUserHostApiResponseHandle* response_handle, + gpointer user_data); + void (*reauthenticate_with_credential)( + FirebaseAuthAuthPigeonFirebaseApp* app, FlValue* input, + FirebaseAuthFirebaseAuthUserHostApiResponseHandle* response_handle, + gpointer user_data); + void (*reauthenticate_with_provider)( + FirebaseAuthAuthPigeonFirebaseApp* app, + FirebaseAuthInternalSignInProvider* sign_in_provider, + FirebaseAuthFirebaseAuthUserHostApiResponseHandle* response_handle, + gpointer user_data); + void (*reload)( + FirebaseAuthAuthPigeonFirebaseApp* app, + FirebaseAuthFirebaseAuthUserHostApiResponseHandle* response_handle, + gpointer user_data); + void (*send_email_verification)( + FirebaseAuthAuthPigeonFirebaseApp* app, + FirebaseAuthInternalActionCodeSettings* action_code_settings, + FirebaseAuthFirebaseAuthUserHostApiResponseHandle* response_handle, + gpointer user_data); + void (*unlink)( + FirebaseAuthAuthPigeonFirebaseApp* app, const gchar* provider_id, + FirebaseAuthFirebaseAuthUserHostApiResponseHandle* response_handle, + gpointer user_data); + void (*update_email)( + FirebaseAuthAuthPigeonFirebaseApp* app, const gchar* new_email, + FirebaseAuthFirebaseAuthUserHostApiResponseHandle* response_handle, + gpointer user_data); + void (*update_password)( + FirebaseAuthAuthPigeonFirebaseApp* app, const gchar* new_password, + FirebaseAuthFirebaseAuthUserHostApiResponseHandle* response_handle, + gpointer user_data); + void (*update_phone_number)( + FirebaseAuthAuthPigeonFirebaseApp* app, FlValue* input, + FirebaseAuthFirebaseAuthUserHostApiResponseHandle* response_handle, + gpointer user_data); + void (*update_profile)( + FirebaseAuthAuthPigeonFirebaseApp* app, + FirebaseAuthInternalUserProfile* profile, + FirebaseAuthFirebaseAuthUserHostApiResponseHandle* response_handle, + gpointer user_data); + void (*verify_before_update_email)( + FirebaseAuthAuthPigeonFirebaseApp* app, const gchar* new_email, + FirebaseAuthInternalActionCodeSettings* action_code_settings, + FirebaseAuthFirebaseAuthUserHostApiResponseHandle* response_handle, + gpointer user_data); +} FirebaseAuthFirebaseAuthUserHostApiVTable; + +/** + * firebase_auth_firebase_auth_user_host_api_set_method_handlers: + * + * @messenger: an #FlBinaryMessenger. + * @suffix: (allow-none): a suffix to add to the API or %NULL for none. + * @vtable: implementations of the methods in this API. + * @user_data: (closure): user data to pass to the functions in @vtable. + * @user_data_free_func: (allow-none): a function which gets called to free + * @user_data, or %NULL. + * + * Connects the method handlers in the FirebaseAuthUserHostApi API. + */ +void firebase_auth_firebase_auth_user_host_api_set_method_handlers( + FlBinaryMessenger* messenger, const gchar* suffix, + const FirebaseAuthFirebaseAuthUserHostApiVTable* vtable, gpointer user_data, + GDestroyNotify user_data_free_func); + +/** + * firebase_auth_firebase_auth_user_host_api_clear_method_handlers: + * + * @messenger: an #FlBinaryMessenger. + * @suffix: (allow-none): a suffix to add to the API or %NULL for none. + * + * Clears the method handlers in the FirebaseAuthUserHostApi API. + */ +void firebase_auth_firebase_auth_user_host_api_clear_method_handlers( + FlBinaryMessenger* messenger, const gchar* suffix); + +/** + * firebase_auth_firebase_auth_user_host_api_respond_delete: + * @response_handle: a #FirebaseAuthFirebaseAuthUserHostApiResponseHandle. + * + * Responds to FirebaseAuthUserHostApi.delete. + */ +void firebase_auth_firebase_auth_user_host_api_respond_delete( + FirebaseAuthFirebaseAuthUserHostApiResponseHandle* response_handle); + +/** + * firebase_auth_firebase_auth_user_host_api_respond_error_delete: + * @response_handle: a #FirebaseAuthFirebaseAuthUserHostApiResponseHandle. + * @code: error code. + * @message: error message. + * @details: (allow-none): error details or %NULL. + * + * Responds with an error to FirebaseAuthUserHostApi.delete. + */ +void firebase_auth_firebase_auth_user_host_api_respond_error_delete( + FirebaseAuthFirebaseAuthUserHostApiResponseHandle* response_handle, + const gchar* code, const gchar* message, FlValue* details); + +/** + * firebase_auth_firebase_auth_user_host_api_respond_get_id_token: + * @response_handle: a #FirebaseAuthFirebaseAuthUserHostApiResponseHandle. + * @return_value: location to write the value returned by this method. + * + * Responds to FirebaseAuthUserHostApi.getIdToken. + */ +void firebase_auth_firebase_auth_user_host_api_respond_get_id_token( + FirebaseAuthFirebaseAuthUserHostApiResponseHandle* response_handle, + FirebaseAuthInternalIdTokenResult* return_value); + +/** + * firebase_auth_firebase_auth_user_host_api_respond_error_get_id_token: + * @response_handle: a #FirebaseAuthFirebaseAuthUserHostApiResponseHandle. + * @code: error code. + * @message: error message. + * @details: (allow-none): error details or %NULL. + * + * Responds with an error to FirebaseAuthUserHostApi.getIdToken. + */ +void firebase_auth_firebase_auth_user_host_api_respond_error_get_id_token( + FirebaseAuthFirebaseAuthUserHostApiResponseHandle* response_handle, + const gchar* code, const gchar* message, FlValue* details); + +/** + * firebase_auth_firebase_auth_user_host_api_respond_link_with_credential: + * @response_handle: a #FirebaseAuthFirebaseAuthUserHostApiResponseHandle. + * @return_value: location to write the value returned by this method. + * + * Responds to FirebaseAuthUserHostApi.linkWithCredential. + */ +void firebase_auth_firebase_auth_user_host_api_respond_link_with_credential( + FirebaseAuthFirebaseAuthUserHostApiResponseHandle* response_handle, + FirebaseAuthInternalUserCredential* return_value); + +/** + * firebase_auth_firebase_auth_user_host_api_respond_error_link_with_credential: + * @response_handle: a #FirebaseAuthFirebaseAuthUserHostApiResponseHandle. + * @code: error code. + * @message: error message. + * @details: (allow-none): error details or %NULL. + * + * Responds with an error to FirebaseAuthUserHostApi.linkWithCredential. + */ +void firebase_auth_firebase_auth_user_host_api_respond_error_link_with_credential( + FirebaseAuthFirebaseAuthUserHostApiResponseHandle* response_handle, + const gchar* code, const gchar* message, FlValue* details); + +/** + * firebase_auth_firebase_auth_user_host_api_respond_link_with_provider: + * @response_handle: a #FirebaseAuthFirebaseAuthUserHostApiResponseHandle. + * @return_value: location to write the value returned by this method. + * + * Responds to FirebaseAuthUserHostApi.linkWithProvider. + */ +void firebase_auth_firebase_auth_user_host_api_respond_link_with_provider( + FirebaseAuthFirebaseAuthUserHostApiResponseHandle* response_handle, + FirebaseAuthInternalUserCredential* return_value); + +/** + * firebase_auth_firebase_auth_user_host_api_respond_error_link_with_provider: + * @response_handle: a #FirebaseAuthFirebaseAuthUserHostApiResponseHandle. + * @code: error code. + * @message: error message. + * @details: (allow-none): error details or %NULL. + * + * Responds with an error to FirebaseAuthUserHostApi.linkWithProvider. + */ +void firebase_auth_firebase_auth_user_host_api_respond_error_link_with_provider( + FirebaseAuthFirebaseAuthUserHostApiResponseHandle* response_handle, + const gchar* code, const gchar* message, FlValue* details); + +/** + * firebase_auth_firebase_auth_user_host_api_respond_reauthenticate_with_credential: + * @response_handle: a #FirebaseAuthFirebaseAuthUserHostApiResponseHandle. + * @return_value: location to write the value returned by this method. + * + * Responds to FirebaseAuthUserHostApi.reauthenticateWithCredential. + */ +void firebase_auth_firebase_auth_user_host_api_respond_reauthenticate_with_credential( + FirebaseAuthFirebaseAuthUserHostApiResponseHandle* response_handle, + FirebaseAuthInternalUserCredential* return_value); + +/** + * firebase_auth_firebase_auth_user_host_api_respond_error_reauthenticate_with_credential: + * @response_handle: a #FirebaseAuthFirebaseAuthUserHostApiResponseHandle. + * @code: error code. + * @message: error message. + * @details: (allow-none): error details or %NULL. + * + * Responds with an error to + * FirebaseAuthUserHostApi.reauthenticateWithCredential. + */ +void firebase_auth_firebase_auth_user_host_api_respond_error_reauthenticate_with_credential( + FirebaseAuthFirebaseAuthUserHostApiResponseHandle* response_handle, + const gchar* code, const gchar* message, FlValue* details); + +/** + * firebase_auth_firebase_auth_user_host_api_respond_reauthenticate_with_provider: + * @response_handle: a #FirebaseAuthFirebaseAuthUserHostApiResponseHandle. + * @return_value: location to write the value returned by this method. + * + * Responds to FirebaseAuthUserHostApi.reauthenticateWithProvider. + */ +void firebase_auth_firebase_auth_user_host_api_respond_reauthenticate_with_provider( + FirebaseAuthFirebaseAuthUserHostApiResponseHandle* response_handle, + FirebaseAuthInternalUserCredential* return_value); + +/** + * firebase_auth_firebase_auth_user_host_api_respond_error_reauthenticate_with_provider: + * @response_handle: a #FirebaseAuthFirebaseAuthUserHostApiResponseHandle. + * @code: error code. + * @message: error message. + * @details: (allow-none): error details or %NULL. + * + * Responds with an error to FirebaseAuthUserHostApi.reauthenticateWithProvider. + */ +void firebase_auth_firebase_auth_user_host_api_respond_error_reauthenticate_with_provider( + FirebaseAuthFirebaseAuthUserHostApiResponseHandle* response_handle, + const gchar* code, const gchar* message, FlValue* details); + +/** + * firebase_auth_firebase_auth_user_host_api_respond_reload: + * @response_handle: a #FirebaseAuthFirebaseAuthUserHostApiResponseHandle. + * @return_value: location to write the value returned by this method. + * + * Responds to FirebaseAuthUserHostApi.reload. + */ +void firebase_auth_firebase_auth_user_host_api_respond_reload( + FirebaseAuthFirebaseAuthUserHostApiResponseHandle* response_handle, + FirebaseAuthInternalUserDetails* return_value); + +/** + * firebase_auth_firebase_auth_user_host_api_respond_error_reload: + * @response_handle: a #FirebaseAuthFirebaseAuthUserHostApiResponseHandle. + * @code: error code. + * @message: error message. + * @details: (allow-none): error details or %NULL. + * + * Responds with an error to FirebaseAuthUserHostApi.reload. + */ +void firebase_auth_firebase_auth_user_host_api_respond_error_reload( + FirebaseAuthFirebaseAuthUserHostApiResponseHandle* response_handle, + const gchar* code, const gchar* message, FlValue* details); + +/** + * firebase_auth_firebase_auth_user_host_api_respond_send_email_verification: + * @response_handle: a #FirebaseAuthFirebaseAuthUserHostApiResponseHandle. + * + * Responds to FirebaseAuthUserHostApi.sendEmailVerification. + */ +void firebase_auth_firebase_auth_user_host_api_respond_send_email_verification( + FirebaseAuthFirebaseAuthUserHostApiResponseHandle* response_handle); + +/** + * firebase_auth_firebase_auth_user_host_api_respond_error_send_email_verification: + * @response_handle: a #FirebaseAuthFirebaseAuthUserHostApiResponseHandle. + * @code: error code. + * @message: error message. + * @details: (allow-none): error details or %NULL. + * + * Responds with an error to FirebaseAuthUserHostApi.sendEmailVerification. + */ +void firebase_auth_firebase_auth_user_host_api_respond_error_send_email_verification( + FirebaseAuthFirebaseAuthUserHostApiResponseHandle* response_handle, + const gchar* code, const gchar* message, FlValue* details); + +/** + * firebase_auth_firebase_auth_user_host_api_respond_unlink: + * @response_handle: a #FirebaseAuthFirebaseAuthUserHostApiResponseHandle. + * @return_value: location to write the value returned by this method. + * + * Responds to FirebaseAuthUserHostApi.unlink. + */ +void firebase_auth_firebase_auth_user_host_api_respond_unlink( + FirebaseAuthFirebaseAuthUserHostApiResponseHandle* response_handle, + FirebaseAuthInternalUserCredential* return_value); + +/** + * firebase_auth_firebase_auth_user_host_api_respond_error_unlink: + * @response_handle: a #FirebaseAuthFirebaseAuthUserHostApiResponseHandle. + * @code: error code. + * @message: error message. + * @details: (allow-none): error details or %NULL. + * + * Responds with an error to FirebaseAuthUserHostApi.unlink. + */ +void firebase_auth_firebase_auth_user_host_api_respond_error_unlink( + FirebaseAuthFirebaseAuthUserHostApiResponseHandle* response_handle, + const gchar* code, const gchar* message, FlValue* details); + +/** + * firebase_auth_firebase_auth_user_host_api_respond_update_email: + * @response_handle: a #FirebaseAuthFirebaseAuthUserHostApiResponseHandle. + * @return_value: location to write the value returned by this method. + * + * Responds to FirebaseAuthUserHostApi.updateEmail. + */ +void firebase_auth_firebase_auth_user_host_api_respond_update_email( + FirebaseAuthFirebaseAuthUserHostApiResponseHandle* response_handle, + FirebaseAuthInternalUserDetails* return_value); + +/** + * firebase_auth_firebase_auth_user_host_api_respond_error_update_email: + * @response_handle: a #FirebaseAuthFirebaseAuthUserHostApiResponseHandle. + * @code: error code. + * @message: error message. + * @details: (allow-none): error details or %NULL. + * + * Responds with an error to FirebaseAuthUserHostApi.updateEmail. + */ +void firebase_auth_firebase_auth_user_host_api_respond_error_update_email( + FirebaseAuthFirebaseAuthUserHostApiResponseHandle* response_handle, + const gchar* code, const gchar* message, FlValue* details); + +/** + * firebase_auth_firebase_auth_user_host_api_respond_update_password: + * @response_handle: a #FirebaseAuthFirebaseAuthUserHostApiResponseHandle. + * @return_value: location to write the value returned by this method. + * + * Responds to FirebaseAuthUserHostApi.updatePassword. + */ +void firebase_auth_firebase_auth_user_host_api_respond_update_password( + FirebaseAuthFirebaseAuthUserHostApiResponseHandle* response_handle, + FirebaseAuthInternalUserDetails* return_value); + +/** + * firebase_auth_firebase_auth_user_host_api_respond_error_update_password: + * @response_handle: a #FirebaseAuthFirebaseAuthUserHostApiResponseHandle. + * @code: error code. + * @message: error message. + * @details: (allow-none): error details or %NULL. + * + * Responds with an error to FirebaseAuthUserHostApi.updatePassword. + */ +void firebase_auth_firebase_auth_user_host_api_respond_error_update_password( + FirebaseAuthFirebaseAuthUserHostApiResponseHandle* response_handle, + const gchar* code, const gchar* message, FlValue* details); + +/** + * firebase_auth_firebase_auth_user_host_api_respond_update_phone_number: + * @response_handle: a #FirebaseAuthFirebaseAuthUserHostApiResponseHandle. + * @return_value: location to write the value returned by this method. + * + * Responds to FirebaseAuthUserHostApi.updatePhoneNumber. + */ +void firebase_auth_firebase_auth_user_host_api_respond_update_phone_number( + FirebaseAuthFirebaseAuthUserHostApiResponseHandle* response_handle, + FirebaseAuthInternalUserDetails* return_value); + +/** + * firebase_auth_firebase_auth_user_host_api_respond_error_update_phone_number: + * @response_handle: a #FirebaseAuthFirebaseAuthUserHostApiResponseHandle. + * @code: error code. + * @message: error message. + * @details: (allow-none): error details or %NULL. + * + * Responds with an error to FirebaseAuthUserHostApi.updatePhoneNumber. + */ +void firebase_auth_firebase_auth_user_host_api_respond_error_update_phone_number( + FirebaseAuthFirebaseAuthUserHostApiResponseHandle* response_handle, + const gchar* code, const gchar* message, FlValue* details); + +/** + * firebase_auth_firebase_auth_user_host_api_respond_update_profile: + * @response_handle: a #FirebaseAuthFirebaseAuthUserHostApiResponseHandle. + * @return_value: location to write the value returned by this method. + * + * Responds to FirebaseAuthUserHostApi.updateProfile. + */ +void firebase_auth_firebase_auth_user_host_api_respond_update_profile( + FirebaseAuthFirebaseAuthUserHostApiResponseHandle* response_handle, + FirebaseAuthInternalUserDetails* return_value); + +/** + * firebase_auth_firebase_auth_user_host_api_respond_error_update_profile: + * @response_handle: a #FirebaseAuthFirebaseAuthUserHostApiResponseHandle. + * @code: error code. + * @message: error message. + * @details: (allow-none): error details or %NULL. + * + * Responds with an error to FirebaseAuthUserHostApi.updateProfile. + */ +void firebase_auth_firebase_auth_user_host_api_respond_error_update_profile( + FirebaseAuthFirebaseAuthUserHostApiResponseHandle* response_handle, + const gchar* code, const gchar* message, FlValue* details); + +/** + * firebase_auth_firebase_auth_user_host_api_respond_verify_before_update_email: + * @response_handle: a #FirebaseAuthFirebaseAuthUserHostApiResponseHandle. + * + * Responds to FirebaseAuthUserHostApi.verifyBeforeUpdateEmail. + */ +void firebase_auth_firebase_auth_user_host_api_respond_verify_before_update_email( + FirebaseAuthFirebaseAuthUserHostApiResponseHandle* response_handle); + +/** + * firebase_auth_firebase_auth_user_host_api_respond_error_verify_before_update_email: + * @response_handle: a #FirebaseAuthFirebaseAuthUserHostApiResponseHandle. + * @code: error code. + * @message: error message. + * @details: (allow-none): error details or %NULL. + * + * Responds with an error to FirebaseAuthUserHostApi.verifyBeforeUpdateEmail. + */ +void firebase_auth_firebase_auth_user_host_api_respond_error_verify_before_update_email( + FirebaseAuthFirebaseAuthUserHostApiResponseHandle* response_handle, + const gchar* code, const gchar* message, FlValue* details); + +G_DECLARE_FINAL_TYPE(FirebaseAuthMultiFactorUserHostApi, + firebase_auth_multi_factor_user_host_api, FIREBASE_AUTH, + MULTI_FACTOR_USER_HOST_API, GObject) + +G_DECLARE_FINAL_TYPE(FirebaseAuthMultiFactorUserHostApiResponseHandle, + firebase_auth_multi_factor_user_host_api_response_handle, + FIREBASE_AUTH, MULTI_FACTOR_USER_HOST_API_RESPONSE_HANDLE, + GObject) + +/** + * FirebaseAuthMultiFactorUserHostApiVTable: + * + * Table of functions exposed by MultiFactorUserHostApi to be implemented by the + * API provider. + */ +typedef struct { + void (*enroll_phone)( + FirebaseAuthAuthPigeonFirebaseApp* app, + FirebaseAuthInternalPhoneMultiFactorAssertion* assertion, + const gchar* display_name, + FirebaseAuthMultiFactorUserHostApiResponseHandle* response_handle, + gpointer user_data); + void (*enroll_totp)( + FirebaseAuthAuthPigeonFirebaseApp* app, const gchar* assertion_id, + const gchar* display_name, + FirebaseAuthMultiFactorUserHostApiResponseHandle* response_handle, + gpointer user_data); + void (*get_session)( + FirebaseAuthAuthPigeonFirebaseApp* app, + FirebaseAuthMultiFactorUserHostApiResponseHandle* response_handle, + gpointer user_data); + void (*unenroll)( + FirebaseAuthAuthPigeonFirebaseApp* app, const gchar* factor_uid, + FirebaseAuthMultiFactorUserHostApiResponseHandle* response_handle, + gpointer user_data); + void (*get_enrolled_factors)( + FirebaseAuthAuthPigeonFirebaseApp* app, + FirebaseAuthMultiFactorUserHostApiResponseHandle* response_handle, + gpointer user_data); +} FirebaseAuthMultiFactorUserHostApiVTable; + +/** + * firebase_auth_multi_factor_user_host_api_set_method_handlers: + * + * @messenger: an #FlBinaryMessenger. + * @suffix: (allow-none): a suffix to add to the API or %NULL for none. + * @vtable: implementations of the methods in this API. + * @user_data: (closure): user data to pass to the functions in @vtable. + * @user_data_free_func: (allow-none): a function which gets called to free + * @user_data, or %NULL. + * + * Connects the method handlers in the MultiFactorUserHostApi API. + */ +void firebase_auth_multi_factor_user_host_api_set_method_handlers( + FlBinaryMessenger* messenger, const gchar* suffix, + const FirebaseAuthMultiFactorUserHostApiVTable* vtable, gpointer user_data, + GDestroyNotify user_data_free_func); + +/** + * firebase_auth_multi_factor_user_host_api_clear_method_handlers: + * + * @messenger: an #FlBinaryMessenger. + * @suffix: (allow-none): a suffix to add to the API or %NULL for none. + * + * Clears the method handlers in the MultiFactorUserHostApi API. + */ +void firebase_auth_multi_factor_user_host_api_clear_method_handlers( + FlBinaryMessenger* messenger, const gchar* suffix); + +/** + * firebase_auth_multi_factor_user_host_api_respond_enroll_phone: + * @response_handle: a #FirebaseAuthMultiFactorUserHostApiResponseHandle. + * + * Responds to MultiFactorUserHostApi.enrollPhone. + */ +void firebase_auth_multi_factor_user_host_api_respond_enroll_phone( + FirebaseAuthMultiFactorUserHostApiResponseHandle* response_handle); + +/** + * firebase_auth_multi_factor_user_host_api_respond_error_enroll_phone: + * @response_handle: a #FirebaseAuthMultiFactorUserHostApiResponseHandle. + * @code: error code. + * @message: error message. + * @details: (allow-none): error details or %NULL. + * + * Responds with an error to MultiFactorUserHostApi.enrollPhone. + */ +void firebase_auth_multi_factor_user_host_api_respond_error_enroll_phone( + FirebaseAuthMultiFactorUserHostApiResponseHandle* response_handle, + const gchar* code, const gchar* message, FlValue* details); + +/** + * firebase_auth_multi_factor_user_host_api_respond_enroll_totp: + * @response_handle: a #FirebaseAuthMultiFactorUserHostApiResponseHandle. + * + * Responds to MultiFactorUserHostApi.enrollTotp. + */ +void firebase_auth_multi_factor_user_host_api_respond_enroll_totp( + FirebaseAuthMultiFactorUserHostApiResponseHandle* response_handle); + +/** + * firebase_auth_multi_factor_user_host_api_respond_error_enroll_totp: + * @response_handle: a #FirebaseAuthMultiFactorUserHostApiResponseHandle. + * @code: error code. + * @message: error message. + * @details: (allow-none): error details or %NULL. + * + * Responds with an error to MultiFactorUserHostApi.enrollTotp. + */ +void firebase_auth_multi_factor_user_host_api_respond_error_enroll_totp( + FirebaseAuthMultiFactorUserHostApiResponseHandle* response_handle, + const gchar* code, const gchar* message, FlValue* details); + +/** + * firebase_auth_multi_factor_user_host_api_respond_get_session: + * @response_handle: a #FirebaseAuthMultiFactorUserHostApiResponseHandle. + * @return_value: location to write the value returned by this method. + * + * Responds to MultiFactorUserHostApi.getSession. + */ +void firebase_auth_multi_factor_user_host_api_respond_get_session( + FirebaseAuthMultiFactorUserHostApiResponseHandle* response_handle, + FirebaseAuthInternalMultiFactorSession* return_value); + +/** + * firebase_auth_multi_factor_user_host_api_respond_error_get_session: + * @response_handle: a #FirebaseAuthMultiFactorUserHostApiResponseHandle. + * @code: error code. + * @message: error message. + * @details: (allow-none): error details or %NULL. + * + * Responds with an error to MultiFactorUserHostApi.getSession. + */ +void firebase_auth_multi_factor_user_host_api_respond_error_get_session( + FirebaseAuthMultiFactorUserHostApiResponseHandle* response_handle, + const gchar* code, const gchar* message, FlValue* details); + +/** + * firebase_auth_multi_factor_user_host_api_respond_unenroll: + * @response_handle: a #FirebaseAuthMultiFactorUserHostApiResponseHandle. + * + * Responds to MultiFactorUserHostApi.unenroll. + */ +void firebase_auth_multi_factor_user_host_api_respond_unenroll( + FirebaseAuthMultiFactorUserHostApiResponseHandle* response_handle); + +/** + * firebase_auth_multi_factor_user_host_api_respond_error_unenroll: + * @response_handle: a #FirebaseAuthMultiFactorUserHostApiResponseHandle. + * @code: error code. + * @message: error message. + * @details: (allow-none): error details or %NULL. + * + * Responds with an error to MultiFactorUserHostApi.unenroll. + */ +void firebase_auth_multi_factor_user_host_api_respond_error_unenroll( + FirebaseAuthMultiFactorUserHostApiResponseHandle* response_handle, + const gchar* code, const gchar* message, FlValue* details); + +/** + * firebase_auth_multi_factor_user_host_api_respond_get_enrolled_factors: + * @response_handle: a #FirebaseAuthMultiFactorUserHostApiResponseHandle. + * @return_value: location to write the value returned by this method. + * + * Responds to MultiFactorUserHostApi.getEnrolledFactors. + */ +void firebase_auth_multi_factor_user_host_api_respond_get_enrolled_factors( + FirebaseAuthMultiFactorUserHostApiResponseHandle* response_handle, + FlValue* return_value); + +/** + * firebase_auth_multi_factor_user_host_api_respond_error_get_enrolled_factors: + * @response_handle: a #FirebaseAuthMultiFactorUserHostApiResponseHandle. + * @code: error code. + * @message: error message. + * @details: (allow-none): error details or %NULL. + * + * Responds with an error to MultiFactorUserHostApi.getEnrolledFactors. + */ +void firebase_auth_multi_factor_user_host_api_respond_error_get_enrolled_factors( + FirebaseAuthMultiFactorUserHostApiResponseHandle* response_handle, + const gchar* code, const gchar* message, FlValue* details); + +G_DECLARE_FINAL_TYPE(FirebaseAuthMultiFactoResolverHostApi, + firebase_auth_multi_facto_resolver_host_api, FIREBASE_AUTH, + MULTI_FACTO_RESOLVER_HOST_API, GObject) + +G_DECLARE_FINAL_TYPE( + FirebaseAuthMultiFactoResolverHostApiResponseHandle, + firebase_auth_multi_facto_resolver_host_api_response_handle, FIREBASE_AUTH, + MULTI_FACTO_RESOLVER_HOST_API_RESPONSE_HANDLE, GObject) + +/** + * FirebaseAuthMultiFactoResolverHostApiVTable: + * + * Table of functions exposed by MultiFactoResolverHostApi to be implemented by + * the API provider. + */ +typedef struct { + void (*resolve_sign_in)( + const gchar* resolver_id, + FirebaseAuthInternalPhoneMultiFactorAssertion* assertion, + const gchar* totp_assertion_id, + FirebaseAuthMultiFactoResolverHostApiResponseHandle* response_handle, + gpointer user_data); +} FirebaseAuthMultiFactoResolverHostApiVTable; + +/** + * firebase_auth_multi_facto_resolver_host_api_set_method_handlers: + * + * @messenger: an #FlBinaryMessenger. + * @suffix: (allow-none): a suffix to add to the API or %NULL for none. + * @vtable: implementations of the methods in this API. + * @user_data: (closure): user data to pass to the functions in @vtable. + * @user_data_free_func: (allow-none): a function which gets called to free + * @user_data, or %NULL. + * + * Connects the method handlers in the MultiFactoResolverHostApi API. + */ +void firebase_auth_multi_facto_resolver_host_api_set_method_handlers( + FlBinaryMessenger* messenger, const gchar* suffix, + const FirebaseAuthMultiFactoResolverHostApiVTable* vtable, + gpointer user_data, GDestroyNotify user_data_free_func); + +/** + * firebase_auth_multi_facto_resolver_host_api_clear_method_handlers: + * + * @messenger: an #FlBinaryMessenger. + * @suffix: (allow-none): a suffix to add to the API or %NULL for none. + * + * Clears the method handlers in the MultiFactoResolverHostApi API. + */ +void firebase_auth_multi_facto_resolver_host_api_clear_method_handlers( + FlBinaryMessenger* messenger, const gchar* suffix); + +/** + * firebase_auth_multi_facto_resolver_host_api_respond_resolve_sign_in: + * @response_handle: a #FirebaseAuthMultiFactoResolverHostApiResponseHandle. + * @return_value: location to write the value returned by this method. + * + * Responds to MultiFactoResolverHostApi.resolveSignIn. + */ +void firebase_auth_multi_facto_resolver_host_api_respond_resolve_sign_in( + FirebaseAuthMultiFactoResolverHostApiResponseHandle* response_handle, + FirebaseAuthInternalUserCredential* return_value); + +/** + * firebase_auth_multi_facto_resolver_host_api_respond_error_resolve_sign_in: + * @response_handle: a #FirebaseAuthMultiFactoResolverHostApiResponseHandle. + * @code: error code. + * @message: error message. + * @details: (allow-none): error details or %NULL. + * + * Responds with an error to MultiFactoResolverHostApi.resolveSignIn. + */ +void firebase_auth_multi_facto_resolver_host_api_respond_error_resolve_sign_in( + FirebaseAuthMultiFactoResolverHostApiResponseHandle* response_handle, + const gchar* code, const gchar* message, FlValue* details); + +G_DECLARE_FINAL_TYPE(FirebaseAuthMultiFactorTotpHostApi, + firebase_auth_multi_factor_totp_host_api, FIREBASE_AUTH, + MULTI_FACTOR_TOTP_HOST_API, GObject) + +G_DECLARE_FINAL_TYPE(FirebaseAuthMultiFactorTotpHostApiResponseHandle, + firebase_auth_multi_factor_totp_host_api_response_handle, + FIREBASE_AUTH, MULTI_FACTOR_TOTP_HOST_API_RESPONSE_HANDLE, + GObject) + +/** + * FirebaseAuthMultiFactorTotpHostApiVTable: + * + * Table of functions exposed by MultiFactorTotpHostApi to be implemented by the + * API provider. + */ +typedef struct { + void (*generate_secret)( + const gchar* session_id, + FirebaseAuthMultiFactorTotpHostApiResponseHandle* response_handle, + gpointer user_data); + void (*get_assertion_for_enrollment)( + const gchar* secret_key, const gchar* one_time_password, + FirebaseAuthMultiFactorTotpHostApiResponseHandle* response_handle, + gpointer user_data); + void (*get_assertion_for_sign_in)( + const gchar* enrollment_id, const gchar* one_time_password, + FirebaseAuthMultiFactorTotpHostApiResponseHandle* response_handle, + gpointer user_data); +} FirebaseAuthMultiFactorTotpHostApiVTable; + +/** + * firebase_auth_multi_factor_totp_host_api_set_method_handlers: + * + * @messenger: an #FlBinaryMessenger. + * @suffix: (allow-none): a suffix to add to the API or %NULL for none. + * @vtable: implementations of the methods in this API. + * @user_data: (closure): user data to pass to the functions in @vtable. + * @user_data_free_func: (allow-none): a function which gets called to free + * @user_data, or %NULL. + * + * Connects the method handlers in the MultiFactorTotpHostApi API. + */ +void firebase_auth_multi_factor_totp_host_api_set_method_handlers( + FlBinaryMessenger* messenger, const gchar* suffix, + const FirebaseAuthMultiFactorTotpHostApiVTable* vtable, gpointer user_data, + GDestroyNotify user_data_free_func); + +/** + * firebase_auth_multi_factor_totp_host_api_clear_method_handlers: + * + * @messenger: an #FlBinaryMessenger. + * @suffix: (allow-none): a suffix to add to the API or %NULL for none. + * + * Clears the method handlers in the MultiFactorTotpHostApi API. + */ +void firebase_auth_multi_factor_totp_host_api_clear_method_handlers( + FlBinaryMessenger* messenger, const gchar* suffix); + +/** + * firebase_auth_multi_factor_totp_host_api_respond_generate_secret: + * @response_handle: a #FirebaseAuthMultiFactorTotpHostApiResponseHandle. + * @return_value: location to write the value returned by this method. + * + * Responds to MultiFactorTotpHostApi.generateSecret. + */ +void firebase_auth_multi_factor_totp_host_api_respond_generate_secret( + FirebaseAuthMultiFactorTotpHostApiResponseHandle* response_handle, + FirebaseAuthInternalTotpSecret* return_value); + +/** + * firebase_auth_multi_factor_totp_host_api_respond_error_generate_secret: + * @response_handle: a #FirebaseAuthMultiFactorTotpHostApiResponseHandle. + * @code: error code. + * @message: error message. + * @details: (allow-none): error details or %NULL. + * + * Responds with an error to MultiFactorTotpHostApi.generateSecret. + */ +void firebase_auth_multi_factor_totp_host_api_respond_error_generate_secret( + FirebaseAuthMultiFactorTotpHostApiResponseHandle* response_handle, + const gchar* code, const gchar* message, FlValue* details); + +/** + * firebase_auth_multi_factor_totp_host_api_respond_get_assertion_for_enrollment: + * @response_handle: a #FirebaseAuthMultiFactorTotpHostApiResponseHandle. + * @return_value: location to write the value returned by this method. + * + * Responds to MultiFactorTotpHostApi.getAssertionForEnrollment. + */ +void firebase_auth_multi_factor_totp_host_api_respond_get_assertion_for_enrollment( + FirebaseAuthMultiFactorTotpHostApiResponseHandle* response_handle, + const gchar* return_value); + +/** + * firebase_auth_multi_factor_totp_host_api_respond_error_get_assertion_for_enrollment: + * @response_handle: a #FirebaseAuthMultiFactorTotpHostApiResponseHandle. + * @code: error code. + * @message: error message. + * @details: (allow-none): error details or %NULL. + * + * Responds with an error to MultiFactorTotpHostApi.getAssertionForEnrollment. + */ +void firebase_auth_multi_factor_totp_host_api_respond_error_get_assertion_for_enrollment( + FirebaseAuthMultiFactorTotpHostApiResponseHandle* response_handle, + const gchar* code, const gchar* message, FlValue* details); + +/** + * firebase_auth_multi_factor_totp_host_api_respond_get_assertion_for_sign_in: + * @response_handle: a #FirebaseAuthMultiFactorTotpHostApiResponseHandle. + * @return_value: location to write the value returned by this method. + * + * Responds to MultiFactorTotpHostApi.getAssertionForSignIn. + */ +void firebase_auth_multi_factor_totp_host_api_respond_get_assertion_for_sign_in( + FirebaseAuthMultiFactorTotpHostApiResponseHandle* response_handle, + const gchar* return_value); + +/** + * firebase_auth_multi_factor_totp_host_api_respond_error_get_assertion_for_sign_in: + * @response_handle: a #FirebaseAuthMultiFactorTotpHostApiResponseHandle. + * @code: error code. + * @message: error message. + * @details: (allow-none): error details or %NULL. + * + * Responds with an error to MultiFactorTotpHostApi.getAssertionForSignIn. + */ +void firebase_auth_multi_factor_totp_host_api_respond_error_get_assertion_for_sign_in( + FirebaseAuthMultiFactorTotpHostApiResponseHandle* response_handle, + const gchar* code, const gchar* message, FlValue* details); + +G_DECLARE_FINAL_TYPE(FirebaseAuthMultiFactorTotpSecretHostApi, + firebase_auth_multi_factor_totp_secret_host_api, + FIREBASE_AUTH, MULTI_FACTOR_TOTP_SECRET_HOST_API, GObject) + +G_DECLARE_FINAL_TYPE( + FirebaseAuthMultiFactorTotpSecretHostApiResponseHandle, + firebase_auth_multi_factor_totp_secret_host_api_response_handle, + FIREBASE_AUTH, MULTI_FACTOR_TOTP_SECRET_HOST_API_RESPONSE_HANDLE, GObject) + +/** + * FirebaseAuthMultiFactorTotpSecretHostApiVTable: + * + * Table of functions exposed by MultiFactorTotpSecretHostApi to be implemented + * by the API provider. + */ +typedef struct { + void (*generate_qr_code_url)( + const gchar* secret_key, const gchar* account_name, const gchar* issuer, + FirebaseAuthMultiFactorTotpSecretHostApiResponseHandle* response_handle, + gpointer user_data); + void (*open_in_otp_app)( + const gchar* secret_key, const gchar* qr_code_url, + FirebaseAuthMultiFactorTotpSecretHostApiResponseHandle* response_handle, + gpointer user_data); +} FirebaseAuthMultiFactorTotpSecretHostApiVTable; + +/** + * firebase_auth_multi_factor_totp_secret_host_api_set_method_handlers: + * + * @messenger: an #FlBinaryMessenger. + * @suffix: (allow-none): a suffix to add to the API or %NULL for none. + * @vtable: implementations of the methods in this API. + * @user_data: (closure): user data to pass to the functions in @vtable. + * @user_data_free_func: (allow-none): a function which gets called to free + * @user_data, or %NULL. + * + * Connects the method handlers in the MultiFactorTotpSecretHostApi API. + */ +void firebase_auth_multi_factor_totp_secret_host_api_set_method_handlers( + FlBinaryMessenger* messenger, const gchar* suffix, + const FirebaseAuthMultiFactorTotpSecretHostApiVTable* vtable, + gpointer user_data, GDestroyNotify user_data_free_func); + +/** + * firebase_auth_multi_factor_totp_secret_host_api_clear_method_handlers: + * + * @messenger: an #FlBinaryMessenger. + * @suffix: (allow-none): a suffix to add to the API or %NULL for none. + * + * Clears the method handlers in the MultiFactorTotpSecretHostApi API. + */ +void firebase_auth_multi_factor_totp_secret_host_api_clear_method_handlers( + FlBinaryMessenger* messenger, const gchar* suffix); + +/** + * firebase_auth_multi_factor_totp_secret_host_api_respond_generate_qr_code_url: + * @response_handle: a #FirebaseAuthMultiFactorTotpSecretHostApiResponseHandle. + * @return_value: location to write the value returned by this method. + * + * Responds to MultiFactorTotpSecretHostApi.generateQrCodeUrl. + */ +void firebase_auth_multi_factor_totp_secret_host_api_respond_generate_qr_code_url( + FirebaseAuthMultiFactorTotpSecretHostApiResponseHandle* response_handle, + const gchar* return_value); + +/** + * firebase_auth_multi_factor_totp_secret_host_api_respond_error_generate_qr_code_url: + * @response_handle: a #FirebaseAuthMultiFactorTotpSecretHostApiResponseHandle. + * @code: error code. + * @message: error message. + * @details: (allow-none): error details or %NULL. + * + * Responds with an error to MultiFactorTotpSecretHostApi.generateQrCodeUrl. + */ +void firebase_auth_multi_factor_totp_secret_host_api_respond_error_generate_qr_code_url( + FirebaseAuthMultiFactorTotpSecretHostApiResponseHandle* response_handle, + const gchar* code, const gchar* message, FlValue* details); + +/** + * firebase_auth_multi_factor_totp_secret_host_api_respond_open_in_otp_app: + * @response_handle: a #FirebaseAuthMultiFactorTotpSecretHostApiResponseHandle. + * + * Responds to MultiFactorTotpSecretHostApi.openInOtpApp. + */ +void firebase_auth_multi_factor_totp_secret_host_api_respond_open_in_otp_app( + FirebaseAuthMultiFactorTotpSecretHostApiResponseHandle* response_handle); + +/** + * firebase_auth_multi_factor_totp_secret_host_api_respond_error_open_in_otp_app: + * @response_handle: a #FirebaseAuthMultiFactorTotpSecretHostApiResponseHandle. + * @code: error code. + * @message: error message. + * @details: (allow-none): error details or %NULL. + * + * Responds with an error to MultiFactorTotpSecretHostApi.openInOtpApp. + */ +void firebase_auth_multi_factor_totp_secret_host_api_respond_error_open_in_otp_app( + FirebaseAuthMultiFactorTotpSecretHostApiResponseHandle* response_handle, + const gchar* code, const gchar* message, FlValue* details); + +G_DECLARE_FINAL_TYPE(FirebaseAuthGenerateInterfaces, + firebase_auth_generate_interfaces, FIREBASE_AUTH, + GENERATE_INTERFACES, GObject) + +G_DECLARE_FINAL_TYPE( + FirebaseAuthGenerateInterfacesPigeonInterfaceResponse, + firebase_auth_generate_interfaces_pigeon_interface_response, FIREBASE_AUTH, + GENERATE_INTERFACES_PIGEON_INTERFACE_RESPONSE, GObject) + +/** + * firebase_auth_generate_interfaces_pigeon_interface_response_new: + * + * Creates a new response to GenerateInterfaces.pigeonInterface. + * + * Returns: a new #FirebaseAuthGenerateInterfacesPigeonInterfaceResponse + */ +FirebaseAuthGenerateInterfacesPigeonInterfaceResponse* +firebase_auth_generate_interfaces_pigeon_interface_response_new(); + +/** + * firebase_auth_generate_interfaces_pigeon_interface_response_new_error: + * @code: error code. + * @message: error message. + * @details: (allow-none): error details or %NULL. + * + * Creates a new error response to GenerateInterfaces.pigeonInterface. + * + * Returns: a new #FirebaseAuthGenerateInterfacesPigeonInterfaceResponse + */ +FirebaseAuthGenerateInterfacesPigeonInterfaceResponse* +firebase_auth_generate_interfaces_pigeon_interface_response_new_error( + const gchar* code, const gchar* message, FlValue* details); + +/** + * FirebaseAuthGenerateInterfacesVTable: + * + * Table of functions exposed by GenerateInterfaces to be implemented by the API + * provider. + */ +typedef struct { + FirebaseAuthGenerateInterfacesPigeonInterfaceResponse* (*pigeon_interface)( + FirebaseAuthInternalMultiFactorInfo* info, gpointer user_data); +} FirebaseAuthGenerateInterfacesVTable; + +/** + * firebase_auth_generate_interfaces_set_method_handlers: + * + * @messenger: an #FlBinaryMessenger. + * @suffix: (allow-none): a suffix to add to the API or %NULL for none. + * @vtable: implementations of the methods in this API. + * @user_data: (closure): user data to pass to the functions in @vtable. + * @user_data_free_func: (allow-none): a function which gets called to free + * @user_data, or %NULL. + * + * Connects the method handlers in the GenerateInterfaces API. + */ +void firebase_auth_generate_interfaces_set_method_handlers( + FlBinaryMessenger* messenger, const gchar* suffix, + const FirebaseAuthGenerateInterfacesVTable* vtable, gpointer user_data, + GDestroyNotify user_data_free_func); + +/** + * firebase_auth_generate_interfaces_clear_method_handlers: + * + * @messenger: an #FlBinaryMessenger. + * @suffix: (allow-none): a suffix to add to the API or %NULL for none. + * + * Clears the method handlers in the GenerateInterfaces API. + */ +void firebase_auth_generate_interfaces_clear_method_handlers( + FlBinaryMessenger* messenger, const gchar* suffix); + +G_END_DECLS + +#endif // PIGEON_MESSAGES_G_H_ diff --git a/packages/firebase_auth/firebase_auth/linux/plugin_version.h.in b/packages/firebase_auth/firebase_auth/linux/plugin_version.h.in new file mode 100644 index 000000000000..8834bb725216 --- /dev/null +++ b/packages/firebase_auth/firebase_auth/linux/plugin_version.h.in @@ -0,0 +1,13 @@ +// Copyright 2026, the Chromium project authors. Please see the AUTHORS file +// for details. All rights reserved. Use of this source code is governed by a +// BSD-style license that can be found in the LICENSE file. + +#ifndef PLUGIN_VERSION_CONFIG_H +#define PLUGIN_VERSION_CONFIG_H + +namespace firebase_auth_linux { + +std::string getPluginVersion() { return "@PLUGIN_VERSION@"; } +} // namespace firebase_auth_linux + +#endif // PLUGIN_VERSION_CONFIG_H diff --git a/packages/firebase_auth/firebase_auth/pubspec.yaml b/packages/firebase_auth/firebase_auth/pubspec.yaml index 2754be6fe9f8..98f051de7bde 100755 --- a/packages/firebase_auth/firebase_auth/pubspec.yaml +++ b/packages/firebase_auth/firebase_auth/pubspec.yaml @@ -43,6 +43,8 @@ flutter: pluginClass: FlutterFirebaseAuthPlugin ios: pluginClass: FLTFirebaseAuthPlugin + linux: + pluginClass: FirebaseAuthPlugin macos: pluginClass: FLTFirebaseAuthPlugin web: diff --git a/packages/firebase_auth/firebase_auth_platform_interface/pigeons/messages.dart b/packages/firebase_auth/firebase_auth_platform_interface/pigeons/messages.dart index 943fa1693b87..b946498d6d7d 100644 --- a/packages/firebase_auth/firebase_auth_platform_interface/pigeons/messages.dart +++ b/packages/firebase_auth/firebase_auth_platform_interface/pigeons/messages.dart @@ -24,6 +24,12 @@ import 'package:pigeon/pigeon.dart'; cppHeaderOut: '../firebase_auth/windows/messages.g.h', cppSourceOut: '../firebase_auth/windows/messages.g.cpp', cppOptions: CppOptions(namespace: 'firebase_auth_windows'), + gobjectHeaderOut: '../firebase_auth/linux/messages.g.h', + gobjectSourceOut: '../firebase_auth/linux/messages.g.cc', + gobjectOptions: GObjectOptions( + headerIncludePath: 'messages.g.h', + module: 'FirebaseAuth', + ), copyrightHeader: 'pigeons/copyright.txt', ), ) diff --git a/packages/firebase_core/firebase_core/example/.metadata b/packages/firebase_core/firebase_core/example/.metadata index 784ce1298249..2feffa0e65e4 100644 --- a/packages/firebase_core/firebase_core/example/.metadata +++ b/packages/firebase_core/firebase_core/example/.metadata @@ -18,6 +18,9 @@ migration: - platform: web create_revision: a14f74ff3a1cbd521163c5f03d68113d50af93d3 base_revision: a14f74ff3a1cbd521163c5f03d68113d50af93d3 + - platform: linux + create_revision: ad70ec4617166f1c38e5d2bfd388af71fda14f06 + base_revision: ad70ec4617166f1c38e5d2bfd388af71fda14f06 # User provided section diff --git a/packages/firebase_core/firebase_core/example/lib/firebase_options.dart b/packages/firebase_core/firebase_core/example/lib/firebase_options.dart index b5b0383d0a00..7273ada1a7ab 100644 --- a/packages/firebase_core/firebase_core/example/lib/firebase_options.dart +++ b/packages/firebase_core/firebase_core/example/lib/firebase_options.dart @@ -33,6 +33,9 @@ class DefaultFirebaseOptions { // TODO(Lyokone): Remove when FlutterFire CLI updated case TargetPlatform.windows: return android; + // TODO: Remove when FlutterFire CLI supports Linux + case TargetPlatform.linux: + return android; default: throw UnsupportedError( 'DefaultFirebaseOptions are not supported for this platform.', diff --git a/packages/firebase_core/firebase_core/example/linux/.gitignore b/packages/firebase_core/firebase_core/example/linux/.gitignore new file mode 100644 index 000000000000..d3896c98444f --- /dev/null +++ b/packages/firebase_core/firebase_core/example/linux/.gitignore @@ -0,0 +1 @@ +flutter/ephemeral diff --git a/packages/firebase_core/firebase_core/example/linux/CMakeLists.txt b/packages/firebase_core/firebase_core/example/linux/CMakeLists.txt new file mode 100644 index 000000000000..3cccbe7a9c07 --- /dev/null +++ b/packages/firebase_core/firebase_core/example/linux/CMakeLists.txt @@ -0,0 +1,128 @@ +# Project-level configuration. +cmake_minimum_required(VERSION 3.13) +project(runner LANGUAGES CXX) + +# The name of the executable created for the application. Change this to change +# the on-disk name of your application. +set(BINARY_NAME "firebase_core_example") +# The unique GTK application identifier for this application. See: +# https://wiki.gnome.org/HowDoI/ChooseApplicationID +set(APPLICATION_ID "io.flutter.plugins.firebase_core_example") + +# Explicitly opt in to modern CMake behaviors to avoid warnings with recent +# versions of CMake. +cmake_policy(SET CMP0063 NEW) + +# Load bundled libraries from the lib/ directory relative to the binary. +set(CMAKE_INSTALL_RPATH "$ORIGIN/lib") + +# Root filesystem for cross-building. +if(FLUTTER_TARGET_PLATFORM_SYSROOT) + set(CMAKE_SYSROOT ${FLUTTER_TARGET_PLATFORM_SYSROOT}) + set(CMAKE_FIND_ROOT_PATH ${CMAKE_SYSROOT}) + set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER) + set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY) + set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY) + set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY) +endif() + +# Define build configuration options. +if(NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES) + set(CMAKE_BUILD_TYPE "Debug" CACHE + STRING "Flutter build mode" FORCE) + set_property(CACHE CMAKE_BUILD_TYPE PROPERTY STRINGS + "Debug" "Profile" "Release") +endif() + +# Compilation settings that should be applied to most targets. +# +# Be cautious about adding new options here, as plugins use this function by +# default. In most cases, you should add new options to specific targets instead +# of modifying this function. +function(APPLY_STANDARD_SETTINGS TARGET) + target_compile_features(${TARGET} PUBLIC cxx_std_14) + target_compile_options(${TARGET} PRIVATE -Wall -Werror) + target_compile_options(${TARGET} PRIVATE "$<$>:-O3>") + target_compile_definitions(${TARGET} PRIVATE "$<$>:NDEBUG>") +endfunction() + +# Flutter library and tool build rules. +set(FLUTTER_MANAGED_DIR "${CMAKE_CURRENT_SOURCE_DIR}/flutter") +add_subdirectory(${FLUTTER_MANAGED_DIR}) + +# System-level dependencies. +find_package(PkgConfig REQUIRED) +pkg_check_modules(GTK REQUIRED IMPORTED_TARGET gtk+-3.0) + +# Application build; see runner/CMakeLists.txt. +add_subdirectory("runner") + +# Run the Flutter tool portions of the build. This must not be removed. +add_dependencies(${BINARY_NAME} flutter_assemble) + +# Only the install-generated bundle's copy of the executable will launch +# correctly, since the resources must in the right relative locations. To avoid +# people trying to run the unbundled copy, put it in a subdirectory instead of +# the default top-level location. +set_target_properties(${BINARY_NAME} + PROPERTIES + RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/intermediates_do_not_run" +) + + +# Generated plugin build rules, which manage building the plugins and adding +# them to the application. +include(flutter/generated_plugins.cmake) + + +# === Installation === +# By default, "installing" just makes a relocatable bundle in the build +# directory. +set(BUILD_BUNDLE_DIR "${PROJECT_BINARY_DIR}/bundle") +if(CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT) + set(CMAKE_INSTALL_PREFIX "${BUILD_BUNDLE_DIR}" CACHE PATH "..." FORCE) +endif() + +# Start with a clean build bundle directory every time. +install(CODE " + file(REMOVE_RECURSE \"${BUILD_BUNDLE_DIR}/\") + " COMPONENT Runtime) + +set(INSTALL_BUNDLE_DATA_DIR "${CMAKE_INSTALL_PREFIX}/data") +set(INSTALL_BUNDLE_LIB_DIR "${CMAKE_INSTALL_PREFIX}/lib") + +install(TARGETS ${BINARY_NAME} RUNTIME DESTINATION "${CMAKE_INSTALL_PREFIX}" + COMPONENT Runtime) + +install(FILES "${FLUTTER_ICU_DATA_FILE}" DESTINATION "${INSTALL_BUNDLE_DATA_DIR}" + COMPONENT Runtime) + +install(FILES "${FLUTTER_LIBRARY}" DESTINATION "${INSTALL_BUNDLE_LIB_DIR}" + COMPONENT Runtime) + +foreach(bundled_library ${PLUGIN_BUNDLED_LIBRARIES}) + install(FILES "${bundled_library}" + DESTINATION "${INSTALL_BUNDLE_LIB_DIR}" + COMPONENT Runtime) +endforeach(bundled_library) + +# Copy the native assets provided by the build.dart from all packages. +set(NATIVE_ASSETS_DIR "${PROJECT_BUILD_DIR}native_assets/linux/") +install(DIRECTORY "${NATIVE_ASSETS_DIR}" + DESTINATION "${INSTALL_BUNDLE_LIB_DIR}" + COMPONENT Runtime) + +# Fully re-copy the assets directory on each build to avoid having stale files +# from a previous install. +set(FLUTTER_ASSET_DIR_NAME "flutter_assets") +install(CODE " + file(REMOVE_RECURSE \"${INSTALL_BUNDLE_DATA_DIR}/${FLUTTER_ASSET_DIR_NAME}\") + " COMPONENT Runtime) +install(DIRECTORY "${PROJECT_BUILD_DIR}/${FLUTTER_ASSET_DIR_NAME}" + DESTINATION "${INSTALL_BUNDLE_DATA_DIR}" COMPONENT Runtime) + +# Install the AOT library on non-Debug builds only. +if(NOT CMAKE_BUILD_TYPE MATCHES "Debug") + install(FILES "${AOT_LIBRARY}" DESTINATION "${INSTALL_BUNDLE_LIB_DIR}" + COMPONENT Runtime) +endif() diff --git a/packages/firebase_core/firebase_core/example/linux/flutter/CMakeLists.txt b/packages/firebase_core/firebase_core/example/linux/flutter/CMakeLists.txt new file mode 100644 index 000000000000..d5bd01648a96 --- /dev/null +++ b/packages/firebase_core/firebase_core/example/linux/flutter/CMakeLists.txt @@ -0,0 +1,88 @@ +# This file controls Flutter-level build steps. It should not be edited. +cmake_minimum_required(VERSION 3.10) + +set(EPHEMERAL_DIR "${CMAKE_CURRENT_SOURCE_DIR}/ephemeral") + +# Configuration provided via flutter tool. +include(${EPHEMERAL_DIR}/generated_config.cmake) + +# TODO: Move the rest of this into files in ephemeral. See +# https://github.com/flutter/flutter/issues/57146. + +# Serves the same purpose as list(TRANSFORM ... PREPEND ...), +# which isn't available in 3.10. +function(list_prepend LIST_NAME PREFIX) + set(NEW_LIST "") + foreach(element ${${LIST_NAME}}) + list(APPEND NEW_LIST "${PREFIX}${element}") + endforeach(element) + set(${LIST_NAME} "${NEW_LIST}" PARENT_SCOPE) +endfunction() + +# === Flutter Library === +# System-level dependencies. +find_package(PkgConfig REQUIRED) +pkg_check_modules(GTK REQUIRED IMPORTED_TARGET gtk+-3.0) +pkg_check_modules(GLIB REQUIRED IMPORTED_TARGET glib-2.0) +pkg_check_modules(GIO REQUIRED IMPORTED_TARGET gio-2.0) + +set(FLUTTER_LIBRARY "${EPHEMERAL_DIR}/libflutter_linux_gtk.so") + +# Published to parent scope for install step. +set(FLUTTER_LIBRARY ${FLUTTER_LIBRARY} PARENT_SCOPE) +set(FLUTTER_ICU_DATA_FILE "${EPHEMERAL_DIR}/icudtl.dat" PARENT_SCOPE) +set(PROJECT_BUILD_DIR "${PROJECT_DIR}/build/" PARENT_SCOPE) +set(AOT_LIBRARY "${PROJECT_DIR}/build/lib/libapp.so" PARENT_SCOPE) + +list(APPEND FLUTTER_LIBRARY_HEADERS + "fl_basic_message_channel.h" + "fl_binary_codec.h" + "fl_binary_messenger.h" + "fl_dart_project.h" + "fl_engine.h" + "fl_json_message_codec.h" + "fl_json_method_codec.h" + "fl_message_codec.h" + "fl_method_call.h" + "fl_method_channel.h" + "fl_method_codec.h" + "fl_method_response.h" + "fl_plugin_registrar.h" + "fl_plugin_registry.h" + "fl_standard_message_codec.h" + "fl_standard_method_codec.h" + "fl_string_codec.h" + "fl_value.h" + "fl_view.h" + "flutter_linux.h" +) +list_prepend(FLUTTER_LIBRARY_HEADERS "${EPHEMERAL_DIR}/flutter_linux/") +add_library(flutter INTERFACE) +target_include_directories(flutter INTERFACE + "${EPHEMERAL_DIR}" +) +target_link_libraries(flutter INTERFACE "${FLUTTER_LIBRARY}") +target_link_libraries(flutter INTERFACE + PkgConfig::GTK + PkgConfig::GLIB + PkgConfig::GIO +) +add_dependencies(flutter flutter_assemble) + +# === Flutter tool backend === +# _phony_ is a non-existent file to force this command to run every time, +# since currently there's no way to get a full input/output list from the +# flutter tool. +add_custom_command( + OUTPUT ${FLUTTER_LIBRARY} ${FLUTTER_LIBRARY_HEADERS} + ${CMAKE_CURRENT_BINARY_DIR}/_phony_ + COMMAND ${CMAKE_COMMAND} -E env + ${FLUTTER_TOOL_ENVIRONMENT} + "${FLUTTER_ROOT}/packages/flutter_tools/bin/tool_backend.sh" + ${FLUTTER_TARGET_PLATFORM} ${CMAKE_BUILD_TYPE} + VERBATIM +) +add_custom_target(flutter_assemble DEPENDS + "${FLUTTER_LIBRARY}" + ${FLUTTER_LIBRARY_HEADERS} +) diff --git a/packages/firebase_core/firebase_core/example/linux/runner/CMakeLists.txt b/packages/firebase_core/firebase_core/example/linux/runner/CMakeLists.txt new file mode 100644 index 000000000000..e97dabc7028e --- /dev/null +++ b/packages/firebase_core/firebase_core/example/linux/runner/CMakeLists.txt @@ -0,0 +1,26 @@ +cmake_minimum_required(VERSION 3.13) +project(runner LANGUAGES CXX) + +# Define the application target. To change its name, change BINARY_NAME in the +# top-level CMakeLists.txt, not the value here, or `flutter run` will no longer +# work. +# +# Any new source files that you add to the application should be added here. +add_executable(${BINARY_NAME} + "main.cc" + "my_application.cc" + "${FLUTTER_MANAGED_DIR}/generated_plugin_registrant.cc" +) + +# Apply the standard set of build settings. This can be removed for applications +# that need different build settings. +apply_standard_settings(${BINARY_NAME}) + +# Add preprocessor definitions for the application ID. +add_definitions(-DAPPLICATION_ID="${APPLICATION_ID}") + +# Add dependency libraries. Add any application-specific dependencies here. +target_link_libraries(${BINARY_NAME} PRIVATE flutter) +target_link_libraries(${BINARY_NAME} PRIVATE PkgConfig::GTK) + +target_include_directories(${BINARY_NAME} PRIVATE "${CMAKE_SOURCE_DIR}") diff --git a/packages/firebase_core/firebase_core/example/linux/runner/main.cc b/packages/firebase_core/firebase_core/example/linux/runner/main.cc new file mode 100644 index 000000000000..54fde7b87fa0 --- /dev/null +++ b/packages/firebase_core/firebase_core/example/linux/runner/main.cc @@ -0,0 +1,10 @@ +// Copyright 2026, the Chromium project authors. Please see the AUTHORS file +// for details. All rights reserved. Use of this source code is governed by a +// BSD-style license that can be found in the LICENSE file. + +#include "my_application.h" + +int main(int argc, char** argv) { + g_autoptr(MyApplication) app = my_application_new(); + return g_application_run(G_APPLICATION(app), argc, argv); +} diff --git a/packages/firebase_core/firebase_core/example/linux/runner/my_application.cc b/packages/firebase_core/firebase_core/example/linux/runner/my_application.cc new file mode 100644 index 000000000000..975a69f484f8 --- /dev/null +++ b/packages/firebase_core/firebase_core/example/linux/runner/my_application.cc @@ -0,0 +1,152 @@ +// Copyright 2026, the Chromium project authors. Please see the AUTHORS file +// for details. All rights reserved. Use of this source code is governed by a +// BSD-style license that can be found in the LICENSE file. + +#include "my_application.h" + +#include +#ifdef GDK_WINDOWING_X11 +#include +#endif + +#include "flutter/generated_plugin_registrant.h" + +struct _MyApplication { + GtkApplication parent_instance; + char** dart_entrypoint_arguments; +}; + +G_DEFINE_TYPE(MyApplication, my_application, GTK_TYPE_APPLICATION) + +// Called when first Flutter frame received. +static void first_frame_cb(MyApplication* self, FlView* view) { + gtk_widget_show(gtk_widget_get_toplevel(GTK_WIDGET(view))); +} + +// Implements GApplication::activate. +static void my_application_activate(GApplication* application) { + MyApplication* self = MY_APPLICATION(application); + GtkWindow* window = + GTK_WINDOW(gtk_application_window_new(GTK_APPLICATION(application))); + + // Use a header bar when running in GNOME as this is the common style used + // by applications and is the setup most users will be using (e.g. Ubuntu + // desktop). + // If running on X and not using GNOME then just use a traditional title bar + // in case the window manager does more exotic layout, e.g. tiling. + // If running on Wayland assume the header bar will work (may need changing + // if future cases occur). + gboolean use_header_bar = TRUE; +#ifdef GDK_WINDOWING_X11 + GdkScreen* screen = gtk_window_get_screen(window); + if (GDK_IS_X11_SCREEN(screen)) { + const gchar* wm_name = gdk_x11_screen_get_window_manager_name(screen); + if (g_strcmp0(wm_name, "GNOME Shell") != 0) { + use_header_bar = FALSE; + } + } +#endif + if (use_header_bar) { + GtkHeaderBar* header_bar = GTK_HEADER_BAR(gtk_header_bar_new()); + gtk_widget_show(GTK_WIDGET(header_bar)); + gtk_header_bar_set_title(header_bar, "firebase_core_example"); + gtk_header_bar_set_show_close_button(header_bar, TRUE); + gtk_window_set_titlebar(window, GTK_WIDGET(header_bar)); + } else { + gtk_window_set_title(window, "firebase_core_example"); + } + + gtk_window_set_default_size(window, 1280, 720); + + g_autoptr(FlDartProject) project = fl_dart_project_new(); + fl_dart_project_set_dart_entrypoint_arguments( + project, self->dart_entrypoint_arguments); + + FlView* view = fl_view_new(project); + GdkRGBA background_color; + // Background defaults to black, override it here if necessary, e.g. #00000000 + // for transparent. + gdk_rgba_parse(&background_color, "#000000"); + fl_view_set_background_color(view, &background_color); + gtk_widget_show(GTK_WIDGET(view)); + gtk_container_add(GTK_CONTAINER(window), GTK_WIDGET(view)); + + // Show the window when Flutter renders. + // Requires the view to be realized so we can start rendering. + g_signal_connect_swapped(view, "first-frame", G_CALLBACK(first_frame_cb), + self); + gtk_widget_realize(GTK_WIDGET(view)); + + fl_register_plugins(FL_PLUGIN_REGISTRY(view)); + + gtk_widget_grab_focus(GTK_WIDGET(view)); +} + +// Implements GApplication::local_command_line. +static gboolean my_application_local_command_line(GApplication* application, + gchar*** arguments, + int* exit_status) { + MyApplication* self = MY_APPLICATION(application); + // Strip out the first argument as it is the binary name. + self->dart_entrypoint_arguments = g_strdupv(*arguments + 1); + + g_autoptr(GError) error = nullptr; + if (!g_application_register(application, nullptr, &error)) { + g_warning("Failed to register: %s", error->message); + *exit_status = 1; + return TRUE; + } + + g_application_activate(application); + *exit_status = 0; + + return TRUE; +} + +// Implements GApplication::startup. +static void my_application_startup(GApplication* application) { + // MyApplication* self = MY_APPLICATION(object); + + // Perform any actions required at application startup. + + G_APPLICATION_CLASS(my_application_parent_class)->startup(application); +} + +// Implements GApplication::shutdown. +static void my_application_shutdown(GApplication* application) { + // MyApplication* self = MY_APPLICATION(object); + + // Perform any actions required at application shutdown. + + G_APPLICATION_CLASS(my_application_parent_class)->shutdown(application); +} + +// Implements GObject::dispose. +static void my_application_dispose(GObject* object) { + MyApplication* self = MY_APPLICATION(object); + g_clear_pointer(&self->dart_entrypoint_arguments, g_strfreev); + G_OBJECT_CLASS(my_application_parent_class)->dispose(object); +} + +static void my_application_class_init(MyApplicationClass* klass) { + G_APPLICATION_CLASS(klass)->activate = my_application_activate; + G_APPLICATION_CLASS(klass)->local_command_line = + my_application_local_command_line; + G_APPLICATION_CLASS(klass)->startup = my_application_startup; + G_APPLICATION_CLASS(klass)->shutdown = my_application_shutdown; + G_OBJECT_CLASS(klass)->dispose = my_application_dispose; +} + +static void my_application_init(MyApplication* self) {} + +MyApplication* my_application_new() { + // Set the program name to the application ID, which helps various systems + // like GTK and desktop environments map this running application to its + // corresponding .desktop file. This ensures better integration by allowing + // the application to be recognized beyond its binary name. + g_set_prgname(APPLICATION_ID); + + return MY_APPLICATION(g_object_new(my_application_get_type(), + "application-id", APPLICATION_ID, "flags", + G_APPLICATION_NON_UNIQUE, nullptr)); +} diff --git a/packages/firebase_core/firebase_core/example/linux/runner/my_application.h b/packages/firebase_core/firebase_core/example/linux/runner/my_application.h new file mode 100644 index 000000000000..a2ba75695cf5 --- /dev/null +++ b/packages/firebase_core/firebase_core/example/linux/runner/my_application.h @@ -0,0 +1,22 @@ +// Copyright 2026, the Chromium project authors. Please see the AUTHORS file +// for details. All rights reserved. Use of this source code is governed by a +// BSD-style license that can be found in the LICENSE file. + +#ifndef FLUTTER_MY_APPLICATION_H_ +#define FLUTTER_MY_APPLICATION_H_ + +#include + +G_DECLARE_FINAL_TYPE(MyApplication, my_application, MY, APPLICATION, + GtkApplication) + +/** + * my_application_new: + * + * Creates a new Flutter-based application. + * + * Returns: a new #MyApplication. + */ +MyApplication* my_application_new(); + +#endif // FLUTTER_MY_APPLICATION_H_ diff --git a/packages/firebase_core/firebase_core/linux/CMakeLists.txt b/packages/firebase_core/firebase_core/linux/CMakeLists.txt new file mode 100644 index 000000000000..e9953a941e8b --- /dev/null +++ b/packages/firebase_core/firebase_core/linux/CMakeLists.txt @@ -0,0 +1,217 @@ +# The Flutter tooling requires that developers have CMake 3.10 or later +# installed. You should not increase this version, as doing so will cause +# the plugin to fail to compile for some customers of the plugin. +cmake_minimum_required(VERSION 3.10) + +set(FIREBASE_SDK_VERSION "13.5.0") + +if (EXISTS $ENV{FIREBASE_CPP_SDK_DIR}/include/firebase/version.h) + file(READ "$ENV{FIREBASE_CPP_SDK_DIR}/include/firebase/version.h" existing_version) + + string(REGEX MATCH "FIREBASE_VERSION_MAJOR ([0-9]*)" _ ${existing_version}) + set(existing_version_major ${CMAKE_MATCH_1}) + + string(REGEX MATCH "FIREBASE_VERSION_MINOR ([0-9]*)" _ ${existing_version}) + set(existing_version_minor ${CMAKE_MATCH_1}) + + string(REGEX MATCH "FIREBASE_VERSION_REVISION ([0-9]*)" _ ${existing_version}) + set(existing_version_revision ${CMAKE_MATCH_1}) + + set(existing_version "${existing_version_major}.${existing_version_minor}.${existing_version_revision}") +endif() + +if(existing_version VERSION_EQUAL FIREBASE_SDK_VERSION) + message(STATUS "Found Firebase SDK version ${existing_version}") + set(FIREBASE_CPP_SDK_DIR $ENV{FIREBASE_CPP_SDK_DIR}) +else() + # There is no Linux-specific archive; the full firebase_cpp_sdk zip ships + # prebuilt Linux x86_64 static libraries (both C++11 and legacy ABI + # variants) and a CMakeLists.txt that selects the correct variant when + # consumed via add_subdirectory, just like the Windows archive does. + set(firebase_sdk_url "https://dl.google.com/firebase/sdk/cpp/firebase_cpp_sdk_${FIREBASE_SDK_VERSION}.zip") + set(firebase_sdk_filename "${CMAKE_BINARY_DIR}/firebase_cpp_sdk_${FIREBASE_SDK_VERSION}.zip") + set(extracted_path "${CMAKE_BINARY_DIR}/extracted") + if(NOT EXISTS ${firebase_sdk_filename}) + file(DOWNLOAD ${firebase_sdk_url} ${firebase_sdk_filename} + SHOW_PROGRESS + STATUS download_status + LOG download_log) + list(GET download_status 0 status_code) + if(NOT status_code EQUAL 0) + message(FATAL_ERROR "Download failed: ${download_log}") + endif() + else() + message(STATUS "Using cached Firebase SDK zip file") + endif() + + if(NOT EXISTS ${extracted_path}) + file(MAKE_DIRECTORY ${extracted_path}) + file(ARCHIVE_EXTRACT INPUT ${firebase_sdk_filename} + DESTINATION ${extracted_path}) + else() + message(STATUS "Using cached extracted Firebase SDK") + endif() + set(FIREBASE_CPP_SDK_DIR "${extracted_path}/firebase_cpp_sdk") +endif() + +# Project-level configuration. +set(PROJECT_NAME "firebase_core") +project(${PROJECT_NAME} LANGUAGES CXX) + +# This value is used when generating builds using this plugin, so it must +# not be changed +set(PLUGIN_NAME "firebase_core_plugin") + +# Any new source files that you add to the plugin should be added here. +list(APPEND PLUGIN_SOURCES + "include/firebase_core/firebase_core_plugin.h" + "include/firebase_core/flutter_firebase_plugin.h" + "firebase_core_plugin.cc" + "messages.g.cc" + "messages.g.h" + "flutter_firebase_plugin_registry.h" + "flutter_firebase_plugin_registry.cc" +) + +# Read version from pubspec.yaml +file(STRINGS "../pubspec.yaml" pubspec_content) +foreach(line ${pubspec_content}) + string(FIND ${line} "version: " has_version) + + if("${has_version}" STREQUAL "0") + string(FIND ${line} ": " version_start_pos) + math(EXPR version_start_pos "${version_start_pos} + 2") + string(LENGTH ${line} version_end_pos) + math(EXPR len "${version_end_pos} - ${version_start_pos}") + string(SUBSTRING ${line} ${version_start_pos} ${len} PLUGIN_VERSION) + break() + endif() +endforeach(line) + +configure_file(plugin_version.h.in ${CMAKE_BINARY_DIR}/generated/firebase_core/plugin_version.h) +include_directories(${CMAKE_BINARY_DIR}/generated/) + +# Define the plugin library target. Its name must not be changed (see comment +# on PLUGIN_NAME above). +# +# This is deliberately a STATIC library (unlike the SHARED library in the +# Flutter Linux plugin template) to mirror the Windows implementation: +# - The Firebase C++ SDK ships prebuilt static libraries. If each FlutterFire +# plugin were a separate shared library, every plugin .so would embed its +# own copy of firebase_app and its global app registry, breaking the +# cross-plugin sharing of firebase::App instances. Linking everything +# statically into the runner keeps a single copy of the SDK state. +# - Other FlutterFire plugins link against this target and reuse the +# FlutterFirebasePluginRegistry defined here, which requires a single +# static registry in the final executable. +# The Flutter tooling links the plugin target into the runner directly +# (target_link_libraries(${BINARY_NAME} PRIVATE ${plugin}_plugin)), so a +# STATIC library resolves at the final link. POSITION_INDEPENDENT_CODE is +# enabled below because the runner executable is built as PIE. +add_library(${PLUGIN_NAME} STATIC + ${PLUGIN_SOURCES} + ${CMAKE_BINARY_DIR}/generated/firebase_core/plugin_version.h +) + +# Apply a standard set of build settings that are configured in the +# application-level CMakeLists.txt. This can be removed for plugins that want +# full control over build settings. +apply_standard_settings(${PLUGIN_NAME}) + +# Symbols are hidden by default to reduce the chance of accidental conflicts +# between plugins. This should not be removed; any symbols that should be +# exported should be explicitly exported with the FLUTTER_PLUGIN_EXPORT macro. +set_target_properties(${PLUGIN_NAME} PROPERTIES + CXX_VISIBILITY_PRESET hidden + POSITION_INDEPENDENT_CODE ON) +target_compile_definitions(${PLUGIN_NAME} PUBLIC FLUTTER_PLUGIN_IMPL) + +# Enable firebase-cpp-sdk's platform logging api. +target_compile_definitions(${PLUGIN_NAME} PRIVATE -DINTERNAL_EXPERIMENTAL=1) + +add_subdirectory(${FIREBASE_CPP_SDK_DIR} bin/ EXCLUDE_FROM_ALL) +# PUBLIC (not INTERFACE): this target's own sources need the SDK headers too, +# since the imported SDK targets (which carry INTERFACE_INCLUDE_DIRECTORIES) +# are no longer linked directly - see the link strategy note below. +target_include_directories(${PLUGIN_NAME} PUBLIC + "${FIREBASE_CPP_SDK_DIR}/include") + +# Note: unlike the Windows CMakeLists there is no Debug->Release +# IMPORTED_LOCATION fixup here. The Linux SDK archive does not split its +# prebuilt libraries into Debug/Release directories; the SDK's own +# CMakeLists.txt selects the correct library variant +# (libs/linux///*.a) when consumed via add_subdirectory. + +# --- Firebase SDK link strategy --------------------------------------------- +# The prebuilt Firebase static archives have circular symbol dependencies: +# - the product libraries (app_check, remote_config, storage, ...) call +# firebase::rest::* helpers that live in libfirebase_app.a, and +# - libfirebase_firestore.a references firebase::g_auth_initializer defined +# in libfirebase_auth.a. +# A plain ordered link line cannot satisfy every plugin combination, so this +# target - which every FlutterFire Linux plugin links against - owns the SDK +# link and wraps ALL desktop product archives in a single +# --start-group/--end-group so the linker rescans the group until every +# reference resolves, regardless of order. Archives that no plugin actually +# references contribute nothing to the final binary. +set(FIREBASE_SDK_TARGETS + firebase_auth + firebase_app_check + firebase_database + firebase_firestore + firebase_functions + firebase_remote_config + firebase_storage + firebase_app +) +set(firebase_sdk_lib_paths "") +foreach(firebase_lib IN LISTS FIREBASE_SDK_TARGETS) + if(TARGET ${firebase_lib}) + get_target_property(firebase_lib_path ${firebase_lib} IMPORTED_LOCATION) + if(firebase_lib_path) + list(APPEND firebase_sdk_lib_paths "${firebase_lib_path}") + endif() + endif() +endforeach() + +target_link_libraries(${PLUGIN_NAME} PUBLIC + "-Wl,--start-group" ${firebase_sdk_lib_paths} "-Wl,--end-group") + +# System library dependencies of the archives above, placed after the group: +# - libsecret for Auth credential persistence. The SDK's CMakeLists attaches +# it to the imported firebase_auth target as INTERFACE_LINK_LIBRARIES, so +# forward that usage requirement here (the imported targets themselves are +# only used to resolve archive paths and are not linked directly). +# - OpenSSL for Realtime Database (TLS websockets) and Firestore (LevelDB +# encryption); the prebuilt Linux archives reference system OpenSSL +# symbols, matching the Firebase desktop setup documentation. +if(TARGET firebase_auth) + get_target_property(firebase_auth_iface_libs firebase_auth + INTERFACE_LINK_LIBRARIES) + if(firebase_auth_iface_libs) + target_link_libraries(${PLUGIN_NAME} PUBLIC ${firebase_auth_iface_libs}) + endif() +endif() +find_package(OpenSSL QUIET) +if(OPENSSL_FOUND) + target_link_libraries(${PLUGIN_NAME} PUBLIC OpenSSL::SSL OpenSSL::Crypto) +else() + message(WARNING "OpenSSL development libraries not found; linking may fail \ +for apps using firebase_database or cloud_firestore. Install libssl-dev \ +(Debian/Ubuntu) or openssl (Arch/Fedora).") +endif() + +target_link_libraries(${PLUGIN_NAME} PUBLIC pthread) + +target_include_directories(${PLUGIN_NAME} INTERFACE + "${CMAKE_CURRENT_SOURCE_DIR}/include") +target_link_libraries(${PLUGIN_NAME} PRIVATE flutter) +target_link_libraries(${PLUGIN_NAME} PRIVATE PkgConfig::GTK) + +# List of absolute paths to libraries that should be bundled with the plugin. +# This list could contain prebuilt libraries, or libraries created by an +# external build triggered from this build file. +set(firebase_core_bundled_libraries + "" + PARENT_SCOPE +) diff --git a/packages/firebase_core/firebase_core/linux/firebase_core_plugin.cc b/packages/firebase_core/firebase_core/linux/firebase_core_plugin.cc new file mode 100644 index 000000000000..1525cfdf0d95 --- /dev/null +++ b/packages/firebase_core/firebase_core/linux/firebase_core_plugin.cc @@ -0,0 +1,249 @@ +// Copyright 2026, the Chromium project authors. Please see the AUTHORS file +// for details. All rights reserved. Use of this source code is governed by a +// BSD-style license that can be found in the LICENSE file. + +#include "include/firebase_core/firebase_core_plugin.h" + +#include + +#include +#include + +#include "firebase/app.h" +#include "firebase_core/plugin_version.h" +#include "flutter_firebase_plugin_registry.h" +#include "messages.g.h" + +using ::firebase::App; + +static const char kLibraryName[] = "flutter-fire-core"; + +#define FIREBASE_CORE_PLUGIN(obj) \ + (G_TYPE_CHECK_INSTANCE_CAST((obj), firebase_core_plugin_get_type(), \ + FirebaseCorePlugin)) + +struct _FirebaseCorePlugin { + GObject parent_instance; + + // Whether initializeCore has already been called once for this Dart + // isolate; a second call means a hot restart occurred. + bool core_initialized; +}; + +G_DEFINE_TYPE(FirebaseCorePlugin, firebase_core_plugin, g_object_get_type()) + +// Convert a FirebaseCoreCoreFirebaseOptions to a firebase::AppOptions. +static firebase::AppOptions CoreFirebaseOptionsToAppOptions( + FirebaseCoreCoreFirebaseOptions* pigeon_options) { + firebase::AppOptions options; + options.set_api_key( + firebase_core_core_firebase_options_get_api_key(pigeon_options)); + options.set_app_id( + firebase_core_core_firebase_options_get_app_id(pigeon_options)); + const gchar* database_url = + firebase_core_core_firebase_options_get_database_u_r_l(pigeon_options); + if (database_url != nullptr) { + options.set_database_url(database_url); + } + const gchar* tracking_id = + firebase_core_core_firebase_options_get_tracking_id(pigeon_options); + if (tracking_id != nullptr) { + options.set_ga_tracking_id(tracking_id); + } + options.set_messaging_sender_id( + firebase_core_core_firebase_options_get_messaging_sender_id( + pigeon_options)); + + options.set_project_id( + firebase_core_core_firebase_options_get_project_id(pigeon_options)); + + const gchar* storage_bucket = + firebase_core_core_firebase_options_get_storage_bucket(pigeon_options); + if (storage_bucket != nullptr) { + options.set_storage_bucket(storage_bucket); + } + return options; +} + +// Convert a firebase::AppOptions to FirebaseCoreCoreFirebaseOptions. +// Ownership: returns a new reference (transfer full). +static FirebaseCoreCoreFirebaseOptions* OptionsFromFIROptions( + const firebase::AppOptions& options) { + // AppOptions initialises as empty char so we check to stop empty string to + // Flutter. Same for storage bucket below. + const char* database_url = options.database_url(); + if (database_url != nullptr && database_url[0] == '\0') { + database_url = nullptr; + } + const char* storage_bucket = options.storage_bucket(); + if (storage_bucket != nullptr && storage_bucket[0] == '\0') { + storage_bucket = nullptr; + } + return firebase_core_core_firebase_options_new( + options.api_key(), options.app_id(), options.messaging_sender_id(), + options.project_id(), + /* auth_domain= */ nullptr, database_url, storage_bucket, + /* measurement_id= */ nullptr, /* tracking_id= */ nullptr, + /* deep_link_u_r_l_scheme= */ nullptr, + /* android_client_id= */ nullptr, /* ios_client_id= */ nullptr, + /* ios_bundle_id= */ nullptr, /* app_group_id= */ nullptr, + /* recaptcha_site_key= */ nullptr); +} + +// Convert a firebase::App to FirebaseCoreCoreInitializeResponse. +// Ownership: returns a new reference (transfer full). +static FirebaseCoreCoreInitializeResponse* AppToCoreInitializeResponse( + const App& app) { + g_autoptr(FlValue) plugin_constants = firebase_core_linux:: + FlutterFirebasePluginRegistry::GetPluginConstantsForFirebaseApp(app); + g_autoptr(FirebaseCoreCoreFirebaseOptions) options = + OptionsFromFIROptions(app.options()); + return firebase_core_core_initialize_response_new( + app.name(), options, + /* is_automatic_data_collection_enabled= */ nullptr, plugin_constants); +} + +// FirebaseCoreHostApi + +static void HandleInitializeApp( + const gchar* app_name, + FirebaseCoreCoreFirebaseOptions* initialize_app_request, + FirebaseCoreFirebaseCoreHostApiResponseHandle* response_handle, + gpointer user_data) { + // Create an app + App* app = App::Create( + CoreFirebaseOptionsToAppOptions(initialize_app_request), app_name); + + // Send back the result to Flutter + g_autoptr(FirebaseCoreCoreInitializeResponse) response = + AppToCoreInitializeResponse(*app); + firebase_core_firebase_core_host_api_respond_initialize_app(response_handle, + response); +} + +static void HandleInitializeCore( + FirebaseCoreFirebaseCoreHostApiResponseHandle* response_handle, + gpointer user_data) { + FirebaseCorePlugin* self = FIREBASE_CORE_PLUGIN(user_data); + if (self->core_initialized) { + firebase_core_linux::FlutterFirebasePluginRegistry:: + DidReinitializeFirebaseCore(); + } + self->core_initialized = true; + + g_autoptr(FlValue) initialized_apps = fl_value_new_list(); + std::vector all_apps = App::GetApps(); + for (const App* app : all_apps) { + g_autoptr(FirebaseCoreCoreInitializeResponse) response = + AppToCoreInitializeResponse(*app); + fl_value_append_take(initialized_apps, + fl_value_new_custom_object( + firebase_core_core_initialize_response_type_id, + G_OBJECT(response))); + } + firebase_core_firebase_core_host_api_respond_initialize_core( + response_handle, initialized_apps); +} + +static void HandleOptionsFromResource( + FirebaseCoreFirebaseCoreHostApiResponseHandle* response_handle, + gpointer user_data) { + // optionsFromResource reads platform resource files (e.g. + // google-services.json on Android) and has no equivalent on Linux desktop. + // Windows leaves the reply pending forever; responding with an error is a + // deliberate improvement so callers do not hang. + firebase_core_firebase_core_host_api_respond_error_options_from_resource( + response_handle, "unimplemented", + "optionsFromResource is not supported on Linux", nullptr); +} + +// FirebaseAppHostApi + +static void HandleSetAutomaticDataCollectionEnabled( + const gchar* app_name, gboolean enabled, + FirebaseCoreFirebaseAppHostApiResponseHandle* response_handle, + gpointer user_data) { + App* firebase_app = App::GetInstance(app_name); + if (firebase_app != nullptr) { + // TODO: Missing method + } + firebase_core_firebase_app_host_api_respond_set_automatic_data_collection_enabled( + response_handle); +} + +static void HandleSetAutomaticResourceManagementEnabled( + const gchar* app_name, gboolean enabled, + FirebaseCoreFirebaseAppHostApiResponseHandle* response_handle, + gpointer user_data) { + App* firebase_app = App::GetInstance(app_name); + if (firebase_app != nullptr) { + // TODO: Missing method + } + firebase_core_firebase_app_host_api_respond_set_automatic_resource_management_enabled( + response_handle); +} + +static void HandleDelete( + const gchar* app_name, + FirebaseCoreFirebaseAppHostApiResponseHandle* response_handle, + gpointer user_data) { + App* firebase_app = App::GetInstance(app_name); + if (firebase_app != nullptr) { + // Improvement over the Windows implementation (which is a TODO no-op): + // the C++ SDK supports destroying an app on desktop; deleting the + // firebase::App instance unregisters it from the app registry. + delete firebase_app; + } + firebase_core_firebase_app_host_api_respond_delete(response_handle); +} + +static const FirebaseCoreFirebaseCoreHostApiVTable kFirebaseCoreHostApiVTable = + { + HandleInitializeApp, // initialize_app + HandleInitializeCore, // initialize_core + HandleOptionsFromResource, // options_from_resource +}; + +static const FirebaseCoreFirebaseAppHostApiVTable kFirebaseAppHostApiVTable = { + HandleSetAutomaticDataCollectionEnabled, // set_automatic_data_collection_enabled + HandleSetAutomaticResourceManagementEnabled, // set_automatic_resource_management_enabled + HandleDelete, // delete_ +}; + +static void firebase_core_plugin_dispose(GObject* object) { + G_OBJECT_CLASS(firebase_core_plugin_parent_class)->dispose(object); +} + +static void firebase_core_plugin_class_init(FirebaseCorePluginClass* klass) { + G_OBJECT_CLASS(klass)->dispose = firebase_core_plugin_dispose; +} + +static void firebase_core_plugin_init(FirebaseCorePlugin* self) { + self->core_initialized = false; +} + +void firebase_core_plugin_register_with_registrar( + FlPluginRegistrar* registrar) { + FirebaseCorePlugin* plugin = FIREBASE_CORE_PLUGIN( + g_object_new(firebase_core_plugin_get_type(), nullptr)); + + FlBinaryMessenger* messenger = fl_plugin_registrar_get_messenger(registrar); + firebase_core_firebase_core_host_api_set_method_handlers( + messenger, /* suffix= */ nullptr, &kFirebaseCoreHostApiVTable, + g_object_ref(plugin), g_object_unref); + firebase_core_firebase_app_host_api_set_method_handlers( + messenger, /* suffix= */ nullptr, &kFirebaseAppHostApiVTable, + g_object_ref(plugin), g_object_unref); + + g_object_unref(plugin); + + // Register for platform logging + App::RegisterLibrary( + kLibraryName, firebase_core_linux::getPluginVersion().c_str(), nullptr); +} + +void RegisterFlutterFirebasePlugin(const std::string& channel_name, + FlutterFirebasePlugin* plugin) { + firebase_core_linux::FlutterFirebasePluginRegistry::RegisterPlugin( + channel_name, plugin); +} diff --git a/packages/firebase_core/firebase_core/linux/flutter_firebase_plugin_registry.cc b/packages/firebase_core/firebase_core/linux/flutter_firebase_plugin_registry.cc new file mode 100644 index 000000000000..155d9da34610 --- /dev/null +++ b/packages/firebase_core/firebase_core/linux/flutter_firebase_plugin_registry.cc @@ -0,0 +1,40 @@ +// Copyright 2026, the Chromium project authors. Please see the AUTHORS file +// for details. All rights reserved. Use of this source code is governed by a +// BSD-style license that can be found in the LICENSE file. + +#include "flutter_firebase_plugin_registry.h" + +namespace firebase_core_linux { + +std::unordered_map& +FlutterFirebasePluginRegistry::GetRegisteredPlugins() { + static std::unordered_map plugins; + return plugins; +} + +void FlutterFirebasePluginRegistry::RegisterPlugin( + const std::string& channel_name, FlutterFirebasePlugin* plugin) { + GetRegisteredPlugins()[channel_name] = plugin; +} + +FlValue* FlutterFirebasePluginRegistry::GetPluginConstantsForFirebaseApp( + const firebase::App& app) { + FlValue* all_constants = fl_value_new_map(); + for (const auto& entry : GetRegisteredPlugins()) { + // GetPluginConstantsForFirebaseApp returns a new reference (transfer + // full); fl_value_set_take assumes ownership of both key and value. + FlValue* plugin_constants = + entry.second->GetPluginConstantsForFirebaseApp(app); + fl_value_set_take(all_constants, fl_value_new_string(entry.first.c_str()), + plugin_constants); + } + return all_constants; +} + +void FlutterFirebasePluginRegistry::DidReinitializeFirebaseCore() { + for (const auto& entry : GetRegisteredPlugins()) { + entry.second->DidReinitializeFirebaseCore(); + } +} + +} // namespace firebase_core_linux diff --git a/packages/firebase_core/firebase_core/linux/flutter_firebase_plugin_registry.h b/packages/firebase_core/firebase_core/linux/flutter_firebase_plugin_registry.h new file mode 100644 index 000000000000..6962d0f0eed5 --- /dev/null +++ b/packages/firebase_core/firebase_core/linux/flutter_firebase_plugin_registry.h @@ -0,0 +1,46 @@ +// Copyright 2026, the Chromium project authors. Please see the AUTHORS file +// for details. All rights reserved. Use of this source code is governed by a +// BSD-style license that can be found in the LICENSE file. + +#ifndef FLUTTER_FIREBASE_PLUGIN_REGISTRY_H_ +#define FLUTTER_FIREBASE_PLUGIN_REGISTRY_H_ + +#include + +#include +#include + +#include "firebase/app.h" +#include "include/firebase_core/flutter_firebase_plugin.h" + +namespace firebase_core_linux { + +// Static registry that collects plugin constants from all registered Firebase +// plugins during initializeCore, mirroring Android's +// FlutterFirebasePluginRegistry. +class FlutterFirebasePluginRegistry { + public: + // Registers a plugin with the given channel name. + static void RegisterPlugin(const std::string& channel_name, + FlutterFirebasePlugin* plugin); + + // Collects constants from all registered plugins for the given app. + // Returns a map keyed by channel name, with each value being the plugin's + // constants map. + // + // Ownership: returns a new FlValue* map with a reference owned by the + // caller (transfer full); release it with fl_value_unref() or wrap it in + // g_autoptr(FlValue). + static FlValue* GetPluginConstantsForFirebaseApp(const firebase::App& app); + + // Notifies all registered plugins that Firebase core was re-initialized. + static void DidReinitializeFirebaseCore(); + + private: + static std::unordered_map& + GetRegisteredPlugins(); +}; + +} // namespace firebase_core_linux + +#endif // FLUTTER_FIREBASE_PLUGIN_REGISTRY_H_ diff --git a/packages/firebase_core/firebase_core/linux/include/firebase_core/firebase_core_plugin.h b/packages/firebase_core/firebase_core/linux/include/firebase_core/firebase_core_plugin.h new file mode 100644 index 000000000000..f09f86cb6e17 --- /dev/null +++ b/packages/firebase_core/firebase_core/linux/include/firebase_core/firebase_core_plugin.h @@ -0,0 +1,46 @@ +/* + * Copyright 2026, the Chromium project authors. Please see the AUTHORS file + * for details. All rights reserved. Use of this source code is governed by a + * BSD-style license that can be found in the LICENSE file. + */ + +#ifndef FLUTTER_PLUGIN_FIREBASE_CORE_PLUGIN_H_ +#define FLUTTER_PLUGIN_FIREBASE_CORE_PLUGIN_H_ + +#include + +G_BEGIN_DECLS + +#ifdef FLUTTER_PLUGIN_IMPL +#define FLUTTER_PLUGIN_EXPORT __attribute__((visibility("default"))) +#else +#define FLUTTER_PLUGIN_EXPORT +#endif + +typedef struct _FirebaseCorePlugin FirebaseCorePlugin; +typedef struct { + GObjectClass parent_class; +} FirebaseCorePluginClass; + +FLUTTER_PLUGIN_EXPORT GType firebase_core_plugin_get_type(); + +FLUTTER_PLUGIN_EXPORT void firebase_core_plugin_register_with_registrar( + FlPluginRegistrar* registrar); + +G_END_DECLS + +#ifdef __cplusplus + +#include + +#include "flutter_firebase_plugin.h" + +// Registers a FlutterFirebasePlugin so that its constants are collected during +// Firebase.initializeApp(). The channel_name should match the Dart +// MethodChannel name (e.g. "plugins.flutter.io/firebase_auth"). +FLUTTER_PLUGIN_EXPORT void RegisterFlutterFirebasePlugin( + const std::string& channel_name, FlutterFirebasePlugin* plugin); + +#endif // __cplusplus + +#endif // FLUTTER_PLUGIN_FIREBASE_CORE_PLUGIN_H_ diff --git a/packages/firebase_core/firebase_core/linux/include/firebase_core/flutter_firebase_plugin.h b/packages/firebase_core/firebase_core/linux/include/firebase_core/flutter_firebase_plugin.h new file mode 100644 index 000000000000..8aa9864f0d08 --- /dev/null +++ b/packages/firebase_core/firebase_core/linux/include/firebase_core/flutter_firebase_plugin.h @@ -0,0 +1,34 @@ +// Copyright 2026, the Chromium project authors. Please see the AUTHORS file +// for details. All rights reserved. Use of this source code is governed by a +// BSD-style license that can be found in the LICENSE file. + +#ifndef FLUTTER_FIREBASE_PLUGIN_H_ +#define FLUTTER_FIREBASE_PLUGIN_H_ + +#include + +#include "firebase/app.h" + +// Abstract interface mirroring Android's FlutterFirebasePlugin.java and iOS's +// FLTFirebasePlugin.h. Each Firebase plugin implements this to provide initial +// constants (e.g. current user) during Firebase.initializeApp(). +class FlutterFirebasePlugin { + public: + virtual ~FlutterFirebasePlugin() {} + + // Returns a map of plugin-specific constants for the given Firebase app. + // Called synchronously during initializeCore to populate pluginConstants. + // + // Ownership: implementations must return a new FlValue* map with a + // reference owned by the caller (transfer full). The caller is responsible + // for releasing it with fl_value_unref() (the registry uses + // fl_value_set_take, which assumes ownership). + virtual FlValue* GetPluginConstantsForFirebaseApp( + const firebase::App& app) = 0; + + // Called when Firebase core is re-initialized, allowing plugins to reset + // their state. + virtual void DidReinitializeFirebaseCore() = 0; +}; + +#endif // FLUTTER_FIREBASE_PLUGIN_H_ diff --git a/packages/firebase_core/firebase_core/linux/messages.g.cc b/packages/firebase_core/firebase_core/linux/messages.g.cc new file mode 100644 index 000000000000..3cafe83571e2 --- /dev/null +++ b/packages/firebase_core/firebase_core/linux/messages.g.cc @@ -0,0 +1,1994 @@ +// Copyright 2023, the Chromium project authors. Please see the AUTHORS file +// for details. All rights reserved. Use of this source code is governed by a +// BSD-style license that can be found in the LICENSE file. +// Autogenerated from Pigeon (v26.3.4), do not edit directly. +// See also: https://pub.dev/packages/pigeon + +#include "messages.g.h" + +#include + +#include +static guint G_GNUC_UNUSED flpigeon_hash_double(double v) { + if (std::isnan(v)) { + return static_cast(0x7FF80000); + } + if (v == 0.0) { + v = 0.0; + } + union { + double d; + uint64_t u; + } u; + u.d = v; + return static_cast(u.u ^ (u.u >> 32)); +} +static gboolean G_GNUC_UNUSED flpigeon_equals_double(double a, double b) { + return (a == b) || (std::isnan(a) && std::isnan(b)); +} +static gboolean G_GNUC_UNUSED flpigeon_deep_equals(FlValue* a, FlValue* b) { + if (a == b) { + return TRUE; + } + if (a == nullptr || b == nullptr) { + return FALSE; + } + if (fl_value_get_type(a) != fl_value_get_type(b)) { + return FALSE; + } + switch (fl_value_get_type(a)) { + case FL_VALUE_TYPE_NULL: + return TRUE; + case FL_VALUE_TYPE_BOOL: + return fl_value_get_bool(a) == fl_value_get_bool(b); + case FL_VALUE_TYPE_INT: + return fl_value_get_int(a) == fl_value_get_int(b); + case FL_VALUE_TYPE_FLOAT: { + return flpigeon_equals_double(fl_value_get_float(a), + fl_value_get_float(b)); + } + case FL_VALUE_TYPE_STRING: + return g_strcmp0(fl_value_get_string(a), fl_value_get_string(b)) == 0; + case FL_VALUE_TYPE_UINT8_LIST: + return fl_value_get_length(a) == fl_value_get_length(b) && + memcmp(fl_value_get_uint8_list(a), fl_value_get_uint8_list(b), + fl_value_get_length(a)) == 0; + case FL_VALUE_TYPE_INT32_LIST: + return fl_value_get_length(a) == fl_value_get_length(b) && + memcmp(fl_value_get_int32_list(a), fl_value_get_int32_list(b), + fl_value_get_length(a) * sizeof(int32_t)) == 0; + case FL_VALUE_TYPE_INT64_LIST: + return fl_value_get_length(a) == fl_value_get_length(b) && + memcmp(fl_value_get_int64_list(a), fl_value_get_int64_list(b), + fl_value_get_length(a) * sizeof(int64_t)) == 0; + case FL_VALUE_TYPE_FLOAT_LIST: { + size_t len = fl_value_get_length(a); + if (len != fl_value_get_length(b)) { + return FALSE; + } + const double* a_data = fl_value_get_float_list(a); + const double* b_data = fl_value_get_float_list(b); + for (size_t i = 0; i < len; i++) { + if (!flpigeon_equals_double(a_data[i], b_data[i])) { + return FALSE; + } + } + return TRUE; + } + case FL_VALUE_TYPE_LIST: { + size_t len = fl_value_get_length(a); + if (len != fl_value_get_length(b)) { + return FALSE; + } + for (size_t i = 0; i < len; i++) { + if (!flpigeon_deep_equals(fl_value_get_list_value(a, i), + fl_value_get_list_value(b, i))) { + return FALSE; + } + } + return TRUE; + } + case FL_VALUE_TYPE_MAP: { + size_t len = fl_value_get_length(a); + if (len != fl_value_get_length(b)) { + return FALSE; + } + for (size_t i = 0; i < len; i++) { + FlValue* key = fl_value_get_map_key(a, i); + FlValue* val = fl_value_get_map_value(a, i); + gboolean found = FALSE; + for (size_t j = 0; j < len; j++) { + FlValue* b_key = fl_value_get_map_key(b, j); + if (flpigeon_deep_equals(key, b_key)) { + FlValue* b_val = fl_value_get_map_value(b, j); + if (flpigeon_deep_equals(val, b_val)) { + found = TRUE; + break; + } else { + return FALSE; + } + } + } + if (!found) { + return FALSE; + } + } + return TRUE; + } + default: + return FALSE; + } + return FALSE; +} +static guint G_GNUC_UNUSED flpigeon_deep_hash(FlValue* value) { + if (value == nullptr) { + return 0; + } + switch (fl_value_get_type(value)) { + case FL_VALUE_TYPE_NULL: + return 0; + case FL_VALUE_TYPE_BOOL: + return fl_value_get_bool(value) ? 1231 : 1237; + case FL_VALUE_TYPE_INT: { + int64_t v = fl_value_get_int(value); + return static_cast(v ^ (v >> 32)); + } + case FL_VALUE_TYPE_FLOAT: + return flpigeon_hash_double(fl_value_get_float(value)); + case FL_VALUE_TYPE_STRING: + return g_str_hash(fl_value_get_string(value)); + case FL_VALUE_TYPE_UINT8_LIST: { + guint result = 1; + size_t len = fl_value_get_length(value); + const uint8_t* data = fl_value_get_uint8_list(value); + for (size_t i = 0; i < len; i++) { + result = result * 31 + data[i]; + } + return result; + } + case FL_VALUE_TYPE_INT32_LIST: { + guint result = 1; + size_t len = fl_value_get_length(value); + const int32_t* data = fl_value_get_int32_list(value); + for (size_t i = 0; i < len; i++) { + result = result * 31 + static_cast(data[i]); + } + return result; + } + case FL_VALUE_TYPE_INT64_LIST: { + guint result = 1; + size_t len = fl_value_get_length(value); + const int64_t* data = fl_value_get_int64_list(value); + for (size_t i = 0; i < len; i++) { + result = result * 31 + static_cast(data[i] ^ (data[i] >> 32)); + } + return result; + } + case FL_VALUE_TYPE_FLOAT_LIST: { + guint result = 1; + size_t len = fl_value_get_length(value); + const double* data = fl_value_get_float_list(value); + for (size_t i = 0; i < len; i++) { + result = result * 31 + flpigeon_hash_double(data[i]); + } + return result; + } + case FL_VALUE_TYPE_LIST: { + guint result = 1; + size_t len = fl_value_get_length(value); + for (size_t i = 0; i < len; i++) { + result = + result * 31 + flpigeon_deep_hash(fl_value_get_list_value(value, i)); + } + return result; + } + case FL_VALUE_TYPE_MAP: { + guint result = 0; + size_t len = fl_value_get_length(value); + for (size_t i = 0; i < len; i++) { + result += ((flpigeon_deep_hash(fl_value_get_map_key(value, i)) * 31) ^ + flpigeon_deep_hash(fl_value_get_map_value(value, i))); + } + return result; + } + default: + return static_cast(fl_value_get_type(value)); + } + return 0; +} + +struct _FirebaseCoreCoreFirebaseOptions { + GObject parent_instance; + + gchar* api_key; + gchar* app_id; + gchar* messaging_sender_id; + gchar* project_id; + gchar* auth_domain; + gchar* database_u_r_l; + gchar* storage_bucket; + gchar* measurement_id; + gchar* tracking_id; + gchar* deep_link_u_r_l_scheme; + gchar* android_client_id; + gchar* ios_client_id; + gchar* ios_bundle_id; + gchar* app_group_id; + gchar* recaptcha_site_key; +}; + +G_DEFINE_TYPE(FirebaseCoreCoreFirebaseOptions, + firebase_core_core_firebase_options, G_TYPE_OBJECT) + +static void firebase_core_core_firebase_options_dispose(GObject* object) { + FirebaseCoreCoreFirebaseOptions* self = + FIREBASE_CORE_CORE_FIREBASE_OPTIONS(object); + g_clear_pointer(&self->api_key, g_free); + g_clear_pointer(&self->app_id, g_free); + g_clear_pointer(&self->messaging_sender_id, g_free); + g_clear_pointer(&self->project_id, g_free); + g_clear_pointer(&self->auth_domain, g_free); + g_clear_pointer(&self->database_u_r_l, g_free); + g_clear_pointer(&self->storage_bucket, g_free); + g_clear_pointer(&self->measurement_id, g_free); + g_clear_pointer(&self->tracking_id, g_free); + g_clear_pointer(&self->deep_link_u_r_l_scheme, g_free); + g_clear_pointer(&self->android_client_id, g_free); + g_clear_pointer(&self->ios_client_id, g_free); + g_clear_pointer(&self->ios_bundle_id, g_free); + g_clear_pointer(&self->app_group_id, g_free); + g_clear_pointer(&self->recaptcha_site_key, g_free); + G_OBJECT_CLASS(firebase_core_core_firebase_options_parent_class) + ->dispose(object); +} + +static void firebase_core_core_firebase_options_init( + FirebaseCoreCoreFirebaseOptions* self) {} + +static void firebase_core_core_firebase_options_class_init( + FirebaseCoreCoreFirebaseOptionsClass* klass) { + G_OBJECT_CLASS(klass)->dispose = firebase_core_core_firebase_options_dispose; +} + +FirebaseCoreCoreFirebaseOptions* firebase_core_core_firebase_options_new( + const gchar* api_key, const gchar* app_id, const gchar* messaging_sender_id, + const gchar* project_id, const gchar* auth_domain, + const gchar* database_u_r_l, const gchar* storage_bucket, + const gchar* measurement_id, const gchar* tracking_id, + const gchar* deep_link_u_r_l_scheme, const gchar* android_client_id, + const gchar* ios_client_id, const gchar* ios_bundle_id, + const gchar* app_group_id, const gchar* recaptcha_site_key) { + FirebaseCoreCoreFirebaseOptions* self = FIREBASE_CORE_CORE_FIREBASE_OPTIONS( + g_object_new(firebase_core_core_firebase_options_get_type(), nullptr)); + self->api_key = g_strdup(api_key); + self->app_id = g_strdup(app_id); + self->messaging_sender_id = g_strdup(messaging_sender_id); + self->project_id = g_strdup(project_id); + if (auth_domain != nullptr) { + self->auth_domain = g_strdup(auth_domain); + } else { + self->auth_domain = nullptr; + } + if (database_u_r_l != nullptr) { + self->database_u_r_l = g_strdup(database_u_r_l); + } else { + self->database_u_r_l = nullptr; + } + if (storage_bucket != nullptr) { + self->storage_bucket = g_strdup(storage_bucket); + } else { + self->storage_bucket = nullptr; + } + if (measurement_id != nullptr) { + self->measurement_id = g_strdup(measurement_id); + } else { + self->measurement_id = nullptr; + } + if (tracking_id != nullptr) { + self->tracking_id = g_strdup(tracking_id); + } else { + self->tracking_id = nullptr; + } + if (deep_link_u_r_l_scheme != nullptr) { + self->deep_link_u_r_l_scheme = g_strdup(deep_link_u_r_l_scheme); + } else { + self->deep_link_u_r_l_scheme = nullptr; + } + if (android_client_id != nullptr) { + self->android_client_id = g_strdup(android_client_id); + } else { + self->android_client_id = nullptr; + } + if (ios_client_id != nullptr) { + self->ios_client_id = g_strdup(ios_client_id); + } else { + self->ios_client_id = nullptr; + } + if (ios_bundle_id != nullptr) { + self->ios_bundle_id = g_strdup(ios_bundle_id); + } else { + self->ios_bundle_id = nullptr; + } + if (app_group_id != nullptr) { + self->app_group_id = g_strdup(app_group_id); + } else { + self->app_group_id = nullptr; + } + if (recaptcha_site_key != nullptr) { + self->recaptcha_site_key = g_strdup(recaptcha_site_key); + } else { + self->recaptcha_site_key = nullptr; + } + return self; +} + +const gchar* firebase_core_core_firebase_options_get_api_key( + FirebaseCoreCoreFirebaseOptions* self) { + g_return_val_if_fail(FIREBASE_CORE_IS_CORE_FIREBASE_OPTIONS(self), nullptr); + return self->api_key; +} + +const gchar* firebase_core_core_firebase_options_get_app_id( + FirebaseCoreCoreFirebaseOptions* self) { + g_return_val_if_fail(FIREBASE_CORE_IS_CORE_FIREBASE_OPTIONS(self), nullptr); + return self->app_id; +} + +const gchar* firebase_core_core_firebase_options_get_messaging_sender_id( + FirebaseCoreCoreFirebaseOptions* self) { + g_return_val_if_fail(FIREBASE_CORE_IS_CORE_FIREBASE_OPTIONS(self), nullptr); + return self->messaging_sender_id; +} + +const gchar* firebase_core_core_firebase_options_get_project_id( + FirebaseCoreCoreFirebaseOptions* self) { + g_return_val_if_fail(FIREBASE_CORE_IS_CORE_FIREBASE_OPTIONS(self), nullptr); + return self->project_id; +} + +const gchar* firebase_core_core_firebase_options_get_auth_domain( + FirebaseCoreCoreFirebaseOptions* self) { + g_return_val_if_fail(FIREBASE_CORE_IS_CORE_FIREBASE_OPTIONS(self), nullptr); + return self->auth_domain; +} + +const gchar* firebase_core_core_firebase_options_get_database_u_r_l( + FirebaseCoreCoreFirebaseOptions* self) { + g_return_val_if_fail(FIREBASE_CORE_IS_CORE_FIREBASE_OPTIONS(self), nullptr); + return self->database_u_r_l; +} + +const gchar* firebase_core_core_firebase_options_get_storage_bucket( + FirebaseCoreCoreFirebaseOptions* self) { + g_return_val_if_fail(FIREBASE_CORE_IS_CORE_FIREBASE_OPTIONS(self), nullptr); + return self->storage_bucket; +} + +const gchar* firebase_core_core_firebase_options_get_measurement_id( + FirebaseCoreCoreFirebaseOptions* self) { + g_return_val_if_fail(FIREBASE_CORE_IS_CORE_FIREBASE_OPTIONS(self), nullptr); + return self->measurement_id; +} + +const gchar* firebase_core_core_firebase_options_get_tracking_id( + FirebaseCoreCoreFirebaseOptions* self) { + g_return_val_if_fail(FIREBASE_CORE_IS_CORE_FIREBASE_OPTIONS(self), nullptr); + return self->tracking_id; +} + +const gchar* firebase_core_core_firebase_options_get_deep_link_u_r_l_scheme( + FirebaseCoreCoreFirebaseOptions* self) { + g_return_val_if_fail(FIREBASE_CORE_IS_CORE_FIREBASE_OPTIONS(self), nullptr); + return self->deep_link_u_r_l_scheme; +} + +const gchar* firebase_core_core_firebase_options_get_android_client_id( + FirebaseCoreCoreFirebaseOptions* self) { + g_return_val_if_fail(FIREBASE_CORE_IS_CORE_FIREBASE_OPTIONS(self), nullptr); + return self->android_client_id; +} + +const gchar* firebase_core_core_firebase_options_get_ios_client_id( + FirebaseCoreCoreFirebaseOptions* self) { + g_return_val_if_fail(FIREBASE_CORE_IS_CORE_FIREBASE_OPTIONS(self), nullptr); + return self->ios_client_id; +} + +const gchar* firebase_core_core_firebase_options_get_ios_bundle_id( + FirebaseCoreCoreFirebaseOptions* self) { + g_return_val_if_fail(FIREBASE_CORE_IS_CORE_FIREBASE_OPTIONS(self), nullptr); + return self->ios_bundle_id; +} + +const gchar* firebase_core_core_firebase_options_get_app_group_id( + FirebaseCoreCoreFirebaseOptions* self) { + g_return_val_if_fail(FIREBASE_CORE_IS_CORE_FIREBASE_OPTIONS(self), nullptr); + return self->app_group_id; +} + +const gchar* firebase_core_core_firebase_options_get_recaptcha_site_key( + FirebaseCoreCoreFirebaseOptions* self) { + g_return_val_if_fail(FIREBASE_CORE_IS_CORE_FIREBASE_OPTIONS(self), nullptr); + return self->recaptcha_site_key; +} + +static FlValue* firebase_core_core_firebase_options_to_list( + FirebaseCoreCoreFirebaseOptions* self) { + FlValue* values = fl_value_new_list(); + fl_value_append_take(values, fl_value_new_string(self->api_key)); + fl_value_append_take(values, fl_value_new_string(self->app_id)); + fl_value_append_take(values, fl_value_new_string(self->messaging_sender_id)); + fl_value_append_take(values, fl_value_new_string(self->project_id)); + fl_value_append_take(values, self->auth_domain != nullptr + ? fl_value_new_string(self->auth_domain) + : fl_value_new_null()); + fl_value_append_take(values, self->database_u_r_l != nullptr + ? fl_value_new_string(self->database_u_r_l) + : fl_value_new_null()); + fl_value_append_take(values, self->storage_bucket != nullptr + ? fl_value_new_string(self->storage_bucket) + : fl_value_new_null()); + fl_value_append_take(values, self->measurement_id != nullptr + ? fl_value_new_string(self->measurement_id) + : fl_value_new_null()); + fl_value_append_take(values, self->tracking_id != nullptr + ? fl_value_new_string(self->tracking_id) + : fl_value_new_null()); + fl_value_append_take(values, + self->deep_link_u_r_l_scheme != nullptr + ? fl_value_new_string(self->deep_link_u_r_l_scheme) + : fl_value_new_null()); + fl_value_append_take(values, + self->android_client_id != nullptr + ? fl_value_new_string(self->android_client_id) + : fl_value_new_null()); + fl_value_append_take(values, self->ios_client_id != nullptr + ? fl_value_new_string(self->ios_client_id) + : fl_value_new_null()); + fl_value_append_take(values, self->ios_bundle_id != nullptr + ? fl_value_new_string(self->ios_bundle_id) + : fl_value_new_null()); + fl_value_append_take(values, self->app_group_id != nullptr + ? fl_value_new_string(self->app_group_id) + : fl_value_new_null()); + fl_value_append_take(values, + self->recaptcha_site_key != nullptr + ? fl_value_new_string(self->recaptcha_site_key) + : fl_value_new_null()); + return values; +} + +static FirebaseCoreCoreFirebaseOptions* +firebase_core_core_firebase_options_new_from_list(FlValue* values) { + FlValue* value0 = fl_value_get_list_value(values, 0); + const gchar* api_key = fl_value_get_string(value0); + FlValue* value1 = fl_value_get_list_value(values, 1); + const gchar* app_id = fl_value_get_string(value1); + FlValue* value2 = fl_value_get_list_value(values, 2); + const gchar* messaging_sender_id = fl_value_get_string(value2); + FlValue* value3 = fl_value_get_list_value(values, 3); + const gchar* project_id = fl_value_get_string(value3); + FlValue* value4 = fl_value_get_list_value(values, 4); + const gchar* auth_domain = nullptr; + if (fl_value_get_type(value4) != FL_VALUE_TYPE_NULL) { + auth_domain = fl_value_get_string(value4); + } + FlValue* value5 = fl_value_get_list_value(values, 5); + const gchar* database_u_r_l = nullptr; + if (fl_value_get_type(value5) != FL_VALUE_TYPE_NULL) { + database_u_r_l = fl_value_get_string(value5); + } + FlValue* value6 = fl_value_get_list_value(values, 6); + const gchar* storage_bucket = nullptr; + if (fl_value_get_type(value6) != FL_VALUE_TYPE_NULL) { + storage_bucket = fl_value_get_string(value6); + } + FlValue* value7 = fl_value_get_list_value(values, 7); + const gchar* measurement_id = nullptr; + if (fl_value_get_type(value7) != FL_VALUE_TYPE_NULL) { + measurement_id = fl_value_get_string(value7); + } + FlValue* value8 = fl_value_get_list_value(values, 8); + const gchar* tracking_id = nullptr; + if (fl_value_get_type(value8) != FL_VALUE_TYPE_NULL) { + tracking_id = fl_value_get_string(value8); + } + FlValue* value9 = fl_value_get_list_value(values, 9); + const gchar* deep_link_u_r_l_scheme = nullptr; + if (fl_value_get_type(value9) != FL_VALUE_TYPE_NULL) { + deep_link_u_r_l_scheme = fl_value_get_string(value9); + } + FlValue* value10 = fl_value_get_list_value(values, 10); + const gchar* android_client_id = nullptr; + if (fl_value_get_type(value10) != FL_VALUE_TYPE_NULL) { + android_client_id = fl_value_get_string(value10); + } + FlValue* value11 = fl_value_get_list_value(values, 11); + const gchar* ios_client_id = nullptr; + if (fl_value_get_type(value11) != FL_VALUE_TYPE_NULL) { + ios_client_id = fl_value_get_string(value11); + } + FlValue* value12 = fl_value_get_list_value(values, 12); + const gchar* ios_bundle_id = nullptr; + if (fl_value_get_type(value12) != FL_VALUE_TYPE_NULL) { + ios_bundle_id = fl_value_get_string(value12); + } + FlValue* value13 = fl_value_get_list_value(values, 13); + const gchar* app_group_id = nullptr; + if (fl_value_get_type(value13) != FL_VALUE_TYPE_NULL) { + app_group_id = fl_value_get_string(value13); + } + FlValue* value14 = fl_value_get_list_value(values, 14); + const gchar* recaptcha_site_key = nullptr; + if (fl_value_get_type(value14) != FL_VALUE_TYPE_NULL) { + recaptcha_site_key = fl_value_get_string(value14); + } + return firebase_core_core_firebase_options_new( + api_key, app_id, messaging_sender_id, project_id, auth_domain, + database_u_r_l, storage_bucket, measurement_id, tracking_id, + deep_link_u_r_l_scheme, android_client_id, ios_client_id, ios_bundle_id, + app_group_id, recaptcha_site_key); +} + +gboolean firebase_core_core_firebase_options_equals( + FirebaseCoreCoreFirebaseOptions* a, FirebaseCoreCoreFirebaseOptions* b) { + if (a == b) { + return TRUE; + } + if (a == nullptr || b == nullptr) { + return FALSE; + } + if (g_strcmp0(a->api_key, b->api_key) != 0) { + return FALSE; + } + if (g_strcmp0(a->app_id, b->app_id) != 0) { + return FALSE; + } + if (g_strcmp0(a->messaging_sender_id, b->messaging_sender_id) != 0) { + return FALSE; + } + if (g_strcmp0(a->project_id, b->project_id) != 0) { + return FALSE; + } + if (g_strcmp0(a->auth_domain, b->auth_domain) != 0) { + return FALSE; + } + if (g_strcmp0(a->database_u_r_l, b->database_u_r_l) != 0) { + return FALSE; + } + if (g_strcmp0(a->storage_bucket, b->storage_bucket) != 0) { + return FALSE; + } + if (g_strcmp0(a->measurement_id, b->measurement_id) != 0) { + return FALSE; + } + if (g_strcmp0(a->tracking_id, b->tracking_id) != 0) { + return FALSE; + } + if (g_strcmp0(a->deep_link_u_r_l_scheme, b->deep_link_u_r_l_scheme) != 0) { + return FALSE; + } + if (g_strcmp0(a->android_client_id, b->android_client_id) != 0) { + return FALSE; + } + if (g_strcmp0(a->ios_client_id, b->ios_client_id) != 0) { + return FALSE; + } + if (g_strcmp0(a->ios_bundle_id, b->ios_bundle_id) != 0) { + return FALSE; + } + if (g_strcmp0(a->app_group_id, b->app_group_id) != 0) { + return FALSE; + } + if (g_strcmp0(a->recaptcha_site_key, b->recaptcha_site_key) != 0) { + return FALSE; + } + return TRUE; +} + +guint firebase_core_core_firebase_options_hash( + FirebaseCoreCoreFirebaseOptions* self) { + g_return_val_if_fail(FIREBASE_CORE_IS_CORE_FIREBASE_OPTIONS(self), 0); + guint result = 0; + result = + result * 31 + (self->api_key != nullptr ? g_str_hash(self->api_key) : 0); + result = + result * 31 + (self->app_id != nullptr ? g_str_hash(self->app_id) : 0); + result = result * 31 + (self->messaging_sender_id != nullptr + ? g_str_hash(self->messaging_sender_id) + : 0); + result = result * 31 + + (self->project_id != nullptr ? g_str_hash(self->project_id) : 0); + result = result * 31 + + (self->auth_domain != nullptr ? g_str_hash(self->auth_domain) : 0); + result = + result * 31 + + (self->database_u_r_l != nullptr ? g_str_hash(self->database_u_r_l) : 0); + result = + result * 31 + + (self->storage_bucket != nullptr ? g_str_hash(self->storage_bucket) : 0); + result = + result * 31 + + (self->measurement_id != nullptr ? g_str_hash(self->measurement_id) : 0); + result = result * 31 + + (self->tracking_id != nullptr ? g_str_hash(self->tracking_id) : 0); + result = result * 31 + (self->deep_link_u_r_l_scheme != nullptr + ? g_str_hash(self->deep_link_u_r_l_scheme) + : 0); + result = result * 31 + (self->android_client_id != nullptr + ? g_str_hash(self->android_client_id) + : 0); + result = + result * 31 + + (self->ios_client_id != nullptr ? g_str_hash(self->ios_client_id) : 0); + result = + result * 31 + + (self->ios_bundle_id != nullptr ? g_str_hash(self->ios_bundle_id) : 0); + result = result * 31 + + (self->app_group_id != nullptr ? g_str_hash(self->app_group_id) : 0); + result = result * 31 + (self->recaptcha_site_key != nullptr + ? g_str_hash(self->recaptcha_site_key) + : 0); + return result; +} + +struct _FirebaseCoreCoreInitializeResponse { + GObject parent_instance; + + gchar* name; + FirebaseCoreCoreFirebaseOptions* options; + gboolean* is_automatic_data_collection_enabled; + FlValue* plugin_constants; +}; + +G_DEFINE_TYPE(FirebaseCoreCoreInitializeResponse, + firebase_core_core_initialize_response, G_TYPE_OBJECT) + +static void firebase_core_core_initialize_response_dispose(GObject* object) { + FirebaseCoreCoreInitializeResponse* self = + FIREBASE_CORE_CORE_INITIALIZE_RESPONSE(object); + g_clear_pointer(&self->name, g_free); + g_clear_object(&self->options); + g_clear_pointer(&self->is_automatic_data_collection_enabled, g_free); + g_clear_pointer(&self->plugin_constants, fl_value_unref); + G_OBJECT_CLASS(firebase_core_core_initialize_response_parent_class) + ->dispose(object); +} + +static void firebase_core_core_initialize_response_init( + FirebaseCoreCoreInitializeResponse* self) {} + +static void firebase_core_core_initialize_response_class_init( + FirebaseCoreCoreInitializeResponseClass* klass) { + G_OBJECT_CLASS(klass)->dispose = + firebase_core_core_initialize_response_dispose; +} + +FirebaseCoreCoreInitializeResponse* firebase_core_core_initialize_response_new( + const gchar* name, FirebaseCoreCoreFirebaseOptions* options, + gboolean* is_automatic_data_collection_enabled, FlValue* plugin_constants) { + FirebaseCoreCoreInitializeResponse* self = + FIREBASE_CORE_CORE_INITIALIZE_RESPONSE(g_object_new( + firebase_core_core_initialize_response_get_type(), nullptr)); + self->name = g_strdup(name); + self->options = FIREBASE_CORE_CORE_FIREBASE_OPTIONS(g_object_ref(options)); + if (is_automatic_data_collection_enabled != nullptr) { + self->is_automatic_data_collection_enabled = + static_cast(malloc(sizeof(gboolean))); + *self->is_automatic_data_collection_enabled = + *is_automatic_data_collection_enabled; + } else { + self->is_automatic_data_collection_enabled = nullptr; + } + self->plugin_constants = fl_value_ref(plugin_constants); + return self; +} + +const gchar* firebase_core_core_initialize_response_get_name( + FirebaseCoreCoreInitializeResponse* self) { + g_return_val_if_fail(FIREBASE_CORE_IS_CORE_INITIALIZE_RESPONSE(self), + nullptr); + return self->name; +} + +FirebaseCoreCoreFirebaseOptions* +firebase_core_core_initialize_response_get_options( + FirebaseCoreCoreInitializeResponse* self) { + g_return_val_if_fail(FIREBASE_CORE_IS_CORE_INITIALIZE_RESPONSE(self), + nullptr); + return self->options; +} + +gboolean* +firebase_core_core_initialize_response_get_is_automatic_data_collection_enabled( + FirebaseCoreCoreInitializeResponse* self) { + g_return_val_if_fail(FIREBASE_CORE_IS_CORE_INITIALIZE_RESPONSE(self), + nullptr); + return self->is_automatic_data_collection_enabled; +} + +FlValue* firebase_core_core_initialize_response_get_plugin_constants( + FirebaseCoreCoreInitializeResponse* self) { + g_return_val_if_fail(FIREBASE_CORE_IS_CORE_INITIALIZE_RESPONSE(self), + nullptr); + return self->plugin_constants; +} + +static FlValue* firebase_core_core_initialize_response_to_list( + FirebaseCoreCoreInitializeResponse* self) { + FlValue* values = fl_value_new_list(); + fl_value_append_take(values, fl_value_new_string(self->name)); + fl_value_append_take(values, fl_value_new_custom_object( + firebase_core_core_firebase_options_type_id, + G_OBJECT(self->options))); + fl_value_append_take( + values, + self->is_automatic_data_collection_enabled != nullptr + ? fl_value_new_bool(*self->is_automatic_data_collection_enabled) + : fl_value_new_null()); + fl_value_append_take(values, fl_value_ref(self->plugin_constants)); + return values; +} + +static FirebaseCoreCoreInitializeResponse* +firebase_core_core_initialize_response_new_from_list(FlValue* values) { + FlValue* value0 = fl_value_get_list_value(values, 0); + const gchar* name = fl_value_get_string(value0); + FlValue* value1 = fl_value_get_list_value(values, 1); + FirebaseCoreCoreFirebaseOptions* options = + FIREBASE_CORE_CORE_FIREBASE_OPTIONS( + fl_value_get_custom_value_object(value1)); + FlValue* value2 = fl_value_get_list_value(values, 2); + gboolean* is_automatic_data_collection_enabled = nullptr; + gboolean is_automatic_data_collection_enabled_value; + if (fl_value_get_type(value2) != FL_VALUE_TYPE_NULL) { + is_automatic_data_collection_enabled_value = fl_value_get_bool(value2); + is_automatic_data_collection_enabled = + &is_automatic_data_collection_enabled_value; + } + FlValue* value3 = fl_value_get_list_value(values, 3); + FlValue* plugin_constants = value3; + return firebase_core_core_initialize_response_new( + name, options, is_automatic_data_collection_enabled, plugin_constants); +} + +gboolean firebase_core_core_initialize_response_equals( + FirebaseCoreCoreInitializeResponse* a, + FirebaseCoreCoreInitializeResponse* b) { + if (a == b) { + return TRUE; + } + if (a == nullptr || b == nullptr) { + return FALSE; + } + if (g_strcmp0(a->name, b->name) != 0) { + return FALSE; + } + if (!firebase_core_core_firebase_options_equals(a->options, b->options)) { + return FALSE; + } + if ((a->is_automatic_data_collection_enabled == nullptr) != + (b->is_automatic_data_collection_enabled == nullptr)) { + return FALSE; + } + if (a->is_automatic_data_collection_enabled != nullptr && + *a->is_automatic_data_collection_enabled != + *b->is_automatic_data_collection_enabled) { + return FALSE; + } + if (!flpigeon_deep_equals(a->plugin_constants, b->plugin_constants)) { + return FALSE; + } + return TRUE; +} + +guint firebase_core_core_initialize_response_hash( + FirebaseCoreCoreInitializeResponse* self) { + g_return_val_if_fail(FIREBASE_CORE_IS_CORE_INITIALIZE_RESPONSE(self), 0); + guint result = 0; + result = result * 31 + (self->name != nullptr ? g_str_hash(self->name) : 0); + result = + result * 31 + firebase_core_core_firebase_options_hash(self->options); + result = + result * 31 + + (self->is_automatic_data_collection_enabled != nullptr + ? static_cast(*self->is_automatic_data_collection_enabled) + : 0); + result = result * 31 + flpigeon_deep_hash(self->plugin_constants); + return result; +} + +struct _FirebaseCoreMessageCodec { + FlStandardMessageCodec parent_instance; +}; + +G_DEFINE_TYPE(FirebaseCoreMessageCodec, firebase_core_message_codec, + fl_standard_message_codec_get_type()) + +const int firebase_core_core_firebase_options_type_id = 129; +const int firebase_core_core_initialize_response_type_id = 130; + +static gboolean +firebase_core_message_codec_write_firebase_core_core_firebase_options( + FlStandardMessageCodec* codec, GByteArray* buffer, + FirebaseCoreCoreFirebaseOptions* value, GError** error) { + uint8_t type = firebase_core_core_firebase_options_type_id; + g_byte_array_append(buffer, &type, sizeof(uint8_t)); + g_autoptr(FlValue) values = + firebase_core_core_firebase_options_to_list(value); + return fl_standard_message_codec_write_value(codec, buffer, values, error); +} + +static gboolean +firebase_core_message_codec_write_firebase_core_core_initialize_response( + FlStandardMessageCodec* codec, GByteArray* buffer, + FirebaseCoreCoreInitializeResponse* value, GError** error) { + uint8_t type = firebase_core_core_initialize_response_type_id; + g_byte_array_append(buffer, &type, sizeof(uint8_t)); + g_autoptr(FlValue) values = + firebase_core_core_initialize_response_to_list(value); + return fl_standard_message_codec_write_value(codec, buffer, values, error); +} + +static gboolean firebase_core_message_codec_write_value( + FlStandardMessageCodec* codec, GByteArray* buffer, FlValue* value, + GError** error) { + if (fl_value_get_type(value) == FL_VALUE_TYPE_CUSTOM) { + switch (fl_value_get_custom_type(value)) { + case firebase_core_core_firebase_options_type_id: + return firebase_core_message_codec_write_firebase_core_core_firebase_options( + codec, buffer, + FIREBASE_CORE_CORE_FIREBASE_OPTIONS( + fl_value_get_custom_value_object(value)), + error); + case firebase_core_core_initialize_response_type_id: + return firebase_core_message_codec_write_firebase_core_core_initialize_response( + codec, buffer, + FIREBASE_CORE_CORE_INITIALIZE_RESPONSE( + fl_value_get_custom_value_object(value)), + error); + } + } + + return FL_STANDARD_MESSAGE_CODEC_CLASS( + firebase_core_message_codec_parent_class) + ->write_value(codec, buffer, value, error); +} + +static FlValue* +firebase_core_message_codec_read_firebase_core_core_firebase_options( + FlStandardMessageCodec* codec, GBytes* buffer, size_t* offset, + GError** error) { + g_autoptr(FlValue) values = + fl_standard_message_codec_read_value(codec, buffer, offset, error); + if (values == nullptr) { + return nullptr; + } + + g_autoptr(FirebaseCoreCoreFirebaseOptions) value = + firebase_core_core_firebase_options_new_from_list(values); + if (value == nullptr) { + g_set_error(error, FL_MESSAGE_CODEC_ERROR, FL_MESSAGE_CODEC_ERROR_FAILED, + "Invalid data received for MessageData"); + return nullptr; + } + + return fl_value_new_custom_object(firebase_core_core_firebase_options_type_id, + G_OBJECT(value)); +} + +static FlValue* +firebase_core_message_codec_read_firebase_core_core_initialize_response( + FlStandardMessageCodec* codec, GBytes* buffer, size_t* offset, + GError** error) { + g_autoptr(FlValue) values = + fl_standard_message_codec_read_value(codec, buffer, offset, error); + if (values == nullptr) { + return nullptr; + } + + g_autoptr(FirebaseCoreCoreInitializeResponse) value = + firebase_core_core_initialize_response_new_from_list(values); + if (value == nullptr) { + g_set_error(error, FL_MESSAGE_CODEC_ERROR, FL_MESSAGE_CODEC_ERROR_FAILED, + "Invalid data received for MessageData"); + return nullptr; + } + + return fl_value_new_custom_object( + firebase_core_core_initialize_response_type_id, G_OBJECT(value)); +} + +static FlValue* firebase_core_message_codec_read_value_of_type( + FlStandardMessageCodec* codec, GBytes* buffer, size_t* offset, int type, + GError** error) { + switch (type) { + case firebase_core_core_firebase_options_type_id: + return firebase_core_message_codec_read_firebase_core_core_firebase_options( + codec, buffer, offset, error); + case firebase_core_core_initialize_response_type_id: + return firebase_core_message_codec_read_firebase_core_core_initialize_response( + codec, buffer, offset, error); + default: + return FL_STANDARD_MESSAGE_CODEC_CLASS( + firebase_core_message_codec_parent_class) + ->read_value_of_type(codec, buffer, offset, type, error); + } +} + +static void firebase_core_message_codec_init(FirebaseCoreMessageCodec* self) {} + +static void firebase_core_message_codec_class_init( + FirebaseCoreMessageCodecClass* klass) { + FL_STANDARD_MESSAGE_CODEC_CLASS(klass)->write_value = + firebase_core_message_codec_write_value; + FL_STANDARD_MESSAGE_CODEC_CLASS(klass)->read_value_of_type = + firebase_core_message_codec_read_value_of_type; +} + +static FirebaseCoreMessageCodec* firebase_core_message_codec_new() { + FirebaseCoreMessageCodec* self = FIREBASE_CORE_MESSAGE_CODEC( + g_object_new(firebase_core_message_codec_get_type(), nullptr)); + return self; +} + +struct _FirebaseCoreFirebaseCoreHostApiResponseHandle { + GObject parent_instance; + + FlBasicMessageChannel* channel; + FlBasicMessageChannelResponseHandle* response_handle; +}; + +G_DEFINE_TYPE(FirebaseCoreFirebaseCoreHostApiResponseHandle, + firebase_core_firebase_core_host_api_response_handle, + G_TYPE_OBJECT) + +static void firebase_core_firebase_core_host_api_response_handle_dispose( + GObject* object) { + FirebaseCoreFirebaseCoreHostApiResponseHandle* self = + FIREBASE_CORE_FIREBASE_CORE_HOST_API_RESPONSE_HANDLE(object); + g_clear_object(&self->channel); + g_clear_object(&self->response_handle); + G_OBJECT_CLASS( + firebase_core_firebase_core_host_api_response_handle_parent_class) + ->dispose(object); +} + +static void firebase_core_firebase_core_host_api_response_handle_init( + FirebaseCoreFirebaseCoreHostApiResponseHandle* self) {} + +static void firebase_core_firebase_core_host_api_response_handle_class_init( + FirebaseCoreFirebaseCoreHostApiResponseHandleClass* klass) { + G_OBJECT_CLASS(klass)->dispose = + firebase_core_firebase_core_host_api_response_handle_dispose; +} + +static FirebaseCoreFirebaseCoreHostApiResponseHandle* +firebase_core_firebase_core_host_api_response_handle_new( + FlBasicMessageChannel* channel, + FlBasicMessageChannelResponseHandle* response_handle) { + FirebaseCoreFirebaseCoreHostApiResponseHandle* self = + FIREBASE_CORE_FIREBASE_CORE_HOST_API_RESPONSE_HANDLE(g_object_new( + firebase_core_firebase_core_host_api_response_handle_get_type(), + nullptr)); + self->channel = FL_BASIC_MESSAGE_CHANNEL(g_object_ref(channel)); + self->response_handle = + FL_BASIC_MESSAGE_CHANNEL_RESPONSE_HANDLE(g_object_ref(response_handle)); + return self; +} + +G_DECLARE_FINAL_TYPE( + FirebaseCoreFirebaseCoreHostApiInitializeAppResponse, + firebase_core_firebase_core_host_api_initialize_app_response, FIREBASE_CORE, + FIREBASE_CORE_HOST_API_INITIALIZE_APP_RESPONSE, GObject) + +struct _FirebaseCoreFirebaseCoreHostApiInitializeAppResponse { + GObject parent_instance; + + FlValue* value; +}; + +G_DEFINE_TYPE(FirebaseCoreFirebaseCoreHostApiInitializeAppResponse, + firebase_core_firebase_core_host_api_initialize_app_response, + G_TYPE_OBJECT) + +static void +firebase_core_firebase_core_host_api_initialize_app_response_dispose( + GObject* object) { + FirebaseCoreFirebaseCoreHostApiInitializeAppResponse* self = + FIREBASE_CORE_FIREBASE_CORE_HOST_API_INITIALIZE_APP_RESPONSE(object); + g_clear_pointer(&self->value, fl_value_unref); + G_OBJECT_CLASS( + firebase_core_firebase_core_host_api_initialize_app_response_parent_class) + ->dispose(object); +} + +static void firebase_core_firebase_core_host_api_initialize_app_response_init( + FirebaseCoreFirebaseCoreHostApiInitializeAppResponse* self) {} + +static void +firebase_core_firebase_core_host_api_initialize_app_response_class_init( + FirebaseCoreFirebaseCoreHostApiInitializeAppResponseClass* klass) { + G_OBJECT_CLASS(klass)->dispose = + firebase_core_firebase_core_host_api_initialize_app_response_dispose; +} + +static FirebaseCoreFirebaseCoreHostApiInitializeAppResponse* +firebase_core_firebase_core_host_api_initialize_app_response_new( + FirebaseCoreCoreInitializeResponse* return_value) { + FirebaseCoreFirebaseCoreHostApiInitializeAppResponse* self = + FIREBASE_CORE_FIREBASE_CORE_HOST_API_INITIALIZE_APP_RESPONSE(g_object_new( + firebase_core_firebase_core_host_api_initialize_app_response_get_type(), + nullptr)); + self->value = fl_value_new_list(); + fl_value_append_take( + self->value, + fl_value_new_custom_object(firebase_core_core_initialize_response_type_id, + G_OBJECT(return_value))); + return self; +} + +static FirebaseCoreFirebaseCoreHostApiInitializeAppResponse* +firebase_core_firebase_core_host_api_initialize_app_response_new_error( + const gchar* code, const gchar* message, FlValue* details) { + FirebaseCoreFirebaseCoreHostApiInitializeAppResponse* self = + FIREBASE_CORE_FIREBASE_CORE_HOST_API_INITIALIZE_APP_RESPONSE(g_object_new( + firebase_core_firebase_core_host_api_initialize_app_response_get_type(), + nullptr)); + self->value = fl_value_new_list(); + fl_value_append_take(self->value, fl_value_new_string(code)); + fl_value_append_take(self->value, + fl_value_new_string(message != nullptr ? message : "")); + fl_value_append_take(self->value, details != nullptr ? fl_value_ref(details) + : fl_value_new_null()); + return self; +} + +G_DECLARE_FINAL_TYPE( + FirebaseCoreFirebaseCoreHostApiInitializeCoreResponse, + firebase_core_firebase_core_host_api_initialize_core_response, + FIREBASE_CORE, FIREBASE_CORE_HOST_API_INITIALIZE_CORE_RESPONSE, GObject) + +struct _FirebaseCoreFirebaseCoreHostApiInitializeCoreResponse { + GObject parent_instance; + + FlValue* value; +}; + +G_DEFINE_TYPE(FirebaseCoreFirebaseCoreHostApiInitializeCoreResponse, + firebase_core_firebase_core_host_api_initialize_core_response, + G_TYPE_OBJECT) + +static void +firebase_core_firebase_core_host_api_initialize_core_response_dispose( + GObject* object) { + FirebaseCoreFirebaseCoreHostApiInitializeCoreResponse* self = + FIREBASE_CORE_FIREBASE_CORE_HOST_API_INITIALIZE_CORE_RESPONSE(object); + g_clear_pointer(&self->value, fl_value_unref); + G_OBJECT_CLASS( + firebase_core_firebase_core_host_api_initialize_core_response_parent_class) + ->dispose(object); +} + +static void firebase_core_firebase_core_host_api_initialize_core_response_init( + FirebaseCoreFirebaseCoreHostApiInitializeCoreResponse* self) {} + +static void +firebase_core_firebase_core_host_api_initialize_core_response_class_init( + FirebaseCoreFirebaseCoreHostApiInitializeCoreResponseClass* klass) { + G_OBJECT_CLASS(klass)->dispose = + firebase_core_firebase_core_host_api_initialize_core_response_dispose; +} + +static FirebaseCoreFirebaseCoreHostApiInitializeCoreResponse* +firebase_core_firebase_core_host_api_initialize_core_response_new( + FlValue* return_value) { + FirebaseCoreFirebaseCoreHostApiInitializeCoreResponse* self = + FIREBASE_CORE_FIREBASE_CORE_HOST_API_INITIALIZE_CORE_RESPONSE(g_object_new( + firebase_core_firebase_core_host_api_initialize_core_response_get_type(), + nullptr)); + self->value = fl_value_new_list(); + fl_value_append_take(self->value, fl_value_ref(return_value)); + return self; +} + +static FirebaseCoreFirebaseCoreHostApiInitializeCoreResponse* +firebase_core_firebase_core_host_api_initialize_core_response_new_error( + const gchar* code, const gchar* message, FlValue* details) { + FirebaseCoreFirebaseCoreHostApiInitializeCoreResponse* self = + FIREBASE_CORE_FIREBASE_CORE_HOST_API_INITIALIZE_CORE_RESPONSE(g_object_new( + firebase_core_firebase_core_host_api_initialize_core_response_get_type(), + nullptr)); + self->value = fl_value_new_list(); + fl_value_append_take(self->value, fl_value_new_string(code)); + fl_value_append_take(self->value, + fl_value_new_string(message != nullptr ? message : "")); + fl_value_append_take(self->value, details != nullptr ? fl_value_ref(details) + : fl_value_new_null()); + return self; +} + +G_DECLARE_FINAL_TYPE( + FirebaseCoreFirebaseCoreHostApiOptionsFromResourceResponse, + firebase_core_firebase_core_host_api_options_from_resource_response, + FIREBASE_CORE, FIREBASE_CORE_HOST_API_OPTIONS_FROM_RESOURCE_RESPONSE, + GObject) + +struct _FirebaseCoreFirebaseCoreHostApiOptionsFromResourceResponse { + GObject parent_instance; + + FlValue* value; +}; + +G_DEFINE_TYPE( + FirebaseCoreFirebaseCoreHostApiOptionsFromResourceResponse, + firebase_core_firebase_core_host_api_options_from_resource_response, + G_TYPE_OBJECT) + +static void +firebase_core_firebase_core_host_api_options_from_resource_response_dispose( + GObject* object) { + FirebaseCoreFirebaseCoreHostApiOptionsFromResourceResponse* self = + FIREBASE_CORE_FIREBASE_CORE_HOST_API_OPTIONS_FROM_RESOURCE_RESPONSE( + object); + g_clear_pointer(&self->value, fl_value_unref); + G_OBJECT_CLASS( + firebase_core_firebase_core_host_api_options_from_resource_response_parent_class) + ->dispose(object); +} + +static void +firebase_core_firebase_core_host_api_options_from_resource_response_init( + FirebaseCoreFirebaseCoreHostApiOptionsFromResourceResponse* self) {} + +static void +firebase_core_firebase_core_host_api_options_from_resource_response_class_init( + FirebaseCoreFirebaseCoreHostApiOptionsFromResourceResponseClass* klass) { + G_OBJECT_CLASS(klass)->dispose = + firebase_core_firebase_core_host_api_options_from_resource_response_dispose; +} + +static FirebaseCoreFirebaseCoreHostApiOptionsFromResourceResponse* +firebase_core_firebase_core_host_api_options_from_resource_response_new( + FirebaseCoreCoreFirebaseOptions* return_value) { + FirebaseCoreFirebaseCoreHostApiOptionsFromResourceResponse* self = + FIREBASE_CORE_FIREBASE_CORE_HOST_API_OPTIONS_FROM_RESOURCE_RESPONSE(g_object_new( + firebase_core_firebase_core_host_api_options_from_resource_response_get_type(), + nullptr)); + self->value = fl_value_new_list(); + fl_value_append_take( + self->value, + fl_value_new_custom_object(firebase_core_core_firebase_options_type_id, + G_OBJECT(return_value))); + return self; +} + +static FirebaseCoreFirebaseCoreHostApiOptionsFromResourceResponse* +firebase_core_firebase_core_host_api_options_from_resource_response_new_error( + const gchar* code, const gchar* message, FlValue* details) { + FirebaseCoreFirebaseCoreHostApiOptionsFromResourceResponse* self = + FIREBASE_CORE_FIREBASE_CORE_HOST_API_OPTIONS_FROM_RESOURCE_RESPONSE(g_object_new( + firebase_core_firebase_core_host_api_options_from_resource_response_get_type(), + nullptr)); + self->value = fl_value_new_list(); + fl_value_append_take(self->value, fl_value_new_string(code)); + fl_value_append_take(self->value, + fl_value_new_string(message != nullptr ? message : "")); + fl_value_append_take(self->value, details != nullptr ? fl_value_ref(details) + : fl_value_new_null()); + return self; +} + +struct _FirebaseCoreFirebaseCoreHostApi { + GObject parent_instance; + + const FirebaseCoreFirebaseCoreHostApiVTable* vtable; + gpointer user_data; + GDestroyNotify user_data_free_func; +}; + +G_DEFINE_TYPE(FirebaseCoreFirebaseCoreHostApi, + firebase_core_firebase_core_host_api, G_TYPE_OBJECT) + +static void firebase_core_firebase_core_host_api_dispose(GObject* object) { + FirebaseCoreFirebaseCoreHostApi* self = + FIREBASE_CORE_FIREBASE_CORE_HOST_API(object); + if (self->user_data != nullptr) { + self->user_data_free_func(self->user_data); + } + self->user_data = nullptr; + G_OBJECT_CLASS(firebase_core_firebase_core_host_api_parent_class) + ->dispose(object); +} + +static void firebase_core_firebase_core_host_api_init( + FirebaseCoreFirebaseCoreHostApi* self) {} + +static void firebase_core_firebase_core_host_api_class_init( + FirebaseCoreFirebaseCoreHostApiClass* klass) { + G_OBJECT_CLASS(klass)->dispose = firebase_core_firebase_core_host_api_dispose; +} + +static FirebaseCoreFirebaseCoreHostApi* +firebase_core_firebase_core_host_api_new( + const FirebaseCoreFirebaseCoreHostApiVTable* vtable, gpointer user_data, + GDestroyNotify user_data_free_func) { + FirebaseCoreFirebaseCoreHostApi* self = FIREBASE_CORE_FIREBASE_CORE_HOST_API( + g_object_new(firebase_core_firebase_core_host_api_get_type(), nullptr)); + self->vtable = vtable; + self->user_data = user_data; + self->user_data_free_func = user_data_free_func; + return self; +} + +static void firebase_core_firebase_core_host_api_initialize_app_cb( + FlBasicMessageChannel* channel, FlValue* message_, + FlBasicMessageChannelResponseHandle* response_handle, gpointer user_data) { + FirebaseCoreFirebaseCoreHostApi* self = + FIREBASE_CORE_FIREBASE_CORE_HOST_API(user_data); + + if (self->vtable == nullptr || self->vtable->initialize_app == nullptr) { + return; + } + + FlValue* value0 = fl_value_get_list_value(message_, 0); + const gchar* app_name = fl_value_get_string(value0); + FlValue* value1 = fl_value_get_list_value(message_, 1); + FirebaseCoreCoreFirebaseOptions* initialize_app_request = + FIREBASE_CORE_CORE_FIREBASE_OPTIONS( + fl_value_get_custom_value_object(value1)); + g_autoptr(FirebaseCoreFirebaseCoreHostApiResponseHandle) handle = + firebase_core_firebase_core_host_api_response_handle_new(channel, + response_handle); + self->vtable->initialize_app(app_name, initialize_app_request, handle, + self->user_data); +} + +static void firebase_core_firebase_core_host_api_initialize_core_cb( + FlBasicMessageChannel* channel, FlValue* message_, + FlBasicMessageChannelResponseHandle* response_handle, gpointer user_data) { + FirebaseCoreFirebaseCoreHostApi* self = + FIREBASE_CORE_FIREBASE_CORE_HOST_API(user_data); + + if (self->vtable == nullptr || self->vtable->initialize_core == nullptr) { + return; + } + + g_autoptr(FirebaseCoreFirebaseCoreHostApiResponseHandle) handle = + firebase_core_firebase_core_host_api_response_handle_new(channel, + response_handle); + self->vtable->initialize_core(handle, self->user_data); +} + +static void firebase_core_firebase_core_host_api_options_from_resource_cb( + FlBasicMessageChannel* channel, FlValue* message_, + FlBasicMessageChannelResponseHandle* response_handle, gpointer user_data) { + FirebaseCoreFirebaseCoreHostApi* self = + FIREBASE_CORE_FIREBASE_CORE_HOST_API(user_data); + + if (self->vtable == nullptr || + self->vtable->options_from_resource == nullptr) { + return; + } + + g_autoptr(FirebaseCoreFirebaseCoreHostApiResponseHandle) handle = + firebase_core_firebase_core_host_api_response_handle_new(channel, + response_handle); + self->vtable->options_from_resource(handle, self->user_data); +} + +void firebase_core_firebase_core_host_api_set_method_handlers( + FlBinaryMessenger* messenger, const gchar* suffix, + const FirebaseCoreFirebaseCoreHostApiVTable* vtable, gpointer user_data, + GDestroyNotify user_data_free_func) { + g_autofree gchar* dot_suffix = + suffix != nullptr ? g_strdup_printf(".%s", suffix) : g_strdup(""); + g_autoptr(FirebaseCoreFirebaseCoreHostApi) api_data = + firebase_core_firebase_core_host_api_new(vtable, user_data, + user_data_free_func); + + g_autoptr(FirebaseCoreMessageCodec) codec = firebase_core_message_codec_new(); + g_autofree gchar* initialize_app_channel_name = g_strdup_printf( + "dev.flutter.pigeon.firebase_core_platform_interface.FirebaseCoreHostApi." + "initializeApp%s", + dot_suffix); + g_autoptr(FlBasicMessageChannel) initialize_app_channel = + fl_basic_message_channel_new(messenger, initialize_app_channel_name, + FL_MESSAGE_CODEC(codec)); + fl_basic_message_channel_set_message_handler( + initialize_app_channel, + firebase_core_firebase_core_host_api_initialize_app_cb, + g_object_ref(api_data), g_object_unref); + g_autofree gchar* initialize_core_channel_name = g_strdup_printf( + "dev.flutter.pigeon.firebase_core_platform_interface.FirebaseCoreHostApi." + "initializeCore%s", + dot_suffix); + g_autoptr(FlBasicMessageChannel) initialize_core_channel = + fl_basic_message_channel_new(messenger, initialize_core_channel_name, + FL_MESSAGE_CODEC(codec)); + fl_basic_message_channel_set_message_handler( + initialize_core_channel, + firebase_core_firebase_core_host_api_initialize_core_cb, + g_object_ref(api_data), g_object_unref); + g_autofree gchar* options_from_resource_channel_name = g_strdup_printf( + "dev.flutter.pigeon.firebase_core_platform_interface.FirebaseCoreHostApi." + "optionsFromResource%s", + dot_suffix); + g_autoptr(FlBasicMessageChannel) options_from_resource_channel = + fl_basic_message_channel_new(messenger, + options_from_resource_channel_name, + FL_MESSAGE_CODEC(codec)); + fl_basic_message_channel_set_message_handler( + options_from_resource_channel, + firebase_core_firebase_core_host_api_options_from_resource_cb, + g_object_ref(api_data), g_object_unref); +} + +void firebase_core_firebase_core_host_api_clear_method_handlers( + FlBinaryMessenger* messenger, const gchar* suffix) { + g_autofree gchar* dot_suffix = + suffix != nullptr ? g_strdup_printf(".%s", suffix) : g_strdup(""); + + g_autoptr(FirebaseCoreMessageCodec) codec = firebase_core_message_codec_new(); + g_autofree gchar* initialize_app_channel_name = g_strdup_printf( + "dev.flutter.pigeon.firebase_core_platform_interface.FirebaseCoreHostApi." + "initializeApp%s", + dot_suffix); + g_autoptr(FlBasicMessageChannel) initialize_app_channel = + fl_basic_message_channel_new(messenger, initialize_app_channel_name, + FL_MESSAGE_CODEC(codec)); + fl_basic_message_channel_set_message_handler(initialize_app_channel, nullptr, + nullptr, nullptr); + g_autofree gchar* initialize_core_channel_name = g_strdup_printf( + "dev.flutter.pigeon.firebase_core_platform_interface.FirebaseCoreHostApi." + "initializeCore%s", + dot_suffix); + g_autoptr(FlBasicMessageChannel) initialize_core_channel = + fl_basic_message_channel_new(messenger, initialize_core_channel_name, + FL_MESSAGE_CODEC(codec)); + fl_basic_message_channel_set_message_handler(initialize_core_channel, nullptr, + nullptr, nullptr); + g_autofree gchar* options_from_resource_channel_name = g_strdup_printf( + "dev.flutter.pigeon.firebase_core_platform_interface.FirebaseCoreHostApi." + "optionsFromResource%s", + dot_suffix); + g_autoptr(FlBasicMessageChannel) options_from_resource_channel = + fl_basic_message_channel_new(messenger, + options_from_resource_channel_name, + FL_MESSAGE_CODEC(codec)); + fl_basic_message_channel_set_message_handler(options_from_resource_channel, + nullptr, nullptr, nullptr); +} + +void firebase_core_firebase_core_host_api_respond_initialize_app( + FirebaseCoreFirebaseCoreHostApiResponseHandle* response_handle, + FirebaseCoreCoreInitializeResponse* return_value) { + g_autoptr(FirebaseCoreFirebaseCoreHostApiInitializeAppResponse) response = + firebase_core_firebase_core_host_api_initialize_app_response_new( + return_value); + g_autoptr(GError) error = nullptr; + if (!fl_basic_message_channel_respond(response_handle->channel, + response_handle->response_handle, + response->value, &error)) { + g_warning("Failed to send response to %s.%s: %s", "FirebaseCoreHostApi", + "initializeApp", error->message); + } +} + +void firebase_core_firebase_core_host_api_respond_error_initialize_app( + FirebaseCoreFirebaseCoreHostApiResponseHandle* response_handle, + const gchar* code, const gchar* message, FlValue* details) { + g_autoptr(FirebaseCoreFirebaseCoreHostApiInitializeAppResponse) response = + firebase_core_firebase_core_host_api_initialize_app_response_new_error( + code, message, details); + g_autoptr(GError) error = nullptr; + if (!fl_basic_message_channel_respond(response_handle->channel, + response_handle->response_handle, + response->value, &error)) { + g_warning("Failed to send response to %s.%s: %s", "FirebaseCoreHostApi", + "initializeApp", error->message); + } +} + +void firebase_core_firebase_core_host_api_respond_initialize_core( + FirebaseCoreFirebaseCoreHostApiResponseHandle* response_handle, + FlValue* return_value) { + g_autoptr(FirebaseCoreFirebaseCoreHostApiInitializeCoreResponse) response = + firebase_core_firebase_core_host_api_initialize_core_response_new( + return_value); + g_autoptr(GError) error = nullptr; + if (!fl_basic_message_channel_respond(response_handle->channel, + response_handle->response_handle, + response->value, &error)) { + g_warning("Failed to send response to %s.%s: %s", "FirebaseCoreHostApi", + "initializeCore", error->message); + } +} + +void firebase_core_firebase_core_host_api_respond_error_initialize_core( + FirebaseCoreFirebaseCoreHostApiResponseHandle* response_handle, + const gchar* code, const gchar* message, FlValue* details) { + g_autoptr(FirebaseCoreFirebaseCoreHostApiInitializeCoreResponse) response = + firebase_core_firebase_core_host_api_initialize_core_response_new_error( + code, message, details); + g_autoptr(GError) error = nullptr; + if (!fl_basic_message_channel_respond(response_handle->channel, + response_handle->response_handle, + response->value, &error)) { + g_warning("Failed to send response to %s.%s: %s", "FirebaseCoreHostApi", + "initializeCore", error->message); + } +} + +void firebase_core_firebase_core_host_api_respond_options_from_resource( + FirebaseCoreFirebaseCoreHostApiResponseHandle* response_handle, + FirebaseCoreCoreFirebaseOptions* return_value) { + g_autoptr( + FirebaseCoreFirebaseCoreHostApiOptionsFromResourceResponse) response = + firebase_core_firebase_core_host_api_options_from_resource_response_new( + return_value); + g_autoptr(GError) error = nullptr; + if (!fl_basic_message_channel_respond(response_handle->channel, + response_handle->response_handle, + response->value, &error)) { + g_warning("Failed to send response to %s.%s: %s", "FirebaseCoreHostApi", + "optionsFromResource", error->message); + } +} + +void firebase_core_firebase_core_host_api_respond_error_options_from_resource( + FirebaseCoreFirebaseCoreHostApiResponseHandle* response_handle, + const gchar* code, const gchar* message, FlValue* details) { + g_autoptr( + FirebaseCoreFirebaseCoreHostApiOptionsFromResourceResponse) response = + firebase_core_firebase_core_host_api_options_from_resource_response_new_error( + code, message, details); + g_autoptr(GError) error = nullptr; + if (!fl_basic_message_channel_respond(response_handle->channel, + response_handle->response_handle, + response->value, &error)) { + g_warning("Failed to send response to %s.%s: %s", "FirebaseCoreHostApi", + "optionsFromResource", error->message); + } +} + +struct _FirebaseCoreFirebaseAppHostApiResponseHandle { + GObject parent_instance; + + FlBasicMessageChannel* channel; + FlBasicMessageChannelResponseHandle* response_handle; +}; + +G_DEFINE_TYPE(FirebaseCoreFirebaseAppHostApiResponseHandle, + firebase_core_firebase_app_host_api_response_handle, + G_TYPE_OBJECT) + +static void firebase_core_firebase_app_host_api_response_handle_dispose( + GObject* object) { + FirebaseCoreFirebaseAppHostApiResponseHandle* self = + FIREBASE_CORE_FIREBASE_APP_HOST_API_RESPONSE_HANDLE(object); + g_clear_object(&self->channel); + g_clear_object(&self->response_handle); + G_OBJECT_CLASS( + firebase_core_firebase_app_host_api_response_handle_parent_class) + ->dispose(object); +} + +static void firebase_core_firebase_app_host_api_response_handle_init( + FirebaseCoreFirebaseAppHostApiResponseHandle* self) {} + +static void firebase_core_firebase_app_host_api_response_handle_class_init( + FirebaseCoreFirebaseAppHostApiResponseHandleClass* klass) { + G_OBJECT_CLASS(klass)->dispose = + firebase_core_firebase_app_host_api_response_handle_dispose; +} + +static FirebaseCoreFirebaseAppHostApiResponseHandle* +firebase_core_firebase_app_host_api_response_handle_new( + FlBasicMessageChannel* channel, + FlBasicMessageChannelResponseHandle* response_handle) { + FirebaseCoreFirebaseAppHostApiResponseHandle* self = + FIREBASE_CORE_FIREBASE_APP_HOST_API_RESPONSE_HANDLE(g_object_new( + firebase_core_firebase_app_host_api_response_handle_get_type(), + nullptr)); + self->channel = FL_BASIC_MESSAGE_CHANNEL(g_object_ref(channel)); + self->response_handle = + FL_BASIC_MESSAGE_CHANNEL_RESPONSE_HANDLE(g_object_ref(response_handle)); + return self; +} + +G_DECLARE_FINAL_TYPE( + FirebaseCoreFirebaseAppHostApiSetAutomaticDataCollectionEnabledResponse, + firebase_core_firebase_app_host_api_set_automatic_data_collection_enabled_response, + FIREBASE_CORE, + FIREBASE_APP_HOST_API_SET_AUTOMATIC_DATA_COLLECTION_ENABLED_RESPONSE, + GObject) + +struct + _FirebaseCoreFirebaseAppHostApiSetAutomaticDataCollectionEnabledResponse { + GObject parent_instance; + + FlValue* value; +}; + +G_DEFINE_TYPE( + FirebaseCoreFirebaseAppHostApiSetAutomaticDataCollectionEnabledResponse, + firebase_core_firebase_app_host_api_set_automatic_data_collection_enabled_response, + G_TYPE_OBJECT) + +static void +firebase_core_firebase_app_host_api_set_automatic_data_collection_enabled_response_dispose( + GObject* object) { + FirebaseCoreFirebaseAppHostApiSetAutomaticDataCollectionEnabledResponse* self = + FIREBASE_CORE_FIREBASE_APP_HOST_API_SET_AUTOMATIC_DATA_COLLECTION_ENABLED_RESPONSE( + object); + g_clear_pointer(&self->value, fl_value_unref); + G_OBJECT_CLASS( + firebase_core_firebase_app_host_api_set_automatic_data_collection_enabled_response_parent_class) + ->dispose(object); +} + +static void +firebase_core_firebase_app_host_api_set_automatic_data_collection_enabled_response_init( + FirebaseCoreFirebaseAppHostApiSetAutomaticDataCollectionEnabledResponse* + self) {} + +static void +firebase_core_firebase_app_host_api_set_automatic_data_collection_enabled_response_class_init( + FirebaseCoreFirebaseAppHostApiSetAutomaticDataCollectionEnabledResponseClass* + klass) { + G_OBJECT_CLASS(klass)->dispose = + firebase_core_firebase_app_host_api_set_automatic_data_collection_enabled_response_dispose; +} + +static FirebaseCoreFirebaseAppHostApiSetAutomaticDataCollectionEnabledResponse* +firebase_core_firebase_app_host_api_set_automatic_data_collection_enabled_response_new() { + FirebaseCoreFirebaseAppHostApiSetAutomaticDataCollectionEnabledResponse* self = + FIREBASE_CORE_FIREBASE_APP_HOST_API_SET_AUTOMATIC_DATA_COLLECTION_ENABLED_RESPONSE( + g_object_new( + firebase_core_firebase_app_host_api_set_automatic_data_collection_enabled_response_get_type(), + nullptr)); + self->value = fl_value_new_list(); + fl_value_append_take(self->value, fl_value_new_null()); + return self; +} + +static FirebaseCoreFirebaseAppHostApiSetAutomaticDataCollectionEnabledResponse* +firebase_core_firebase_app_host_api_set_automatic_data_collection_enabled_response_new_error( + const gchar* code, const gchar* message, FlValue* details) { + FirebaseCoreFirebaseAppHostApiSetAutomaticDataCollectionEnabledResponse* self = + FIREBASE_CORE_FIREBASE_APP_HOST_API_SET_AUTOMATIC_DATA_COLLECTION_ENABLED_RESPONSE( + g_object_new( + firebase_core_firebase_app_host_api_set_automatic_data_collection_enabled_response_get_type(), + nullptr)); + self->value = fl_value_new_list(); + fl_value_append_take(self->value, fl_value_new_string(code)); + fl_value_append_take(self->value, + fl_value_new_string(message != nullptr ? message : "")); + fl_value_append_take(self->value, details != nullptr ? fl_value_ref(details) + : fl_value_new_null()); + return self; +} + +G_DECLARE_FINAL_TYPE( + FirebaseCoreFirebaseAppHostApiSetAutomaticResourceManagementEnabledResponse, + firebase_core_firebase_app_host_api_set_automatic_resource_management_enabled_response, + FIREBASE_CORE, + FIREBASE_APP_HOST_API_SET_AUTOMATIC_RESOURCE_MANAGEMENT_ENABLED_RESPONSE, + GObject) + +struct + _FirebaseCoreFirebaseAppHostApiSetAutomaticResourceManagementEnabledResponse { + GObject parent_instance; + + FlValue* value; +}; + +G_DEFINE_TYPE( + FirebaseCoreFirebaseAppHostApiSetAutomaticResourceManagementEnabledResponse, + firebase_core_firebase_app_host_api_set_automatic_resource_management_enabled_response, + G_TYPE_OBJECT) + +static void +firebase_core_firebase_app_host_api_set_automatic_resource_management_enabled_response_dispose( + GObject* object) { + FirebaseCoreFirebaseAppHostApiSetAutomaticResourceManagementEnabledResponse* self = + FIREBASE_CORE_FIREBASE_APP_HOST_API_SET_AUTOMATIC_RESOURCE_MANAGEMENT_ENABLED_RESPONSE( + object); + g_clear_pointer(&self->value, fl_value_unref); + G_OBJECT_CLASS( + firebase_core_firebase_app_host_api_set_automatic_resource_management_enabled_response_parent_class) + ->dispose(object); +} + +static void +firebase_core_firebase_app_host_api_set_automatic_resource_management_enabled_response_init( + FirebaseCoreFirebaseAppHostApiSetAutomaticResourceManagementEnabledResponse* + self) {} + +static void +firebase_core_firebase_app_host_api_set_automatic_resource_management_enabled_response_class_init( + FirebaseCoreFirebaseAppHostApiSetAutomaticResourceManagementEnabledResponseClass* + klass) { + G_OBJECT_CLASS(klass)->dispose = + firebase_core_firebase_app_host_api_set_automatic_resource_management_enabled_response_dispose; +} + +static FirebaseCoreFirebaseAppHostApiSetAutomaticResourceManagementEnabledResponse* +firebase_core_firebase_app_host_api_set_automatic_resource_management_enabled_response_new() { + FirebaseCoreFirebaseAppHostApiSetAutomaticResourceManagementEnabledResponse* self = + FIREBASE_CORE_FIREBASE_APP_HOST_API_SET_AUTOMATIC_RESOURCE_MANAGEMENT_ENABLED_RESPONSE( + g_object_new( + firebase_core_firebase_app_host_api_set_automatic_resource_management_enabled_response_get_type(), + nullptr)); + self->value = fl_value_new_list(); + fl_value_append_take(self->value, fl_value_new_null()); + return self; +} + +static FirebaseCoreFirebaseAppHostApiSetAutomaticResourceManagementEnabledResponse* +firebase_core_firebase_app_host_api_set_automatic_resource_management_enabled_response_new_error( + const gchar* code, const gchar* message, FlValue* details) { + FirebaseCoreFirebaseAppHostApiSetAutomaticResourceManagementEnabledResponse* self = + FIREBASE_CORE_FIREBASE_APP_HOST_API_SET_AUTOMATIC_RESOURCE_MANAGEMENT_ENABLED_RESPONSE( + g_object_new( + firebase_core_firebase_app_host_api_set_automatic_resource_management_enabled_response_get_type(), + nullptr)); + self->value = fl_value_new_list(); + fl_value_append_take(self->value, fl_value_new_string(code)); + fl_value_append_take(self->value, + fl_value_new_string(message != nullptr ? message : "")); + fl_value_append_take(self->value, details != nullptr ? fl_value_ref(details) + : fl_value_new_null()); + return self; +} + +G_DECLARE_FINAL_TYPE(FirebaseCoreFirebaseAppHostApiDeleteResponse, + firebase_core_firebase_app_host_api_delete_response, + FIREBASE_CORE, FIREBASE_APP_HOST_API_DELETE_RESPONSE, + GObject) + +struct _FirebaseCoreFirebaseAppHostApiDeleteResponse { + GObject parent_instance; + + FlValue* value; +}; + +G_DEFINE_TYPE(FirebaseCoreFirebaseAppHostApiDeleteResponse, + firebase_core_firebase_app_host_api_delete_response, + G_TYPE_OBJECT) + +static void firebase_core_firebase_app_host_api_delete_response_dispose( + GObject* object) { + FirebaseCoreFirebaseAppHostApiDeleteResponse* self = + FIREBASE_CORE_FIREBASE_APP_HOST_API_DELETE_RESPONSE(object); + g_clear_pointer(&self->value, fl_value_unref); + G_OBJECT_CLASS( + firebase_core_firebase_app_host_api_delete_response_parent_class) + ->dispose(object); +} + +static void firebase_core_firebase_app_host_api_delete_response_init( + FirebaseCoreFirebaseAppHostApiDeleteResponse* self) {} + +static void firebase_core_firebase_app_host_api_delete_response_class_init( + FirebaseCoreFirebaseAppHostApiDeleteResponseClass* klass) { + G_OBJECT_CLASS(klass)->dispose = + firebase_core_firebase_app_host_api_delete_response_dispose; +} + +static FirebaseCoreFirebaseAppHostApiDeleteResponse* +firebase_core_firebase_app_host_api_delete_response_new() { + FirebaseCoreFirebaseAppHostApiDeleteResponse* self = + FIREBASE_CORE_FIREBASE_APP_HOST_API_DELETE_RESPONSE(g_object_new( + firebase_core_firebase_app_host_api_delete_response_get_type(), + nullptr)); + self->value = fl_value_new_list(); + fl_value_append_take(self->value, fl_value_new_null()); + return self; +} + +static FirebaseCoreFirebaseAppHostApiDeleteResponse* +firebase_core_firebase_app_host_api_delete_response_new_error( + const gchar* code, const gchar* message, FlValue* details) { + FirebaseCoreFirebaseAppHostApiDeleteResponse* self = + FIREBASE_CORE_FIREBASE_APP_HOST_API_DELETE_RESPONSE(g_object_new( + firebase_core_firebase_app_host_api_delete_response_get_type(), + nullptr)); + self->value = fl_value_new_list(); + fl_value_append_take(self->value, fl_value_new_string(code)); + fl_value_append_take(self->value, + fl_value_new_string(message != nullptr ? message : "")); + fl_value_append_take(self->value, details != nullptr ? fl_value_ref(details) + : fl_value_new_null()); + return self; +} + +struct _FirebaseCoreFirebaseAppHostApi { + GObject parent_instance; + + const FirebaseCoreFirebaseAppHostApiVTable* vtable; + gpointer user_data; + GDestroyNotify user_data_free_func; +}; + +G_DEFINE_TYPE(FirebaseCoreFirebaseAppHostApi, + firebase_core_firebase_app_host_api, G_TYPE_OBJECT) + +static void firebase_core_firebase_app_host_api_dispose(GObject* object) { + FirebaseCoreFirebaseAppHostApi* self = + FIREBASE_CORE_FIREBASE_APP_HOST_API(object); + if (self->user_data != nullptr) { + self->user_data_free_func(self->user_data); + } + self->user_data = nullptr; + G_OBJECT_CLASS(firebase_core_firebase_app_host_api_parent_class) + ->dispose(object); +} + +static void firebase_core_firebase_app_host_api_init( + FirebaseCoreFirebaseAppHostApi* self) {} + +static void firebase_core_firebase_app_host_api_class_init( + FirebaseCoreFirebaseAppHostApiClass* klass) { + G_OBJECT_CLASS(klass)->dispose = firebase_core_firebase_app_host_api_dispose; +} + +static FirebaseCoreFirebaseAppHostApi* firebase_core_firebase_app_host_api_new( + const FirebaseCoreFirebaseAppHostApiVTable* vtable, gpointer user_data, + GDestroyNotify user_data_free_func) { + FirebaseCoreFirebaseAppHostApi* self = FIREBASE_CORE_FIREBASE_APP_HOST_API( + g_object_new(firebase_core_firebase_app_host_api_get_type(), nullptr)); + self->vtable = vtable; + self->user_data = user_data; + self->user_data_free_func = user_data_free_func; + return self; +} + +static void +firebase_core_firebase_app_host_api_set_automatic_data_collection_enabled_cb( + FlBasicMessageChannel* channel, FlValue* message_, + FlBasicMessageChannelResponseHandle* response_handle, gpointer user_data) { + FirebaseCoreFirebaseAppHostApi* self = + FIREBASE_CORE_FIREBASE_APP_HOST_API(user_data); + + if (self->vtable == nullptr || + self->vtable->set_automatic_data_collection_enabled == nullptr) { + return; + } + + FlValue* value0 = fl_value_get_list_value(message_, 0); + const gchar* app_name = fl_value_get_string(value0); + FlValue* value1 = fl_value_get_list_value(message_, 1); + gboolean enabled = fl_value_get_bool(value1); + g_autoptr(FirebaseCoreFirebaseAppHostApiResponseHandle) handle = + firebase_core_firebase_app_host_api_response_handle_new(channel, + response_handle); + self->vtable->set_automatic_data_collection_enabled(app_name, enabled, handle, + self->user_data); +} + +static void +firebase_core_firebase_app_host_api_set_automatic_resource_management_enabled_cb( + FlBasicMessageChannel* channel, FlValue* message_, + FlBasicMessageChannelResponseHandle* response_handle, gpointer user_data) { + FirebaseCoreFirebaseAppHostApi* self = + FIREBASE_CORE_FIREBASE_APP_HOST_API(user_data); + + if (self->vtable == nullptr || + self->vtable->set_automatic_resource_management_enabled == nullptr) { + return; + } + + FlValue* value0 = fl_value_get_list_value(message_, 0); + const gchar* app_name = fl_value_get_string(value0); + FlValue* value1 = fl_value_get_list_value(message_, 1); + gboolean enabled = fl_value_get_bool(value1); + g_autoptr(FirebaseCoreFirebaseAppHostApiResponseHandle) handle = + firebase_core_firebase_app_host_api_response_handle_new(channel, + response_handle); + self->vtable->set_automatic_resource_management_enabled( + app_name, enabled, handle, self->user_data); +} + +static void firebase_core_firebase_app_host_api_delete_cb( + FlBasicMessageChannel* channel, FlValue* message_, + FlBasicMessageChannelResponseHandle* response_handle, gpointer user_data) { + FirebaseCoreFirebaseAppHostApi* self = + FIREBASE_CORE_FIREBASE_APP_HOST_API(user_data); + + if (self->vtable == nullptr || self->vtable->delete_ == nullptr) { + return; + } + + FlValue* value0 = fl_value_get_list_value(message_, 0); + const gchar* app_name = fl_value_get_string(value0); + g_autoptr(FirebaseCoreFirebaseAppHostApiResponseHandle) handle = + firebase_core_firebase_app_host_api_response_handle_new(channel, + response_handle); + self->vtable->delete_(app_name, handle, self->user_data); +} + +void firebase_core_firebase_app_host_api_set_method_handlers( + FlBinaryMessenger* messenger, const gchar* suffix, + const FirebaseCoreFirebaseAppHostApiVTable* vtable, gpointer user_data, + GDestroyNotify user_data_free_func) { + g_autofree gchar* dot_suffix = + suffix != nullptr ? g_strdup_printf(".%s", suffix) : g_strdup(""); + g_autoptr(FirebaseCoreFirebaseAppHostApi) api_data = + firebase_core_firebase_app_host_api_new(vtable, user_data, + user_data_free_func); + + g_autoptr(FirebaseCoreMessageCodec) codec = firebase_core_message_codec_new(); + g_autofree gchar* set_automatic_data_collection_enabled_channel_name = + g_strdup_printf( + "dev.flutter.pigeon.firebase_core_platform_interface." + "FirebaseAppHostApi.setAutomaticDataCollectionEnabled%s", + dot_suffix); + g_autoptr(FlBasicMessageChannel) + set_automatic_data_collection_enabled_channel = + fl_basic_message_channel_new( + messenger, set_automatic_data_collection_enabled_channel_name, + FL_MESSAGE_CODEC(codec)); + fl_basic_message_channel_set_message_handler( + set_automatic_data_collection_enabled_channel, + firebase_core_firebase_app_host_api_set_automatic_data_collection_enabled_cb, + g_object_ref(api_data), g_object_unref); + g_autofree gchar* set_automatic_resource_management_enabled_channel_name = + g_strdup_printf( + "dev.flutter.pigeon.firebase_core_platform_interface." + "FirebaseAppHostApi.setAutomaticResourceManagementEnabled%s", + dot_suffix); + g_autoptr(FlBasicMessageChannel) + set_automatic_resource_management_enabled_channel = + fl_basic_message_channel_new( + messenger, set_automatic_resource_management_enabled_channel_name, + FL_MESSAGE_CODEC(codec)); + fl_basic_message_channel_set_message_handler( + set_automatic_resource_management_enabled_channel, + firebase_core_firebase_app_host_api_set_automatic_resource_management_enabled_cb, + g_object_ref(api_data), g_object_unref); + g_autofree gchar* delete_channel_name = g_strdup_printf( + "dev.flutter.pigeon.firebase_core_platform_interface.FirebaseAppHostApi." + "delete%s", + dot_suffix); + g_autoptr(FlBasicMessageChannel) delete_channel = + fl_basic_message_channel_new(messenger, delete_channel_name, + FL_MESSAGE_CODEC(codec)); + fl_basic_message_channel_set_message_handler( + delete_channel, firebase_core_firebase_app_host_api_delete_cb, + g_object_ref(api_data), g_object_unref); +} + +void firebase_core_firebase_app_host_api_clear_method_handlers( + FlBinaryMessenger* messenger, const gchar* suffix) { + g_autofree gchar* dot_suffix = + suffix != nullptr ? g_strdup_printf(".%s", suffix) : g_strdup(""); + + g_autoptr(FirebaseCoreMessageCodec) codec = firebase_core_message_codec_new(); + g_autofree gchar* set_automatic_data_collection_enabled_channel_name = + g_strdup_printf( + "dev.flutter.pigeon.firebase_core_platform_interface." + "FirebaseAppHostApi.setAutomaticDataCollectionEnabled%s", + dot_suffix); + g_autoptr(FlBasicMessageChannel) + set_automatic_data_collection_enabled_channel = + fl_basic_message_channel_new( + messenger, set_automatic_data_collection_enabled_channel_name, + FL_MESSAGE_CODEC(codec)); + fl_basic_message_channel_set_message_handler( + set_automatic_data_collection_enabled_channel, nullptr, nullptr, nullptr); + g_autofree gchar* set_automatic_resource_management_enabled_channel_name = + g_strdup_printf( + "dev.flutter.pigeon.firebase_core_platform_interface." + "FirebaseAppHostApi.setAutomaticResourceManagementEnabled%s", + dot_suffix); + g_autoptr(FlBasicMessageChannel) + set_automatic_resource_management_enabled_channel = + fl_basic_message_channel_new( + messenger, set_automatic_resource_management_enabled_channel_name, + FL_MESSAGE_CODEC(codec)); + fl_basic_message_channel_set_message_handler( + set_automatic_resource_management_enabled_channel, nullptr, nullptr, + nullptr); + g_autofree gchar* delete_channel_name = g_strdup_printf( + "dev.flutter.pigeon.firebase_core_platform_interface.FirebaseAppHostApi." + "delete%s", + dot_suffix); + g_autoptr(FlBasicMessageChannel) delete_channel = + fl_basic_message_channel_new(messenger, delete_channel_name, + FL_MESSAGE_CODEC(codec)); + fl_basic_message_channel_set_message_handler(delete_channel, nullptr, nullptr, + nullptr); +} + +void firebase_core_firebase_app_host_api_respond_set_automatic_data_collection_enabled( + FirebaseCoreFirebaseAppHostApiResponseHandle* response_handle) { + g_autoptr( + FirebaseCoreFirebaseAppHostApiSetAutomaticDataCollectionEnabledResponse) response = + firebase_core_firebase_app_host_api_set_automatic_data_collection_enabled_response_new(); + g_autoptr(GError) error = nullptr; + if (!fl_basic_message_channel_respond(response_handle->channel, + response_handle->response_handle, + response->value, &error)) { + g_warning("Failed to send response to %s.%s: %s", "FirebaseAppHostApi", + "setAutomaticDataCollectionEnabled", error->message); + } +} + +void firebase_core_firebase_app_host_api_respond_error_set_automatic_data_collection_enabled( + FirebaseCoreFirebaseAppHostApiResponseHandle* response_handle, + const gchar* code, const gchar* message, FlValue* details) { + g_autoptr( + FirebaseCoreFirebaseAppHostApiSetAutomaticDataCollectionEnabledResponse) + response = + firebase_core_firebase_app_host_api_set_automatic_data_collection_enabled_response_new_error( + code, message, details); + g_autoptr(GError) error = nullptr; + if (!fl_basic_message_channel_respond(response_handle->channel, + response_handle->response_handle, + response->value, &error)) { + g_warning("Failed to send response to %s.%s: %s", "FirebaseAppHostApi", + "setAutomaticDataCollectionEnabled", error->message); + } +} + +void firebase_core_firebase_app_host_api_respond_set_automatic_resource_management_enabled( + FirebaseCoreFirebaseAppHostApiResponseHandle* response_handle) { + g_autoptr( + FirebaseCoreFirebaseAppHostApiSetAutomaticResourceManagementEnabledResponse) + response = + firebase_core_firebase_app_host_api_set_automatic_resource_management_enabled_response_new(); + g_autoptr(GError) error = nullptr; + if (!fl_basic_message_channel_respond(response_handle->channel, + response_handle->response_handle, + response->value, &error)) { + g_warning("Failed to send response to %s.%s: %s", "FirebaseAppHostApi", + "setAutomaticResourceManagementEnabled", error->message); + } +} + +void firebase_core_firebase_app_host_api_respond_error_set_automatic_resource_management_enabled( + FirebaseCoreFirebaseAppHostApiResponseHandle* response_handle, + const gchar* code, const gchar* message, FlValue* details) { + g_autoptr( + FirebaseCoreFirebaseAppHostApiSetAutomaticResourceManagementEnabledResponse) + response = + firebase_core_firebase_app_host_api_set_automatic_resource_management_enabled_response_new_error( + code, message, details); + g_autoptr(GError) error = nullptr; + if (!fl_basic_message_channel_respond(response_handle->channel, + response_handle->response_handle, + response->value, &error)) { + g_warning("Failed to send response to %s.%s: %s", "FirebaseAppHostApi", + "setAutomaticResourceManagementEnabled", error->message); + } +} + +void firebase_core_firebase_app_host_api_respond_delete( + FirebaseCoreFirebaseAppHostApiResponseHandle* response_handle) { + g_autoptr(FirebaseCoreFirebaseAppHostApiDeleteResponse) response = + firebase_core_firebase_app_host_api_delete_response_new(); + g_autoptr(GError) error = nullptr; + if (!fl_basic_message_channel_respond(response_handle->channel, + response_handle->response_handle, + response->value, &error)) { + g_warning("Failed to send response to %s.%s: %s", "FirebaseAppHostApi", + "delete", error->message); + } +} + +void firebase_core_firebase_app_host_api_respond_error_delete( + FirebaseCoreFirebaseAppHostApiResponseHandle* response_handle, + const gchar* code, const gchar* message, FlValue* details) { + g_autoptr(FirebaseCoreFirebaseAppHostApiDeleteResponse) response = + firebase_core_firebase_app_host_api_delete_response_new_error( + code, message, details); + g_autoptr(GError) error = nullptr; + if (!fl_basic_message_channel_respond(response_handle->channel, + response_handle->response_handle, + response->value, &error)) { + g_warning("Failed to send response to %s.%s: %s", "FirebaseAppHostApi", + "delete", error->message); + } +} diff --git a/packages/firebase_core/firebase_core/linux/messages.g.h b/packages/firebase_core/firebase_core/linux/messages.g.h new file mode 100644 index 000000000000..aaad18c57041 --- /dev/null +++ b/packages/firebase_core/firebase_core/linux/messages.g.h @@ -0,0 +1,605 @@ +// Copyright 2023, the Chromium project authors. Please see the AUTHORS file +// for details. All rights reserved. Use of this source code is governed by a +// BSD-style license that can be found in the LICENSE file. +// Autogenerated from Pigeon (v26.3.4), do not edit directly. +// See also: https://pub.dev/packages/pigeon + +#ifndef PIGEON_MESSAGES_G_H_ +#define PIGEON_MESSAGES_G_H_ + +#include + +G_BEGIN_DECLS + +/** + * FirebaseCoreCoreFirebaseOptions: + * + */ + +G_DECLARE_FINAL_TYPE(FirebaseCoreCoreFirebaseOptions, + firebase_core_core_firebase_options, FIREBASE_CORE, + CORE_FIREBASE_OPTIONS, GObject) + +/** + * firebase_core_core_firebase_options_new: + * api_key: field in this object. + * app_id: field in this object. + * messaging_sender_id: field in this object. + * project_id: field in this object. + * auth_domain: field in this object. + * database_u_r_l: field in this object. + * storage_bucket: field in this object. + * measurement_id: field in this object. + * tracking_id: field in this object. + * deep_link_u_r_l_scheme: field in this object. + * android_client_id: field in this object. + * ios_client_id: field in this object. + * ios_bundle_id: field in this object. + * app_group_id: field in this object. + * recaptcha_site_key: field in this object. + * + * Creates a new #CoreFirebaseOptions object. + * + * Returns: a new #FirebaseCoreCoreFirebaseOptions + */ +FirebaseCoreCoreFirebaseOptions* firebase_core_core_firebase_options_new( + const gchar* api_key, const gchar* app_id, const gchar* messaging_sender_id, + const gchar* project_id, const gchar* auth_domain, + const gchar* database_u_r_l, const gchar* storage_bucket, + const gchar* measurement_id, const gchar* tracking_id, + const gchar* deep_link_u_r_l_scheme, const gchar* android_client_id, + const gchar* ios_client_id, const gchar* ios_bundle_id, + const gchar* app_group_id, const gchar* recaptcha_site_key); + +/** + * firebase_core_core_firebase_options_get_api_key + * @object: a #FirebaseCoreCoreFirebaseOptions. + * + * Gets the value of the apiKey field of @object. + * + * Returns: the field value. + */ +const gchar* firebase_core_core_firebase_options_get_api_key( + FirebaseCoreCoreFirebaseOptions* object); + +/** + * firebase_core_core_firebase_options_get_app_id + * @object: a #FirebaseCoreCoreFirebaseOptions. + * + * Gets the value of the appId field of @object. + * + * Returns: the field value. + */ +const gchar* firebase_core_core_firebase_options_get_app_id( + FirebaseCoreCoreFirebaseOptions* object); + +/** + * firebase_core_core_firebase_options_get_messaging_sender_id + * @object: a #FirebaseCoreCoreFirebaseOptions. + * + * Gets the value of the messagingSenderId field of @object. + * + * Returns: the field value. + */ +const gchar* firebase_core_core_firebase_options_get_messaging_sender_id( + FirebaseCoreCoreFirebaseOptions* object); + +/** + * firebase_core_core_firebase_options_get_project_id + * @object: a #FirebaseCoreCoreFirebaseOptions. + * + * Gets the value of the projectId field of @object. + * + * Returns: the field value. + */ +const gchar* firebase_core_core_firebase_options_get_project_id( + FirebaseCoreCoreFirebaseOptions* object); + +/** + * firebase_core_core_firebase_options_get_auth_domain + * @object: a #FirebaseCoreCoreFirebaseOptions. + * + * Gets the value of the authDomain field of @object. + * + * Returns: the field value. + */ +const gchar* firebase_core_core_firebase_options_get_auth_domain( + FirebaseCoreCoreFirebaseOptions* object); + +/** + * firebase_core_core_firebase_options_get_database_u_r_l + * @object: a #FirebaseCoreCoreFirebaseOptions. + * + * Gets the value of the databaseURL field of @object. + * + * Returns: the field value. + */ +const gchar* firebase_core_core_firebase_options_get_database_u_r_l( + FirebaseCoreCoreFirebaseOptions* object); + +/** + * firebase_core_core_firebase_options_get_storage_bucket + * @object: a #FirebaseCoreCoreFirebaseOptions. + * + * Gets the value of the storageBucket field of @object. + * + * Returns: the field value. + */ +const gchar* firebase_core_core_firebase_options_get_storage_bucket( + FirebaseCoreCoreFirebaseOptions* object); + +/** + * firebase_core_core_firebase_options_get_measurement_id + * @object: a #FirebaseCoreCoreFirebaseOptions. + * + * Gets the value of the measurementId field of @object. + * + * Returns: the field value. + */ +const gchar* firebase_core_core_firebase_options_get_measurement_id( + FirebaseCoreCoreFirebaseOptions* object); + +/** + * firebase_core_core_firebase_options_get_tracking_id + * @object: a #FirebaseCoreCoreFirebaseOptions. + * + * Gets the value of the trackingId field of @object. + * + * Returns: the field value. + */ +const gchar* firebase_core_core_firebase_options_get_tracking_id( + FirebaseCoreCoreFirebaseOptions* object); + +/** + * firebase_core_core_firebase_options_get_deep_link_u_r_l_scheme + * @object: a #FirebaseCoreCoreFirebaseOptions. + * + * Gets the value of the deepLinkURLScheme field of @object. + * + * Returns: the field value. + */ +const gchar* firebase_core_core_firebase_options_get_deep_link_u_r_l_scheme( + FirebaseCoreCoreFirebaseOptions* object); + +/** + * firebase_core_core_firebase_options_get_android_client_id + * @object: a #FirebaseCoreCoreFirebaseOptions. + * + * Gets the value of the androidClientId field of @object. + * + * Returns: the field value. + */ +const gchar* firebase_core_core_firebase_options_get_android_client_id( + FirebaseCoreCoreFirebaseOptions* object); + +/** + * firebase_core_core_firebase_options_get_ios_client_id + * @object: a #FirebaseCoreCoreFirebaseOptions. + * + * Gets the value of the iosClientId field of @object. + * + * Returns: the field value. + */ +const gchar* firebase_core_core_firebase_options_get_ios_client_id( + FirebaseCoreCoreFirebaseOptions* object); + +/** + * firebase_core_core_firebase_options_get_ios_bundle_id + * @object: a #FirebaseCoreCoreFirebaseOptions. + * + * Gets the value of the iosBundleId field of @object. + * + * Returns: the field value. + */ +const gchar* firebase_core_core_firebase_options_get_ios_bundle_id( + FirebaseCoreCoreFirebaseOptions* object); + +/** + * firebase_core_core_firebase_options_get_app_group_id + * @object: a #FirebaseCoreCoreFirebaseOptions. + * + * Gets the value of the appGroupId field of @object. + * + * Returns: the field value. + */ +const gchar* firebase_core_core_firebase_options_get_app_group_id( + FirebaseCoreCoreFirebaseOptions* object); + +/** + * firebase_core_core_firebase_options_get_recaptcha_site_key + * @object: a #FirebaseCoreCoreFirebaseOptions. + * + * Gets the value of the recaptchaSiteKey field of @object. + * + * Returns: the field value. + */ +const gchar* firebase_core_core_firebase_options_get_recaptcha_site_key( + FirebaseCoreCoreFirebaseOptions* object); + +/** + * firebase_core_core_firebase_options_equals: + * @a: a #FirebaseCoreCoreFirebaseOptions. + * @b: another #FirebaseCoreCoreFirebaseOptions. + * + * Checks if two #FirebaseCoreCoreFirebaseOptions objects are equal. + * + * Returns: TRUE if @a and @b are equal. + */ +gboolean firebase_core_core_firebase_options_equals( + FirebaseCoreCoreFirebaseOptions* a, FirebaseCoreCoreFirebaseOptions* b); + +/** + * firebase_core_core_firebase_options_hash: + * @object: a #FirebaseCoreCoreFirebaseOptions. + * + * Calculates a hash code for a #FirebaseCoreCoreFirebaseOptions object. + * + * Returns: the hash code. + */ +guint firebase_core_core_firebase_options_hash( + FirebaseCoreCoreFirebaseOptions* object); + +/** + * FirebaseCoreCoreInitializeResponse: + * + */ + +G_DECLARE_FINAL_TYPE(FirebaseCoreCoreInitializeResponse, + firebase_core_core_initialize_response, FIREBASE_CORE, + CORE_INITIALIZE_RESPONSE, GObject) + +/** + * firebase_core_core_initialize_response_new: + * name: field in this object. + * options: field in this object. + * is_automatic_data_collection_enabled: field in this object. + * plugin_constants: field in this object. + * + * Creates a new #CoreInitializeResponse object. + * + * Returns: a new #FirebaseCoreCoreInitializeResponse + */ +FirebaseCoreCoreInitializeResponse* firebase_core_core_initialize_response_new( + const gchar* name, FirebaseCoreCoreFirebaseOptions* options, + gboolean* is_automatic_data_collection_enabled, FlValue* plugin_constants); + +/** + * firebase_core_core_initialize_response_get_name + * @object: a #FirebaseCoreCoreInitializeResponse. + * + * Gets the value of the name field of @object. + * + * Returns: the field value. + */ +const gchar* firebase_core_core_initialize_response_get_name( + FirebaseCoreCoreInitializeResponse* object); + +/** + * firebase_core_core_initialize_response_get_options + * @object: a #FirebaseCoreCoreInitializeResponse. + * + * Gets the value of the options field of @object. + * + * Returns: the field value. + */ +FirebaseCoreCoreFirebaseOptions* +firebase_core_core_initialize_response_get_options( + FirebaseCoreCoreInitializeResponse* object); + +/** + * firebase_core_core_initialize_response_get_is_automatic_data_collection_enabled + * @object: a #FirebaseCoreCoreInitializeResponse. + * + * Gets the value of the isAutomaticDataCollectionEnabled field of @object. + * + * Returns: the field value. + */ +gboolean* +firebase_core_core_initialize_response_get_is_automatic_data_collection_enabled( + FirebaseCoreCoreInitializeResponse* object); + +/** + * firebase_core_core_initialize_response_get_plugin_constants + * @object: a #FirebaseCoreCoreInitializeResponse. + * + * Gets the value of the pluginConstants field of @object. + * + * Returns: the field value. + */ +FlValue* firebase_core_core_initialize_response_get_plugin_constants( + FirebaseCoreCoreInitializeResponse* object); + +/** + * firebase_core_core_initialize_response_equals: + * @a: a #FirebaseCoreCoreInitializeResponse. + * @b: another #FirebaseCoreCoreInitializeResponse. + * + * Checks if two #FirebaseCoreCoreInitializeResponse objects are equal. + * + * Returns: TRUE if @a and @b are equal. + */ +gboolean firebase_core_core_initialize_response_equals( + FirebaseCoreCoreInitializeResponse* a, + FirebaseCoreCoreInitializeResponse* b); + +/** + * firebase_core_core_initialize_response_hash: + * @object: a #FirebaseCoreCoreInitializeResponse. + * + * Calculates a hash code for a #FirebaseCoreCoreInitializeResponse object. + * + * Returns: the hash code. + */ +guint firebase_core_core_initialize_response_hash( + FirebaseCoreCoreInitializeResponse* object); + +G_DECLARE_FINAL_TYPE(FirebaseCoreMessageCodec, firebase_core_message_codec, + FIREBASE_CORE, MESSAGE_CODEC, FlStandardMessageCodec) + +/** + * Custom type ID constants: + * + * Constants used to identify custom types in the codec. + * They are used in the codec to encode and decode custom types. + * They may be used in custom object creation functions to identify the type. + */ +extern const int firebase_core_core_firebase_options_type_id; +extern const int firebase_core_core_initialize_response_type_id; + +G_DECLARE_FINAL_TYPE(FirebaseCoreFirebaseCoreHostApi, + firebase_core_firebase_core_host_api, FIREBASE_CORE, + FIREBASE_CORE_HOST_API, GObject) + +G_DECLARE_FINAL_TYPE(FirebaseCoreFirebaseCoreHostApiResponseHandle, + firebase_core_firebase_core_host_api_response_handle, + FIREBASE_CORE, FIREBASE_CORE_HOST_API_RESPONSE_HANDLE, + GObject) + +/** + * FirebaseCoreFirebaseCoreHostApiVTable: + * + * Table of functions exposed by FirebaseCoreHostApi to be implemented by the + * API provider. + */ +typedef struct { + void (*initialize_app)( + const gchar* app_name, + FirebaseCoreCoreFirebaseOptions* initialize_app_request, + FirebaseCoreFirebaseCoreHostApiResponseHandle* response_handle, + gpointer user_data); + void (*initialize_core)( + FirebaseCoreFirebaseCoreHostApiResponseHandle* response_handle, + gpointer user_data); + void (*options_from_resource)( + FirebaseCoreFirebaseCoreHostApiResponseHandle* response_handle, + gpointer user_data); +} FirebaseCoreFirebaseCoreHostApiVTable; + +/** + * firebase_core_firebase_core_host_api_set_method_handlers: + * + * @messenger: an #FlBinaryMessenger. + * @suffix: (allow-none): a suffix to add to the API or %NULL for none. + * @vtable: implementations of the methods in this API. + * @user_data: (closure): user data to pass to the functions in @vtable. + * @user_data_free_func: (allow-none): a function which gets called to free + * @user_data, or %NULL. + * + * Connects the method handlers in the FirebaseCoreHostApi API. + */ +void firebase_core_firebase_core_host_api_set_method_handlers( + FlBinaryMessenger* messenger, const gchar* suffix, + const FirebaseCoreFirebaseCoreHostApiVTable* vtable, gpointer user_data, + GDestroyNotify user_data_free_func); + +/** + * firebase_core_firebase_core_host_api_clear_method_handlers: + * + * @messenger: an #FlBinaryMessenger. + * @suffix: (allow-none): a suffix to add to the API or %NULL for none. + * + * Clears the method handlers in the FirebaseCoreHostApi API. + */ +void firebase_core_firebase_core_host_api_clear_method_handlers( + FlBinaryMessenger* messenger, const gchar* suffix); + +/** + * firebase_core_firebase_core_host_api_respond_initialize_app: + * @response_handle: a #FirebaseCoreFirebaseCoreHostApiResponseHandle. + * @return_value: location to write the value returned by this method. + * + * Responds to FirebaseCoreHostApi.initializeApp. + */ +void firebase_core_firebase_core_host_api_respond_initialize_app( + FirebaseCoreFirebaseCoreHostApiResponseHandle* response_handle, + FirebaseCoreCoreInitializeResponse* return_value); + +/** + * firebase_core_firebase_core_host_api_respond_error_initialize_app: + * @response_handle: a #FirebaseCoreFirebaseCoreHostApiResponseHandle. + * @code: error code. + * @message: error message. + * @details: (allow-none): error details or %NULL. + * + * Responds with an error to FirebaseCoreHostApi.initializeApp. + */ +void firebase_core_firebase_core_host_api_respond_error_initialize_app( + FirebaseCoreFirebaseCoreHostApiResponseHandle* response_handle, + const gchar* code, const gchar* message, FlValue* details); + +/** + * firebase_core_firebase_core_host_api_respond_initialize_core: + * @response_handle: a #FirebaseCoreFirebaseCoreHostApiResponseHandle. + * @return_value: location to write the value returned by this method. + * + * Responds to FirebaseCoreHostApi.initializeCore. + */ +void firebase_core_firebase_core_host_api_respond_initialize_core( + FirebaseCoreFirebaseCoreHostApiResponseHandle* response_handle, + FlValue* return_value); + +/** + * firebase_core_firebase_core_host_api_respond_error_initialize_core: + * @response_handle: a #FirebaseCoreFirebaseCoreHostApiResponseHandle. + * @code: error code. + * @message: error message. + * @details: (allow-none): error details or %NULL. + * + * Responds with an error to FirebaseCoreHostApi.initializeCore. + */ +void firebase_core_firebase_core_host_api_respond_error_initialize_core( + FirebaseCoreFirebaseCoreHostApiResponseHandle* response_handle, + const gchar* code, const gchar* message, FlValue* details); + +/** + * firebase_core_firebase_core_host_api_respond_options_from_resource: + * @response_handle: a #FirebaseCoreFirebaseCoreHostApiResponseHandle. + * @return_value: location to write the value returned by this method. + * + * Responds to FirebaseCoreHostApi.optionsFromResource. + */ +void firebase_core_firebase_core_host_api_respond_options_from_resource( + FirebaseCoreFirebaseCoreHostApiResponseHandle* response_handle, + FirebaseCoreCoreFirebaseOptions* return_value); + +/** + * firebase_core_firebase_core_host_api_respond_error_options_from_resource: + * @response_handle: a #FirebaseCoreFirebaseCoreHostApiResponseHandle. + * @code: error code. + * @message: error message. + * @details: (allow-none): error details or %NULL. + * + * Responds with an error to FirebaseCoreHostApi.optionsFromResource. + */ +void firebase_core_firebase_core_host_api_respond_error_options_from_resource( + FirebaseCoreFirebaseCoreHostApiResponseHandle* response_handle, + const gchar* code, const gchar* message, FlValue* details); + +G_DECLARE_FINAL_TYPE(FirebaseCoreFirebaseAppHostApi, + firebase_core_firebase_app_host_api, FIREBASE_CORE, + FIREBASE_APP_HOST_API, GObject) + +G_DECLARE_FINAL_TYPE(FirebaseCoreFirebaseAppHostApiResponseHandle, + firebase_core_firebase_app_host_api_response_handle, + FIREBASE_CORE, FIREBASE_APP_HOST_API_RESPONSE_HANDLE, + GObject) + +/** + * FirebaseCoreFirebaseAppHostApiVTable: + * + * Table of functions exposed by FirebaseAppHostApi to be implemented by the API + * provider. + */ +typedef struct { + void (*set_automatic_data_collection_enabled)( + const gchar* app_name, gboolean enabled, + FirebaseCoreFirebaseAppHostApiResponseHandle* response_handle, + gpointer user_data); + void (*set_automatic_resource_management_enabled)( + const gchar* app_name, gboolean enabled, + FirebaseCoreFirebaseAppHostApiResponseHandle* response_handle, + gpointer user_data); + void (*delete_)(const gchar* app_name, + FirebaseCoreFirebaseAppHostApiResponseHandle* response_handle, + gpointer user_data); +} FirebaseCoreFirebaseAppHostApiVTable; + +/** + * firebase_core_firebase_app_host_api_set_method_handlers: + * + * @messenger: an #FlBinaryMessenger. + * @suffix: (allow-none): a suffix to add to the API or %NULL for none. + * @vtable: implementations of the methods in this API. + * @user_data: (closure): user data to pass to the functions in @vtable. + * @user_data_free_func: (allow-none): a function which gets called to free + * @user_data, or %NULL. + * + * Connects the method handlers in the FirebaseAppHostApi API. + */ +void firebase_core_firebase_app_host_api_set_method_handlers( + FlBinaryMessenger* messenger, const gchar* suffix, + const FirebaseCoreFirebaseAppHostApiVTable* vtable, gpointer user_data, + GDestroyNotify user_data_free_func); + +/** + * firebase_core_firebase_app_host_api_clear_method_handlers: + * + * @messenger: an #FlBinaryMessenger. + * @suffix: (allow-none): a suffix to add to the API or %NULL for none. + * + * Clears the method handlers in the FirebaseAppHostApi API. + */ +void firebase_core_firebase_app_host_api_clear_method_handlers( + FlBinaryMessenger* messenger, const gchar* suffix); + +/** + * firebase_core_firebase_app_host_api_respond_set_automatic_data_collection_enabled: + * @response_handle: a #FirebaseCoreFirebaseAppHostApiResponseHandle. + * + * Responds to FirebaseAppHostApi.setAutomaticDataCollectionEnabled. + */ +void firebase_core_firebase_app_host_api_respond_set_automatic_data_collection_enabled( + FirebaseCoreFirebaseAppHostApiResponseHandle* response_handle); + +/** + * firebase_core_firebase_app_host_api_respond_error_set_automatic_data_collection_enabled: + * @response_handle: a #FirebaseCoreFirebaseAppHostApiResponseHandle. + * @code: error code. + * @message: error message. + * @details: (allow-none): error details or %NULL. + * + * Responds with an error to + * FirebaseAppHostApi.setAutomaticDataCollectionEnabled. + */ +void firebase_core_firebase_app_host_api_respond_error_set_automatic_data_collection_enabled( + FirebaseCoreFirebaseAppHostApiResponseHandle* response_handle, + const gchar* code, const gchar* message, FlValue* details); + +/** + * firebase_core_firebase_app_host_api_respond_set_automatic_resource_management_enabled: + * @response_handle: a #FirebaseCoreFirebaseAppHostApiResponseHandle. + * + * Responds to FirebaseAppHostApi.setAutomaticResourceManagementEnabled. + */ +void firebase_core_firebase_app_host_api_respond_set_automatic_resource_management_enabled( + FirebaseCoreFirebaseAppHostApiResponseHandle* response_handle); + +/** + * firebase_core_firebase_app_host_api_respond_error_set_automatic_resource_management_enabled: + * @response_handle: a #FirebaseCoreFirebaseAppHostApiResponseHandle. + * @code: error code. + * @message: error message. + * @details: (allow-none): error details or %NULL. + * + * Responds with an error to + * FirebaseAppHostApi.setAutomaticResourceManagementEnabled. + */ +void firebase_core_firebase_app_host_api_respond_error_set_automatic_resource_management_enabled( + FirebaseCoreFirebaseAppHostApiResponseHandle* response_handle, + const gchar* code, const gchar* message, FlValue* details); + +/** + * firebase_core_firebase_app_host_api_respond_delete: + * @response_handle: a #FirebaseCoreFirebaseAppHostApiResponseHandle. + * + * Responds to FirebaseAppHostApi.delete. + */ +void firebase_core_firebase_app_host_api_respond_delete( + FirebaseCoreFirebaseAppHostApiResponseHandle* response_handle); + +/** + * firebase_core_firebase_app_host_api_respond_error_delete: + * @response_handle: a #FirebaseCoreFirebaseAppHostApiResponseHandle. + * @code: error code. + * @message: error message. + * @details: (allow-none): error details or %NULL. + * + * Responds with an error to FirebaseAppHostApi.delete. + */ +void firebase_core_firebase_app_host_api_respond_error_delete( + FirebaseCoreFirebaseAppHostApiResponseHandle* response_handle, + const gchar* code, const gchar* message, FlValue* details); + +G_END_DECLS + +#endif // PIGEON_MESSAGES_G_H_ diff --git a/packages/firebase_core/firebase_core/linux/plugin_version.h.in b/packages/firebase_core/firebase_core/linux/plugin_version.h.in new file mode 100644 index 000000000000..1b588becbd5f --- /dev/null +++ b/packages/firebase_core/firebase_core/linux/plugin_version.h.in @@ -0,0 +1,13 @@ +// Copyright 2026, the Chromium project authors. Please see the AUTHORS file +// for details. All rights reserved. Use of this source code is governed by a +// BSD-style license that can be found in the LICENSE file. + +#ifndef PLUGIN_VERSION_CONFIG_H +#define PLUGIN_VERSION_CONFIG_H + +namespace firebase_core_linux { + +std::string getPluginVersion() { return "@PLUGIN_VERSION@"; } +} // namespace firebase_core_linux + +#endif // PLUGIN_VERSION_CONFIG_H diff --git a/packages/firebase_core/firebase_core/pubspec.yaml b/packages/firebase_core/firebase_core/pubspec.yaml index 1bc6ad627b94..c0ed4f1e21b9 100644 --- a/packages/firebase_core/firebase_core/pubspec.yaml +++ b/packages/firebase_core/firebase_core/pubspec.yaml @@ -37,6 +37,8 @@ flutter: pluginClass: FlutterFirebaseCorePlugin ios: pluginClass: FLTFirebaseCorePlugin + linux: + pluginClass: FirebaseCorePlugin macos: pluginClass: FLTFirebaseCorePlugin web: diff --git a/packages/firebase_core/firebase_core_platform_interface/pigeons/messages.dart b/packages/firebase_core/firebase_core_platform_interface/pigeons/messages.dart index a42278d0f4e7..2228da6b092e 100644 --- a/packages/firebase_core/firebase_core_platform_interface/pigeons/messages.dart +++ b/packages/firebase_core/firebase_core_platform_interface/pigeons/messages.dart @@ -25,6 +25,12 @@ import 'package:pigeon/pigeon.dart'; cppHeaderOut: '../firebase_core/windows/messages.g.h', cppSourceOut: '../firebase_core/windows/messages.g.cpp', cppOptions: CppOptions(namespace: 'firebase_core_windows'), + gobjectHeaderOut: '../firebase_core/linux/messages.g.h', + gobjectSourceOut: '../firebase_core/linux/messages.g.cc', + gobjectOptions: GObjectOptions( + headerIncludePath: 'messages.g.h', + module: 'FirebaseCore', + ), copyrightHeader: 'pigeons/copyright.txt', ), ) diff --git a/packages/firebase_database/firebase_database/example/.metadata b/packages/firebase_database/firebase_database/example/.metadata index 138a77260630..d85841c6973b 100644 --- a/packages/firebase_database/firebase_database/example/.metadata +++ b/packages/firebase_database/firebase_database/example/.metadata @@ -18,6 +18,9 @@ migration: - platform: ios create_revision: 5874a72aa4c779a02553007c47dacbefba2374dc base_revision: 5874a72aa4c779a02553007c47dacbefba2374dc + - platform: linux + create_revision: ad70ec4617166f1c38e5d2bfd388af71fda14f06 + base_revision: ad70ec4617166f1c38e5d2bfd388af71fda14f06 # User provided section diff --git a/packages/firebase_database/firebase_database/example/lib/firebase_options.dart b/packages/firebase_database/firebase_database/example/lib/firebase_options.dart index ae4d1a8b98a7..aac2c99e030a 100644 --- a/packages/firebase_database/firebase_database/example/lib/firebase_options.dart +++ b/packages/firebase_database/firebase_database/example/lib/firebase_options.dart @@ -35,11 +35,9 @@ class DefaultFirebaseOptions { 'DefaultFirebaseOptions have not been configured for windows - ' 'you can reconfigure this by running the FlutterFire CLI again.', ); + // TODO: Remove when FlutterFire CLI supports Linux case TargetPlatform.linux: - throw UnsupportedError( - 'DefaultFirebaseOptions have not been configured for linux - ' - 'you can reconfigure this by running the FlutterFire CLI again.', - ); + return android; default: throw UnsupportedError( 'DefaultFirebaseOptions are not supported for this platform.', diff --git a/packages/firebase_database/firebase_database/example/linux/.gitignore b/packages/firebase_database/firebase_database/example/linux/.gitignore new file mode 100644 index 000000000000..d3896c98444f --- /dev/null +++ b/packages/firebase_database/firebase_database/example/linux/.gitignore @@ -0,0 +1 @@ +flutter/ephemeral diff --git a/packages/firebase_database/firebase_database/example/linux/CMakeLists.txt b/packages/firebase_database/firebase_database/example/linux/CMakeLists.txt new file mode 100644 index 000000000000..a4d9405104cd --- /dev/null +++ b/packages/firebase_database/firebase_database/example/linux/CMakeLists.txt @@ -0,0 +1,128 @@ +# Project-level configuration. +cmake_minimum_required(VERSION 3.13) +project(runner LANGUAGES CXX) + +# The name of the executable created for the application. Change this to change +# the on-disk name of your application. +set(BINARY_NAME "firebase_database_example") +# The unique GTK application identifier for this application. See: +# https://wiki.gnome.org/HowDoI/ChooseApplicationID +set(APPLICATION_ID "io.flutter.plugins.firebase.database.firebase_database_example") + +# Explicitly opt in to modern CMake behaviors to avoid warnings with recent +# versions of CMake. +cmake_policy(SET CMP0063 NEW) + +# Load bundled libraries from the lib/ directory relative to the binary. +set(CMAKE_INSTALL_RPATH "$ORIGIN/lib") + +# Root filesystem for cross-building. +if(FLUTTER_TARGET_PLATFORM_SYSROOT) + set(CMAKE_SYSROOT ${FLUTTER_TARGET_PLATFORM_SYSROOT}) + set(CMAKE_FIND_ROOT_PATH ${CMAKE_SYSROOT}) + set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER) + set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY) + set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY) + set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY) +endif() + +# Define build configuration options. +if(NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES) + set(CMAKE_BUILD_TYPE "Debug" CACHE + STRING "Flutter build mode" FORCE) + set_property(CACHE CMAKE_BUILD_TYPE PROPERTY STRINGS + "Debug" "Profile" "Release") +endif() + +# Compilation settings that should be applied to most targets. +# +# Be cautious about adding new options here, as plugins use this function by +# default. In most cases, you should add new options to specific targets instead +# of modifying this function. +function(APPLY_STANDARD_SETTINGS TARGET) + target_compile_features(${TARGET} PUBLIC cxx_std_14) + target_compile_options(${TARGET} PRIVATE -Wall -Werror) + target_compile_options(${TARGET} PRIVATE "$<$>:-O3>") + target_compile_definitions(${TARGET} PRIVATE "$<$>:NDEBUG>") +endfunction() + +# Flutter library and tool build rules. +set(FLUTTER_MANAGED_DIR "${CMAKE_CURRENT_SOURCE_DIR}/flutter") +add_subdirectory(${FLUTTER_MANAGED_DIR}) + +# System-level dependencies. +find_package(PkgConfig REQUIRED) +pkg_check_modules(GTK REQUIRED IMPORTED_TARGET gtk+-3.0) + +# Application build; see runner/CMakeLists.txt. +add_subdirectory("runner") + +# Run the Flutter tool portions of the build. This must not be removed. +add_dependencies(${BINARY_NAME} flutter_assemble) + +# Only the install-generated bundle's copy of the executable will launch +# correctly, since the resources must in the right relative locations. To avoid +# people trying to run the unbundled copy, put it in a subdirectory instead of +# the default top-level location. +set_target_properties(${BINARY_NAME} + PROPERTIES + RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/intermediates_do_not_run" +) + + +# Generated plugin build rules, which manage building the plugins and adding +# them to the application. +include(flutter/generated_plugins.cmake) + + +# === Installation === +# By default, "installing" just makes a relocatable bundle in the build +# directory. +set(BUILD_BUNDLE_DIR "${PROJECT_BINARY_DIR}/bundle") +if(CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT) + set(CMAKE_INSTALL_PREFIX "${BUILD_BUNDLE_DIR}" CACHE PATH "..." FORCE) +endif() + +# Start with a clean build bundle directory every time. +install(CODE " + file(REMOVE_RECURSE \"${BUILD_BUNDLE_DIR}/\") + " COMPONENT Runtime) + +set(INSTALL_BUNDLE_DATA_DIR "${CMAKE_INSTALL_PREFIX}/data") +set(INSTALL_BUNDLE_LIB_DIR "${CMAKE_INSTALL_PREFIX}/lib") + +install(TARGETS ${BINARY_NAME} RUNTIME DESTINATION "${CMAKE_INSTALL_PREFIX}" + COMPONENT Runtime) + +install(FILES "${FLUTTER_ICU_DATA_FILE}" DESTINATION "${INSTALL_BUNDLE_DATA_DIR}" + COMPONENT Runtime) + +install(FILES "${FLUTTER_LIBRARY}" DESTINATION "${INSTALL_BUNDLE_LIB_DIR}" + COMPONENT Runtime) + +foreach(bundled_library ${PLUGIN_BUNDLED_LIBRARIES}) + install(FILES "${bundled_library}" + DESTINATION "${INSTALL_BUNDLE_LIB_DIR}" + COMPONENT Runtime) +endforeach(bundled_library) + +# Copy the native assets provided by the build.dart from all packages. +set(NATIVE_ASSETS_DIR "${PROJECT_BUILD_DIR}native_assets/linux/") +install(DIRECTORY "${NATIVE_ASSETS_DIR}" + DESTINATION "${INSTALL_BUNDLE_LIB_DIR}" + COMPONENT Runtime) + +# Fully re-copy the assets directory on each build to avoid having stale files +# from a previous install. +set(FLUTTER_ASSET_DIR_NAME "flutter_assets") +install(CODE " + file(REMOVE_RECURSE \"${INSTALL_BUNDLE_DATA_DIR}/${FLUTTER_ASSET_DIR_NAME}\") + " COMPONENT Runtime) +install(DIRECTORY "${PROJECT_BUILD_DIR}/${FLUTTER_ASSET_DIR_NAME}" + DESTINATION "${INSTALL_BUNDLE_DATA_DIR}" COMPONENT Runtime) + +# Install the AOT library on non-Debug builds only. +if(NOT CMAKE_BUILD_TYPE MATCHES "Debug") + install(FILES "${AOT_LIBRARY}" DESTINATION "${INSTALL_BUNDLE_LIB_DIR}" + COMPONENT Runtime) +endif() diff --git a/packages/firebase_database/firebase_database/example/linux/flutter/CMakeLists.txt b/packages/firebase_database/firebase_database/example/linux/flutter/CMakeLists.txt new file mode 100644 index 000000000000..d5bd01648a96 --- /dev/null +++ b/packages/firebase_database/firebase_database/example/linux/flutter/CMakeLists.txt @@ -0,0 +1,88 @@ +# This file controls Flutter-level build steps. It should not be edited. +cmake_minimum_required(VERSION 3.10) + +set(EPHEMERAL_DIR "${CMAKE_CURRENT_SOURCE_DIR}/ephemeral") + +# Configuration provided via flutter tool. +include(${EPHEMERAL_DIR}/generated_config.cmake) + +# TODO: Move the rest of this into files in ephemeral. See +# https://github.com/flutter/flutter/issues/57146. + +# Serves the same purpose as list(TRANSFORM ... PREPEND ...), +# which isn't available in 3.10. +function(list_prepend LIST_NAME PREFIX) + set(NEW_LIST "") + foreach(element ${${LIST_NAME}}) + list(APPEND NEW_LIST "${PREFIX}${element}") + endforeach(element) + set(${LIST_NAME} "${NEW_LIST}" PARENT_SCOPE) +endfunction() + +# === Flutter Library === +# System-level dependencies. +find_package(PkgConfig REQUIRED) +pkg_check_modules(GTK REQUIRED IMPORTED_TARGET gtk+-3.0) +pkg_check_modules(GLIB REQUIRED IMPORTED_TARGET glib-2.0) +pkg_check_modules(GIO REQUIRED IMPORTED_TARGET gio-2.0) + +set(FLUTTER_LIBRARY "${EPHEMERAL_DIR}/libflutter_linux_gtk.so") + +# Published to parent scope for install step. +set(FLUTTER_LIBRARY ${FLUTTER_LIBRARY} PARENT_SCOPE) +set(FLUTTER_ICU_DATA_FILE "${EPHEMERAL_DIR}/icudtl.dat" PARENT_SCOPE) +set(PROJECT_BUILD_DIR "${PROJECT_DIR}/build/" PARENT_SCOPE) +set(AOT_LIBRARY "${PROJECT_DIR}/build/lib/libapp.so" PARENT_SCOPE) + +list(APPEND FLUTTER_LIBRARY_HEADERS + "fl_basic_message_channel.h" + "fl_binary_codec.h" + "fl_binary_messenger.h" + "fl_dart_project.h" + "fl_engine.h" + "fl_json_message_codec.h" + "fl_json_method_codec.h" + "fl_message_codec.h" + "fl_method_call.h" + "fl_method_channel.h" + "fl_method_codec.h" + "fl_method_response.h" + "fl_plugin_registrar.h" + "fl_plugin_registry.h" + "fl_standard_message_codec.h" + "fl_standard_method_codec.h" + "fl_string_codec.h" + "fl_value.h" + "fl_view.h" + "flutter_linux.h" +) +list_prepend(FLUTTER_LIBRARY_HEADERS "${EPHEMERAL_DIR}/flutter_linux/") +add_library(flutter INTERFACE) +target_include_directories(flutter INTERFACE + "${EPHEMERAL_DIR}" +) +target_link_libraries(flutter INTERFACE "${FLUTTER_LIBRARY}") +target_link_libraries(flutter INTERFACE + PkgConfig::GTK + PkgConfig::GLIB + PkgConfig::GIO +) +add_dependencies(flutter flutter_assemble) + +# === Flutter tool backend === +# _phony_ is a non-existent file to force this command to run every time, +# since currently there's no way to get a full input/output list from the +# flutter tool. +add_custom_command( + OUTPUT ${FLUTTER_LIBRARY} ${FLUTTER_LIBRARY_HEADERS} + ${CMAKE_CURRENT_BINARY_DIR}/_phony_ + COMMAND ${CMAKE_COMMAND} -E env + ${FLUTTER_TOOL_ENVIRONMENT} + "${FLUTTER_ROOT}/packages/flutter_tools/bin/tool_backend.sh" + ${FLUTTER_TARGET_PLATFORM} ${CMAKE_BUILD_TYPE} + VERBATIM +) +add_custom_target(flutter_assemble DEPENDS + "${FLUTTER_LIBRARY}" + ${FLUTTER_LIBRARY_HEADERS} +) diff --git a/packages/firebase_database/firebase_database/example/linux/runner/CMakeLists.txt b/packages/firebase_database/firebase_database/example/linux/runner/CMakeLists.txt new file mode 100644 index 000000000000..e97dabc7028e --- /dev/null +++ b/packages/firebase_database/firebase_database/example/linux/runner/CMakeLists.txt @@ -0,0 +1,26 @@ +cmake_minimum_required(VERSION 3.13) +project(runner LANGUAGES CXX) + +# Define the application target. To change its name, change BINARY_NAME in the +# top-level CMakeLists.txt, not the value here, or `flutter run` will no longer +# work. +# +# Any new source files that you add to the application should be added here. +add_executable(${BINARY_NAME} + "main.cc" + "my_application.cc" + "${FLUTTER_MANAGED_DIR}/generated_plugin_registrant.cc" +) + +# Apply the standard set of build settings. This can be removed for applications +# that need different build settings. +apply_standard_settings(${BINARY_NAME}) + +# Add preprocessor definitions for the application ID. +add_definitions(-DAPPLICATION_ID="${APPLICATION_ID}") + +# Add dependency libraries. Add any application-specific dependencies here. +target_link_libraries(${BINARY_NAME} PRIVATE flutter) +target_link_libraries(${BINARY_NAME} PRIVATE PkgConfig::GTK) + +target_include_directories(${BINARY_NAME} PRIVATE "${CMAKE_SOURCE_DIR}") diff --git a/packages/firebase_database/firebase_database/example/linux/runner/main.cc b/packages/firebase_database/firebase_database/example/linux/runner/main.cc new file mode 100644 index 000000000000..54fde7b87fa0 --- /dev/null +++ b/packages/firebase_database/firebase_database/example/linux/runner/main.cc @@ -0,0 +1,10 @@ +// Copyright 2026, the Chromium project authors. Please see the AUTHORS file +// for details. All rights reserved. Use of this source code is governed by a +// BSD-style license that can be found in the LICENSE file. + +#include "my_application.h" + +int main(int argc, char** argv) { + g_autoptr(MyApplication) app = my_application_new(); + return g_application_run(G_APPLICATION(app), argc, argv); +} diff --git a/packages/firebase_database/firebase_database/example/linux/runner/my_application.cc b/packages/firebase_database/firebase_database/example/linux/runner/my_application.cc new file mode 100644 index 000000000000..94548425ac7d --- /dev/null +++ b/packages/firebase_database/firebase_database/example/linux/runner/my_application.cc @@ -0,0 +1,152 @@ +// Copyright 2026, the Chromium project authors. Please see the AUTHORS file +// for details. All rights reserved. Use of this source code is governed by a +// BSD-style license that can be found in the LICENSE file. + +#include "my_application.h" + +#include +#ifdef GDK_WINDOWING_X11 +#include +#endif + +#include "flutter/generated_plugin_registrant.h" + +struct _MyApplication { + GtkApplication parent_instance; + char** dart_entrypoint_arguments; +}; + +G_DEFINE_TYPE(MyApplication, my_application, GTK_TYPE_APPLICATION) + +// Called when first Flutter frame received. +static void first_frame_cb(MyApplication* self, FlView* view) { + gtk_widget_show(gtk_widget_get_toplevel(GTK_WIDGET(view))); +} + +// Implements GApplication::activate. +static void my_application_activate(GApplication* application) { + MyApplication* self = MY_APPLICATION(application); + GtkWindow* window = + GTK_WINDOW(gtk_application_window_new(GTK_APPLICATION(application))); + + // Use a header bar when running in GNOME as this is the common style used + // by applications and is the setup most users will be using (e.g. Ubuntu + // desktop). + // If running on X and not using GNOME then just use a traditional title bar + // in case the window manager does more exotic layout, e.g. tiling. + // If running on Wayland assume the header bar will work (may need changing + // if future cases occur). + gboolean use_header_bar = TRUE; +#ifdef GDK_WINDOWING_X11 + GdkScreen* screen = gtk_window_get_screen(window); + if (GDK_IS_X11_SCREEN(screen)) { + const gchar* wm_name = gdk_x11_screen_get_window_manager_name(screen); + if (g_strcmp0(wm_name, "GNOME Shell") != 0) { + use_header_bar = FALSE; + } + } +#endif + if (use_header_bar) { + GtkHeaderBar* header_bar = GTK_HEADER_BAR(gtk_header_bar_new()); + gtk_widget_show(GTK_WIDGET(header_bar)); + gtk_header_bar_set_title(header_bar, "firebase_database_example"); + gtk_header_bar_set_show_close_button(header_bar, TRUE); + gtk_window_set_titlebar(window, GTK_WIDGET(header_bar)); + } else { + gtk_window_set_title(window, "firebase_database_example"); + } + + gtk_window_set_default_size(window, 1280, 720); + + g_autoptr(FlDartProject) project = fl_dart_project_new(); + fl_dart_project_set_dart_entrypoint_arguments( + project, self->dart_entrypoint_arguments); + + FlView* view = fl_view_new(project); + GdkRGBA background_color; + // Background defaults to black, override it here if necessary, e.g. #00000000 + // for transparent. + gdk_rgba_parse(&background_color, "#000000"); + fl_view_set_background_color(view, &background_color); + gtk_widget_show(GTK_WIDGET(view)); + gtk_container_add(GTK_CONTAINER(window), GTK_WIDGET(view)); + + // Show the window when Flutter renders. + // Requires the view to be realized so we can start rendering. + g_signal_connect_swapped(view, "first-frame", G_CALLBACK(first_frame_cb), + self); + gtk_widget_realize(GTK_WIDGET(view)); + + fl_register_plugins(FL_PLUGIN_REGISTRY(view)); + + gtk_widget_grab_focus(GTK_WIDGET(view)); +} + +// Implements GApplication::local_command_line. +static gboolean my_application_local_command_line(GApplication* application, + gchar*** arguments, + int* exit_status) { + MyApplication* self = MY_APPLICATION(application); + // Strip out the first argument as it is the binary name. + self->dart_entrypoint_arguments = g_strdupv(*arguments + 1); + + g_autoptr(GError) error = nullptr; + if (!g_application_register(application, nullptr, &error)) { + g_warning("Failed to register: %s", error->message); + *exit_status = 1; + return TRUE; + } + + g_application_activate(application); + *exit_status = 0; + + return TRUE; +} + +// Implements GApplication::startup. +static void my_application_startup(GApplication* application) { + // MyApplication* self = MY_APPLICATION(object); + + // Perform any actions required at application startup. + + G_APPLICATION_CLASS(my_application_parent_class)->startup(application); +} + +// Implements GApplication::shutdown. +static void my_application_shutdown(GApplication* application) { + // MyApplication* self = MY_APPLICATION(object); + + // Perform any actions required at application shutdown. + + G_APPLICATION_CLASS(my_application_parent_class)->shutdown(application); +} + +// Implements GObject::dispose. +static void my_application_dispose(GObject* object) { + MyApplication* self = MY_APPLICATION(object); + g_clear_pointer(&self->dart_entrypoint_arguments, g_strfreev); + G_OBJECT_CLASS(my_application_parent_class)->dispose(object); +} + +static void my_application_class_init(MyApplicationClass* klass) { + G_APPLICATION_CLASS(klass)->activate = my_application_activate; + G_APPLICATION_CLASS(klass)->local_command_line = + my_application_local_command_line; + G_APPLICATION_CLASS(klass)->startup = my_application_startup; + G_APPLICATION_CLASS(klass)->shutdown = my_application_shutdown; + G_OBJECT_CLASS(klass)->dispose = my_application_dispose; +} + +static void my_application_init(MyApplication* self) {} + +MyApplication* my_application_new() { + // Set the program name to the application ID, which helps various systems + // like GTK and desktop environments map this running application to its + // corresponding .desktop file. This ensures better integration by allowing + // the application to be recognized beyond its binary name. + g_set_prgname(APPLICATION_ID); + + return MY_APPLICATION(g_object_new(my_application_get_type(), + "application-id", APPLICATION_ID, "flags", + G_APPLICATION_NON_UNIQUE, nullptr)); +} diff --git a/packages/firebase_database/firebase_database/example/linux/runner/my_application.h b/packages/firebase_database/firebase_database/example/linux/runner/my_application.h new file mode 100644 index 000000000000..a2ba75695cf5 --- /dev/null +++ b/packages/firebase_database/firebase_database/example/linux/runner/my_application.h @@ -0,0 +1,22 @@ +// Copyright 2026, the Chromium project authors. Please see the AUTHORS file +// for details. All rights reserved. Use of this source code is governed by a +// BSD-style license that can be found in the LICENSE file. + +#ifndef FLUTTER_MY_APPLICATION_H_ +#define FLUTTER_MY_APPLICATION_H_ + +#include + +G_DECLARE_FINAL_TYPE(MyApplication, my_application, MY, APPLICATION, + GtkApplication) + +/** + * my_application_new: + * + * Creates a new Flutter-based application. + * + * Returns: a new #MyApplication. + */ +MyApplication* my_application_new(); + +#endif // FLUTTER_MY_APPLICATION_H_ diff --git a/packages/firebase_database/firebase_database/linux/CMakeLists.txt b/packages/firebase_database/firebase_database/linux/CMakeLists.txt new file mode 100644 index 000000000000..72eab3648b8b --- /dev/null +++ b/packages/firebase_database/firebase_database/linux/CMakeLists.txt @@ -0,0 +1,94 @@ +# The Flutter tooling requires that developers have CMake 3.10 or later +# installed. You should not increase this version, as doing so will cause +# the plugin to fail to compile for some customers of the plugin. +cmake_minimum_required(VERSION 3.10) + +# Project-level configuration. +set(PROJECT_NAME "firebase_database") +project(${PROJECT_NAME} LANGUAGES CXX) + +# This value is used when generating builds using this plugin, so it must +# not be changed +set(PLUGIN_NAME "firebase_database_plugin") + +# Any new source files that you add to the plugin should be added here. +list(APPEND PLUGIN_SOURCES + "include/firebase_database/firebase_database_plugin.h" + "firebase_database_plugin.cc" + "messages.g.cc" + "messages.g.h" +) + +# Read version from pubspec.yaml +file(STRINGS "../pubspec.yaml" pubspec_content) +foreach(line ${pubspec_content}) + string(FIND ${line} "version: " has_version) + + if("${has_version}" STREQUAL "0") + string(FIND ${line} ": " version_start_pos) + math(EXPR version_start_pos "${version_start_pos} + 2") + string(LENGTH ${line} version_end_pos) + math(EXPR len "${version_end_pos} - ${version_start_pos}") + string(SUBSTRING ${line} ${version_start_pos} ${len} PLUGIN_VERSION) + break() + endif() +endforeach(line) + +configure_file(plugin_version.h.in ${CMAKE_BINARY_DIR}/generated/firebase_database/plugin_version.h) +include_directories(${CMAKE_BINARY_DIR}/generated/) + +# Define the plugin library target. Its name must not be changed (see comment +# on PLUGIN_NAME above). +# +# This is deliberately a STATIC library (unlike the SHARED library in the +# Flutter Linux plugin template) to mirror the Windows implementation: the +# Firebase C++ SDK ships prebuilt static libraries, and the single copy of +# the SDK's global state must be shared with firebase_core_plugin in the +# final runner executable. POSITION_INDEPENDENT_CODE is enabled below +# because the runner executable is built as PIE. +add_library(${PLUGIN_NAME} STATIC + ${PLUGIN_SOURCES} + ${CMAKE_BINARY_DIR}/generated/firebase_database/plugin_version.h +) + +# Apply a standard set of build settings that are configured in the +# application-level CMakeLists.txt. This can be removed for plugins that want +# full control over build settings. +apply_standard_settings(${PLUGIN_NAME}) + +# Symbols are hidden by default to reduce the chance of accidental conflicts +# between plugins. This should not be removed; any symbols that should be +# exported should be explicitly exported with the FLUTTER_PLUGIN_EXPORT macro. +set_target_properties(${PLUGIN_NAME} PROPERTIES + CXX_VISIBILITY_PRESET hidden + POSITION_INDEPENDENT_CODE ON) +target_compile_definitions(${PLUGIN_NAME} PUBLIC FLUTTER_PLUGIN_IMPL) + +# Enable firebase-cpp-sdk's platform logging api. +target_compile_definitions(${PLUGIN_NAME} PRIVATE -DINTERNAL_EXPERIMENTAL=1) + +# The Firebase C++ SDK is downloaded and added (via add_subdirectory) by the +# firebase_core plugin, which also exports the SDK include directories as +# INTERFACE include directories; mirror the Windows CMakeLists by linking the +# firebase_core_plugin target and the firebase_database SDK library here +# instead of re-adding the SDK. +# NOTE: the Firebase SDK product archives are linked exclusively by the +# firebase_core_plugin target, which wraps all of them in a single +# -Wl,--start-group/--end-group (the archives have circular symbol +# dependencies that an ordered per-plugin link line cannot satisfy). +set(firebase_libs firebase_core_plugin) +set(ADDITIONAL_LIBS pthread) +target_link_libraries(${PLUGIN_NAME} PRIVATE "${firebase_libs}" "${ADDITIONAL_LIBS}") + +target_include_directories(${PLUGIN_NAME} INTERFACE + "${CMAKE_CURRENT_SOURCE_DIR}/include") +target_link_libraries(${PLUGIN_NAME} PRIVATE flutter) +target_link_libraries(${PLUGIN_NAME} PRIVATE PkgConfig::GTK) + +# List of absolute paths to libraries that should be bundled with the plugin. +# This list could contain prebuilt libraries, or libraries created by an +# external build triggered from this build file. +set(firebase_database_bundled_libraries + "" + PARENT_SCOPE +) diff --git a/packages/firebase_database/firebase_database/linux/firebase_database_plugin.cc b/packages/firebase_database/firebase_database/linux/firebase_database_plugin.cc new file mode 100644 index 000000000000..3490b54e95db --- /dev/null +++ b/packages/firebase_database/firebase_database/linux/firebase_database_plugin.cc @@ -0,0 +1,1355 @@ +// Copyright 2026, the Chromium project authors. Please see the AUTHORS file +// for details. All rights reserved. Use of this source code is governed by a +// BSD-style license that can be found in the LICENSE file. + +#include "include/firebase_database/firebase_database_plugin.h" + +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "firebase/app.h" +#include "firebase/database.h" +#include "firebase/database/common.h" +#include "firebase/database/data_snapshot.h" +#include "firebase/database/database_reference.h" +#include "firebase/database/disconnection.h" +#include "firebase/database/listener.h" +#include "firebase/database/mutable_data.h" +#include "firebase/database/query.h" +#include "firebase/future.h" +#include "firebase/log.h" +#include "firebase/variant.h" +#include "firebase_database/plugin_version.h" +#include "messages.g.h" + +using firebase::App; +using firebase::Future; +using firebase::Variant; +using firebase::database::Database; +using firebase::database::DatabaseReference; +using firebase::database::DataSnapshot; +using firebase::database::Error; +using firebase::database::MutableData; + +static const char kLibraryName[] = "flutter-fire-db"; + +#define FIREBASE_DATABASE_PLUGIN(obj) \ + (G_TYPE_CHECK_INSTANCE_CAST((obj), firebase_database_plugin_get_type(), \ + FirebaseDatabasePlugin)) + +struct _FirebaseDatabasePlugin { + GObject parent_instance; +}; + +G_DEFINE_TYPE(FirebaseDatabasePlugin, firebase_database_plugin, + g_object_get_type()) + +class DatabaseGenericStreamHandler; + +// Static state, mirroring the static members of the Windows +// FirebaseDatabasePlugin class. All of it is only mutated on the platform +// (main) thread; Firebase SDK callbacks marshal back via PostToMainThread. +static FlBinaryMessenger* messenger_ = nullptr; +static std::map event_channels_; +static std::map> + stream_handlers_; +static std::map database_instances_; +static std::map transaction_results_; + +// --- Helper: Run a closure on the GLib main thread --- +// Firebase C++ SDK futures and listeners fire on SDK-internal threads, but +// FlBinaryMessenger / FlEventChannel calls must happen on the platform (main) +// thread; unlike the Windows C++ wrapper, the GObject embedder API is not +// thread-safe, so every response/event is marshalled through the main loop. +static void PostToMainThread(std::function fn) { + auto* boxed = new std::function(std::move(fn)); + g_idle_add( + [](gpointer data) -> gboolean { + auto* callback = static_cast*>(data); + (*callback)(); + delete callback; + return G_SOURCE_REMOVE; + }, + boxed); +} + +// --- Helper: Convert firebase::Variant to FlValue --- +// Ownership: returns a new reference (transfer full). +static FlValue* VariantToFlValue(const Variant& variant) { + switch (variant.type()) { + case Variant::kTypeNull: + return fl_value_new_null(); + case Variant::kTypeInt64: + return fl_value_new_int(variant.int64_value()); + case Variant::kTypeDouble: + return fl_value_new_float(variant.double_value()); + case Variant::kTypeBool: + return fl_value_new_bool(variant.bool_value()); + case Variant::kTypeStaticString: + return fl_value_new_string(variant.string_value()); + case Variant::kTypeMutableString: + return fl_value_new_string(variant.mutable_string().c_str()); + case Variant::kTypeVector: { + FlValue* list = fl_value_new_list(); + for (const auto& item : variant.vector()) { + fl_value_append_take(list, VariantToFlValue(item)); + } + return list; + } + case Variant::kTypeMap: { + FlValue* map = fl_value_new_map(); + for (const auto& kv : variant.map()) { + fl_value_set_take(map, VariantToFlValue(kv.first), + VariantToFlValue(kv.second)); + } + return map; + } + case Variant::kTypeStaticBlob: + return fl_value_new_uint8_list( + static_cast(variant.blob_data()), + variant.blob_size()); + case Variant::kTypeMutableBlob: + return fl_value_new_uint8_list( + static_cast(variant.mutable_blob_data()), + variant.blob_size()); + default: + return fl_value_new_null(); + } +} + +// --- Helper: Convert FlValue to firebase::Variant --- +static Variant FlValueToVariant(FlValue* value) { + if (value == nullptr) { + return Variant::Null(); + } + switch (fl_value_get_type(value)) { + case FL_VALUE_TYPE_NULL: + return Variant::Null(); + case FL_VALUE_TYPE_BOOL: + return Variant(static_cast(fl_value_get_bool(value))); + case FL_VALUE_TYPE_INT: + return Variant(static_cast(fl_value_get_int(value))); + case FL_VALUE_TYPE_FLOAT: + return Variant(fl_value_get_float(value)); + case FL_VALUE_TYPE_STRING: + return Variant(std::string(fl_value_get_string(value))); + case FL_VALUE_TYPE_UINT8_LIST: + return Variant::FromMutableBlob(fl_value_get_uint8_list(value), + fl_value_get_length(value)); + case FL_VALUE_TYPE_LIST: { + std::vector vec; + size_t length = fl_value_get_length(value); + vec.reserve(length); + for (size_t i = 0; i < length; ++i) { + vec.push_back(FlValueToVariant(fl_value_get_list_value(value, i))); + } + return Variant(vec); + } + case FL_VALUE_TYPE_MAP: { + std::map variant_map; + size_t length = fl_value_get_length(value); + for (size_t i = 0; i < length; ++i) { + variant_map[FlValueToVariant(fl_value_get_map_key(value, i))] = + FlValueToVariant(fl_value_get_map_value(value, i)); + } + return Variant(variant_map); + } + default: + return Variant::Null(); + } +} + +// --- Helper: Error code string from C++ SDK Error enum --- +static std::string GetDatabaseErrorCode(Error error) { + switch (error) { + case Error::kErrorNone: + return "none"; + case Error::kErrorDisconnected: + return "disconnected"; + case Error::kErrorExpiredToken: + return "expired-token"; + case Error::kErrorInvalidToken: + return "invalid-token"; + case Error::kErrorMaxRetries: + return "max-retries"; + case Error::kErrorNetworkError: + return "network-error"; + case Error::kErrorOperationFailed: + return "operation-failed"; + case Error::kErrorOverriddenBySet: + return "overridden-by-set"; + case Error::kErrorPermissionDenied: + return "permission-denied"; + case Error::kErrorUnavailable: + return "unavailable"; + case Error::kErrorWriteCanceled: + return "write-canceled"; + case Error::kErrorInvalidVariantType: + return "invalid-variant-type"; + case Error::kErrorConflictingOperationInProgress: + return "conflicting-operation-in-progress"; + case Error::kErrorTransactionAbortedByUser: + return "transaction-aborted-by-user"; + default: + return "unknown"; + } +} + +// --- Helper: Convert DataSnapshot to FlValue map --- +// Ownership: returns a new reference (transfer full). +static FlValue* DataSnapshotToFlValue(const DataSnapshot& snapshot) { + FlValue* result = fl_value_new_map(); + if (snapshot.key() != nullptr) { + fl_value_set_string_take(result, "key", + fl_value_new_string(snapshot.key())); + } else { + fl_value_set_string_take(result, "key", fl_value_new_null()); + } + fl_value_set_string_take(result, "value", VariantToFlValue(snapshot.value())); + fl_value_set_string_take(result, "priority", + VariantToFlValue(snapshot.priority())); + + FlValue* child_keys = fl_value_new_list(); + std::vector children = snapshot.children(); + for (const auto& child : children) { + if (child.key() != nullptr) { + fl_value_append_take(child_keys, fl_value_new_string(child.key())); + } + } + fl_value_set_string_take(result, "childKeys", child_keys); + + return result; +} + +// --- Helper: Build the default (empty) snapshot map used for failed or +// missing transaction results --- +// Ownership: returns a new reference (transfer full). +static FlValue* EmptyTransactionResult() { + FlValue* result = fl_value_new_map(); + fl_value_set_string_take(result, "committed", fl_value_new_bool(FALSE)); + FlValue* snapshot = fl_value_new_map(); + fl_value_set_string_take(snapshot, "key", fl_value_new_null()); + fl_value_set_string_take(snapshot, "value", fl_value_new_null()); + fl_value_set_string_take(snapshot, "priority", fl_value_new_null()); + fl_value_set_string_take(snapshot, "childKeys", fl_value_new_list()); + fl_value_set_string_take(result, "snapshot", snapshot); + return result; +} + +// --- Helper: Lookup helpers for FlValue maps --- +static const gchar* MapLookupString(FlValue* map, const char* key) { + FlValue* value = fl_value_lookup_string(map, key); + if (value != nullptr && fl_value_get_type(value) == FL_VALUE_TYPE_STRING) { + return fl_value_get_string(value); + } + return nullptr; +} + +// --- Helper: Apply query modifiers --- +static firebase::database::Query ApplyQueryModifiers( + firebase::database::Query query, FlValue* modifiers) { + if (modifiers == nullptr || + fl_value_get_type(modifiers) != FL_VALUE_TYPE_LIST) { + return query; + } + size_t length = fl_value_get_length(modifiers); + for (size_t i = 0; i < length; ++i) { + FlValue* mod = fl_value_get_list_value(modifiers, i); + if (fl_value_get_type(mod) != FL_VALUE_TYPE_MAP) continue; + + const gchar* type = MapLookupString(mod, "type"); + if (type == nullptr) continue; + + const gchar* name = MapLookupString(mod, "name"); + if (name == nullptr) continue; + + if (strcmp(type, "orderBy") == 0) { + if (strcmp(name, "orderByChild") == 0) { + const gchar* path = MapLookupString(mod, "path"); + if (path != nullptr) { + query = query.OrderByChild(path); + } + } else if (strcmp(name, "orderByKey") == 0) { + query = query.OrderByKey(); + } else if (strcmp(name, "orderByValue") == 0) { + query = query.OrderByValue(); + } else if (strcmp(name, "orderByPriority") == 0) { + query = query.OrderByPriority(); + } + } else if (strcmp(type, "cursor") == 0) { + Variant cursor_value = + FlValueToVariant(fl_value_lookup_string(mod, "value")); + + const gchar* child_key = MapLookupString(mod, "key"); + + if (strcmp(name, "startAt") == 0) { + query = child_key ? query.StartAt(cursor_value, child_key) + : query.StartAt(cursor_value); + } else if (strcmp(name, "startAfter") == 0) { + // C++ SDK doesn't have StartAfter; use StartAt workaround + query = child_key ? query.StartAt(cursor_value, child_key) + : query.StartAt(cursor_value); + } else if (strcmp(name, "endAt") == 0) { + query = child_key ? query.EndAt(cursor_value, child_key) + : query.EndAt(cursor_value); + } else if (strcmp(name, "endBefore") == 0) { + // C++ SDK doesn't have EndBefore; use EndAt workaround + query = child_key ? query.EndAt(cursor_value, child_key) + : query.EndAt(cursor_value); + } + } else if (strcmp(type, "limit") == 0) { + FlValue* limit_value = fl_value_lookup_string(mod, "limit"); + if (limit_value != nullptr && + fl_value_get_type(limit_value) == FL_VALUE_TYPE_INT) { + int64_t limit = fl_value_get_int(limit_value); + if (strcmp(name, "limitToFirst") == 0) { + query = query.LimitToFirst(static_cast(limit)); + } else if (strcmp(name, "limitToLast") == 0) { + query = query.LimitToLast(static_cast(limit)); + } + } + } + } + return query; +} + +// --- Helper: Get Database instance from Pigeon app --- +static Database* GetDatabaseFromPigeon( + FirebaseDatabaseDatabasePigeonFirebaseApp* app) { + const gchar* app_name = + firebase_database_database_pigeon_firebase_app_get_app_name(app); + App* firebase_app = App::GetInstance(app_name); + if (!firebase_app) { + return nullptr; + } + + FirebaseDatabaseDatabasePigeonSettings* settings = + firebase_database_database_pigeon_firebase_app_get_settings(app); + const gchar* url = + firebase_database_database_pigeon_firebase_app_get_database_u_r_l(app); + + // Build a cache key from app name + effective URL (like Firestore does) + std::string effective_url; + if (url != nullptr && url[0] != '\0') { + effective_url = url; + } + + std::string cache_key = std::string(app_name) + "-" + effective_url; + + // Return cached instance if available (raw pointer, not owned). + // The C++ SDK manages Database instance lifetime internally. + // App::~App() triggers Database::DeleteInternal() during static destruction. + auto it = database_instances_.find(cache_key); + if (it != database_instances_.end()) { + return it->second; + } + + // Create new instance + // Always pass the URL explicitly - the C++ SDK on desktop may not + // properly read database_url from app options without it. + const char* app_db_url = firebase_app->options().database_url(); + if (effective_url.empty() && app_db_url && strlen(app_db_url) > 0) { + effective_url = app_db_url; + } + Database* database = nullptr; + if (!effective_url.empty()) { + database = Database::GetInstance(firebase_app, effective_url.c_str()); + } else { + database = Database::GetInstance(firebase_app); + } + + if (!database) return nullptr; + + gboolean* persistence_enabled = + firebase_database_database_pigeon_settings_get_persistence_enabled( + settings); + if (persistence_enabled != nullptr) { + database->set_persistence_enabled(*persistence_enabled); + } + gboolean* logging_enabled = + firebase_database_database_pigeon_settings_get_logging_enabled(settings); + if (logging_enabled != nullptr && *logging_enabled) { + database->set_log_level(firebase::kLogLevelDebug); + } + + // Cache raw pointer. We do NOT take ownership — the C++ SDK manages + // the Database lifetime via App's CleanupNotifier. This matches the + // pattern used by firebase_auth and firebase_storage. + database_instances_[cache_key] = database; + + return database; +} + +// --- Helper: Complete a Future by responding on the main thread --- +typedef void (*VoidRespondFn)( + FirebaseDatabaseFirebaseDatabaseHostApiResponseHandle*); +typedef void (*ErrorRespondFn)( + FirebaseDatabaseFirebaseDatabaseHostApiResponseHandle*, const gchar*, + const gchar*, FlValue*); + +// The response handle is ref'd for the duration of the async operation and +// unref'd after responding (pigeon drops its own reference when the handler +// callback returns). +static void CompleteVoidFuture( + const Future& future, + FirebaseDatabaseFirebaseDatabaseHostApiResponseHandle* response_handle, + VoidRespondFn respond, ErrorRespondFn respond_error) { + g_object_ref(response_handle); + future.OnCompletion([response_handle, respond, + respond_error](const Future& completed) { + int error = completed.error(); + std::string code = GetDatabaseErrorCode(static_cast(error)); + std::string message = + completed.error_message() ? completed.error_message() : "Unknown error"; + PostToMainThread([response_handle, respond, respond_error, error, code, + message]() { + if (error == Error::kErrorNone) { + respond(response_handle); + } else { + respond_error(response_handle, code.c_str(), message.c_str(), nullptr); + } + g_object_unref(response_handle); + }); + }); +} + +// --- Helper: Send an event/error on an event channel from any thread --- +// Takes ownership of @event; takes its own reference on @channel. +static void SendEventOnMainThread(FlEventChannel* channel, FlValue* event) { + g_object_ref(channel); + PostToMainThread([channel, event]() { + fl_event_channel_send(channel, event, nullptr, nullptr); + fl_value_unref(event); + g_object_unref(channel); + }); +} + +static void SendErrorOnMainThread(FlEventChannel* channel, + const std::string& code, + const std::string& message) { + g_object_ref(channel); + PostToMainThread([channel, code, message]() { + fl_event_channel_send_error(channel, code.c_str(), message.c_str(), nullptr, + nullptr, nullptr); + g_object_unref(channel); + }); +} + +// ===== Event channel stream handler ===== + +// Linux port of the Windows DatabaseGenericStreamHandler: one handler per +// QueryObserve call; the Dart side passes eventType as an argument to the +// EventChannel's listen call, and the handler installs either a value or a +// child listener accordingly. +class DatabaseGenericStreamHandler { + public: + explicit DatabaseGenericStreamHandler(firebase::database::Query query) + : query_(query) {} + + ~DatabaseGenericStreamHandler() { + // Remove listeners before deleting to avoid dangling pointers in the + // Database's internal listener list. Query::RemoveXxxListener() checks + // if (internal_) first, so this is a safe no-op if the Database was + // already destroyed (the cleanup mechanism nullifies internal_). + RemoveListeners(); + if (channel_ != nullptr) { + g_object_unref(channel_); + channel_ = nullptr; + } + } + + // Takes its own reference on @channel. + void SetChannel(FlEventChannel* channel) { + channel_ = FL_EVENT_CHANNEL(g_object_ref(channel)); + } + + FlMethodErrorResponse* OnListen(FlValue* args) { + // Extract eventType from arguments + std::string event_type = "value"; + if (args != nullptr && fl_value_get_type(args) == FL_VALUE_TYPE_MAP) { + const gchar* requested = MapLookupString(args, "eventType"); + if (requested != nullptr) { + event_type = requested; + } + } + + if (event_type == "value") { + value_listener_ = new ValueListenerImpl(channel_); + query_.AddValueListener(value_listener_); + } else { + child_listener_ = new ChildListenerImpl(channel_, event_type); + query_.AddChildListener(child_listener_); + } + return nullptr; + } + + FlMethodErrorResponse* OnCancel(FlValue* args) { + // The GObject embedder tears the stream down itself once the cancel + // handler returns, so unlike Windows there is no explicit EndOfStream + // call here. + RemoveListeners(); + return nullptr; + } + + private: + // Value listener: fires on an SDK thread; events are marshalled to the + // main thread before being sent on the channel. + class ValueListenerImpl : public firebase::database::ValueListener { + public: + explicit ValueListenerImpl(FlEventChannel* channel) : channel_(channel) {} + void OnValueChanged(const DataSnapshot& snapshot) override { + FlValue* event = fl_value_new_map(); + fl_value_set_string_take(event, "eventType", + fl_value_new_string("value")); + fl_value_set_string_take(event, "previousChildKey", fl_value_new_null()); + fl_value_set_string_take(event, "snapshot", + DataSnapshotToFlValue(snapshot)); + SendEventOnMainThread(channel_, event); + } + void OnCancelled(const Error& error, const char* error_message) override { + SendErrorOnMainThread(channel_, GetDatabaseErrorCode(error), + error_message ? error_message : "Unknown error"); + } + + private: + FlEventChannel* channel_; // unowned; the stream handler holds a ref. + }; + + // Child listener: fires on an SDK thread; events are marshalled to the + // main thread before being sent on the channel. + class ChildListenerImpl : public firebase::database::ChildListener { + public: + ChildListenerImpl(FlEventChannel* channel, const std::string& event_type) + : channel_(channel), event_type_(event_type) {} + void OnChildAdded(const DataSnapshot& snapshot, const char* prev) override { + if (event_type_ == "childAdded") Send("childAdded", snapshot, prev); + } + void OnChildChanged(const DataSnapshot& snapshot, + const char* prev) override { + if (event_type_ == "childChanged") Send("childChanged", snapshot, prev); + } + void OnChildMoved(const DataSnapshot& snapshot, const char* prev) override { + if (event_type_ == "childMoved") Send("childMoved", snapshot, prev); + } + void OnChildRemoved(const DataSnapshot& snapshot) override { + if (event_type_ == "childRemoved") + Send("childRemoved", snapshot, nullptr); + } + void OnCancelled(const Error& error, const char* error_message) override { + SendErrorOnMainThread(channel_, GetDatabaseErrorCode(error), + error_message ? error_message : "Unknown error"); + } + + private: + void Send(const std::string& type, const DataSnapshot& snapshot, + const char* prev) { + FlValue* event = fl_value_new_map(); + fl_value_set_string_take(event, "eventType", + fl_value_new_string(type.c_str())); + fl_value_set_string_take( + event, "previousChildKey", + prev ? fl_value_new_string(prev) : fl_value_new_null()); + fl_value_set_string_take(event, "snapshot", + DataSnapshotToFlValue(snapshot)); + SendEventOnMainThread(channel_, event); + } + FlEventChannel* channel_; // unowned; the stream handler holds a ref. + std::string event_type_; + }; + + void RemoveListeners() { + if (value_listener_ != nullptr) { + query_.RemoveValueListener(value_listener_); + delete value_listener_; + value_listener_ = nullptr; + } + if (child_listener_ != nullptr) { + query_.RemoveChildListener(child_listener_); + delete child_listener_; + child_listener_ = nullptr; + } + } + + firebase::database::Query query_; + FlEventChannel* channel_ = nullptr; // owned reference. + ValueListenerImpl* value_listener_ = nullptr; + ChildListenerImpl* child_listener_ = nullptr; +}; + +static FlMethodErrorResponse* OnListenCb(FlEventChannel* channel, FlValue* args, + gpointer user_data) { + return static_cast(user_data)->OnListen(args); +} + +static FlMethodErrorResponse* OnCancelCb(FlEventChannel* channel, FlValue* args, + gpointer user_data) { + return static_cast(user_data)->OnCancel(args); +} + +// --- Helper: Register an EventChannel with a generated name --- +static std::string RegisterEventChannel( + const std::string& prefix, + std::unique_ptr handler) { + static int channel_counter = 0; + std::string channel_name = + prefix + std::to_string(channel_counter++) + "_" + + std::to_string( + std::chrono::system_clock::now().time_since_epoch().count()); + + g_autoptr(FlStandardMethodCodec) codec = fl_standard_method_codec_new(); + FlEventChannel* channel = fl_event_channel_new( + messenger_, channel_name.c_str(), FL_METHOD_CODEC(codec)); + handler->SetChannel(channel); + fl_event_channel_set_stream_handlers(channel, OnListenCb, OnCancelCb, + handler.get(), nullptr); + event_channels_[channel_name] = channel; + stream_handlers_[channel_name] = std::move(handler); + return channel_name; +} + +// atexit handler: clean up Database resources before static destruction. +// 1. Clear event channels to trigger stream handler destruction, which +// unregisters listeners from the Database while it's still alive. +// 2. Call GoOffline() to close WebSocket connections so thread joins +// during App::~App() → Database::DeleteInternal() complete quickly. +static void CleanupBeforeStaticDestruction() { + // Destroy stream handlers and event channels first. This triggers + // DatabaseGenericStreamHandler destructors which call RemoveValueListener / + // RemoveChildListener while the Database is still valid. + stream_handlers_.clear(); + for (auto& pair : event_channels_) { + if (pair.second != nullptr) { + g_object_unref(pair.second); + } + } + event_channels_.clear(); + + // Disconnect all Database instances to close WebSocket connections. + for (auto& pair : database_instances_) { + if (pair.second) { + pair.second->GoOffline(); + } + } + // Give the scheduler thread time to process GoOffline callbacks. + std::this_thread::sleep_for(std::chrono::milliseconds(100)); +} + +// ===== Database methods ===== + +static void HandleGoOnline( + FirebaseDatabaseDatabasePigeonFirebaseApp* app, + FirebaseDatabaseFirebaseDatabaseHostApiResponseHandle* response_handle, + gpointer user_data) { + Database* database = GetDatabaseFromPigeon(app); + if (!database) { + firebase_database_firebase_database_host_api_respond_error_go_online( + response_handle, "unknown", "Database instance not found", nullptr); + return; + } + database->GoOnline(); + firebase_database_firebase_database_host_api_respond_go_online( + response_handle); +} + +static void HandleGoOffline( + FirebaseDatabaseDatabasePigeonFirebaseApp* app, + FirebaseDatabaseFirebaseDatabaseHostApiResponseHandle* response_handle, + gpointer user_data) { + Database* database = GetDatabaseFromPigeon(app); + if (!database) { + firebase_database_firebase_database_host_api_respond_error_go_offline( + response_handle, "unknown", "Database instance not found", nullptr); + return; + } + database->GoOffline(); + firebase_database_firebase_database_host_api_respond_go_offline( + response_handle); +} + +static void HandleSetPersistenceEnabled( + FirebaseDatabaseDatabasePigeonFirebaseApp* app, gboolean enabled, + FirebaseDatabaseFirebaseDatabaseHostApiResponseHandle* response_handle, + gpointer user_data) { + Database* database = GetDatabaseFromPigeon(app); + if (!database) { + firebase_database_firebase_database_host_api_respond_error_set_persistence_enabled( + response_handle, "unknown", "Database instance not found", nullptr); + return; + } + database->set_persistence_enabled(enabled); + firebase_database_firebase_database_host_api_respond_set_persistence_enabled( + response_handle); +} + +static void HandleSetPersistenceCacheSizeBytes( + FirebaseDatabaseDatabasePigeonFirebaseApp* app, int64_t cache_size, + FirebaseDatabaseFirebaseDatabaseHostApiResponseHandle* response_handle, + gpointer user_data) { + // C++ SDK doesn't directly support setting cache size + firebase_database_firebase_database_host_api_respond_set_persistence_cache_size_bytes( + response_handle); +} + +static void HandleSetLoggingEnabled( + FirebaseDatabaseDatabasePigeonFirebaseApp* app, gboolean enabled, + FirebaseDatabaseFirebaseDatabaseHostApiResponseHandle* response_handle, + gpointer user_data) { + Database* database = GetDatabaseFromPigeon(app); + if (!database) { + firebase_database_firebase_database_host_api_respond_error_set_logging_enabled( + response_handle, "unknown", "Database instance not found", nullptr); + return; + } + database->set_log_level(enabled ? firebase::kLogLevelDebug + : firebase::kLogLevelInfo); + firebase_database_firebase_database_host_api_respond_set_logging_enabled( + response_handle); +} + +static void HandleUseDatabaseEmulator( + FirebaseDatabaseDatabasePigeonFirebaseApp* app, const gchar* host, + int64_t port, + FirebaseDatabaseFirebaseDatabaseHostApiResponseHandle* response_handle, + gpointer user_data) { + // The C++ SDK for Realtime Database does not have a UseEmulator API. + // On Windows, tests run against the live Firebase instance. + firebase_database_firebase_database_host_api_respond_use_database_emulator( + response_handle); +} + +static void HandleRef( + FirebaseDatabaseDatabasePigeonFirebaseApp* app, const gchar* path, + FirebaseDatabaseFirebaseDatabaseHostApiResponseHandle* response_handle, + gpointer user_data) { + Database* database = GetDatabaseFromPigeon(app); + if (!database) { + firebase_database_firebase_database_host_api_respond_error_ref( + response_handle, "unknown", "Database instance not found", nullptr); + return; + } + + DatabaseReference ref; + if (path != nullptr && path[0] != '\0') { + ref = database->GetReference(path); + } else { + ref = database->GetReference(); + } + + std::string ref_path; + if (ref.key() != nullptr) { + // Build path from the URL + std::string url = ref.url(); + // Extract path from URL (after the host) + auto pos = url.find(".com/"); + if (pos != std::string::npos) { + ref_path = url.substr(pos + 4); + } else { + ref_path = path ? path : "/"; + } + } else { + ref_path = path ? path : "/"; + } + + g_autoptr(FirebaseDatabaseDatabaseReferencePlatform) reference = + firebase_database_database_reference_platform_new(ref_path.c_str()); + firebase_database_firebase_database_host_api_respond_ref(response_handle, + reference); +} + +static void HandleRefFromURL( + FirebaseDatabaseDatabasePigeonFirebaseApp* app, const gchar* url, + FirebaseDatabaseFirebaseDatabaseHostApiResponseHandle* response_handle, + gpointer user_data) { + Database* database = GetDatabaseFromPigeon(app); + if (!database) { + firebase_database_firebase_database_host_api_respond_error_ref_from_u_r_l( + response_handle, "unknown", "Database instance not found", nullptr); + return; + } + + DatabaseReference ref = database->GetReferenceFromUrl(url); + + std::string ref_path; + std::string ref_url = ref.url(); + auto pos = ref_url.find(".com/"); + if (pos != std::string::npos) { + ref_path = ref_url.substr(pos + 4); + } else { + ref_path = "/"; + } + + g_autoptr(FirebaseDatabaseDatabaseReferencePlatform) reference = + firebase_database_database_reference_platform_new(ref_path.c_str()); + firebase_database_firebase_database_host_api_respond_ref_from_u_r_l( + response_handle, reference); +} + +static void HandlePurgeOutstandingWrites( + FirebaseDatabaseDatabasePigeonFirebaseApp* app, + FirebaseDatabaseFirebaseDatabaseHostApiResponseHandle* response_handle, + gpointer user_data) { + Database* database = GetDatabaseFromPigeon(app); + if (!database) { + firebase_database_firebase_database_host_api_respond_error_purge_outstanding_writes( + response_handle, "unknown", "Database instance not found", nullptr); + return; + } + database->PurgeOutstandingWrites(); + firebase_database_firebase_database_host_api_respond_purge_outstanding_writes( + response_handle); +} + +// ===== DatabaseReference methods ===== + +static void HandleDatabaseReferenceSet( + FirebaseDatabaseDatabasePigeonFirebaseApp* app, + FirebaseDatabaseDatabaseReferenceRequest* request, + FirebaseDatabaseFirebaseDatabaseHostApiResponseHandle* response_handle, + gpointer user_data) { + Database* database = GetDatabaseFromPigeon(app); + if (!database) { + firebase_database_firebase_database_host_api_respond_error_database_reference_set( + response_handle, "unknown", "Database instance not found", nullptr); + return; + } + + DatabaseReference ref = database->GetReference( + firebase_database_database_reference_request_get_path(request)); + Variant value = FlValueToVariant( + firebase_database_database_reference_request_get_value(request)); + + CompleteVoidFuture( + ref.SetValue(value), response_handle, + firebase_database_firebase_database_host_api_respond_database_reference_set, + firebase_database_firebase_database_host_api_respond_error_database_reference_set); +} + +static void HandleDatabaseReferenceSetWithPriority( + FirebaseDatabaseDatabasePigeonFirebaseApp* app, + FirebaseDatabaseDatabaseReferenceRequest* request, + FirebaseDatabaseFirebaseDatabaseHostApiResponseHandle* response_handle, + gpointer user_data) { + Database* database = GetDatabaseFromPigeon(app); + if (!database) { + firebase_database_firebase_database_host_api_respond_error_database_reference_set_with_priority( + response_handle, "unknown", "Database instance not found", nullptr); + return; + } + + DatabaseReference ref = database->GetReference( + firebase_database_database_reference_request_get_path(request)); + Variant value = FlValueToVariant( + firebase_database_database_reference_request_get_value(request)); + Variant priority = FlValueToVariant( + firebase_database_database_reference_request_get_priority(request)); + + CompleteVoidFuture( + ref.SetValueAndPriority(value, priority), response_handle, + firebase_database_firebase_database_host_api_respond_database_reference_set_with_priority, + firebase_database_firebase_database_host_api_respond_error_database_reference_set_with_priority); +} + +static void HandleDatabaseReferenceUpdate( + FirebaseDatabaseDatabasePigeonFirebaseApp* app, + FirebaseDatabaseUpdateRequest* request, + FirebaseDatabaseFirebaseDatabaseHostApiResponseHandle* response_handle, + gpointer user_data) { + Database* database = GetDatabaseFromPigeon(app); + if (!database) { + firebase_database_firebase_database_host_api_respond_error_database_reference_update( + response_handle, "unknown", "Database instance not found", nullptr); + return; + } + + DatabaseReference ref = database->GetReference( + firebase_database_update_request_get_path(request)); + Variant values = + FlValueToVariant(firebase_database_update_request_get_value(request)); + + CompleteVoidFuture( + ref.UpdateChildren(values), response_handle, + firebase_database_firebase_database_host_api_respond_database_reference_update, + firebase_database_firebase_database_host_api_respond_error_database_reference_update); +} + +static void HandleDatabaseReferenceSetPriority( + FirebaseDatabaseDatabasePigeonFirebaseApp* app, + FirebaseDatabaseDatabaseReferenceRequest* request, + FirebaseDatabaseFirebaseDatabaseHostApiResponseHandle* response_handle, + gpointer user_data) { + Database* database = GetDatabaseFromPigeon(app); + if (!database) { + firebase_database_firebase_database_host_api_respond_error_database_reference_set_priority( + response_handle, "unknown", "Database instance not found", nullptr); + return; + } + + DatabaseReference ref = database->GetReference( + firebase_database_database_reference_request_get_path(request)); + Variant priority = FlValueToVariant( + firebase_database_database_reference_request_get_priority(request)); + + CompleteVoidFuture( + ref.SetPriority(priority), response_handle, + firebase_database_firebase_database_host_api_respond_database_reference_set_priority, + firebase_database_firebase_database_host_api_respond_error_database_reference_set_priority); +} + +// State shared between the SDK transaction thread and the main thread while +// a Dart transaction handler runs. Lives on the transaction function's stack; +// the SDK thread blocks on the condition variable until the main thread has +// delivered the Dart handler's result. +struct TransactionHandlerState { + std::mutex mutex; + std::condition_variable cv; + bool done = false; + bool aborted = false; + bool exception = false; + FlValue* value = nullptr; // owned + FlValue* snapshot_value = nullptr; // owned + FirebaseDatabaseFirebaseDatabaseFlutterApi* api = nullptr; // owned + int64_t transaction_key = 0; +}; + +static void OnTransactionHandlerResponse(GObject* object, GAsyncResult* result, + gpointer user_data) { + auto* state = static_cast(user_data); + g_autoptr(GError) error = nullptr; + g_autoptr( + FirebaseDatabaseFirebaseDatabaseFlutterApiCallTransactionHandlerResponse) + response = + firebase_database_firebase_database_flutter_api_call_transaction_handler_finish( + state->api, result, &error); + if (response == nullptr || + firebase_database_firebase_database_flutter_api_call_transaction_handler_response_is_error( + response)) { + // Mirrors the Windows error path: treat a failed handler call as an + // aborted transaction with an exception. + state->aborted = true; + state->exception = true; + } else { + FirebaseDatabaseTransactionHandlerResult* handler_result = + firebase_database_firebase_database_flutter_api_call_transaction_handler_response_get_return_value( + response); + FlValue* value = + firebase_database_transaction_handler_result_get_value(handler_result); + if (value != nullptr && fl_value_get_type(value) != FL_VALUE_TYPE_NULL) { + state->value = fl_value_ref(value); + } + state->aborted = firebase_database_transaction_handler_result_get_aborted( + handler_result); + state->exception = + firebase_database_transaction_handler_result_get_exception( + handler_result); + } + { + // Notify while holding the lock: the SDK thread destroys the + // stack-allocated state as soon as it observes done == true, so + // notifying after unlocking could touch a destroyed condition_variable. + std::lock_guard lock(state->mutex); + state->done = true; + state->cv.notify_one(); + } +} + +// Transaction function: runs on an SDK thread. Calls the Dart transaction +// handler on the main thread and blocks until it responds, mirroring the +// semaphore-based Windows implementation. +static firebase::database::TransactionResult DoTransaction(MutableData* data, + void* context) { + auto* transaction_key = static_cast(context); + + TransactionHandlerState state; + state.transaction_key = *transaction_key; + state.snapshot_value = VariantToFlValue(data->value()); + + TransactionHandlerState* state_ptr = &state; + PostToMainThread([state_ptr]() { + state_ptr->api = firebase_database_firebase_database_flutter_api_new( + messenger_, nullptr); + FlValue* snapshot_ptr = + fl_value_get_type(state_ptr->snapshot_value) == FL_VALUE_TYPE_NULL + ? nullptr + : state_ptr->snapshot_value; + firebase_database_firebase_database_flutter_api_call_transaction_handler( + state_ptr->api, state_ptr->transaction_key, snapshot_ptr, nullptr, + OnTransactionHandlerResponse, state_ptr); + }); + + // Wait for the Flutter callback to complete + { + std::unique_lock lock(state.mutex); + state.cv.wait(lock, [&] { return state.done; }); + } + + firebase::database::TransactionResult transaction_result; + if (state.aborted || state.exception) { + transaction_result = firebase::database::kTransactionResultAbort; + } else { + // Apply the result value + if (state.value != nullptr) { + data->set_value(FlValueToVariant(state.value)); + } else { + data->set_value(Variant::Null()); + } + transaction_result = firebase::database::kTransactionResultSuccess; + } + + if (state.value != nullptr) fl_value_unref(state.value); + fl_value_unref(state.snapshot_value); + if (state.api != nullptr) g_object_unref(state.api); + return transaction_result; +} + +static void HandleDatabaseReferenceRunTransaction( + FirebaseDatabaseDatabasePigeonFirebaseApp* app, + FirebaseDatabaseTransactionRequest* request, + FirebaseDatabaseFirebaseDatabaseHostApiResponseHandle* response_handle, + gpointer user_data) { + Database* database = GetDatabaseFromPigeon(app); + if (!database) { + firebase_database_firebase_database_host_api_respond_error_database_reference_run_transaction( + response_handle, "unknown", "Database instance not found", nullptr); + return; + } + + DatabaseReference ref = database->GetReference( + firebase_database_transaction_request_get_path(request)); + int64_t transaction_key = + firebase_database_transaction_request_get_transaction_key(request); + bool apply_locally = + firebase_database_transaction_request_get_apply_locally(request); + + auto* key_context = new int64_t(transaction_key); + ref.RunTransaction(DoTransaction, key_context, apply_locally); + + // Wait for the transaction to complete + g_object_ref(response_handle); + ref.RunTransactionLastResult().OnCompletion([response_handle, transaction_key, + key_context]( + const Future& + future) { + delete key_context; + if (future.error() == Error::kErrorNone) { + const DataSnapshot* snapshot = future.result(); + FlValue* result_map = fl_value_new_map(); + fl_value_set_string_take(result_map, "committed", + fl_value_new_bool(TRUE)); + if (snapshot != nullptr) { + fl_value_set_string_take(result_map, "snapshot", + DataSnapshotToFlValue(*snapshot)); + } else { + fl_value_set_string_take(result_map, "snapshot", fl_value_new_null()); + } + PostToMainThread([response_handle, transaction_key, result_map]() { + transaction_results_[transaction_key] = result_map; + firebase_database_firebase_database_host_api_respond_database_reference_run_transaction( + response_handle); + g_object_unref(response_handle); + }); + } else { + // Transaction failed but may have been aborted + FlValue* result_map = EmptyTransactionResult(); + int error = future.error(); + std::string code = GetDatabaseErrorCode(static_cast(error)); + std::string message = + future.error_message() ? future.error_message() : "Unknown error"; + PostToMainThread([response_handle, transaction_key, result_map, error, + code, message]() { + transaction_results_[transaction_key] = result_map; + if (static_cast(error) == + Error::kErrorTransactionAbortedByUser) { + // Aborted by user is not an error condition + firebase_database_firebase_database_host_api_respond_database_reference_run_transaction( + response_handle); + } else { + firebase_database_firebase_database_host_api_respond_error_database_reference_run_transaction( + response_handle, code.c_str(), message.c_str(), nullptr); + } + g_object_unref(response_handle); + }); + } + }); +} + +static void HandleDatabaseReferenceGetTransactionResult( + FirebaseDatabaseDatabasePigeonFirebaseApp* app, int64_t transaction_key, + FirebaseDatabaseFirebaseDatabaseHostApiResponseHandle* response_handle, + gpointer user_data) { + auto it = transaction_results_.find(transaction_key); + if (it != transaction_results_.end()) { + FlValue* result = it->second; + firebase_database_firebase_database_host_api_respond_database_reference_get_transaction_result( + response_handle, result); + fl_value_unref(result); + transaction_results_.erase(it); + } else { + // Return default result + g_autoptr(FlValue) default_result = EmptyTransactionResult(); + firebase_database_firebase_database_host_api_respond_database_reference_get_transaction_result( + response_handle, default_result); + } +} + +// ===== OnDisconnect methods ===== + +static void HandleOnDisconnectSet( + FirebaseDatabaseDatabasePigeonFirebaseApp* app, + FirebaseDatabaseDatabaseReferenceRequest* request, + FirebaseDatabaseFirebaseDatabaseHostApiResponseHandle* response_handle, + gpointer user_data) { + Database* database = GetDatabaseFromPigeon(app); + if (!database) { + firebase_database_firebase_database_host_api_respond_error_on_disconnect_set( + response_handle, "unknown", "Database instance not found", nullptr); + return; + } + + DatabaseReference ref = database->GetReference( + firebase_database_database_reference_request_get_path(request)); + Variant value = FlValueToVariant( + firebase_database_database_reference_request_get_value(request)); + + CompleteVoidFuture( + ref.OnDisconnect()->SetValue(value), response_handle, + firebase_database_firebase_database_host_api_respond_on_disconnect_set, + firebase_database_firebase_database_host_api_respond_error_on_disconnect_set); +} + +static void HandleOnDisconnectSetWithPriority( + FirebaseDatabaseDatabasePigeonFirebaseApp* app, + FirebaseDatabaseDatabaseReferenceRequest* request, + FirebaseDatabaseFirebaseDatabaseHostApiResponseHandle* response_handle, + gpointer user_data) { + Database* database = GetDatabaseFromPigeon(app); + if (!database) { + firebase_database_firebase_database_host_api_respond_error_on_disconnect_set_with_priority( + response_handle, "unknown", "Database instance not found", nullptr); + return; + } + + DatabaseReference ref = database->GetReference( + firebase_database_database_reference_request_get_path(request)); + Variant value = FlValueToVariant( + firebase_database_database_reference_request_get_value(request)); + Variant priority = FlValueToVariant( + firebase_database_database_reference_request_get_priority(request)); + + CompleteVoidFuture( + ref.OnDisconnect()->SetValueAndPriority(value, priority), response_handle, + firebase_database_firebase_database_host_api_respond_on_disconnect_set_with_priority, + firebase_database_firebase_database_host_api_respond_error_on_disconnect_set_with_priority); +} + +static void HandleOnDisconnectUpdate( + FirebaseDatabaseDatabasePigeonFirebaseApp* app, + FirebaseDatabaseUpdateRequest* request, + FirebaseDatabaseFirebaseDatabaseHostApiResponseHandle* response_handle, + gpointer user_data) { + Database* database = GetDatabaseFromPigeon(app); + if (!database) { + firebase_database_firebase_database_host_api_respond_error_on_disconnect_update( + response_handle, "unknown", "Database instance not found", nullptr); + return; + } + + DatabaseReference ref = database->GetReference( + firebase_database_update_request_get_path(request)); + Variant values = + FlValueToVariant(firebase_database_update_request_get_value(request)); + + CompleteVoidFuture( + ref.OnDisconnect()->UpdateChildren(values), response_handle, + firebase_database_firebase_database_host_api_respond_on_disconnect_update, + firebase_database_firebase_database_host_api_respond_error_on_disconnect_update); +} + +static void HandleOnDisconnectCancel( + FirebaseDatabaseDatabasePigeonFirebaseApp* app, const gchar* path, + FirebaseDatabaseFirebaseDatabaseHostApiResponseHandle* response_handle, + gpointer user_data) { + Database* database = GetDatabaseFromPigeon(app); + if (!database) { + firebase_database_firebase_database_host_api_respond_error_on_disconnect_cancel( + response_handle, "unknown", "Database instance not found", nullptr); + return; + } + + DatabaseReference ref = database->GetReference(path); + + CompleteVoidFuture( + ref.OnDisconnect()->Cancel(), response_handle, + firebase_database_firebase_database_host_api_respond_on_disconnect_cancel, + firebase_database_firebase_database_host_api_respond_error_on_disconnect_cancel); +} + +// ===== Query methods ===== + +static void HandleQueryObserve( + FirebaseDatabaseDatabasePigeonFirebaseApp* app, + FirebaseDatabaseQueryRequest* request, + FirebaseDatabaseFirebaseDatabaseHostApiResponseHandle* response_handle, + gpointer user_data) { + Database* database = GetDatabaseFromPigeon(app); + if (!database) { + firebase_database_firebase_database_host_api_respond_error_query_observe( + response_handle, "unknown", "Database instance not found", nullptr); + return; + } + + DatabaseReference ref = + database->GetReference(firebase_database_query_request_get_path(request)); + firebase::database::Query query = ApplyQueryModifiers( + ref, firebase_database_query_request_get_modifiers(request)); + + // The event type will be passed as an argument when the Dart side calls + // listen on the EventChannel; the stream handler reads it from the listen + // arguments (see DatabaseGenericStreamHandler). + auto handler = std::make_unique(query); + std::string channel_name = RegisterEventChannel( + "plugins.flutter.io/firebase_database/query/", std::move(handler)); + + firebase_database_firebase_database_host_api_respond_query_observe( + response_handle, channel_name.c_str()); +} + +static void HandleQueryKeepSynced( + FirebaseDatabaseDatabasePigeonFirebaseApp* app, + FirebaseDatabaseQueryRequest* request, + FirebaseDatabaseFirebaseDatabaseHostApiResponseHandle* response_handle, + gpointer user_data) { + Database* database = GetDatabaseFromPigeon(app); + if (!database) { + firebase_database_firebase_database_host_api_respond_error_query_keep_synced( + response_handle, "unknown", "Database instance not found", nullptr); + return; + } + + DatabaseReference ref = + database->GetReference(firebase_database_query_request_get_path(request)); + firebase::database::Query query = ApplyQueryModifiers( + ref, firebase_database_query_request_get_modifiers(request)); + + gboolean* value = firebase_database_query_request_get_value(request); + bool keep_synced = value != nullptr ? *value : false; + query.SetKeepSynchronized(keep_synced); + firebase_database_firebase_database_host_api_respond_query_keep_synced( + response_handle); +} + +static void HandleQueryGet( + FirebaseDatabaseDatabasePigeonFirebaseApp* app, + FirebaseDatabaseQueryRequest* request, + FirebaseDatabaseFirebaseDatabaseHostApiResponseHandle* response_handle, + gpointer user_data) { + Database* database = GetDatabaseFromPigeon(app); + if (!database) { + firebase_database_firebase_database_host_api_respond_error_query_get( + response_handle, "unknown", "Database instance not found", nullptr); + return; + } + + DatabaseReference ref = + database->GetReference(firebase_database_query_request_get_path(request)); + firebase::database::Query query = ApplyQueryModifiers( + ref, firebase_database_query_request_get_modifiers(request)); + + g_object_ref(response_handle); + query.GetValue().OnCompletion([response_handle]( + const Future& future) { + if (future.error() == Error::kErrorNone) { + const DataSnapshot* snapshot = future.result(); + FlValue* result_map = fl_value_new_map(); + if (snapshot != nullptr) { + fl_value_set_string_take(result_map, "snapshot", + DataSnapshotToFlValue(*snapshot)); + } else { + fl_value_set_string_take(result_map, "snapshot", fl_value_new_null()); + } + PostToMainThread([response_handle, result_map]() { + firebase_database_firebase_database_host_api_respond_query_get( + response_handle, result_map); + fl_value_unref(result_map); + g_object_unref(response_handle); + }); + } else { + std::string code = + GetDatabaseErrorCode(static_cast(future.error())); + std::string message = + future.error_message() ? future.error_message() : "Unknown error"; + PostToMainThread([response_handle, code, message]() { + firebase_database_firebase_database_host_api_respond_error_query_get( + response_handle, code.c_str(), message.c_str(), nullptr); + g_object_unref(response_handle); + }); + } + }); +} + +static const FirebaseDatabaseFirebaseDatabaseHostApiVTable kHostApiVTable = { + HandleGoOnline, // go_online + HandleGoOffline, // go_offline + HandleSetPersistenceEnabled, // set_persistence_enabled + HandleSetPersistenceCacheSizeBytes, // set_persistence_cache_size_bytes + HandleSetLoggingEnabled, // set_logging_enabled + HandleUseDatabaseEmulator, // use_database_emulator + HandleRef, // ref + HandleRefFromURL, // ref_from_u_r_l + HandlePurgeOutstandingWrites, // purge_outstanding_writes + HandleDatabaseReferenceSet, // database_reference_set + HandleDatabaseReferenceSetWithPriority, // database_reference_set_with_priority + HandleDatabaseReferenceUpdate, // database_reference_update + HandleDatabaseReferenceSetPriority, // database_reference_set_priority + HandleDatabaseReferenceRunTransaction, // database_reference_run_transaction + HandleDatabaseReferenceGetTransactionResult, // database_reference_get_transaction_result + HandleOnDisconnectSet, // on_disconnect_set + HandleOnDisconnectSetWithPriority, // on_disconnect_set_with_priority + HandleOnDisconnectUpdate, // on_disconnect_update + HandleOnDisconnectCancel, // on_disconnect_cancel + HandleQueryObserve, // query_observe + HandleQueryKeepSynced, // query_keep_synced + HandleQueryGet, // query_get +}; + +static void firebase_database_plugin_dispose(GObject* object) { + G_OBJECT_CLASS(firebase_database_plugin_parent_class)->dispose(object); +} + +static void firebase_database_plugin_class_init( + FirebaseDatabasePluginClass* klass) { + G_OBJECT_CLASS(klass)->dispose = firebase_database_plugin_dispose; +} + +static void firebase_database_plugin_init(FirebaseDatabasePlugin* self) {} + +void firebase_database_plugin_register_with_registrar( + FlPluginRegistrar* registrar) { + FirebaseDatabasePlugin* plugin = FIREBASE_DATABASE_PLUGIN( + g_object_new(firebase_database_plugin_get_type(), nullptr)); + + messenger_ = fl_plugin_registrar_get_messenger(registrar); + firebase_database_firebase_database_host_api_set_method_handlers( + messenger_, /* suffix= */ nullptr, &kHostApiVTable, g_object_ref(plugin), + g_object_unref); + + g_object_unref(plugin); + + App::RegisterLibrary(kLibraryName, + firebase_database_linux::getPluginVersion().c_str(), + nullptr); + + // Register atexit handler to clean up listeners and disconnect + // before static destruction triggers thread joins in the C++ SDK. + std::atexit(CleanupBeforeStaticDestruction); +} diff --git a/packages/firebase_database/firebase_database/linux/include/firebase_database/firebase_database_plugin.h b/packages/firebase_database/firebase_database/linux/include/firebase_database/firebase_database_plugin.h new file mode 100644 index 000000000000..5c4366400184 --- /dev/null +++ b/packages/firebase_database/firebase_database/linux/include/firebase_database/firebase_database_plugin.h @@ -0,0 +1,32 @@ +/* + * Copyright 2026, the Chromium project authors. Please see the AUTHORS file + * for details. All rights reserved. Use of this source code is governed by a + * BSD-style license that can be found in the LICENSE file. + */ + +#ifndef FLUTTER_PLUGIN_FIREBASE_DATABASE_PLUGIN_H_ +#define FLUTTER_PLUGIN_FIREBASE_DATABASE_PLUGIN_H_ + +#include + +G_BEGIN_DECLS + +#ifdef FLUTTER_PLUGIN_IMPL +#define FLUTTER_PLUGIN_EXPORT __attribute__((visibility("default"))) +#else +#define FLUTTER_PLUGIN_EXPORT +#endif + +typedef struct _FirebaseDatabasePlugin FirebaseDatabasePlugin; +typedef struct { + GObjectClass parent_class; +} FirebaseDatabasePluginClass; + +FLUTTER_PLUGIN_EXPORT GType firebase_database_plugin_get_type(); + +FLUTTER_PLUGIN_EXPORT void firebase_database_plugin_register_with_registrar( + FlPluginRegistrar* registrar); + +G_END_DECLS + +#endif // FLUTTER_PLUGIN_FIREBASE_DATABASE_PLUGIN_H_ diff --git a/packages/firebase_database/firebase_database/linux/messages.g.cc b/packages/firebase_database/firebase_database/linux/messages.g.cc new file mode 100644 index 000000000000..19cfe0b23dc5 --- /dev/null +++ b/packages/firebase_database/firebase_database/linux/messages.g.cc @@ -0,0 +1,5185 @@ +// Copyright 2026, the Chromium project authors. Please see the AUTHORS file +// for details. All rights reserved. Use of this source code is governed by a +// BSD-style license that can be found in the LICENSE file. +// Autogenerated from Pigeon (v26.3.4), do not edit directly. +// See also: https://pub.dev/packages/pigeon + +#include "messages.g.h" + +#include + +#include +static guint G_GNUC_UNUSED flpigeon_hash_double(double v) { + if (std::isnan(v)) { + return static_cast(0x7FF80000); + } + if (v == 0.0) { + v = 0.0; + } + union { + double d; + uint64_t u; + } u; + u.d = v; + return static_cast(u.u ^ (u.u >> 32)); +} +static gboolean G_GNUC_UNUSED flpigeon_equals_double(double a, double b) { + return (a == b) || (std::isnan(a) && std::isnan(b)); +} +static gboolean G_GNUC_UNUSED flpigeon_deep_equals(FlValue* a, FlValue* b) { + if (a == b) { + return TRUE; + } + if (a == nullptr || b == nullptr) { + return FALSE; + } + if (fl_value_get_type(a) != fl_value_get_type(b)) { + return FALSE; + } + switch (fl_value_get_type(a)) { + case FL_VALUE_TYPE_NULL: + return TRUE; + case FL_VALUE_TYPE_BOOL: + return fl_value_get_bool(a) == fl_value_get_bool(b); + case FL_VALUE_TYPE_INT: + return fl_value_get_int(a) == fl_value_get_int(b); + case FL_VALUE_TYPE_FLOAT: { + return flpigeon_equals_double(fl_value_get_float(a), + fl_value_get_float(b)); + } + case FL_VALUE_TYPE_STRING: + return g_strcmp0(fl_value_get_string(a), fl_value_get_string(b)) == 0; + case FL_VALUE_TYPE_UINT8_LIST: + return fl_value_get_length(a) == fl_value_get_length(b) && + memcmp(fl_value_get_uint8_list(a), fl_value_get_uint8_list(b), + fl_value_get_length(a)) == 0; + case FL_VALUE_TYPE_INT32_LIST: + return fl_value_get_length(a) == fl_value_get_length(b) && + memcmp(fl_value_get_int32_list(a), fl_value_get_int32_list(b), + fl_value_get_length(a) * sizeof(int32_t)) == 0; + case FL_VALUE_TYPE_INT64_LIST: + return fl_value_get_length(a) == fl_value_get_length(b) && + memcmp(fl_value_get_int64_list(a), fl_value_get_int64_list(b), + fl_value_get_length(a) * sizeof(int64_t)) == 0; + case FL_VALUE_TYPE_FLOAT_LIST: { + size_t len = fl_value_get_length(a); + if (len != fl_value_get_length(b)) { + return FALSE; + } + const double* a_data = fl_value_get_float_list(a); + const double* b_data = fl_value_get_float_list(b); + for (size_t i = 0; i < len; i++) { + if (!flpigeon_equals_double(a_data[i], b_data[i])) { + return FALSE; + } + } + return TRUE; + } + case FL_VALUE_TYPE_LIST: { + size_t len = fl_value_get_length(a); + if (len != fl_value_get_length(b)) { + return FALSE; + } + for (size_t i = 0; i < len; i++) { + if (!flpigeon_deep_equals(fl_value_get_list_value(a, i), + fl_value_get_list_value(b, i))) { + return FALSE; + } + } + return TRUE; + } + case FL_VALUE_TYPE_MAP: { + size_t len = fl_value_get_length(a); + if (len != fl_value_get_length(b)) { + return FALSE; + } + for (size_t i = 0; i < len; i++) { + FlValue* key = fl_value_get_map_key(a, i); + FlValue* val = fl_value_get_map_value(a, i); + gboolean found = FALSE; + for (size_t j = 0; j < len; j++) { + FlValue* b_key = fl_value_get_map_key(b, j); + if (flpigeon_deep_equals(key, b_key)) { + FlValue* b_val = fl_value_get_map_value(b, j); + if (flpigeon_deep_equals(val, b_val)) { + found = TRUE; + break; + } else { + return FALSE; + } + } + } + if (!found) { + return FALSE; + } + } + return TRUE; + } + default: + return FALSE; + } + return FALSE; +} +static guint G_GNUC_UNUSED flpigeon_deep_hash(FlValue* value) { + if (value == nullptr) { + return 0; + } + switch (fl_value_get_type(value)) { + case FL_VALUE_TYPE_NULL: + return 0; + case FL_VALUE_TYPE_BOOL: + return fl_value_get_bool(value) ? 1231 : 1237; + case FL_VALUE_TYPE_INT: { + int64_t v = fl_value_get_int(value); + return static_cast(v ^ (v >> 32)); + } + case FL_VALUE_TYPE_FLOAT: + return flpigeon_hash_double(fl_value_get_float(value)); + case FL_VALUE_TYPE_STRING: + return g_str_hash(fl_value_get_string(value)); + case FL_VALUE_TYPE_UINT8_LIST: { + guint result = 1; + size_t len = fl_value_get_length(value); + const uint8_t* data = fl_value_get_uint8_list(value); + for (size_t i = 0; i < len; i++) { + result = result * 31 + data[i]; + } + return result; + } + case FL_VALUE_TYPE_INT32_LIST: { + guint result = 1; + size_t len = fl_value_get_length(value); + const int32_t* data = fl_value_get_int32_list(value); + for (size_t i = 0; i < len; i++) { + result = result * 31 + static_cast(data[i]); + } + return result; + } + case FL_VALUE_TYPE_INT64_LIST: { + guint result = 1; + size_t len = fl_value_get_length(value); + const int64_t* data = fl_value_get_int64_list(value); + for (size_t i = 0; i < len; i++) { + result = result * 31 + static_cast(data[i] ^ (data[i] >> 32)); + } + return result; + } + case FL_VALUE_TYPE_FLOAT_LIST: { + guint result = 1; + size_t len = fl_value_get_length(value); + const double* data = fl_value_get_float_list(value); + for (size_t i = 0; i < len; i++) { + result = result * 31 + flpigeon_hash_double(data[i]); + } + return result; + } + case FL_VALUE_TYPE_LIST: { + guint result = 1; + size_t len = fl_value_get_length(value); + for (size_t i = 0; i < len; i++) { + result = + result * 31 + flpigeon_deep_hash(fl_value_get_list_value(value, i)); + } + return result; + } + case FL_VALUE_TYPE_MAP: { + guint result = 0; + size_t len = fl_value_get_length(value); + for (size_t i = 0; i < len; i++) { + result += ((flpigeon_deep_hash(fl_value_get_map_key(value, i)) * 31) ^ + flpigeon_deep_hash(fl_value_get_map_value(value, i))); + } + return result; + } + default: + return static_cast(fl_value_get_type(value)); + } + return 0; +} + +struct _FirebaseDatabaseDatabasePigeonSettings { + GObject parent_instance; + + gboolean* persistence_enabled; + int64_t* cache_size_bytes; + gboolean* logging_enabled; + gchar* emulator_host; + int64_t* emulator_port; +}; + +G_DEFINE_TYPE(FirebaseDatabaseDatabasePigeonSettings, + firebase_database_database_pigeon_settings, G_TYPE_OBJECT) + +static void firebase_database_database_pigeon_settings_dispose( + GObject* object) { + FirebaseDatabaseDatabasePigeonSettings* self = + FIREBASE_DATABASE_DATABASE_PIGEON_SETTINGS(object); + g_clear_pointer(&self->persistence_enabled, g_free); + g_clear_pointer(&self->cache_size_bytes, g_free); + g_clear_pointer(&self->logging_enabled, g_free); + g_clear_pointer(&self->emulator_host, g_free); + g_clear_pointer(&self->emulator_port, g_free); + G_OBJECT_CLASS(firebase_database_database_pigeon_settings_parent_class) + ->dispose(object); +} + +static void firebase_database_database_pigeon_settings_init( + FirebaseDatabaseDatabasePigeonSettings* self) {} + +static void firebase_database_database_pigeon_settings_class_init( + FirebaseDatabaseDatabasePigeonSettingsClass* klass) { + G_OBJECT_CLASS(klass)->dispose = + firebase_database_database_pigeon_settings_dispose; +} + +FirebaseDatabaseDatabasePigeonSettings* +firebase_database_database_pigeon_settings_new(gboolean* persistence_enabled, + int64_t* cache_size_bytes, + gboolean* logging_enabled, + const gchar* emulator_host, + int64_t* emulator_port) { + FirebaseDatabaseDatabasePigeonSettings* self = + FIREBASE_DATABASE_DATABASE_PIGEON_SETTINGS(g_object_new( + firebase_database_database_pigeon_settings_get_type(), nullptr)); + if (persistence_enabled != nullptr) { + self->persistence_enabled = + static_cast(malloc(sizeof(gboolean))); + *self->persistence_enabled = *persistence_enabled; + } else { + self->persistence_enabled = nullptr; + } + if (cache_size_bytes != nullptr) { + self->cache_size_bytes = static_cast(malloc(sizeof(int64_t))); + *self->cache_size_bytes = *cache_size_bytes; + } else { + self->cache_size_bytes = nullptr; + } + if (logging_enabled != nullptr) { + self->logging_enabled = static_cast(malloc(sizeof(gboolean))); + *self->logging_enabled = *logging_enabled; + } else { + self->logging_enabled = nullptr; + } + if (emulator_host != nullptr) { + self->emulator_host = g_strdup(emulator_host); + } else { + self->emulator_host = nullptr; + } + if (emulator_port != nullptr) { + self->emulator_port = static_cast(malloc(sizeof(int64_t))); + *self->emulator_port = *emulator_port; + } else { + self->emulator_port = nullptr; + } + return self; +} + +gboolean* firebase_database_database_pigeon_settings_get_persistence_enabled( + FirebaseDatabaseDatabasePigeonSettings* self) { + g_return_val_if_fail(FIREBASE_DATABASE_IS_DATABASE_PIGEON_SETTINGS(self), + nullptr); + return self->persistence_enabled; +} + +int64_t* firebase_database_database_pigeon_settings_get_cache_size_bytes( + FirebaseDatabaseDatabasePigeonSettings* self) { + g_return_val_if_fail(FIREBASE_DATABASE_IS_DATABASE_PIGEON_SETTINGS(self), + nullptr); + return self->cache_size_bytes; +} + +gboolean* firebase_database_database_pigeon_settings_get_logging_enabled( + FirebaseDatabaseDatabasePigeonSettings* self) { + g_return_val_if_fail(FIREBASE_DATABASE_IS_DATABASE_PIGEON_SETTINGS(self), + nullptr); + return self->logging_enabled; +} + +const gchar* firebase_database_database_pigeon_settings_get_emulator_host( + FirebaseDatabaseDatabasePigeonSettings* self) { + g_return_val_if_fail(FIREBASE_DATABASE_IS_DATABASE_PIGEON_SETTINGS(self), + nullptr); + return self->emulator_host; +} + +int64_t* firebase_database_database_pigeon_settings_get_emulator_port( + FirebaseDatabaseDatabasePigeonSettings* self) { + g_return_val_if_fail(FIREBASE_DATABASE_IS_DATABASE_PIGEON_SETTINGS(self), + nullptr); + return self->emulator_port; +} + +static FlValue* firebase_database_database_pigeon_settings_to_list( + FirebaseDatabaseDatabasePigeonSettings* self) { + FlValue* values = fl_value_new_list(); + fl_value_append_take(values, + self->persistence_enabled != nullptr + ? fl_value_new_bool(*self->persistence_enabled) + : fl_value_new_null()); + fl_value_append_take(values, self->cache_size_bytes != nullptr + ? fl_value_new_int(*self->cache_size_bytes) + : fl_value_new_null()); + fl_value_append_take(values, self->logging_enabled != nullptr + ? fl_value_new_bool(*self->logging_enabled) + : fl_value_new_null()); + fl_value_append_take(values, self->emulator_host != nullptr + ? fl_value_new_string(self->emulator_host) + : fl_value_new_null()); + fl_value_append_take(values, self->emulator_port != nullptr + ? fl_value_new_int(*self->emulator_port) + : fl_value_new_null()); + return values; +} + +static FirebaseDatabaseDatabasePigeonSettings* +firebase_database_database_pigeon_settings_new_from_list(FlValue* values) { + FlValue* value0 = fl_value_get_list_value(values, 0); + gboolean* persistence_enabled = nullptr; + gboolean persistence_enabled_value; + if (fl_value_get_type(value0) != FL_VALUE_TYPE_NULL) { + persistence_enabled_value = fl_value_get_bool(value0); + persistence_enabled = &persistence_enabled_value; + } + FlValue* value1 = fl_value_get_list_value(values, 1); + int64_t* cache_size_bytes = nullptr; + int64_t cache_size_bytes_value; + if (fl_value_get_type(value1) != FL_VALUE_TYPE_NULL) { + cache_size_bytes_value = fl_value_get_int(value1); + cache_size_bytes = &cache_size_bytes_value; + } + FlValue* value2 = fl_value_get_list_value(values, 2); + gboolean* logging_enabled = nullptr; + gboolean logging_enabled_value; + if (fl_value_get_type(value2) != FL_VALUE_TYPE_NULL) { + logging_enabled_value = fl_value_get_bool(value2); + logging_enabled = &logging_enabled_value; + } + FlValue* value3 = fl_value_get_list_value(values, 3); + const gchar* emulator_host = nullptr; + if (fl_value_get_type(value3) != FL_VALUE_TYPE_NULL) { + emulator_host = fl_value_get_string(value3); + } + FlValue* value4 = fl_value_get_list_value(values, 4); + int64_t* emulator_port = nullptr; + int64_t emulator_port_value; + if (fl_value_get_type(value4) != FL_VALUE_TYPE_NULL) { + emulator_port_value = fl_value_get_int(value4); + emulator_port = &emulator_port_value; + } + return firebase_database_database_pigeon_settings_new( + persistence_enabled, cache_size_bytes, logging_enabled, emulator_host, + emulator_port); +} + +gboolean firebase_database_database_pigeon_settings_equals( + FirebaseDatabaseDatabasePigeonSettings* a, + FirebaseDatabaseDatabasePigeonSettings* b) { + if (a == b) { + return TRUE; + } + if (a == nullptr || b == nullptr) { + return FALSE; + } + if ((a->persistence_enabled == nullptr) != + (b->persistence_enabled == nullptr)) { + return FALSE; + } + if (a->persistence_enabled != nullptr && + *a->persistence_enabled != *b->persistence_enabled) { + return FALSE; + } + if ((a->cache_size_bytes == nullptr) != (b->cache_size_bytes == nullptr)) { + return FALSE; + } + if (a->cache_size_bytes != nullptr && + *a->cache_size_bytes != *b->cache_size_bytes) { + return FALSE; + } + if ((a->logging_enabled == nullptr) != (b->logging_enabled == nullptr)) { + return FALSE; + } + if (a->logging_enabled != nullptr && + *a->logging_enabled != *b->logging_enabled) { + return FALSE; + } + if (g_strcmp0(a->emulator_host, b->emulator_host) != 0) { + return FALSE; + } + if ((a->emulator_port == nullptr) != (b->emulator_port == nullptr)) { + return FALSE; + } + if (a->emulator_port != nullptr && *a->emulator_port != *b->emulator_port) { + return FALSE; + } + return TRUE; +} + +guint firebase_database_database_pigeon_settings_hash( + FirebaseDatabaseDatabasePigeonSettings* self) { + g_return_val_if_fail(FIREBASE_DATABASE_IS_DATABASE_PIGEON_SETTINGS(self), 0); + guint result = 0; + result = result * 31 + (self->persistence_enabled != nullptr + ? static_cast(*self->persistence_enabled) + : 0); + result = result * 31 + (self->cache_size_bytes != nullptr + ? static_cast(*self->cache_size_bytes) + : 0); + result = result * 31 + (self->logging_enabled != nullptr + ? static_cast(*self->logging_enabled) + : 0); + result = + result * 31 + + (self->emulator_host != nullptr ? g_str_hash(self->emulator_host) : 0); + result = result * 31 + (self->emulator_port != nullptr + ? static_cast(*self->emulator_port) + : 0); + return result; +} + +struct _FirebaseDatabaseDatabasePigeonFirebaseApp { + GObject parent_instance; + + gchar* app_name; + gchar* database_u_r_l; + FirebaseDatabaseDatabasePigeonSettings* settings; +}; + +G_DEFINE_TYPE(FirebaseDatabaseDatabasePigeonFirebaseApp, + firebase_database_database_pigeon_firebase_app, G_TYPE_OBJECT) + +static void firebase_database_database_pigeon_firebase_app_dispose( + GObject* object) { + FirebaseDatabaseDatabasePigeonFirebaseApp* self = + FIREBASE_DATABASE_DATABASE_PIGEON_FIREBASE_APP(object); + g_clear_pointer(&self->app_name, g_free); + g_clear_pointer(&self->database_u_r_l, g_free); + g_clear_object(&self->settings); + G_OBJECT_CLASS(firebase_database_database_pigeon_firebase_app_parent_class) + ->dispose(object); +} + +static void firebase_database_database_pigeon_firebase_app_init( + FirebaseDatabaseDatabasePigeonFirebaseApp* self) {} + +static void firebase_database_database_pigeon_firebase_app_class_init( + FirebaseDatabaseDatabasePigeonFirebaseAppClass* klass) { + G_OBJECT_CLASS(klass)->dispose = + firebase_database_database_pigeon_firebase_app_dispose; +} + +FirebaseDatabaseDatabasePigeonFirebaseApp* +firebase_database_database_pigeon_firebase_app_new( + const gchar* app_name, const gchar* database_u_r_l, + FirebaseDatabaseDatabasePigeonSettings* settings) { + FirebaseDatabaseDatabasePigeonFirebaseApp* self = + FIREBASE_DATABASE_DATABASE_PIGEON_FIREBASE_APP(g_object_new( + firebase_database_database_pigeon_firebase_app_get_type(), nullptr)); + self->app_name = g_strdup(app_name); + if (database_u_r_l != nullptr) { + self->database_u_r_l = g_strdup(database_u_r_l); + } else { + self->database_u_r_l = nullptr; + } + self->settings = + FIREBASE_DATABASE_DATABASE_PIGEON_SETTINGS(g_object_ref(settings)); + return self; +} + +const gchar* firebase_database_database_pigeon_firebase_app_get_app_name( + FirebaseDatabaseDatabasePigeonFirebaseApp* self) { + g_return_val_if_fail(FIREBASE_DATABASE_IS_DATABASE_PIGEON_FIREBASE_APP(self), + nullptr); + return self->app_name; +} + +const gchar* firebase_database_database_pigeon_firebase_app_get_database_u_r_l( + FirebaseDatabaseDatabasePigeonFirebaseApp* self) { + g_return_val_if_fail(FIREBASE_DATABASE_IS_DATABASE_PIGEON_FIREBASE_APP(self), + nullptr); + return self->database_u_r_l; +} + +FirebaseDatabaseDatabasePigeonSettings* +firebase_database_database_pigeon_firebase_app_get_settings( + FirebaseDatabaseDatabasePigeonFirebaseApp* self) { + g_return_val_if_fail(FIREBASE_DATABASE_IS_DATABASE_PIGEON_FIREBASE_APP(self), + nullptr); + return self->settings; +} + +static FlValue* firebase_database_database_pigeon_firebase_app_to_list( + FirebaseDatabaseDatabasePigeonFirebaseApp* self) { + FlValue* values = fl_value_new_list(); + fl_value_append_take(values, fl_value_new_string(self->app_name)); + fl_value_append_take(values, self->database_u_r_l != nullptr + ? fl_value_new_string(self->database_u_r_l) + : fl_value_new_null()); + fl_value_append_take(values, + fl_value_new_custom_object( + firebase_database_database_pigeon_settings_type_id, + G_OBJECT(self->settings))); + return values; +} + +static FirebaseDatabaseDatabasePigeonFirebaseApp* +firebase_database_database_pigeon_firebase_app_new_from_list(FlValue* values) { + FlValue* value0 = fl_value_get_list_value(values, 0); + const gchar* app_name = fl_value_get_string(value0); + FlValue* value1 = fl_value_get_list_value(values, 1); + const gchar* database_u_r_l = nullptr; + if (fl_value_get_type(value1) != FL_VALUE_TYPE_NULL) { + database_u_r_l = fl_value_get_string(value1); + } + FlValue* value2 = fl_value_get_list_value(values, 2); + FirebaseDatabaseDatabasePigeonSettings* settings = + FIREBASE_DATABASE_DATABASE_PIGEON_SETTINGS( + fl_value_get_custom_value_object(value2)); + return firebase_database_database_pigeon_firebase_app_new( + app_name, database_u_r_l, settings); +} + +gboolean firebase_database_database_pigeon_firebase_app_equals( + FirebaseDatabaseDatabasePigeonFirebaseApp* a, + FirebaseDatabaseDatabasePigeonFirebaseApp* b) { + if (a == b) { + return TRUE; + } + if (a == nullptr || b == nullptr) { + return FALSE; + } + if (g_strcmp0(a->app_name, b->app_name) != 0) { + return FALSE; + } + if (g_strcmp0(a->database_u_r_l, b->database_u_r_l) != 0) { + return FALSE; + } + if (!firebase_database_database_pigeon_settings_equals(a->settings, + b->settings)) { + return FALSE; + } + return TRUE; +} + +guint firebase_database_database_pigeon_firebase_app_hash( + FirebaseDatabaseDatabasePigeonFirebaseApp* self) { + g_return_val_if_fail(FIREBASE_DATABASE_IS_DATABASE_PIGEON_FIREBASE_APP(self), + 0); + guint result = 0; + result = result * 31 + + (self->app_name != nullptr ? g_str_hash(self->app_name) : 0); + result = + result * 31 + + (self->database_u_r_l != nullptr ? g_str_hash(self->database_u_r_l) : 0); + result = result * 31 + + firebase_database_database_pigeon_settings_hash(self->settings); + return result; +} + +struct _FirebaseDatabaseDatabaseReferencePlatform { + GObject parent_instance; + + gchar* path; +}; + +G_DEFINE_TYPE(FirebaseDatabaseDatabaseReferencePlatform, + firebase_database_database_reference_platform, G_TYPE_OBJECT) + +static void firebase_database_database_reference_platform_dispose( + GObject* object) { + FirebaseDatabaseDatabaseReferencePlatform* self = + FIREBASE_DATABASE_DATABASE_REFERENCE_PLATFORM(object); + g_clear_pointer(&self->path, g_free); + G_OBJECT_CLASS(firebase_database_database_reference_platform_parent_class) + ->dispose(object); +} + +static void firebase_database_database_reference_platform_init( + FirebaseDatabaseDatabaseReferencePlatform* self) {} + +static void firebase_database_database_reference_platform_class_init( + FirebaseDatabaseDatabaseReferencePlatformClass* klass) { + G_OBJECT_CLASS(klass)->dispose = + firebase_database_database_reference_platform_dispose; +} + +FirebaseDatabaseDatabaseReferencePlatform* +firebase_database_database_reference_platform_new(const gchar* path) { + FirebaseDatabaseDatabaseReferencePlatform* self = + FIREBASE_DATABASE_DATABASE_REFERENCE_PLATFORM(g_object_new( + firebase_database_database_reference_platform_get_type(), nullptr)); + self->path = g_strdup(path); + return self; +} + +const gchar* firebase_database_database_reference_platform_get_path( + FirebaseDatabaseDatabaseReferencePlatform* self) { + g_return_val_if_fail(FIREBASE_DATABASE_IS_DATABASE_REFERENCE_PLATFORM(self), + nullptr); + return self->path; +} + +static FlValue* firebase_database_database_reference_platform_to_list( + FirebaseDatabaseDatabaseReferencePlatform* self) { + FlValue* values = fl_value_new_list(); + fl_value_append_take(values, fl_value_new_string(self->path)); + return values; +} + +static FirebaseDatabaseDatabaseReferencePlatform* +firebase_database_database_reference_platform_new_from_list(FlValue* values) { + FlValue* value0 = fl_value_get_list_value(values, 0); + const gchar* path = fl_value_get_string(value0); + return firebase_database_database_reference_platform_new(path); +} + +gboolean firebase_database_database_reference_platform_equals( + FirebaseDatabaseDatabaseReferencePlatform* a, + FirebaseDatabaseDatabaseReferencePlatform* b) { + if (a == b) { + return TRUE; + } + if (a == nullptr || b == nullptr) { + return FALSE; + } + if (g_strcmp0(a->path, b->path) != 0) { + return FALSE; + } + return TRUE; +} + +guint firebase_database_database_reference_platform_hash( + FirebaseDatabaseDatabaseReferencePlatform* self) { + g_return_val_if_fail(FIREBASE_DATABASE_IS_DATABASE_REFERENCE_PLATFORM(self), + 0); + guint result = 0; + result = result * 31 + (self->path != nullptr ? g_str_hash(self->path) : 0); + return result; +} + +struct _FirebaseDatabaseDatabaseReferenceRequest { + GObject parent_instance; + + gchar* path; + FlValue* value; + FlValue* priority; +}; + +G_DEFINE_TYPE(FirebaseDatabaseDatabaseReferenceRequest, + firebase_database_database_reference_request, G_TYPE_OBJECT) + +static void firebase_database_database_reference_request_dispose( + GObject* object) { + FirebaseDatabaseDatabaseReferenceRequest* self = + FIREBASE_DATABASE_DATABASE_REFERENCE_REQUEST(object); + g_clear_pointer(&self->path, g_free); + g_clear_pointer(&self->value, fl_value_unref); + g_clear_pointer(&self->priority, fl_value_unref); + G_OBJECT_CLASS(firebase_database_database_reference_request_parent_class) + ->dispose(object); +} + +static void firebase_database_database_reference_request_init( + FirebaseDatabaseDatabaseReferenceRequest* self) {} + +static void firebase_database_database_reference_request_class_init( + FirebaseDatabaseDatabaseReferenceRequestClass* klass) { + G_OBJECT_CLASS(klass)->dispose = + firebase_database_database_reference_request_dispose; +} + +FirebaseDatabaseDatabaseReferenceRequest* +firebase_database_database_reference_request_new(const gchar* path, + FlValue* value, + FlValue* priority) { + FirebaseDatabaseDatabaseReferenceRequest* self = + FIREBASE_DATABASE_DATABASE_REFERENCE_REQUEST(g_object_new( + firebase_database_database_reference_request_get_type(), nullptr)); + self->path = g_strdup(path); + if (value != nullptr) { + self->value = fl_value_ref(value); + } else { + self->value = nullptr; + } + if (priority != nullptr) { + self->priority = fl_value_ref(priority); + } else { + self->priority = nullptr; + } + return self; +} + +const gchar* firebase_database_database_reference_request_get_path( + FirebaseDatabaseDatabaseReferenceRequest* self) { + g_return_val_if_fail(FIREBASE_DATABASE_IS_DATABASE_REFERENCE_REQUEST(self), + nullptr); + return self->path; +} + +FlValue* firebase_database_database_reference_request_get_value( + FirebaseDatabaseDatabaseReferenceRequest* self) { + g_return_val_if_fail(FIREBASE_DATABASE_IS_DATABASE_REFERENCE_REQUEST(self), + nullptr); + return self->value; +} + +FlValue* firebase_database_database_reference_request_get_priority( + FirebaseDatabaseDatabaseReferenceRequest* self) { + g_return_val_if_fail(FIREBASE_DATABASE_IS_DATABASE_REFERENCE_REQUEST(self), + nullptr); + return self->priority; +} + +static FlValue* firebase_database_database_reference_request_to_list( + FirebaseDatabaseDatabaseReferenceRequest* self) { + FlValue* values = fl_value_new_list(); + fl_value_append_take(values, fl_value_new_string(self->path)); + fl_value_append_take(values, self->value != nullptr + ? fl_value_ref(self->value) + : fl_value_new_null()); + fl_value_append_take(values, self->priority != nullptr + ? fl_value_ref(self->priority) + : fl_value_new_null()); + return values; +} + +static FirebaseDatabaseDatabaseReferenceRequest* +firebase_database_database_reference_request_new_from_list(FlValue* values) { + FlValue* value0 = fl_value_get_list_value(values, 0); + const gchar* path = fl_value_get_string(value0); + FlValue* value1 = fl_value_get_list_value(values, 1); + FlValue* value = nullptr; + if (fl_value_get_type(value1) != FL_VALUE_TYPE_NULL) { + value = value1; + } + FlValue* value2 = fl_value_get_list_value(values, 2); + FlValue* priority = nullptr; + if (fl_value_get_type(value2) != FL_VALUE_TYPE_NULL) { + priority = value2; + } + return firebase_database_database_reference_request_new(path, value, + priority); +} + +gboolean firebase_database_database_reference_request_equals( + FirebaseDatabaseDatabaseReferenceRequest* a, + FirebaseDatabaseDatabaseReferenceRequest* b) { + if (a == b) { + return TRUE; + } + if (a == nullptr || b == nullptr) { + return FALSE; + } + if (g_strcmp0(a->path, b->path) != 0) { + return FALSE; + } + if (!flpigeon_deep_equals(a->value, b->value)) { + return FALSE; + } + if (!flpigeon_deep_equals(a->priority, b->priority)) { + return FALSE; + } + return TRUE; +} + +guint firebase_database_database_reference_request_hash( + FirebaseDatabaseDatabaseReferenceRequest* self) { + g_return_val_if_fail(FIREBASE_DATABASE_IS_DATABASE_REFERENCE_REQUEST(self), + 0); + guint result = 0; + result = result * 31 + (self->path != nullptr ? g_str_hash(self->path) : 0); + result = result * 31 + flpigeon_deep_hash(self->value); + result = result * 31 + flpigeon_deep_hash(self->priority); + return result; +} + +struct _FirebaseDatabaseUpdateRequest { + GObject parent_instance; + + gchar* path; + FlValue* value; +}; + +G_DEFINE_TYPE(FirebaseDatabaseUpdateRequest, firebase_database_update_request, + G_TYPE_OBJECT) + +static void firebase_database_update_request_dispose(GObject* object) { + FirebaseDatabaseUpdateRequest* self = + FIREBASE_DATABASE_UPDATE_REQUEST(object); + g_clear_pointer(&self->path, g_free); + g_clear_pointer(&self->value, fl_value_unref); + G_OBJECT_CLASS(firebase_database_update_request_parent_class) + ->dispose(object); +} + +static void firebase_database_update_request_init( + FirebaseDatabaseUpdateRequest* self) {} + +static void firebase_database_update_request_class_init( + FirebaseDatabaseUpdateRequestClass* klass) { + G_OBJECT_CLASS(klass)->dispose = firebase_database_update_request_dispose; +} + +FirebaseDatabaseUpdateRequest* firebase_database_update_request_new( + const gchar* path, FlValue* value) { + FirebaseDatabaseUpdateRequest* self = FIREBASE_DATABASE_UPDATE_REQUEST( + g_object_new(firebase_database_update_request_get_type(), nullptr)); + self->path = g_strdup(path); + self->value = fl_value_ref(value); + return self; +} + +const gchar* firebase_database_update_request_get_path( + FirebaseDatabaseUpdateRequest* self) { + g_return_val_if_fail(FIREBASE_DATABASE_IS_UPDATE_REQUEST(self), nullptr); + return self->path; +} + +FlValue* firebase_database_update_request_get_value( + FirebaseDatabaseUpdateRequest* self) { + g_return_val_if_fail(FIREBASE_DATABASE_IS_UPDATE_REQUEST(self), nullptr); + return self->value; +} + +static FlValue* firebase_database_update_request_to_list( + FirebaseDatabaseUpdateRequest* self) { + FlValue* values = fl_value_new_list(); + fl_value_append_take(values, fl_value_new_string(self->path)); + fl_value_append_take(values, fl_value_ref(self->value)); + return values; +} + +static FirebaseDatabaseUpdateRequest* +firebase_database_update_request_new_from_list(FlValue* values) { + FlValue* value0 = fl_value_get_list_value(values, 0); + const gchar* path = fl_value_get_string(value0); + FlValue* value1 = fl_value_get_list_value(values, 1); + FlValue* value = value1; + return firebase_database_update_request_new(path, value); +} + +gboolean firebase_database_update_request_equals( + FirebaseDatabaseUpdateRequest* a, FirebaseDatabaseUpdateRequest* b) { + if (a == b) { + return TRUE; + } + if (a == nullptr || b == nullptr) { + return FALSE; + } + if (g_strcmp0(a->path, b->path) != 0) { + return FALSE; + } + if (!flpigeon_deep_equals(a->value, b->value)) { + return FALSE; + } + return TRUE; +} + +guint firebase_database_update_request_hash( + FirebaseDatabaseUpdateRequest* self) { + g_return_val_if_fail(FIREBASE_DATABASE_IS_UPDATE_REQUEST(self), 0); + guint result = 0; + result = result * 31 + (self->path != nullptr ? g_str_hash(self->path) : 0); + result = result * 31 + flpigeon_deep_hash(self->value); + return result; +} + +struct _FirebaseDatabaseTransactionRequest { + GObject parent_instance; + + gchar* path; + int64_t transaction_key; + gboolean apply_locally; +}; + +G_DEFINE_TYPE(FirebaseDatabaseTransactionRequest, + firebase_database_transaction_request, G_TYPE_OBJECT) + +static void firebase_database_transaction_request_dispose(GObject* object) { + FirebaseDatabaseTransactionRequest* self = + FIREBASE_DATABASE_TRANSACTION_REQUEST(object); + g_clear_pointer(&self->path, g_free); + G_OBJECT_CLASS(firebase_database_transaction_request_parent_class) + ->dispose(object); +} + +static void firebase_database_transaction_request_init( + FirebaseDatabaseTransactionRequest* self) {} + +static void firebase_database_transaction_request_class_init( + FirebaseDatabaseTransactionRequestClass* klass) { + G_OBJECT_CLASS(klass)->dispose = + firebase_database_transaction_request_dispose; +} + +FirebaseDatabaseTransactionRequest* firebase_database_transaction_request_new( + const gchar* path, int64_t transaction_key, gboolean apply_locally) { + FirebaseDatabaseTransactionRequest* self = + FIREBASE_DATABASE_TRANSACTION_REQUEST(g_object_new( + firebase_database_transaction_request_get_type(), nullptr)); + self->path = g_strdup(path); + self->transaction_key = transaction_key; + self->apply_locally = apply_locally; + return self; +} + +const gchar* firebase_database_transaction_request_get_path( + FirebaseDatabaseTransactionRequest* self) { + g_return_val_if_fail(FIREBASE_DATABASE_IS_TRANSACTION_REQUEST(self), nullptr); + return self->path; +} + +int64_t firebase_database_transaction_request_get_transaction_key( + FirebaseDatabaseTransactionRequest* self) { + g_return_val_if_fail(FIREBASE_DATABASE_IS_TRANSACTION_REQUEST(self), 0); + return self->transaction_key; +} + +gboolean firebase_database_transaction_request_get_apply_locally( + FirebaseDatabaseTransactionRequest* self) { + g_return_val_if_fail(FIREBASE_DATABASE_IS_TRANSACTION_REQUEST(self), FALSE); + return self->apply_locally; +} + +static FlValue* firebase_database_transaction_request_to_list( + FirebaseDatabaseTransactionRequest* self) { + FlValue* values = fl_value_new_list(); + fl_value_append_take(values, fl_value_new_string(self->path)); + fl_value_append_take(values, fl_value_new_int(self->transaction_key)); + fl_value_append_take(values, fl_value_new_bool(self->apply_locally)); + return values; +} + +static FirebaseDatabaseTransactionRequest* +firebase_database_transaction_request_new_from_list(FlValue* values) { + FlValue* value0 = fl_value_get_list_value(values, 0); + const gchar* path = fl_value_get_string(value0); + FlValue* value1 = fl_value_get_list_value(values, 1); + int64_t transaction_key = fl_value_get_int(value1); + FlValue* value2 = fl_value_get_list_value(values, 2); + gboolean apply_locally = fl_value_get_bool(value2); + return firebase_database_transaction_request_new(path, transaction_key, + apply_locally); +} + +gboolean firebase_database_transaction_request_equals( + FirebaseDatabaseTransactionRequest* a, + FirebaseDatabaseTransactionRequest* b) { + if (a == b) { + return TRUE; + } + if (a == nullptr || b == nullptr) { + return FALSE; + } + if (g_strcmp0(a->path, b->path) != 0) { + return FALSE; + } + if (a->transaction_key != b->transaction_key) { + return FALSE; + } + if (a->apply_locally != b->apply_locally) { + return FALSE; + } + return TRUE; +} + +guint firebase_database_transaction_request_hash( + FirebaseDatabaseTransactionRequest* self) { + g_return_val_if_fail(FIREBASE_DATABASE_IS_TRANSACTION_REQUEST(self), 0); + guint result = 0; + result = result * 31 + (self->path != nullptr ? g_str_hash(self->path) : 0); + result = result * 31 + static_cast(self->transaction_key); + result = result * 31 + static_cast(self->apply_locally); + return result; +} + +struct _FirebaseDatabaseQueryRequest { + GObject parent_instance; + + gchar* path; + FlValue* modifiers; + gboolean* value; +}; + +G_DEFINE_TYPE(FirebaseDatabaseQueryRequest, firebase_database_query_request, + G_TYPE_OBJECT) + +static void firebase_database_query_request_dispose(GObject* object) { + FirebaseDatabaseQueryRequest* self = FIREBASE_DATABASE_QUERY_REQUEST(object); + g_clear_pointer(&self->path, g_free); + g_clear_pointer(&self->modifiers, fl_value_unref); + g_clear_pointer(&self->value, g_free); + G_OBJECT_CLASS(firebase_database_query_request_parent_class)->dispose(object); +} + +static void firebase_database_query_request_init( + FirebaseDatabaseQueryRequest* self) {} + +static void firebase_database_query_request_class_init( + FirebaseDatabaseQueryRequestClass* klass) { + G_OBJECT_CLASS(klass)->dispose = firebase_database_query_request_dispose; +} + +FirebaseDatabaseQueryRequest* firebase_database_query_request_new( + const gchar* path, FlValue* modifiers, gboolean* value) { + FirebaseDatabaseQueryRequest* self = FIREBASE_DATABASE_QUERY_REQUEST( + g_object_new(firebase_database_query_request_get_type(), nullptr)); + self->path = g_strdup(path); + self->modifiers = fl_value_ref(modifiers); + if (value != nullptr) { + self->value = static_cast(malloc(sizeof(gboolean))); + *self->value = *value; + } else { + self->value = nullptr; + } + return self; +} + +const gchar* firebase_database_query_request_get_path( + FirebaseDatabaseQueryRequest* self) { + g_return_val_if_fail(FIREBASE_DATABASE_IS_QUERY_REQUEST(self), nullptr); + return self->path; +} + +FlValue* firebase_database_query_request_get_modifiers( + FirebaseDatabaseQueryRequest* self) { + g_return_val_if_fail(FIREBASE_DATABASE_IS_QUERY_REQUEST(self), nullptr); + return self->modifiers; +} + +gboolean* firebase_database_query_request_get_value( + FirebaseDatabaseQueryRequest* self) { + g_return_val_if_fail(FIREBASE_DATABASE_IS_QUERY_REQUEST(self), nullptr); + return self->value; +} + +static FlValue* firebase_database_query_request_to_list( + FirebaseDatabaseQueryRequest* self) { + FlValue* values = fl_value_new_list(); + fl_value_append_take(values, fl_value_new_string(self->path)); + fl_value_append_take(values, fl_value_ref(self->modifiers)); + fl_value_append_take(values, self->value != nullptr + ? fl_value_new_bool(*self->value) + : fl_value_new_null()); + return values; +} + +static FirebaseDatabaseQueryRequest* +firebase_database_query_request_new_from_list(FlValue* values) { + FlValue* value0 = fl_value_get_list_value(values, 0); + const gchar* path = fl_value_get_string(value0); + FlValue* value1 = fl_value_get_list_value(values, 1); + FlValue* modifiers = value1; + FlValue* value2 = fl_value_get_list_value(values, 2); + gboolean* value = nullptr; + gboolean value_value; + if (fl_value_get_type(value2) != FL_VALUE_TYPE_NULL) { + value_value = fl_value_get_bool(value2); + value = &value_value; + } + return firebase_database_query_request_new(path, modifiers, value); +} + +gboolean firebase_database_query_request_equals( + FirebaseDatabaseQueryRequest* a, FirebaseDatabaseQueryRequest* b) { + if (a == b) { + return TRUE; + } + if (a == nullptr || b == nullptr) { + return FALSE; + } + if (g_strcmp0(a->path, b->path) != 0) { + return FALSE; + } + if (!flpigeon_deep_equals(a->modifiers, b->modifiers)) { + return FALSE; + } + if ((a->value == nullptr) != (b->value == nullptr)) { + return FALSE; + } + if (a->value != nullptr && *a->value != *b->value) { + return FALSE; + } + return TRUE; +} + +guint firebase_database_query_request_hash(FirebaseDatabaseQueryRequest* self) { + g_return_val_if_fail(FIREBASE_DATABASE_IS_QUERY_REQUEST(self), 0); + guint result = 0; + result = result * 31 + (self->path != nullptr ? g_str_hash(self->path) : 0); + result = result * 31 + flpigeon_deep_hash(self->modifiers); + result = result * 31 + + (self->value != nullptr ? static_cast(*self->value) : 0); + return result; +} + +struct _FirebaseDatabaseTransactionHandlerResult { + GObject parent_instance; + + FlValue* value; + gboolean aborted; + gboolean exception; +}; + +G_DEFINE_TYPE(FirebaseDatabaseTransactionHandlerResult, + firebase_database_transaction_handler_result, G_TYPE_OBJECT) + +static void firebase_database_transaction_handler_result_dispose( + GObject* object) { + FirebaseDatabaseTransactionHandlerResult* self = + FIREBASE_DATABASE_TRANSACTION_HANDLER_RESULT(object); + g_clear_pointer(&self->value, fl_value_unref); + G_OBJECT_CLASS(firebase_database_transaction_handler_result_parent_class) + ->dispose(object); +} + +static void firebase_database_transaction_handler_result_init( + FirebaseDatabaseTransactionHandlerResult* self) {} + +static void firebase_database_transaction_handler_result_class_init( + FirebaseDatabaseTransactionHandlerResultClass* klass) { + G_OBJECT_CLASS(klass)->dispose = + firebase_database_transaction_handler_result_dispose; +} + +FirebaseDatabaseTransactionHandlerResult* +firebase_database_transaction_handler_result_new(FlValue* value, + gboolean aborted, + gboolean exception) { + FirebaseDatabaseTransactionHandlerResult* self = + FIREBASE_DATABASE_TRANSACTION_HANDLER_RESULT(g_object_new( + firebase_database_transaction_handler_result_get_type(), nullptr)); + if (value != nullptr) { + self->value = fl_value_ref(value); + } else { + self->value = nullptr; + } + self->aborted = aborted; + self->exception = exception; + return self; +} + +FlValue* firebase_database_transaction_handler_result_get_value( + FirebaseDatabaseTransactionHandlerResult* self) { + g_return_val_if_fail(FIREBASE_DATABASE_IS_TRANSACTION_HANDLER_RESULT(self), + nullptr); + return self->value; +} + +gboolean firebase_database_transaction_handler_result_get_aborted( + FirebaseDatabaseTransactionHandlerResult* self) { + g_return_val_if_fail(FIREBASE_DATABASE_IS_TRANSACTION_HANDLER_RESULT(self), + FALSE); + return self->aborted; +} + +gboolean firebase_database_transaction_handler_result_get_exception( + FirebaseDatabaseTransactionHandlerResult* self) { + g_return_val_if_fail(FIREBASE_DATABASE_IS_TRANSACTION_HANDLER_RESULT(self), + FALSE); + return self->exception; +} + +static FlValue* firebase_database_transaction_handler_result_to_list( + FirebaseDatabaseTransactionHandlerResult* self) { + FlValue* values = fl_value_new_list(); + fl_value_append_take(values, self->value != nullptr + ? fl_value_ref(self->value) + : fl_value_new_null()); + fl_value_append_take(values, fl_value_new_bool(self->aborted)); + fl_value_append_take(values, fl_value_new_bool(self->exception)); + return values; +} + +static FirebaseDatabaseTransactionHandlerResult* +firebase_database_transaction_handler_result_new_from_list(FlValue* values) { + FlValue* value0 = fl_value_get_list_value(values, 0); + FlValue* value = nullptr; + if (fl_value_get_type(value0) != FL_VALUE_TYPE_NULL) { + value = value0; + } + FlValue* value1 = fl_value_get_list_value(values, 1); + gboolean aborted = fl_value_get_bool(value1); + FlValue* value2 = fl_value_get_list_value(values, 2); + gboolean exception = fl_value_get_bool(value2); + return firebase_database_transaction_handler_result_new(value, aborted, + exception); +} + +gboolean firebase_database_transaction_handler_result_equals( + FirebaseDatabaseTransactionHandlerResult* a, + FirebaseDatabaseTransactionHandlerResult* b) { + if (a == b) { + return TRUE; + } + if (a == nullptr || b == nullptr) { + return FALSE; + } + if (!flpigeon_deep_equals(a->value, b->value)) { + return FALSE; + } + if (a->aborted != b->aborted) { + return FALSE; + } + if (a->exception != b->exception) { + return FALSE; + } + return TRUE; +} + +guint firebase_database_transaction_handler_result_hash( + FirebaseDatabaseTransactionHandlerResult* self) { + g_return_val_if_fail(FIREBASE_DATABASE_IS_TRANSACTION_HANDLER_RESULT(self), + 0); + guint result = 0; + result = result * 31 + flpigeon_deep_hash(self->value); + result = result * 31 + static_cast(self->aborted); + result = result * 31 + static_cast(self->exception); + return result; +} + +struct _FirebaseDatabaseMessageCodec { + FlStandardMessageCodec parent_instance; +}; + +G_DEFINE_TYPE(FirebaseDatabaseMessageCodec, firebase_database_message_codec, + fl_standard_message_codec_get_type()) + +const int firebase_database_database_pigeon_settings_type_id = 129; +const int firebase_database_database_pigeon_firebase_app_type_id = 130; +const int firebase_database_database_reference_platform_type_id = 131; +const int firebase_database_database_reference_request_type_id = 132; +const int firebase_database_update_request_type_id = 133; +const int firebase_database_transaction_request_type_id = 134; +const int firebase_database_query_request_type_id = 135; +const int firebase_database_transaction_handler_result_type_id = 136; + +static gboolean +firebase_database_message_codec_write_firebase_database_database_pigeon_settings( + FlStandardMessageCodec* codec, GByteArray* buffer, + FirebaseDatabaseDatabasePigeonSettings* value, GError** error) { + uint8_t type = firebase_database_database_pigeon_settings_type_id; + g_byte_array_append(buffer, &type, sizeof(uint8_t)); + g_autoptr(FlValue) values = + firebase_database_database_pigeon_settings_to_list(value); + return fl_standard_message_codec_write_value(codec, buffer, values, error); +} + +static gboolean +firebase_database_message_codec_write_firebase_database_database_pigeon_firebase_app( + FlStandardMessageCodec* codec, GByteArray* buffer, + FirebaseDatabaseDatabasePigeonFirebaseApp* value, GError** error) { + uint8_t type = firebase_database_database_pigeon_firebase_app_type_id; + g_byte_array_append(buffer, &type, sizeof(uint8_t)); + g_autoptr(FlValue) values = + firebase_database_database_pigeon_firebase_app_to_list(value); + return fl_standard_message_codec_write_value(codec, buffer, values, error); +} + +static gboolean +firebase_database_message_codec_write_firebase_database_database_reference_platform( + FlStandardMessageCodec* codec, GByteArray* buffer, + FirebaseDatabaseDatabaseReferencePlatform* value, GError** error) { + uint8_t type = firebase_database_database_reference_platform_type_id; + g_byte_array_append(buffer, &type, sizeof(uint8_t)); + g_autoptr(FlValue) values = + firebase_database_database_reference_platform_to_list(value); + return fl_standard_message_codec_write_value(codec, buffer, values, error); +} + +static gboolean +firebase_database_message_codec_write_firebase_database_database_reference_request( + FlStandardMessageCodec* codec, GByteArray* buffer, + FirebaseDatabaseDatabaseReferenceRequest* value, GError** error) { + uint8_t type = firebase_database_database_reference_request_type_id; + g_byte_array_append(buffer, &type, sizeof(uint8_t)); + g_autoptr(FlValue) values = + firebase_database_database_reference_request_to_list(value); + return fl_standard_message_codec_write_value(codec, buffer, values, error); +} + +static gboolean +firebase_database_message_codec_write_firebase_database_update_request( + FlStandardMessageCodec* codec, GByteArray* buffer, + FirebaseDatabaseUpdateRequest* value, GError** error) { + uint8_t type = firebase_database_update_request_type_id; + g_byte_array_append(buffer, &type, sizeof(uint8_t)); + g_autoptr(FlValue) values = firebase_database_update_request_to_list(value); + return fl_standard_message_codec_write_value(codec, buffer, values, error); +} + +static gboolean +firebase_database_message_codec_write_firebase_database_transaction_request( + FlStandardMessageCodec* codec, GByteArray* buffer, + FirebaseDatabaseTransactionRequest* value, GError** error) { + uint8_t type = firebase_database_transaction_request_type_id; + g_byte_array_append(buffer, &type, sizeof(uint8_t)); + g_autoptr(FlValue) values = + firebase_database_transaction_request_to_list(value); + return fl_standard_message_codec_write_value(codec, buffer, values, error); +} + +static gboolean +firebase_database_message_codec_write_firebase_database_query_request( + FlStandardMessageCodec* codec, GByteArray* buffer, + FirebaseDatabaseQueryRequest* value, GError** error) { + uint8_t type = firebase_database_query_request_type_id; + g_byte_array_append(buffer, &type, sizeof(uint8_t)); + g_autoptr(FlValue) values = firebase_database_query_request_to_list(value); + return fl_standard_message_codec_write_value(codec, buffer, values, error); +} + +static gboolean +firebase_database_message_codec_write_firebase_database_transaction_handler_result( + FlStandardMessageCodec* codec, GByteArray* buffer, + FirebaseDatabaseTransactionHandlerResult* value, GError** error) { + uint8_t type = firebase_database_transaction_handler_result_type_id; + g_byte_array_append(buffer, &type, sizeof(uint8_t)); + g_autoptr(FlValue) values = + firebase_database_transaction_handler_result_to_list(value); + return fl_standard_message_codec_write_value(codec, buffer, values, error); +} + +static gboolean firebase_database_message_codec_write_value( + FlStandardMessageCodec* codec, GByteArray* buffer, FlValue* value, + GError** error) { + if (fl_value_get_type(value) == FL_VALUE_TYPE_CUSTOM) { + switch (fl_value_get_custom_type(value)) { + case firebase_database_database_pigeon_settings_type_id: + return firebase_database_message_codec_write_firebase_database_database_pigeon_settings( + codec, buffer, + FIREBASE_DATABASE_DATABASE_PIGEON_SETTINGS( + fl_value_get_custom_value_object(value)), + error); + case firebase_database_database_pigeon_firebase_app_type_id: + return firebase_database_message_codec_write_firebase_database_database_pigeon_firebase_app( + codec, buffer, + FIREBASE_DATABASE_DATABASE_PIGEON_FIREBASE_APP( + fl_value_get_custom_value_object(value)), + error); + case firebase_database_database_reference_platform_type_id: + return firebase_database_message_codec_write_firebase_database_database_reference_platform( + codec, buffer, + FIREBASE_DATABASE_DATABASE_REFERENCE_PLATFORM( + fl_value_get_custom_value_object(value)), + error); + case firebase_database_database_reference_request_type_id: + return firebase_database_message_codec_write_firebase_database_database_reference_request( + codec, buffer, + FIREBASE_DATABASE_DATABASE_REFERENCE_REQUEST( + fl_value_get_custom_value_object(value)), + error); + case firebase_database_update_request_type_id: + return firebase_database_message_codec_write_firebase_database_update_request( + codec, buffer, + FIREBASE_DATABASE_UPDATE_REQUEST( + fl_value_get_custom_value_object(value)), + error); + case firebase_database_transaction_request_type_id: + return firebase_database_message_codec_write_firebase_database_transaction_request( + codec, buffer, + FIREBASE_DATABASE_TRANSACTION_REQUEST( + fl_value_get_custom_value_object(value)), + error); + case firebase_database_query_request_type_id: + return firebase_database_message_codec_write_firebase_database_query_request( + codec, buffer, + FIREBASE_DATABASE_QUERY_REQUEST( + fl_value_get_custom_value_object(value)), + error); + case firebase_database_transaction_handler_result_type_id: + return firebase_database_message_codec_write_firebase_database_transaction_handler_result( + codec, buffer, + FIREBASE_DATABASE_TRANSACTION_HANDLER_RESULT( + fl_value_get_custom_value_object(value)), + error); + } + } + + return FL_STANDARD_MESSAGE_CODEC_CLASS( + firebase_database_message_codec_parent_class) + ->write_value(codec, buffer, value, error); +} + +static FlValue* +firebase_database_message_codec_read_firebase_database_database_pigeon_settings( + FlStandardMessageCodec* codec, GBytes* buffer, size_t* offset, + GError** error) { + g_autoptr(FlValue) values = + fl_standard_message_codec_read_value(codec, buffer, offset, error); + if (values == nullptr) { + return nullptr; + } + + g_autoptr(FirebaseDatabaseDatabasePigeonSettings) value = + firebase_database_database_pigeon_settings_new_from_list(values); + if (value == nullptr) { + g_set_error(error, FL_MESSAGE_CODEC_ERROR, FL_MESSAGE_CODEC_ERROR_FAILED, + "Invalid data received for MessageData"); + return nullptr; + } + + return fl_value_new_custom_object( + firebase_database_database_pigeon_settings_type_id, G_OBJECT(value)); +} + +static FlValue* +firebase_database_message_codec_read_firebase_database_database_pigeon_firebase_app( + FlStandardMessageCodec* codec, GBytes* buffer, size_t* offset, + GError** error) { + g_autoptr(FlValue) values = + fl_standard_message_codec_read_value(codec, buffer, offset, error); + if (values == nullptr) { + return nullptr; + } + + g_autoptr(FirebaseDatabaseDatabasePigeonFirebaseApp) value = + firebase_database_database_pigeon_firebase_app_new_from_list(values); + if (value == nullptr) { + g_set_error(error, FL_MESSAGE_CODEC_ERROR, FL_MESSAGE_CODEC_ERROR_FAILED, + "Invalid data received for MessageData"); + return nullptr; + } + + return fl_value_new_custom_object( + firebase_database_database_pigeon_firebase_app_type_id, G_OBJECT(value)); +} + +static FlValue* +firebase_database_message_codec_read_firebase_database_database_reference_platform( + FlStandardMessageCodec* codec, GBytes* buffer, size_t* offset, + GError** error) { + g_autoptr(FlValue) values = + fl_standard_message_codec_read_value(codec, buffer, offset, error); + if (values == nullptr) { + return nullptr; + } + + g_autoptr(FirebaseDatabaseDatabaseReferencePlatform) value = + firebase_database_database_reference_platform_new_from_list(values); + if (value == nullptr) { + g_set_error(error, FL_MESSAGE_CODEC_ERROR, FL_MESSAGE_CODEC_ERROR_FAILED, + "Invalid data received for MessageData"); + return nullptr; + } + + return fl_value_new_custom_object( + firebase_database_database_reference_platform_type_id, G_OBJECT(value)); +} + +static FlValue* +firebase_database_message_codec_read_firebase_database_database_reference_request( + FlStandardMessageCodec* codec, GBytes* buffer, size_t* offset, + GError** error) { + g_autoptr(FlValue) values = + fl_standard_message_codec_read_value(codec, buffer, offset, error); + if (values == nullptr) { + return nullptr; + } + + g_autoptr(FirebaseDatabaseDatabaseReferenceRequest) value = + firebase_database_database_reference_request_new_from_list(values); + if (value == nullptr) { + g_set_error(error, FL_MESSAGE_CODEC_ERROR, FL_MESSAGE_CODEC_ERROR_FAILED, + "Invalid data received for MessageData"); + return nullptr; + } + + return fl_value_new_custom_object( + firebase_database_database_reference_request_type_id, G_OBJECT(value)); +} + +static FlValue* +firebase_database_message_codec_read_firebase_database_update_request( + FlStandardMessageCodec* codec, GBytes* buffer, size_t* offset, + GError** error) { + g_autoptr(FlValue) values = + fl_standard_message_codec_read_value(codec, buffer, offset, error); + if (values == nullptr) { + return nullptr; + } + + g_autoptr(FirebaseDatabaseUpdateRequest) value = + firebase_database_update_request_new_from_list(values); + if (value == nullptr) { + g_set_error(error, FL_MESSAGE_CODEC_ERROR, FL_MESSAGE_CODEC_ERROR_FAILED, + "Invalid data received for MessageData"); + return nullptr; + } + + return fl_value_new_custom_object(firebase_database_update_request_type_id, + G_OBJECT(value)); +} + +static FlValue* +firebase_database_message_codec_read_firebase_database_transaction_request( + FlStandardMessageCodec* codec, GBytes* buffer, size_t* offset, + GError** error) { + g_autoptr(FlValue) values = + fl_standard_message_codec_read_value(codec, buffer, offset, error); + if (values == nullptr) { + return nullptr; + } + + g_autoptr(FirebaseDatabaseTransactionRequest) value = + firebase_database_transaction_request_new_from_list(values); + if (value == nullptr) { + g_set_error(error, FL_MESSAGE_CODEC_ERROR, FL_MESSAGE_CODEC_ERROR_FAILED, + "Invalid data received for MessageData"); + return nullptr; + } + + return fl_value_new_custom_object( + firebase_database_transaction_request_type_id, G_OBJECT(value)); +} + +static FlValue* +firebase_database_message_codec_read_firebase_database_query_request( + FlStandardMessageCodec* codec, GBytes* buffer, size_t* offset, + GError** error) { + g_autoptr(FlValue) values = + fl_standard_message_codec_read_value(codec, buffer, offset, error); + if (values == nullptr) { + return nullptr; + } + + g_autoptr(FirebaseDatabaseQueryRequest) value = + firebase_database_query_request_new_from_list(values); + if (value == nullptr) { + g_set_error(error, FL_MESSAGE_CODEC_ERROR, FL_MESSAGE_CODEC_ERROR_FAILED, + "Invalid data received for MessageData"); + return nullptr; + } + + return fl_value_new_custom_object(firebase_database_query_request_type_id, + G_OBJECT(value)); +} + +static FlValue* +firebase_database_message_codec_read_firebase_database_transaction_handler_result( + FlStandardMessageCodec* codec, GBytes* buffer, size_t* offset, + GError** error) { + g_autoptr(FlValue) values = + fl_standard_message_codec_read_value(codec, buffer, offset, error); + if (values == nullptr) { + return nullptr; + } + + g_autoptr(FirebaseDatabaseTransactionHandlerResult) value = + firebase_database_transaction_handler_result_new_from_list(values); + if (value == nullptr) { + g_set_error(error, FL_MESSAGE_CODEC_ERROR, FL_MESSAGE_CODEC_ERROR_FAILED, + "Invalid data received for MessageData"); + return nullptr; + } + + return fl_value_new_custom_object( + firebase_database_transaction_handler_result_type_id, G_OBJECT(value)); +} + +static FlValue* firebase_database_message_codec_read_value_of_type( + FlStandardMessageCodec* codec, GBytes* buffer, size_t* offset, int type, + GError** error) { + switch (type) { + case firebase_database_database_pigeon_settings_type_id: + return firebase_database_message_codec_read_firebase_database_database_pigeon_settings( + codec, buffer, offset, error); + case firebase_database_database_pigeon_firebase_app_type_id: + return firebase_database_message_codec_read_firebase_database_database_pigeon_firebase_app( + codec, buffer, offset, error); + case firebase_database_database_reference_platform_type_id: + return firebase_database_message_codec_read_firebase_database_database_reference_platform( + codec, buffer, offset, error); + case firebase_database_database_reference_request_type_id: + return firebase_database_message_codec_read_firebase_database_database_reference_request( + codec, buffer, offset, error); + case firebase_database_update_request_type_id: + return firebase_database_message_codec_read_firebase_database_update_request( + codec, buffer, offset, error); + case firebase_database_transaction_request_type_id: + return firebase_database_message_codec_read_firebase_database_transaction_request( + codec, buffer, offset, error); + case firebase_database_query_request_type_id: + return firebase_database_message_codec_read_firebase_database_query_request( + codec, buffer, offset, error); + case firebase_database_transaction_handler_result_type_id: + return firebase_database_message_codec_read_firebase_database_transaction_handler_result( + codec, buffer, offset, error); + default: + return FL_STANDARD_MESSAGE_CODEC_CLASS( + firebase_database_message_codec_parent_class) + ->read_value_of_type(codec, buffer, offset, type, error); + } +} + +static void firebase_database_message_codec_init( + FirebaseDatabaseMessageCodec* self) {} + +static void firebase_database_message_codec_class_init( + FirebaseDatabaseMessageCodecClass* klass) { + FL_STANDARD_MESSAGE_CODEC_CLASS(klass)->write_value = + firebase_database_message_codec_write_value; + FL_STANDARD_MESSAGE_CODEC_CLASS(klass)->read_value_of_type = + firebase_database_message_codec_read_value_of_type; +} + +static FirebaseDatabaseMessageCodec* firebase_database_message_codec_new() { + FirebaseDatabaseMessageCodec* self = FIREBASE_DATABASE_MESSAGE_CODEC( + g_object_new(firebase_database_message_codec_get_type(), nullptr)); + return self; +} + +struct _FirebaseDatabaseFirebaseDatabaseHostApiResponseHandle { + GObject parent_instance; + + FlBasicMessageChannel* channel; + FlBasicMessageChannelResponseHandle* response_handle; +}; + +G_DEFINE_TYPE(FirebaseDatabaseFirebaseDatabaseHostApiResponseHandle, + firebase_database_firebase_database_host_api_response_handle, + G_TYPE_OBJECT) + +static void +firebase_database_firebase_database_host_api_response_handle_dispose( + GObject* object) { + FirebaseDatabaseFirebaseDatabaseHostApiResponseHandle* self = + FIREBASE_DATABASE_FIREBASE_DATABASE_HOST_API_RESPONSE_HANDLE(object); + g_clear_object(&self->channel); + g_clear_object(&self->response_handle); + G_OBJECT_CLASS( + firebase_database_firebase_database_host_api_response_handle_parent_class) + ->dispose(object); +} + +static void firebase_database_firebase_database_host_api_response_handle_init( + FirebaseDatabaseFirebaseDatabaseHostApiResponseHandle* self) {} + +static void +firebase_database_firebase_database_host_api_response_handle_class_init( + FirebaseDatabaseFirebaseDatabaseHostApiResponseHandleClass* klass) { + G_OBJECT_CLASS(klass)->dispose = + firebase_database_firebase_database_host_api_response_handle_dispose; +} + +static FirebaseDatabaseFirebaseDatabaseHostApiResponseHandle* +firebase_database_firebase_database_host_api_response_handle_new( + FlBasicMessageChannel* channel, + FlBasicMessageChannelResponseHandle* response_handle) { + FirebaseDatabaseFirebaseDatabaseHostApiResponseHandle* self = + FIREBASE_DATABASE_FIREBASE_DATABASE_HOST_API_RESPONSE_HANDLE(g_object_new( + firebase_database_firebase_database_host_api_response_handle_get_type(), + nullptr)); + self->channel = FL_BASIC_MESSAGE_CHANNEL(g_object_ref(channel)); + self->response_handle = + FL_BASIC_MESSAGE_CHANNEL_RESPONSE_HANDLE(g_object_ref(response_handle)); + return self; +} + +G_DECLARE_FINAL_TYPE( + FirebaseDatabaseFirebaseDatabaseHostApiGoOnlineResponse, + firebase_database_firebase_database_host_api_go_online_response, + FIREBASE_DATABASE, FIREBASE_DATABASE_HOST_API_GO_ONLINE_RESPONSE, GObject) + +struct _FirebaseDatabaseFirebaseDatabaseHostApiGoOnlineResponse { + GObject parent_instance; + + FlValue* value; +}; + +G_DEFINE_TYPE(FirebaseDatabaseFirebaseDatabaseHostApiGoOnlineResponse, + firebase_database_firebase_database_host_api_go_online_response, + G_TYPE_OBJECT) + +static void +firebase_database_firebase_database_host_api_go_online_response_dispose( + GObject* object) { + FirebaseDatabaseFirebaseDatabaseHostApiGoOnlineResponse* self = + FIREBASE_DATABASE_FIREBASE_DATABASE_HOST_API_GO_ONLINE_RESPONSE(object); + g_clear_pointer(&self->value, fl_value_unref); + G_OBJECT_CLASS( + firebase_database_firebase_database_host_api_go_online_response_parent_class) + ->dispose(object); +} + +static void +firebase_database_firebase_database_host_api_go_online_response_init( + FirebaseDatabaseFirebaseDatabaseHostApiGoOnlineResponse* self) {} + +static void +firebase_database_firebase_database_host_api_go_online_response_class_init( + FirebaseDatabaseFirebaseDatabaseHostApiGoOnlineResponseClass* klass) { + G_OBJECT_CLASS(klass)->dispose = + firebase_database_firebase_database_host_api_go_online_response_dispose; +} + +static FirebaseDatabaseFirebaseDatabaseHostApiGoOnlineResponse* +firebase_database_firebase_database_host_api_go_online_response_new() { + FirebaseDatabaseFirebaseDatabaseHostApiGoOnlineResponse* self = + FIREBASE_DATABASE_FIREBASE_DATABASE_HOST_API_GO_ONLINE_RESPONSE(g_object_new( + firebase_database_firebase_database_host_api_go_online_response_get_type(), + nullptr)); + self->value = fl_value_new_list(); + fl_value_append_take(self->value, fl_value_new_null()); + return self; +} + +static FirebaseDatabaseFirebaseDatabaseHostApiGoOnlineResponse* +firebase_database_firebase_database_host_api_go_online_response_new_error( + const gchar* code, const gchar* message, FlValue* details) { + FirebaseDatabaseFirebaseDatabaseHostApiGoOnlineResponse* self = + FIREBASE_DATABASE_FIREBASE_DATABASE_HOST_API_GO_ONLINE_RESPONSE(g_object_new( + firebase_database_firebase_database_host_api_go_online_response_get_type(), + nullptr)); + self->value = fl_value_new_list(); + fl_value_append_take(self->value, fl_value_new_string(code)); + fl_value_append_take(self->value, + fl_value_new_string(message != nullptr ? message : "")); + fl_value_append_take(self->value, details != nullptr ? fl_value_ref(details) + : fl_value_new_null()); + return self; +} + +G_DECLARE_FINAL_TYPE( + FirebaseDatabaseFirebaseDatabaseHostApiGoOfflineResponse, + firebase_database_firebase_database_host_api_go_offline_response, + FIREBASE_DATABASE, FIREBASE_DATABASE_HOST_API_GO_OFFLINE_RESPONSE, GObject) + +struct _FirebaseDatabaseFirebaseDatabaseHostApiGoOfflineResponse { + GObject parent_instance; + + FlValue* value; +}; + +G_DEFINE_TYPE(FirebaseDatabaseFirebaseDatabaseHostApiGoOfflineResponse, + firebase_database_firebase_database_host_api_go_offline_response, + G_TYPE_OBJECT) + +static void +firebase_database_firebase_database_host_api_go_offline_response_dispose( + GObject* object) { + FirebaseDatabaseFirebaseDatabaseHostApiGoOfflineResponse* self = + FIREBASE_DATABASE_FIREBASE_DATABASE_HOST_API_GO_OFFLINE_RESPONSE(object); + g_clear_pointer(&self->value, fl_value_unref); + G_OBJECT_CLASS( + firebase_database_firebase_database_host_api_go_offline_response_parent_class) + ->dispose(object); +} + +static void +firebase_database_firebase_database_host_api_go_offline_response_init( + FirebaseDatabaseFirebaseDatabaseHostApiGoOfflineResponse* self) {} + +static void +firebase_database_firebase_database_host_api_go_offline_response_class_init( + FirebaseDatabaseFirebaseDatabaseHostApiGoOfflineResponseClass* klass) { + G_OBJECT_CLASS(klass)->dispose = + firebase_database_firebase_database_host_api_go_offline_response_dispose; +} + +static FirebaseDatabaseFirebaseDatabaseHostApiGoOfflineResponse* +firebase_database_firebase_database_host_api_go_offline_response_new() { + FirebaseDatabaseFirebaseDatabaseHostApiGoOfflineResponse* self = + FIREBASE_DATABASE_FIREBASE_DATABASE_HOST_API_GO_OFFLINE_RESPONSE(g_object_new( + firebase_database_firebase_database_host_api_go_offline_response_get_type(), + nullptr)); + self->value = fl_value_new_list(); + fl_value_append_take(self->value, fl_value_new_null()); + return self; +} + +static FirebaseDatabaseFirebaseDatabaseHostApiGoOfflineResponse* +firebase_database_firebase_database_host_api_go_offline_response_new_error( + const gchar* code, const gchar* message, FlValue* details) { + FirebaseDatabaseFirebaseDatabaseHostApiGoOfflineResponse* self = + FIREBASE_DATABASE_FIREBASE_DATABASE_HOST_API_GO_OFFLINE_RESPONSE(g_object_new( + firebase_database_firebase_database_host_api_go_offline_response_get_type(), + nullptr)); + self->value = fl_value_new_list(); + fl_value_append_take(self->value, fl_value_new_string(code)); + fl_value_append_take(self->value, + fl_value_new_string(message != nullptr ? message : "")); + fl_value_append_take(self->value, details != nullptr ? fl_value_ref(details) + : fl_value_new_null()); + return self; +} + +G_DECLARE_FINAL_TYPE( + FirebaseDatabaseFirebaseDatabaseHostApiSetPersistenceEnabledResponse, + firebase_database_firebase_database_host_api_set_persistence_enabled_response, + FIREBASE_DATABASE, + FIREBASE_DATABASE_HOST_API_SET_PERSISTENCE_ENABLED_RESPONSE, GObject) + +struct _FirebaseDatabaseFirebaseDatabaseHostApiSetPersistenceEnabledResponse { + GObject parent_instance; + + FlValue* value; +}; + +G_DEFINE_TYPE( + FirebaseDatabaseFirebaseDatabaseHostApiSetPersistenceEnabledResponse, + firebase_database_firebase_database_host_api_set_persistence_enabled_response, + G_TYPE_OBJECT) + +static void +firebase_database_firebase_database_host_api_set_persistence_enabled_response_dispose( + GObject* object) { + FirebaseDatabaseFirebaseDatabaseHostApiSetPersistenceEnabledResponse* self = + FIREBASE_DATABASE_FIREBASE_DATABASE_HOST_API_SET_PERSISTENCE_ENABLED_RESPONSE( + object); + g_clear_pointer(&self->value, fl_value_unref); + G_OBJECT_CLASS( + firebase_database_firebase_database_host_api_set_persistence_enabled_response_parent_class) + ->dispose(object); +} + +static void +firebase_database_firebase_database_host_api_set_persistence_enabled_response_init( + FirebaseDatabaseFirebaseDatabaseHostApiSetPersistenceEnabledResponse* + self) {} + +static void +firebase_database_firebase_database_host_api_set_persistence_enabled_response_class_init( + FirebaseDatabaseFirebaseDatabaseHostApiSetPersistenceEnabledResponseClass* + klass) { + G_OBJECT_CLASS(klass)->dispose = + firebase_database_firebase_database_host_api_set_persistence_enabled_response_dispose; +} + +static FirebaseDatabaseFirebaseDatabaseHostApiSetPersistenceEnabledResponse* +firebase_database_firebase_database_host_api_set_persistence_enabled_response_new() { + FirebaseDatabaseFirebaseDatabaseHostApiSetPersistenceEnabledResponse* self = + FIREBASE_DATABASE_FIREBASE_DATABASE_HOST_API_SET_PERSISTENCE_ENABLED_RESPONSE( + g_object_new( + firebase_database_firebase_database_host_api_set_persistence_enabled_response_get_type(), + nullptr)); + self->value = fl_value_new_list(); + fl_value_append_take(self->value, fl_value_new_null()); + return self; +} + +static FirebaseDatabaseFirebaseDatabaseHostApiSetPersistenceEnabledResponse* +firebase_database_firebase_database_host_api_set_persistence_enabled_response_new_error( + const gchar* code, const gchar* message, FlValue* details) { + FirebaseDatabaseFirebaseDatabaseHostApiSetPersistenceEnabledResponse* self = + FIREBASE_DATABASE_FIREBASE_DATABASE_HOST_API_SET_PERSISTENCE_ENABLED_RESPONSE( + g_object_new( + firebase_database_firebase_database_host_api_set_persistence_enabled_response_get_type(), + nullptr)); + self->value = fl_value_new_list(); + fl_value_append_take(self->value, fl_value_new_string(code)); + fl_value_append_take(self->value, + fl_value_new_string(message != nullptr ? message : "")); + fl_value_append_take(self->value, details != nullptr ? fl_value_ref(details) + : fl_value_new_null()); + return self; +} + +G_DECLARE_FINAL_TYPE( + FirebaseDatabaseFirebaseDatabaseHostApiSetPersistenceCacheSizeBytesResponse, + firebase_database_firebase_database_host_api_set_persistence_cache_size_bytes_response, + FIREBASE_DATABASE, + FIREBASE_DATABASE_HOST_API_SET_PERSISTENCE_CACHE_SIZE_BYTES_RESPONSE, + GObject) + +struct + _FirebaseDatabaseFirebaseDatabaseHostApiSetPersistenceCacheSizeBytesResponse { + GObject parent_instance; + + FlValue* value; +}; + +G_DEFINE_TYPE( + FirebaseDatabaseFirebaseDatabaseHostApiSetPersistenceCacheSizeBytesResponse, + firebase_database_firebase_database_host_api_set_persistence_cache_size_bytes_response, + G_TYPE_OBJECT) + +static void +firebase_database_firebase_database_host_api_set_persistence_cache_size_bytes_response_dispose( + GObject* object) { + FirebaseDatabaseFirebaseDatabaseHostApiSetPersistenceCacheSizeBytesResponse* self = + FIREBASE_DATABASE_FIREBASE_DATABASE_HOST_API_SET_PERSISTENCE_CACHE_SIZE_BYTES_RESPONSE( + object); + g_clear_pointer(&self->value, fl_value_unref); + G_OBJECT_CLASS( + firebase_database_firebase_database_host_api_set_persistence_cache_size_bytes_response_parent_class) + ->dispose(object); +} + +static void +firebase_database_firebase_database_host_api_set_persistence_cache_size_bytes_response_init( + FirebaseDatabaseFirebaseDatabaseHostApiSetPersistenceCacheSizeBytesResponse* + self) {} + +static void +firebase_database_firebase_database_host_api_set_persistence_cache_size_bytes_response_class_init( + FirebaseDatabaseFirebaseDatabaseHostApiSetPersistenceCacheSizeBytesResponseClass* + klass) { + G_OBJECT_CLASS(klass)->dispose = + firebase_database_firebase_database_host_api_set_persistence_cache_size_bytes_response_dispose; +} + +static FirebaseDatabaseFirebaseDatabaseHostApiSetPersistenceCacheSizeBytesResponse* +firebase_database_firebase_database_host_api_set_persistence_cache_size_bytes_response_new() { + FirebaseDatabaseFirebaseDatabaseHostApiSetPersistenceCacheSizeBytesResponse* self = + FIREBASE_DATABASE_FIREBASE_DATABASE_HOST_API_SET_PERSISTENCE_CACHE_SIZE_BYTES_RESPONSE( + g_object_new( + firebase_database_firebase_database_host_api_set_persistence_cache_size_bytes_response_get_type(), + nullptr)); + self->value = fl_value_new_list(); + fl_value_append_take(self->value, fl_value_new_null()); + return self; +} + +static FirebaseDatabaseFirebaseDatabaseHostApiSetPersistenceCacheSizeBytesResponse* +firebase_database_firebase_database_host_api_set_persistence_cache_size_bytes_response_new_error( + const gchar* code, const gchar* message, FlValue* details) { + FirebaseDatabaseFirebaseDatabaseHostApiSetPersistenceCacheSizeBytesResponse* self = + FIREBASE_DATABASE_FIREBASE_DATABASE_HOST_API_SET_PERSISTENCE_CACHE_SIZE_BYTES_RESPONSE( + g_object_new( + firebase_database_firebase_database_host_api_set_persistence_cache_size_bytes_response_get_type(), + nullptr)); + self->value = fl_value_new_list(); + fl_value_append_take(self->value, fl_value_new_string(code)); + fl_value_append_take(self->value, + fl_value_new_string(message != nullptr ? message : "")); + fl_value_append_take(self->value, details != nullptr ? fl_value_ref(details) + : fl_value_new_null()); + return self; +} + +G_DECLARE_FINAL_TYPE( + FirebaseDatabaseFirebaseDatabaseHostApiSetLoggingEnabledResponse, + firebase_database_firebase_database_host_api_set_logging_enabled_response, + FIREBASE_DATABASE, FIREBASE_DATABASE_HOST_API_SET_LOGGING_ENABLED_RESPONSE, + GObject) + +struct _FirebaseDatabaseFirebaseDatabaseHostApiSetLoggingEnabledResponse { + GObject parent_instance; + + FlValue* value; +}; + +G_DEFINE_TYPE( + FirebaseDatabaseFirebaseDatabaseHostApiSetLoggingEnabledResponse, + firebase_database_firebase_database_host_api_set_logging_enabled_response, + G_TYPE_OBJECT) + +static void +firebase_database_firebase_database_host_api_set_logging_enabled_response_dispose( + GObject* object) { + FirebaseDatabaseFirebaseDatabaseHostApiSetLoggingEnabledResponse* self = + FIREBASE_DATABASE_FIREBASE_DATABASE_HOST_API_SET_LOGGING_ENABLED_RESPONSE( + object); + g_clear_pointer(&self->value, fl_value_unref); + G_OBJECT_CLASS( + firebase_database_firebase_database_host_api_set_logging_enabled_response_parent_class) + ->dispose(object); +} + +static void +firebase_database_firebase_database_host_api_set_logging_enabled_response_init( + FirebaseDatabaseFirebaseDatabaseHostApiSetLoggingEnabledResponse* self) {} + +static void +firebase_database_firebase_database_host_api_set_logging_enabled_response_class_init( + FirebaseDatabaseFirebaseDatabaseHostApiSetLoggingEnabledResponseClass* + klass) { + G_OBJECT_CLASS(klass)->dispose = + firebase_database_firebase_database_host_api_set_logging_enabled_response_dispose; +} + +static FirebaseDatabaseFirebaseDatabaseHostApiSetLoggingEnabledResponse* +firebase_database_firebase_database_host_api_set_logging_enabled_response_new() { + FirebaseDatabaseFirebaseDatabaseHostApiSetLoggingEnabledResponse* self = + FIREBASE_DATABASE_FIREBASE_DATABASE_HOST_API_SET_LOGGING_ENABLED_RESPONSE( + g_object_new( + firebase_database_firebase_database_host_api_set_logging_enabled_response_get_type(), + nullptr)); + self->value = fl_value_new_list(); + fl_value_append_take(self->value, fl_value_new_null()); + return self; +} + +static FirebaseDatabaseFirebaseDatabaseHostApiSetLoggingEnabledResponse* +firebase_database_firebase_database_host_api_set_logging_enabled_response_new_error( + const gchar* code, const gchar* message, FlValue* details) { + FirebaseDatabaseFirebaseDatabaseHostApiSetLoggingEnabledResponse* self = + FIREBASE_DATABASE_FIREBASE_DATABASE_HOST_API_SET_LOGGING_ENABLED_RESPONSE( + g_object_new( + firebase_database_firebase_database_host_api_set_logging_enabled_response_get_type(), + nullptr)); + self->value = fl_value_new_list(); + fl_value_append_take(self->value, fl_value_new_string(code)); + fl_value_append_take(self->value, + fl_value_new_string(message != nullptr ? message : "")); + fl_value_append_take(self->value, details != nullptr ? fl_value_ref(details) + : fl_value_new_null()); + return self; +} + +G_DECLARE_FINAL_TYPE( + FirebaseDatabaseFirebaseDatabaseHostApiUseDatabaseEmulatorResponse, + firebase_database_firebase_database_host_api_use_database_emulator_response, + FIREBASE_DATABASE, + FIREBASE_DATABASE_HOST_API_USE_DATABASE_EMULATOR_RESPONSE, GObject) + +struct _FirebaseDatabaseFirebaseDatabaseHostApiUseDatabaseEmulatorResponse { + GObject parent_instance; + + FlValue* value; +}; + +G_DEFINE_TYPE( + FirebaseDatabaseFirebaseDatabaseHostApiUseDatabaseEmulatorResponse, + firebase_database_firebase_database_host_api_use_database_emulator_response, + G_TYPE_OBJECT) + +static void +firebase_database_firebase_database_host_api_use_database_emulator_response_dispose( + GObject* object) { + FirebaseDatabaseFirebaseDatabaseHostApiUseDatabaseEmulatorResponse* self = + FIREBASE_DATABASE_FIREBASE_DATABASE_HOST_API_USE_DATABASE_EMULATOR_RESPONSE( + object); + g_clear_pointer(&self->value, fl_value_unref); + G_OBJECT_CLASS( + firebase_database_firebase_database_host_api_use_database_emulator_response_parent_class) + ->dispose(object); +} + +static void +firebase_database_firebase_database_host_api_use_database_emulator_response_init( + FirebaseDatabaseFirebaseDatabaseHostApiUseDatabaseEmulatorResponse* self) {} + +static void +firebase_database_firebase_database_host_api_use_database_emulator_response_class_init( + FirebaseDatabaseFirebaseDatabaseHostApiUseDatabaseEmulatorResponseClass* + klass) { + G_OBJECT_CLASS(klass)->dispose = + firebase_database_firebase_database_host_api_use_database_emulator_response_dispose; +} + +static FirebaseDatabaseFirebaseDatabaseHostApiUseDatabaseEmulatorResponse* +firebase_database_firebase_database_host_api_use_database_emulator_response_new() { + FirebaseDatabaseFirebaseDatabaseHostApiUseDatabaseEmulatorResponse* self = + FIREBASE_DATABASE_FIREBASE_DATABASE_HOST_API_USE_DATABASE_EMULATOR_RESPONSE( + g_object_new( + firebase_database_firebase_database_host_api_use_database_emulator_response_get_type(), + nullptr)); + self->value = fl_value_new_list(); + fl_value_append_take(self->value, fl_value_new_null()); + return self; +} + +static FirebaseDatabaseFirebaseDatabaseHostApiUseDatabaseEmulatorResponse* +firebase_database_firebase_database_host_api_use_database_emulator_response_new_error( + const gchar* code, const gchar* message, FlValue* details) { + FirebaseDatabaseFirebaseDatabaseHostApiUseDatabaseEmulatorResponse* self = + FIREBASE_DATABASE_FIREBASE_DATABASE_HOST_API_USE_DATABASE_EMULATOR_RESPONSE( + g_object_new( + firebase_database_firebase_database_host_api_use_database_emulator_response_get_type(), + nullptr)); + self->value = fl_value_new_list(); + fl_value_append_take(self->value, fl_value_new_string(code)); + fl_value_append_take(self->value, + fl_value_new_string(message != nullptr ? message : "")); + fl_value_append_take(self->value, details != nullptr ? fl_value_ref(details) + : fl_value_new_null()); + return self; +} + +G_DECLARE_FINAL_TYPE(FirebaseDatabaseFirebaseDatabaseHostApiRefResponse, + firebase_database_firebase_database_host_api_ref_response, + FIREBASE_DATABASE, FIREBASE_DATABASE_HOST_API_REF_RESPONSE, + GObject) + +struct _FirebaseDatabaseFirebaseDatabaseHostApiRefResponse { + GObject parent_instance; + + FlValue* value; +}; + +G_DEFINE_TYPE(FirebaseDatabaseFirebaseDatabaseHostApiRefResponse, + firebase_database_firebase_database_host_api_ref_response, + G_TYPE_OBJECT) + +static void firebase_database_firebase_database_host_api_ref_response_dispose( + GObject* object) { + FirebaseDatabaseFirebaseDatabaseHostApiRefResponse* self = + FIREBASE_DATABASE_FIREBASE_DATABASE_HOST_API_REF_RESPONSE(object); + g_clear_pointer(&self->value, fl_value_unref); + G_OBJECT_CLASS( + firebase_database_firebase_database_host_api_ref_response_parent_class) + ->dispose(object); +} + +static void firebase_database_firebase_database_host_api_ref_response_init( + FirebaseDatabaseFirebaseDatabaseHostApiRefResponse* self) {} + +static void +firebase_database_firebase_database_host_api_ref_response_class_init( + FirebaseDatabaseFirebaseDatabaseHostApiRefResponseClass* klass) { + G_OBJECT_CLASS(klass)->dispose = + firebase_database_firebase_database_host_api_ref_response_dispose; +} + +static FirebaseDatabaseFirebaseDatabaseHostApiRefResponse* +firebase_database_firebase_database_host_api_ref_response_new( + FirebaseDatabaseDatabaseReferencePlatform* return_value) { + FirebaseDatabaseFirebaseDatabaseHostApiRefResponse* self = + FIREBASE_DATABASE_FIREBASE_DATABASE_HOST_API_REF_RESPONSE(g_object_new( + firebase_database_firebase_database_host_api_ref_response_get_type(), + nullptr)); + self->value = fl_value_new_list(); + fl_value_append_take( + self->value, fl_value_new_custom_object( + firebase_database_database_reference_platform_type_id, + G_OBJECT(return_value))); + return self; +} + +static FirebaseDatabaseFirebaseDatabaseHostApiRefResponse* +firebase_database_firebase_database_host_api_ref_response_new_error( + const gchar* code, const gchar* message, FlValue* details) { + FirebaseDatabaseFirebaseDatabaseHostApiRefResponse* self = + FIREBASE_DATABASE_FIREBASE_DATABASE_HOST_API_REF_RESPONSE(g_object_new( + firebase_database_firebase_database_host_api_ref_response_get_type(), + nullptr)); + self->value = fl_value_new_list(); + fl_value_append_take(self->value, fl_value_new_string(code)); + fl_value_append_take(self->value, + fl_value_new_string(message != nullptr ? message : "")); + fl_value_append_take(self->value, details != nullptr ? fl_value_ref(details) + : fl_value_new_null()); + return self; +} + +G_DECLARE_FINAL_TYPE( + FirebaseDatabaseFirebaseDatabaseHostApiRefFromURLResponse, + firebase_database_firebase_database_host_api_ref_from_u_r_l_response, + FIREBASE_DATABASE, FIREBASE_DATABASE_HOST_API_REF_FROM_U_R_L_RESPONSE, + GObject) + +struct _FirebaseDatabaseFirebaseDatabaseHostApiRefFromURLResponse { + GObject parent_instance; + + FlValue* value; +}; + +G_DEFINE_TYPE( + FirebaseDatabaseFirebaseDatabaseHostApiRefFromURLResponse, + firebase_database_firebase_database_host_api_ref_from_u_r_l_response, + G_TYPE_OBJECT) + +static void +firebase_database_firebase_database_host_api_ref_from_u_r_l_response_dispose( + GObject* object) { + FirebaseDatabaseFirebaseDatabaseHostApiRefFromURLResponse* self = + FIREBASE_DATABASE_FIREBASE_DATABASE_HOST_API_REF_FROM_U_R_L_RESPONSE( + object); + g_clear_pointer(&self->value, fl_value_unref); + G_OBJECT_CLASS( + firebase_database_firebase_database_host_api_ref_from_u_r_l_response_parent_class) + ->dispose(object); +} + +static void +firebase_database_firebase_database_host_api_ref_from_u_r_l_response_init( + FirebaseDatabaseFirebaseDatabaseHostApiRefFromURLResponse* self) {} + +static void +firebase_database_firebase_database_host_api_ref_from_u_r_l_response_class_init( + FirebaseDatabaseFirebaseDatabaseHostApiRefFromURLResponseClass* klass) { + G_OBJECT_CLASS(klass)->dispose = + firebase_database_firebase_database_host_api_ref_from_u_r_l_response_dispose; +} + +static FirebaseDatabaseFirebaseDatabaseHostApiRefFromURLResponse* +firebase_database_firebase_database_host_api_ref_from_u_r_l_response_new( + FirebaseDatabaseDatabaseReferencePlatform* return_value) { + FirebaseDatabaseFirebaseDatabaseHostApiRefFromURLResponse* self = + FIREBASE_DATABASE_FIREBASE_DATABASE_HOST_API_REF_FROM_U_R_L_RESPONSE(g_object_new( + firebase_database_firebase_database_host_api_ref_from_u_r_l_response_get_type(), + nullptr)); + self->value = fl_value_new_list(); + fl_value_append_take( + self->value, fl_value_new_custom_object( + firebase_database_database_reference_platform_type_id, + G_OBJECT(return_value))); + return self; +} + +static FirebaseDatabaseFirebaseDatabaseHostApiRefFromURLResponse* +firebase_database_firebase_database_host_api_ref_from_u_r_l_response_new_error( + const gchar* code, const gchar* message, FlValue* details) { + FirebaseDatabaseFirebaseDatabaseHostApiRefFromURLResponse* self = + FIREBASE_DATABASE_FIREBASE_DATABASE_HOST_API_REF_FROM_U_R_L_RESPONSE(g_object_new( + firebase_database_firebase_database_host_api_ref_from_u_r_l_response_get_type(), + nullptr)); + self->value = fl_value_new_list(); + fl_value_append_take(self->value, fl_value_new_string(code)); + fl_value_append_take(self->value, + fl_value_new_string(message != nullptr ? message : "")); + fl_value_append_take(self->value, details != nullptr ? fl_value_ref(details) + : fl_value_new_null()); + return self; +} + +G_DECLARE_FINAL_TYPE( + FirebaseDatabaseFirebaseDatabaseHostApiPurgeOutstandingWritesResponse, + firebase_database_firebase_database_host_api_purge_outstanding_writes_response, + FIREBASE_DATABASE, + FIREBASE_DATABASE_HOST_API_PURGE_OUTSTANDING_WRITES_RESPONSE, GObject) + +struct _FirebaseDatabaseFirebaseDatabaseHostApiPurgeOutstandingWritesResponse { + GObject parent_instance; + + FlValue* value; +}; + +G_DEFINE_TYPE( + FirebaseDatabaseFirebaseDatabaseHostApiPurgeOutstandingWritesResponse, + firebase_database_firebase_database_host_api_purge_outstanding_writes_response, + G_TYPE_OBJECT) + +static void +firebase_database_firebase_database_host_api_purge_outstanding_writes_response_dispose( + GObject* object) { + FirebaseDatabaseFirebaseDatabaseHostApiPurgeOutstandingWritesResponse* self = + FIREBASE_DATABASE_FIREBASE_DATABASE_HOST_API_PURGE_OUTSTANDING_WRITES_RESPONSE( + object); + g_clear_pointer(&self->value, fl_value_unref); + G_OBJECT_CLASS( + firebase_database_firebase_database_host_api_purge_outstanding_writes_response_parent_class) + ->dispose(object); +} + +static void +firebase_database_firebase_database_host_api_purge_outstanding_writes_response_init( + FirebaseDatabaseFirebaseDatabaseHostApiPurgeOutstandingWritesResponse* + self) {} + +static void +firebase_database_firebase_database_host_api_purge_outstanding_writes_response_class_init( + FirebaseDatabaseFirebaseDatabaseHostApiPurgeOutstandingWritesResponseClass* + klass) { + G_OBJECT_CLASS(klass)->dispose = + firebase_database_firebase_database_host_api_purge_outstanding_writes_response_dispose; +} + +static FirebaseDatabaseFirebaseDatabaseHostApiPurgeOutstandingWritesResponse* +firebase_database_firebase_database_host_api_purge_outstanding_writes_response_new() { + FirebaseDatabaseFirebaseDatabaseHostApiPurgeOutstandingWritesResponse* self = + FIREBASE_DATABASE_FIREBASE_DATABASE_HOST_API_PURGE_OUTSTANDING_WRITES_RESPONSE( + g_object_new( + firebase_database_firebase_database_host_api_purge_outstanding_writes_response_get_type(), + nullptr)); + self->value = fl_value_new_list(); + fl_value_append_take(self->value, fl_value_new_null()); + return self; +} + +static FirebaseDatabaseFirebaseDatabaseHostApiPurgeOutstandingWritesResponse* +firebase_database_firebase_database_host_api_purge_outstanding_writes_response_new_error( + const gchar* code, const gchar* message, FlValue* details) { + FirebaseDatabaseFirebaseDatabaseHostApiPurgeOutstandingWritesResponse* self = + FIREBASE_DATABASE_FIREBASE_DATABASE_HOST_API_PURGE_OUTSTANDING_WRITES_RESPONSE( + g_object_new( + firebase_database_firebase_database_host_api_purge_outstanding_writes_response_get_type(), + nullptr)); + self->value = fl_value_new_list(); + fl_value_append_take(self->value, fl_value_new_string(code)); + fl_value_append_take(self->value, + fl_value_new_string(message != nullptr ? message : "")); + fl_value_append_take(self->value, details != nullptr ? fl_value_ref(details) + : fl_value_new_null()); + return self; +} + +G_DECLARE_FINAL_TYPE( + FirebaseDatabaseFirebaseDatabaseHostApiDatabaseReferenceSetResponse, + firebase_database_firebase_database_host_api_database_reference_set_response, + FIREBASE_DATABASE, + FIREBASE_DATABASE_HOST_API_DATABASE_REFERENCE_SET_RESPONSE, GObject) + +struct _FirebaseDatabaseFirebaseDatabaseHostApiDatabaseReferenceSetResponse { + GObject parent_instance; + + FlValue* value; +}; + +G_DEFINE_TYPE( + FirebaseDatabaseFirebaseDatabaseHostApiDatabaseReferenceSetResponse, + firebase_database_firebase_database_host_api_database_reference_set_response, + G_TYPE_OBJECT) + +static void +firebase_database_firebase_database_host_api_database_reference_set_response_dispose( + GObject* object) { + FirebaseDatabaseFirebaseDatabaseHostApiDatabaseReferenceSetResponse* self = + FIREBASE_DATABASE_FIREBASE_DATABASE_HOST_API_DATABASE_REFERENCE_SET_RESPONSE( + object); + g_clear_pointer(&self->value, fl_value_unref); + G_OBJECT_CLASS( + firebase_database_firebase_database_host_api_database_reference_set_response_parent_class) + ->dispose(object); +} + +static void +firebase_database_firebase_database_host_api_database_reference_set_response_init( + FirebaseDatabaseFirebaseDatabaseHostApiDatabaseReferenceSetResponse* self) { +} + +static void +firebase_database_firebase_database_host_api_database_reference_set_response_class_init( + FirebaseDatabaseFirebaseDatabaseHostApiDatabaseReferenceSetResponseClass* + klass) { + G_OBJECT_CLASS(klass)->dispose = + firebase_database_firebase_database_host_api_database_reference_set_response_dispose; +} + +static FirebaseDatabaseFirebaseDatabaseHostApiDatabaseReferenceSetResponse* +firebase_database_firebase_database_host_api_database_reference_set_response_new() { + FirebaseDatabaseFirebaseDatabaseHostApiDatabaseReferenceSetResponse* self = + FIREBASE_DATABASE_FIREBASE_DATABASE_HOST_API_DATABASE_REFERENCE_SET_RESPONSE( + g_object_new( + firebase_database_firebase_database_host_api_database_reference_set_response_get_type(), + nullptr)); + self->value = fl_value_new_list(); + fl_value_append_take(self->value, fl_value_new_null()); + return self; +} + +static FirebaseDatabaseFirebaseDatabaseHostApiDatabaseReferenceSetResponse* +firebase_database_firebase_database_host_api_database_reference_set_response_new_error( + const gchar* code, const gchar* message, FlValue* details) { + FirebaseDatabaseFirebaseDatabaseHostApiDatabaseReferenceSetResponse* self = + FIREBASE_DATABASE_FIREBASE_DATABASE_HOST_API_DATABASE_REFERENCE_SET_RESPONSE( + g_object_new( + firebase_database_firebase_database_host_api_database_reference_set_response_get_type(), + nullptr)); + self->value = fl_value_new_list(); + fl_value_append_take(self->value, fl_value_new_string(code)); + fl_value_append_take(self->value, + fl_value_new_string(message != nullptr ? message : "")); + fl_value_append_take(self->value, details != nullptr ? fl_value_ref(details) + : fl_value_new_null()); + return self; +} + +G_DECLARE_FINAL_TYPE( + FirebaseDatabaseFirebaseDatabaseHostApiDatabaseReferenceSetWithPriorityResponse, + firebase_database_firebase_database_host_api_database_reference_set_with_priority_response, + FIREBASE_DATABASE, + FIREBASE_DATABASE_HOST_API_DATABASE_REFERENCE_SET_WITH_PRIORITY_RESPONSE, + GObject) + +struct + _FirebaseDatabaseFirebaseDatabaseHostApiDatabaseReferenceSetWithPriorityResponse { + GObject parent_instance; + + FlValue* value; +}; + +G_DEFINE_TYPE( + FirebaseDatabaseFirebaseDatabaseHostApiDatabaseReferenceSetWithPriorityResponse, + firebase_database_firebase_database_host_api_database_reference_set_with_priority_response, + G_TYPE_OBJECT) + +static void +firebase_database_firebase_database_host_api_database_reference_set_with_priority_response_dispose( + GObject* object) { + FirebaseDatabaseFirebaseDatabaseHostApiDatabaseReferenceSetWithPriorityResponse* + self = + FIREBASE_DATABASE_FIREBASE_DATABASE_HOST_API_DATABASE_REFERENCE_SET_WITH_PRIORITY_RESPONSE( + object); + g_clear_pointer(&self->value, fl_value_unref); + G_OBJECT_CLASS( + firebase_database_firebase_database_host_api_database_reference_set_with_priority_response_parent_class) + ->dispose(object); +} + +static void +firebase_database_firebase_database_host_api_database_reference_set_with_priority_response_init( + FirebaseDatabaseFirebaseDatabaseHostApiDatabaseReferenceSetWithPriorityResponse* + self) {} + +static void +firebase_database_firebase_database_host_api_database_reference_set_with_priority_response_class_init( + FirebaseDatabaseFirebaseDatabaseHostApiDatabaseReferenceSetWithPriorityResponseClass* + klass) { + G_OBJECT_CLASS(klass)->dispose = + firebase_database_firebase_database_host_api_database_reference_set_with_priority_response_dispose; +} + +static FirebaseDatabaseFirebaseDatabaseHostApiDatabaseReferenceSetWithPriorityResponse* +firebase_database_firebase_database_host_api_database_reference_set_with_priority_response_new() { + FirebaseDatabaseFirebaseDatabaseHostApiDatabaseReferenceSetWithPriorityResponse* + self = FIREBASE_DATABASE_FIREBASE_DATABASE_HOST_API_DATABASE_REFERENCE_SET_WITH_PRIORITY_RESPONSE( + g_object_new( + firebase_database_firebase_database_host_api_database_reference_set_with_priority_response_get_type(), + nullptr)); + self->value = fl_value_new_list(); + fl_value_append_take(self->value, fl_value_new_null()); + return self; +} + +static FirebaseDatabaseFirebaseDatabaseHostApiDatabaseReferenceSetWithPriorityResponse* +firebase_database_firebase_database_host_api_database_reference_set_with_priority_response_new_error( + const gchar* code, const gchar* message, FlValue* details) { + FirebaseDatabaseFirebaseDatabaseHostApiDatabaseReferenceSetWithPriorityResponse* + self = FIREBASE_DATABASE_FIREBASE_DATABASE_HOST_API_DATABASE_REFERENCE_SET_WITH_PRIORITY_RESPONSE( + g_object_new( + firebase_database_firebase_database_host_api_database_reference_set_with_priority_response_get_type(), + nullptr)); + self->value = fl_value_new_list(); + fl_value_append_take(self->value, fl_value_new_string(code)); + fl_value_append_take(self->value, + fl_value_new_string(message != nullptr ? message : "")); + fl_value_append_take(self->value, details != nullptr ? fl_value_ref(details) + : fl_value_new_null()); + return self; +} + +G_DECLARE_FINAL_TYPE( + FirebaseDatabaseFirebaseDatabaseHostApiDatabaseReferenceUpdateResponse, + firebase_database_firebase_database_host_api_database_reference_update_response, + FIREBASE_DATABASE, + FIREBASE_DATABASE_HOST_API_DATABASE_REFERENCE_UPDATE_RESPONSE, GObject) + +struct _FirebaseDatabaseFirebaseDatabaseHostApiDatabaseReferenceUpdateResponse { + GObject parent_instance; + + FlValue* value; +}; + +G_DEFINE_TYPE( + FirebaseDatabaseFirebaseDatabaseHostApiDatabaseReferenceUpdateResponse, + firebase_database_firebase_database_host_api_database_reference_update_response, + G_TYPE_OBJECT) + +static void +firebase_database_firebase_database_host_api_database_reference_update_response_dispose( + GObject* object) { + FirebaseDatabaseFirebaseDatabaseHostApiDatabaseReferenceUpdateResponse* self = + FIREBASE_DATABASE_FIREBASE_DATABASE_HOST_API_DATABASE_REFERENCE_UPDATE_RESPONSE( + object); + g_clear_pointer(&self->value, fl_value_unref); + G_OBJECT_CLASS( + firebase_database_firebase_database_host_api_database_reference_update_response_parent_class) + ->dispose(object); +} + +static void +firebase_database_firebase_database_host_api_database_reference_update_response_init( + FirebaseDatabaseFirebaseDatabaseHostApiDatabaseReferenceUpdateResponse* + self) {} + +static void +firebase_database_firebase_database_host_api_database_reference_update_response_class_init( + FirebaseDatabaseFirebaseDatabaseHostApiDatabaseReferenceUpdateResponseClass* + klass) { + G_OBJECT_CLASS(klass)->dispose = + firebase_database_firebase_database_host_api_database_reference_update_response_dispose; +} + +static FirebaseDatabaseFirebaseDatabaseHostApiDatabaseReferenceUpdateResponse* +firebase_database_firebase_database_host_api_database_reference_update_response_new() { + FirebaseDatabaseFirebaseDatabaseHostApiDatabaseReferenceUpdateResponse* self = + FIREBASE_DATABASE_FIREBASE_DATABASE_HOST_API_DATABASE_REFERENCE_UPDATE_RESPONSE( + g_object_new( + firebase_database_firebase_database_host_api_database_reference_update_response_get_type(), + nullptr)); + self->value = fl_value_new_list(); + fl_value_append_take(self->value, fl_value_new_null()); + return self; +} + +static FirebaseDatabaseFirebaseDatabaseHostApiDatabaseReferenceUpdateResponse* +firebase_database_firebase_database_host_api_database_reference_update_response_new_error( + const gchar* code, const gchar* message, FlValue* details) { + FirebaseDatabaseFirebaseDatabaseHostApiDatabaseReferenceUpdateResponse* self = + FIREBASE_DATABASE_FIREBASE_DATABASE_HOST_API_DATABASE_REFERENCE_UPDATE_RESPONSE( + g_object_new( + firebase_database_firebase_database_host_api_database_reference_update_response_get_type(), + nullptr)); + self->value = fl_value_new_list(); + fl_value_append_take(self->value, fl_value_new_string(code)); + fl_value_append_take(self->value, + fl_value_new_string(message != nullptr ? message : "")); + fl_value_append_take(self->value, details != nullptr ? fl_value_ref(details) + : fl_value_new_null()); + return self; +} + +G_DECLARE_FINAL_TYPE( + FirebaseDatabaseFirebaseDatabaseHostApiDatabaseReferenceSetPriorityResponse, + firebase_database_firebase_database_host_api_database_reference_set_priority_response, + FIREBASE_DATABASE, + FIREBASE_DATABASE_HOST_API_DATABASE_REFERENCE_SET_PRIORITY_RESPONSE, + GObject) + +struct + _FirebaseDatabaseFirebaseDatabaseHostApiDatabaseReferenceSetPriorityResponse { + GObject parent_instance; + + FlValue* value; +}; + +G_DEFINE_TYPE( + FirebaseDatabaseFirebaseDatabaseHostApiDatabaseReferenceSetPriorityResponse, + firebase_database_firebase_database_host_api_database_reference_set_priority_response, + G_TYPE_OBJECT) + +static void +firebase_database_firebase_database_host_api_database_reference_set_priority_response_dispose( + GObject* object) { + FirebaseDatabaseFirebaseDatabaseHostApiDatabaseReferenceSetPriorityResponse* self = + FIREBASE_DATABASE_FIREBASE_DATABASE_HOST_API_DATABASE_REFERENCE_SET_PRIORITY_RESPONSE( + object); + g_clear_pointer(&self->value, fl_value_unref); + G_OBJECT_CLASS( + firebase_database_firebase_database_host_api_database_reference_set_priority_response_parent_class) + ->dispose(object); +} + +static void +firebase_database_firebase_database_host_api_database_reference_set_priority_response_init( + FirebaseDatabaseFirebaseDatabaseHostApiDatabaseReferenceSetPriorityResponse* + self) {} + +static void +firebase_database_firebase_database_host_api_database_reference_set_priority_response_class_init( + FirebaseDatabaseFirebaseDatabaseHostApiDatabaseReferenceSetPriorityResponseClass* + klass) { + G_OBJECT_CLASS(klass)->dispose = + firebase_database_firebase_database_host_api_database_reference_set_priority_response_dispose; +} + +static FirebaseDatabaseFirebaseDatabaseHostApiDatabaseReferenceSetPriorityResponse* +firebase_database_firebase_database_host_api_database_reference_set_priority_response_new() { + FirebaseDatabaseFirebaseDatabaseHostApiDatabaseReferenceSetPriorityResponse* self = + FIREBASE_DATABASE_FIREBASE_DATABASE_HOST_API_DATABASE_REFERENCE_SET_PRIORITY_RESPONSE( + g_object_new( + firebase_database_firebase_database_host_api_database_reference_set_priority_response_get_type(), + nullptr)); + self->value = fl_value_new_list(); + fl_value_append_take(self->value, fl_value_new_null()); + return self; +} + +static FirebaseDatabaseFirebaseDatabaseHostApiDatabaseReferenceSetPriorityResponse* +firebase_database_firebase_database_host_api_database_reference_set_priority_response_new_error( + const gchar* code, const gchar* message, FlValue* details) { + FirebaseDatabaseFirebaseDatabaseHostApiDatabaseReferenceSetPriorityResponse* self = + FIREBASE_DATABASE_FIREBASE_DATABASE_HOST_API_DATABASE_REFERENCE_SET_PRIORITY_RESPONSE( + g_object_new( + firebase_database_firebase_database_host_api_database_reference_set_priority_response_get_type(), + nullptr)); + self->value = fl_value_new_list(); + fl_value_append_take(self->value, fl_value_new_string(code)); + fl_value_append_take(self->value, + fl_value_new_string(message != nullptr ? message : "")); + fl_value_append_take(self->value, details != nullptr ? fl_value_ref(details) + : fl_value_new_null()); + return self; +} + +G_DECLARE_FINAL_TYPE( + FirebaseDatabaseFirebaseDatabaseHostApiDatabaseReferenceRunTransactionResponse, + firebase_database_firebase_database_host_api_database_reference_run_transaction_response, + FIREBASE_DATABASE, + FIREBASE_DATABASE_HOST_API_DATABASE_REFERENCE_RUN_TRANSACTION_RESPONSE, + GObject) + +struct + _FirebaseDatabaseFirebaseDatabaseHostApiDatabaseReferenceRunTransactionResponse { + GObject parent_instance; + + FlValue* value; +}; + +G_DEFINE_TYPE( + FirebaseDatabaseFirebaseDatabaseHostApiDatabaseReferenceRunTransactionResponse, + firebase_database_firebase_database_host_api_database_reference_run_transaction_response, + G_TYPE_OBJECT) + +static void +firebase_database_firebase_database_host_api_database_reference_run_transaction_response_dispose( + GObject* object) { + FirebaseDatabaseFirebaseDatabaseHostApiDatabaseReferenceRunTransactionResponse* + self = + FIREBASE_DATABASE_FIREBASE_DATABASE_HOST_API_DATABASE_REFERENCE_RUN_TRANSACTION_RESPONSE( + object); + g_clear_pointer(&self->value, fl_value_unref); + G_OBJECT_CLASS( + firebase_database_firebase_database_host_api_database_reference_run_transaction_response_parent_class) + ->dispose(object); +} + +static void +firebase_database_firebase_database_host_api_database_reference_run_transaction_response_init( + FirebaseDatabaseFirebaseDatabaseHostApiDatabaseReferenceRunTransactionResponse* + self) {} + +static void +firebase_database_firebase_database_host_api_database_reference_run_transaction_response_class_init( + FirebaseDatabaseFirebaseDatabaseHostApiDatabaseReferenceRunTransactionResponseClass* + klass) { + G_OBJECT_CLASS(klass)->dispose = + firebase_database_firebase_database_host_api_database_reference_run_transaction_response_dispose; +} + +static FirebaseDatabaseFirebaseDatabaseHostApiDatabaseReferenceRunTransactionResponse* +firebase_database_firebase_database_host_api_database_reference_run_transaction_response_new() { + FirebaseDatabaseFirebaseDatabaseHostApiDatabaseReferenceRunTransactionResponse* self = + FIREBASE_DATABASE_FIREBASE_DATABASE_HOST_API_DATABASE_REFERENCE_RUN_TRANSACTION_RESPONSE( + g_object_new( + firebase_database_firebase_database_host_api_database_reference_run_transaction_response_get_type(), + nullptr)); + self->value = fl_value_new_list(); + fl_value_append_take(self->value, fl_value_new_null()); + return self; +} + +static FirebaseDatabaseFirebaseDatabaseHostApiDatabaseReferenceRunTransactionResponse* +firebase_database_firebase_database_host_api_database_reference_run_transaction_response_new_error( + const gchar* code, const gchar* message, FlValue* details) { + FirebaseDatabaseFirebaseDatabaseHostApiDatabaseReferenceRunTransactionResponse* self = + FIREBASE_DATABASE_FIREBASE_DATABASE_HOST_API_DATABASE_REFERENCE_RUN_TRANSACTION_RESPONSE( + g_object_new( + firebase_database_firebase_database_host_api_database_reference_run_transaction_response_get_type(), + nullptr)); + self->value = fl_value_new_list(); + fl_value_append_take(self->value, fl_value_new_string(code)); + fl_value_append_take(self->value, + fl_value_new_string(message != nullptr ? message : "")); + fl_value_append_take(self->value, details != nullptr ? fl_value_ref(details) + : fl_value_new_null()); + return self; +} + +G_DECLARE_FINAL_TYPE( + FirebaseDatabaseFirebaseDatabaseHostApiDatabaseReferenceGetTransactionResultResponse, + firebase_database_firebase_database_host_api_database_reference_get_transaction_result_response, + FIREBASE_DATABASE, + FIREBASE_DATABASE_HOST_API_DATABASE_REFERENCE_GET_TRANSACTION_RESULT_RESPONSE, + GObject) + +struct + _FirebaseDatabaseFirebaseDatabaseHostApiDatabaseReferenceGetTransactionResultResponse { + GObject parent_instance; + + FlValue* value; +}; + +G_DEFINE_TYPE( + FirebaseDatabaseFirebaseDatabaseHostApiDatabaseReferenceGetTransactionResultResponse, + firebase_database_firebase_database_host_api_database_reference_get_transaction_result_response, + G_TYPE_OBJECT) + +static void +firebase_database_firebase_database_host_api_database_reference_get_transaction_result_response_dispose( + GObject* object) { + FirebaseDatabaseFirebaseDatabaseHostApiDatabaseReferenceGetTransactionResultResponse* + self = + FIREBASE_DATABASE_FIREBASE_DATABASE_HOST_API_DATABASE_REFERENCE_GET_TRANSACTION_RESULT_RESPONSE( + object); + g_clear_pointer(&self->value, fl_value_unref); + G_OBJECT_CLASS( + firebase_database_firebase_database_host_api_database_reference_get_transaction_result_response_parent_class) + ->dispose(object); +} + +static void +firebase_database_firebase_database_host_api_database_reference_get_transaction_result_response_init( + FirebaseDatabaseFirebaseDatabaseHostApiDatabaseReferenceGetTransactionResultResponse* + self) {} + +static void +firebase_database_firebase_database_host_api_database_reference_get_transaction_result_response_class_init( + FirebaseDatabaseFirebaseDatabaseHostApiDatabaseReferenceGetTransactionResultResponseClass* + klass) { + G_OBJECT_CLASS(klass)->dispose = + firebase_database_firebase_database_host_api_database_reference_get_transaction_result_response_dispose; +} + +static FirebaseDatabaseFirebaseDatabaseHostApiDatabaseReferenceGetTransactionResultResponse* +firebase_database_firebase_database_host_api_database_reference_get_transaction_result_response_new( + FlValue* return_value) { + FirebaseDatabaseFirebaseDatabaseHostApiDatabaseReferenceGetTransactionResultResponse* + self = FIREBASE_DATABASE_FIREBASE_DATABASE_HOST_API_DATABASE_REFERENCE_GET_TRANSACTION_RESULT_RESPONSE( + g_object_new( + firebase_database_firebase_database_host_api_database_reference_get_transaction_result_response_get_type(), + nullptr)); + self->value = fl_value_new_list(); + fl_value_append_take(self->value, fl_value_ref(return_value)); + return self; +} + +static FirebaseDatabaseFirebaseDatabaseHostApiDatabaseReferenceGetTransactionResultResponse* +firebase_database_firebase_database_host_api_database_reference_get_transaction_result_response_new_error( + const gchar* code, const gchar* message, FlValue* details) { + FirebaseDatabaseFirebaseDatabaseHostApiDatabaseReferenceGetTransactionResultResponse* + self = FIREBASE_DATABASE_FIREBASE_DATABASE_HOST_API_DATABASE_REFERENCE_GET_TRANSACTION_RESULT_RESPONSE( + g_object_new( + firebase_database_firebase_database_host_api_database_reference_get_transaction_result_response_get_type(), + nullptr)); + self->value = fl_value_new_list(); + fl_value_append_take(self->value, fl_value_new_string(code)); + fl_value_append_take(self->value, + fl_value_new_string(message != nullptr ? message : "")); + fl_value_append_take(self->value, details != nullptr ? fl_value_ref(details) + : fl_value_new_null()); + return self; +} + +G_DECLARE_FINAL_TYPE( + FirebaseDatabaseFirebaseDatabaseHostApiOnDisconnectSetResponse, + firebase_database_firebase_database_host_api_on_disconnect_set_response, + FIREBASE_DATABASE, FIREBASE_DATABASE_HOST_API_ON_DISCONNECT_SET_RESPONSE, + GObject) + +struct _FirebaseDatabaseFirebaseDatabaseHostApiOnDisconnectSetResponse { + GObject parent_instance; + + FlValue* value; +}; + +G_DEFINE_TYPE( + FirebaseDatabaseFirebaseDatabaseHostApiOnDisconnectSetResponse, + firebase_database_firebase_database_host_api_on_disconnect_set_response, + G_TYPE_OBJECT) + +static void +firebase_database_firebase_database_host_api_on_disconnect_set_response_dispose( + GObject* object) { + FirebaseDatabaseFirebaseDatabaseHostApiOnDisconnectSetResponse* self = + FIREBASE_DATABASE_FIREBASE_DATABASE_HOST_API_ON_DISCONNECT_SET_RESPONSE( + object); + g_clear_pointer(&self->value, fl_value_unref); + G_OBJECT_CLASS( + firebase_database_firebase_database_host_api_on_disconnect_set_response_parent_class) + ->dispose(object); +} + +static void +firebase_database_firebase_database_host_api_on_disconnect_set_response_init( + FirebaseDatabaseFirebaseDatabaseHostApiOnDisconnectSetResponse* self) {} + +static void +firebase_database_firebase_database_host_api_on_disconnect_set_response_class_init( + FirebaseDatabaseFirebaseDatabaseHostApiOnDisconnectSetResponseClass* + klass) { + G_OBJECT_CLASS(klass)->dispose = + firebase_database_firebase_database_host_api_on_disconnect_set_response_dispose; +} + +static FirebaseDatabaseFirebaseDatabaseHostApiOnDisconnectSetResponse* +firebase_database_firebase_database_host_api_on_disconnect_set_response_new() { + FirebaseDatabaseFirebaseDatabaseHostApiOnDisconnectSetResponse* self = + FIREBASE_DATABASE_FIREBASE_DATABASE_HOST_API_ON_DISCONNECT_SET_RESPONSE( + g_object_new( + firebase_database_firebase_database_host_api_on_disconnect_set_response_get_type(), + nullptr)); + self->value = fl_value_new_list(); + fl_value_append_take(self->value, fl_value_new_null()); + return self; +} + +static FirebaseDatabaseFirebaseDatabaseHostApiOnDisconnectSetResponse* +firebase_database_firebase_database_host_api_on_disconnect_set_response_new_error( + const gchar* code, const gchar* message, FlValue* details) { + FirebaseDatabaseFirebaseDatabaseHostApiOnDisconnectSetResponse* self = + FIREBASE_DATABASE_FIREBASE_DATABASE_HOST_API_ON_DISCONNECT_SET_RESPONSE( + g_object_new( + firebase_database_firebase_database_host_api_on_disconnect_set_response_get_type(), + nullptr)); + self->value = fl_value_new_list(); + fl_value_append_take(self->value, fl_value_new_string(code)); + fl_value_append_take(self->value, + fl_value_new_string(message != nullptr ? message : "")); + fl_value_append_take(self->value, details != nullptr ? fl_value_ref(details) + : fl_value_new_null()); + return self; +} + +G_DECLARE_FINAL_TYPE( + FirebaseDatabaseFirebaseDatabaseHostApiOnDisconnectSetWithPriorityResponse, + firebase_database_firebase_database_host_api_on_disconnect_set_with_priority_response, + FIREBASE_DATABASE, + FIREBASE_DATABASE_HOST_API_ON_DISCONNECT_SET_WITH_PRIORITY_RESPONSE, + GObject) + +struct + _FirebaseDatabaseFirebaseDatabaseHostApiOnDisconnectSetWithPriorityResponse { + GObject parent_instance; + + FlValue* value; +}; + +G_DEFINE_TYPE( + FirebaseDatabaseFirebaseDatabaseHostApiOnDisconnectSetWithPriorityResponse, + firebase_database_firebase_database_host_api_on_disconnect_set_with_priority_response, + G_TYPE_OBJECT) + +static void +firebase_database_firebase_database_host_api_on_disconnect_set_with_priority_response_dispose( + GObject* object) { + FirebaseDatabaseFirebaseDatabaseHostApiOnDisconnectSetWithPriorityResponse* self = + FIREBASE_DATABASE_FIREBASE_DATABASE_HOST_API_ON_DISCONNECT_SET_WITH_PRIORITY_RESPONSE( + object); + g_clear_pointer(&self->value, fl_value_unref); + G_OBJECT_CLASS( + firebase_database_firebase_database_host_api_on_disconnect_set_with_priority_response_parent_class) + ->dispose(object); +} + +static void +firebase_database_firebase_database_host_api_on_disconnect_set_with_priority_response_init( + FirebaseDatabaseFirebaseDatabaseHostApiOnDisconnectSetWithPriorityResponse* + self) {} + +static void +firebase_database_firebase_database_host_api_on_disconnect_set_with_priority_response_class_init( + FirebaseDatabaseFirebaseDatabaseHostApiOnDisconnectSetWithPriorityResponseClass* + klass) { + G_OBJECT_CLASS(klass)->dispose = + firebase_database_firebase_database_host_api_on_disconnect_set_with_priority_response_dispose; +} + +static FirebaseDatabaseFirebaseDatabaseHostApiOnDisconnectSetWithPriorityResponse* +firebase_database_firebase_database_host_api_on_disconnect_set_with_priority_response_new() { + FirebaseDatabaseFirebaseDatabaseHostApiOnDisconnectSetWithPriorityResponse* self = + FIREBASE_DATABASE_FIREBASE_DATABASE_HOST_API_ON_DISCONNECT_SET_WITH_PRIORITY_RESPONSE( + g_object_new( + firebase_database_firebase_database_host_api_on_disconnect_set_with_priority_response_get_type(), + nullptr)); + self->value = fl_value_new_list(); + fl_value_append_take(self->value, fl_value_new_null()); + return self; +} + +static FirebaseDatabaseFirebaseDatabaseHostApiOnDisconnectSetWithPriorityResponse* +firebase_database_firebase_database_host_api_on_disconnect_set_with_priority_response_new_error( + const gchar* code, const gchar* message, FlValue* details) { + FirebaseDatabaseFirebaseDatabaseHostApiOnDisconnectSetWithPriorityResponse* self = + FIREBASE_DATABASE_FIREBASE_DATABASE_HOST_API_ON_DISCONNECT_SET_WITH_PRIORITY_RESPONSE( + g_object_new( + firebase_database_firebase_database_host_api_on_disconnect_set_with_priority_response_get_type(), + nullptr)); + self->value = fl_value_new_list(); + fl_value_append_take(self->value, fl_value_new_string(code)); + fl_value_append_take(self->value, + fl_value_new_string(message != nullptr ? message : "")); + fl_value_append_take(self->value, details != nullptr ? fl_value_ref(details) + : fl_value_new_null()); + return self; +} + +G_DECLARE_FINAL_TYPE( + FirebaseDatabaseFirebaseDatabaseHostApiOnDisconnectUpdateResponse, + firebase_database_firebase_database_host_api_on_disconnect_update_response, + FIREBASE_DATABASE, FIREBASE_DATABASE_HOST_API_ON_DISCONNECT_UPDATE_RESPONSE, + GObject) + +struct _FirebaseDatabaseFirebaseDatabaseHostApiOnDisconnectUpdateResponse { + GObject parent_instance; + + FlValue* value; +}; + +G_DEFINE_TYPE( + FirebaseDatabaseFirebaseDatabaseHostApiOnDisconnectUpdateResponse, + firebase_database_firebase_database_host_api_on_disconnect_update_response, + G_TYPE_OBJECT) + +static void +firebase_database_firebase_database_host_api_on_disconnect_update_response_dispose( + GObject* object) { + FirebaseDatabaseFirebaseDatabaseHostApiOnDisconnectUpdateResponse* self = + FIREBASE_DATABASE_FIREBASE_DATABASE_HOST_API_ON_DISCONNECT_UPDATE_RESPONSE( + object); + g_clear_pointer(&self->value, fl_value_unref); + G_OBJECT_CLASS( + firebase_database_firebase_database_host_api_on_disconnect_update_response_parent_class) + ->dispose(object); +} + +static void +firebase_database_firebase_database_host_api_on_disconnect_update_response_init( + FirebaseDatabaseFirebaseDatabaseHostApiOnDisconnectUpdateResponse* self) {} + +static void +firebase_database_firebase_database_host_api_on_disconnect_update_response_class_init( + FirebaseDatabaseFirebaseDatabaseHostApiOnDisconnectUpdateResponseClass* + klass) { + G_OBJECT_CLASS(klass)->dispose = + firebase_database_firebase_database_host_api_on_disconnect_update_response_dispose; +} + +static FirebaseDatabaseFirebaseDatabaseHostApiOnDisconnectUpdateResponse* +firebase_database_firebase_database_host_api_on_disconnect_update_response_new() { + FirebaseDatabaseFirebaseDatabaseHostApiOnDisconnectUpdateResponse* self = + FIREBASE_DATABASE_FIREBASE_DATABASE_HOST_API_ON_DISCONNECT_UPDATE_RESPONSE( + g_object_new( + firebase_database_firebase_database_host_api_on_disconnect_update_response_get_type(), + nullptr)); + self->value = fl_value_new_list(); + fl_value_append_take(self->value, fl_value_new_null()); + return self; +} + +static FirebaseDatabaseFirebaseDatabaseHostApiOnDisconnectUpdateResponse* +firebase_database_firebase_database_host_api_on_disconnect_update_response_new_error( + const gchar* code, const gchar* message, FlValue* details) { + FirebaseDatabaseFirebaseDatabaseHostApiOnDisconnectUpdateResponse* self = + FIREBASE_DATABASE_FIREBASE_DATABASE_HOST_API_ON_DISCONNECT_UPDATE_RESPONSE( + g_object_new( + firebase_database_firebase_database_host_api_on_disconnect_update_response_get_type(), + nullptr)); + self->value = fl_value_new_list(); + fl_value_append_take(self->value, fl_value_new_string(code)); + fl_value_append_take(self->value, + fl_value_new_string(message != nullptr ? message : "")); + fl_value_append_take(self->value, details != nullptr ? fl_value_ref(details) + : fl_value_new_null()); + return self; +} + +G_DECLARE_FINAL_TYPE( + FirebaseDatabaseFirebaseDatabaseHostApiOnDisconnectCancelResponse, + firebase_database_firebase_database_host_api_on_disconnect_cancel_response, + FIREBASE_DATABASE, FIREBASE_DATABASE_HOST_API_ON_DISCONNECT_CANCEL_RESPONSE, + GObject) + +struct _FirebaseDatabaseFirebaseDatabaseHostApiOnDisconnectCancelResponse { + GObject parent_instance; + + FlValue* value; +}; + +G_DEFINE_TYPE( + FirebaseDatabaseFirebaseDatabaseHostApiOnDisconnectCancelResponse, + firebase_database_firebase_database_host_api_on_disconnect_cancel_response, + G_TYPE_OBJECT) + +static void +firebase_database_firebase_database_host_api_on_disconnect_cancel_response_dispose( + GObject* object) { + FirebaseDatabaseFirebaseDatabaseHostApiOnDisconnectCancelResponse* self = + FIREBASE_DATABASE_FIREBASE_DATABASE_HOST_API_ON_DISCONNECT_CANCEL_RESPONSE( + object); + g_clear_pointer(&self->value, fl_value_unref); + G_OBJECT_CLASS( + firebase_database_firebase_database_host_api_on_disconnect_cancel_response_parent_class) + ->dispose(object); +} + +static void +firebase_database_firebase_database_host_api_on_disconnect_cancel_response_init( + FirebaseDatabaseFirebaseDatabaseHostApiOnDisconnectCancelResponse* self) {} + +static void +firebase_database_firebase_database_host_api_on_disconnect_cancel_response_class_init( + FirebaseDatabaseFirebaseDatabaseHostApiOnDisconnectCancelResponseClass* + klass) { + G_OBJECT_CLASS(klass)->dispose = + firebase_database_firebase_database_host_api_on_disconnect_cancel_response_dispose; +} + +static FirebaseDatabaseFirebaseDatabaseHostApiOnDisconnectCancelResponse* +firebase_database_firebase_database_host_api_on_disconnect_cancel_response_new() { + FirebaseDatabaseFirebaseDatabaseHostApiOnDisconnectCancelResponse* self = + FIREBASE_DATABASE_FIREBASE_DATABASE_HOST_API_ON_DISCONNECT_CANCEL_RESPONSE( + g_object_new( + firebase_database_firebase_database_host_api_on_disconnect_cancel_response_get_type(), + nullptr)); + self->value = fl_value_new_list(); + fl_value_append_take(self->value, fl_value_new_null()); + return self; +} + +static FirebaseDatabaseFirebaseDatabaseHostApiOnDisconnectCancelResponse* +firebase_database_firebase_database_host_api_on_disconnect_cancel_response_new_error( + const gchar* code, const gchar* message, FlValue* details) { + FirebaseDatabaseFirebaseDatabaseHostApiOnDisconnectCancelResponse* self = + FIREBASE_DATABASE_FIREBASE_DATABASE_HOST_API_ON_DISCONNECT_CANCEL_RESPONSE( + g_object_new( + firebase_database_firebase_database_host_api_on_disconnect_cancel_response_get_type(), + nullptr)); + self->value = fl_value_new_list(); + fl_value_append_take(self->value, fl_value_new_string(code)); + fl_value_append_take(self->value, + fl_value_new_string(message != nullptr ? message : "")); + fl_value_append_take(self->value, details != nullptr ? fl_value_ref(details) + : fl_value_new_null()); + return self; +} + +G_DECLARE_FINAL_TYPE( + FirebaseDatabaseFirebaseDatabaseHostApiQueryObserveResponse, + firebase_database_firebase_database_host_api_query_observe_response, + FIREBASE_DATABASE, FIREBASE_DATABASE_HOST_API_QUERY_OBSERVE_RESPONSE, + GObject) + +struct _FirebaseDatabaseFirebaseDatabaseHostApiQueryObserveResponse { + GObject parent_instance; + + FlValue* value; +}; + +G_DEFINE_TYPE( + FirebaseDatabaseFirebaseDatabaseHostApiQueryObserveResponse, + firebase_database_firebase_database_host_api_query_observe_response, + G_TYPE_OBJECT) + +static void +firebase_database_firebase_database_host_api_query_observe_response_dispose( + GObject* object) { + FirebaseDatabaseFirebaseDatabaseHostApiQueryObserveResponse* self = + FIREBASE_DATABASE_FIREBASE_DATABASE_HOST_API_QUERY_OBSERVE_RESPONSE( + object); + g_clear_pointer(&self->value, fl_value_unref); + G_OBJECT_CLASS( + firebase_database_firebase_database_host_api_query_observe_response_parent_class) + ->dispose(object); +} + +static void +firebase_database_firebase_database_host_api_query_observe_response_init( + FirebaseDatabaseFirebaseDatabaseHostApiQueryObserveResponse* self) {} + +static void +firebase_database_firebase_database_host_api_query_observe_response_class_init( + FirebaseDatabaseFirebaseDatabaseHostApiQueryObserveResponseClass* klass) { + G_OBJECT_CLASS(klass)->dispose = + firebase_database_firebase_database_host_api_query_observe_response_dispose; +} + +static FirebaseDatabaseFirebaseDatabaseHostApiQueryObserveResponse* +firebase_database_firebase_database_host_api_query_observe_response_new( + const gchar* return_value) { + FirebaseDatabaseFirebaseDatabaseHostApiQueryObserveResponse* self = + FIREBASE_DATABASE_FIREBASE_DATABASE_HOST_API_QUERY_OBSERVE_RESPONSE(g_object_new( + firebase_database_firebase_database_host_api_query_observe_response_get_type(), + nullptr)); + self->value = fl_value_new_list(); + fl_value_append_take(self->value, fl_value_new_string(return_value)); + return self; +} + +static FirebaseDatabaseFirebaseDatabaseHostApiQueryObserveResponse* +firebase_database_firebase_database_host_api_query_observe_response_new_error( + const gchar* code, const gchar* message, FlValue* details) { + FirebaseDatabaseFirebaseDatabaseHostApiQueryObserveResponse* self = + FIREBASE_DATABASE_FIREBASE_DATABASE_HOST_API_QUERY_OBSERVE_RESPONSE(g_object_new( + firebase_database_firebase_database_host_api_query_observe_response_get_type(), + nullptr)); + self->value = fl_value_new_list(); + fl_value_append_take(self->value, fl_value_new_string(code)); + fl_value_append_take(self->value, + fl_value_new_string(message != nullptr ? message : "")); + fl_value_append_take(self->value, details != nullptr ? fl_value_ref(details) + : fl_value_new_null()); + return self; +} + +G_DECLARE_FINAL_TYPE( + FirebaseDatabaseFirebaseDatabaseHostApiQueryKeepSyncedResponse, + firebase_database_firebase_database_host_api_query_keep_synced_response, + FIREBASE_DATABASE, FIREBASE_DATABASE_HOST_API_QUERY_KEEP_SYNCED_RESPONSE, + GObject) + +struct _FirebaseDatabaseFirebaseDatabaseHostApiQueryKeepSyncedResponse { + GObject parent_instance; + + FlValue* value; +}; + +G_DEFINE_TYPE( + FirebaseDatabaseFirebaseDatabaseHostApiQueryKeepSyncedResponse, + firebase_database_firebase_database_host_api_query_keep_synced_response, + G_TYPE_OBJECT) + +static void +firebase_database_firebase_database_host_api_query_keep_synced_response_dispose( + GObject* object) { + FirebaseDatabaseFirebaseDatabaseHostApiQueryKeepSyncedResponse* self = + FIREBASE_DATABASE_FIREBASE_DATABASE_HOST_API_QUERY_KEEP_SYNCED_RESPONSE( + object); + g_clear_pointer(&self->value, fl_value_unref); + G_OBJECT_CLASS( + firebase_database_firebase_database_host_api_query_keep_synced_response_parent_class) + ->dispose(object); +} + +static void +firebase_database_firebase_database_host_api_query_keep_synced_response_init( + FirebaseDatabaseFirebaseDatabaseHostApiQueryKeepSyncedResponse* self) {} + +static void +firebase_database_firebase_database_host_api_query_keep_synced_response_class_init( + FirebaseDatabaseFirebaseDatabaseHostApiQueryKeepSyncedResponseClass* + klass) { + G_OBJECT_CLASS(klass)->dispose = + firebase_database_firebase_database_host_api_query_keep_synced_response_dispose; +} + +static FirebaseDatabaseFirebaseDatabaseHostApiQueryKeepSyncedResponse* +firebase_database_firebase_database_host_api_query_keep_synced_response_new() { + FirebaseDatabaseFirebaseDatabaseHostApiQueryKeepSyncedResponse* self = + FIREBASE_DATABASE_FIREBASE_DATABASE_HOST_API_QUERY_KEEP_SYNCED_RESPONSE( + g_object_new( + firebase_database_firebase_database_host_api_query_keep_synced_response_get_type(), + nullptr)); + self->value = fl_value_new_list(); + fl_value_append_take(self->value, fl_value_new_null()); + return self; +} + +static FirebaseDatabaseFirebaseDatabaseHostApiQueryKeepSyncedResponse* +firebase_database_firebase_database_host_api_query_keep_synced_response_new_error( + const gchar* code, const gchar* message, FlValue* details) { + FirebaseDatabaseFirebaseDatabaseHostApiQueryKeepSyncedResponse* self = + FIREBASE_DATABASE_FIREBASE_DATABASE_HOST_API_QUERY_KEEP_SYNCED_RESPONSE( + g_object_new( + firebase_database_firebase_database_host_api_query_keep_synced_response_get_type(), + nullptr)); + self->value = fl_value_new_list(); + fl_value_append_take(self->value, fl_value_new_string(code)); + fl_value_append_take(self->value, + fl_value_new_string(message != nullptr ? message : "")); + fl_value_append_take(self->value, details != nullptr ? fl_value_ref(details) + : fl_value_new_null()); + return self; +} + +G_DECLARE_FINAL_TYPE( + FirebaseDatabaseFirebaseDatabaseHostApiQueryGetResponse, + firebase_database_firebase_database_host_api_query_get_response, + FIREBASE_DATABASE, FIREBASE_DATABASE_HOST_API_QUERY_GET_RESPONSE, GObject) + +struct _FirebaseDatabaseFirebaseDatabaseHostApiQueryGetResponse { + GObject parent_instance; + + FlValue* value; +}; + +G_DEFINE_TYPE(FirebaseDatabaseFirebaseDatabaseHostApiQueryGetResponse, + firebase_database_firebase_database_host_api_query_get_response, + G_TYPE_OBJECT) + +static void +firebase_database_firebase_database_host_api_query_get_response_dispose( + GObject* object) { + FirebaseDatabaseFirebaseDatabaseHostApiQueryGetResponse* self = + FIREBASE_DATABASE_FIREBASE_DATABASE_HOST_API_QUERY_GET_RESPONSE(object); + g_clear_pointer(&self->value, fl_value_unref); + G_OBJECT_CLASS( + firebase_database_firebase_database_host_api_query_get_response_parent_class) + ->dispose(object); +} + +static void +firebase_database_firebase_database_host_api_query_get_response_init( + FirebaseDatabaseFirebaseDatabaseHostApiQueryGetResponse* self) {} + +static void +firebase_database_firebase_database_host_api_query_get_response_class_init( + FirebaseDatabaseFirebaseDatabaseHostApiQueryGetResponseClass* klass) { + G_OBJECT_CLASS(klass)->dispose = + firebase_database_firebase_database_host_api_query_get_response_dispose; +} + +static FirebaseDatabaseFirebaseDatabaseHostApiQueryGetResponse* +firebase_database_firebase_database_host_api_query_get_response_new( + FlValue* return_value) { + FirebaseDatabaseFirebaseDatabaseHostApiQueryGetResponse* self = + FIREBASE_DATABASE_FIREBASE_DATABASE_HOST_API_QUERY_GET_RESPONSE(g_object_new( + firebase_database_firebase_database_host_api_query_get_response_get_type(), + nullptr)); + self->value = fl_value_new_list(); + fl_value_append_take(self->value, fl_value_ref(return_value)); + return self; +} + +static FirebaseDatabaseFirebaseDatabaseHostApiQueryGetResponse* +firebase_database_firebase_database_host_api_query_get_response_new_error( + const gchar* code, const gchar* message, FlValue* details) { + FirebaseDatabaseFirebaseDatabaseHostApiQueryGetResponse* self = + FIREBASE_DATABASE_FIREBASE_DATABASE_HOST_API_QUERY_GET_RESPONSE(g_object_new( + firebase_database_firebase_database_host_api_query_get_response_get_type(), + nullptr)); + self->value = fl_value_new_list(); + fl_value_append_take(self->value, fl_value_new_string(code)); + fl_value_append_take(self->value, + fl_value_new_string(message != nullptr ? message : "")); + fl_value_append_take(self->value, details != nullptr ? fl_value_ref(details) + : fl_value_new_null()); + return self; +} + +struct _FirebaseDatabaseFirebaseDatabaseHostApi { + GObject parent_instance; + + const FirebaseDatabaseFirebaseDatabaseHostApiVTable* vtable; + gpointer user_data; + GDestroyNotify user_data_free_func; +}; + +G_DEFINE_TYPE(FirebaseDatabaseFirebaseDatabaseHostApi, + firebase_database_firebase_database_host_api, G_TYPE_OBJECT) + +static void firebase_database_firebase_database_host_api_dispose( + GObject* object) { + FirebaseDatabaseFirebaseDatabaseHostApi* self = + FIREBASE_DATABASE_FIREBASE_DATABASE_HOST_API(object); + if (self->user_data != nullptr) { + self->user_data_free_func(self->user_data); + } + self->user_data = nullptr; + G_OBJECT_CLASS(firebase_database_firebase_database_host_api_parent_class) + ->dispose(object); +} + +static void firebase_database_firebase_database_host_api_init( + FirebaseDatabaseFirebaseDatabaseHostApi* self) {} + +static void firebase_database_firebase_database_host_api_class_init( + FirebaseDatabaseFirebaseDatabaseHostApiClass* klass) { + G_OBJECT_CLASS(klass)->dispose = + firebase_database_firebase_database_host_api_dispose; +} + +static FirebaseDatabaseFirebaseDatabaseHostApi* +firebase_database_firebase_database_host_api_new( + const FirebaseDatabaseFirebaseDatabaseHostApiVTable* vtable, + gpointer user_data, GDestroyNotify user_data_free_func) { + FirebaseDatabaseFirebaseDatabaseHostApi* self = + FIREBASE_DATABASE_FIREBASE_DATABASE_HOST_API(g_object_new( + firebase_database_firebase_database_host_api_get_type(), nullptr)); + self->vtable = vtable; + self->user_data = user_data; + self->user_data_free_func = user_data_free_func; + return self; +} + +static void firebase_database_firebase_database_host_api_go_online_cb( + FlBasicMessageChannel* channel, FlValue* message_, + FlBasicMessageChannelResponseHandle* response_handle, gpointer user_data) { + FirebaseDatabaseFirebaseDatabaseHostApi* self = + FIREBASE_DATABASE_FIREBASE_DATABASE_HOST_API(user_data); + + if (self->vtable == nullptr || self->vtable->go_online == nullptr) { + return; + } + + FlValue* value0 = fl_value_get_list_value(message_, 0); + FirebaseDatabaseDatabasePigeonFirebaseApp* app = + FIREBASE_DATABASE_DATABASE_PIGEON_FIREBASE_APP( + fl_value_get_custom_value_object(value0)); + g_autoptr(FirebaseDatabaseFirebaseDatabaseHostApiResponseHandle) handle = + firebase_database_firebase_database_host_api_response_handle_new( + channel, response_handle); + self->vtable->go_online(app, handle, self->user_data); +} + +static void firebase_database_firebase_database_host_api_go_offline_cb( + FlBasicMessageChannel* channel, FlValue* message_, + FlBasicMessageChannelResponseHandle* response_handle, gpointer user_data) { + FirebaseDatabaseFirebaseDatabaseHostApi* self = + FIREBASE_DATABASE_FIREBASE_DATABASE_HOST_API(user_data); + + if (self->vtable == nullptr || self->vtable->go_offline == nullptr) { + return; + } + + FlValue* value0 = fl_value_get_list_value(message_, 0); + FirebaseDatabaseDatabasePigeonFirebaseApp* app = + FIREBASE_DATABASE_DATABASE_PIGEON_FIREBASE_APP( + fl_value_get_custom_value_object(value0)); + g_autoptr(FirebaseDatabaseFirebaseDatabaseHostApiResponseHandle) handle = + firebase_database_firebase_database_host_api_response_handle_new( + channel, response_handle); + self->vtable->go_offline(app, handle, self->user_data); +} + +static void +firebase_database_firebase_database_host_api_set_persistence_enabled_cb( + FlBasicMessageChannel* channel, FlValue* message_, + FlBasicMessageChannelResponseHandle* response_handle, gpointer user_data) { + FirebaseDatabaseFirebaseDatabaseHostApi* self = + FIREBASE_DATABASE_FIREBASE_DATABASE_HOST_API(user_data); + + if (self->vtable == nullptr || + self->vtable->set_persistence_enabled == nullptr) { + return; + } + + FlValue* value0 = fl_value_get_list_value(message_, 0); + FirebaseDatabaseDatabasePigeonFirebaseApp* app = + FIREBASE_DATABASE_DATABASE_PIGEON_FIREBASE_APP( + fl_value_get_custom_value_object(value0)); + FlValue* value1 = fl_value_get_list_value(message_, 1); + gboolean enabled = fl_value_get_bool(value1); + g_autoptr(FirebaseDatabaseFirebaseDatabaseHostApiResponseHandle) handle = + firebase_database_firebase_database_host_api_response_handle_new( + channel, response_handle); + self->vtable->set_persistence_enabled(app, enabled, handle, self->user_data); +} + +static void +firebase_database_firebase_database_host_api_set_persistence_cache_size_bytes_cb( + FlBasicMessageChannel* channel, FlValue* message_, + FlBasicMessageChannelResponseHandle* response_handle, gpointer user_data) { + FirebaseDatabaseFirebaseDatabaseHostApi* self = + FIREBASE_DATABASE_FIREBASE_DATABASE_HOST_API(user_data); + + if (self->vtable == nullptr || + self->vtable->set_persistence_cache_size_bytes == nullptr) { + return; + } + + FlValue* value0 = fl_value_get_list_value(message_, 0); + FirebaseDatabaseDatabasePigeonFirebaseApp* app = + FIREBASE_DATABASE_DATABASE_PIGEON_FIREBASE_APP( + fl_value_get_custom_value_object(value0)); + FlValue* value1 = fl_value_get_list_value(message_, 1); + int64_t cache_size = fl_value_get_int(value1); + g_autoptr(FirebaseDatabaseFirebaseDatabaseHostApiResponseHandle) handle = + firebase_database_firebase_database_host_api_response_handle_new( + channel, response_handle); + self->vtable->set_persistence_cache_size_bytes(app, cache_size, handle, + self->user_data); +} + +static void firebase_database_firebase_database_host_api_set_logging_enabled_cb( + FlBasicMessageChannel* channel, FlValue* message_, + FlBasicMessageChannelResponseHandle* response_handle, gpointer user_data) { + FirebaseDatabaseFirebaseDatabaseHostApi* self = + FIREBASE_DATABASE_FIREBASE_DATABASE_HOST_API(user_data); + + if (self->vtable == nullptr || self->vtable->set_logging_enabled == nullptr) { + return; + } + + FlValue* value0 = fl_value_get_list_value(message_, 0); + FirebaseDatabaseDatabasePigeonFirebaseApp* app = + FIREBASE_DATABASE_DATABASE_PIGEON_FIREBASE_APP( + fl_value_get_custom_value_object(value0)); + FlValue* value1 = fl_value_get_list_value(message_, 1); + gboolean enabled = fl_value_get_bool(value1); + g_autoptr(FirebaseDatabaseFirebaseDatabaseHostApiResponseHandle) handle = + firebase_database_firebase_database_host_api_response_handle_new( + channel, response_handle); + self->vtable->set_logging_enabled(app, enabled, handle, self->user_data); +} + +static void +firebase_database_firebase_database_host_api_use_database_emulator_cb( + FlBasicMessageChannel* channel, FlValue* message_, + FlBasicMessageChannelResponseHandle* response_handle, gpointer user_data) { + FirebaseDatabaseFirebaseDatabaseHostApi* self = + FIREBASE_DATABASE_FIREBASE_DATABASE_HOST_API(user_data); + + if (self->vtable == nullptr || + self->vtable->use_database_emulator == nullptr) { + return; + } + + FlValue* value0 = fl_value_get_list_value(message_, 0); + FirebaseDatabaseDatabasePigeonFirebaseApp* app = + FIREBASE_DATABASE_DATABASE_PIGEON_FIREBASE_APP( + fl_value_get_custom_value_object(value0)); + FlValue* value1 = fl_value_get_list_value(message_, 1); + const gchar* host = fl_value_get_string(value1); + FlValue* value2 = fl_value_get_list_value(message_, 2); + int64_t port = fl_value_get_int(value2); + g_autoptr(FirebaseDatabaseFirebaseDatabaseHostApiResponseHandle) handle = + firebase_database_firebase_database_host_api_response_handle_new( + channel, response_handle); + self->vtable->use_database_emulator(app, host, port, handle, self->user_data); +} + +static void firebase_database_firebase_database_host_api_ref_cb( + FlBasicMessageChannel* channel, FlValue* message_, + FlBasicMessageChannelResponseHandle* response_handle, gpointer user_data) { + FirebaseDatabaseFirebaseDatabaseHostApi* self = + FIREBASE_DATABASE_FIREBASE_DATABASE_HOST_API(user_data); + + if (self->vtable == nullptr || self->vtable->ref == nullptr) { + return; + } + + FlValue* value0 = fl_value_get_list_value(message_, 0); + FirebaseDatabaseDatabasePigeonFirebaseApp* app = + FIREBASE_DATABASE_DATABASE_PIGEON_FIREBASE_APP( + fl_value_get_custom_value_object(value0)); + FlValue* value1 = fl_value_get_list_value(message_, 1); + const gchar* path = fl_value_get_string(value1); + g_autoptr(FirebaseDatabaseFirebaseDatabaseHostApiResponseHandle) handle = + firebase_database_firebase_database_host_api_response_handle_new( + channel, response_handle); + self->vtable->ref(app, path, handle, self->user_data); +} + +static void firebase_database_firebase_database_host_api_ref_from_u_r_l_cb( + FlBasicMessageChannel* channel, FlValue* message_, + FlBasicMessageChannelResponseHandle* response_handle, gpointer user_data) { + FirebaseDatabaseFirebaseDatabaseHostApi* self = + FIREBASE_DATABASE_FIREBASE_DATABASE_HOST_API(user_data); + + if (self->vtable == nullptr || self->vtable->ref_from_u_r_l == nullptr) { + return; + } + + FlValue* value0 = fl_value_get_list_value(message_, 0); + FirebaseDatabaseDatabasePigeonFirebaseApp* app = + FIREBASE_DATABASE_DATABASE_PIGEON_FIREBASE_APP( + fl_value_get_custom_value_object(value0)); + FlValue* value1 = fl_value_get_list_value(message_, 1); + const gchar* url = fl_value_get_string(value1); + g_autoptr(FirebaseDatabaseFirebaseDatabaseHostApiResponseHandle) handle = + firebase_database_firebase_database_host_api_response_handle_new( + channel, response_handle); + self->vtable->ref_from_u_r_l(app, url, handle, self->user_data); +} + +static void +firebase_database_firebase_database_host_api_purge_outstanding_writes_cb( + FlBasicMessageChannel* channel, FlValue* message_, + FlBasicMessageChannelResponseHandle* response_handle, gpointer user_data) { + FirebaseDatabaseFirebaseDatabaseHostApi* self = + FIREBASE_DATABASE_FIREBASE_DATABASE_HOST_API(user_data); + + if (self->vtable == nullptr || + self->vtable->purge_outstanding_writes == nullptr) { + return; + } + + FlValue* value0 = fl_value_get_list_value(message_, 0); + FirebaseDatabaseDatabasePigeonFirebaseApp* app = + FIREBASE_DATABASE_DATABASE_PIGEON_FIREBASE_APP( + fl_value_get_custom_value_object(value0)); + g_autoptr(FirebaseDatabaseFirebaseDatabaseHostApiResponseHandle) handle = + firebase_database_firebase_database_host_api_response_handle_new( + channel, response_handle); + self->vtable->purge_outstanding_writes(app, handle, self->user_data); +} + +static void +firebase_database_firebase_database_host_api_database_reference_set_cb( + FlBasicMessageChannel* channel, FlValue* message_, + FlBasicMessageChannelResponseHandle* response_handle, gpointer user_data) { + FirebaseDatabaseFirebaseDatabaseHostApi* self = + FIREBASE_DATABASE_FIREBASE_DATABASE_HOST_API(user_data); + + if (self->vtable == nullptr || + self->vtable->database_reference_set == nullptr) { + return; + } + + FlValue* value0 = fl_value_get_list_value(message_, 0); + FirebaseDatabaseDatabasePigeonFirebaseApp* app = + FIREBASE_DATABASE_DATABASE_PIGEON_FIREBASE_APP( + fl_value_get_custom_value_object(value0)); + FlValue* value1 = fl_value_get_list_value(message_, 1); + FirebaseDatabaseDatabaseReferenceRequest* request = + FIREBASE_DATABASE_DATABASE_REFERENCE_REQUEST( + fl_value_get_custom_value_object(value1)); + g_autoptr(FirebaseDatabaseFirebaseDatabaseHostApiResponseHandle) handle = + firebase_database_firebase_database_host_api_response_handle_new( + channel, response_handle); + self->vtable->database_reference_set(app, request, handle, self->user_data); +} + +static void +firebase_database_firebase_database_host_api_database_reference_set_with_priority_cb( + FlBasicMessageChannel* channel, FlValue* message_, + FlBasicMessageChannelResponseHandle* response_handle, gpointer user_data) { + FirebaseDatabaseFirebaseDatabaseHostApi* self = + FIREBASE_DATABASE_FIREBASE_DATABASE_HOST_API(user_data); + + if (self->vtable == nullptr || + self->vtable->database_reference_set_with_priority == nullptr) { + return; + } + + FlValue* value0 = fl_value_get_list_value(message_, 0); + FirebaseDatabaseDatabasePigeonFirebaseApp* app = + FIREBASE_DATABASE_DATABASE_PIGEON_FIREBASE_APP( + fl_value_get_custom_value_object(value0)); + FlValue* value1 = fl_value_get_list_value(message_, 1); + FirebaseDatabaseDatabaseReferenceRequest* request = + FIREBASE_DATABASE_DATABASE_REFERENCE_REQUEST( + fl_value_get_custom_value_object(value1)); + g_autoptr(FirebaseDatabaseFirebaseDatabaseHostApiResponseHandle) handle = + firebase_database_firebase_database_host_api_response_handle_new( + channel, response_handle); + self->vtable->database_reference_set_with_priority(app, request, handle, + self->user_data); +} + +static void +firebase_database_firebase_database_host_api_database_reference_update_cb( + FlBasicMessageChannel* channel, FlValue* message_, + FlBasicMessageChannelResponseHandle* response_handle, gpointer user_data) { + FirebaseDatabaseFirebaseDatabaseHostApi* self = + FIREBASE_DATABASE_FIREBASE_DATABASE_HOST_API(user_data); + + if (self->vtable == nullptr || + self->vtable->database_reference_update == nullptr) { + return; + } + + FlValue* value0 = fl_value_get_list_value(message_, 0); + FirebaseDatabaseDatabasePigeonFirebaseApp* app = + FIREBASE_DATABASE_DATABASE_PIGEON_FIREBASE_APP( + fl_value_get_custom_value_object(value0)); + FlValue* value1 = fl_value_get_list_value(message_, 1); + FirebaseDatabaseUpdateRequest* request = FIREBASE_DATABASE_UPDATE_REQUEST( + fl_value_get_custom_value_object(value1)); + g_autoptr(FirebaseDatabaseFirebaseDatabaseHostApiResponseHandle) handle = + firebase_database_firebase_database_host_api_response_handle_new( + channel, response_handle); + self->vtable->database_reference_update(app, request, handle, + self->user_data); +} + +static void +firebase_database_firebase_database_host_api_database_reference_set_priority_cb( + FlBasicMessageChannel* channel, FlValue* message_, + FlBasicMessageChannelResponseHandle* response_handle, gpointer user_data) { + FirebaseDatabaseFirebaseDatabaseHostApi* self = + FIREBASE_DATABASE_FIREBASE_DATABASE_HOST_API(user_data); + + if (self->vtable == nullptr || + self->vtable->database_reference_set_priority == nullptr) { + return; + } + + FlValue* value0 = fl_value_get_list_value(message_, 0); + FirebaseDatabaseDatabasePigeonFirebaseApp* app = + FIREBASE_DATABASE_DATABASE_PIGEON_FIREBASE_APP( + fl_value_get_custom_value_object(value0)); + FlValue* value1 = fl_value_get_list_value(message_, 1); + FirebaseDatabaseDatabaseReferenceRequest* request = + FIREBASE_DATABASE_DATABASE_REFERENCE_REQUEST( + fl_value_get_custom_value_object(value1)); + g_autoptr(FirebaseDatabaseFirebaseDatabaseHostApiResponseHandle) handle = + firebase_database_firebase_database_host_api_response_handle_new( + channel, response_handle); + self->vtable->database_reference_set_priority(app, request, handle, + self->user_data); +} + +static void +firebase_database_firebase_database_host_api_database_reference_run_transaction_cb( + FlBasicMessageChannel* channel, FlValue* message_, + FlBasicMessageChannelResponseHandle* response_handle, gpointer user_data) { + FirebaseDatabaseFirebaseDatabaseHostApi* self = + FIREBASE_DATABASE_FIREBASE_DATABASE_HOST_API(user_data); + + if (self->vtable == nullptr || + self->vtable->database_reference_run_transaction == nullptr) { + return; + } + + FlValue* value0 = fl_value_get_list_value(message_, 0); + FirebaseDatabaseDatabasePigeonFirebaseApp* app = + FIREBASE_DATABASE_DATABASE_PIGEON_FIREBASE_APP( + fl_value_get_custom_value_object(value0)); + FlValue* value1 = fl_value_get_list_value(message_, 1); + FirebaseDatabaseTransactionRequest* request = + FIREBASE_DATABASE_TRANSACTION_REQUEST( + fl_value_get_custom_value_object(value1)); + g_autoptr(FirebaseDatabaseFirebaseDatabaseHostApiResponseHandle) handle = + firebase_database_firebase_database_host_api_response_handle_new( + channel, response_handle); + self->vtable->database_reference_run_transaction(app, request, handle, + self->user_data); +} + +static void +firebase_database_firebase_database_host_api_database_reference_get_transaction_result_cb( + FlBasicMessageChannel* channel, FlValue* message_, + FlBasicMessageChannelResponseHandle* response_handle, gpointer user_data) { + FirebaseDatabaseFirebaseDatabaseHostApi* self = + FIREBASE_DATABASE_FIREBASE_DATABASE_HOST_API(user_data); + + if (self->vtable == nullptr || + self->vtable->database_reference_get_transaction_result == nullptr) { + return; + } + + FlValue* value0 = fl_value_get_list_value(message_, 0); + FirebaseDatabaseDatabasePigeonFirebaseApp* app = + FIREBASE_DATABASE_DATABASE_PIGEON_FIREBASE_APP( + fl_value_get_custom_value_object(value0)); + FlValue* value1 = fl_value_get_list_value(message_, 1); + int64_t transaction_key = fl_value_get_int(value1); + g_autoptr(FirebaseDatabaseFirebaseDatabaseHostApiResponseHandle) handle = + firebase_database_firebase_database_host_api_response_handle_new( + channel, response_handle); + self->vtable->database_reference_get_transaction_result( + app, transaction_key, handle, self->user_data); +} + +static void firebase_database_firebase_database_host_api_on_disconnect_set_cb( + FlBasicMessageChannel* channel, FlValue* message_, + FlBasicMessageChannelResponseHandle* response_handle, gpointer user_data) { + FirebaseDatabaseFirebaseDatabaseHostApi* self = + FIREBASE_DATABASE_FIREBASE_DATABASE_HOST_API(user_data); + + if (self->vtable == nullptr || self->vtable->on_disconnect_set == nullptr) { + return; + } + + FlValue* value0 = fl_value_get_list_value(message_, 0); + FirebaseDatabaseDatabasePigeonFirebaseApp* app = + FIREBASE_DATABASE_DATABASE_PIGEON_FIREBASE_APP( + fl_value_get_custom_value_object(value0)); + FlValue* value1 = fl_value_get_list_value(message_, 1); + FirebaseDatabaseDatabaseReferenceRequest* request = + FIREBASE_DATABASE_DATABASE_REFERENCE_REQUEST( + fl_value_get_custom_value_object(value1)); + g_autoptr(FirebaseDatabaseFirebaseDatabaseHostApiResponseHandle) handle = + firebase_database_firebase_database_host_api_response_handle_new( + channel, response_handle); + self->vtable->on_disconnect_set(app, request, handle, self->user_data); +} + +static void +firebase_database_firebase_database_host_api_on_disconnect_set_with_priority_cb( + FlBasicMessageChannel* channel, FlValue* message_, + FlBasicMessageChannelResponseHandle* response_handle, gpointer user_data) { + FirebaseDatabaseFirebaseDatabaseHostApi* self = + FIREBASE_DATABASE_FIREBASE_DATABASE_HOST_API(user_data); + + if (self->vtable == nullptr || + self->vtable->on_disconnect_set_with_priority == nullptr) { + return; + } + + FlValue* value0 = fl_value_get_list_value(message_, 0); + FirebaseDatabaseDatabasePigeonFirebaseApp* app = + FIREBASE_DATABASE_DATABASE_PIGEON_FIREBASE_APP( + fl_value_get_custom_value_object(value0)); + FlValue* value1 = fl_value_get_list_value(message_, 1); + FirebaseDatabaseDatabaseReferenceRequest* request = + FIREBASE_DATABASE_DATABASE_REFERENCE_REQUEST( + fl_value_get_custom_value_object(value1)); + g_autoptr(FirebaseDatabaseFirebaseDatabaseHostApiResponseHandle) handle = + firebase_database_firebase_database_host_api_response_handle_new( + channel, response_handle); + self->vtable->on_disconnect_set_with_priority(app, request, handle, + self->user_data); +} + +static void +firebase_database_firebase_database_host_api_on_disconnect_update_cb( + FlBasicMessageChannel* channel, FlValue* message_, + FlBasicMessageChannelResponseHandle* response_handle, gpointer user_data) { + FirebaseDatabaseFirebaseDatabaseHostApi* self = + FIREBASE_DATABASE_FIREBASE_DATABASE_HOST_API(user_data); + + if (self->vtable == nullptr || + self->vtable->on_disconnect_update == nullptr) { + return; + } + + FlValue* value0 = fl_value_get_list_value(message_, 0); + FirebaseDatabaseDatabasePigeonFirebaseApp* app = + FIREBASE_DATABASE_DATABASE_PIGEON_FIREBASE_APP( + fl_value_get_custom_value_object(value0)); + FlValue* value1 = fl_value_get_list_value(message_, 1); + FirebaseDatabaseUpdateRequest* request = FIREBASE_DATABASE_UPDATE_REQUEST( + fl_value_get_custom_value_object(value1)); + g_autoptr(FirebaseDatabaseFirebaseDatabaseHostApiResponseHandle) handle = + firebase_database_firebase_database_host_api_response_handle_new( + channel, response_handle); + self->vtable->on_disconnect_update(app, request, handle, self->user_data); +} + +static void +firebase_database_firebase_database_host_api_on_disconnect_cancel_cb( + FlBasicMessageChannel* channel, FlValue* message_, + FlBasicMessageChannelResponseHandle* response_handle, gpointer user_data) { + FirebaseDatabaseFirebaseDatabaseHostApi* self = + FIREBASE_DATABASE_FIREBASE_DATABASE_HOST_API(user_data); + + if (self->vtable == nullptr || + self->vtable->on_disconnect_cancel == nullptr) { + return; + } + + FlValue* value0 = fl_value_get_list_value(message_, 0); + FirebaseDatabaseDatabasePigeonFirebaseApp* app = + FIREBASE_DATABASE_DATABASE_PIGEON_FIREBASE_APP( + fl_value_get_custom_value_object(value0)); + FlValue* value1 = fl_value_get_list_value(message_, 1); + const gchar* path = fl_value_get_string(value1); + g_autoptr(FirebaseDatabaseFirebaseDatabaseHostApiResponseHandle) handle = + firebase_database_firebase_database_host_api_response_handle_new( + channel, response_handle); + self->vtable->on_disconnect_cancel(app, path, handle, self->user_data); +} + +static void firebase_database_firebase_database_host_api_query_observe_cb( + FlBasicMessageChannel* channel, FlValue* message_, + FlBasicMessageChannelResponseHandle* response_handle, gpointer user_data) { + FirebaseDatabaseFirebaseDatabaseHostApi* self = + FIREBASE_DATABASE_FIREBASE_DATABASE_HOST_API(user_data); + + if (self->vtable == nullptr || self->vtable->query_observe == nullptr) { + return; + } + + FlValue* value0 = fl_value_get_list_value(message_, 0); + FirebaseDatabaseDatabasePigeonFirebaseApp* app = + FIREBASE_DATABASE_DATABASE_PIGEON_FIREBASE_APP( + fl_value_get_custom_value_object(value0)); + FlValue* value1 = fl_value_get_list_value(message_, 1); + FirebaseDatabaseQueryRequest* request = + FIREBASE_DATABASE_QUERY_REQUEST(fl_value_get_custom_value_object(value1)); + g_autoptr(FirebaseDatabaseFirebaseDatabaseHostApiResponseHandle) handle = + firebase_database_firebase_database_host_api_response_handle_new( + channel, response_handle); + self->vtable->query_observe(app, request, handle, self->user_data); +} + +static void firebase_database_firebase_database_host_api_query_keep_synced_cb( + FlBasicMessageChannel* channel, FlValue* message_, + FlBasicMessageChannelResponseHandle* response_handle, gpointer user_data) { + FirebaseDatabaseFirebaseDatabaseHostApi* self = + FIREBASE_DATABASE_FIREBASE_DATABASE_HOST_API(user_data); + + if (self->vtable == nullptr || self->vtable->query_keep_synced == nullptr) { + return; + } + + FlValue* value0 = fl_value_get_list_value(message_, 0); + FirebaseDatabaseDatabasePigeonFirebaseApp* app = + FIREBASE_DATABASE_DATABASE_PIGEON_FIREBASE_APP( + fl_value_get_custom_value_object(value0)); + FlValue* value1 = fl_value_get_list_value(message_, 1); + FirebaseDatabaseQueryRequest* request = + FIREBASE_DATABASE_QUERY_REQUEST(fl_value_get_custom_value_object(value1)); + g_autoptr(FirebaseDatabaseFirebaseDatabaseHostApiResponseHandle) handle = + firebase_database_firebase_database_host_api_response_handle_new( + channel, response_handle); + self->vtable->query_keep_synced(app, request, handle, self->user_data); +} + +static void firebase_database_firebase_database_host_api_query_get_cb( + FlBasicMessageChannel* channel, FlValue* message_, + FlBasicMessageChannelResponseHandle* response_handle, gpointer user_data) { + FirebaseDatabaseFirebaseDatabaseHostApi* self = + FIREBASE_DATABASE_FIREBASE_DATABASE_HOST_API(user_data); + + if (self->vtable == nullptr || self->vtable->query_get == nullptr) { + return; + } + + FlValue* value0 = fl_value_get_list_value(message_, 0); + FirebaseDatabaseDatabasePigeonFirebaseApp* app = + FIREBASE_DATABASE_DATABASE_PIGEON_FIREBASE_APP( + fl_value_get_custom_value_object(value0)); + FlValue* value1 = fl_value_get_list_value(message_, 1); + FirebaseDatabaseQueryRequest* request = + FIREBASE_DATABASE_QUERY_REQUEST(fl_value_get_custom_value_object(value1)); + g_autoptr(FirebaseDatabaseFirebaseDatabaseHostApiResponseHandle) handle = + firebase_database_firebase_database_host_api_response_handle_new( + channel, response_handle); + self->vtable->query_get(app, request, handle, self->user_data); +} + +void firebase_database_firebase_database_host_api_set_method_handlers( + FlBinaryMessenger* messenger, const gchar* suffix, + const FirebaseDatabaseFirebaseDatabaseHostApiVTable* vtable, + gpointer user_data, GDestroyNotify user_data_free_func) { + g_autofree gchar* dot_suffix = + suffix != nullptr ? g_strdup_printf(".%s", suffix) : g_strdup(""); + g_autoptr(FirebaseDatabaseFirebaseDatabaseHostApi) api_data = + firebase_database_firebase_database_host_api_new(vtable, user_data, + user_data_free_func); + + g_autoptr(FirebaseDatabaseMessageCodec) codec = + firebase_database_message_codec_new(); + g_autofree gchar* go_online_channel_name = g_strdup_printf( + "dev.flutter.pigeon.firebase_database_platform_interface." + "FirebaseDatabaseHostApi.goOnline%s", + dot_suffix); + g_autoptr(FlBasicMessageChannel) go_online_channel = + fl_basic_message_channel_new(messenger, go_online_channel_name, + FL_MESSAGE_CODEC(codec)); + fl_basic_message_channel_set_message_handler( + go_online_channel, + firebase_database_firebase_database_host_api_go_online_cb, + g_object_ref(api_data), g_object_unref); + g_autofree gchar* go_offline_channel_name = g_strdup_printf( + "dev.flutter.pigeon.firebase_database_platform_interface." + "FirebaseDatabaseHostApi.goOffline%s", + dot_suffix); + g_autoptr(FlBasicMessageChannel) go_offline_channel = + fl_basic_message_channel_new(messenger, go_offline_channel_name, + FL_MESSAGE_CODEC(codec)); + fl_basic_message_channel_set_message_handler( + go_offline_channel, + firebase_database_firebase_database_host_api_go_offline_cb, + g_object_ref(api_data), g_object_unref); + g_autofree gchar* set_persistence_enabled_channel_name = g_strdup_printf( + "dev.flutter.pigeon.firebase_database_platform_interface." + "FirebaseDatabaseHostApi.setPersistenceEnabled%s", + dot_suffix); + g_autoptr(FlBasicMessageChannel) set_persistence_enabled_channel = + fl_basic_message_channel_new(messenger, + set_persistence_enabled_channel_name, + FL_MESSAGE_CODEC(codec)); + fl_basic_message_channel_set_message_handler( + set_persistence_enabled_channel, + firebase_database_firebase_database_host_api_set_persistence_enabled_cb, + g_object_ref(api_data), g_object_unref); + g_autofree gchar* set_persistence_cache_size_bytes_channel_name = + g_strdup_printf( + "dev.flutter.pigeon.firebase_database_platform_interface." + "FirebaseDatabaseHostApi.setPersistenceCacheSizeBytes%s", + dot_suffix); + g_autoptr(FlBasicMessageChannel) set_persistence_cache_size_bytes_channel = + fl_basic_message_channel_new( + messenger, set_persistence_cache_size_bytes_channel_name, + FL_MESSAGE_CODEC(codec)); + fl_basic_message_channel_set_message_handler( + set_persistence_cache_size_bytes_channel, + firebase_database_firebase_database_host_api_set_persistence_cache_size_bytes_cb, + g_object_ref(api_data), g_object_unref); + g_autofree gchar* set_logging_enabled_channel_name = g_strdup_printf( + "dev.flutter.pigeon.firebase_database_platform_interface." + "FirebaseDatabaseHostApi.setLoggingEnabled%s", + dot_suffix); + g_autoptr(FlBasicMessageChannel) set_logging_enabled_channel = + fl_basic_message_channel_new(messenger, set_logging_enabled_channel_name, + FL_MESSAGE_CODEC(codec)); + fl_basic_message_channel_set_message_handler( + set_logging_enabled_channel, + firebase_database_firebase_database_host_api_set_logging_enabled_cb, + g_object_ref(api_data), g_object_unref); + g_autofree gchar* use_database_emulator_channel_name = g_strdup_printf( + "dev.flutter.pigeon.firebase_database_platform_interface." + "FirebaseDatabaseHostApi.useDatabaseEmulator%s", + dot_suffix); + g_autoptr(FlBasicMessageChannel) use_database_emulator_channel = + fl_basic_message_channel_new(messenger, + use_database_emulator_channel_name, + FL_MESSAGE_CODEC(codec)); + fl_basic_message_channel_set_message_handler( + use_database_emulator_channel, + firebase_database_firebase_database_host_api_use_database_emulator_cb, + g_object_ref(api_data), g_object_unref); + g_autofree gchar* ref_channel_name = g_strdup_printf( + "dev.flutter.pigeon.firebase_database_platform_interface." + "FirebaseDatabaseHostApi.ref%s", + dot_suffix); + g_autoptr(FlBasicMessageChannel) ref_channel = fl_basic_message_channel_new( + messenger, ref_channel_name, FL_MESSAGE_CODEC(codec)); + fl_basic_message_channel_set_message_handler( + ref_channel, firebase_database_firebase_database_host_api_ref_cb, + g_object_ref(api_data), g_object_unref); + g_autofree gchar* ref_from_u_r_l_channel_name = g_strdup_printf( + "dev.flutter.pigeon.firebase_database_platform_interface." + "FirebaseDatabaseHostApi.refFromURL%s", + dot_suffix); + g_autoptr(FlBasicMessageChannel) ref_from_u_r_l_channel = + fl_basic_message_channel_new(messenger, ref_from_u_r_l_channel_name, + FL_MESSAGE_CODEC(codec)); + fl_basic_message_channel_set_message_handler( + ref_from_u_r_l_channel, + firebase_database_firebase_database_host_api_ref_from_u_r_l_cb, + g_object_ref(api_data), g_object_unref); + g_autofree gchar* purge_outstanding_writes_channel_name = g_strdup_printf( + "dev.flutter.pigeon.firebase_database_platform_interface." + "FirebaseDatabaseHostApi.purgeOutstandingWrites%s", + dot_suffix); + g_autoptr(FlBasicMessageChannel) purge_outstanding_writes_channel = + fl_basic_message_channel_new(messenger, + purge_outstanding_writes_channel_name, + FL_MESSAGE_CODEC(codec)); + fl_basic_message_channel_set_message_handler( + purge_outstanding_writes_channel, + firebase_database_firebase_database_host_api_purge_outstanding_writes_cb, + g_object_ref(api_data), g_object_unref); + g_autofree gchar* database_reference_set_channel_name = g_strdup_printf( + "dev.flutter.pigeon.firebase_database_platform_interface." + "FirebaseDatabaseHostApi.databaseReferenceSet%s", + dot_suffix); + g_autoptr(FlBasicMessageChannel) database_reference_set_channel = + fl_basic_message_channel_new(messenger, + database_reference_set_channel_name, + FL_MESSAGE_CODEC(codec)); + fl_basic_message_channel_set_message_handler( + database_reference_set_channel, + firebase_database_firebase_database_host_api_database_reference_set_cb, + g_object_ref(api_data), g_object_unref); + g_autofree gchar* database_reference_set_with_priority_channel_name = + g_strdup_printf( + "dev.flutter.pigeon.firebase_database_platform_interface." + "FirebaseDatabaseHostApi.databaseReferenceSetWithPriority%s", + dot_suffix); + g_autoptr(FlBasicMessageChannel) + database_reference_set_with_priority_channel = + fl_basic_message_channel_new( + messenger, database_reference_set_with_priority_channel_name, + FL_MESSAGE_CODEC(codec)); + fl_basic_message_channel_set_message_handler( + database_reference_set_with_priority_channel, + firebase_database_firebase_database_host_api_database_reference_set_with_priority_cb, + g_object_ref(api_data), g_object_unref); + g_autofree gchar* database_reference_update_channel_name = g_strdup_printf( + "dev.flutter.pigeon.firebase_database_platform_interface." + "FirebaseDatabaseHostApi.databaseReferenceUpdate%s", + dot_suffix); + g_autoptr(FlBasicMessageChannel) database_reference_update_channel = + fl_basic_message_channel_new(messenger, + database_reference_update_channel_name, + FL_MESSAGE_CODEC(codec)); + fl_basic_message_channel_set_message_handler( + database_reference_update_channel, + firebase_database_firebase_database_host_api_database_reference_update_cb, + g_object_ref(api_data), g_object_unref); + g_autofree gchar* database_reference_set_priority_channel_name = + g_strdup_printf( + "dev.flutter.pigeon.firebase_database_platform_interface." + "FirebaseDatabaseHostApi.databaseReferenceSetPriority%s", + dot_suffix); + g_autoptr(FlBasicMessageChannel) database_reference_set_priority_channel = + fl_basic_message_channel_new(messenger, + database_reference_set_priority_channel_name, + FL_MESSAGE_CODEC(codec)); + fl_basic_message_channel_set_message_handler( + database_reference_set_priority_channel, + firebase_database_firebase_database_host_api_database_reference_set_priority_cb, + g_object_ref(api_data), g_object_unref); + g_autofree gchar* database_reference_run_transaction_channel_name = + g_strdup_printf( + "dev.flutter.pigeon.firebase_database_platform_interface." + "FirebaseDatabaseHostApi.databaseReferenceRunTransaction%s", + dot_suffix); + g_autoptr(FlBasicMessageChannel) database_reference_run_transaction_channel = + fl_basic_message_channel_new( + messenger, database_reference_run_transaction_channel_name, + FL_MESSAGE_CODEC(codec)); + fl_basic_message_channel_set_message_handler( + database_reference_run_transaction_channel, + firebase_database_firebase_database_host_api_database_reference_run_transaction_cb, + g_object_ref(api_data), g_object_unref); + g_autofree gchar* database_reference_get_transaction_result_channel_name = + g_strdup_printf( + "dev.flutter.pigeon.firebase_database_platform_interface." + "FirebaseDatabaseHostApi.databaseReferenceGetTransactionResult%s", + dot_suffix); + g_autoptr(FlBasicMessageChannel) + database_reference_get_transaction_result_channel = + fl_basic_message_channel_new( + messenger, database_reference_get_transaction_result_channel_name, + FL_MESSAGE_CODEC(codec)); + fl_basic_message_channel_set_message_handler( + database_reference_get_transaction_result_channel, + firebase_database_firebase_database_host_api_database_reference_get_transaction_result_cb, + g_object_ref(api_data), g_object_unref); + g_autofree gchar* on_disconnect_set_channel_name = g_strdup_printf( + "dev.flutter.pigeon.firebase_database_platform_interface." + "FirebaseDatabaseHostApi.onDisconnectSet%s", + dot_suffix); + g_autoptr(FlBasicMessageChannel) on_disconnect_set_channel = + fl_basic_message_channel_new(messenger, on_disconnect_set_channel_name, + FL_MESSAGE_CODEC(codec)); + fl_basic_message_channel_set_message_handler( + on_disconnect_set_channel, + firebase_database_firebase_database_host_api_on_disconnect_set_cb, + g_object_ref(api_data), g_object_unref); + g_autofree gchar* on_disconnect_set_with_priority_channel_name = + g_strdup_printf( + "dev.flutter.pigeon.firebase_database_platform_interface." + "FirebaseDatabaseHostApi.onDisconnectSetWithPriority%s", + dot_suffix); + g_autoptr(FlBasicMessageChannel) on_disconnect_set_with_priority_channel = + fl_basic_message_channel_new(messenger, + on_disconnect_set_with_priority_channel_name, + FL_MESSAGE_CODEC(codec)); + fl_basic_message_channel_set_message_handler( + on_disconnect_set_with_priority_channel, + firebase_database_firebase_database_host_api_on_disconnect_set_with_priority_cb, + g_object_ref(api_data), g_object_unref); + g_autofree gchar* on_disconnect_update_channel_name = g_strdup_printf( + "dev.flutter.pigeon.firebase_database_platform_interface." + "FirebaseDatabaseHostApi.onDisconnectUpdate%s", + dot_suffix); + g_autoptr(FlBasicMessageChannel) on_disconnect_update_channel = + fl_basic_message_channel_new(messenger, on_disconnect_update_channel_name, + FL_MESSAGE_CODEC(codec)); + fl_basic_message_channel_set_message_handler( + on_disconnect_update_channel, + firebase_database_firebase_database_host_api_on_disconnect_update_cb, + g_object_ref(api_data), g_object_unref); + g_autofree gchar* on_disconnect_cancel_channel_name = g_strdup_printf( + "dev.flutter.pigeon.firebase_database_platform_interface." + "FirebaseDatabaseHostApi.onDisconnectCancel%s", + dot_suffix); + g_autoptr(FlBasicMessageChannel) on_disconnect_cancel_channel = + fl_basic_message_channel_new(messenger, on_disconnect_cancel_channel_name, + FL_MESSAGE_CODEC(codec)); + fl_basic_message_channel_set_message_handler( + on_disconnect_cancel_channel, + firebase_database_firebase_database_host_api_on_disconnect_cancel_cb, + g_object_ref(api_data), g_object_unref); + g_autofree gchar* query_observe_channel_name = g_strdup_printf( + "dev.flutter.pigeon.firebase_database_platform_interface." + "FirebaseDatabaseHostApi.queryObserve%s", + dot_suffix); + g_autoptr(FlBasicMessageChannel) query_observe_channel = + fl_basic_message_channel_new(messenger, query_observe_channel_name, + FL_MESSAGE_CODEC(codec)); + fl_basic_message_channel_set_message_handler( + query_observe_channel, + firebase_database_firebase_database_host_api_query_observe_cb, + g_object_ref(api_data), g_object_unref); + g_autofree gchar* query_keep_synced_channel_name = g_strdup_printf( + "dev.flutter.pigeon.firebase_database_platform_interface." + "FirebaseDatabaseHostApi.queryKeepSynced%s", + dot_suffix); + g_autoptr(FlBasicMessageChannel) query_keep_synced_channel = + fl_basic_message_channel_new(messenger, query_keep_synced_channel_name, + FL_MESSAGE_CODEC(codec)); + fl_basic_message_channel_set_message_handler( + query_keep_synced_channel, + firebase_database_firebase_database_host_api_query_keep_synced_cb, + g_object_ref(api_data), g_object_unref); + g_autofree gchar* query_get_channel_name = g_strdup_printf( + "dev.flutter.pigeon.firebase_database_platform_interface." + "FirebaseDatabaseHostApi.queryGet%s", + dot_suffix); + g_autoptr(FlBasicMessageChannel) query_get_channel = + fl_basic_message_channel_new(messenger, query_get_channel_name, + FL_MESSAGE_CODEC(codec)); + fl_basic_message_channel_set_message_handler( + query_get_channel, + firebase_database_firebase_database_host_api_query_get_cb, + g_object_ref(api_data), g_object_unref); +} + +void firebase_database_firebase_database_host_api_clear_method_handlers( + FlBinaryMessenger* messenger, const gchar* suffix) { + g_autofree gchar* dot_suffix = + suffix != nullptr ? g_strdup_printf(".%s", suffix) : g_strdup(""); + + g_autoptr(FirebaseDatabaseMessageCodec) codec = + firebase_database_message_codec_new(); + g_autofree gchar* go_online_channel_name = g_strdup_printf( + "dev.flutter.pigeon.firebase_database_platform_interface." + "FirebaseDatabaseHostApi.goOnline%s", + dot_suffix); + g_autoptr(FlBasicMessageChannel) go_online_channel = + fl_basic_message_channel_new(messenger, go_online_channel_name, + FL_MESSAGE_CODEC(codec)); + fl_basic_message_channel_set_message_handler(go_online_channel, nullptr, + nullptr, nullptr); + g_autofree gchar* go_offline_channel_name = g_strdup_printf( + "dev.flutter.pigeon.firebase_database_platform_interface." + "FirebaseDatabaseHostApi.goOffline%s", + dot_suffix); + g_autoptr(FlBasicMessageChannel) go_offline_channel = + fl_basic_message_channel_new(messenger, go_offline_channel_name, + FL_MESSAGE_CODEC(codec)); + fl_basic_message_channel_set_message_handler(go_offline_channel, nullptr, + nullptr, nullptr); + g_autofree gchar* set_persistence_enabled_channel_name = g_strdup_printf( + "dev.flutter.pigeon.firebase_database_platform_interface." + "FirebaseDatabaseHostApi.setPersistenceEnabled%s", + dot_suffix); + g_autoptr(FlBasicMessageChannel) set_persistence_enabled_channel = + fl_basic_message_channel_new(messenger, + set_persistence_enabled_channel_name, + FL_MESSAGE_CODEC(codec)); + fl_basic_message_channel_set_message_handler(set_persistence_enabled_channel, + nullptr, nullptr, nullptr); + g_autofree gchar* set_persistence_cache_size_bytes_channel_name = + g_strdup_printf( + "dev.flutter.pigeon.firebase_database_platform_interface." + "FirebaseDatabaseHostApi.setPersistenceCacheSizeBytes%s", + dot_suffix); + g_autoptr(FlBasicMessageChannel) set_persistence_cache_size_bytes_channel = + fl_basic_message_channel_new( + messenger, set_persistence_cache_size_bytes_channel_name, + FL_MESSAGE_CODEC(codec)); + fl_basic_message_channel_set_message_handler( + set_persistence_cache_size_bytes_channel, nullptr, nullptr, nullptr); + g_autofree gchar* set_logging_enabled_channel_name = g_strdup_printf( + "dev.flutter.pigeon.firebase_database_platform_interface." + "FirebaseDatabaseHostApi.setLoggingEnabled%s", + dot_suffix); + g_autoptr(FlBasicMessageChannel) set_logging_enabled_channel = + fl_basic_message_channel_new(messenger, set_logging_enabled_channel_name, + FL_MESSAGE_CODEC(codec)); + fl_basic_message_channel_set_message_handler(set_logging_enabled_channel, + nullptr, nullptr, nullptr); + g_autofree gchar* use_database_emulator_channel_name = g_strdup_printf( + "dev.flutter.pigeon.firebase_database_platform_interface." + "FirebaseDatabaseHostApi.useDatabaseEmulator%s", + dot_suffix); + g_autoptr(FlBasicMessageChannel) use_database_emulator_channel = + fl_basic_message_channel_new(messenger, + use_database_emulator_channel_name, + FL_MESSAGE_CODEC(codec)); + fl_basic_message_channel_set_message_handler(use_database_emulator_channel, + nullptr, nullptr, nullptr); + g_autofree gchar* ref_channel_name = g_strdup_printf( + "dev.flutter.pigeon.firebase_database_platform_interface." + "FirebaseDatabaseHostApi.ref%s", + dot_suffix); + g_autoptr(FlBasicMessageChannel) ref_channel = fl_basic_message_channel_new( + messenger, ref_channel_name, FL_MESSAGE_CODEC(codec)); + fl_basic_message_channel_set_message_handler(ref_channel, nullptr, nullptr, + nullptr); + g_autofree gchar* ref_from_u_r_l_channel_name = g_strdup_printf( + "dev.flutter.pigeon.firebase_database_platform_interface." + "FirebaseDatabaseHostApi.refFromURL%s", + dot_suffix); + g_autoptr(FlBasicMessageChannel) ref_from_u_r_l_channel = + fl_basic_message_channel_new(messenger, ref_from_u_r_l_channel_name, + FL_MESSAGE_CODEC(codec)); + fl_basic_message_channel_set_message_handler(ref_from_u_r_l_channel, nullptr, + nullptr, nullptr); + g_autofree gchar* purge_outstanding_writes_channel_name = g_strdup_printf( + "dev.flutter.pigeon.firebase_database_platform_interface." + "FirebaseDatabaseHostApi.purgeOutstandingWrites%s", + dot_suffix); + g_autoptr(FlBasicMessageChannel) purge_outstanding_writes_channel = + fl_basic_message_channel_new(messenger, + purge_outstanding_writes_channel_name, + FL_MESSAGE_CODEC(codec)); + fl_basic_message_channel_set_message_handler(purge_outstanding_writes_channel, + nullptr, nullptr, nullptr); + g_autofree gchar* database_reference_set_channel_name = g_strdup_printf( + "dev.flutter.pigeon.firebase_database_platform_interface." + "FirebaseDatabaseHostApi.databaseReferenceSet%s", + dot_suffix); + g_autoptr(FlBasicMessageChannel) database_reference_set_channel = + fl_basic_message_channel_new(messenger, + database_reference_set_channel_name, + FL_MESSAGE_CODEC(codec)); + fl_basic_message_channel_set_message_handler(database_reference_set_channel, + nullptr, nullptr, nullptr); + g_autofree gchar* database_reference_set_with_priority_channel_name = + g_strdup_printf( + "dev.flutter.pigeon.firebase_database_platform_interface." + "FirebaseDatabaseHostApi.databaseReferenceSetWithPriority%s", + dot_suffix); + g_autoptr(FlBasicMessageChannel) + database_reference_set_with_priority_channel = + fl_basic_message_channel_new( + messenger, database_reference_set_with_priority_channel_name, + FL_MESSAGE_CODEC(codec)); + fl_basic_message_channel_set_message_handler( + database_reference_set_with_priority_channel, nullptr, nullptr, nullptr); + g_autofree gchar* database_reference_update_channel_name = g_strdup_printf( + "dev.flutter.pigeon.firebase_database_platform_interface." + "FirebaseDatabaseHostApi.databaseReferenceUpdate%s", + dot_suffix); + g_autoptr(FlBasicMessageChannel) database_reference_update_channel = + fl_basic_message_channel_new(messenger, + database_reference_update_channel_name, + FL_MESSAGE_CODEC(codec)); + fl_basic_message_channel_set_message_handler( + database_reference_update_channel, nullptr, nullptr, nullptr); + g_autofree gchar* database_reference_set_priority_channel_name = + g_strdup_printf( + "dev.flutter.pigeon.firebase_database_platform_interface." + "FirebaseDatabaseHostApi.databaseReferenceSetPriority%s", + dot_suffix); + g_autoptr(FlBasicMessageChannel) database_reference_set_priority_channel = + fl_basic_message_channel_new(messenger, + database_reference_set_priority_channel_name, + FL_MESSAGE_CODEC(codec)); + fl_basic_message_channel_set_message_handler( + database_reference_set_priority_channel, nullptr, nullptr, nullptr); + g_autofree gchar* database_reference_run_transaction_channel_name = + g_strdup_printf( + "dev.flutter.pigeon.firebase_database_platform_interface." + "FirebaseDatabaseHostApi.databaseReferenceRunTransaction%s", + dot_suffix); + g_autoptr(FlBasicMessageChannel) database_reference_run_transaction_channel = + fl_basic_message_channel_new( + messenger, database_reference_run_transaction_channel_name, + FL_MESSAGE_CODEC(codec)); + fl_basic_message_channel_set_message_handler( + database_reference_run_transaction_channel, nullptr, nullptr, nullptr); + g_autofree gchar* database_reference_get_transaction_result_channel_name = + g_strdup_printf( + "dev.flutter.pigeon.firebase_database_platform_interface." + "FirebaseDatabaseHostApi.databaseReferenceGetTransactionResult%s", + dot_suffix); + g_autoptr(FlBasicMessageChannel) + database_reference_get_transaction_result_channel = + fl_basic_message_channel_new( + messenger, database_reference_get_transaction_result_channel_name, + FL_MESSAGE_CODEC(codec)); + fl_basic_message_channel_set_message_handler( + database_reference_get_transaction_result_channel, nullptr, nullptr, + nullptr); + g_autofree gchar* on_disconnect_set_channel_name = g_strdup_printf( + "dev.flutter.pigeon.firebase_database_platform_interface." + "FirebaseDatabaseHostApi.onDisconnectSet%s", + dot_suffix); + g_autoptr(FlBasicMessageChannel) on_disconnect_set_channel = + fl_basic_message_channel_new(messenger, on_disconnect_set_channel_name, + FL_MESSAGE_CODEC(codec)); + fl_basic_message_channel_set_message_handler(on_disconnect_set_channel, + nullptr, nullptr, nullptr); + g_autofree gchar* on_disconnect_set_with_priority_channel_name = + g_strdup_printf( + "dev.flutter.pigeon.firebase_database_platform_interface." + "FirebaseDatabaseHostApi.onDisconnectSetWithPriority%s", + dot_suffix); + g_autoptr(FlBasicMessageChannel) on_disconnect_set_with_priority_channel = + fl_basic_message_channel_new(messenger, + on_disconnect_set_with_priority_channel_name, + FL_MESSAGE_CODEC(codec)); + fl_basic_message_channel_set_message_handler( + on_disconnect_set_with_priority_channel, nullptr, nullptr, nullptr); + g_autofree gchar* on_disconnect_update_channel_name = g_strdup_printf( + "dev.flutter.pigeon.firebase_database_platform_interface." + "FirebaseDatabaseHostApi.onDisconnectUpdate%s", + dot_suffix); + g_autoptr(FlBasicMessageChannel) on_disconnect_update_channel = + fl_basic_message_channel_new(messenger, on_disconnect_update_channel_name, + FL_MESSAGE_CODEC(codec)); + fl_basic_message_channel_set_message_handler(on_disconnect_update_channel, + nullptr, nullptr, nullptr); + g_autofree gchar* on_disconnect_cancel_channel_name = g_strdup_printf( + "dev.flutter.pigeon.firebase_database_platform_interface." + "FirebaseDatabaseHostApi.onDisconnectCancel%s", + dot_suffix); + g_autoptr(FlBasicMessageChannel) on_disconnect_cancel_channel = + fl_basic_message_channel_new(messenger, on_disconnect_cancel_channel_name, + FL_MESSAGE_CODEC(codec)); + fl_basic_message_channel_set_message_handler(on_disconnect_cancel_channel, + nullptr, nullptr, nullptr); + g_autofree gchar* query_observe_channel_name = g_strdup_printf( + "dev.flutter.pigeon.firebase_database_platform_interface." + "FirebaseDatabaseHostApi.queryObserve%s", + dot_suffix); + g_autoptr(FlBasicMessageChannel) query_observe_channel = + fl_basic_message_channel_new(messenger, query_observe_channel_name, + FL_MESSAGE_CODEC(codec)); + fl_basic_message_channel_set_message_handler(query_observe_channel, nullptr, + nullptr, nullptr); + g_autofree gchar* query_keep_synced_channel_name = g_strdup_printf( + "dev.flutter.pigeon.firebase_database_platform_interface." + "FirebaseDatabaseHostApi.queryKeepSynced%s", + dot_suffix); + g_autoptr(FlBasicMessageChannel) query_keep_synced_channel = + fl_basic_message_channel_new(messenger, query_keep_synced_channel_name, + FL_MESSAGE_CODEC(codec)); + fl_basic_message_channel_set_message_handler(query_keep_synced_channel, + nullptr, nullptr, nullptr); + g_autofree gchar* query_get_channel_name = g_strdup_printf( + "dev.flutter.pigeon.firebase_database_platform_interface." + "FirebaseDatabaseHostApi.queryGet%s", + dot_suffix); + g_autoptr(FlBasicMessageChannel) query_get_channel = + fl_basic_message_channel_new(messenger, query_get_channel_name, + FL_MESSAGE_CODEC(codec)); + fl_basic_message_channel_set_message_handler(query_get_channel, nullptr, + nullptr, nullptr); +} + +void firebase_database_firebase_database_host_api_respond_go_online( + FirebaseDatabaseFirebaseDatabaseHostApiResponseHandle* response_handle) { + g_autoptr(FirebaseDatabaseFirebaseDatabaseHostApiGoOnlineResponse) response = + firebase_database_firebase_database_host_api_go_online_response_new(); + g_autoptr(GError) error = nullptr; + if (!fl_basic_message_channel_respond(response_handle->channel, + response_handle->response_handle, + response->value, &error)) { + g_warning("Failed to send response to %s.%s: %s", "FirebaseDatabaseHostApi", + "goOnline", error->message); + } +} + +void firebase_database_firebase_database_host_api_respond_error_go_online( + FirebaseDatabaseFirebaseDatabaseHostApiResponseHandle* response_handle, + const gchar* code, const gchar* message, FlValue* details) { + g_autoptr(FirebaseDatabaseFirebaseDatabaseHostApiGoOnlineResponse) response = + firebase_database_firebase_database_host_api_go_online_response_new_error( + code, message, details); + g_autoptr(GError) error = nullptr; + if (!fl_basic_message_channel_respond(response_handle->channel, + response_handle->response_handle, + response->value, &error)) { + g_warning("Failed to send response to %s.%s: %s", "FirebaseDatabaseHostApi", + "goOnline", error->message); + } +} + +void firebase_database_firebase_database_host_api_respond_go_offline( + FirebaseDatabaseFirebaseDatabaseHostApiResponseHandle* response_handle) { + g_autoptr(FirebaseDatabaseFirebaseDatabaseHostApiGoOfflineResponse) response = + firebase_database_firebase_database_host_api_go_offline_response_new(); + g_autoptr(GError) error = nullptr; + if (!fl_basic_message_channel_respond(response_handle->channel, + response_handle->response_handle, + response->value, &error)) { + g_warning("Failed to send response to %s.%s: %s", "FirebaseDatabaseHostApi", + "goOffline", error->message); + } +} + +void firebase_database_firebase_database_host_api_respond_error_go_offline( + FirebaseDatabaseFirebaseDatabaseHostApiResponseHandle* response_handle, + const gchar* code, const gchar* message, FlValue* details) { + g_autoptr(FirebaseDatabaseFirebaseDatabaseHostApiGoOfflineResponse) response = + firebase_database_firebase_database_host_api_go_offline_response_new_error( + code, message, details); + g_autoptr(GError) error = nullptr; + if (!fl_basic_message_channel_respond(response_handle->channel, + response_handle->response_handle, + response->value, &error)) { + g_warning("Failed to send response to %s.%s: %s", "FirebaseDatabaseHostApi", + "goOffline", error->message); + } +} + +void firebase_database_firebase_database_host_api_respond_set_persistence_enabled( + FirebaseDatabaseFirebaseDatabaseHostApiResponseHandle* response_handle) { + g_autoptr( + FirebaseDatabaseFirebaseDatabaseHostApiSetPersistenceEnabledResponse) response = + firebase_database_firebase_database_host_api_set_persistence_enabled_response_new(); + g_autoptr(GError) error = nullptr; + if (!fl_basic_message_channel_respond(response_handle->channel, + response_handle->response_handle, + response->value, &error)) { + g_warning("Failed to send response to %s.%s: %s", "FirebaseDatabaseHostApi", + "setPersistenceEnabled", error->message); + } +} + +void firebase_database_firebase_database_host_api_respond_error_set_persistence_enabled( + FirebaseDatabaseFirebaseDatabaseHostApiResponseHandle* response_handle, + const gchar* code, const gchar* message, FlValue* details) { + g_autoptr( + FirebaseDatabaseFirebaseDatabaseHostApiSetPersistenceEnabledResponse) + response = + firebase_database_firebase_database_host_api_set_persistence_enabled_response_new_error( + code, message, details); + g_autoptr(GError) error = nullptr; + if (!fl_basic_message_channel_respond(response_handle->channel, + response_handle->response_handle, + response->value, &error)) { + g_warning("Failed to send response to %s.%s: %s", "FirebaseDatabaseHostApi", + "setPersistenceEnabled", error->message); + } +} + +void firebase_database_firebase_database_host_api_respond_set_persistence_cache_size_bytes( + FirebaseDatabaseFirebaseDatabaseHostApiResponseHandle* response_handle) { + g_autoptr( + FirebaseDatabaseFirebaseDatabaseHostApiSetPersistenceCacheSizeBytesResponse) + response = + firebase_database_firebase_database_host_api_set_persistence_cache_size_bytes_response_new(); + g_autoptr(GError) error = nullptr; + if (!fl_basic_message_channel_respond(response_handle->channel, + response_handle->response_handle, + response->value, &error)) { + g_warning("Failed to send response to %s.%s: %s", "FirebaseDatabaseHostApi", + "setPersistenceCacheSizeBytes", error->message); + } +} + +void firebase_database_firebase_database_host_api_respond_error_set_persistence_cache_size_bytes( + FirebaseDatabaseFirebaseDatabaseHostApiResponseHandle* response_handle, + const gchar* code, const gchar* message, FlValue* details) { + g_autoptr( + FirebaseDatabaseFirebaseDatabaseHostApiSetPersistenceCacheSizeBytesResponse) + response = + firebase_database_firebase_database_host_api_set_persistence_cache_size_bytes_response_new_error( + code, message, details); + g_autoptr(GError) error = nullptr; + if (!fl_basic_message_channel_respond(response_handle->channel, + response_handle->response_handle, + response->value, &error)) { + g_warning("Failed to send response to %s.%s: %s", "FirebaseDatabaseHostApi", + "setPersistenceCacheSizeBytes", error->message); + } +} + +void firebase_database_firebase_database_host_api_respond_set_logging_enabled( + FirebaseDatabaseFirebaseDatabaseHostApiResponseHandle* response_handle) { + g_autoptr( + FirebaseDatabaseFirebaseDatabaseHostApiSetLoggingEnabledResponse) response = + firebase_database_firebase_database_host_api_set_logging_enabled_response_new(); + g_autoptr(GError) error = nullptr; + if (!fl_basic_message_channel_respond(response_handle->channel, + response_handle->response_handle, + response->value, &error)) { + g_warning("Failed to send response to %s.%s: %s", "FirebaseDatabaseHostApi", + "setLoggingEnabled", error->message); + } +} + +void firebase_database_firebase_database_host_api_respond_error_set_logging_enabled( + FirebaseDatabaseFirebaseDatabaseHostApiResponseHandle* response_handle, + const gchar* code, const gchar* message, FlValue* details) { + g_autoptr( + FirebaseDatabaseFirebaseDatabaseHostApiSetLoggingEnabledResponse) response = + firebase_database_firebase_database_host_api_set_logging_enabled_response_new_error( + code, message, details); + g_autoptr(GError) error = nullptr; + if (!fl_basic_message_channel_respond(response_handle->channel, + response_handle->response_handle, + response->value, &error)) { + g_warning("Failed to send response to %s.%s: %s", "FirebaseDatabaseHostApi", + "setLoggingEnabled", error->message); + } +} + +void firebase_database_firebase_database_host_api_respond_use_database_emulator( + FirebaseDatabaseFirebaseDatabaseHostApiResponseHandle* response_handle) { + g_autoptr( + FirebaseDatabaseFirebaseDatabaseHostApiUseDatabaseEmulatorResponse) response = + firebase_database_firebase_database_host_api_use_database_emulator_response_new(); + g_autoptr(GError) error = nullptr; + if (!fl_basic_message_channel_respond(response_handle->channel, + response_handle->response_handle, + response->value, &error)) { + g_warning("Failed to send response to %s.%s: %s", "FirebaseDatabaseHostApi", + "useDatabaseEmulator", error->message); + } +} + +void firebase_database_firebase_database_host_api_respond_error_use_database_emulator( + FirebaseDatabaseFirebaseDatabaseHostApiResponseHandle* response_handle, + const gchar* code, const gchar* message, FlValue* details) { + g_autoptr( + FirebaseDatabaseFirebaseDatabaseHostApiUseDatabaseEmulatorResponse) response = + firebase_database_firebase_database_host_api_use_database_emulator_response_new_error( + code, message, details); + g_autoptr(GError) error = nullptr; + if (!fl_basic_message_channel_respond(response_handle->channel, + response_handle->response_handle, + response->value, &error)) { + g_warning("Failed to send response to %s.%s: %s", "FirebaseDatabaseHostApi", + "useDatabaseEmulator", error->message); + } +} + +void firebase_database_firebase_database_host_api_respond_ref( + FirebaseDatabaseFirebaseDatabaseHostApiResponseHandle* response_handle, + FirebaseDatabaseDatabaseReferencePlatform* return_value) { + g_autoptr(FirebaseDatabaseFirebaseDatabaseHostApiRefResponse) response = + firebase_database_firebase_database_host_api_ref_response_new( + return_value); + g_autoptr(GError) error = nullptr; + if (!fl_basic_message_channel_respond(response_handle->channel, + response_handle->response_handle, + response->value, &error)) { + g_warning("Failed to send response to %s.%s: %s", "FirebaseDatabaseHostApi", + "ref", error->message); + } +} + +void firebase_database_firebase_database_host_api_respond_error_ref( + FirebaseDatabaseFirebaseDatabaseHostApiResponseHandle* response_handle, + const gchar* code, const gchar* message, FlValue* details) { + g_autoptr(FirebaseDatabaseFirebaseDatabaseHostApiRefResponse) response = + firebase_database_firebase_database_host_api_ref_response_new_error( + code, message, details); + g_autoptr(GError) error = nullptr; + if (!fl_basic_message_channel_respond(response_handle->channel, + response_handle->response_handle, + response->value, &error)) { + g_warning("Failed to send response to %s.%s: %s", "FirebaseDatabaseHostApi", + "ref", error->message); + } +} + +void firebase_database_firebase_database_host_api_respond_ref_from_u_r_l( + FirebaseDatabaseFirebaseDatabaseHostApiResponseHandle* response_handle, + FirebaseDatabaseDatabaseReferencePlatform* return_value) { + g_autoptr( + FirebaseDatabaseFirebaseDatabaseHostApiRefFromURLResponse) response = + firebase_database_firebase_database_host_api_ref_from_u_r_l_response_new( + return_value); + g_autoptr(GError) error = nullptr; + if (!fl_basic_message_channel_respond(response_handle->channel, + response_handle->response_handle, + response->value, &error)) { + g_warning("Failed to send response to %s.%s: %s", "FirebaseDatabaseHostApi", + "refFromURL", error->message); + } +} + +void firebase_database_firebase_database_host_api_respond_error_ref_from_u_r_l( + FirebaseDatabaseFirebaseDatabaseHostApiResponseHandle* response_handle, + const gchar* code, const gchar* message, FlValue* details) { + g_autoptr( + FirebaseDatabaseFirebaseDatabaseHostApiRefFromURLResponse) response = + firebase_database_firebase_database_host_api_ref_from_u_r_l_response_new_error( + code, message, details); + g_autoptr(GError) error = nullptr; + if (!fl_basic_message_channel_respond(response_handle->channel, + response_handle->response_handle, + response->value, &error)) { + g_warning("Failed to send response to %s.%s: %s", "FirebaseDatabaseHostApi", + "refFromURL", error->message); + } +} + +void firebase_database_firebase_database_host_api_respond_purge_outstanding_writes( + FirebaseDatabaseFirebaseDatabaseHostApiResponseHandle* response_handle) { + g_autoptr( + FirebaseDatabaseFirebaseDatabaseHostApiPurgeOutstandingWritesResponse) response = + firebase_database_firebase_database_host_api_purge_outstanding_writes_response_new(); + g_autoptr(GError) error = nullptr; + if (!fl_basic_message_channel_respond(response_handle->channel, + response_handle->response_handle, + response->value, &error)) { + g_warning("Failed to send response to %s.%s: %s", "FirebaseDatabaseHostApi", + "purgeOutstandingWrites", error->message); + } +} + +void firebase_database_firebase_database_host_api_respond_error_purge_outstanding_writes( + FirebaseDatabaseFirebaseDatabaseHostApiResponseHandle* response_handle, + const gchar* code, const gchar* message, FlValue* details) { + g_autoptr( + FirebaseDatabaseFirebaseDatabaseHostApiPurgeOutstandingWritesResponse) + response = + firebase_database_firebase_database_host_api_purge_outstanding_writes_response_new_error( + code, message, details); + g_autoptr(GError) error = nullptr; + if (!fl_basic_message_channel_respond(response_handle->channel, + response_handle->response_handle, + response->value, &error)) { + g_warning("Failed to send response to %s.%s: %s", "FirebaseDatabaseHostApi", + "purgeOutstandingWrites", error->message); + } +} + +void firebase_database_firebase_database_host_api_respond_database_reference_set( + FirebaseDatabaseFirebaseDatabaseHostApiResponseHandle* response_handle) { + g_autoptr( + FirebaseDatabaseFirebaseDatabaseHostApiDatabaseReferenceSetResponse) response = + firebase_database_firebase_database_host_api_database_reference_set_response_new(); + g_autoptr(GError) error = nullptr; + if (!fl_basic_message_channel_respond(response_handle->channel, + response_handle->response_handle, + response->value, &error)) { + g_warning("Failed to send response to %s.%s: %s", "FirebaseDatabaseHostApi", + "databaseReferenceSet", error->message); + } +} + +void firebase_database_firebase_database_host_api_respond_error_database_reference_set( + FirebaseDatabaseFirebaseDatabaseHostApiResponseHandle* response_handle, + const gchar* code, const gchar* message, FlValue* details) { + g_autoptr(FirebaseDatabaseFirebaseDatabaseHostApiDatabaseReferenceSetResponse) + response = + firebase_database_firebase_database_host_api_database_reference_set_response_new_error( + code, message, details); + g_autoptr(GError) error = nullptr; + if (!fl_basic_message_channel_respond(response_handle->channel, + response_handle->response_handle, + response->value, &error)) { + g_warning("Failed to send response to %s.%s: %s", "FirebaseDatabaseHostApi", + "databaseReferenceSet", error->message); + } +} + +void firebase_database_firebase_database_host_api_respond_database_reference_set_with_priority( + FirebaseDatabaseFirebaseDatabaseHostApiResponseHandle* response_handle) { + g_autoptr( + FirebaseDatabaseFirebaseDatabaseHostApiDatabaseReferenceSetWithPriorityResponse) + response = + firebase_database_firebase_database_host_api_database_reference_set_with_priority_response_new(); + g_autoptr(GError) error = nullptr; + if (!fl_basic_message_channel_respond(response_handle->channel, + response_handle->response_handle, + response->value, &error)) { + g_warning("Failed to send response to %s.%s: %s", "FirebaseDatabaseHostApi", + "databaseReferenceSetWithPriority", error->message); + } +} + +void firebase_database_firebase_database_host_api_respond_error_database_reference_set_with_priority( + FirebaseDatabaseFirebaseDatabaseHostApiResponseHandle* response_handle, + const gchar* code, const gchar* message, FlValue* details) { + g_autoptr( + FirebaseDatabaseFirebaseDatabaseHostApiDatabaseReferenceSetWithPriorityResponse) + response = + firebase_database_firebase_database_host_api_database_reference_set_with_priority_response_new_error( + code, message, details); + g_autoptr(GError) error = nullptr; + if (!fl_basic_message_channel_respond(response_handle->channel, + response_handle->response_handle, + response->value, &error)) { + g_warning("Failed to send response to %s.%s: %s", "FirebaseDatabaseHostApi", + "databaseReferenceSetWithPriority", error->message); + } +} + +void firebase_database_firebase_database_host_api_respond_database_reference_update( + FirebaseDatabaseFirebaseDatabaseHostApiResponseHandle* response_handle) { + g_autoptr( + FirebaseDatabaseFirebaseDatabaseHostApiDatabaseReferenceUpdateResponse) response = + firebase_database_firebase_database_host_api_database_reference_update_response_new(); + g_autoptr(GError) error = nullptr; + if (!fl_basic_message_channel_respond(response_handle->channel, + response_handle->response_handle, + response->value, &error)) { + g_warning("Failed to send response to %s.%s: %s", "FirebaseDatabaseHostApi", + "databaseReferenceUpdate", error->message); + } +} + +void firebase_database_firebase_database_host_api_respond_error_database_reference_update( + FirebaseDatabaseFirebaseDatabaseHostApiResponseHandle* response_handle, + const gchar* code, const gchar* message, FlValue* details) { + g_autoptr( + FirebaseDatabaseFirebaseDatabaseHostApiDatabaseReferenceUpdateResponse) + response = + firebase_database_firebase_database_host_api_database_reference_update_response_new_error( + code, message, details); + g_autoptr(GError) error = nullptr; + if (!fl_basic_message_channel_respond(response_handle->channel, + response_handle->response_handle, + response->value, &error)) { + g_warning("Failed to send response to %s.%s: %s", "FirebaseDatabaseHostApi", + "databaseReferenceUpdate", error->message); + } +} + +void firebase_database_firebase_database_host_api_respond_database_reference_set_priority( + FirebaseDatabaseFirebaseDatabaseHostApiResponseHandle* response_handle) { + g_autoptr( + FirebaseDatabaseFirebaseDatabaseHostApiDatabaseReferenceSetPriorityResponse) + response = + firebase_database_firebase_database_host_api_database_reference_set_priority_response_new(); + g_autoptr(GError) error = nullptr; + if (!fl_basic_message_channel_respond(response_handle->channel, + response_handle->response_handle, + response->value, &error)) { + g_warning("Failed to send response to %s.%s: %s", "FirebaseDatabaseHostApi", + "databaseReferenceSetPriority", error->message); + } +} + +void firebase_database_firebase_database_host_api_respond_error_database_reference_set_priority( + FirebaseDatabaseFirebaseDatabaseHostApiResponseHandle* response_handle, + const gchar* code, const gchar* message, FlValue* details) { + g_autoptr( + FirebaseDatabaseFirebaseDatabaseHostApiDatabaseReferenceSetPriorityResponse) + response = + firebase_database_firebase_database_host_api_database_reference_set_priority_response_new_error( + code, message, details); + g_autoptr(GError) error = nullptr; + if (!fl_basic_message_channel_respond(response_handle->channel, + response_handle->response_handle, + response->value, &error)) { + g_warning("Failed to send response to %s.%s: %s", "FirebaseDatabaseHostApi", + "databaseReferenceSetPriority", error->message); + } +} + +void firebase_database_firebase_database_host_api_respond_database_reference_run_transaction( + FirebaseDatabaseFirebaseDatabaseHostApiResponseHandle* response_handle) { + g_autoptr( + FirebaseDatabaseFirebaseDatabaseHostApiDatabaseReferenceRunTransactionResponse) + response = + firebase_database_firebase_database_host_api_database_reference_run_transaction_response_new(); + g_autoptr(GError) error = nullptr; + if (!fl_basic_message_channel_respond(response_handle->channel, + response_handle->response_handle, + response->value, &error)) { + g_warning("Failed to send response to %s.%s: %s", "FirebaseDatabaseHostApi", + "databaseReferenceRunTransaction", error->message); + } +} + +void firebase_database_firebase_database_host_api_respond_error_database_reference_run_transaction( + FirebaseDatabaseFirebaseDatabaseHostApiResponseHandle* response_handle, + const gchar* code, const gchar* message, FlValue* details) { + g_autoptr( + FirebaseDatabaseFirebaseDatabaseHostApiDatabaseReferenceRunTransactionResponse) + response = + firebase_database_firebase_database_host_api_database_reference_run_transaction_response_new_error( + code, message, details); + g_autoptr(GError) error = nullptr; + if (!fl_basic_message_channel_respond(response_handle->channel, + response_handle->response_handle, + response->value, &error)) { + g_warning("Failed to send response to %s.%s: %s", "FirebaseDatabaseHostApi", + "databaseReferenceRunTransaction", error->message); + } +} + +void firebase_database_firebase_database_host_api_respond_database_reference_get_transaction_result( + FirebaseDatabaseFirebaseDatabaseHostApiResponseHandle* response_handle, + FlValue* return_value) { + g_autoptr( + FirebaseDatabaseFirebaseDatabaseHostApiDatabaseReferenceGetTransactionResultResponse) + response = + firebase_database_firebase_database_host_api_database_reference_get_transaction_result_response_new( + return_value); + g_autoptr(GError) error = nullptr; + if (!fl_basic_message_channel_respond(response_handle->channel, + response_handle->response_handle, + response->value, &error)) { + g_warning("Failed to send response to %s.%s: %s", "FirebaseDatabaseHostApi", + "databaseReferenceGetTransactionResult", error->message); + } +} + +void firebase_database_firebase_database_host_api_respond_error_database_reference_get_transaction_result( + FirebaseDatabaseFirebaseDatabaseHostApiResponseHandle* response_handle, + const gchar* code, const gchar* message, FlValue* details) { + g_autoptr( + FirebaseDatabaseFirebaseDatabaseHostApiDatabaseReferenceGetTransactionResultResponse) + response = + firebase_database_firebase_database_host_api_database_reference_get_transaction_result_response_new_error( + code, message, details); + g_autoptr(GError) error = nullptr; + if (!fl_basic_message_channel_respond(response_handle->channel, + response_handle->response_handle, + response->value, &error)) { + g_warning("Failed to send response to %s.%s: %s", "FirebaseDatabaseHostApi", + "databaseReferenceGetTransactionResult", error->message); + } +} + +void firebase_database_firebase_database_host_api_respond_on_disconnect_set( + FirebaseDatabaseFirebaseDatabaseHostApiResponseHandle* response_handle) { + g_autoptr( + FirebaseDatabaseFirebaseDatabaseHostApiOnDisconnectSetResponse) response = + firebase_database_firebase_database_host_api_on_disconnect_set_response_new(); + g_autoptr(GError) error = nullptr; + if (!fl_basic_message_channel_respond(response_handle->channel, + response_handle->response_handle, + response->value, &error)) { + g_warning("Failed to send response to %s.%s: %s", "FirebaseDatabaseHostApi", + "onDisconnectSet", error->message); + } +} + +void firebase_database_firebase_database_host_api_respond_error_on_disconnect_set( + FirebaseDatabaseFirebaseDatabaseHostApiResponseHandle* response_handle, + const gchar* code, const gchar* message, FlValue* details) { + g_autoptr( + FirebaseDatabaseFirebaseDatabaseHostApiOnDisconnectSetResponse) response = + firebase_database_firebase_database_host_api_on_disconnect_set_response_new_error( + code, message, details); + g_autoptr(GError) error = nullptr; + if (!fl_basic_message_channel_respond(response_handle->channel, + response_handle->response_handle, + response->value, &error)) { + g_warning("Failed to send response to %s.%s: %s", "FirebaseDatabaseHostApi", + "onDisconnectSet", error->message); + } +} + +void firebase_database_firebase_database_host_api_respond_on_disconnect_set_with_priority( + FirebaseDatabaseFirebaseDatabaseHostApiResponseHandle* response_handle) { + g_autoptr( + FirebaseDatabaseFirebaseDatabaseHostApiOnDisconnectSetWithPriorityResponse) + response = + firebase_database_firebase_database_host_api_on_disconnect_set_with_priority_response_new(); + g_autoptr(GError) error = nullptr; + if (!fl_basic_message_channel_respond(response_handle->channel, + response_handle->response_handle, + response->value, &error)) { + g_warning("Failed to send response to %s.%s: %s", "FirebaseDatabaseHostApi", + "onDisconnectSetWithPriority", error->message); + } +} + +void firebase_database_firebase_database_host_api_respond_error_on_disconnect_set_with_priority( + FirebaseDatabaseFirebaseDatabaseHostApiResponseHandle* response_handle, + const gchar* code, const gchar* message, FlValue* details) { + g_autoptr( + FirebaseDatabaseFirebaseDatabaseHostApiOnDisconnectSetWithPriorityResponse) + response = + firebase_database_firebase_database_host_api_on_disconnect_set_with_priority_response_new_error( + code, message, details); + g_autoptr(GError) error = nullptr; + if (!fl_basic_message_channel_respond(response_handle->channel, + response_handle->response_handle, + response->value, &error)) { + g_warning("Failed to send response to %s.%s: %s", "FirebaseDatabaseHostApi", + "onDisconnectSetWithPriority", error->message); + } +} + +void firebase_database_firebase_database_host_api_respond_on_disconnect_update( + FirebaseDatabaseFirebaseDatabaseHostApiResponseHandle* response_handle) { + g_autoptr( + FirebaseDatabaseFirebaseDatabaseHostApiOnDisconnectUpdateResponse) response = + firebase_database_firebase_database_host_api_on_disconnect_update_response_new(); + g_autoptr(GError) error = nullptr; + if (!fl_basic_message_channel_respond(response_handle->channel, + response_handle->response_handle, + response->value, &error)) { + g_warning("Failed to send response to %s.%s: %s", "FirebaseDatabaseHostApi", + "onDisconnectUpdate", error->message); + } +} + +void firebase_database_firebase_database_host_api_respond_error_on_disconnect_update( + FirebaseDatabaseFirebaseDatabaseHostApiResponseHandle* response_handle, + const gchar* code, const gchar* message, FlValue* details) { + g_autoptr( + FirebaseDatabaseFirebaseDatabaseHostApiOnDisconnectUpdateResponse) response = + firebase_database_firebase_database_host_api_on_disconnect_update_response_new_error( + code, message, details); + g_autoptr(GError) error = nullptr; + if (!fl_basic_message_channel_respond(response_handle->channel, + response_handle->response_handle, + response->value, &error)) { + g_warning("Failed to send response to %s.%s: %s", "FirebaseDatabaseHostApi", + "onDisconnectUpdate", error->message); + } +} + +void firebase_database_firebase_database_host_api_respond_on_disconnect_cancel( + FirebaseDatabaseFirebaseDatabaseHostApiResponseHandle* response_handle) { + g_autoptr( + FirebaseDatabaseFirebaseDatabaseHostApiOnDisconnectCancelResponse) response = + firebase_database_firebase_database_host_api_on_disconnect_cancel_response_new(); + g_autoptr(GError) error = nullptr; + if (!fl_basic_message_channel_respond(response_handle->channel, + response_handle->response_handle, + response->value, &error)) { + g_warning("Failed to send response to %s.%s: %s", "FirebaseDatabaseHostApi", + "onDisconnectCancel", error->message); + } +} + +void firebase_database_firebase_database_host_api_respond_error_on_disconnect_cancel( + FirebaseDatabaseFirebaseDatabaseHostApiResponseHandle* response_handle, + const gchar* code, const gchar* message, FlValue* details) { + g_autoptr( + FirebaseDatabaseFirebaseDatabaseHostApiOnDisconnectCancelResponse) response = + firebase_database_firebase_database_host_api_on_disconnect_cancel_response_new_error( + code, message, details); + g_autoptr(GError) error = nullptr; + if (!fl_basic_message_channel_respond(response_handle->channel, + response_handle->response_handle, + response->value, &error)) { + g_warning("Failed to send response to %s.%s: %s", "FirebaseDatabaseHostApi", + "onDisconnectCancel", error->message); + } +} + +void firebase_database_firebase_database_host_api_respond_query_observe( + FirebaseDatabaseFirebaseDatabaseHostApiResponseHandle* response_handle, + const gchar* return_value) { + g_autoptr( + FirebaseDatabaseFirebaseDatabaseHostApiQueryObserveResponse) response = + firebase_database_firebase_database_host_api_query_observe_response_new( + return_value); + g_autoptr(GError) error = nullptr; + if (!fl_basic_message_channel_respond(response_handle->channel, + response_handle->response_handle, + response->value, &error)) { + g_warning("Failed to send response to %s.%s: %s", "FirebaseDatabaseHostApi", + "queryObserve", error->message); + } +} + +void firebase_database_firebase_database_host_api_respond_error_query_observe( + FirebaseDatabaseFirebaseDatabaseHostApiResponseHandle* response_handle, + const gchar* code, const gchar* message, FlValue* details) { + g_autoptr( + FirebaseDatabaseFirebaseDatabaseHostApiQueryObserveResponse) response = + firebase_database_firebase_database_host_api_query_observe_response_new_error( + code, message, details); + g_autoptr(GError) error = nullptr; + if (!fl_basic_message_channel_respond(response_handle->channel, + response_handle->response_handle, + response->value, &error)) { + g_warning("Failed to send response to %s.%s: %s", "FirebaseDatabaseHostApi", + "queryObserve", error->message); + } +} + +void firebase_database_firebase_database_host_api_respond_query_keep_synced( + FirebaseDatabaseFirebaseDatabaseHostApiResponseHandle* response_handle) { + g_autoptr( + FirebaseDatabaseFirebaseDatabaseHostApiQueryKeepSyncedResponse) response = + firebase_database_firebase_database_host_api_query_keep_synced_response_new(); + g_autoptr(GError) error = nullptr; + if (!fl_basic_message_channel_respond(response_handle->channel, + response_handle->response_handle, + response->value, &error)) { + g_warning("Failed to send response to %s.%s: %s", "FirebaseDatabaseHostApi", + "queryKeepSynced", error->message); + } +} + +void firebase_database_firebase_database_host_api_respond_error_query_keep_synced( + FirebaseDatabaseFirebaseDatabaseHostApiResponseHandle* response_handle, + const gchar* code, const gchar* message, FlValue* details) { + g_autoptr( + FirebaseDatabaseFirebaseDatabaseHostApiQueryKeepSyncedResponse) response = + firebase_database_firebase_database_host_api_query_keep_synced_response_new_error( + code, message, details); + g_autoptr(GError) error = nullptr; + if (!fl_basic_message_channel_respond(response_handle->channel, + response_handle->response_handle, + response->value, &error)) { + g_warning("Failed to send response to %s.%s: %s", "FirebaseDatabaseHostApi", + "queryKeepSynced", error->message); + } +} + +void firebase_database_firebase_database_host_api_respond_query_get( + FirebaseDatabaseFirebaseDatabaseHostApiResponseHandle* response_handle, + FlValue* return_value) { + g_autoptr(FirebaseDatabaseFirebaseDatabaseHostApiQueryGetResponse) response = + firebase_database_firebase_database_host_api_query_get_response_new( + return_value); + g_autoptr(GError) error = nullptr; + if (!fl_basic_message_channel_respond(response_handle->channel, + response_handle->response_handle, + response->value, &error)) { + g_warning("Failed to send response to %s.%s: %s", "FirebaseDatabaseHostApi", + "queryGet", error->message); + } +} + +void firebase_database_firebase_database_host_api_respond_error_query_get( + FirebaseDatabaseFirebaseDatabaseHostApiResponseHandle* response_handle, + const gchar* code, const gchar* message, FlValue* details) { + g_autoptr(FirebaseDatabaseFirebaseDatabaseHostApiQueryGetResponse) response = + firebase_database_firebase_database_host_api_query_get_response_new_error( + code, message, details); + g_autoptr(GError) error = nullptr; + if (!fl_basic_message_channel_respond(response_handle->channel, + response_handle->response_handle, + response->value, &error)) { + g_warning("Failed to send response to %s.%s: %s", "FirebaseDatabaseHostApi", + "queryGet", error->message); + } +} + +struct _FirebaseDatabaseFirebaseDatabaseFlutterApi { + GObject parent_instance; + + FlBinaryMessenger* messenger; + gchar* suffix; +}; + +G_DEFINE_TYPE(FirebaseDatabaseFirebaseDatabaseFlutterApi, + firebase_database_firebase_database_flutter_api, G_TYPE_OBJECT) + +static void firebase_database_firebase_database_flutter_api_dispose( + GObject* object) { + FirebaseDatabaseFirebaseDatabaseFlutterApi* self = + FIREBASE_DATABASE_FIREBASE_DATABASE_FLUTTER_API(object); + g_clear_object(&self->messenger); + g_clear_pointer(&self->suffix, g_free); + G_OBJECT_CLASS(firebase_database_firebase_database_flutter_api_parent_class) + ->dispose(object); +} + +static void firebase_database_firebase_database_flutter_api_init( + FirebaseDatabaseFirebaseDatabaseFlutterApi* self) {} + +static void firebase_database_firebase_database_flutter_api_class_init( + FirebaseDatabaseFirebaseDatabaseFlutterApiClass* klass) { + G_OBJECT_CLASS(klass)->dispose = + firebase_database_firebase_database_flutter_api_dispose; +} + +FirebaseDatabaseFirebaseDatabaseFlutterApi* +firebase_database_firebase_database_flutter_api_new( + FlBinaryMessenger* messenger, const gchar* suffix) { + FirebaseDatabaseFirebaseDatabaseFlutterApi* self = + FIREBASE_DATABASE_FIREBASE_DATABASE_FLUTTER_API(g_object_new( + firebase_database_firebase_database_flutter_api_get_type(), nullptr)); + self->messenger = FL_BINARY_MESSENGER(g_object_ref(messenger)); + self->suffix = + suffix != nullptr ? g_strdup_printf(".%s", suffix) : g_strdup(""); + return self; +} + +struct + _FirebaseDatabaseFirebaseDatabaseFlutterApiCallTransactionHandlerResponse { + GObject parent_instance; + + FlValue* error; + FlValue* return_value; +}; + +G_DEFINE_TYPE( + FirebaseDatabaseFirebaseDatabaseFlutterApiCallTransactionHandlerResponse, + firebase_database_firebase_database_flutter_api_call_transaction_handler_response, + G_TYPE_OBJECT) + +static void +firebase_database_firebase_database_flutter_api_call_transaction_handler_response_dispose( + GObject* object) { + FirebaseDatabaseFirebaseDatabaseFlutterApiCallTransactionHandlerResponse* self = + FIREBASE_DATABASE_FIREBASE_DATABASE_FLUTTER_API_CALL_TRANSACTION_HANDLER_RESPONSE( + object); + g_clear_pointer(&self->error, fl_value_unref); + g_clear_pointer(&self->return_value, fl_value_unref); + G_OBJECT_CLASS( + firebase_database_firebase_database_flutter_api_call_transaction_handler_response_parent_class) + ->dispose(object); +} + +static void +firebase_database_firebase_database_flutter_api_call_transaction_handler_response_init( + FirebaseDatabaseFirebaseDatabaseFlutterApiCallTransactionHandlerResponse* + self) {} + +static void +firebase_database_firebase_database_flutter_api_call_transaction_handler_response_class_init( + FirebaseDatabaseFirebaseDatabaseFlutterApiCallTransactionHandlerResponseClass* + klass) { + G_OBJECT_CLASS(klass)->dispose = + firebase_database_firebase_database_flutter_api_call_transaction_handler_response_dispose; +} + +static FirebaseDatabaseFirebaseDatabaseFlutterApiCallTransactionHandlerResponse* +firebase_database_firebase_database_flutter_api_call_transaction_handler_response_new( + FlValue* response) { + FirebaseDatabaseFirebaseDatabaseFlutterApiCallTransactionHandlerResponse* self = + FIREBASE_DATABASE_FIREBASE_DATABASE_FLUTTER_API_CALL_TRANSACTION_HANDLER_RESPONSE( + g_object_new( + firebase_database_firebase_database_flutter_api_call_transaction_handler_response_get_type(), + nullptr)); + if (fl_value_get_length(response) > 1) { + self->error = fl_value_ref(response); + } else { + FlValue* value = fl_value_get_list_value(response, 0); + self->return_value = fl_value_ref(value); + } + return self; +} + +gboolean +firebase_database_firebase_database_flutter_api_call_transaction_handler_response_is_error( + FirebaseDatabaseFirebaseDatabaseFlutterApiCallTransactionHandlerResponse* + self) { + g_return_val_if_fail( + FIREBASE_DATABASE_IS_FIREBASE_DATABASE_FLUTTER_API_CALL_TRANSACTION_HANDLER_RESPONSE( + self), + FALSE); + return self->error != nullptr; +} + +const gchar* +firebase_database_firebase_database_flutter_api_call_transaction_handler_response_get_error_code( + FirebaseDatabaseFirebaseDatabaseFlutterApiCallTransactionHandlerResponse* + self) { + g_return_val_if_fail( + FIREBASE_DATABASE_IS_FIREBASE_DATABASE_FLUTTER_API_CALL_TRANSACTION_HANDLER_RESPONSE( + self), + nullptr); + g_assert( + firebase_database_firebase_database_flutter_api_call_transaction_handler_response_is_error( + self)); + return fl_value_get_string(fl_value_get_list_value(self->error, 0)); +} + +const gchar* +firebase_database_firebase_database_flutter_api_call_transaction_handler_response_get_error_message( + FirebaseDatabaseFirebaseDatabaseFlutterApiCallTransactionHandlerResponse* + self) { + g_return_val_if_fail( + FIREBASE_DATABASE_IS_FIREBASE_DATABASE_FLUTTER_API_CALL_TRANSACTION_HANDLER_RESPONSE( + self), + nullptr); + g_assert( + firebase_database_firebase_database_flutter_api_call_transaction_handler_response_is_error( + self)); + return fl_value_get_string(fl_value_get_list_value(self->error, 1)); +} + +FlValue* +firebase_database_firebase_database_flutter_api_call_transaction_handler_response_get_error_details( + FirebaseDatabaseFirebaseDatabaseFlutterApiCallTransactionHandlerResponse* + self) { + g_return_val_if_fail( + FIREBASE_DATABASE_IS_FIREBASE_DATABASE_FLUTTER_API_CALL_TRANSACTION_HANDLER_RESPONSE( + self), + nullptr); + g_assert( + firebase_database_firebase_database_flutter_api_call_transaction_handler_response_is_error( + self)); + return fl_value_get_list_value(self->error, 2); +} + +FirebaseDatabaseTransactionHandlerResult* +firebase_database_firebase_database_flutter_api_call_transaction_handler_response_get_return_value( + FirebaseDatabaseFirebaseDatabaseFlutterApiCallTransactionHandlerResponse* + self) { + g_return_val_if_fail( + FIREBASE_DATABASE_IS_FIREBASE_DATABASE_FLUTTER_API_CALL_TRANSACTION_HANDLER_RESPONSE( + self), + nullptr); + g_assert( + !firebase_database_firebase_database_flutter_api_call_transaction_handler_response_is_error( + self)); + return FIREBASE_DATABASE_TRANSACTION_HANDLER_RESULT( + fl_value_get_custom_value_object(self->return_value)); +} + +static void +firebase_database_firebase_database_flutter_api_call_transaction_handler_cb( + GObject* object, GAsyncResult* result, gpointer user_data) { + GTask* task = G_TASK(user_data); + g_task_return_pointer(task, result, g_object_unref); +} + +void firebase_database_firebase_database_flutter_api_call_transaction_handler( + FirebaseDatabaseFirebaseDatabaseFlutterApi* self, int64_t transaction_key, + FlValue* snapshot_value, GCancellable* cancellable, + GAsyncReadyCallback callback, gpointer user_data) { + g_autoptr(FlValue) args = fl_value_new_list(); + fl_value_append_take(args, fl_value_new_int(transaction_key)); + fl_value_append_take(args, snapshot_value != nullptr + ? fl_value_ref(snapshot_value) + : fl_value_new_null()); + g_autofree gchar* channel_name = g_strdup_printf( + "dev.flutter.pigeon.firebase_database_platform_interface." + "FirebaseDatabaseFlutterApi.callTransactionHandler%s", + self->suffix); + g_autoptr(FirebaseDatabaseMessageCodec) codec = + firebase_database_message_codec_new(); + FlBasicMessageChannel* channel = fl_basic_message_channel_new( + self->messenger, channel_name, FL_MESSAGE_CODEC(codec)); + GTask* task = g_task_new(self, cancellable, callback, user_data); + g_task_set_task_data(task, channel, g_object_unref); + fl_basic_message_channel_send( + channel, args, cancellable, + firebase_database_firebase_database_flutter_api_call_transaction_handler_cb, + task); +} + +FirebaseDatabaseFirebaseDatabaseFlutterApiCallTransactionHandlerResponse* +firebase_database_firebase_database_flutter_api_call_transaction_handler_finish( + FirebaseDatabaseFirebaseDatabaseFlutterApi* self, GAsyncResult* result, + GError** error) { + g_autoptr(GTask) task = G_TASK(result); + GAsyncResult* r = G_ASYNC_RESULT(g_task_propagate_pointer(task, nullptr)); + FlBasicMessageChannel* channel = + FL_BASIC_MESSAGE_CHANNEL(g_task_get_task_data(task)); + g_autoptr(FlValue) response = + fl_basic_message_channel_send_finish(channel, r, error); + if (response == nullptr) { + return nullptr; + } + return firebase_database_firebase_database_flutter_api_call_transaction_handler_response_new( + response); +} diff --git a/packages/firebase_database/firebase_database/linux/messages.g.h b/packages/firebase_database/firebase_database/linux/messages.g.h new file mode 100644 index 000000000000..556ea5638810 --- /dev/null +++ b/packages/firebase_database/firebase_database/linux/messages.g.h @@ -0,0 +1,1450 @@ +// Copyright 2026, the Chromium project authors. Please see the AUTHORS file +// for details. All rights reserved. Use of this source code is governed by a +// BSD-style license that can be found in the LICENSE file. +// Autogenerated from Pigeon (v26.3.4), do not edit directly. +// See also: https://pub.dev/packages/pigeon + +#ifndef PIGEON_MESSAGES_G_H_ +#define PIGEON_MESSAGES_G_H_ + +#include + +G_BEGIN_DECLS + +/** + * FirebaseDatabaseDatabasePigeonSettings: + * + */ + +G_DECLARE_FINAL_TYPE(FirebaseDatabaseDatabasePigeonSettings, + firebase_database_database_pigeon_settings, + FIREBASE_DATABASE, DATABASE_PIGEON_SETTINGS, GObject) + +/** + * firebase_database_database_pigeon_settings_new: + * persistence_enabled: field in this object. + * cache_size_bytes: field in this object. + * logging_enabled: field in this object. + * emulator_host: field in this object. + * emulator_port: field in this object. + * + * Creates a new #DatabasePigeonSettings object. + * + * Returns: a new #FirebaseDatabaseDatabasePigeonSettings + */ +FirebaseDatabaseDatabasePigeonSettings* +firebase_database_database_pigeon_settings_new(gboolean* persistence_enabled, + int64_t* cache_size_bytes, + gboolean* logging_enabled, + const gchar* emulator_host, + int64_t* emulator_port); + +/** + * firebase_database_database_pigeon_settings_get_persistence_enabled + * @object: a #FirebaseDatabaseDatabasePigeonSettings. + * + * Gets the value of the persistenceEnabled field of @object. + * + * Returns: the field value. + */ +gboolean* firebase_database_database_pigeon_settings_get_persistence_enabled( + FirebaseDatabaseDatabasePigeonSettings* object); + +/** + * firebase_database_database_pigeon_settings_get_cache_size_bytes + * @object: a #FirebaseDatabaseDatabasePigeonSettings. + * + * Gets the value of the cacheSizeBytes field of @object. + * + * Returns: the field value. + */ +int64_t* firebase_database_database_pigeon_settings_get_cache_size_bytes( + FirebaseDatabaseDatabasePigeonSettings* object); + +/** + * firebase_database_database_pigeon_settings_get_logging_enabled + * @object: a #FirebaseDatabaseDatabasePigeonSettings. + * + * Gets the value of the loggingEnabled field of @object. + * + * Returns: the field value. + */ +gboolean* firebase_database_database_pigeon_settings_get_logging_enabled( + FirebaseDatabaseDatabasePigeonSettings* object); + +/** + * firebase_database_database_pigeon_settings_get_emulator_host + * @object: a #FirebaseDatabaseDatabasePigeonSettings. + * + * Gets the value of the emulatorHost field of @object. + * + * Returns: the field value. + */ +const gchar* firebase_database_database_pigeon_settings_get_emulator_host( + FirebaseDatabaseDatabasePigeonSettings* object); + +/** + * firebase_database_database_pigeon_settings_get_emulator_port + * @object: a #FirebaseDatabaseDatabasePigeonSettings. + * + * Gets the value of the emulatorPort field of @object. + * + * Returns: the field value. + */ +int64_t* firebase_database_database_pigeon_settings_get_emulator_port( + FirebaseDatabaseDatabasePigeonSettings* object); + +/** + * firebase_database_database_pigeon_settings_equals: + * @a: a #FirebaseDatabaseDatabasePigeonSettings. + * @b: another #FirebaseDatabaseDatabasePigeonSettings. + * + * Checks if two #FirebaseDatabaseDatabasePigeonSettings objects are equal. + * + * Returns: TRUE if @a and @b are equal. + */ +gboolean firebase_database_database_pigeon_settings_equals( + FirebaseDatabaseDatabasePigeonSettings* a, + FirebaseDatabaseDatabasePigeonSettings* b); + +/** + * firebase_database_database_pigeon_settings_hash: + * @object: a #FirebaseDatabaseDatabasePigeonSettings. + * + * Calculates a hash code for a #FirebaseDatabaseDatabasePigeonSettings object. + * + * Returns: the hash code. + */ +guint firebase_database_database_pigeon_settings_hash( + FirebaseDatabaseDatabasePigeonSettings* object); + +/** + * FirebaseDatabaseDatabasePigeonFirebaseApp: + * + */ + +G_DECLARE_FINAL_TYPE(FirebaseDatabaseDatabasePigeonFirebaseApp, + firebase_database_database_pigeon_firebase_app, + FIREBASE_DATABASE, DATABASE_PIGEON_FIREBASE_APP, GObject) + +/** + * firebase_database_database_pigeon_firebase_app_new: + * app_name: field in this object. + * database_u_r_l: field in this object. + * settings: field in this object. + * + * Creates a new #DatabasePigeonFirebaseApp object. + * + * Returns: a new #FirebaseDatabaseDatabasePigeonFirebaseApp + */ +FirebaseDatabaseDatabasePigeonFirebaseApp* +firebase_database_database_pigeon_firebase_app_new( + const gchar* app_name, const gchar* database_u_r_l, + FirebaseDatabaseDatabasePigeonSettings* settings); + +/** + * firebase_database_database_pigeon_firebase_app_get_app_name + * @object: a #FirebaseDatabaseDatabasePigeonFirebaseApp. + * + * Gets the value of the appName field of @object. + * + * Returns: the field value. + */ +const gchar* firebase_database_database_pigeon_firebase_app_get_app_name( + FirebaseDatabaseDatabasePigeonFirebaseApp* object); + +/** + * firebase_database_database_pigeon_firebase_app_get_database_u_r_l + * @object: a #FirebaseDatabaseDatabasePigeonFirebaseApp. + * + * Gets the value of the databaseURL field of @object. + * + * Returns: the field value. + */ +const gchar* firebase_database_database_pigeon_firebase_app_get_database_u_r_l( + FirebaseDatabaseDatabasePigeonFirebaseApp* object); + +/** + * firebase_database_database_pigeon_firebase_app_get_settings + * @object: a #FirebaseDatabaseDatabasePigeonFirebaseApp. + * + * Gets the value of the settings field of @object. + * + * Returns: the field value. + */ +FirebaseDatabaseDatabasePigeonSettings* +firebase_database_database_pigeon_firebase_app_get_settings( + FirebaseDatabaseDatabasePigeonFirebaseApp* object); + +/** + * firebase_database_database_pigeon_firebase_app_equals: + * @a: a #FirebaseDatabaseDatabasePigeonFirebaseApp. + * @b: another #FirebaseDatabaseDatabasePigeonFirebaseApp. + * + * Checks if two #FirebaseDatabaseDatabasePigeonFirebaseApp objects are equal. + * + * Returns: TRUE if @a and @b are equal. + */ +gboolean firebase_database_database_pigeon_firebase_app_equals( + FirebaseDatabaseDatabasePigeonFirebaseApp* a, + FirebaseDatabaseDatabasePigeonFirebaseApp* b); + +/** + * firebase_database_database_pigeon_firebase_app_hash: + * @object: a #FirebaseDatabaseDatabasePigeonFirebaseApp. + * + * Calculates a hash code for a #FirebaseDatabaseDatabasePigeonFirebaseApp + * object. + * + * Returns: the hash code. + */ +guint firebase_database_database_pigeon_firebase_app_hash( + FirebaseDatabaseDatabasePigeonFirebaseApp* object); + +/** + * FirebaseDatabaseDatabaseReferencePlatform: + * + */ + +G_DECLARE_FINAL_TYPE(FirebaseDatabaseDatabaseReferencePlatform, + firebase_database_database_reference_platform, + FIREBASE_DATABASE, DATABASE_REFERENCE_PLATFORM, GObject) + +/** + * firebase_database_database_reference_platform_new: + * path: field in this object. + * + * Creates a new #DatabaseReferencePlatform object. + * + * Returns: a new #FirebaseDatabaseDatabaseReferencePlatform + */ +FirebaseDatabaseDatabaseReferencePlatform* +firebase_database_database_reference_platform_new(const gchar* path); + +/** + * firebase_database_database_reference_platform_get_path + * @object: a #FirebaseDatabaseDatabaseReferencePlatform. + * + * Gets the value of the path field of @object. + * + * Returns: the field value. + */ +const gchar* firebase_database_database_reference_platform_get_path( + FirebaseDatabaseDatabaseReferencePlatform* object); + +/** + * firebase_database_database_reference_platform_equals: + * @a: a #FirebaseDatabaseDatabaseReferencePlatform. + * @b: another #FirebaseDatabaseDatabaseReferencePlatform. + * + * Checks if two #FirebaseDatabaseDatabaseReferencePlatform objects are equal. + * + * Returns: TRUE if @a and @b are equal. + */ +gboolean firebase_database_database_reference_platform_equals( + FirebaseDatabaseDatabaseReferencePlatform* a, + FirebaseDatabaseDatabaseReferencePlatform* b); + +/** + * firebase_database_database_reference_platform_hash: + * @object: a #FirebaseDatabaseDatabaseReferencePlatform. + * + * Calculates a hash code for a #FirebaseDatabaseDatabaseReferencePlatform + * object. + * + * Returns: the hash code. + */ +guint firebase_database_database_reference_platform_hash( + FirebaseDatabaseDatabaseReferencePlatform* object); + +/** + * FirebaseDatabaseDatabaseReferenceRequest: + * + */ + +G_DECLARE_FINAL_TYPE(FirebaseDatabaseDatabaseReferenceRequest, + firebase_database_database_reference_request, + FIREBASE_DATABASE, DATABASE_REFERENCE_REQUEST, GObject) + +/** + * firebase_database_database_reference_request_new: + * path: field in this object. + * value: field in this object. + * priority: field in this object. + * + * Creates a new #DatabaseReferenceRequest object. + * + * Returns: a new #FirebaseDatabaseDatabaseReferenceRequest + */ +FirebaseDatabaseDatabaseReferenceRequest* +firebase_database_database_reference_request_new(const gchar* path, + FlValue* value, + FlValue* priority); + +/** + * firebase_database_database_reference_request_get_path + * @object: a #FirebaseDatabaseDatabaseReferenceRequest. + * + * Gets the value of the path field of @object. + * + * Returns: the field value. + */ +const gchar* firebase_database_database_reference_request_get_path( + FirebaseDatabaseDatabaseReferenceRequest* object); + +/** + * firebase_database_database_reference_request_get_value + * @object: a #FirebaseDatabaseDatabaseReferenceRequest. + * + * Gets the value of the value field of @object. + * + * Returns: the field value. + */ +FlValue* firebase_database_database_reference_request_get_value( + FirebaseDatabaseDatabaseReferenceRequest* object); + +/** + * firebase_database_database_reference_request_get_priority + * @object: a #FirebaseDatabaseDatabaseReferenceRequest. + * + * Gets the value of the priority field of @object. + * + * Returns: the field value. + */ +FlValue* firebase_database_database_reference_request_get_priority( + FirebaseDatabaseDatabaseReferenceRequest* object); + +/** + * firebase_database_database_reference_request_equals: + * @a: a #FirebaseDatabaseDatabaseReferenceRequest. + * @b: another #FirebaseDatabaseDatabaseReferenceRequest. + * + * Checks if two #FirebaseDatabaseDatabaseReferenceRequest objects are equal. + * + * Returns: TRUE if @a and @b are equal. + */ +gboolean firebase_database_database_reference_request_equals( + FirebaseDatabaseDatabaseReferenceRequest* a, + FirebaseDatabaseDatabaseReferenceRequest* b); + +/** + * firebase_database_database_reference_request_hash: + * @object: a #FirebaseDatabaseDatabaseReferenceRequest. + * + * Calculates a hash code for a #FirebaseDatabaseDatabaseReferenceRequest + * object. + * + * Returns: the hash code. + */ +guint firebase_database_database_reference_request_hash( + FirebaseDatabaseDatabaseReferenceRequest* object); + +/** + * FirebaseDatabaseUpdateRequest: + * + */ + +G_DECLARE_FINAL_TYPE(FirebaseDatabaseUpdateRequest, + firebase_database_update_request, FIREBASE_DATABASE, + UPDATE_REQUEST, GObject) + +/** + * firebase_database_update_request_new: + * path: field in this object. + * value: field in this object. + * + * Creates a new #UpdateRequest object. + * + * Returns: a new #FirebaseDatabaseUpdateRequest + */ +FirebaseDatabaseUpdateRequest* firebase_database_update_request_new( + const gchar* path, FlValue* value); + +/** + * firebase_database_update_request_get_path + * @object: a #FirebaseDatabaseUpdateRequest. + * + * Gets the value of the path field of @object. + * + * Returns: the field value. + */ +const gchar* firebase_database_update_request_get_path( + FirebaseDatabaseUpdateRequest* object); + +/** + * firebase_database_update_request_get_value + * @object: a #FirebaseDatabaseUpdateRequest. + * + * Gets the value of the value field of @object. + * + * Returns: the field value. + */ +FlValue* firebase_database_update_request_get_value( + FirebaseDatabaseUpdateRequest* object); + +/** + * firebase_database_update_request_equals: + * @a: a #FirebaseDatabaseUpdateRequest. + * @b: another #FirebaseDatabaseUpdateRequest. + * + * Checks if two #FirebaseDatabaseUpdateRequest objects are equal. + * + * Returns: TRUE if @a and @b are equal. + */ +gboolean firebase_database_update_request_equals( + FirebaseDatabaseUpdateRequest* a, FirebaseDatabaseUpdateRequest* b); + +/** + * firebase_database_update_request_hash: + * @object: a #FirebaseDatabaseUpdateRequest. + * + * Calculates a hash code for a #FirebaseDatabaseUpdateRequest object. + * + * Returns: the hash code. + */ +guint firebase_database_update_request_hash( + FirebaseDatabaseUpdateRequest* object); + +/** + * FirebaseDatabaseTransactionRequest: + * + */ + +G_DECLARE_FINAL_TYPE(FirebaseDatabaseTransactionRequest, + firebase_database_transaction_request, FIREBASE_DATABASE, + TRANSACTION_REQUEST, GObject) + +/** + * firebase_database_transaction_request_new: + * path: field in this object. + * transaction_key: field in this object. + * apply_locally: field in this object. + * + * Creates a new #TransactionRequest object. + * + * Returns: a new #FirebaseDatabaseTransactionRequest + */ +FirebaseDatabaseTransactionRequest* firebase_database_transaction_request_new( + const gchar* path, int64_t transaction_key, gboolean apply_locally); + +/** + * firebase_database_transaction_request_get_path + * @object: a #FirebaseDatabaseTransactionRequest. + * + * Gets the value of the path field of @object. + * + * Returns: the field value. + */ +const gchar* firebase_database_transaction_request_get_path( + FirebaseDatabaseTransactionRequest* object); + +/** + * firebase_database_transaction_request_get_transaction_key + * @object: a #FirebaseDatabaseTransactionRequest. + * + * Gets the value of the transactionKey field of @object. + * + * Returns: the field value. + */ +int64_t firebase_database_transaction_request_get_transaction_key( + FirebaseDatabaseTransactionRequest* object); + +/** + * firebase_database_transaction_request_get_apply_locally + * @object: a #FirebaseDatabaseTransactionRequest. + * + * Gets the value of the applyLocally field of @object. + * + * Returns: the field value. + */ +gboolean firebase_database_transaction_request_get_apply_locally( + FirebaseDatabaseTransactionRequest* object); + +/** + * firebase_database_transaction_request_equals: + * @a: a #FirebaseDatabaseTransactionRequest. + * @b: another #FirebaseDatabaseTransactionRequest. + * + * Checks if two #FirebaseDatabaseTransactionRequest objects are equal. + * + * Returns: TRUE if @a and @b are equal. + */ +gboolean firebase_database_transaction_request_equals( + FirebaseDatabaseTransactionRequest* a, + FirebaseDatabaseTransactionRequest* b); + +/** + * firebase_database_transaction_request_hash: + * @object: a #FirebaseDatabaseTransactionRequest. + * + * Calculates a hash code for a #FirebaseDatabaseTransactionRequest object. + * + * Returns: the hash code. + */ +guint firebase_database_transaction_request_hash( + FirebaseDatabaseTransactionRequest* object); + +/** + * FirebaseDatabaseQueryRequest: + * + */ + +G_DECLARE_FINAL_TYPE(FirebaseDatabaseQueryRequest, + firebase_database_query_request, FIREBASE_DATABASE, + QUERY_REQUEST, GObject) + +/** + * firebase_database_query_request_new: + * path: field in this object. + * modifiers: field in this object. + * value: field in this object. + * + * Creates a new #QueryRequest object. + * + * Returns: a new #FirebaseDatabaseQueryRequest + */ +FirebaseDatabaseQueryRequest* firebase_database_query_request_new( + const gchar* path, FlValue* modifiers, gboolean* value); + +/** + * firebase_database_query_request_get_path + * @object: a #FirebaseDatabaseQueryRequest. + * + * Gets the value of the path field of @object. + * + * Returns: the field value. + */ +const gchar* firebase_database_query_request_get_path( + FirebaseDatabaseQueryRequest* object); + +/** + * firebase_database_query_request_get_modifiers + * @object: a #FirebaseDatabaseQueryRequest. + * + * Gets the value of the modifiers field of @object. + * + * Returns: the field value. + */ +FlValue* firebase_database_query_request_get_modifiers( + FirebaseDatabaseQueryRequest* object); + +/** + * firebase_database_query_request_get_value + * @object: a #FirebaseDatabaseQueryRequest. + * + * Gets the value of the value field of @object. + * + * Returns: the field value. + */ +gboolean* firebase_database_query_request_get_value( + FirebaseDatabaseQueryRequest* object); + +/** + * firebase_database_query_request_equals: + * @a: a #FirebaseDatabaseQueryRequest. + * @b: another #FirebaseDatabaseQueryRequest. + * + * Checks if two #FirebaseDatabaseQueryRequest objects are equal. + * + * Returns: TRUE if @a and @b are equal. + */ +gboolean firebase_database_query_request_equals( + FirebaseDatabaseQueryRequest* a, FirebaseDatabaseQueryRequest* b); + +/** + * firebase_database_query_request_hash: + * @object: a #FirebaseDatabaseQueryRequest. + * + * Calculates a hash code for a #FirebaseDatabaseQueryRequest object. + * + * Returns: the hash code. + */ +guint firebase_database_query_request_hash( + FirebaseDatabaseQueryRequest* object); + +/** + * FirebaseDatabaseTransactionHandlerResult: + * + */ + +G_DECLARE_FINAL_TYPE(FirebaseDatabaseTransactionHandlerResult, + firebase_database_transaction_handler_result, + FIREBASE_DATABASE, TRANSACTION_HANDLER_RESULT, GObject) + +/** + * firebase_database_transaction_handler_result_new: + * value: field in this object. + * aborted: field in this object. + * exception: field in this object. + * + * Creates a new #TransactionHandlerResult object. + * + * Returns: a new #FirebaseDatabaseTransactionHandlerResult + */ +FirebaseDatabaseTransactionHandlerResult* +firebase_database_transaction_handler_result_new(FlValue* value, + gboolean aborted, + gboolean exception); + +/** + * firebase_database_transaction_handler_result_get_value + * @object: a #FirebaseDatabaseTransactionHandlerResult. + * + * Gets the value of the value field of @object. + * + * Returns: the field value. + */ +FlValue* firebase_database_transaction_handler_result_get_value( + FirebaseDatabaseTransactionHandlerResult* object); + +/** + * firebase_database_transaction_handler_result_get_aborted + * @object: a #FirebaseDatabaseTransactionHandlerResult. + * + * Gets the value of the aborted field of @object. + * + * Returns: the field value. + */ +gboolean firebase_database_transaction_handler_result_get_aborted( + FirebaseDatabaseTransactionHandlerResult* object); + +/** + * firebase_database_transaction_handler_result_get_exception + * @object: a #FirebaseDatabaseTransactionHandlerResult. + * + * Gets the value of the exception field of @object. + * + * Returns: the field value. + */ +gboolean firebase_database_transaction_handler_result_get_exception( + FirebaseDatabaseTransactionHandlerResult* object); + +/** + * firebase_database_transaction_handler_result_equals: + * @a: a #FirebaseDatabaseTransactionHandlerResult. + * @b: another #FirebaseDatabaseTransactionHandlerResult. + * + * Checks if two #FirebaseDatabaseTransactionHandlerResult objects are equal. + * + * Returns: TRUE if @a and @b are equal. + */ +gboolean firebase_database_transaction_handler_result_equals( + FirebaseDatabaseTransactionHandlerResult* a, + FirebaseDatabaseTransactionHandlerResult* b); + +/** + * firebase_database_transaction_handler_result_hash: + * @object: a #FirebaseDatabaseTransactionHandlerResult. + * + * Calculates a hash code for a #FirebaseDatabaseTransactionHandlerResult + * object. + * + * Returns: the hash code. + */ +guint firebase_database_transaction_handler_result_hash( + FirebaseDatabaseTransactionHandlerResult* object); + +G_DECLARE_FINAL_TYPE(FirebaseDatabaseMessageCodec, + firebase_database_message_codec, FIREBASE_DATABASE, + MESSAGE_CODEC, FlStandardMessageCodec) + +/** + * Custom type ID constants: + * + * Constants used to identify custom types in the codec. + * They are used in the codec to encode and decode custom types. + * They may be used in custom object creation functions to identify the type. + */ +extern const int firebase_database_database_pigeon_settings_type_id; +extern const int firebase_database_database_pigeon_firebase_app_type_id; +extern const int firebase_database_database_reference_platform_type_id; +extern const int firebase_database_database_reference_request_type_id; +extern const int firebase_database_update_request_type_id; +extern const int firebase_database_transaction_request_type_id; +extern const int firebase_database_query_request_type_id; +extern const int firebase_database_transaction_handler_result_type_id; + +G_DECLARE_FINAL_TYPE(FirebaseDatabaseFirebaseDatabaseHostApi, + firebase_database_firebase_database_host_api, + FIREBASE_DATABASE, FIREBASE_DATABASE_HOST_API, GObject) + +G_DECLARE_FINAL_TYPE( + FirebaseDatabaseFirebaseDatabaseHostApiResponseHandle, + firebase_database_firebase_database_host_api_response_handle, + FIREBASE_DATABASE, FIREBASE_DATABASE_HOST_API_RESPONSE_HANDLE, GObject) + +/** + * FirebaseDatabaseFirebaseDatabaseHostApiVTable: + * + * Table of functions exposed by FirebaseDatabaseHostApi to be implemented by + * the API provider. + */ +typedef struct { + void (*go_online)( + FirebaseDatabaseDatabasePigeonFirebaseApp* app, + FirebaseDatabaseFirebaseDatabaseHostApiResponseHandle* response_handle, + gpointer user_data); + void (*go_offline)( + FirebaseDatabaseDatabasePigeonFirebaseApp* app, + FirebaseDatabaseFirebaseDatabaseHostApiResponseHandle* response_handle, + gpointer user_data); + void (*set_persistence_enabled)( + FirebaseDatabaseDatabasePigeonFirebaseApp* app, gboolean enabled, + FirebaseDatabaseFirebaseDatabaseHostApiResponseHandle* response_handle, + gpointer user_data); + void (*set_persistence_cache_size_bytes)( + FirebaseDatabaseDatabasePigeonFirebaseApp* app, int64_t cache_size, + FirebaseDatabaseFirebaseDatabaseHostApiResponseHandle* response_handle, + gpointer user_data); + void (*set_logging_enabled)( + FirebaseDatabaseDatabasePigeonFirebaseApp* app, gboolean enabled, + FirebaseDatabaseFirebaseDatabaseHostApiResponseHandle* response_handle, + gpointer user_data); + void (*use_database_emulator)( + FirebaseDatabaseDatabasePigeonFirebaseApp* app, const gchar* host, + int64_t port, + FirebaseDatabaseFirebaseDatabaseHostApiResponseHandle* response_handle, + gpointer user_data); + void (*ref)( + FirebaseDatabaseDatabasePigeonFirebaseApp* app, const gchar* path, + FirebaseDatabaseFirebaseDatabaseHostApiResponseHandle* response_handle, + gpointer user_data); + void (*ref_from_u_r_l)( + FirebaseDatabaseDatabasePigeonFirebaseApp* app, const gchar* url, + FirebaseDatabaseFirebaseDatabaseHostApiResponseHandle* response_handle, + gpointer user_data); + void (*purge_outstanding_writes)( + FirebaseDatabaseDatabasePigeonFirebaseApp* app, + FirebaseDatabaseFirebaseDatabaseHostApiResponseHandle* response_handle, + gpointer user_data); + void (*database_reference_set)( + FirebaseDatabaseDatabasePigeonFirebaseApp* app, + FirebaseDatabaseDatabaseReferenceRequest* request, + FirebaseDatabaseFirebaseDatabaseHostApiResponseHandle* response_handle, + gpointer user_data); + void (*database_reference_set_with_priority)( + FirebaseDatabaseDatabasePigeonFirebaseApp* app, + FirebaseDatabaseDatabaseReferenceRequest* request, + FirebaseDatabaseFirebaseDatabaseHostApiResponseHandle* response_handle, + gpointer user_data); + void (*database_reference_update)( + FirebaseDatabaseDatabasePigeonFirebaseApp* app, + FirebaseDatabaseUpdateRequest* request, + FirebaseDatabaseFirebaseDatabaseHostApiResponseHandle* response_handle, + gpointer user_data); + void (*database_reference_set_priority)( + FirebaseDatabaseDatabasePigeonFirebaseApp* app, + FirebaseDatabaseDatabaseReferenceRequest* request, + FirebaseDatabaseFirebaseDatabaseHostApiResponseHandle* response_handle, + gpointer user_data); + void (*database_reference_run_transaction)( + FirebaseDatabaseDatabasePigeonFirebaseApp* app, + FirebaseDatabaseTransactionRequest* request, + FirebaseDatabaseFirebaseDatabaseHostApiResponseHandle* response_handle, + gpointer user_data); + void (*database_reference_get_transaction_result)( + FirebaseDatabaseDatabasePigeonFirebaseApp* app, int64_t transaction_key, + FirebaseDatabaseFirebaseDatabaseHostApiResponseHandle* response_handle, + gpointer user_data); + void (*on_disconnect_set)( + FirebaseDatabaseDatabasePigeonFirebaseApp* app, + FirebaseDatabaseDatabaseReferenceRequest* request, + FirebaseDatabaseFirebaseDatabaseHostApiResponseHandle* response_handle, + gpointer user_data); + void (*on_disconnect_set_with_priority)( + FirebaseDatabaseDatabasePigeonFirebaseApp* app, + FirebaseDatabaseDatabaseReferenceRequest* request, + FirebaseDatabaseFirebaseDatabaseHostApiResponseHandle* response_handle, + gpointer user_data); + void (*on_disconnect_update)( + FirebaseDatabaseDatabasePigeonFirebaseApp* app, + FirebaseDatabaseUpdateRequest* request, + FirebaseDatabaseFirebaseDatabaseHostApiResponseHandle* response_handle, + gpointer user_data); + void (*on_disconnect_cancel)( + FirebaseDatabaseDatabasePigeonFirebaseApp* app, const gchar* path, + FirebaseDatabaseFirebaseDatabaseHostApiResponseHandle* response_handle, + gpointer user_data); + void (*query_observe)( + FirebaseDatabaseDatabasePigeonFirebaseApp* app, + FirebaseDatabaseQueryRequest* request, + FirebaseDatabaseFirebaseDatabaseHostApiResponseHandle* response_handle, + gpointer user_data); + void (*query_keep_synced)( + FirebaseDatabaseDatabasePigeonFirebaseApp* app, + FirebaseDatabaseQueryRequest* request, + FirebaseDatabaseFirebaseDatabaseHostApiResponseHandle* response_handle, + gpointer user_data); + void (*query_get)( + FirebaseDatabaseDatabasePigeonFirebaseApp* app, + FirebaseDatabaseQueryRequest* request, + FirebaseDatabaseFirebaseDatabaseHostApiResponseHandle* response_handle, + gpointer user_data); +} FirebaseDatabaseFirebaseDatabaseHostApiVTable; + +/** + * firebase_database_firebase_database_host_api_set_method_handlers: + * + * @messenger: an #FlBinaryMessenger. + * @suffix: (allow-none): a suffix to add to the API or %NULL for none. + * @vtable: implementations of the methods in this API. + * @user_data: (closure): user data to pass to the functions in @vtable. + * @user_data_free_func: (allow-none): a function which gets called to free + * @user_data, or %NULL. + * + * Connects the method handlers in the FirebaseDatabaseHostApi API. + */ +void firebase_database_firebase_database_host_api_set_method_handlers( + FlBinaryMessenger* messenger, const gchar* suffix, + const FirebaseDatabaseFirebaseDatabaseHostApiVTable* vtable, + gpointer user_data, GDestroyNotify user_data_free_func); + +/** + * firebase_database_firebase_database_host_api_clear_method_handlers: + * + * @messenger: an #FlBinaryMessenger. + * @suffix: (allow-none): a suffix to add to the API or %NULL for none. + * + * Clears the method handlers in the FirebaseDatabaseHostApi API. + */ +void firebase_database_firebase_database_host_api_clear_method_handlers( + FlBinaryMessenger* messenger, const gchar* suffix); + +/** + * firebase_database_firebase_database_host_api_respond_go_online: + * @response_handle: a #FirebaseDatabaseFirebaseDatabaseHostApiResponseHandle. + * + * Responds to FirebaseDatabaseHostApi.goOnline. + */ +void firebase_database_firebase_database_host_api_respond_go_online( + FirebaseDatabaseFirebaseDatabaseHostApiResponseHandle* response_handle); + +/** + * firebase_database_firebase_database_host_api_respond_error_go_online: + * @response_handle: a #FirebaseDatabaseFirebaseDatabaseHostApiResponseHandle. + * @code: error code. + * @message: error message. + * @details: (allow-none): error details or %NULL. + * + * Responds with an error to FirebaseDatabaseHostApi.goOnline. + */ +void firebase_database_firebase_database_host_api_respond_error_go_online( + FirebaseDatabaseFirebaseDatabaseHostApiResponseHandle* response_handle, + const gchar* code, const gchar* message, FlValue* details); + +/** + * firebase_database_firebase_database_host_api_respond_go_offline: + * @response_handle: a #FirebaseDatabaseFirebaseDatabaseHostApiResponseHandle. + * + * Responds to FirebaseDatabaseHostApi.goOffline. + */ +void firebase_database_firebase_database_host_api_respond_go_offline( + FirebaseDatabaseFirebaseDatabaseHostApiResponseHandle* response_handle); + +/** + * firebase_database_firebase_database_host_api_respond_error_go_offline: + * @response_handle: a #FirebaseDatabaseFirebaseDatabaseHostApiResponseHandle. + * @code: error code. + * @message: error message. + * @details: (allow-none): error details or %NULL. + * + * Responds with an error to FirebaseDatabaseHostApi.goOffline. + */ +void firebase_database_firebase_database_host_api_respond_error_go_offline( + FirebaseDatabaseFirebaseDatabaseHostApiResponseHandle* response_handle, + const gchar* code, const gchar* message, FlValue* details); + +/** + * firebase_database_firebase_database_host_api_respond_set_persistence_enabled: + * @response_handle: a #FirebaseDatabaseFirebaseDatabaseHostApiResponseHandle. + * + * Responds to FirebaseDatabaseHostApi.setPersistenceEnabled. + */ +void firebase_database_firebase_database_host_api_respond_set_persistence_enabled( + FirebaseDatabaseFirebaseDatabaseHostApiResponseHandle* response_handle); + +/** + * firebase_database_firebase_database_host_api_respond_error_set_persistence_enabled: + * @response_handle: a #FirebaseDatabaseFirebaseDatabaseHostApiResponseHandle. + * @code: error code. + * @message: error message. + * @details: (allow-none): error details or %NULL. + * + * Responds with an error to FirebaseDatabaseHostApi.setPersistenceEnabled. + */ +void firebase_database_firebase_database_host_api_respond_error_set_persistence_enabled( + FirebaseDatabaseFirebaseDatabaseHostApiResponseHandle* response_handle, + const gchar* code, const gchar* message, FlValue* details); + +/** + * firebase_database_firebase_database_host_api_respond_set_persistence_cache_size_bytes: + * @response_handle: a #FirebaseDatabaseFirebaseDatabaseHostApiResponseHandle. + * + * Responds to FirebaseDatabaseHostApi.setPersistenceCacheSizeBytes. + */ +void firebase_database_firebase_database_host_api_respond_set_persistence_cache_size_bytes( + FirebaseDatabaseFirebaseDatabaseHostApiResponseHandle* response_handle); + +/** + * firebase_database_firebase_database_host_api_respond_error_set_persistence_cache_size_bytes: + * @response_handle: a #FirebaseDatabaseFirebaseDatabaseHostApiResponseHandle. + * @code: error code. + * @message: error message. + * @details: (allow-none): error details or %NULL. + * + * Responds with an error to + * FirebaseDatabaseHostApi.setPersistenceCacheSizeBytes. + */ +void firebase_database_firebase_database_host_api_respond_error_set_persistence_cache_size_bytes( + FirebaseDatabaseFirebaseDatabaseHostApiResponseHandle* response_handle, + const gchar* code, const gchar* message, FlValue* details); + +/** + * firebase_database_firebase_database_host_api_respond_set_logging_enabled: + * @response_handle: a #FirebaseDatabaseFirebaseDatabaseHostApiResponseHandle. + * + * Responds to FirebaseDatabaseHostApi.setLoggingEnabled. + */ +void firebase_database_firebase_database_host_api_respond_set_logging_enabled( + FirebaseDatabaseFirebaseDatabaseHostApiResponseHandle* response_handle); + +/** + * firebase_database_firebase_database_host_api_respond_error_set_logging_enabled: + * @response_handle: a #FirebaseDatabaseFirebaseDatabaseHostApiResponseHandle. + * @code: error code. + * @message: error message. + * @details: (allow-none): error details or %NULL. + * + * Responds with an error to FirebaseDatabaseHostApi.setLoggingEnabled. + */ +void firebase_database_firebase_database_host_api_respond_error_set_logging_enabled( + FirebaseDatabaseFirebaseDatabaseHostApiResponseHandle* response_handle, + const gchar* code, const gchar* message, FlValue* details); + +/** + * firebase_database_firebase_database_host_api_respond_use_database_emulator: + * @response_handle: a #FirebaseDatabaseFirebaseDatabaseHostApiResponseHandle. + * + * Responds to FirebaseDatabaseHostApi.useDatabaseEmulator. + */ +void firebase_database_firebase_database_host_api_respond_use_database_emulator( + FirebaseDatabaseFirebaseDatabaseHostApiResponseHandle* response_handle); + +/** + * firebase_database_firebase_database_host_api_respond_error_use_database_emulator: + * @response_handle: a #FirebaseDatabaseFirebaseDatabaseHostApiResponseHandle. + * @code: error code. + * @message: error message. + * @details: (allow-none): error details or %NULL. + * + * Responds with an error to FirebaseDatabaseHostApi.useDatabaseEmulator. + */ +void firebase_database_firebase_database_host_api_respond_error_use_database_emulator( + FirebaseDatabaseFirebaseDatabaseHostApiResponseHandle* response_handle, + const gchar* code, const gchar* message, FlValue* details); + +/** + * firebase_database_firebase_database_host_api_respond_ref: + * @response_handle: a #FirebaseDatabaseFirebaseDatabaseHostApiResponseHandle. + * @return_value: location to write the value returned by this method. + * + * Responds to FirebaseDatabaseHostApi.ref. + */ +void firebase_database_firebase_database_host_api_respond_ref( + FirebaseDatabaseFirebaseDatabaseHostApiResponseHandle* response_handle, + FirebaseDatabaseDatabaseReferencePlatform* return_value); + +/** + * firebase_database_firebase_database_host_api_respond_error_ref: + * @response_handle: a #FirebaseDatabaseFirebaseDatabaseHostApiResponseHandle. + * @code: error code. + * @message: error message. + * @details: (allow-none): error details or %NULL. + * + * Responds with an error to FirebaseDatabaseHostApi.ref. + */ +void firebase_database_firebase_database_host_api_respond_error_ref( + FirebaseDatabaseFirebaseDatabaseHostApiResponseHandle* response_handle, + const gchar* code, const gchar* message, FlValue* details); + +/** + * firebase_database_firebase_database_host_api_respond_ref_from_u_r_l: + * @response_handle: a #FirebaseDatabaseFirebaseDatabaseHostApiResponseHandle. + * @return_value: location to write the value returned by this method. + * + * Responds to FirebaseDatabaseHostApi.refFromURL. + */ +void firebase_database_firebase_database_host_api_respond_ref_from_u_r_l( + FirebaseDatabaseFirebaseDatabaseHostApiResponseHandle* response_handle, + FirebaseDatabaseDatabaseReferencePlatform* return_value); + +/** + * firebase_database_firebase_database_host_api_respond_error_ref_from_u_r_l: + * @response_handle: a #FirebaseDatabaseFirebaseDatabaseHostApiResponseHandle. + * @code: error code. + * @message: error message. + * @details: (allow-none): error details or %NULL. + * + * Responds with an error to FirebaseDatabaseHostApi.refFromURL. + */ +void firebase_database_firebase_database_host_api_respond_error_ref_from_u_r_l( + FirebaseDatabaseFirebaseDatabaseHostApiResponseHandle* response_handle, + const gchar* code, const gchar* message, FlValue* details); + +/** + * firebase_database_firebase_database_host_api_respond_purge_outstanding_writes: + * @response_handle: a #FirebaseDatabaseFirebaseDatabaseHostApiResponseHandle. + * + * Responds to FirebaseDatabaseHostApi.purgeOutstandingWrites. + */ +void firebase_database_firebase_database_host_api_respond_purge_outstanding_writes( + FirebaseDatabaseFirebaseDatabaseHostApiResponseHandle* response_handle); + +/** + * firebase_database_firebase_database_host_api_respond_error_purge_outstanding_writes: + * @response_handle: a #FirebaseDatabaseFirebaseDatabaseHostApiResponseHandle. + * @code: error code. + * @message: error message. + * @details: (allow-none): error details or %NULL. + * + * Responds with an error to FirebaseDatabaseHostApi.purgeOutstandingWrites. + */ +void firebase_database_firebase_database_host_api_respond_error_purge_outstanding_writes( + FirebaseDatabaseFirebaseDatabaseHostApiResponseHandle* response_handle, + const gchar* code, const gchar* message, FlValue* details); + +/** + * firebase_database_firebase_database_host_api_respond_database_reference_set: + * @response_handle: a #FirebaseDatabaseFirebaseDatabaseHostApiResponseHandle. + * + * Responds to FirebaseDatabaseHostApi.databaseReferenceSet. + */ +void firebase_database_firebase_database_host_api_respond_database_reference_set( + FirebaseDatabaseFirebaseDatabaseHostApiResponseHandle* response_handle); + +/** + * firebase_database_firebase_database_host_api_respond_error_database_reference_set: + * @response_handle: a #FirebaseDatabaseFirebaseDatabaseHostApiResponseHandle. + * @code: error code. + * @message: error message. + * @details: (allow-none): error details or %NULL. + * + * Responds with an error to FirebaseDatabaseHostApi.databaseReferenceSet. + */ +void firebase_database_firebase_database_host_api_respond_error_database_reference_set( + FirebaseDatabaseFirebaseDatabaseHostApiResponseHandle* response_handle, + const gchar* code, const gchar* message, FlValue* details); + +/** + * firebase_database_firebase_database_host_api_respond_database_reference_set_with_priority: + * @response_handle: a #FirebaseDatabaseFirebaseDatabaseHostApiResponseHandle. + * + * Responds to FirebaseDatabaseHostApi.databaseReferenceSetWithPriority. + */ +void firebase_database_firebase_database_host_api_respond_database_reference_set_with_priority( + FirebaseDatabaseFirebaseDatabaseHostApiResponseHandle* response_handle); + +/** + * firebase_database_firebase_database_host_api_respond_error_database_reference_set_with_priority: + * @response_handle: a #FirebaseDatabaseFirebaseDatabaseHostApiResponseHandle. + * @code: error code. + * @message: error message. + * @details: (allow-none): error details or %NULL. + * + * Responds with an error to + * FirebaseDatabaseHostApi.databaseReferenceSetWithPriority. + */ +void firebase_database_firebase_database_host_api_respond_error_database_reference_set_with_priority( + FirebaseDatabaseFirebaseDatabaseHostApiResponseHandle* response_handle, + const gchar* code, const gchar* message, FlValue* details); + +/** + * firebase_database_firebase_database_host_api_respond_database_reference_update: + * @response_handle: a #FirebaseDatabaseFirebaseDatabaseHostApiResponseHandle. + * + * Responds to FirebaseDatabaseHostApi.databaseReferenceUpdate. + */ +void firebase_database_firebase_database_host_api_respond_database_reference_update( + FirebaseDatabaseFirebaseDatabaseHostApiResponseHandle* response_handle); + +/** + * firebase_database_firebase_database_host_api_respond_error_database_reference_update: + * @response_handle: a #FirebaseDatabaseFirebaseDatabaseHostApiResponseHandle. + * @code: error code. + * @message: error message. + * @details: (allow-none): error details or %NULL. + * + * Responds with an error to FirebaseDatabaseHostApi.databaseReferenceUpdate. + */ +void firebase_database_firebase_database_host_api_respond_error_database_reference_update( + FirebaseDatabaseFirebaseDatabaseHostApiResponseHandle* response_handle, + const gchar* code, const gchar* message, FlValue* details); + +/** + * firebase_database_firebase_database_host_api_respond_database_reference_set_priority: + * @response_handle: a #FirebaseDatabaseFirebaseDatabaseHostApiResponseHandle. + * + * Responds to FirebaseDatabaseHostApi.databaseReferenceSetPriority. + */ +void firebase_database_firebase_database_host_api_respond_database_reference_set_priority( + FirebaseDatabaseFirebaseDatabaseHostApiResponseHandle* response_handle); + +/** + * firebase_database_firebase_database_host_api_respond_error_database_reference_set_priority: + * @response_handle: a #FirebaseDatabaseFirebaseDatabaseHostApiResponseHandle. + * @code: error code. + * @message: error message. + * @details: (allow-none): error details or %NULL. + * + * Responds with an error to + * FirebaseDatabaseHostApi.databaseReferenceSetPriority. + */ +void firebase_database_firebase_database_host_api_respond_error_database_reference_set_priority( + FirebaseDatabaseFirebaseDatabaseHostApiResponseHandle* response_handle, + const gchar* code, const gchar* message, FlValue* details); + +/** + * firebase_database_firebase_database_host_api_respond_database_reference_run_transaction: + * @response_handle: a #FirebaseDatabaseFirebaseDatabaseHostApiResponseHandle. + * + * Responds to FirebaseDatabaseHostApi.databaseReferenceRunTransaction. + */ +void firebase_database_firebase_database_host_api_respond_database_reference_run_transaction( + FirebaseDatabaseFirebaseDatabaseHostApiResponseHandle* response_handle); + +/** + * firebase_database_firebase_database_host_api_respond_error_database_reference_run_transaction: + * @response_handle: a #FirebaseDatabaseFirebaseDatabaseHostApiResponseHandle. + * @code: error code. + * @message: error message. + * @details: (allow-none): error details or %NULL. + * + * Responds with an error to + * FirebaseDatabaseHostApi.databaseReferenceRunTransaction. + */ +void firebase_database_firebase_database_host_api_respond_error_database_reference_run_transaction( + FirebaseDatabaseFirebaseDatabaseHostApiResponseHandle* response_handle, + const gchar* code, const gchar* message, FlValue* details); + +/** + * firebase_database_firebase_database_host_api_respond_database_reference_get_transaction_result: + * @response_handle: a #FirebaseDatabaseFirebaseDatabaseHostApiResponseHandle. + * @return_value: location to write the value returned by this method. + * + * Responds to FirebaseDatabaseHostApi.databaseReferenceGetTransactionResult. + */ +void firebase_database_firebase_database_host_api_respond_database_reference_get_transaction_result( + FirebaseDatabaseFirebaseDatabaseHostApiResponseHandle* response_handle, + FlValue* return_value); + +/** + * firebase_database_firebase_database_host_api_respond_error_database_reference_get_transaction_result: + * @response_handle: a #FirebaseDatabaseFirebaseDatabaseHostApiResponseHandle. + * @code: error code. + * @message: error message. + * @details: (allow-none): error details or %NULL. + * + * Responds with an error to + * FirebaseDatabaseHostApi.databaseReferenceGetTransactionResult. + */ +void firebase_database_firebase_database_host_api_respond_error_database_reference_get_transaction_result( + FirebaseDatabaseFirebaseDatabaseHostApiResponseHandle* response_handle, + const gchar* code, const gchar* message, FlValue* details); + +/** + * firebase_database_firebase_database_host_api_respond_on_disconnect_set: + * @response_handle: a #FirebaseDatabaseFirebaseDatabaseHostApiResponseHandle. + * + * Responds to FirebaseDatabaseHostApi.onDisconnectSet. + */ +void firebase_database_firebase_database_host_api_respond_on_disconnect_set( + FirebaseDatabaseFirebaseDatabaseHostApiResponseHandle* response_handle); + +/** + * firebase_database_firebase_database_host_api_respond_error_on_disconnect_set: + * @response_handle: a #FirebaseDatabaseFirebaseDatabaseHostApiResponseHandle. + * @code: error code. + * @message: error message. + * @details: (allow-none): error details or %NULL. + * + * Responds with an error to FirebaseDatabaseHostApi.onDisconnectSet. + */ +void firebase_database_firebase_database_host_api_respond_error_on_disconnect_set( + FirebaseDatabaseFirebaseDatabaseHostApiResponseHandle* response_handle, + const gchar* code, const gchar* message, FlValue* details); + +/** + * firebase_database_firebase_database_host_api_respond_on_disconnect_set_with_priority: + * @response_handle: a #FirebaseDatabaseFirebaseDatabaseHostApiResponseHandle. + * + * Responds to FirebaseDatabaseHostApi.onDisconnectSetWithPriority. + */ +void firebase_database_firebase_database_host_api_respond_on_disconnect_set_with_priority( + FirebaseDatabaseFirebaseDatabaseHostApiResponseHandle* response_handle); + +/** + * firebase_database_firebase_database_host_api_respond_error_on_disconnect_set_with_priority: + * @response_handle: a #FirebaseDatabaseFirebaseDatabaseHostApiResponseHandle. + * @code: error code. + * @message: error message. + * @details: (allow-none): error details or %NULL. + * + * Responds with an error to + * FirebaseDatabaseHostApi.onDisconnectSetWithPriority. + */ +void firebase_database_firebase_database_host_api_respond_error_on_disconnect_set_with_priority( + FirebaseDatabaseFirebaseDatabaseHostApiResponseHandle* response_handle, + const gchar* code, const gchar* message, FlValue* details); + +/** + * firebase_database_firebase_database_host_api_respond_on_disconnect_update: + * @response_handle: a #FirebaseDatabaseFirebaseDatabaseHostApiResponseHandle. + * + * Responds to FirebaseDatabaseHostApi.onDisconnectUpdate. + */ +void firebase_database_firebase_database_host_api_respond_on_disconnect_update( + FirebaseDatabaseFirebaseDatabaseHostApiResponseHandle* response_handle); + +/** + * firebase_database_firebase_database_host_api_respond_error_on_disconnect_update: + * @response_handle: a #FirebaseDatabaseFirebaseDatabaseHostApiResponseHandle. + * @code: error code. + * @message: error message. + * @details: (allow-none): error details or %NULL. + * + * Responds with an error to FirebaseDatabaseHostApi.onDisconnectUpdate. + */ +void firebase_database_firebase_database_host_api_respond_error_on_disconnect_update( + FirebaseDatabaseFirebaseDatabaseHostApiResponseHandle* response_handle, + const gchar* code, const gchar* message, FlValue* details); + +/** + * firebase_database_firebase_database_host_api_respond_on_disconnect_cancel: + * @response_handle: a #FirebaseDatabaseFirebaseDatabaseHostApiResponseHandle. + * + * Responds to FirebaseDatabaseHostApi.onDisconnectCancel. + */ +void firebase_database_firebase_database_host_api_respond_on_disconnect_cancel( + FirebaseDatabaseFirebaseDatabaseHostApiResponseHandle* response_handle); + +/** + * firebase_database_firebase_database_host_api_respond_error_on_disconnect_cancel: + * @response_handle: a #FirebaseDatabaseFirebaseDatabaseHostApiResponseHandle. + * @code: error code. + * @message: error message. + * @details: (allow-none): error details or %NULL. + * + * Responds with an error to FirebaseDatabaseHostApi.onDisconnectCancel. + */ +void firebase_database_firebase_database_host_api_respond_error_on_disconnect_cancel( + FirebaseDatabaseFirebaseDatabaseHostApiResponseHandle* response_handle, + const gchar* code, const gchar* message, FlValue* details); + +/** + * firebase_database_firebase_database_host_api_respond_query_observe: + * @response_handle: a #FirebaseDatabaseFirebaseDatabaseHostApiResponseHandle. + * @return_value: location to write the value returned by this method. + * + * Responds to FirebaseDatabaseHostApi.queryObserve. + */ +void firebase_database_firebase_database_host_api_respond_query_observe( + FirebaseDatabaseFirebaseDatabaseHostApiResponseHandle* response_handle, + const gchar* return_value); + +/** + * firebase_database_firebase_database_host_api_respond_error_query_observe: + * @response_handle: a #FirebaseDatabaseFirebaseDatabaseHostApiResponseHandle. + * @code: error code. + * @message: error message. + * @details: (allow-none): error details or %NULL. + * + * Responds with an error to FirebaseDatabaseHostApi.queryObserve. + */ +void firebase_database_firebase_database_host_api_respond_error_query_observe( + FirebaseDatabaseFirebaseDatabaseHostApiResponseHandle* response_handle, + const gchar* code, const gchar* message, FlValue* details); + +/** + * firebase_database_firebase_database_host_api_respond_query_keep_synced: + * @response_handle: a #FirebaseDatabaseFirebaseDatabaseHostApiResponseHandle. + * + * Responds to FirebaseDatabaseHostApi.queryKeepSynced. + */ +void firebase_database_firebase_database_host_api_respond_query_keep_synced( + FirebaseDatabaseFirebaseDatabaseHostApiResponseHandle* response_handle); + +/** + * firebase_database_firebase_database_host_api_respond_error_query_keep_synced: + * @response_handle: a #FirebaseDatabaseFirebaseDatabaseHostApiResponseHandle. + * @code: error code. + * @message: error message. + * @details: (allow-none): error details or %NULL. + * + * Responds with an error to FirebaseDatabaseHostApi.queryKeepSynced. + */ +void firebase_database_firebase_database_host_api_respond_error_query_keep_synced( + FirebaseDatabaseFirebaseDatabaseHostApiResponseHandle* response_handle, + const gchar* code, const gchar* message, FlValue* details); + +/** + * firebase_database_firebase_database_host_api_respond_query_get: + * @response_handle: a #FirebaseDatabaseFirebaseDatabaseHostApiResponseHandle. + * @return_value: location to write the value returned by this method. + * + * Responds to FirebaseDatabaseHostApi.queryGet. + */ +void firebase_database_firebase_database_host_api_respond_query_get( + FirebaseDatabaseFirebaseDatabaseHostApiResponseHandle* response_handle, + FlValue* return_value); + +/** + * firebase_database_firebase_database_host_api_respond_error_query_get: + * @response_handle: a #FirebaseDatabaseFirebaseDatabaseHostApiResponseHandle. + * @code: error code. + * @message: error message. + * @details: (allow-none): error details or %NULL. + * + * Responds with an error to FirebaseDatabaseHostApi.queryGet. + */ +void firebase_database_firebase_database_host_api_respond_error_query_get( + FirebaseDatabaseFirebaseDatabaseHostApiResponseHandle* response_handle, + const gchar* code, const gchar* message, FlValue* details); + +G_DECLARE_FINAL_TYPE( + FirebaseDatabaseFirebaseDatabaseFlutterApiCallTransactionHandlerResponse, + firebase_database_firebase_database_flutter_api_call_transaction_handler_response, + FIREBASE_DATABASE, + FIREBASE_DATABASE_FLUTTER_API_CALL_TRANSACTION_HANDLER_RESPONSE, GObject) + +/** + * firebase_database_firebase_database_flutter_api_call_transaction_handler_response_is_error: + * @response: a + * #FirebaseDatabaseFirebaseDatabaseFlutterApiCallTransactionHandlerResponse. + * + * Checks if a response to FirebaseDatabaseFlutterApi.callTransactionHandler is + * an error. + * + * Returns: a %TRUE if this response is an error. + */ +gboolean +firebase_database_firebase_database_flutter_api_call_transaction_handler_response_is_error( + FirebaseDatabaseFirebaseDatabaseFlutterApiCallTransactionHandlerResponse* + response); + +/** + * firebase_database_firebase_database_flutter_api_call_transaction_handler_response_get_error_code: + * @response: a + * #FirebaseDatabaseFirebaseDatabaseFlutterApiCallTransactionHandlerResponse. + * + * Get the error code for this response. + * + * Returns: an error code or %NULL if not an error. + */ +const gchar* +firebase_database_firebase_database_flutter_api_call_transaction_handler_response_get_error_code( + FirebaseDatabaseFirebaseDatabaseFlutterApiCallTransactionHandlerResponse* + response); + +/** + * firebase_database_firebase_database_flutter_api_call_transaction_handler_response_get_error_message: + * @response: a + * #FirebaseDatabaseFirebaseDatabaseFlutterApiCallTransactionHandlerResponse. + * + * Get the error message for this response. + * + * Returns: an error message. + */ +const gchar* +firebase_database_firebase_database_flutter_api_call_transaction_handler_response_get_error_message( + FirebaseDatabaseFirebaseDatabaseFlutterApiCallTransactionHandlerResponse* + response); + +/** + * firebase_database_firebase_database_flutter_api_call_transaction_handler_response_get_error_details: + * @response: a + * #FirebaseDatabaseFirebaseDatabaseFlutterApiCallTransactionHandlerResponse. + * + * Get the error details for this response. + * + * Returns: (allow-none): an error details or %NULL. + */ +FlValue* +firebase_database_firebase_database_flutter_api_call_transaction_handler_response_get_error_details( + FirebaseDatabaseFirebaseDatabaseFlutterApiCallTransactionHandlerResponse* + response); + +/** + * firebase_database_firebase_database_flutter_api_call_transaction_handler_response_get_return_value: + * @response: a + * #FirebaseDatabaseFirebaseDatabaseFlutterApiCallTransactionHandlerResponse. + * + * Get the return value for this response. + * + * Returns: a return value. + */ +FirebaseDatabaseTransactionHandlerResult* +firebase_database_firebase_database_flutter_api_call_transaction_handler_response_get_return_value( + FirebaseDatabaseFirebaseDatabaseFlutterApiCallTransactionHandlerResponse* + response); + +/** + * FirebaseDatabaseFirebaseDatabaseFlutterApi: + * + */ + +G_DECLARE_FINAL_TYPE(FirebaseDatabaseFirebaseDatabaseFlutterApi, + firebase_database_firebase_database_flutter_api, + FIREBASE_DATABASE, FIREBASE_DATABASE_FLUTTER_API, GObject) + +/** + * firebase_database_firebase_database_flutter_api_new: + * @messenger: an #FlBinaryMessenger. + * @suffix: (allow-none): a suffix to add to the API or %NULL for none. + * + * Creates a new object to access the FirebaseDatabaseFlutterApi API. + * + * Returns: a new #FirebaseDatabaseFirebaseDatabaseFlutterApi + */ +FirebaseDatabaseFirebaseDatabaseFlutterApi* +firebase_database_firebase_database_flutter_api_new( + FlBinaryMessenger* messenger, const gchar* suffix); + +/** + * firebase_database_firebase_database_flutter_api_call_transaction_handler: + * @api: a #FirebaseDatabaseFirebaseDatabaseFlutterApi. + * @transaction_key: parameter for this method. + * @snapshot_value: (allow-none): parameter for this method. + * @cancellable: (allow-none): a #GCancellable or %NULL. + * @callback: (scope async): (allow-none): a #GAsyncReadyCallback to call when + * the call is complete or %NULL to ignore the response. + * @user_data: (closure): user data to pass to @callback. + * + */ +void firebase_database_firebase_database_flutter_api_call_transaction_handler( + FirebaseDatabaseFirebaseDatabaseFlutterApi* api, int64_t transaction_key, + FlValue* snapshot_value, GCancellable* cancellable, + GAsyncReadyCallback callback, gpointer user_data); + +/** + * firebase_database_firebase_database_flutter_api_call_transaction_handler_finish: + * @api: a #FirebaseDatabaseFirebaseDatabaseFlutterApi. + * @result: a #GAsyncResult. + * @error: (allow-none): #GError location to store the error occurring, or %NULL + * to ignore. + * + * Completes a + * firebase_database_firebase_database_flutter_api_call_transaction_handler() + * call. + * + * Returns: a + * #FirebaseDatabaseFirebaseDatabaseFlutterApiCallTransactionHandlerResponse or + * %NULL on error. + */ +FirebaseDatabaseFirebaseDatabaseFlutterApiCallTransactionHandlerResponse* +firebase_database_firebase_database_flutter_api_call_transaction_handler_finish( + FirebaseDatabaseFirebaseDatabaseFlutterApi* api, GAsyncResult* result, + GError** error); + +G_END_DECLS + +#endif // PIGEON_MESSAGES_G_H_ diff --git a/packages/firebase_database/firebase_database/linux/plugin_version.h.in b/packages/firebase_database/firebase_database/linux/plugin_version.h.in new file mode 100644 index 000000000000..ed50144a38a3 --- /dev/null +++ b/packages/firebase_database/firebase_database/linux/plugin_version.h.in @@ -0,0 +1,13 @@ +// Copyright 2026, the Chromium project authors. Please see the AUTHORS file +// for details. All rights reserved. Use of this source code is governed by a +// BSD-style license that can be found in the LICENSE file. + +#ifndef PLUGIN_VERSION_CONFIG_H +#define PLUGIN_VERSION_CONFIG_H + +namespace firebase_database_linux { + +std::string getPluginVersion() { return "@PLUGIN_VERSION@"; } +} // namespace firebase_database_linux + +#endif // PLUGIN_VERSION_CONFIG_H diff --git a/packages/firebase_database/firebase_database/pubspec.yaml b/packages/firebase_database/firebase_database/pubspec.yaml index eb6bf6b1c5ac..0ca54fb16e7c 100755 --- a/packages/firebase_database/firebase_database/pubspec.yaml +++ b/packages/firebase_database/firebase_database/pubspec.yaml @@ -38,6 +38,8 @@ flutter: pluginClass: FirebaseDatabasePlugin ios: pluginClass: FLTFirebaseDatabasePlugin + linux: + pluginClass: FirebaseDatabasePlugin macos: pluginClass: FLTFirebaseDatabasePlugin windows: diff --git a/packages/firebase_database/firebase_database_platform_interface/pigeons/messages.dart b/packages/firebase_database/firebase_database_platform_interface/pigeons/messages.dart index 2db035bbae4c..19b0a30adf3e 100644 --- a/packages/firebase_database/firebase_database_platform_interface/pigeons/messages.dart +++ b/packages/firebase_database/firebase_database_platform_interface/pigeons/messages.dart @@ -19,6 +19,12 @@ import 'package:pigeon/pigeon.dart'; cppHeaderOut: '../firebase_database/windows/messages.g.h', cppSourceOut: '../firebase_database/windows/messages.g.cpp', cppOptions: CppOptions(namespace: 'firebase_database_windows'), + gobjectHeaderOut: '../firebase_database/linux/messages.g.h', + gobjectSourceOut: '../firebase_database/linux/messages.g.cc', + gobjectOptions: GObjectOptions( + headerIncludePath: 'messages.g.h', + module: 'FirebaseDatabase', + ), copyrightHeader: 'pigeons/copyright.txt', ), ) diff --git a/packages/firebase_remote_config/firebase_remote_config/example/.metadata b/packages/firebase_remote_config/firebase_remote_config/example/.metadata index 0e24a813d4d6..7b6553e84fee 100644 --- a/packages/firebase_remote_config/firebase_remote_config/example/.metadata +++ b/packages/firebase_remote_config/firebase_remote_config/example/.metadata @@ -18,6 +18,9 @@ migration: - platform: windows create_revision: 67323de285b00232883f53b84095eb72be97d35c base_revision: 67323de285b00232883f53b84095eb72be97d35c + - platform: linux + create_revision: ad70ec4617166f1c38e5d2bfd388af71fda14f06 + base_revision: ad70ec4617166f1c38e5d2bfd388af71fda14f06 # User provided section diff --git a/packages/firebase_remote_config/firebase_remote_config/example/lib/firebase_options.dart b/packages/firebase_remote_config/firebase_remote_config/example/lib/firebase_options.dart index 5cd10447d8c3..268e85e369ae 100644 --- a/packages/firebase_remote_config/firebase_remote_config/example/lib/firebase_options.dart +++ b/packages/firebase_remote_config/firebase_remote_config/example/lib/firebase_options.dart @@ -32,11 +32,9 @@ class DefaultFirebaseOptions { return macos; case TargetPlatform.windows: return android; + // TODO: Remove when FlutterFire CLI supports Linux case TargetPlatform.linux: - throw UnsupportedError( - 'DefaultFirebaseOptions have not been configured for linux - ' - 'you can reconfigure this by running the FlutterFire CLI again.', - ); + return android; default: throw UnsupportedError( 'DefaultFirebaseOptions are not supported for this platform.', diff --git a/packages/firebase_remote_config/firebase_remote_config/example/linux/.gitignore b/packages/firebase_remote_config/firebase_remote_config/example/linux/.gitignore new file mode 100644 index 000000000000..d3896c98444f --- /dev/null +++ b/packages/firebase_remote_config/firebase_remote_config/example/linux/.gitignore @@ -0,0 +1 @@ +flutter/ephemeral diff --git a/packages/firebase_remote_config/firebase_remote_config/example/linux/CMakeLists.txt b/packages/firebase_remote_config/firebase_remote_config/example/linux/CMakeLists.txt new file mode 100644 index 000000000000..435af8b9c1e7 --- /dev/null +++ b/packages/firebase_remote_config/firebase_remote_config/example/linux/CMakeLists.txt @@ -0,0 +1,128 @@ +# Project-level configuration. +cmake_minimum_required(VERSION 3.13) +project(runner LANGUAGES CXX) + +# The name of the executable created for the application. Change this to change +# the on-disk name of your application. +set(BINARY_NAME "firebase_remote_config_example") +# The unique GTK application identifier for this application. See: +# https://wiki.gnome.org/HowDoI/ChooseApplicationID +set(APPLICATION_ID "io.flutter.plugins.firebase.remoteconfig.firebase_remote_config_example") + +# Explicitly opt in to modern CMake behaviors to avoid warnings with recent +# versions of CMake. +cmake_policy(SET CMP0063 NEW) + +# Load bundled libraries from the lib/ directory relative to the binary. +set(CMAKE_INSTALL_RPATH "$ORIGIN/lib") + +# Root filesystem for cross-building. +if(FLUTTER_TARGET_PLATFORM_SYSROOT) + set(CMAKE_SYSROOT ${FLUTTER_TARGET_PLATFORM_SYSROOT}) + set(CMAKE_FIND_ROOT_PATH ${CMAKE_SYSROOT}) + set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER) + set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY) + set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY) + set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY) +endif() + +# Define build configuration options. +if(NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES) + set(CMAKE_BUILD_TYPE "Debug" CACHE + STRING "Flutter build mode" FORCE) + set_property(CACHE CMAKE_BUILD_TYPE PROPERTY STRINGS + "Debug" "Profile" "Release") +endif() + +# Compilation settings that should be applied to most targets. +# +# Be cautious about adding new options here, as plugins use this function by +# default. In most cases, you should add new options to specific targets instead +# of modifying this function. +function(APPLY_STANDARD_SETTINGS TARGET) + target_compile_features(${TARGET} PUBLIC cxx_std_14) + target_compile_options(${TARGET} PRIVATE -Wall -Werror) + target_compile_options(${TARGET} PRIVATE "$<$>:-O3>") + target_compile_definitions(${TARGET} PRIVATE "$<$>:NDEBUG>") +endfunction() + +# Flutter library and tool build rules. +set(FLUTTER_MANAGED_DIR "${CMAKE_CURRENT_SOURCE_DIR}/flutter") +add_subdirectory(${FLUTTER_MANAGED_DIR}) + +# System-level dependencies. +find_package(PkgConfig REQUIRED) +pkg_check_modules(GTK REQUIRED IMPORTED_TARGET gtk+-3.0) + +# Application build; see runner/CMakeLists.txt. +add_subdirectory("runner") + +# Run the Flutter tool portions of the build. This must not be removed. +add_dependencies(${BINARY_NAME} flutter_assemble) + +# Only the install-generated bundle's copy of the executable will launch +# correctly, since the resources must in the right relative locations. To avoid +# people trying to run the unbundled copy, put it in a subdirectory instead of +# the default top-level location. +set_target_properties(${BINARY_NAME} + PROPERTIES + RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/intermediates_do_not_run" +) + + +# Generated plugin build rules, which manage building the plugins and adding +# them to the application. +include(flutter/generated_plugins.cmake) + + +# === Installation === +# By default, "installing" just makes a relocatable bundle in the build +# directory. +set(BUILD_BUNDLE_DIR "${PROJECT_BINARY_DIR}/bundle") +if(CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT) + set(CMAKE_INSTALL_PREFIX "${BUILD_BUNDLE_DIR}" CACHE PATH "..." FORCE) +endif() + +# Start with a clean build bundle directory every time. +install(CODE " + file(REMOVE_RECURSE \"${BUILD_BUNDLE_DIR}/\") + " COMPONENT Runtime) + +set(INSTALL_BUNDLE_DATA_DIR "${CMAKE_INSTALL_PREFIX}/data") +set(INSTALL_BUNDLE_LIB_DIR "${CMAKE_INSTALL_PREFIX}/lib") + +install(TARGETS ${BINARY_NAME} RUNTIME DESTINATION "${CMAKE_INSTALL_PREFIX}" + COMPONENT Runtime) + +install(FILES "${FLUTTER_ICU_DATA_FILE}" DESTINATION "${INSTALL_BUNDLE_DATA_DIR}" + COMPONENT Runtime) + +install(FILES "${FLUTTER_LIBRARY}" DESTINATION "${INSTALL_BUNDLE_LIB_DIR}" + COMPONENT Runtime) + +foreach(bundled_library ${PLUGIN_BUNDLED_LIBRARIES}) + install(FILES "${bundled_library}" + DESTINATION "${INSTALL_BUNDLE_LIB_DIR}" + COMPONENT Runtime) +endforeach(bundled_library) + +# Copy the native assets provided by the build.dart from all packages. +set(NATIVE_ASSETS_DIR "${PROJECT_BUILD_DIR}native_assets/linux/") +install(DIRECTORY "${NATIVE_ASSETS_DIR}" + DESTINATION "${INSTALL_BUNDLE_LIB_DIR}" + COMPONENT Runtime) + +# Fully re-copy the assets directory on each build to avoid having stale files +# from a previous install. +set(FLUTTER_ASSET_DIR_NAME "flutter_assets") +install(CODE " + file(REMOVE_RECURSE \"${INSTALL_BUNDLE_DATA_DIR}/${FLUTTER_ASSET_DIR_NAME}\") + " COMPONENT Runtime) +install(DIRECTORY "${PROJECT_BUILD_DIR}/${FLUTTER_ASSET_DIR_NAME}" + DESTINATION "${INSTALL_BUNDLE_DATA_DIR}" COMPONENT Runtime) + +# Install the AOT library on non-Debug builds only. +if(NOT CMAKE_BUILD_TYPE MATCHES "Debug") + install(FILES "${AOT_LIBRARY}" DESTINATION "${INSTALL_BUNDLE_LIB_DIR}" + COMPONENT Runtime) +endif() diff --git a/packages/firebase_remote_config/firebase_remote_config/example/linux/flutter/CMakeLists.txt b/packages/firebase_remote_config/firebase_remote_config/example/linux/flutter/CMakeLists.txt new file mode 100644 index 000000000000..d5bd01648a96 --- /dev/null +++ b/packages/firebase_remote_config/firebase_remote_config/example/linux/flutter/CMakeLists.txt @@ -0,0 +1,88 @@ +# This file controls Flutter-level build steps. It should not be edited. +cmake_minimum_required(VERSION 3.10) + +set(EPHEMERAL_DIR "${CMAKE_CURRENT_SOURCE_DIR}/ephemeral") + +# Configuration provided via flutter tool. +include(${EPHEMERAL_DIR}/generated_config.cmake) + +# TODO: Move the rest of this into files in ephemeral. See +# https://github.com/flutter/flutter/issues/57146. + +# Serves the same purpose as list(TRANSFORM ... PREPEND ...), +# which isn't available in 3.10. +function(list_prepend LIST_NAME PREFIX) + set(NEW_LIST "") + foreach(element ${${LIST_NAME}}) + list(APPEND NEW_LIST "${PREFIX}${element}") + endforeach(element) + set(${LIST_NAME} "${NEW_LIST}" PARENT_SCOPE) +endfunction() + +# === Flutter Library === +# System-level dependencies. +find_package(PkgConfig REQUIRED) +pkg_check_modules(GTK REQUIRED IMPORTED_TARGET gtk+-3.0) +pkg_check_modules(GLIB REQUIRED IMPORTED_TARGET glib-2.0) +pkg_check_modules(GIO REQUIRED IMPORTED_TARGET gio-2.0) + +set(FLUTTER_LIBRARY "${EPHEMERAL_DIR}/libflutter_linux_gtk.so") + +# Published to parent scope for install step. +set(FLUTTER_LIBRARY ${FLUTTER_LIBRARY} PARENT_SCOPE) +set(FLUTTER_ICU_DATA_FILE "${EPHEMERAL_DIR}/icudtl.dat" PARENT_SCOPE) +set(PROJECT_BUILD_DIR "${PROJECT_DIR}/build/" PARENT_SCOPE) +set(AOT_LIBRARY "${PROJECT_DIR}/build/lib/libapp.so" PARENT_SCOPE) + +list(APPEND FLUTTER_LIBRARY_HEADERS + "fl_basic_message_channel.h" + "fl_binary_codec.h" + "fl_binary_messenger.h" + "fl_dart_project.h" + "fl_engine.h" + "fl_json_message_codec.h" + "fl_json_method_codec.h" + "fl_message_codec.h" + "fl_method_call.h" + "fl_method_channel.h" + "fl_method_codec.h" + "fl_method_response.h" + "fl_plugin_registrar.h" + "fl_plugin_registry.h" + "fl_standard_message_codec.h" + "fl_standard_method_codec.h" + "fl_string_codec.h" + "fl_value.h" + "fl_view.h" + "flutter_linux.h" +) +list_prepend(FLUTTER_LIBRARY_HEADERS "${EPHEMERAL_DIR}/flutter_linux/") +add_library(flutter INTERFACE) +target_include_directories(flutter INTERFACE + "${EPHEMERAL_DIR}" +) +target_link_libraries(flutter INTERFACE "${FLUTTER_LIBRARY}") +target_link_libraries(flutter INTERFACE + PkgConfig::GTK + PkgConfig::GLIB + PkgConfig::GIO +) +add_dependencies(flutter flutter_assemble) + +# === Flutter tool backend === +# _phony_ is a non-existent file to force this command to run every time, +# since currently there's no way to get a full input/output list from the +# flutter tool. +add_custom_command( + OUTPUT ${FLUTTER_LIBRARY} ${FLUTTER_LIBRARY_HEADERS} + ${CMAKE_CURRENT_BINARY_DIR}/_phony_ + COMMAND ${CMAKE_COMMAND} -E env + ${FLUTTER_TOOL_ENVIRONMENT} + "${FLUTTER_ROOT}/packages/flutter_tools/bin/tool_backend.sh" + ${FLUTTER_TARGET_PLATFORM} ${CMAKE_BUILD_TYPE} + VERBATIM +) +add_custom_target(flutter_assemble DEPENDS + "${FLUTTER_LIBRARY}" + ${FLUTTER_LIBRARY_HEADERS} +) diff --git a/packages/firebase_remote_config/firebase_remote_config/example/linux/runner/CMakeLists.txt b/packages/firebase_remote_config/firebase_remote_config/example/linux/runner/CMakeLists.txt new file mode 100644 index 000000000000..e97dabc7028e --- /dev/null +++ b/packages/firebase_remote_config/firebase_remote_config/example/linux/runner/CMakeLists.txt @@ -0,0 +1,26 @@ +cmake_minimum_required(VERSION 3.13) +project(runner LANGUAGES CXX) + +# Define the application target. To change its name, change BINARY_NAME in the +# top-level CMakeLists.txt, not the value here, or `flutter run` will no longer +# work. +# +# Any new source files that you add to the application should be added here. +add_executable(${BINARY_NAME} + "main.cc" + "my_application.cc" + "${FLUTTER_MANAGED_DIR}/generated_plugin_registrant.cc" +) + +# Apply the standard set of build settings. This can be removed for applications +# that need different build settings. +apply_standard_settings(${BINARY_NAME}) + +# Add preprocessor definitions for the application ID. +add_definitions(-DAPPLICATION_ID="${APPLICATION_ID}") + +# Add dependency libraries. Add any application-specific dependencies here. +target_link_libraries(${BINARY_NAME} PRIVATE flutter) +target_link_libraries(${BINARY_NAME} PRIVATE PkgConfig::GTK) + +target_include_directories(${BINARY_NAME} PRIVATE "${CMAKE_SOURCE_DIR}") diff --git a/packages/firebase_remote_config/firebase_remote_config/example/linux/runner/main.cc b/packages/firebase_remote_config/firebase_remote_config/example/linux/runner/main.cc new file mode 100644 index 000000000000..54fde7b87fa0 --- /dev/null +++ b/packages/firebase_remote_config/firebase_remote_config/example/linux/runner/main.cc @@ -0,0 +1,10 @@ +// Copyright 2026, the Chromium project authors. Please see the AUTHORS file +// for details. All rights reserved. Use of this source code is governed by a +// BSD-style license that can be found in the LICENSE file. + +#include "my_application.h" + +int main(int argc, char** argv) { + g_autoptr(MyApplication) app = my_application_new(); + return g_application_run(G_APPLICATION(app), argc, argv); +} diff --git a/packages/firebase_remote_config/firebase_remote_config/example/linux/runner/my_application.cc b/packages/firebase_remote_config/firebase_remote_config/example/linux/runner/my_application.cc new file mode 100644 index 000000000000..66bdd975a4bb --- /dev/null +++ b/packages/firebase_remote_config/firebase_remote_config/example/linux/runner/my_application.cc @@ -0,0 +1,152 @@ +// Copyright 2026, the Chromium project authors. Please see the AUTHORS file +// for details. All rights reserved. Use of this source code is governed by a +// BSD-style license that can be found in the LICENSE file. + +#include "my_application.h" + +#include +#ifdef GDK_WINDOWING_X11 +#include +#endif + +#include "flutter/generated_plugin_registrant.h" + +struct _MyApplication { + GtkApplication parent_instance; + char** dart_entrypoint_arguments; +}; + +G_DEFINE_TYPE(MyApplication, my_application, GTK_TYPE_APPLICATION) + +// Called when first Flutter frame received. +static void first_frame_cb(MyApplication* self, FlView* view) { + gtk_widget_show(gtk_widget_get_toplevel(GTK_WIDGET(view))); +} + +// Implements GApplication::activate. +static void my_application_activate(GApplication* application) { + MyApplication* self = MY_APPLICATION(application); + GtkWindow* window = + GTK_WINDOW(gtk_application_window_new(GTK_APPLICATION(application))); + + // Use a header bar when running in GNOME as this is the common style used + // by applications and is the setup most users will be using (e.g. Ubuntu + // desktop). + // If running on X and not using GNOME then just use a traditional title bar + // in case the window manager does more exotic layout, e.g. tiling. + // If running on Wayland assume the header bar will work (may need changing + // if future cases occur). + gboolean use_header_bar = TRUE; +#ifdef GDK_WINDOWING_X11 + GdkScreen* screen = gtk_window_get_screen(window); + if (GDK_IS_X11_SCREEN(screen)) { + const gchar* wm_name = gdk_x11_screen_get_window_manager_name(screen); + if (g_strcmp0(wm_name, "GNOME Shell") != 0) { + use_header_bar = FALSE; + } + } +#endif + if (use_header_bar) { + GtkHeaderBar* header_bar = GTK_HEADER_BAR(gtk_header_bar_new()); + gtk_widget_show(GTK_WIDGET(header_bar)); + gtk_header_bar_set_title(header_bar, "firebase_remote_config_example"); + gtk_header_bar_set_show_close_button(header_bar, TRUE); + gtk_window_set_titlebar(window, GTK_WIDGET(header_bar)); + } else { + gtk_window_set_title(window, "firebase_remote_config_example"); + } + + gtk_window_set_default_size(window, 1280, 720); + + g_autoptr(FlDartProject) project = fl_dart_project_new(); + fl_dart_project_set_dart_entrypoint_arguments( + project, self->dart_entrypoint_arguments); + + FlView* view = fl_view_new(project); + GdkRGBA background_color; + // Background defaults to black, override it here if necessary, e.g. #00000000 + // for transparent. + gdk_rgba_parse(&background_color, "#000000"); + fl_view_set_background_color(view, &background_color); + gtk_widget_show(GTK_WIDGET(view)); + gtk_container_add(GTK_CONTAINER(window), GTK_WIDGET(view)); + + // Show the window when Flutter renders. + // Requires the view to be realized so we can start rendering. + g_signal_connect_swapped(view, "first-frame", G_CALLBACK(first_frame_cb), + self); + gtk_widget_realize(GTK_WIDGET(view)); + + fl_register_plugins(FL_PLUGIN_REGISTRY(view)); + + gtk_widget_grab_focus(GTK_WIDGET(view)); +} + +// Implements GApplication::local_command_line. +static gboolean my_application_local_command_line(GApplication* application, + gchar*** arguments, + int* exit_status) { + MyApplication* self = MY_APPLICATION(application); + // Strip out the first argument as it is the binary name. + self->dart_entrypoint_arguments = g_strdupv(*arguments + 1); + + g_autoptr(GError) error = nullptr; + if (!g_application_register(application, nullptr, &error)) { + g_warning("Failed to register: %s", error->message); + *exit_status = 1; + return TRUE; + } + + g_application_activate(application); + *exit_status = 0; + + return TRUE; +} + +// Implements GApplication::startup. +static void my_application_startup(GApplication* application) { + // MyApplication* self = MY_APPLICATION(object); + + // Perform any actions required at application startup. + + G_APPLICATION_CLASS(my_application_parent_class)->startup(application); +} + +// Implements GApplication::shutdown. +static void my_application_shutdown(GApplication* application) { + // MyApplication* self = MY_APPLICATION(object); + + // Perform any actions required at application shutdown. + + G_APPLICATION_CLASS(my_application_parent_class)->shutdown(application); +} + +// Implements GObject::dispose. +static void my_application_dispose(GObject* object) { + MyApplication* self = MY_APPLICATION(object); + g_clear_pointer(&self->dart_entrypoint_arguments, g_strfreev); + G_OBJECT_CLASS(my_application_parent_class)->dispose(object); +} + +static void my_application_class_init(MyApplicationClass* klass) { + G_APPLICATION_CLASS(klass)->activate = my_application_activate; + G_APPLICATION_CLASS(klass)->local_command_line = + my_application_local_command_line; + G_APPLICATION_CLASS(klass)->startup = my_application_startup; + G_APPLICATION_CLASS(klass)->shutdown = my_application_shutdown; + G_OBJECT_CLASS(klass)->dispose = my_application_dispose; +} + +static void my_application_init(MyApplication* self) {} + +MyApplication* my_application_new() { + // Set the program name to the application ID, which helps various systems + // like GTK and desktop environments map this running application to its + // corresponding .desktop file. This ensures better integration by allowing + // the application to be recognized beyond its binary name. + g_set_prgname(APPLICATION_ID); + + return MY_APPLICATION(g_object_new(my_application_get_type(), + "application-id", APPLICATION_ID, "flags", + G_APPLICATION_NON_UNIQUE, nullptr)); +} diff --git a/packages/firebase_remote_config/firebase_remote_config/example/linux/runner/my_application.h b/packages/firebase_remote_config/firebase_remote_config/example/linux/runner/my_application.h new file mode 100644 index 000000000000..a2ba75695cf5 --- /dev/null +++ b/packages/firebase_remote_config/firebase_remote_config/example/linux/runner/my_application.h @@ -0,0 +1,22 @@ +// Copyright 2026, the Chromium project authors. Please see the AUTHORS file +// for details. All rights reserved. Use of this source code is governed by a +// BSD-style license that can be found in the LICENSE file. + +#ifndef FLUTTER_MY_APPLICATION_H_ +#define FLUTTER_MY_APPLICATION_H_ + +#include + +G_DECLARE_FINAL_TYPE(MyApplication, my_application, MY, APPLICATION, + GtkApplication) + +/** + * my_application_new: + * + * Creates a new Flutter-based application. + * + * Returns: a new #MyApplication. + */ +MyApplication* my_application_new(); + +#endif // FLUTTER_MY_APPLICATION_H_ diff --git a/packages/firebase_remote_config/firebase_remote_config/linux/CMakeLists.txt b/packages/firebase_remote_config/firebase_remote_config/linux/CMakeLists.txt new file mode 100644 index 000000000000..6b8e6a66baa7 --- /dev/null +++ b/packages/firebase_remote_config/firebase_remote_config/linux/CMakeLists.txt @@ -0,0 +1,90 @@ +# The Flutter tooling requires that developers have CMake 3.10 or later +# installed. You should not increase this version, as doing so will cause +# the plugin to fail to compile for some customers of the plugin. +cmake_minimum_required(VERSION 3.10) + +# Project-level configuration. +set(PROJECT_NAME "firebase_remote_config") +project(${PROJECT_NAME} LANGUAGES CXX) + +# This value is used when generating builds using this plugin, so it must +# not be changed +set(PLUGIN_NAME "firebase_remote_config_plugin") + +# Any new source files that you add to the plugin should be added here. +list(APPEND PLUGIN_SOURCES + "include/firebase_remote_config/firebase_remote_config_plugin.h" + "firebase_remote_config_plugin.cc" + "messages.g.cc" + "messages.g.h" +) + +# Read version from pubspec.yaml +file(STRINGS "../pubspec.yaml" pubspec_content) +foreach(line ${pubspec_content}) + string(FIND ${line} "version: " has_version) + + if("${has_version}" STREQUAL "0") + string(FIND ${line} ": " version_start_pos) + math(EXPR version_start_pos "${version_start_pos} + 2") + string(LENGTH ${line} version_end_pos) + math(EXPR len "${version_end_pos} - ${version_start_pos}") + string(SUBSTRING ${line} ${version_start_pos} ${len} PLUGIN_VERSION) + break() + endif() +endforeach(line) + +configure_file(plugin_version.h.in ${CMAKE_BINARY_DIR}/generated/firebase_remote_config/plugin_version.h) +include_directories(${CMAKE_BINARY_DIR}/generated/) + +# Define the plugin library target. Its name must not be changed (see comment +# on PLUGIN_NAME above). +# +# This is deliberately a STATIC library (unlike the SHARED library in the +# Flutter Linux plugin template) to mirror the Windows implementation; see the +# explanation in firebase_core/linux/CMakeLists.txt. The Firebase C++ SDK +# itself is downloaded and added via add_subdirectory by the firebase_core +# plugin, which also exports the SDK include directories; this plugin only +# links the prebuilt SDK targets, exactly like its Windows counterpart. +add_library(${PLUGIN_NAME} STATIC + ${PLUGIN_SOURCES} + ${CMAKE_BINARY_DIR}/generated/firebase_remote_config/plugin_version.h +) + +# Apply a standard set of build settings that are configured in the +# application-level CMakeLists.txt. This can be removed for plugins that want +# full control over build settings. +apply_standard_settings(${PLUGIN_NAME}) + +# Symbols are hidden by default to reduce the chance of accidental conflicts +# between plugins. This should not be removed; any symbols that should be +# exported should be explicitly exported with the FLUTTER_PLUGIN_EXPORT macro. +set_target_properties(${PLUGIN_NAME} PROPERTIES + CXX_VISIBILITY_PRESET hidden + POSITION_INDEPENDENT_CODE ON) +target_compile_definitions(${PLUGIN_NAME} PUBLIC FLUTTER_PLUGIN_IMPL) +# Enable firebase-cpp-sdk's platform logging api. +target_compile_definitions(${PLUGIN_NAME} PRIVATE -DINTERNAL_EXPERIMENTAL=1) + +# Source include directories and library dependencies. Add any plugin-specific +# dependencies here. +# NOTE: the Firebase SDK product archives are linked exclusively by the +# firebase_core_plugin target, which wraps all of them in a single +# -Wl,--start-group/--end-group (the archives have circular symbol +# dependencies that an ordered per-plugin link line cannot satisfy). +set(firebase_libs firebase_core_plugin) +set(ADDITIONAL_LIBS pthread) +target_link_libraries(${PLUGIN_NAME} PRIVATE "${firebase_libs}" "${ADDITIONAL_LIBS}") + +target_include_directories(${PLUGIN_NAME} INTERFACE + "${CMAKE_CURRENT_SOURCE_DIR}/include") +target_link_libraries(${PLUGIN_NAME} PRIVATE flutter) +target_link_libraries(${PLUGIN_NAME} PRIVATE PkgConfig::GTK) + +# List of absolute paths to libraries that should be bundled with the plugin. +# This list could contain prebuilt libraries, or libraries created by an +# external build triggered from this build file. +set(firebase_remote_config_bundled_libraries + "" + PARENT_SCOPE +) diff --git a/packages/firebase_remote_config/firebase_remote_config/linux/firebase_remote_config_plugin.cc b/packages/firebase_remote_config/firebase_remote_config/linux/firebase_remote_config_plugin.cc new file mode 100644 index 000000000000..0f80677834ba --- /dev/null +++ b/packages/firebase_remote_config/firebase_remote_config/linux/firebase_remote_config_plugin.cc @@ -0,0 +1,547 @@ +// Copyright 2026, the Chromium project authors. Please see the AUTHORS file +// for details. All rights reserved. Use of this source code is governed by a +// BSD-style license that can be found in the LICENSE file. + +#include "include/firebase_remote_config/firebase_remote_config_plugin.h" + +#include + +#include +#include +#include +#include +#include +#include +#include + +#include "firebase/app.h" +#include "firebase/future.h" +#include "firebase/remote_config.h" +#include "firebase/remote_config/config_update_listener_registration.h" +#include "firebase/variant.h" +#include "firebase_remote_config/plugin_version.h" +#include "messages.g.h" + +using ::firebase::App; +using ::firebase::Future; +using ::firebase::Variant; +using ::firebase::remote_config::ConfigInfo; +using ::firebase::remote_config::ConfigSettings; +using ::firebase::remote_config::RemoteConfig; + +static const char kLibraryName[] = "flutter-fire-rc"; +static const char kEventChannelName[] = + "plugins.flutter.io/firebase_remote_config_updated"; + +#define FIREBASE_REMOTE_CONFIG_PLUGIN(obj) \ + (G_TYPE_CHECK_INSTANCE_CAST((obj), firebase_remote_config_plugin_get_type(), \ + FirebaseRemoteConfigPlugin)) + +struct _FirebaseRemoteConfigPlugin { + GObject parent_instance; + + // Event channel for realtime config update events. + FlEventChannel* event_channel; + + // Config update listener registrations keyed by Firebase app name. + std::map* + listeners_map; +}; + +G_DEFINE_TYPE(FirebaseRemoteConfigPlugin, firebase_remote_config_plugin, + g_object_get_type()) + +// Runs |function| on the GLib main thread. Firebase future completions and +// config update callbacks arrive on background threads, but FlBinaryMessenger +// and FlEventChannel calls must be made from the main thread. +static void RunOnMainThread(std::function function) { + auto* callback = new std::function(std::move(function)); + g_idle_add( + [](gpointer user_data) -> gboolean { + auto* function = static_cast*>(user_data); + (*function)(); + delete function; + return G_SOURCE_REMOVE; + }, + callback); +} + +static RemoteConfig* GetRemoteConfigFromPigeon(const std::string& app_name) { + App* app = App::GetInstance(app_name.c_str()); + RemoteConfig* remote_config = RemoteConfig::GetInstance(app); + return remote_config; +} + +static std::string MapValueSource(firebase::remote_config::ValueSource source) { + switch (source) { + case firebase::remote_config::kValueSourceRemoteValue: + return "remote"; + case firebase::remote_config::kValueSourceDefaultValue: + return "default"; + case firebase::remote_config::kValueSourceStaticValue: + default: + return "static"; + } +} + +static std::string MapLastFetchStatus( + firebase::remote_config::LastFetchStatus status) { + switch (status) { + case firebase::remote_config::kLastFetchStatusSuccess: + return "success"; + case firebase::remote_config::kLastFetchStatusFailure: + return "failure"; + case firebase::remote_config::kLastFetchStatusPending: + return "noFetchYet"; + default: + return "noFetchYet"; + } +} + +static std::string GetRemoteConfigErrorCode(int error) { + switch (error) { + case firebase::remote_config::kFetchFailureReasonThrottled: + return "throttle"; + case firebase::remote_config::kFetchFailureReasonInvalid: + return "invalid"; + default: + return "unknown"; + } +} + +static std::string GetFutureErrorMessage( + const firebase::FutureBase& completed_future) { + return completed_future.error_message() ? completed_future.error_message() + : "An unknown error occurred"; +} + +// FirebaseRemoteConfigHostApi + +static void HandleFetch( + const gchar* app_name, + FirebaseRemoteConfigFirebaseRemoteConfigHostApiResponseHandle* + response_handle, + gpointer user_data) { + RemoteConfig* remote_config = GetRemoteConfigFromPigeon(app_name); + + g_object_ref(response_handle); + Future future = remote_config->Fetch(); + future.OnCompletion([response_handle](const Future& completed_future) { + int error = completed_future.error(); + std::string error_code = GetRemoteConfigErrorCode(error); + std::string error_message = GetFutureErrorMessage(completed_future); + RunOnMainThread([response_handle, error, error_code, error_message]() { + if (error != 0) { + firebase_remote_config_firebase_remote_config_host_api_respond_error_fetch( + response_handle, error_code.c_str(), error_message.c_str(), + nullptr); + } else { + firebase_remote_config_firebase_remote_config_host_api_respond_fetch( + response_handle); + } + g_object_unref(response_handle); + }); + }); +} + +static void HandleFetchAndActivate( + const gchar* app_name, + FirebaseRemoteConfigFirebaseRemoteConfigHostApiResponseHandle* + response_handle, + gpointer user_data) { + RemoteConfig* remote_config = GetRemoteConfigFromPigeon(app_name); + + g_object_ref(response_handle); + Future future = remote_config->FetchAndActivate(); + future.OnCompletion([response_handle](const Future& completed_future) { + int error = completed_future.error(); + std::string error_code = GetRemoteConfigErrorCode(error); + std::string error_message = GetFutureErrorMessage(completed_future); + bool activated = error == 0 ? *completed_future.result() : false; + RunOnMainThread([response_handle, error, error_code, error_message, + activated]() { + if (error != 0) { + firebase_remote_config_firebase_remote_config_host_api_respond_error_fetch_and_activate( + response_handle, error_code.c_str(), error_message.c_str(), + nullptr); + } else { + firebase_remote_config_firebase_remote_config_host_api_respond_fetch_and_activate( + response_handle, activated); + } + g_object_unref(response_handle); + }); + }); +} + +static void HandleActivate( + const gchar* app_name, + FirebaseRemoteConfigFirebaseRemoteConfigHostApiResponseHandle* + response_handle, + gpointer user_data) { + RemoteConfig* remote_config = GetRemoteConfigFromPigeon(app_name); + + g_object_ref(response_handle); + Future future = remote_config->Activate(); + future.OnCompletion([response_handle](const Future& completed_future) { + int error = completed_future.error(); + std::string error_code = GetRemoteConfigErrorCode(error); + std::string error_message = GetFutureErrorMessage(completed_future); + bool activated = error == 0 ? *completed_future.result() : false; + RunOnMainThread([response_handle, error, error_code, error_message, + activated]() { + if (error != 0) { + firebase_remote_config_firebase_remote_config_host_api_respond_error_activate( + response_handle, error_code.c_str(), error_message.c_str(), + nullptr); + } else { + firebase_remote_config_firebase_remote_config_host_api_respond_activate( + response_handle, activated); + } + g_object_unref(response_handle); + }); + }); +} + +static void HandleSetConfigSettings( + const gchar* app_name, + FirebaseRemoteConfigRemoteConfigPigeonSettings* settings, + FirebaseRemoteConfigFirebaseRemoteConfigHostApiResponseHandle* + response_handle, + gpointer user_data) { + RemoteConfig* remote_config = GetRemoteConfigFromPigeon(app_name); + + ConfigSettings config_settings; + config_settings.minimum_fetch_interval_in_milliseconds = + firebase_remote_config_remote_config_pigeon_settings_get_minimum_fetch_interval_seconds( + settings) * + 1000; + config_settings.fetch_timeout_in_milliseconds = + firebase_remote_config_remote_config_pigeon_settings_get_fetch_timeout_seconds( + settings) * + 1000; + + g_object_ref(response_handle); + Future future = remote_config->SetConfigSettings(config_settings); + future.OnCompletion([response_handle](const Future& completed_future) { + int error = completed_future.error(); + std::string error_code = GetRemoteConfigErrorCode(error); + std::string error_message = GetFutureErrorMessage(completed_future); + RunOnMainThread([response_handle, error, error_code, error_message]() { + if (error != 0) { + firebase_remote_config_firebase_remote_config_host_api_respond_error_set_config_settings( + response_handle, error_code.c_str(), error_message.c_str(), + nullptr); + } else { + firebase_remote_config_firebase_remote_config_host_api_respond_set_config_settings( + response_handle); + } + g_object_unref(response_handle); + }); + }); +} + +static void HandleSetDefaults( + const gchar* app_name, FlValue* default_parameters, + FirebaseRemoteConfigFirebaseRemoteConfigHostApiResponseHandle* + response_handle, + gpointer user_data) { + RemoteConfig* remote_config = GetRemoteConfigFromPigeon(app_name); + + // Convert the FlValue map to a vector of ConfigKeyValueVariant. The keys + // vector owns the key strings; it is reserved up front so the c_str() + // pointers stored in |defaults| stay valid. + size_t size = fl_value_get_length(default_parameters); + std::vector keys; + keys.reserve(size); + std::vector defaults; + defaults.reserve(size); + + for (size_t i = 0; i < size; i++) { + FlValue* key_value = fl_value_get_map_key(default_parameters, i); + FlValue* value_value = fl_value_get_map_value(default_parameters, i); + keys.emplace_back(fl_value_get_string(key_value)); + + Variant value; + switch (fl_value_get_type(value_value)) { + case FL_VALUE_TYPE_STRING: + value = Variant(std::string(fl_value_get_string(value_value))); + break; + case FL_VALUE_TYPE_INT: + value = Variant(static_cast(fl_value_get_int(value_value))); + break; + case FL_VALUE_TYPE_FLOAT: + value = Variant(fl_value_get_float(value_value)); + break; + case FL_VALUE_TYPE_BOOL: + value = Variant(static_cast(fl_value_get_bool(value_value))); + break; + default: + // For null or unsupported types, use empty string + value = Variant(""); + break; + } + + defaults.push_back({keys.back().c_str(), value}); + } + + g_object_ref(response_handle); + Future future = + remote_config->SetDefaults(defaults.data(), defaults.size()); + future.OnCompletion([response_handle](const Future& completed_future) { + int error = completed_future.error(); + std::string error_code = GetRemoteConfigErrorCode(error); + std::string error_message = GetFutureErrorMessage(completed_future); + RunOnMainThread([response_handle, error, error_code, error_message]() { + if (error != 0) { + firebase_remote_config_firebase_remote_config_host_api_respond_error_set_defaults( + response_handle, error_code.c_str(), error_message.c_str(), + nullptr); + } else { + firebase_remote_config_firebase_remote_config_host_api_respond_set_defaults( + response_handle); + } + g_object_unref(response_handle); + }); + }); +} + +static void HandleEnsureInitialized( + const gchar* app_name, + FirebaseRemoteConfigFirebaseRemoteConfigHostApiResponseHandle* + response_handle, + gpointer user_data) { + RemoteConfig* remote_config = GetRemoteConfigFromPigeon(app_name); + + g_object_ref(response_handle); + Future future = remote_config->EnsureInitialized(); + future.OnCompletion([response_handle]( + const Future& completed_future) { + int error = completed_future.error(); + std::string error_code = GetRemoteConfigErrorCode(error); + std::string error_message = GetFutureErrorMessage(completed_future); + RunOnMainThread([response_handle, error, error_code, error_message]() { + if (error != 0) { + firebase_remote_config_firebase_remote_config_host_api_respond_error_ensure_initialized( + response_handle, error_code.c_str(), error_message.c_str(), + nullptr); + } else { + firebase_remote_config_firebase_remote_config_host_api_respond_ensure_initialized( + response_handle); + } + g_object_unref(response_handle); + }); + }); +} + +static void HandleSetCustomSignals( + const gchar* app_name, FlValue* custom_signals, + FirebaseRemoteConfigFirebaseRemoteConfigHostApiResponseHandle* + response_handle, + gpointer user_data) { + // SetCustomSignals is not supported on the C++ SDK for desktop platforms. + firebase_remote_config_firebase_remote_config_host_api_respond_error_set_custom_signals( + response_handle, "unimplemented", + "SetCustomSignals is not supported on Linux.", nullptr); +} + +static void HandleGetAll( + const gchar* app_name, + FirebaseRemoteConfigFirebaseRemoteConfigHostApiResponseHandle* + response_handle, + gpointer user_data) { + RemoteConfig* remote_config = GetRemoteConfigFromPigeon(app_name); + + std::map all_configs = remote_config->GetAll(); + g_autoptr(FlValue) parameters = fl_value_new_map(); + + for (const auto& [key, variant] : all_configs) { + firebase::remote_config::ValueInfo info; + std::string value_str = remote_config->GetString(key.c_str(), &info); + + g_autoptr(FlValue) value_map = fl_value_new_map(); + fl_value_set_string_take( + value_map, "value", + fl_value_new_uint8_list( + reinterpret_cast(value_str.data()), + value_str.size())); + fl_value_set_string_take( + value_map, "source", + fl_value_new_string(MapValueSource(info.source).c_str())); + + fl_value_set_string(parameters, key.c_str(), value_map); + } + + firebase_remote_config_firebase_remote_config_host_api_respond_get_all( + response_handle, parameters); +} + +static void HandleGetProperties( + const gchar* app_name, + FirebaseRemoteConfigFirebaseRemoteConfigHostApiResponseHandle* + response_handle, + gpointer user_data) { + RemoteConfig* remote_config = GetRemoteConfigFromPigeon(app_name); + + const ConfigInfo& info = remote_config->GetInfo(); + const ConfigSettings config_settings = remote_config->GetConfigSettings(); + + int64_t fetch_timeout_seconds = static_cast( + config_settings.fetch_timeout_in_milliseconds / 1000); + int64_t minimum_fetch_interval_seconds = static_cast( + config_settings.minimum_fetch_interval_in_milliseconds / 1000); + int64_t last_fetch_time_millis = static_cast(info.fetch_time); + + g_autoptr(FlValue) properties = fl_value_new_map(); + fl_value_set_string_take(properties, "fetchTimeout", + fl_value_new_int(fetch_timeout_seconds)); + fl_value_set_string_take(properties, "minimumFetchInterval", + fl_value_new_int(minimum_fetch_interval_seconds)); + fl_value_set_string_take(properties, "lastFetchTime", + fl_value_new_int(last_fetch_time_millis)); + fl_value_set_string_take( + properties, "lastFetchStatus", + fl_value_new_string(MapLastFetchStatus(info.last_fetch_status).c_str())); + + firebase_remote_config_firebase_remote_config_host_api_respond_get_properties( + response_handle, properties); +} + +static const FirebaseRemoteConfigFirebaseRemoteConfigHostApiVTable + kFirebaseRemoteConfigHostApiVTable = { + HandleFetch, // fetch + HandleFetchAndActivate, // fetch_and_activate + HandleActivate, // activate + HandleSetConfigSettings, // set_config_settings + HandleSetDefaults, // set_defaults + HandleEnsureInitialized, // ensure_initialized + HandleSetCustomSignals, // set_custom_signals + HandleGetAll, // get_all + HandleGetProperties, // get_properties +}; + +// Event channel for config update events. +// Note: The Firebase C++ SDK does not yet support real-time config updates on +// desktop platforms. The listener is registered but the callback will not fire. +// This implementation is ready for when the SDK adds desktop support. + +static std::string AppNameFromEventArguments(FlValue* args) { + std::string app_name = "[DEFAULT]"; + if (args != nullptr && fl_value_get_type(args) == FL_VALUE_TYPE_MAP) { + FlValue* name_value = fl_value_lookup_string(args, "appName"); + if (name_value != nullptr && + fl_value_get_type(name_value) == FL_VALUE_TYPE_STRING) { + app_name = fl_value_get_string(name_value); + } + } + return app_name; +} + +static FlMethodErrorResponse* ConfigUpdateOnListen(FlEventChannel* channel, + FlValue* args, + gpointer user_data) { + FirebaseRemoteConfigPlugin* self = FIREBASE_REMOTE_CONFIG_PLUGIN(user_data); + std::string app_name = AppNameFromEventArguments(args); + + App* app = App::GetInstance(app_name.c_str()); + RemoteConfig* remote_config = RemoteConfig::GetInstance(app); + + FlEventChannel* event_channel = self->event_channel; + auto registration = remote_config->AddOnConfigUpdateListener( + [event_channel](firebase::remote_config::ConfigUpdate&& config_update, + firebase::remote_config::RemoteConfigError error) { + // This callback may fire on a background thread; take a reference to + // the channel and send the event from the main thread. + FlEventChannel* channel = FL_EVENT_CHANNEL(g_object_ref(event_channel)); + if (error != firebase::remote_config::kRemoteConfigErrorNone) { + RunOnMainThread([channel]() { + fl_event_channel_send_error(channel, "firebase_remote_config", + "Error listening for config updates.", + nullptr, nullptr, nullptr); + g_object_unref(channel); + }); + return; + } + std::vector updated_keys = + std::move(config_update.updated_keys); + RunOnMainThread([channel, updated_keys]() { + g_autoptr(FlValue) keys = fl_value_new_list(); + for (const std::string& key : updated_keys) { + fl_value_append_take(keys, fl_value_new_string(key.c_str())); + } + fl_event_channel_send(channel, keys, nullptr, nullptr); + g_object_unref(channel); + }); + }); + + (*self->listeners_map)[app_name] = std::move(registration); + + return nullptr; +} + +static FlMethodErrorResponse* ConfigUpdateOnCancel(FlEventChannel* channel, + FlValue* args, + gpointer user_data) { + FirebaseRemoteConfigPlugin* self = FIREBASE_REMOTE_CONFIG_PLUGIN(user_data); + std::string app_name = AppNameFromEventArguments(args); + + auto it = self->listeners_map->find(app_name); + if (it != self->listeners_map->end()) { + it->second.Remove(); + self->listeners_map->erase(it); + } + + return nullptr; +} + +static void firebase_remote_config_plugin_dispose(GObject* object) { + FirebaseRemoteConfigPlugin* self = FIREBASE_REMOTE_CONFIG_PLUGIN(object); + if (self->listeners_map != nullptr) { + for (auto& [app_name, registration] : *self->listeners_map) { + registration.Remove(); + } + delete self->listeners_map; + self->listeners_map = nullptr; + } + g_clear_object(&self->event_channel); + G_OBJECT_CLASS(firebase_remote_config_plugin_parent_class)->dispose(object); +} + +static void firebase_remote_config_plugin_class_init( + FirebaseRemoteConfigPluginClass* klass) { + G_OBJECT_CLASS(klass)->dispose = firebase_remote_config_plugin_dispose; +} + +static void firebase_remote_config_plugin_init( + FirebaseRemoteConfigPlugin* self) { + self->event_channel = nullptr; + self->listeners_map = + new std::map(); +} + +void firebase_remote_config_plugin_register_with_registrar( + FlPluginRegistrar* registrar) { + FirebaseRemoteConfigPlugin* plugin = FIREBASE_REMOTE_CONFIG_PLUGIN( + g_object_new(firebase_remote_config_plugin_get_type(), nullptr)); + + FlBinaryMessenger* messenger = fl_plugin_registrar_get_messenger(registrar); + firebase_remote_config_firebase_remote_config_host_api_set_method_handlers( + messenger, /* suffix= */ nullptr, &kFirebaseRemoteConfigHostApiVTable, + g_object_ref(plugin), g_object_unref); + + // Set up EventChannel for config update listening + g_autoptr(FlStandardMethodCodec) codec = fl_standard_method_codec_new(); + plugin->event_channel = fl_event_channel_new(messenger, kEventChannelName, + FL_METHOD_CODEC(codec)); + fl_event_channel_set_stream_handlers( + plugin->event_channel, ConfigUpdateOnListen, ConfigUpdateOnCancel, + g_object_ref(plugin), g_object_unref); + + g_object_unref(plugin); + + // Register for platform logging + App::RegisterLibrary(kLibraryName, + firebase_remote_config_linux::getPluginVersion().c_str(), + nullptr); +} diff --git a/packages/firebase_remote_config/firebase_remote_config/linux/include/firebase_remote_config/firebase_remote_config_plugin.h b/packages/firebase_remote_config/firebase_remote_config/linux/include/firebase_remote_config/firebase_remote_config_plugin.h new file mode 100644 index 000000000000..b82a815a3b33 --- /dev/null +++ b/packages/firebase_remote_config/firebase_remote_config/linux/include/firebase_remote_config/firebase_remote_config_plugin.h @@ -0,0 +1,33 @@ +/* + * Copyright 2026, the Chromium project authors. Please see the AUTHORS file + * for details. All rights reserved. Use of this source code is governed by a + * BSD-style license that can be found in the LICENSE file. + */ + +#ifndef FLUTTER_PLUGIN_FIREBASE_REMOTE_CONFIG_PLUGIN_H_ +#define FLUTTER_PLUGIN_FIREBASE_REMOTE_CONFIG_PLUGIN_H_ + +#include + +G_BEGIN_DECLS + +#ifdef FLUTTER_PLUGIN_IMPL +#define FLUTTER_PLUGIN_EXPORT __attribute__((visibility("default"))) +#else +#define FLUTTER_PLUGIN_EXPORT +#endif + +typedef struct _FirebaseRemoteConfigPlugin FirebaseRemoteConfigPlugin; +typedef struct { + GObjectClass parent_class; +} FirebaseRemoteConfigPluginClass; + +FLUTTER_PLUGIN_EXPORT GType firebase_remote_config_plugin_get_type(); + +FLUTTER_PLUGIN_EXPORT void +firebase_remote_config_plugin_register_with_registrar( + FlPluginRegistrar* registrar); + +G_END_DECLS + +#endif // FLUTTER_PLUGIN_FIREBASE_REMOTE_CONFIG_PLUGIN_H_ diff --git a/packages/firebase_remote_config/firebase_remote_config/linux/messages.g.cc b/packages/firebase_remote_config/firebase_remote_config/linux/messages.g.cc new file mode 100644 index 000000000000..fc8d60ac9576 --- /dev/null +++ b/packages/firebase_remote_config/firebase_remote_config/linux/messages.g.cc @@ -0,0 +1,1840 @@ +// Copyright 2026, the Chromium project authors. Please see the AUTHORS file +// for details. All rights reserved. Use of this source code is governed by a +// BSD-style license that can be found in the LICENSE file. +// Autogenerated from Pigeon (v26.3.4), do not edit directly. +// See also: https://pub.dev/packages/pigeon + +#include "messages.g.h" + +#include + +#include +static guint G_GNUC_UNUSED flpigeon_hash_double(double v) { + if (std::isnan(v)) { + return static_cast(0x7FF80000); + } + if (v == 0.0) { + v = 0.0; + } + union { + double d; + uint64_t u; + } u; + u.d = v; + return static_cast(u.u ^ (u.u >> 32)); +} +static gboolean G_GNUC_UNUSED flpigeon_equals_double(double a, double b) { + return (a == b) || (std::isnan(a) && std::isnan(b)); +} +static gboolean G_GNUC_UNUSED flpigeon_deep_equals(FlValue* a, FlValue* b) { + if (a == b) { + return TRUE; + } + if (a == nullptr || b == nullptr) { + return FALSE; + } + if (fl_value_get_type(a) != fl_value_get_type(b)) { + return FALSE; + } + switch (fl_value_get_type(a)) { + case FL_VALUE_TYPE_NULL: + return TRUE; + case FL_VALUE_TYPE_BOOL: + return fl_value_get_bool(a) == fl_value_get_bool(b); + case FL_VALUE_TYPE_INT: + return fl_value_get_int(a) == fl_value_get_int(b); + case FL_VALUE_TYPE_FLOAT: { + return flpigeon_equals_double(fl_value_get_float(a), + fl_value_get_float(b)); + } + case FL_VALUE_TYPE_STRING: + return g_strcmp0(fl_value_get_string(a), fl_value_get_string(b)) == 0; + case FL_VALUE_TYPE_UINT8_LIST: + return fl_value_get_length(a) == fl_value_get_length(b) && + memcmp(fl_value_get_uint8_list(a), fl_value_get_uint8_list(b), + fl_value_get_length(a)) == 0; + case FL_VALUE_TYPE_INT32_LIST: + return fl_value_get_length(a) == fl_value_get_length(b) && + memcmp(fl_value_get_int32_list(a), fl_value_get_int32_list(b), + fl_value_get_length(a) * sizeof(int32_t)) == 0; + case FL_VALUE_TYPE_INT64_LIST: + return fl_value_get_length(a) == fl_value_get_length(b) && + memcmp(fl_value_get_int64_list(a), fl_value_get_int64_list(b), + fl_value_get_length(a) * sizeof(int64_t)) == 0; + case FL_VALUE_TYPE_FLOAT_LIST: { + size_t len = fl_value_get_length(a); + if (len != fl_value_get_length(b)) { + return FALSE; + } + const double* a_data = fl_value_get_float_list(a); + const double* b_data = fl_value_get_float_list(b); + for (size_t i = 0; i < len; i++) { + if (!flpigeon_equals_double(a_data[i], b_data[i])) { + return FALSE; + } + } + return TRUE; + } + case FL_VALUE_TYPE_LIST: { + size_t len = fl_value_get_length(a); + if (len != fl_value_get_length(b)) { + return FALSE; + } + for (size_t i = 0; i < len; i++) { + if (!flpigeon_deep_equals(fl_value_get_list_value(a, i), + fl_value_get_list_value(b, i))) { + return FALSE; + } + } + return TRUE; + } + case FL_VALUE_TYPE_MAP: { + size_t len = fl_value_get_length(a); + if (len != fl_value_get_length(b)) { + return FALSE; + } + for (size_t i = 0; i < len; i++) { + FlValue* key = fl_value_get_map_key(a, i); + FlValue* val = fl_value_get_map_value(a, i); + gboolean found = FALSE; + for (size_t j = 0; j < len; j++) { + FlValue* b_key = fl_value_get_map_key(b, j); + if (flpigeon_deep_equals(key, b_key)) { + FlValue* b_val = fl_value_get_map_value(b, j); + if (flpigeon_deep_equals(val, b_val)) { + found = TRUE; + break; + } else { + return FALSE; + } + } + } + if (!found) { + return FALSE; + } + } + return TRUE; + } + default: + return FALSE; + } + return FALSE; +} +static guint G_GNUC_UNUSED flpigeon_deep_hash(FlValue* value) { + if (value == nullptr) { + return 0; + } + switch (fl_value_get_type(value)) { + case FL_VALUE_TYPE_NULL: + return 0; + case FL_VALUE_TYPE_BOOL: + return fl_value_get_bool(value) ? 1231 : 1237; + case FL_VALUE_TYPE_INT: { + int64_t v = fl_value_get_int(value); + return static_cast(v ^ (v >> 32)); + } + case FL_VALUE_TYPE_FLOAT: + return flpigeon_hash_double(fl_value_get_float(value)); + case FL_VALUE_TYPE_STRING: + return g_str_hash(fl_value_get_string(value)); + case FL_VALUE_TYPE_UINT8_LIST: { + guint result = 1; + size_t len = fl_value_get_length(value); + const uint8_t* data = fl_value_get_uint8_list(value); + for (size_t i = 0; i < len; i++) { + result = result * 31 + data[i]; + } + return result; + } + case FL_VALUE_TYPE_INT32_LIST: { + guint result = 1; + size_t len = fl_value_get_length(value); + const int32_t* data = fl_value_get_int32_list(value); + for (size_t i = 0; i < len; i++) { + result = result * 31 + static_cast(data[i]); + } + return result; + } + case FL_VALUE_TYPE_INT64_LIST: { + guint result = 1; + size_t len = fl_value_get_length(value); + const int64_t* data = fl_value_get_int64_list(value); + for (size_t i = 0; i < len; i++) { + result = result * 31 + static_cast(data[i] ^ (data[i] >> 32)); + } + return result; + } + case FL_VALUE_TYPE_FLOAT_LIST: { + guint result = 1; + size_t len = fl_value_get_length(value); + const double* data = fl_value_get_float_list(value); + for (size_t i = 0; i < len; i++) { + result = result * 31 + flpigeon_hash_double(data[i]); + } + return result; + } + case FL_VALUE_TYPE_LIST: { + guint result = 1; + size_t len = fl_value_get_length(value); + for (size_t i = 0; i < len; i++) { + result = + result * 31 + flpigeon_deep_hash(fl_value_get_list_value(value, i)); + } + return result; + } + case FL_VALUE_TYPE_MAP: { + guint result = 0; + size_t len = fl_value_get_length(value); + for (size_t i = 0; i < len; i++) { + result += ((flpigeon_deep_hash(fl_value_get_map_key(value, i)) * 31) ^ + flpigeon_deep_hash(fl_value_get_map_value(value, i))); + } + return result; + } + default: + return static_cast(fl_value_get_type(value)); + } + return 0; +} + +struct _FirebaseRemoteConfigRemoteConfigPigeonSettings { + GObject parent_instance; + + int64_t fetch_timeout_seconds; + int64_t minimum_fetch_interval_seconds; +}; + +G_DEFINE_TYPE(FirebaseRemoteConfigRemoteConfigPigeonSettings, + firebase_remote_config_remote_config_pigeon_settings, + G_TYPE_OBJECT) + +static void firebase_remote_config_remote_config_pigeon_settings_dispose( + GObject* object) { + G_OBJECT_CLASS( + firebase_remote_config_remote_config_pigeon_settings_parent_class) + ->dispose(object); +} + +static void firebase_remote_config_remote_config_pigeon_settings_init( + FirebaseRemoteConfigRemoteConfigPigeonSettings* self) {} + +static void firebase_remote_config_remote_config_pigeon_settings_class_init( + FirebaseRemoteConfigRemoteConfigPigeonSettingsClass* klass) { + G_OBJECT_CLASS(klass)->dispose = + firebase_remote_config_remote_config_pigeon_settings_dispose; +} + +FirebaseRemoteConfigRemoteConfigPigeonSettings* +firebase_remote_config_remote_config_pigeon_settings_new( + int64_t fetch_timeout_seconds, int64_t minimum_fetch_interval_seconds) { + FirebaseRemoteConfigRemoteConfigPigeonSettings* self = + FIREBASE_REMOTE_CONFIG_REMOTE_CONFIG_PIGEON_SETTINGS(g_object_new( + firebase_remote_config_remote_config_pigeon_settings_get_type(), + nullptr)); + self->fetch_timeout_seconds = fetch_timeout_seconds; + self->minimum_fetch_interval_seconds = minimum_fetch_interval_seconds; + return self; +} + +int64_t +firebase_remote_config_remote_config_pigeon_settings_get_fetch_timeout_seconds( + FirebaseRemoteConfigRemoteConfigPigeonSettings* self) { + g_return_val_if_fail( + FIREBASE_REMOTE_CONFIG_IS_REMOTE_CONFIG_PIGEON_SETTINGS(self), 0); + return self->fetch_timeout_seconds; +} + +int64_t +firebase_remote_config_remote_config_pigeon_settings_get_minimum_fetch_interval_seconds( + FirebaseRemoteConfigRemoteConfigPigeonSettings* self) { + g_return_val_if_fail( + FIREBASE_REMOTE_CONFIG_IS_REMOTE_CONFIG_PIGEON_SETTINGS(self), 0); + return self->minimum_fetch_interval_seconds; +} + +static FlValue* firebase_remote_config_remote_config_pigeon_settings_to_list( + FirebaseRemoteConfigRemoteConfigPigeonSettings* self) { + FlValue* values = fl_value_new_list(); + fl_value_append_take(values, fl_value_new_int(self->fetch_timeout_seconds)); + fl_value_append_take(values, + fl_value_new_int(self->minimum_fetch_interval_seconds)); + return values; +} + +static FirebaseRemoteConfigRemoteConfigPigeonSettings* +firebase_remote_config_remote_config_pigeon_settings_new_from_list( + FlValue* values) { + FlValue* value0 = fl_value_get_list_value(values, 0); + int64_t fetch_timeout_seconds = fl_value_get_int(value0); + FlValue* value1 = fl_value_get_list_value(values, 1); + int64_t minimum_fetch_interval_seconds = fl_value_get_int(value1); + return firebase_remote_config_remote_config_pigeon_settings_new( + fetch_timeout_seconds, minimum_fetch_interval_seconds); +} + +gboolean firebase_remote_config_remote_config_pigeon_settings_equals( + FirebaseRemoteConfigRemoteConfigPigeonSettings* a, + FirebaseRemoteConfigRemoteConfigPigeonSettings* b) { + if (a == b) { + return TRUE; + } + if (a == nullptr || b == nullptr) { + return FALSE; + } + if (a->fetch_timeout_seconds != b->fetch_timeout_seconds) { + return FALSE; + } + if (a->minimum_fetch_interval_seconds != b->minimum_fetch_interval_seconds) { + return FALSE; + } + return TRUE; +} + +guint firebase_remote_config_remote_config_pigeon_settings_hash( + FirebaseRemoteConfigRemoteConfigPigeonSettings* self) { + g_return_val_if_fail( + FIREBASE_REMOTE_CONFIG_IS_REMOTE_CONFIG_PIGEON_SETTINGS(self), 0); + guint result = 0; + result = result * 31 + static_cast(self->fetch_timeout_seconds); + result = + result * 31 + static_cast(self->minimum_fetch_interval_seconds); + return result; +} + +struct _FirebaseRemoteConfigMessageCodec { + FlStandardMessageCodec parent_instance; +}; + +G_DEFINE_TYPE(FirebaseRemoteConfigMessageCodec, + firebase_remote_config_message_codec, + fl_standard_message_codec_get_type()) + +const int firebase_remote_config_remote_config_pigeon_settings_type_id = 129; + +static gboolean +firebase_remote_config_message_codec_write_firebase_remote_config_remote_config_pigeon_settings( + FlStandardMessageCodec* codec, GByteArray* buffer, + FirebaseRemoteConfigRemoteConfigPigeonSettings* value, GError** error) { + uint8_t type = firebase_remote_config_remote_config_pigeon_settings_type_id; + g_byte_array_append(buffer, &type, sizeof(uint8_t)); + g_autoptr(FlValue) values = + firebase_remote_config_remote_config_pigeon_settings_to_list(value); + return fl_standard_message_codec_write_value(codec, buffer, values, error); +} + +static gboolean firebase_remote_config_message_codec_write_value( + FlStandardMessageCodec* codec, GByteArray* buffer, FlValue* value, + GError** error) { + if (fl_value_get_type(value) == FL_VALUE_TYPE_CUSTOM) { + switch (fl_value_get_custom_type(value)) { + case firebase_remote_config_remote_config_pigeon_settings_type_id: + return firebase_remote_config_message_codec_write_firebase_remote_config_remote_config_pigeon_settings( + codec, buffer, + FIREBASE_REMOTE_CONFIG_REMOTE_CONFIG_PIGEON_SETTINGS( + fl_value_get_custom_value_object(value)), + error); + } + } + + return FL_STANDARD_MESSAGE_CODEC_CLASS( + firebase_remote_config_message_codec_parent_class) + ->write_value(codec, buffer, value, error); +} + +static FlValue* +firebase_remote_config_message_codec_read_firebase_remote_config_remote_config_pigeon_settings( + FlStandardMessageCodec* codec, GBytes* buffer, size_t* offset, + GError** error) { + g_autoptr(FlValue) values = + fl_standard_message_codec_read_value(codec, buffer, offset, error); + if (values == nullptr) { + return nullptr; + } + + g_autoptr(FirebaseRemoteConfigRemoteConfigPigeonSettings) value = + firebase_remote_config_remote_config_pigeon_settings_new_from_list( + values); + if (value == nullptr) { + g_set_error(error, FL_MESSAGE_CODEC_ERROR, FL_MESSAGE_CODEC_ERROR_FAILED, + "Invalid data received for MessageData"); + return nullptr; + } + + return fl_value_new_custom_object( + firebase_remote_config_remote_config_pigeon_settings_type_id, + G_OBJECT(value)); +} + +static FlValue* firebase_remote_config_message_codec_read_value_of_type( + FlStandardMessageCodec* codec, GBytes* buffer, size_t* offset, int type, + GError** error) { + switch (type) { + case firebase_remote_config_remote_config_pigeon_settings_type_id: + return firebase_remote_config_message_codec_read_firebase_remote_config_remote_config_pigeon_settings( + codec, buffer, offset, error); + default: + return FL_STANDARD_MESSAGE_CODEC_CLASS( + firebase_remote_config_message_codec_parent_class) + ->read_value_of_type(codec, buffer, offset, type, error); + } +} + +static void firebase_remote_config_message_codec_init( + FirebaseRemoteConfigMessageCodec* self) {} + +static void firebase_remote_config_message_codec_class_init( + FirebaseRemoteConfigMessageCodecClass* klass) { + FL_STANDARD_MESSAGE_CODEC_CLASS(klass)->write_value = + firebase_remote_config_message_codec_write_value; + FL_STANDARD_MESSAGE_CODEC_CLASS(klass)->read_value_of_type = + firebase_remote_config_message_codec_read_value_of_type; +} + +static FirebaseRemoteConfigMessageCodec* +firebase_remote_config_message_codec_new() { + FirebaseRemoteConfigMessageCodec* self = FIREBASE_REMOTE_CONFIG_MESSAGE_CODEC( + g_object_new(firebase_remote_config_message_codec_get_type(), nullptr)); + return self; +} + +struct _FirebaseRemoteConfigFirebaseRemoteConfigHostApiResponseHandle { + GObject parent_instance; + + FlBasicMessageChannel* channel; + FlBasicMessageChannelResponseHandle* response_handle; +}; + +G_DEFINE_TYPE( + FirebaseRemoteConfigFirebaseRemoteConfigHostApiResponseHandle, + firebase_remote_config_firebase_remote_config_host_api_response_handle, + G_TYPE_OBJECT) + +static void +firebase_remote_config_firebase_remote_config_host_api_response_handle_dispose( + GObject* object) { + FirebaseRemoteConfigFirebaseRemoteConfigHostApiResponseHandle* self = + FIREBASE_REMOTE_CONFIG_FIREBASE_REMOTE_CONFIG_HOST_API_RESPONSE_HANDLE( + object); + g_clear_object(&self->channel); + g_clear_object(&self->response_handle); + G_OBJECT_CLASS( + firebase_remote_config_firebase_remote_config_host_api_response_handle_parent_class) + ->dispose(object); +} + +static void +firebase_remote_config_firebase_remote_config_host_api_response_handle_init( + FirebaseRemoteConfigFirebaseRemoteConfigHostApiResponseHandle* self) {} + +static void +firebase_remote_config_firebase_remote_config_host_api_response_handle_class_init( + FirebaseRemoteConfigFirebaseRemoteConfigHostApiResponseHandleClass* klass) { + G_OBJECT_CLASS(klass)->dispose = + firebase_remote_config_firebase_remote_config_host_api_response_handle_dispose; +} + +static FirebaseRemoteConfigFirebaseRemoteConfigHostApiResponseHandle* +firebase_remote_config_firebase_remote_config_host_api_response_handle_new( + FlBasicMessageChannel* channel, + FlBasicMessageChannelResponseHandle* response_handle) { + FirebaseRemoteConfigFirebaseRemoteConfigHostApiResponseHandle* self = + FIREBASE_REMOTE_CONFIG_FIREBASE_REMOTE_CONFIG_HOST_API_RESPONSE_HANDLE( + g_object_new( + firebase_remote_config_firebase_remote_config_host_api_response_handle_get_type(), + nullptr)); + self->channel = FL_BASIC_MESSAGE_CHANNEL(g_object_ref(channel)); + self->response_handle = + FL_BASIC_MESSAGE_CHANNEL_RESPONSE_HANDLE(g_object_ref(response_handle)); + return self; +} + +G_DECLARE_FINAL_TYPE( + FirebaseRemoteConfigFirebaseRemoteConfigHostApiFetchResponse, + firebase_remote_config_firebase_remote_config_host_api_fetch_response, + FIREBASE_REMOTE_CONFIG, FIREBASE_REMOTE_CONFIG_HOST_API_FETCH_RESPONSE, + GObject) + +struct _FirebaseRemoteConfigFirebaseRemoteConfigHostApiFetchResponse { + GObject parent_instance; + + FlValue* value; +}; + +G_DEFINE_TYPE( + FirebaseRemoteConfigFirebaseRemoteConfigHostApiFetchResponse, + firebase_remote_config_firebase_remote_config_host_api_fetch_response, + G_TYPE_OBJECT) + +static void +firebase_remote_config_firebase_remote_config_host_api_fetch_response_dispose( + GObject* object) { + FirebaseRemoteConfigFirebaseRemoteConfigHostApiFetchResponse* self = + FIREBASE_REMOTE_CONFIG_FIREBASE_REMOTE_CONFIG_HOST_API_FETCH_RESPONSE( + object); + g_clear_pointer(&self->value, fl_value_unref); + G_OBJECT_CLASS( + firebase_remote_config_firebase_remote_config_host_api_fetch_response_parent_class) + ->dispose(object); +} + +static void +firebase_remote_config_firebase_remote_config_host_api_fetch_response_init( + FirebaseRemoteConfigFirebaseRemoteConfigHostApiFetchResponse* self) {} + +static void +firebase_remote_config_firebase_remote_config_host_api_fetch_response_class_init( + FirebaseRemoteConfigFirebaseRemoteConfigHostApiFetchResponseClass* klass) { + G_OBJECT_CLASS(klass)->dispose = + firebase_remote_config_firebase_remote_config_host_api_fetch_response_dispose; +} + +static FirebaseRemoteConfigFirebaseRemoteConfigHostApiFetchResponse* +firebase_remote_config_firebase_remote_config_host_api_fetch_response_new() { + FirebaseRemoteConfigFirebaseRemoteConfigHostApiFetchResponse* self = + FIREBASE_REMOTE_CONFIG_FIREBASE_REMOTE_CONFIG_HOST_API_FETCH_RESPONSE( + g_object_new( + firebase_remote_config_firebase_remote_config_host_api_fetch_response_get_type(), + nullptr)); + self->value = fl_value_new_list(); + fl_value_append_take(self->value, fl_value_new_null()); + return self; +} + +static FirebaseRemoteConfigFirebaseRemoteConfigHostApiFetchResponse* +firebase_remote_config_firebase_remote_config_host_api_fetch_response_new_error( + const gchar* code, const gchar* message, FlValue* details) { + FirebaseRemoteConfigFirebaseRemoteConfigHostApiFetchResponse* self = + FIREBASE_REMOTE_CONFIG_FIREBASE_REMOTE_CONFIG_HOST_API_FETCH_RESPONSE( + g_object_new( + firebase_remote_config_firebase_remote_config_host_api_fetch_response_get_type(), + nullptr)); + self->value = fl_value_new_list(); + fl_value_append_take(self->value, fl_value_new_string(code)); + fl_value_append_take(self->value, + fl_value_new_string(message != nullptr ? message : "")); + fl_value_append_take(self->value, details != nullptr ? fl_value_ref(details) + : fl_value_new_null()); + return self; +} + +G_DECLARE_FINAL_TYPE( + FirebaseRemoteConfigFirebaseRemoteConfigHostApiFetchAndActivateResponse, + firebase_remote_config_firebase_remote_config_host_api_fetch_and_activate_response, + FIREBASE_REMOTE_CONFIG, + FIREBASE_REMOTE_CONFIG_HOST_API_FETCH_AND_ACTIVATE_RESPONSE, GObject) + +struct + _FirebaseRemoteConfigFirebaseRemoteConfigHostApiFetchAndActivateResponse { + GObject parent_instance; + + FlValue* value; +}; + +G_DEFINE_TYPE( + FirebaseRemoteConfigFirebaseRemoteConfigHostApiFetchAndActivateResponse, + firebase_remote_config_firebase_remote_config_host_api_fetch_and_activate_response, + G_TYPE_OBJECT) + +static void +firebase_remote_config_firebase_remote_config_host_api_fetch_and_activate_response_dispose( + GObject* object) { + FirebaseRemoteConfigFirebaseRemoteConfigHostApiFetchAndActivateResponse* self = + FIREBASE_REMOTE_CONFIG_FIREBASE_REMOTE_CONFIG_HOST_API_FETCH_AND_ACTIVATE_RESPONSE( + object); + g_clear_pointer(&self->value, fl_value_unref); + G_OBJECT_CLASS( + firebase_remote_config_firebase_remote_config_host_api_fetch_and_activate_response_parent_class) + ->dispose(object); +} + +static void +firebase_remote_config_firebase_remote_config_host_api_fetch_and_activate_response_init( + FirebaseRemoteConfigFirebaseRemoteConfigHostApiFetchAndActivateResponse* + self) {} + +static void +firebase_remote_config_firebase_remote_config_host_api_fetch_and_activate_response_class_init( + FirebaseRemoteConfigFirebaseRemoteConfigHostApiFetchAndActivateResponseClass* + klass) { + G_OBJECT_CLASS(klass)->dispose = + firebase_remote_config_firebase_remote_config_host_api_fetch_and_activate_response_dispose; +} + +static FirebaseRemoteConfigFirebaseRemoteConfigHostApiFetchAndActivateResponse* +firebase_remote_config_firebase_remote_config_host_api_fetch_and_activate_response_new( + gboolean return_value) { + FirebaseRemoteConfigFirebaseRemoteConfigHostApiFetchAndActivateResponse* self = + FIREBASE_REMOTE_CONFIG_FIREBASE_REMOTE_CONFIG_HOST_API_FETCH_AND_ACTIVATE_RESPONSE( + g_object_new( + firebase_remote_config_firebase_remote_config_host_api_fetch_and_activate_response_get_type(), + nullptr)); + self->value = fl_value_new_list(); + fl_value_append_take(self->value, fl_value_new_bool(return_value)); + return self; +} + +static FirebaseRemoteConfigFirebaseRemoteConfigHostApiFetchAndActivateResponse* +firebase_remote_config_firebase_remote_config_host_api_fetch_and_activate_response_new_error( + const gchar* code, const gchar* message, FlValue* details) { + FirebaseRemoteConfigFirebaseRemoteConfigHostApiFetchAndActivateResponse* self = + FIREBASE_REMOTE_CONFIG_FIREBASE_REMOTE_CONFIG_HOST_API_FETCH_AND_ACTIVATE_RESPONSE( + g_object_new( + firebase_remote_config_firebase_remote_config_host_api_fetch_and_activate_response_get_type(), + nullptr)); + self->value = fl_value_new_list(); + fl_value_append_take(self->value, fl_value_new_string(code)); + fl_value_append_take(self->value, + fl_value_new_string(message != nullptr ? message : "")); + fl_value_append_take(self->value, details != nullptr ? fl_value_ref(details) + : fl_value_new_null()); + return self; +} + +G_DECLARE_FINAL_TYPE( + FirebaseRemoteConfigFirebaseRemoteConfigHostApiActivateResponse, + firebase_remote_config_firebase_remote_config_host_api_activate_response, + FIREBASE_REMOTE_CONFIG, FIREBASE_REMOTE_CONFIG_HOST_API_ACTIVATE_RESPONSE, + GObject) + +struct _FirebaseRemoteConfigFirebaseRemoteConfigHostApiActivateResponse { + GObject parent_instance; + + FlValue* value; +}; + +G_DEFINE_TYPE( + FirebaseRemoteConfigFirebaseRemoteConfigHostApiActivateResponse, + firebase_remote_config_firebase_remote_config_host_api_activate_response, + G_TYPE_OBJECT) + +static void +firebase_remote_config_firebase_remote_config_host_api_activate_response_dispose( + GObject* object) { + FirebaseRemoteConfigFirebaseRemoteConfigHostApiActivateResponse* self = + FIREBASE_REMOTE_CONFIG_FIREBASE_REMOTE_CONFIG_HOST_API_ACTIVATE_RESPONSE( + object); + g_clear_pointer(&self->value, fl_value_unref); + G_OBJECT_CLASS( + firebase_remote_config_firebase_remote_config_host_api_activate_response_parent_class) + ->dispose(object); +} + +static void +firebase_remote_config_firebase_remote_config_host_api_activate_response_init( + FirebaseRemoteConfigFirebaseRemoteConfigHostApiActivateResponse* self) {} + +static void +firebase_remote_config_firebase_remote_config_host_api_activate_response_class_init( + FirebaseRemoteConfigFirebaseRemoteConfigHostApiActivateResponseClass* + klass) { + G_OBJECT_CLASS(klass)->dispose = + firebase_remote_config_firebase_remote_config_host_api_activate_response_dispose; +} + +static FirebaseRemoteConfigFirebaseRemoteConfigHostApiActivateResponse* +firebase_remote_config_firebase_remote_config_host_api_activate_response_new( + gboolean return_value) { + FirebaseRemoteConfigFirebaseRemoteConfigHostApiActivateResponse* self = + FIREBASE_REMOTE_CONFIG_FIREBASE_REMOTE_CONFIG_HOST_API_ACTIVATE_RESPONSE( + g_object_new( + firebase_remote_config_firebase_remote_config_host_api_activate_response_get_type(), + nullptr)); + self->value = fl_value_new_list(); + fl_value_append_take(self->value, fl_value_new_bool(return_value)); + return self; +} + +static FirebaseRemoteConfigFirebaseRemoteConfigHostApiActivateResponse* +firebase_remote_config_firebase_remote_config_host_api_activate_response_new_error( + const gchar* code, const gchar* message, FlValue* details) { + FirebaseRemoteConfigFirebaseRemoteConfigHostApiActivateResponse* self = + FIREBASE_REMOTE_CONFIG_FIREBASE_REMOTE_CONFIG_HOST_API_ACTIVATE_RESPONSE( + g_object_new( + firebase_remote_config_firebase_remote_config_host_api_activate_response_get_type(), + nullptr)); + self->value = fl_value_new_list(); + fl_value_append_take(self->value, fl_value_new_string(code)); + fl_value_append_take(self->value, + fl_value_new_string(message != nullptr ? message : "")); + fl_value_append_take(self->value, details != nullptr ? fl_value_ref(details) + : fl_value_new_null()); + return self; +} + +G_DECLARE_FINAL_TYPE( + FirebaseRemoteConfigFirebaseRemoteConfigHostApiSetConfigSettingsResponse, + firebase_remote_config_firebase_remote_config_host_api_set_config_settings_response, + FIREBASE_REMOTE_CONFIG, + FIREBASE_REMOTE_CONFIG_HOST_API_SET_CONFIG_SETTINGS_RESPONSE, GObject) + +struct + _FirebaseRemoteConfigFirebaseRemoteConfigHostApiSetConfigSettingsResponse { + GObject parent_instance; + + FlValue* value; +}; + +G_DEFINE_TYPE( + FirebaseRemoteConfigFirebaseRemoteConfigHostApiSetConfigSettingsResponse, + firebase_remote_config_firebase_remote_config_host_api_set_config_settings_response, + G_TYPE_OBJECT) + +static void +firebase_remote_config_firebase_remote_config_host_api_set_config_settings_response_dispose( + GObject* object) { + FirebaseRemoteConfigFirebaseRemoteConfigHostApiSetConfigSettingsResponse* self = + FIREBASE_REMOTE_CONFIG_FIREBASE_REMOTE_CONFIG_HOST_API_SET_CONFIG_SETTINGS_RESPONSE( + object); + g_clear_pointer(&self->value, fl_value_unref); + G_OBJECT_CLASS( + firebase_remote_config_firebase_remote_config_host_api_set_config_settings_response_parent_class) + ->dispose(object); +} + +static void +firebase_remote_config_firebase_remote_config_host_api_set_config_settings_response_init( + FirebaseRemoteConfigFirebaseRemoteConfigHostApiSetConfigSettingsResponse* + self) {} + +static void +firebase_remote_config_firebase_remote_config_host_api_set_config_settings_response_class_init( + FirebaseRemoteConfigFirebaseRemoteConfigHostApiSetConfigSettingsResponseClass* + klass) { + G_OBJECT_CLASS(klass)->dispose = + firebase_remote_config_firebase_remote_config_host_api_set_config_settings_response_dispose; +} + +static FirebaseRemoteConfigFirebaseRemoteConfigHostApiSetConfigSettingsResponse* +firebase_remote_config_firebase_remote_config_host_api_set_config_settings_response_new() { + FirebaseRemoteConfigFirebaseRemoteConfigHostApiSetConfigSettingsResponse* self = + FIREBASE_REMOTE_CONFIG_FIREBASE_REMOTE_CONFIG_HOST_API_SET_CONFIG_SETTINGS_RESPONSE( + g_object_new( + firebase_remote_config_firebase_remote_config_host_api_set_config_settings_response_get_type(), + nullptr)); + self->value = fl_value_new_list(); + fl_value_append_take(self->value, fl_value_new_null()); + return self; +} + +static FirebaseRemoteConfigFirebaseRemoteConfigHostApiSetConfigSettingsResponse* +firebase_remote_config_firebase_remote_config_host_api_set_config_settings_response_new_error( + const gchar* code, const gchar* message, FlValue* details) { + FirebaseRemoteConfigFirebaseRemoteConfigHostApiSetConfigSettingsResponse* self = + FIREBASE_REMOTE_CONFIG_FIREBASE_REMOTE_CONFIG_HOST_API_SET_CONFIG_SETTINGS_RESPONSE( + g_object_new( + firebase_remote_config_firebase_remote_config_host_api_set_config_settings_response_get_type(), + nullptr)); + self->value = fl_value_new_list(); + fl_value_append_take(self->value, fl_value_new_string(code)); + fl_value_append_take(self->value, + fl_value_new_string(message != nullptr ? message : "")); + fl_value_append_take(self->value, details != nullptr ? fl_value_ref(details) + : fl_value_new_null()); + return self; +} + +G_DECLARE_FINAL_TYPE( + FirebaseRemoteConfigFirebaseRemoteConfigHostApiSetDefaultsResponse, + firebase_remote_config_firebase_remote_config_host_api_set_defaults_response, + FIREBASE_REMOTE_CONFIG, + FIREBASE_REMOTE_CONFIG_HOST_API_SET_DEFAULTS_RESPONSE, GObject) + +struct _FirebaseRemoteConfigFirebaseRemoteConfigHostApiSetDefaultsResponse { + GObject parent_instance; + + FlValue* value; +}; + +G_DEFINE_TYPE( + FirebaseRemoteConfigFirebaseRemoteConfigHostApiSetDefaultsResponse, + firebase_remote_config_firebase_remote_config_host_api_set_defaults_response, + G_TYPE_OBJECT) + +static void +firebase_remote_config_firebase_remote_config_host_api_set_defaults_response_dispose( + GObject* object) { + FirebaseRemoteConfigFirebaseRemoteConfigHostApiSetDefaultsResponse* self = + FIREBASE_REMOTE_CONFIG_FIREBASE_REMOTE_CONFIG_HOST_API_SET_DEFAULTS_RESPONSE( + object); + g_clear_pointer(&self->value, fl_value_unref); + G_OBJECT_CLASS( + firebase_remote_config_firebase_remote_config_host_api_set_defaults_response_parent_class) + ->dispose(object); +} + +static void +firebase_remote_config_firebase_remote_config_host_api_set_defaults_response_init( + FirebaseRemoteConfigFirebaseRemoteConfigHostApiSetDefaultsResponse* self) {} + +static void +firebase_remote_config_firebase_remote_config_host_api_set_defaults_response_class_init( + FirebaseRemoteConfigFirebaseRemoteConfigHostApiSetDefaultsResponseClass* + klass) { + G_OBJECT_CLASS(klass)->dispose = + firebase_remote_config_firebase_remote_config_host_api_set_defaults_response_dispose; +} + +static FirebaseRemoteConfigFirebaseRemoteConfigHostApiSetDefaultsResponse* +firebase_remote_config_firebase_remote_config_host_api_set_defaults_response_new() { + FirebaseRemoteConfigFirebaseRemoteConfigHostApiSetDefaultsResponse* self = + FIREBASE_REMOTE_CONFIG_FIREBASE_REMOTE_CONFIG_HOST_API_SET_DEFAULTS_RESPONSE( + g_object_new( + firebase_remote_config_firebase_remote_config_host_api_set_defaults_response_get_type(), + nullptr)); + self->value = fl_value_new_list(); + fl_value_append_take(self->value, fl_value_new_null()); + return self; +} + +static FirebaseRemoteConfigFirebaseRemoteConfigHostApiSetDefaultsResponse* +firebase_remote_config_firebase_remote_config_host_api_set_defaults_response_new_error( + const gchar* code, const gchar* message, FlValue* details) { + FirebaseRemoteConfigFirebaseRemoteConfigHostApiSetDefaultsResponse* self = + FIREBASE_REMOTE_CONFIG_FIREBASE_REMOTE_CONFIG_HOST_API_SET_DEFAULTS_RESPONSE( + g_object_new( + firebase_remote_config_firebase_remote_config_host_api_set_defaults_response_get_type(), + nullptr)); + self->value = fl_value_new_list(); + fl_value_append_take(self->value, fl_value_new_string(code)); + fl_value_append_take(self->value, + fl_value_new_string(message != nullptr ? message : "")); + fl_value_append_take(self->value, details != nullptr ? fl_value_ref(details) + : fl_value_new_null()); + return self; +} + +G_DECLARE_FINAL_TYPE( + FirebaseRemoteConfigFirebaseRemoteConfigHostApiEnsureInitializedResponse, + firebase_remote_config_firebase_remote_config_host_api_ensure_initialized_response, + FIREBASE_REMOTE_CONFIG, + FIREBASE_REMOTE_CONFIG_HOST_API_ENSURE_INITIALIZED_RESPONSE, GObject) + +struct + _FirebaseRemoteConfigFirebaseRemoteConfigHostApiEnsureInitializedResponse { + GObject parent_instance; + + FlValue* value; +}; + +G_DEFINE_TYPE( + FirebaseRemoteConfigFirebaseRemoteConfigHostApiEnsureInitializedResponse, + firebase_remote_config_firebase_remote_config_host_api_ensure_initialized_response, + G_TYPE_OBJECT) + +static void +firebase_remote_config_firebase_remote_config_host_api_ensure_initialized_response_dispose( + GObject* object) { + FirebaseRemoteConfigFirebaseRemoteConfigHostApiEnsureInitializedResponse* self = + FIREBASE_REMOTE_CONFIG_FIREBASE_REMOTE_CONFIG_HOST_API_ENSURE_INITIALIZED_RESPONSE( + object); + g_clear_pointer(&self->value, fl_value_unref); + G_OBJECT_CLASS( + firebase_remote_config_firebase_remote_config_host_api_ensure_initialized_response_parent_class) + ->dispose(object); +} + +static void +firebase_remote_config_firebase_remote_config_host_api_ensure_initialized_response_init( + FirebaseRemoteConfigFirebaseRemoteConfigHostApiEnsureInitializedResponse* + self) {} + +static void +firebase_remote_config_firebase_remote_config_host_api_ensure_initialized_response_class_init( + FirebaseRemoteConfigFirebaseRemoteConfigHostApiEnsureInitializedResponseClass* + klass) { + G_OBJECT_CLASS(klass)->dispose = + firebase_remote_config_firebase_remote_config_host_api_ensure_initialized_response_dispose; +} + +static FirebaseRemoteConfigFirebaseRemoteConfigHostApiEnsureInitializedResponse* +firebase_remote_config_firebase_remote_config_host_api_ensure_initialized_response_new() { + FirebaseRemoteConfigFirebaseRemoteConfigHostApiEnsureInitializedResponse* self = + FIREBASE_REMOTE_CONFIG_FIREBASE_REMOTE_CONFIG_HOST_API_ENSURE_INITIALIZED_RESPONSE( + g_object_new( + firebase_remote_config_firebase_remote_config_host_api_ensure_initialized_response_get_type(), + nullptr)); + self->value = fl_value_new_list(); + fl_value_append_take(self->value, fl_value_new_null()); + return self; +} + +static FirebaseRemoteConfigFirebaseRemoteConfigHostApiEnsureInitializedResponse* +firebase_remote_config_firebase_remote_config_host_api_ensure_initialized_response_new_error( + const gchar* code, const gchar* message, FlValue* details) { + FirebaseRemoteConfigFirebaseRemoteConfigHostApiEnsureInitializedResponse* self = + FIREBASE_REMOTE_CONFIG_FIREBASE_REMOTE_CONFIG_HOST_API_ENSURE_INITIALIZED_RESPONSE( + g_object_new( + firebase_remote_config_firebase_remote_config_host_api_ensure_initialized_response_get_type(), + nullptr)); + self->value = fl_value_new_list(); + fl_value_append_take(self->value, fl_value_new_string(code)); + fl_value_append_take(self->value, + fl_value_new_string(message != nullptr ? message : "")); + fl_value_append_take(self->value, details != nullptr ? fl_value_ref(details) + : fl_value_new_null()); + return self; +} + +G_DECLARE_FINAL_TYPE( + FirebaseRemoteConfigFirebaseRemoteConfigHostApiSetCustomSignalsResponse, + firebase_remote_config_firebase_remote_config_host_api_set_custom_signals_response, + FIREBASE_REMOTE_CONFIG, + FIREBASE_REMOTE_CONFIG_HOST_API_SET_CUSTOM_SIGNALS_RESPONSE, GObject) + +struct + _FirebaseRemoteConfigFirebaseRemoteConfigHostApiSetCustomSignalsResponse { + GObject parent_instance; + + FlValue* value; +}; + +G_DEFINE_TYPE( + FirebaseRemoteConfigFirebaseRemoteConfigHostApiSetCustomSignalsResponse, + firebase_remote_config_firebase_remote_config_host_api_set_custom_signals_response, + G_TYPE_OBJECT) + +static void +firebase_remote_config_firebase_remote_config_host_api_set_custom_signals_response_dispose( + GObject* object) { + FirebaseRemoteConfigFirebaseRemoteConfigHostApiSetCustomSignalsResponse* self = + FIREBASE_REMOTE_CONFIG_FIREBASE_REMOTE_CONFIG_HOST_API_SET_CUSTOM_SIGNALS_RESPONSE( + object); + g_clear_pointer(&self->value, fl_value_unref); + G_OBJECT_CLASS( + firebase_remote_config_firebase_remote_config_host_api_set_custom_signals_response_parent_class) + ->dispose(object); +} + +static void +firebase_remote_config_firebase_remote_config_host_api_set_custom_signals_response_init( + FirebaseRemoteConfigFirebaseRemoteConfigHostApiSetCustomSignalsResponse* + self) {} + +static void +firebase_remote_config_firebase_remote_config_host_api_set_custom_signals_response_class_init( + FirebaseRemoteConfigFirebaseRemoteConfigHostApiSetCustomSignalsResponseClass* + klass) { + G_OBJECT_CLASS(klass)->dispose = + firebase_remote_config_firebase_remote_config_host_api_set_custom_signals_response_dispose; +} + +static FirebaseRemoteConfigFirebaseRemoteConfigHostApiSetCustomSignalsResponse* +firebase_remote_config_firebase_remote_config_host_api_set_custom_signals_response_new() { + FirebaseRemoteConfigFirebaseRemoteConfigHostApiSetCustomSignalsResponse* self = + FIREBASE_REMOTE_CONFIG_FIREBASE_REMOTE_CONFIG_HOST_API_SET_CUSTOM_SIGNALS_RESPONSE( + g_object_new( + firebase_remote_config_firebase_remote_config_host_api_set_custom_signals_response_get_type(), + nullptr)); + self->value = fl_value_new_list(); + fl_value_append_take(self->value, fl_value_new_null()); + return self; +} + +static FirebaseRemoteConfigFirebaseRemoteConfigHostApiSetCustomSignalsResponse* +firebase_remote_config_firebase_remote_config_host_api_set_custom_signals_response_new_error( + const gchar* code, const gchar* message, FlValue* details) { + FirebaseRemoteConfigFirebaseRemoteConfigHostApiSetCustomSignalsResponse* self = + FIREBASE_REMOTE_CONFIG_FIREBASE_REMOTE_CONFIG_HOST_API_SET_CUSTOM_SIGNALS_RESPONSE( + g_object_new( + firebase_remote_config_firebase_remote_config_host_api_set_custom_signals_response_get_type(), + nullptr)); + self->value = fl_value_new_list(); + fl_value_append_take(self->value, fl_value_new_string(code)); + fl_value_append_take(self->value, + fl_value_new_string(message != nullptr ? message : "")); + fl_value_append_take(self->value, details != nullptr ? fl_value_ref(details) + : fl_value_new_null()); + return self; +} + +G_DECLARE_FINAL_TYPE( + FirebaseRemoteConfigFirebaseRemoteConfigHostApiGetAllResponse, + firebase_remote_config_firebase_remote_config_host_api_get_all_response, + FIREBASE_REMOTE_CONFIG, FIREBASE_REMOTE_CONFIG_HOST_API_GET_ALL_RESPONSE, + GObject) + +struct _FirebaseRemoteConfigFirebaseRemoteConfigHostApiGetAllResponse { + GObject parent_instance; + + FlValue* value; +}; + +G_DEFINE_TYPE( + FirebaseRemoteConfigFirebaseRemoteConfigHostApiGetAllResponse, + firebase_remote_config_firebase_remote_config_host_api_get_all_response, + G_TYPE_OBJECT) + +static void +firebase_remote_config_firebase_remote_config_host_api_get_all_response_dispose( + GObject* object) { + FirebaseRemoteConfigFirebaseRemoteConfigHostApiGetAllResponse* self = + FIREBASE_REMOTE_CONFIG_FIREBASE_REMOTE_CONFIG_HOST_API_GET_ALL_RESPONSE( + object); + g_clear_pointer(&self->value, fl_value_unref); + G_OBJECT_CLASS( + firebase_remote_config_firebase_remote_config_host_api_get_all_response_parent_class) + ->dispose(object); +} + +static void +firebase_remote_config_firebase_remote_config_host_api_get_all_response_init( + FirebaseRemoteConfigFirebaseRemoteConfigHostApiGetAllResponse* self) {} + +static void +firebase_remote_config_firebase_remote_config_host_api_get_all_response_class_init( + FirebaseRemoteConfigFirebaseRemoteConfigHostApiGetAllResponseClass* klass) { + G_OBJECT_CLASS(klass)->dispose = + firebase_remote_config_firebase_remote_config_host_api_get_all_response_dispose; +} + +static FirebaseRemoteConfigFirebaseRemoteConfigHostApiGetAllResponse* +firebase_remote_config_firebase_remote_config_host_api_get_all_response_new( + FlValue* return_value) { + FirebaseRemoteConfigFirebaseRemoteConfigHostApiGetAllResponse* self = + FIREBASE_REMOTE_CONFIG_FIREBASE_REMOTE_CONFIG_HOST_API_GET_ALL_RESPONSE( + g_object_new( + firebase_remote_config_firebase_remote_config_host_api_get_all_response_get_type(), + nullptr)); + self->value = fl_value_new_list(); + fl_value_append_take(self->value, fl_value_ref(return_value)); + return self; +} + +static FirebaseRemoteConfigFirebaseRemoteConfigHostApiGetAllResponse* +firebase_remote_config_firebase_remote_config_host_api_get_all_response_new_error( + const gchar* code, const gchar* message, FlValue* details) { + FirebaseRemoteConfigFirebaseRemoteConfigHostApiGetAllResponse* self = + FIREBASE_REMOTE_CONFIG_FIREBASE_REMOTE_CONFIG_HOST_API_GET_ALL_RESPONSE( + g_object_new( + firebase_remote_config_firebase_remote_config_host_api_get_all_response_get_type(), + nullptr)); + self->value = fl_value_new_list(); + fl_value_append_take(self->value, fl_value_new_string(code)); + fl_value_append_take(self->value, + fl_value_new_string(message != nullptr ? message : "")); + fl_value_append_take(self->value, details != nullptr ? fl_value_ref(details) + : fl_value_new_null()); + return self; +} + +G_DECLARE_FINAL_TYPE( + FirebaseRemoteConfigFirebaseRemoteConfigHostApiGetPropertiesResponse, + firebase_remote_config_firebase_remote_config_host_api_get_properties_response, + FIREBASE_REMOTE_CONFIG, + FIREBASE_REMOTE_CONFIG_HOST_API_GET_PROPERTIES_RESPONSE, GObject) + +struct _FirebaseRemoteConfigFirebaseRemoteConfigHostApiGetPropertiesResponse { + GObject parent_instance; + + FlValue* value; +}; + +G_DEFINE_TYPE( + FirebaseRemoteConfigFirebaseRemoteConfigHostApiGetPropertiesResponse, + firebase_remote_config_firebase_remote_config_host_api_get_properties_response, + G_TYPE_OBJECT) + +static void +firebase_remote_config_firebase_remote_config_host_api_get_properties_response_dispose( + GObject* object) { + FirebaseRemoteConfigFirebaseRemoteConfigHostApiGetPropertiesResponse* self = + FIREBASE_REMOTE_CONFIG_FIREBASE_REMOTE_CONFIG_HOST_API_GET_PROPERTIES_RESPONSE( + object); + g_clear_pointer(&self->value, fl_value_unref); + G_OBJECT_CLASS( + firebase_remote_config_firebase_remote_config_host_api_get_properties_response_parent_class) + ->dispose(object); +} + +static void +firebase_remote_config_firebase_remote_config_host_api_get_properties_response_init( + FirebaseRemoteConfigFirebaseRemoteConfigHostApiGetPropertiesResponse* + self) {} + +static void +firebase_remote_config_firebase_remote_config_host_api_get_properties_response_class_init( + FirebaseRemoteConfigFirebaseRemoteConfigHostApiGetPropertiesResponseClass* + klass) { + G_OBJECT_CLASS(klass)->dispose = + firebase_remote_config_firebase_remote_config_host_api_get_properties_response_dispose; +} + +static FirebaseRemoteConfigFirebaseRemoteConfigHostApiGetPropertiesResponse* +firebase_remote_config_firebase_remote_config_host_api_get_properties_response_new( + FlValue* return_value) { + FirebaseRemoteConfigFirebaseRemoteConfigHostApiGetPropertiesResponse* self = + FIREBASE_REMOTE_CONFIG_FIREBASE_REMOTE_CONFIG_HOST_API_GET_PROPERTIES_RESPONSE( + g_object_new( + firebase_remote_config_firebase_remote_config_host_api_get_properties_response_get_type(), + nullptr)); + self->value = fl_value_new_list(); + fl_value_append_take(self->value, fl_value_ref(return_value)); + return self; +} + +static FirebaseRemoteConfigFirebaseRemoteConfigHostApiGetPropertiesResponse* +firebase_remote_config_firebase_remote_config_host_api_get_properties_response_new_error( + const gchar* code, const gchar* message, FlValue* details) { + FirebaseRemoteConfigFirebaseRemoteConfigHostApiGetPropertiesResponse* self = + FIREBASE_REMOTE_CONFIG_FIREBASE_REMOTE_CONFIG_HOST_API_GET_PROPERTIES_RESPONSE( + g_object_new( + firebase_remote_config_firebase_remote_config_host_api_get_properties_response_get_type(), + nullptr)); + self->value = fl_value_new_list(); + fl_value_append_take(self->value, fl_value_new_string(code)); + fl_value_append_take(self->value, + fl_value_new_string(message != nullptr ? message : "")); + fl_value_append_take(self->value, details != nullptr ? fl_value_ref(details) + : fl_value_new_null()); + return self; +} + +struct _FirebaseRemoteConfigFirebaseRemoteConfigHostApi { + GObject parent_instance; + + const FirebaseRemoteConfigFirebaseRemoteConfigHostApiVTable* vtable; + gpointer user_data; + GDestroyNotify user_data_free_func; +}; + +G_DEFINE_TYPE(FirebaseRemoteConfigFirebaseRemoteConfigHostApi, + firebase_remote_config_firebase_remote_config_host_api, + G_TYPE_OBJECT) + +static void firebase_remote_config_firebase_remote_config_host_api_dispose( + GObject* object) { + FirebaseRemoteConfigFirebaseRemoteConfigHostApi* self = + FIREBASE_REMOTE_CONFIG_FIREBASE_REMOTE_CONFIG_HOST_API(object); + if (self->user_data != nullptr) { + self->user_data_free_func(self->user_data); + } + self->user_data = nullptr; + G_OBJECT_CLASS( + firebase_remote_config_firebase_remote_config_host_api_parent_class) + ->dispose(object); +} + +static void firebase_remote_config_firebase_remote_config_host_api_init( + FirebaseRemoteConfigFirebaseRemoteConfigHostApi* self) {} + +static void firebase_remote_config_firebase_remote_config_host_api_class_init( + FirebaseRemoteConfigFirebaseRemoteConfigHostApiClass* klass) { + G_OBJECT_CLASS(klass)->dispose = + firebase_remote_config_firebase_remote_config_host_api_dispose; +} + +static FirebaseRemoteConfigFirebaseRemoteConfigHostApi* +firebase_remote_config_firebase_remote_config_host_api_new( + const FirebaseRemoteConfigFirebaseRemoteConfigHostApiVTable* vtable, + gpointer user_data, GDestroyNotify user_data_free_func) { + FirebaseRemoteConfigFirebaseRemoteConfigHostApi* self = + FIREBASE_REMOTE_CONFIG_FIREBASE_REMOTE_CONFIG_HOST_API(g_object_new( + firebase_remote_config_firebase_remote_config_host_api_get_type(), + nullptr)); + self->vtable = vtable; + self->user_data = user_data; + self->user_data_free_func = user_data_free_func; + return self; +} + +static void firebase_remote_config_firebase_remote_config_host_api_fetch_cb( + FlBasicMessageChannel* channel, FlValue* message_, + FlBasicMessageChannelResponseHandle* response_handle, gpointer user_data) { + FirebaseRemoteConfigFirebaseRemoteConfigHostApi* self = + FIREBASE_REMOTE_CONFIG_FIREBASE_REMOTE_CONFIG_HOST_API(user_data); + + if (self->vtable == nullptr || self->vtable->fetch == nullptr) { + return; + } + + FlValue* value0 = fl_value_get_list_value(message_, 0); + const gchar* app_name = fl_value_get_string(value0); + g_autoptr( + FirebaseRemoteConfigFirebaseRemoteConfigHostApiResponseHandle) handle = + firebase_remote_config_firebase_remote_config_host_api_response_handle_new( + channel, response_handle); + self->vtable->fetch(app_name, handle, self->user_data); +} + +static void +firebase_remote_config_firebase_remote_config_host_api_fetch_and_activate_cb( + FlBasicMessageChannel* channel, FlValue* message_, + FlBasicMessageChannelResponseHandle* response_handle, gpointer user_data) { + FirebaseRemoteConfigFirebaseRemoteConfigHostApi* self = + FIREBASE_REMOTE_CONFIG_FIREBASE_REMOTE_CONFIG_HOST_API(user_data); + + if (self->vtable == nullptr || self->vtable->fetch_and_activate == nullptr) { + return; + } + + FlValue* value0 = fl_value_get_list_value(message_, 0); + const gchar* app_name = fl_value_get_string(value0); + g_autoptr( + FirebaseRemoteConfigFirebaseRemoteConfigHostApiResponseHandle) handle = + firebase_remote_config_firebase_remote_config_host_api_response_handle_new( + channel, response_handle); + self->vtable->fetch_and_activate(app_name, handle, self->user_data); +} + +static void firebase_remote_config_firebase_remote_config_host_api_activate_cb( + FlBasicMessageChannel* channel, FlValue* message_, + FlBasicMessageChannelResponseHandle* response_handle, gpointer user_data) { + FirebaseRemoteConfigFirebaseRemoteConfigHostApi* self = + FIREBASE_REMOTE_CONFIG_FIREBASE_REMOTE_CONFIG_HOST_API(user_data); + + if (self->vtable == nullptr || self->vtable->activate == nullptr) { + return; + } + + FlValue* value0 = fl_value_get_list_value(message_, 0); + const gchar* app_name = fl_value_get_string(value0); + g_autoptr( + FirebaseRemoteConfigFirebaseRemoteConfigHostApiResponseHandle) handle = + firebase_remote_config_firebase_remote_config_host_api_response_handle_new( + channel, response_handle); + self->vtable->activate(app_name, handle, self->user_data); +} + +static void +firebase_remote_config_firebase_remote_config_host_api_set_config_settings_cb( + FlBasicMessageChannel* channel, FlValue* message_, + FlBasicMessageChannelResponseHandle* response_handle, gpointer user_data) { + FirebaseRemoteConfigFirebaseRemoteConfigHostApi* self = + FIREBASE_REMOTE_CONFIG_FIREBASE_REMOTE_CONFIG_HOST_API(user_data); + + if (self->vtable == nullptr || self->vtable->set_config_settings == nullptr) { + return; + } + + FlValue* value0 = fl_value_get_list_value(message_, 0); + const gchar* app_name = fl_value_get_string(value0); + FlValue* value1 = fl_value_get_list_value(message_, 1); + FirebaseRemoteConfigRemoteConfigPigeonSettings* settings = + FIREBASE_REMOTE_CONFIG_REMOTE_CONFIG_PIGEON_SETTINGS( + fl_value_get_custom_value_object(value1)); + g_autoptr( + FirebaseRemoteConfigFirebaseRemoteConfigHostApiResponseHandle) handle = + firebase_remote_config_firebase_remote_config_host_api_response_handle_new( + channel, response_handle); + self->vtable->set_config_settings(app_name, settings, handle, + self->user_data); +} + +static void +firebase_remote_config_firebase_remote_config_host_api_set_defaults_cb( + FlBasicMessageChannel* channel, FlValue* message_, + FlBasicMessageChannelResponseHandle* response_handle, gpointer user_data) { + FirebaseRemoteConfigFirebaseRemoteConfigHostApi* self = + FIREBASE_REMOTE_CONFIG_FIREBASE_REMOTE_CONFIG_HOST_API(user_data); + + if (self->vtable == nullptr || self->vtable->set_defaults == nullptr) { + return; + } + + FlValue* value0 = fl_value_get_list_value(message_, 0); + const gchar* app_name = fl_value_get_string(value0); + FlValue* value1 = fl_value_get_list_value(message_, 1); + FlValue* default_parameters = value1; + g_autoptr( + FirebaseRemoteConfigFirebaseRemoteConfigHostApiResponseHandle) handle = + firebase_remote_config_firebase_remote_config_host_api_response_handle_new( + channel, response_handle); + self->vtable->set_defaults(app_name, default_parameters, handle, + self->user_data); +} + +static void +firebase_remote_config_firebase_remote_config_host_api_ensure_initialized_cb( + FlBasicMessageChannel* channel, FlValue* message_, + FlBasicMessageChannelResponseHandle* response_handle, gpointer user_data) { + FirebaseRemoteConfigFirebaseRemoteConfigHostApi* self = + FIREBASE_REMOTE_CONFIG_FIREBASE_REMOTE_CONFIG_HOST_API(user_data); + + if (self->vtable == nullptr || self->vtable->ensure_initialized == nullptr) { + return; + } + + FlValue* value0 = fl_value_get_list_value(message_, 0); + const gchar* app_name = fl_value_get_string(value0); + g_autoptr( + FirebaseRemoteConfigFirebaseRemoteConfigHostApiResponseHandle) handle = + firebase_remote_config_firebase_remote_config_host_api_response_handle_new( + channel, response_handle); + self->vtable->ensure_initialized(app_name, handle, self->user_data); +} + +static void +firebase_remote_config_firebase_remote_config_host_api_set_custom_signals_cb( + FlBasicMessageChannel* channel, FlValue* message_, + FlBasicMessageChannelResponseHandle* response_handle, gpointer user_data) { + FirebaseRemoteConfigFirebaseRemoteConfigHostApi* self = + FIREBASE_REMOTE_CONFIG_FIREBASE_REMOTE_CONFIG_HOST_API(user_data); + + if (self->vtable == nullptr || self->vtable->set_custom_signals == nullptr) { + return; + } + + FlValue* value0 = fl_value_get_list_value(message_, 0); + const gchar* app_name = fl_value_get_string(value0); + FlValue* value1 = fl_value_get_list_value(message_, 1); + FlValue* custom_signals = value1; + g_autoptr( + FirebaseRemoteConfigFirebaseRemoteConfigHostApiResponseHandle) handle = + firebase_remote_config_firebase_remote_config_host_api_response_handle_new( + channel, response_handle); + self->vtable->set_custom_signals(app_name, custom_signals, handle, + self->user_data); +} + +static void firebase_remote_config_firebase_remote_config_host_api_get_all_cb( + FlBasicMessageChannel* channel, FlValue* message_, + FlBasicMessageChannelResponseHandle* response_handle, gpointer user_data) { + FirebaseRemoteConfigFirebaseRemoteConfigHostApi* self = + FIREBASE_REMOTE_CONFIG_FIREBASE_REMOTE_CONFIG_HOST_API(user_data); + + if (self->vtable == nullptr || self->vtable->get_all == nullptr) { + return; + } + + FlValue* value0 = fl_value_get_list_value(message_, 0); + const gchar* app_name = fl_value_get_string(value0); + g_autoptr( + FirebaseRemoteConfigFirebaseRemoteConfigHostApiResponseHandle) handle = + firebase_remote_config_firebase_remote_config_host_api_response_handle_new( + channel, response_handle); + self->vtable->get_all(app_name, handle, self->user_data); +} + +static void +firebase_remote_config_firebase_remote_config_host_api_get_properties_cb( + FlBasicMessageChannel* channel, FlValue* message_, + FlBasicMessageChannelResponseHandle* response_handle, gpointer user_data) { + FirebaseRemoteConfigFirebaseRemoteConfigHostApi* self = + FIREBASE_REMOTE_CONFIG_FIREBASE_REMOTE_CONFIG_HOST_API(user_data); + + if (self->vtable == nullptr || self->vtable->get_properties == nullptr) { + return; + } + + FlValue* value0 = fl_value_get_list_value(message_, 0); + const gchar* app_name = fl_value_get_string(value0); + g_autoptr( + FirebaseRemoteConfigFirebaseRemoteConfigHostApiResponseHandle) handle = + firebase_remote_config_firebase_remote_config_host_api_response_handle_new( + channel, response_handle); + self->vtable->get_properties(app_name, handle, self->user_data); +} + +void firebase_remote_config_firebase_remote_config_host_api_set_method_handlers( + FlBinaryMessenger* messenger, const gchar* suffix, + const FirebaseRemoteConfigFirebaseRemoteConfigHostApiVTable* vtable, + gpointer user_data, GDestroyNotify user_data_free_func) { + g_autofree gchar* dot_suffix = + suffix != nullptr ? g_strdup_printf(".%s", suffix) : g_strdup(""); + g_autoptr(FirebaseRemoteConfigFirebaseRemoteConfigHostApi) api_data = + firebase_remote_config_firebase_remote_config_host_api_new( + vtable, user_data, user_data_free_func); + + g_autoptr(FirebaseRemoteConfigMessageCodec) codec = + firebase_remote_config_message_codec_new(); + g_autofree gchar* fetch_channel_name = g_strdup_printf( + "dev.flutter.pigeon.firebase_remote_config_platform_interface." + "FirebaseRemoteConfigHostApi.fetch%s", + dot_suffix); + g_autoptr(FlBasicMessageChannel) fetch_channel = fl_basic_message_channel_new( + messenger, fetch_channel_name, FL_MESSAGE_CODEC(codec)); + fl_basic_message_channel_set_message_handler( + fetch_channel, + firebase_remote_config_firebase_remote_config_host_api_fetch_cb, + g_object_ref(api_data), g_object_unref); + g_autofree gchar* fetch_and_activate_channel_name = g_strdup_printf( + "dev.flutter.pigeon.firebase_remote_config_platform_interface." + "FirebaseRemoteConfigHostApi.fetchAndActivate%s", + dot_suffix); + g_autoptr(FlBasicMessageChannel) fetch_and_activate_channel = + fl_basic_message_channel_new(messenger, fetch_and_activate_channel_name, + FL_MESSAGE_CODEC(codec)); + fl_basic_message_channel_set_message_handler( + fetch_and_activate_channel, + firebase_remote_config_firebase_remote_config_host_api_fetch_and_activate_cb, + g_object_ref(api_data), g_object_unref); + g_autofree gchar* activate_channel_name = g_strdup_printf( + "dev.flutter.pigeon.firebase_remote_config_platform_interface." + "FirebaseRemoteConfigHostApi.activate%s", + dot_suffix); + g_autoptr(FlBasicMessageChannel) activate_channel = + fl_basic_message_channel_new(messenger, activate_channel_name, + FL_MESSAGE_CODEC(codec)); + fl_basic_message_channel_set_message_handler( + activate_channel, + firebase_remote_config_firebase_remote_config_host_api_activate_cb, + g_object_ref(api_data), g_object_unref); + g_autofree gchar* set_config_settings_channel_name = g_strdup_printf( + "dev.flutter.pigeon.firebase_remote_config_platform_interface." + "FirebaseRemoteConfigHostApi.setConfigSettings%s", + dot_suffix); + g_autoptr(FlBasicMessageChannel) set_config_settings_channel = + fl_basic_message_channel_new(messenger, set_config_settings_channel_name, + FL_MESSAGE_CODEC(codec)); + fl_basic_message_channel_set_message_handler( + set_config_settings_channel, + firebase_remote_config_firebase_remote_config_host_api_set_config_settings_cb, + g_object_ref(api_data), g_object_unref); + g_autofree gchar* set_defaults_channel_name = g_strdup_printf( + "dev.flutter.pigeon.firebase_remote_config_platform_interface." + "FirebaseRemoteConfigHostApi.setDefaults%s", + dot_suffix); + g_autoptr(FlBasicMessageChannel) set_defaults_channel = + fl_basic_message_channel_new(messenger, set_defaults_channel_name, + FL_MESSAGE_CODEC(codec)); + fl_basic_message_channel_set_message_handler( + set_defaults_channel, + firebase_remote_config_firebase_remote_config_host_api_set_defaults_cb, + g_object_ref(api_data), g_object_unref); + g_autofree gchar* ensure_initialized_channel_name = g_strdup_printf( + "dev.flutter.pigeon.firebase_remote_config_platform_interface." + "FirebaseRemoteConfigHostApi.ensureInitialized%s", + dot_suffix); + g_autoptr(FlBasicMessageChannel) ensure_initialized_channel = + fl_basic_message_channel_new(messenger, ensure_initialized_channel_name, + FL_MESSAGE_CODEC(codec)); + fl_basic_message_channel_set_message_handler( + ensure_initialized_channel, + firebase_remote_config_firebase_remote_config_host_api_ensure_initialized_cb, + g_object_ref(api_data), g_object_unref); + g_autofree gchar* set_custom_signals_channel_name = g_strdup_printf( + "dev.flutter.pigeon.firebase_remote_config_platform_interface." + "FirebaseRemoteConfigHostApi.setCustomSignals%s", + dot_suffix); + g_autoptr(FlBasicMessageChannel) set_custom_signals_channel = + fl_basic_message_channel_new(messenger, set_custom_signals_channel_name, + FL_MESSAGE_CODEC(codec)); + fl_basic_message_channel_set_message_handler( + set_custom_signals_channel, + firebase_remote_config_firebase_remote_config_host_api_set_custom_signals_cb, + g_object_ref(api_data), g_object_unref); + g_autofree gchar* get_all_channel_name = g_strdup_printf( + "dev.flutter.pigeon.firebase_remote_config_platform_interface." + "FirebaseRemoteConfigHostApi.getAll%s", + dot_suffix); + g_autoptr(FlBasicMessageChannel) get_all_channel = + fl_basic_message_channel_new(messenger, get_all_channel_name, + FL_MESSAGE_CODEC(codec)); + fl_basic_message_channel_set_message_handler( + get_all_channel, + firebase_remote_config_firebase_remote_config_host_api_get_all_cb, + g_object_ref(api_data), g_object_unref); + g_autofree gchar* get_properties_channel_name = g_strdup_printf( + "dev.flutter.pigeon.firebase_remote_config_platform_interface." + "FirebaseRemoteConfigHostApi.getProperties%s", + dot_suffix); + g_autoptr(FlBasicMessageChannel) get_properties_channel = + fl_basic_message_channel_new(messenger, get_properties_channel_name, + FL_MESSAGE_CODEC(codec)); + fl_basic_message_channel_set_message_handler( + get_properties_channel, + firebase_remote_config_firebase_remote_config_host_api_get_properties_cb, + g_object_ref(api_data), g_object_unref); +} + +void firebase_remote_config_firebase_remote_config_host_api_clear_method_handlers( + FlBinaryMessenger* messenger, const gchar* suffix) { + g_autofree gchar* dot_suffix = + suffix != nullptr ? g_strdup_printf(".%s", suffix) : g_strdup(""); + + g_autoptr(FirebaseRemoteConfigMessageCodec) codec = + firebase_remote_config_message_codec_new(); + g_autofree gchar* fetch_channel_name = g_strdup_printf( + "dev.flutter.pigeon.firebase_remote_config_platform_interface." + "FirebaseRemoteConfigHostApi.fetch%s", + dot_suffix); + g_autoptr(FlBasicMessageChannel) fetch_channel = fl_basic_message_channel_new( + messenger, fetch_channel_name, FL_MESSAGE_CODEC(codec)); + fl_basic_message_channel_set_message_handler(fetch_channel, nullptr, nullptr, + nullptr); + g_autofree gchar* fetch_and_activate_channel_name = g_strdup_printf( + "dev.flutter.pigeon.firebase_remote_config_platform_interface." + "FirebaseRemoteConfigHostApi.fetchAndActivate%s", + dot_suffix); + g_autoptr(FlBasicMessageChannel) fetch_and_activate_channel = + fl_basic_message_channel_new(messenger, fetch_and_activate_channel_name, + FL_MESSAGE_CODEC(codec)); + fl_basic_message_channel_set_message_handler(fetch_and_activate_channel, + nullptr, nullptr, nullptr); + g_autofree gchar* activate_channel_name = g_strdup_printf( + "dev.flutter.pigeon.firebase_remote_config_platform_interface." + "FirebaseRemoteConfigHostApi.activate%s", + dot_suffix); + g_autoptr(FlBasicMessageChannel) activate_channel = + fl_basic_message_channel_new(messenger, activate_channel_name, + FL_MESSAGE_CODEC(codec)); + fl_basic_message_channel_set_message_handler(activate_channel, nullptr, + nullptr, nullptr); + g_autofree gchar* set_config_settings_channel_name = g_strdup_printf( + "dev.flutter.pigeon.firebase_remote_config_platform_interface." + "FirebaseRemoteConfigHostApi.setConfigSettings%s", + dot_suffix); + g_autoptr(FlBasicMessageChannel) set_config_settings_channel = + fl_basic_message_channel_new(messenger, set_config_settings_channel_name, + FL_MESSAGE_CODEC(codec)); + fl_basic_message_channel_set_message_handler(set_config_settings_channel, + nullptr, nullptr, nullptr); + g_autofree gchar* set_defaults_channel_name = g_strdup_printf( + "dev.flutter.pigeon.firebase_remote_config_platform_interface." + "FirebaseRemoteConfigHostApi.setDefaults%s", + dot_suffix); + g_autoptr(FlBasicMessageChannel) set_defaults_channel = + fl_basic_message_channel_new(messenger, set_defaults_channel_name, + FL_MESSAGE_CODEC(codec)); + fl_basic_message_channel_set_message_handler(set_defaults_channel, nullptr, + nullptr, nullptr); + g_autofree gchar* ensure_initialized_channel_name = g_strdup_printf( + "dev.flutter.pigeon.firebase_remote_config_platform_interface." + "FirebaseRemoteConfigHostApi.ensureInitialized%s", + dot_suffix); + g_autoptr(FlBasicMessageChannel) ensure_initialized_channel = + fl_basic_message_channel_new(messenger, ensure_initialized_channel_name, + FL_MESSAGE_CODEC(codec)); + fl_basic_message_channel_set_message_handler(ensure_initialized_channel, + nullptr, nullptr, nullptr); + g_autofree gchar* set_custom_signals_channel_name = g_strdup_printf( + "dev.flutter.pigeon.firebase_remote_config_platform_interface." + "FirebaseRemoteConfigHostApi.setCustomSignals%s", + dot_suffix); + g_autoptr(FlBasicMessageChannel) set_custom_signals_channel = + fl_basic_message_channel_new(messenger, set_custom_signals_channel_name, + FL_MESSAGE_CODEC(codec)); + fl_basic_message_channel_set_message_handler(set_custom_signals_channel, + nullptr, nullptr, nullptr); + g_autofree gchar* get_all_channel_name = g_strdup_printf( + "dev.flutter.pigeon.firebase_remote_config_platform_interface." + "FirebaseRemoteConfigHostApi.getAll%s", + dot_suffix); + g_autoptr(FlBasicMessageChannel) get_all_channel = + fl_basic_message_channel_new(messenger, get_all_channel_name, + FL_MESSAGE_CODEC(codec)); + fl_basic_message_channel_set_message_handler(get_all_channel, nullptr, + nullptr, nullptr); + g_autofree gchar* get_properties_channel_name = g_strdup_printf( + "dev.flutter.pigeon.firebase_remote_config_platform_interface." + "FirebaseRemoteConfigHostApi.getProperties%s", + dot_suffix); + g_autoptr(FlBasicMessageChannel) get_properties_channel = + fl_basic_message_channel_new(messenger, get_properties_channel_name, + FL_MESSAGE_CODEC(codec)); + fl_basic_message_channel_set_message_handler(get_properties_channel, nullptr, + nullptr, nullptr); +} + +void firebase_remote_config_firebase_remote_config_host_api_respond_fetch( + FirebaseRemoteConfigFirebaseRemoteConfigHostApiResponseHandle* + response_handle) { + g_autoptr( + FirebaseRemoteConfigFirebaseRemoteConfigHostApiFetchResponse) response = + firebase_remote_config_firebase_remote_config_host_api_fetch_response_new(); + g_autoptr(GError) error = nullptr; + if (!fl_basic_message_channel_respond(response_handle->channel, + response_handle->response_handle, + response->value, &error)) { + g_warning("Failed to send response to %s.%s: %s", + "FirebaseRemoteConfigHostApi", "fetch", error->message); + } +} + +void firebase_remote_config_firebase_remote_config_host_api_respond_error_fetch( + FirebaseRemoteConfigFirebaseRemoteConfigHostApiResponseHandle* + response_handle, + const gchar* code, const gchar* message, FlValue* details) { + g_autoptr( + FirebaseRemoteConfigFirebaseRemoteConfigHostApiFetchResponse) response = + firebase_remote_config_firebase_remote_config_host_api_fetch_response_new_error( + code, message, details); + g_autoptr(GError) error = nullptr; + if (!fl_basic_message_channel_respond(response_handle->channel, + response_handle->response_handle, + response->value, &error)) { + g_warning("Failed to send response to %s.%s: %s", + "FirebaseRemoteConfigHostApi", "fetch", error->message); + } +} + +void firebase_remote_config_firebase_remote_config_host_api_respond_fetch_and_activate( + FirebaseRemoteConfigFirebaseRemoteConfigHostApiResponseHandle* + response_handle, + gboolean return_value) { + g_autoptr( + FirebaseRemoteConfigFirebaseRemoteConfigHostApiFetchAndActivateResponse) + response = + firebase_remote_config_firebase_remote_config_host_api_fetch_and_activate_response_new( + return_value); + g_autoptr(GError) error = nullptr; + if (!fl_basic_message_channel_respond(response_handle->channel, + response_handle->response_handle, + response->value, &error)) { + g_warning("Failed to send response to %s.%s: %s", + "FirebaseRemoteConfigHostApi", "fetchAndActivate", + error->message); + } +} + +void firebase_remote_config_firebase_remote_config_host_api_respond_error_fetch_and_activate( + FirebaseRemoteConfigFirebaseRemoteConfigHostApiResponseHandle* + response_handle, + const gchar* code, const gchar* message, FlValue* details) { + g_autoptr( + FirebaseRemoteConfigFirebaseRemoteConfigHostApiFetchAndActivateResponse) + response = + firebase_remote_config_firebase_remote_config_host_api_fetch_and_activate_response_new_error( + code, message, details); + g_autoptr(GError) error = nullptr; + if (!fl_basic_message_channel_respond(response_handle->channel, + response_handle->response_handle, + response->value, &error)) { + g_warning("Failed to send response to %s.%s: %s", + "FirebaseRemoteConfigHostApi", "fetchAndActivate", + error->message); + } +} + +void firebase_remote_config_firebase_remote_config_host_api_respond_activate( + FirebaseRemoteConfigFirebaseRemoteConfigHostApiResponseHandle* + response_handle, + gboolean return_value) { + g_autoptr( + FirebaseRemoteConfigFirebaseRemoteConfigHostApiActivateResponse) response = + firebase_remote_config_firebase_remote_config_host_api_activate_response_new( + return_value); + g_autoptr(GError) error = nullptr; + if (!fl_basic_message_channel_respond(response_handle->channel, + response_handle->response_handle, + response->value, &error)) { + g_warning("Failed to send response to %s.%s: %s", + "FirebaseRemoteConfigHostApi", "activate", error->message); + } +} + +void firebase_remote_config_firebase_remote_config_host_api_respond_error_activate( + FirebaseRemoteConfigFirebaseRemoteConfigHostApiResponseHandle* + response_handle, + const gchar* code, const gchar* message, FlValue* details) { + g_autoptr( + FirebaseRemoteConfigFirebaseRemoteConfigHostApiActivateResponse) response = + firebase_remote_config_firebase_remote_config_host_api_activate_response_new_error( + code, message, details); + g_autoptr(GError) error = nullptr; + if (!fl_basic_message_channel_respond(response_handle->channel, + response_handle->response_handle, + response->value, &error)) { + g_warning("Failed to send response to %s.%s: %s", + "FirebaseRemoteConfigHostApi", "activate", error->message); + } +} + +void firebase_remote_config_firebase_remote_config_host_api_respond_set_config_settings( + FirebaseRemoteConfigFirebaseRemoteConfigHostApiResponseHandle* + response_handle) { + g_autoptr( + FirebaseRemoteConfigFirebaseRemoteConfigHostApiSetConfigSettingsResponse) + response = + firebase_remote_config_firebase_remote_config_host_api_set_config_settings_response_new(); + g_autoptr(GError) error = nullptr; + if (!fl_basic_message_channel_respond(response_handle->channel, + response_handle->response_handle, + response->value, &error)) { + g_warning("Failed to send response to %s.%s: %s", + "FirebaseRemoteConfigHostApi", "setConfigSettings", + error->message); + } +} + +void firebase_remote_config_firebase_remote_config_host_api_respond_error_set_config_settings( + FirebaseRemoteConfigFirebaseRemoteConfigHostApiResponseHandle* + response_handle, + const gchar* code, const gchar* message, FlValue* details) { + g_autoptr( + FirebaseRemoteConfigFirebaseRemoteConfigHostApiSetConfigSettingsResponse) + response = + firebase_remote_config_firebase_remote_config_host_api_set_config_settings_response_new_error( + code, message, details); + g_autoptr(GError) error = nullptr; + if (!fl_basic_message_channel_respond(response_handle->channel, + response_handle->response_handle, + response->value, &error)) { + g_warning("Failed to send response to %s.%s: %s", + "FirebaseRemoteConfigHostApi", "setConfigSettings", + error->message); + } +} + +void firebase_remote_config_firebase_remote_config_host_api_respond_set_defaults( + FirebaseRemoteConfigFirebaseRemoteConfigHostApiResponseHandle* + response_handle) { + g_autoptr( + FirebaseRemoteConfigFirebaseRemoteConfigHostApiSetDefaultsResponse) response = + firebase_remote_config_firebase_remote_config_host_api_set_defaults_response_new(); + g_autoptr(GError) error = nullptr; + if (!fl_basic_message_channel_respond(response_handle->channel, + response_handle->response_handle, + response->value, &error)) { + g_warning("Failed to send response to %s.%s: %s", + "FirebaseRemoteConfigHostApi", "setDefaults", error->message); + } +} + +void firebase_remote_config_firebase_remote_config_host_api_respond_error_set_defaults( + FirebaseRemoteConfigFirebaseRemoteConfigHostApiResponseHandle* + response_handle, + const gchar* code, const gchar* message, FlValue* details) { + g_autoptr( + FirebaseRemoteConfigFirebaseRemoteConfigHostApiSetDefaultsResponse) response = + firebase_remote_config_firebase_remote_config_host_api_set_defaults_response_new_error( + code, message, details); + g_autoptr(GError) error = nullptr; + if (!fl_basic_message_channel_respond(response_handle->channel, + response_handle->response_handle, + response->value, &error)) { + g_warning("Failed to send response to %s.%s: %s", + "FirebaseRemoteConfigHostApi", "setDefaults", error->message); + } +} + +void firebase_remote_config_firebase_remote_config_host_api_respond_ensure_initialized( + FirebaseRemoteConfigFirebaseRemoteConfigHostApiResponseHandle* + response_handle) { + g_autoptr( + FirebaseRemoteConfigFirebaseRemoteConfigHostApiEnsureInitializedResponse) + response = + firebase_remote_config_firebase_remote_config_host_api_ensure_initialized_response_new(); + g_autoptr(GError) error = nullptr; + if (!fl_basic_message_channel_respond(response_handle->channel, + response_handle->response_handle, + response->value, &error)) { + g_warning("Failed to send response to %s.%s: %s", + "FirebaseRemoteConfigHostApi", "ensureInitialized", + error->message); + } +} + +void firebase_remote_config_firebase_remote_config_host_api_respond_error_ensure_initialized( + FirebaseRemoteConfigFirebaseRemoteConfigHostApiResponseHandle* + response_handle, + const gchar* code, const gchar* message, FlValue* details) { + g_autoptr( + FirebaseRemoteConfigFirebaseRemoteConfigHostApiEnsureInitializedResponse) + response = + firebase_remote_config_firebase_remote_config_host_api_ensure_initialized_response_new_error( + code, message, details); + g_autoptr(GError) error = nullptr; + if (!fl_basic_message_channel_respond(response_handle->channel, + response_handle->response_handle, + response->value, &error)) { + g_warning("Failed to send response to %s.%s: %s", + "FirebaseRemoteConfigHostApi", "ensureInitialized", + error->message); + } +} + +void firebase_remote_config_firebase_remote_config_host_api_respond_set_custom_signals( + FirebaseRemoteConfigFirebaseRemoteConfigHostApiResponseHandle* + response_handle) { + g_autoptr( + FirebaseRemoteConfigFirebaseRemoteConfigHostApiSetCustomSignalsResponse) response = + firebase_remote_config_firebase_remote_config_host_api_set_custom_signals_response_new(); + g_autoptr(GError) error = nullptr; + if (!fl_basic_message_channel_respond(response_handle->channel, + response_handle->response_handle, + response->value, &error)) { + g_warning("Failed to send response to %s.%s: %s", + "FirebaseRemoteConfigHostApi", "setCustomSignals", + error->message); + } +} + +void firebase_remote_config_firebase_remote_config_host_api_respond_error_set_custom_signals( + FirebaseRemoteConfigFirebaseRemoteConfigHostApiResponseHandle* + response_handle, + const gchar* code, const gchar* message, FlValue* details) { + g_autoptr( + FirebaseRemoteConfigFirebaseRemoteConfigHostApiSetCustomSignalsResponse) + response = + firebase_remote_config_firebase_remote_config_host_api_set_custom_signals_response_new_error( + code, message, details); + g_autoptr(GError) error = nullptr; + if (!fl_basic_message_channel_respond(response_handle->channel, + response_handle->response_handle, + response->value, &error)) { + g_warning("Failed to send response to %s.%s: %s", + "FirebaseRemoteConfigHostApi", "setCustomSignals", + error->message); + } +} + +void firebase_remote_config_firebase_remote_config_host_api_respond_get_all( + FirebaseRemoteConfigFirebaseRemoteConfigHostApiResponseHandle* + response_handle, + FlValue* return_value) { + g_autoptr( + FirebaseRemoteConfigFirebaseRemoteConfigHostApiGetAllResponse) response = + firebase_remote_config_firebase_remote_config_host_api_get_all_response_new( + return_value); + g_autoptr(GError) error = nullptr; + if (!fl_basic_message_channel_respond(response_handle->channel, + response_handle->response_handle, + response->value, &error)) { + g_warning("Failed to send response to %s.%s: %s", + "FirebaseRemoteConfigHostApi", "getAll", error->message); + } +} + +void firebase_remote_config_firebase_remote_config_host_api_respond_error_get_all( + FirebaseRemoteConfigFirebaseRemoteConfigHostApiResponseHandle* + response_handle, + const gchar* code, const gchar* message, FlValue* details) { + g_autoptr( + FirebaseRemoteConfigFirebaseRemoteConfigHostApiGetAllResponse) response = + firebase_remote_config_firebase_remote_config_host_api_get_all_response_new_error( + code, message, details); + g_autoptr(GError) error = nullptr; + if (!fl_basic_message_channel_respond(response_handle->channel, + response_handle->response_handle, + response->value, &error)) { + g_warning("Failed to send response to %s.%s: %s", + "FirebaseRemoteConfigHostApi", "getAll", error->message); + } +} + +void firebase_remote_config_firebase_remote_config_host_api_respond_get_properties( + FirebaseRemoteConfigFirebaseRemoteConfigHostApiResponseHandle* + response_handle, + FlValue* return_value) { + g_autoptr( + FirebaseRemoteConfigFirebaseRemoteConfigHostApiGetPropertiesResponse) + response = + firebase_remote_config_firebase_remote_config_host_api_get_properties_response_new( + return_value); + g_autoptr(GError) error = nullptr; + if (!fl_basic_message_channel_respond(response_handle->channel, + response_handle->response_handle, + response->value, &error)) { + g_warning("Failed to send response to %s.%s: %s", + "FirebaseRemoteConfigHostApi", "getProperties", error->message); + } +} + +void firebase_remote_config_firebase_remote_config_host_api_respond_error_get_properties( + FirebaseRemoteConfigFirebaseRemoteConfigHostApiResponseHandle* + response_handle, + const gchar* code, const gchar* message, FlValue* details) { + g_autoptr( + FirebaseRemoteConfigFirebaseRemoteConfigHostApiGetPropertiesResponse) + response = + firebase_remote_config_firebase_remote_config_host_api_get_properties_response_new_error( + code, message, details); + g_autoptr(GError) error = nullptr; + if (!fl_basic_message_channel_respond(response_handle->channel, + response_handle->response_handle, + response->value, &error)) { + g_warning("Failed to send response to %s.%s: %s", + "FirebaseRemoteConfigHostApi", "getProperties", error->message); + } +} diff --git a/packages/firebase_remote_config/firebase_remote_config/linux/messages.g.h b/packages/firebase_remote_config/firebase_remote_config/linux/messages.g.h new file mode 100644 index 000000000000..db45d603d6ef --- /dev/null +++ b/packages/firebase_remote_config/firebase_remote_config/linux/messages.g.h @@ -0,0 +1,437 @@ +// Copyright 2026, the Chromium project authors. Please see the AUTHORS file +// for details. All rights reserved. Use of this source code is governed by a +// BSD-style license that can be found in the LICENSE file. +// Autogenerated from Pigeon (v26.3.4), do not edit directly. +// See also: https://pub.dev/packages/pigeon + +#ifndef PIGEON_MESSAGES_G_H_ +#define PIGEON_MESSAGES_G_H_ + +#include + +G_BEGIN_DECLS + +/** + * FirebaseRemoteConfigRemoteConfigPigeonSettings: + * + */ + +G_DECLARE_FINAL_TYPE(FirebaseRemoteConfigRemoteConfigPigeonSettings, + firebase_remote_config_remote_config_pigeon_settings, + FIREBASE_REMOTE_CONFIG, REMOTE_CONFIG_PIGEON_SETTINGS, + GObject) + +/** + * firebase_remote_config_remote_config_pigeon_settings_new: + * fetch_timeout_seconds: field in this object. + * minimum_fetch_interval_seconds: field in this object. + * + * Creates a new #RemoteConfigPigeonSettings object. + * + * Returns: a new #FirebaseRemoteConfigRemoteConfigPigeonSettings + */ +FirebaseRemoteConfigRemoteConfigPigeonSettings* +firebase_remote_config_remote_config_pigeon_settings_new( + int64_t fetch_timeout_seconds, int64_t minimum_fetch_interval_seconds); + +/** + * firebase_remote_config_remote_config_pigeon_settings_get_fetch_timeout_seconds + * @object: a #FirebaseRemoteConfigRemoteConfigPigeonSettings. + * + * Gets the value of the fetchTimeoutSeconds field of @object. + * + * Returns: the field value. + */ +int64_t +firebase_remote_config_remote_config_pigeon_settings_get_fetch_timeout_seconds( + FirebaseRemoteConfigRemoteConfigPigeonSettings* object); + +/** + * firebase_remote_config_remote_config_pigeon_settings_get_minimum_fetch_interval_seconds + * @object: a #FirebaseRemoteConfigRemoteConfigPigeonSettings. + * + * Gets the value of the minimumFetchIntervalSeconds field of @object. + * + * Returns: the field value. + */ +int64_t +firebase_remote_config_remote_config_pigeon_settings_get_minimum_fetch_interval_seconds( + FirebaseRemoteConfigRemoteConfigPigeonSettings* object); + +/** + * firebase_remote_config_remote_config_pigeon_settings_equals: + * @a: a #FirebaseRemoteConfigRemoteConfigPigeonSettings. + * @b: another #FirebaseRemoteConfigRemoteConfigPigeonSettings. + * + * Checks if two #FirebaseRemoteConfigRemoteConfigPigeonSettings objects are + * equal. + * + * Returns: TRUE if @a and @b are equal. + */ +gboolean firebase_remote_config_remote_config_pigeon_settings_equals( + FirebaseRemoteConfigRemoteConfigPigeonSettings* a, + FirebaseRemoteConfigRemoteConfigPigeonSettings* b); + +/** + * firebase_remote_config_remote_config_pigeon_settings_hash: + * @object: a #FirebaseRemoteConfigRemoteConfigPigeonSettings. + * + * Calculates a hash code for a #FirebaseRemoteConfigRemoteConfigPigeonSettings + * object. + * + * Returns: the hash code. + */ +guint firebase_remote_config_remote_config_pigeon_settings_hash( + FirebaseRemoteConfigRemoteConfigPigeonSettings* object); + +G_DECLARE_FINAL_TYPE(FirebaseRemoteConfigMessageCodec, + firebase_remote_config_message_codec, + FIREBASE_REMOTE_CONFIG, MESSAGE_CODEC, + FlStandardMessageCodec) + +/** + * Custom type ID constants: + * + * Constants used to identify custom types in the codec. + * They are used in the codec to encode and decode custom types. + * They may be used in custom object creation functions to identify the type. + */ +extern const int firebase_remote_config_remote_config_pigeon_settings_type_id; + +G_DECLARE_FINAL_TYPE(FirebaseRemoteConfigFirebaseRemoteConfigHostApi, + firebase_remote_config_firebase_remote_config_host_api, + FIREBASE_REMOTE_CONFIG, FIREBASE_REMOTE_CONFIG_HOST_API, + GObject) + +G_DECLARE_FINAL_TYPE( + FirebaseRemoteConfigFirebaseRemoteConfigHostApiResponseHandle, + firebase_remote_config_firebase_remote_config_host_api_response_handle, + FIREBASE_REMOTE_CONFIG, FIREBASE_REMOTE_CONFIG_HOST_API_RESPONSE_HANDLE, + GObject) + +/** + * FirebaseRemoteConfigFirebaseRemoteConfigHostApiVTable: + * + * Table of functions exposed by FirebaseRemoteConfigHostApi to be implemented + * by the API provider. + */ +typedef struct { + void (*fetch)(const gchar* app_name, + FirebaseRemoteConfigFirebaseRemoteConfigHostApiResponseHandle* + response_handle, + gpointer user_data); + void (*fetch_and_activate)( + const gchar* app_name, + FirebaseRemoteConfigFirebaseRemoteConfigHostApiResponseHandle* + response_handle, + gpointer user_data); + void (*activate)( + const gchar* app_name, + FirebaseRemoteConfigFirebaseRemoteConfigHostApiResponseHandle* + response_handle, + gpointer user_data); + void (*set_config_settings)( + const gchar* app_name, + FirebaseRemoteConfigRemoteConfigPigeonSettings* settings, + FirebaseRemoteConfigFirebaseRemoteConfigHostApiResponseHandle* + response_handle, + gpointer user_data); + void (*set_defaults)( + const gchar* app_name, FlValue* default_parameters, + FirebaseRemoteConfigFirebaseRemoteConfigHostApiResponseHandle* + response_handle, + gpointer user_data); + void (*ensure_initialized)( + const gchar* app_name, + FirebaseRemoteConfigFirebaseRemoteConfigHostApiResponseHandle* + response_handle, + gpointer user_data); + void (*set_custom_signals)( + const gchar* app_name, FlValue* custom_signals, + FirebaseRemoteConfigFirebaseRemoteConfigHostApiResponseHandle* + response_handle, + gpointer user_data); + void (*get_all)(const gchar* app_name, + FirebaseRemoteConfigFirebaseRemoteConfigHostApiResponseHandle* + response_handle, + gpointer user_data); + void (*get_properties)( + const gchar* app_name, + FirebaseRemoteConfigFirebaseRemoteConfigHostApiResponseHandle* + response_handle, + gpointer user_data); +} FirebaseRemoteConfigFirebaseRemoteConfigHostApiVTable; + +/** + * firebase_remote_config_firebase_remote_config_host_api_set_method_handlers: + * + * @messenger: an #FlBinaryMessenger. + * @suffix: (allow-none): a suffix to add to the API or %NULL for none. + * @vtable: implementations of the methods in this API. + * @user_data: (closure): user data to pass to the functions in @vtable. + * @user_data_free_func: (allow-none): a function which gets called to free + * @user_data, or %NULL. + * + * Connects the method handlers in the FirebaseRemoteConfigHostApi API. + */ +void firebase_remote_config_firebase_remote_config_host_api_set_method_handlers( + FlBinaryMessenger* messenger, const gchar* suffix, + const FirebaseRemoteConfigFirebaseRemoteConfigHostApiVTable* vtable, + gpointer user_data, GDestroyNotify user_data_free_func); + +/** + * firebase_remote_config_firebase_remote_config_host_api_clear_method_handlers: + * + * @messenger: an #FlBinaryMessenger. + * @suffix: (allow-none): a suffix to add to the API or %NULL for none. + * + * Clears the method handlers in the FirebaseRemoteConfigHostApi API. + */ +void firebase_remote_config_firebase_remote_config_host_api_clear_method_handlers( + FlBinaryMessenger* messenger, const gchar* suffix); + +/** + * firebase_remote_config_firebase_remote_config_host_api_respond_fetch: + * @response_handle: a + * #FirebaseRemoteConfigFirebaseRemoteConfigHostApiResponseHandle. + * + * Responds to FirebaseRemoteConfigHostApi.fetch. + */ +void firebase_remote_config_firebase_remote_config_host_api_respond_fetch( + FirebaseRemoteConfigFirebaseRemoteConfigHostApiResponseHandle* + response_handle); + +/** + * firebase_remote_config_firebase_remote_config_host_api_respond_error_fetch: + * @response_handle: a + * #FirebaseRemoteConfigFirebaseRemoteConfigHostApiResponseHandle. + * @code: error code. + * @message: error message. + * @details: (allow-none): error details or %NULL. + * + * Responds with an error to FirebaseRemoteConfigHostApi.fetch. + */ +void firebase_remote_config_firebase_remote_config_host_api_respond_error_fetch( + FirebaseRemoteConfigFirebaseRemoteConfigHostApiResponseHandle* + response_handle, + const gchar* code, const gchar* message, FlValue* details); + +/** + * firebase_remote_config_firebase_remote_config_host_api_respond_fetch_and_activate: + * @response_handle: a + * #FirebaseRemoteConfigFirebaseRemoteConfigHostApiResponseHandle. + * @return_value: location to write the value returned by this method. + * + * Responds to FirebaseRemoteConfigHostApi.fetchAndActivate. + */ +void firebase_remote_config_firebase_remote_config_host_api_respond_fetch_and_activate( + FirebaseRemoteConfigFirebaseRemoteConfigHostApiResponseHandle* + response_handle, + gboolean return_value); + +/** + * firebase_remote_config_firebase_remote_config_host_api_respond_error_fetch_and_activate: + * @response_handle: a + * #FirebaseRemoteConfigFirebaseRemoteConfigHostApiResponseHandle. + * @code: error code. + * @message: error message. + * @details: (allow-none): error details or %NULL. + * + * Responds with an error to FirebaseRemoteConfigHostApi.fetchAndActivate. + */ +void firebase_remote_config_firebase_remote_config_host_api_respond_error_fetch_and_activate( + FirebaseRemoteConfigFirebaseRemoteConfigHostApiResponseHandle* + response_handle, + const gchar* code, const gchar* message, FlValue* details); + +/** + * firebase_remote_config_firebase_remote_config_host_api_respond_activate: + * @response_handle: a + * #FirebaseRemoteConfigFirebaseRemoteConfigHostApiResponseHandle. + * @return_value: location to write the value returned by this method. + * + * Responds to FirebaseRemoteConfigHostApi.activate. + */ +void firebase_remote_config_firebase_remote_config_host_api_respond_activate( + FirebaseRemoteConfigFirebaseRemoteConfigHostApiResponseHandle* + response_handle, + gboolean return_value); + +/** + * firebase_remote_config_firebase_remote_config_host_api_respond_error_activate: + * @response_handle: a + * #FirebaseRemoteConfigFirebaseRemoteConfigHostApiResponseHandle. + * @code: error code. + * @message: error message. + * @details: (allow-none): error details or %NULL. + * + * Responds with an error to FirebaseRemoteConfigHostApi.activate. + */ +void firebase_remote_config_firebase_remote_config_host_api_respond_error_activate( + FirebaseRemoteConfigFirebaseRemoteConfigHostApiResponseHandle* + response_handle, + const gchar* code, const gchar* message, FlValue* details); + +/** + * firebase_remote_config_firebase_remote_config_host_api_respond_set_config_settings: + * @response_handle: a + * #FirebaseRemoteConfigFirebaseRemoteConfigHostApiResponseHandle. + * + * Responds to FirebaseRemoteConfigHostApi.setConfigSettings. + */ +void firebase_remote_config_firebase_remote_config_host_api_respond_set_config_settings( + FirebaseRemoteConfigFirebaseRemoteConfigHostApiResponseHandle* + response_handle); + +/** + * firebase_remote_config_firebase_remote_config_host_api_respond_error_set_config_settings: + * @response_handle: a + * #FirebaseRemoteConfigFirebaseRemoteConfigHostApiResponseHandle. + * @code: error code. + * @message: error message. + * @details: (allow-none): error details or %NULL. + * + * Responds with an error to FirebaseRemoteConfigHostApi.setConfigSettings. + */ +void firebase_remote_config_firebase_remote_config_host_api_respond_error_set_config_settings( + FirebaseRemoteConfigFirebaseRemoteConfigHostApiResponseHandle* + response_handle, + const gchar* code, const gchar* message, FlValue* details); + +/** + * firebase_remote_config_firebase_remote_config_host_api_respond_set_defaults: + * @response_handle: a + * #FirebaseRemoteConfigFirebaseRemoteConfigHostApiResponseHandle. + * + * Responds to FirebaseRemoteConfigHostApi.setDefaults. + */ +void firebase_remote_config_firebase_remote_config_host_api_respond_set_defaults( + FirebaseRemoteConfigFirebaseRemoteConfigHostApiResponseHandle* + response_handle); + +/** + * firebase_remote_config_firebase_remote_config_host_api_respond_error_set_defaults: + * @response_handle: a + * #FirebaseRemoteConfigFirebaseRemoteConfigHostApiResponseHandle. + * @code: error code. + * @message: error message. + * @details: (allow-none): error details or %NULL. + * + * Responds with an error to FirebaseRemoteConfigHostApi.setDefaults. + */ +void firebase_remote_config_firebase_remote_config_host_api_respond_error_set_defaults( + FirebaseRemoteConfigFirebaseRemoteConfigHostApiResponseHandle* + response_handle, + const gchar* code, const gchar* message, FlValue* details); + +/** + * firebase_remote_config_firebase_remote_config_host_api_respond_ensure_initialized: + * @response_handle: a + * #FirebaseRemoteConfigFirebaseRemoteConfigHostApiResponseHandle. + * + * Responds to FirebaseRemoteConfigHostApi.ensureInitialized. + */ +void firebase_remote_config_firebase_remote_config_host_api_respond_ensure_initialized( + FirebaseRemoteConfigFirebaseRemoteConfigHostApiResponseHandle* + response_handle); + +/** + * firebase_remote_config_firebase_remote_config_host_api_respond_error_ensure_initialized: + * @response_handle: a + * #FirebaseRemoteConfigFirebaseRemoteConfigHostApiResponseHandle. + * @code: error code. + * @message: error message. + * @details: (allow-none): error details or %NULL. + * + * Responds with an error to FirebaseRemoteConfigHostApi.ensureInitialized. + */ +void firebase_remote_config_firebase_remote_config_host_api_respond_error_ensure_initialized( + FirebaseRemoteConfigFirebaseRemoteConfigHostApiResponseHandle* + response_handle, + const gchar* code, const gchar* message, FlValue* details); + +/** + * firebase_remote_config_firebase_remote_config_host_api_respond_set_custom_signals: + * @response_handle: a + * #FirebaseRemoteConfigFirebaseRemoteConfigHostApiResponseHandle. + * + * Responds to FirebaseRemoteConfigHostApi.setCustomSignals. + */ +void firebase_remote_config_firebase_remote_config_host_api_respond_set_custom_signals( + FirebaseRemoteConfigFirebaseRemoteConfigHostApiResponseHandle* + response_handle); + +/** + * firebase_remote_config_firebase_remote_config_host_api_respond_error_set_custom_signals: + * @response_handle: a + * #FirebaseRemoteConfigFirebaseRemoteConfigHostApiResponseHandle. + * @code: error code. + * @message: error message. + * @details: (allow-none): error details or %NULL. + * + * Responds with an error to FirebaseRemoteConfigHostApi.setCustomSignals. + */ +void firebase_remote_config_firebase_remote_config_host_api_respond_error_set_custom_signals( + FirebaseRemoteConfigFirebaseRemoteConfigHostApiResponseHandle* + response_handle, + const gchar* code, const gchar* message, FlValue* details); + +/** + * firebase_remote_config_firebase_remote_config_host_api_respond_get_all: + * @response_handle: a + * #FirebaseRemoteConfigFirebaseRemoteConfigHostApiResponseHandle. + * @return_value: location to write the value returned by this method. + * + * Responds to FirebaseRemoteConfigHostApi.getAll. + */ +void firebase_remote_config_firebase_remote_config_host_api_respond_get_all( + FirebaseRemoteConfigFirebaseRemoteConfigHostApiResponseHandle* + response_handle, + FlValue* return_value); + +/** + * firebase_remote_config_firebase_remote_config_host_api_respond_error_get_all: + * @response_handle: a + * #FirebaseRemoteConfigFirebaseRemoteConfigHostApiResponseHandle. + * @code: error code. + * @message: error message. + * @details: (allow-none): error details or %NULL. + * + * Responds with an error to FirebaseRemoteConfigHostApi.getAll. + */ +void firebase_remote_config_firebase_remote_config_host_api_respond_error_get_all( + FirebaseRemoteConfigFirebaseRemoteConfigHostApiResponseHandle* + response_handle, + const gchar* code, const gchar* message, FlValue* details); + +/** + * firebase_remote_config_firebase_remote_config_host_api_respond_get_properties: + * @response_handle: a + * #FirebaseRemoteConfigFirebaseRemoteConfigHostApiResponseHandle. + * @return_value: location to write the value returned by this method. + * + * Responds to FirebaseRemoteConfigHostApi.getProperties. + */ +void firebase_remote_config_firebase_remote_config_host_api_respond_get_properties( + FirebaseRemoteConfigFirebaseRemoteConfigHostApiResponseHandle* + response_handle, + FlValue* return_value); + +/** + * firebase_remote_config_firebase_remote_config_host_api_respond_error_get_properties: + * @response_handle: a + * #FirebaseRemoteConfigFirebaseRemoteConfigHostApiResponseHandle. + * @code: error code. + * @message: error message. + * @details: (allow-none): error details or %NULL. + * + * Responds with an error to FirebaseRemoteConfigHostApi.getProperties. + */ +void firebase_remote_config_firebase_remote_config_host_api_respond_error_get_properties( + FirebaseRemoteConfigFirebaseRemoteConfigHostApiResponseHandle* + response_handle, + const gchar* code, const gchar* message, FlValue* details); + +G_END_DECLS + +#endif // PIGEON_MESSAGES_G_H_ diff --git a/packages/firebase_remote_config/firebase_remote_config/linux/plugin_version.h.in b/packages/firebase_remote_config/firebase_remote_config/linux/plugin_version.h.in new file mode 100644 index 000000000000..6bdf1e6a9ba3 --- /dev/null +++ b/packages/firebase_remote_config/firebase_remote_config/linux/plugin_version.h.in @@ -0,0 +1,13 @@ +// Copyright 2026, the Chromium project authors. Please see the AUTHORS file +// for details. All rights reserved. Use of this source code is governed by a +// BSD-style license that can be found in the LICENSE file. + +#ifndef PLUGIN_VERSION_CONFIG_H +#define PLUGIN_VERSION_CONFIG_H + +namespace firebase_remote_config_linux { + +std::string getPluginVersion() { return "@PLUGIN_VERSION@"; } +} // namespace firebase_remote_config_linux + +#endif // PLUGIN_VERSION_CONFIG_H diff --git a/packages/firebase_remote_config/firebase_remote_config/pubspec.yaml b/packages/firebase_remote_config/firebase_remote_config/pubspec.yaml index f5e13965e8bb..d6ad9580c88d 100644 --- a/packages/firebase_remote_config/firebase_remote_config/pubspec.yaml +++ b/packages/firebase_remote_config/firebase_remote_config/pubspec.yaml @@ -41,6 +41,8 @@ flutter: pluginClass: FirebaseRemoteConfigPlugin ios: pluginClass: FirebaseRemoteConfigPlugin + linux: + pluginClass: FirebaseRemoteConfigPlugin macos: pluginClass: FirebaseRemoteConfigPlugin web: diff --git a/packages/firebase_remote_config/firebase_remote_config_platform_interface/pigeons/messages.dart b/packages/firebase_remote_config/firebase_remote_config_platform_interface/pigeons/messages.dart index c89ebcbdd2ed..54c8267cc8a2 100644 --- a/packages/firebase_remote_config/firebase_remote_config_platform_interface/pigeons/messages.dart +++ b/packages/firebase_remote_config/firebase_remote_config_platform_interface/pigeons/messages.dart @@ -18,6 +18,12 @@ import 'package:pigeon/pigeon.dart'; cppHeaderOut: '../firebase_remote_config/windows/messages.g.h', cppSourceOut: '../firebase_remote_config/windows/messages.g.cpp', cppOptions: CppOptions(namespace: 'firebase_remote_config_windows'), + gobjectHeaderOut: '../firebase_remote_config/linux/messages.g.h', + gobjectSourceOut: '../firebase_remote_config/linux/messages.g.cc', + gobjectOptions: GObjectOptions( + headerIncludePath: 'messages.g.h', + module: 'FirebaseRemoteConfig', + ), copyrightHeader: 'pigeons/copyright.txt', ), ) diff --git a/packages/firebase_storage/firebase_storage/example/.metadata b/packages/firebase_storage/firebase_storage/example/.metadata index 784ce1298249..2feffa0e65e4 100644 --- a/packages/firebase_storage/firebase_storage/example/.metadata +++ b/packages/firebase_storage/firebase_storage/example/.metadata @@ -18,6 +18,9 @@ migration: - platform: web create_revision: a14f74ff3a1cbd521163c5f03d68113d50af93d3 base_revision: a14f74ff3a1cbd521163c5f03d68113d50af93d3 + - platform: linux + create_revision: ad70ec4617166f1c38e5d2bfd388af71fda14f06 + base_revision: ad70ec4617166f1c38e5d2bfd388af71fda14f06 # User provided section diff --git a/packages/firebase_storage/firebase_storage/example/lib/firebase_options.dart b/packages/firebase_storage/firebase_storage/example/lib/firebase_options.dart index f6389a9c6c5a..36b18a2fca19 100644 --- a/packages/firebase_storage/firebase_storage/example/lib/firebase_options.dart +++ b/packages/firebase_storage/firebase_storage/example/lib/firebase_options.dart @@ -33,6 +33,9 @@ class DefaultFirebaseOptions { return macos; case TargetPlatform.windows: return android; + // TODO: Remove when FlutterFire CLI supports Linux + case TargetPlatform.linux: + return android; default: throw UnsupportedError( 'DefaultFirebaseOptions are not supported for this platform.', diff --git a/packages/firebase_storage/firebase_storage/example/linux/.gitignore b/packages/firebase_storage/firebase_storage/example/linux/.gitignore new file mode 100644 index 000000000000..d3896c98444f --- /dev/null +++ b/packages/firebase_storage/firebase_storage/example/linux/.gitignore @@ -0,0 +1 @@ +flutter/ephemeral diff --git a/packages/firebase_storage/firebase_storage/example/linux/CMakeLists.txt b/packages/firebase_storage/firebase_storage/example/linux/CMakeLists.txt new file mode 100644 index 000000000000..a77d912ae05a --- /dev/null +++ b/packages/firebase_storage/firebase_storage/example/linux/CMakeLists.txt @@ -0,0 +1,128 @@ +# Project-level configuration. +cmake_minimum_required(VERSION 3.13) +project(runner LANGUAGES CXX) + +# The name of the executable created for the application. Change this to change +# the on-disk name of your application. +set(BINARY_NAME "firebase_storage_example") +# The unique GTK application identifier for this application. See: +# https://wiki.gnome.org/HowDoI/ChooseApplicationID +set(APPLICATION_ID "io.flutter.plugins.firebase_storage_example") + +# Explicitly opt in to modern CMake behaviors to avoid warnings with recent +# versions of CMake. +cmake_policy(SET CMP0063 NEW) + +# Load bundled libraries from the lib/ directory relative to the binary. +set(CMAKE_INSTALL_RPATH "$ORIGIN/lib") + +# Root filesystem for cross-building. +if(FLUTTER_TARGET_PLATFORM_SYSROOT) + set(CMAKE_SYSROOT ${FLUTTER_TARGET_PLATFORM_SYSROOT}) + set(CMAKE_FIND_ROOT_PATH ${CMAKE_SYSROOT}) + set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER) + set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY) + set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY) + set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY) +endif() + +# Define build configuration options. +if(NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES) + set(CMAKE_BUILD_TYPE "Debug" CACHE + STRING "Flutter build mode" FORCE) + set_property(CACHE CMAKE_BUILD_TYPE PROPERTY STRINGS + "Debug" "Profile" "Release") +endif() + +# Compilation settings that should be applied to most targets. +# +# Be cautious about adding new options here, as plugins use this function by +# default. In most cases, you should add new options to specific targets instead +# of modifying this function. +function(APPLY_STANDARD_SETTINGS TARGET) + target_compile_features(${TARGET} PUBLIC cxx_std_14) + target_compile_options(${TARGET} PRIVATE -Wall -Werror) + target_compile_options(${TARGET} PRIVATE "$<$>:-O3>") + target_compile_definitions(${TARGET} PRIVATE "$<$>:NDEBUG>") +endfunction() + +# Flutter library and tool build rules. +set(FLUTTER_MANAGED_DIR "${CMAKE_CURRENT_SOURCE_DIR}/flutter") +add_subdirectory(${FLUTTER_MANAGED_DIR}) + +# System-level dependencies. +find_package(PkgConfig REQUIRED) +pkg_check_modules(GTK REQUIRED IMPORTED_TARGET gtk+-3.0) + +# Application build; see runner/CMakeLists.txt. +add_subdirectory("runner") + +# Run the Flutter tool portions of the build. This must not be removed. +add_dependencies(${BINARY_NAME} flutter_assemble) + +# Only the install-generated bundle's copy of the executable will launch +# correctly, since the resources must in the right relative locations. To avoid +# people trying to run the unbundled copy, put it in a subdirectory instead of +# the default top-level location. +set_target_properties(${BINARY_NAME} + PROPERTIES + RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/intermediates_do_not_run" +) + + +# Generated plugin build rules, which manage building the plugins and adding +# them to the application. +include(flutter/generated_plugins.cmake) + + +# === Installation === +# By default, "installing" just makes a relocatable bundle in the build +# directory. +set(BUILD_BUNDLE_DIR "${PROJECT_BINARY_DIR}/bundle") +if(CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT) + set(CMAKE_INSTALL_PREFIX "${BUILD_BUNDLE_DIR}" CACHE PATH "..." FORCE) +endif() + +# Start with a clean build bundle directory every time. +install(CODE " + file(REMOVE_RECURSE \"${BUILD_BUNDLE_DIR}/\") + " COMPONENT Runtime) + +set(INSTALL_BUNDLE_DATA_DIR "${CMAKE_INSTALL_PREFIX}/data") +set(INSTALL_BUNDLE_LIB_DIR "${CMAKE_INSTALL_PREFIX}/lib") + +install(TARGETS ${BINARY_NAME} RUNTIME DESTINATION "${CMAKE_INSTALL_PREFIX}" + COMPONENT Runtime) + +install(FILES "${FLUTTER_ICU_DATA_FILE}" DESTINATION "${INSTALL_BUNDLE_DATA_DIR}" + COMPONENT Runtime) + +install(FILES "${FLUTTER_LIBRARY}" DESTINATION "${INSTALL_BUNDLE_LIB_DIR}" + COMPONENT Runtime) + +foreach(bundled_library ${PLUGIN_BUNDLED_LIBRARIES}) + install(FILES "${bundled_library}" + DESTINATION "${INSTALL_BUNDLE_LIB_DIR}" + COMPONENT Runtime) +endforeach(bundled_library) + +# Copy the native assets provided by the build.dart from all packages. +set(NATIVE_ASSETS_DIR "${PROJECT_BUILD_DIR}native_assets/linux/") +install(DIRECTORY "${NATIVE_ASSETS_DIR}" + DESTINATION "${INSTALL_BUNDLE_LIB_DIR}" + COMPONENT Runtime) + +# Fully re-copy the assets directory on each build to avoid having stale files +# from a previous install. +set(FLUTTER_ASSET_DIR_NAME "flutter_assets") +install(CODE " + file(REMOVE_RECURSE \"${INSTALL_BUNDLE_DATA_DIR}/${FLUTTER_ASSET_DIR_NAME}\") + " COMPONENT Runtime) +install(DIRECTORY "${PROJECT_BUILD_DIR}/${FLUTTER_ASSET_DIR_NAME}" + DESTINATION "${INSTALL_BUNDLE_DATA_DIR}" COMPONENT Runtime) + +# Install the AOT library on non-Debug builds only. +if(NOT CMAKE_BUILD_TYPE MATCHES "Debug") + install(FILES "${AOT_LIBRARY}" DESTINATION "${INSTALL_BUNDLE_LIB_DIR}" + COMPONENT Runtime) +endif() diff --git a/packages/firebase_storage/firebase_storage/example/linux/flutter/CMakeLists.txt b/packages/firebase_storage/firebase_storage/example/linux/flutter/CMakeLists.txt new file mode 100644 index 000000000000..d5bd01648a96 --- /dev/null +++ b/packages/firebase_storage/firebase_storage/example/linux/flutter/CMakeLists.txt @@ -0,0 +1,88 @@ +# This file controls Flutter-level build steps. It should not be edited. +cmake_minimum_required(VERSION 3.10) + +set(EPHEMERAL_DIR "${CMAKE_CURRENT_SOURCE_DIR}/ephemeral") + +# Configuration provided via flutter tool. +include(${EPHEMERAL_DIR}/generated_config.cmake) + +# TODO: Move the rest of this into files in ephemeral. See +# https://github.com/flutter/flutter/issues/57146. + +# Serves the same purpose as list(TRANSFORM ... PREPEND ...), +# which isn't available in 3.10. +function(list_prepend LIST_NAME PREFIX) + set(NEW_LIST "") + foreach(element ${${LIST_NAME}}) + list(APPEND NEW_LIST "${PREFIX}${element}") + endforeach(element) + set(${LIST_NAME} "${NEW_LIST}" PARENT_SCOPE) +endfunction() + +# === Flutter Library === +# System-level dependencies. +find_package(PkgConfig REQUIRED) +pkg_check_modules(GTK REQUIRED IMPORTED_TARGET gtk+-3.0) +pkg_check_modules(GLIB REQUIRED IMPORTED_TARGET glib-2.0) +pkg_check_modules(GIO REQUIRED IMPORTED_TARGET gio-2.0) + +set(FLUTTER_LIBRARY "${EPHEMERAL_DIR}/libflutter_linux_gtk.so") + +# Published to parent scope for install step. +set(FLUTTER_LIBRARY ${FLUTTER_LIBRARY} PARENT_SCOPE) +set(FLUTTER_ICU_DATA_FILE "${EPHEMERAL_DIR}/icudtl.dat" PARENT_SCOPE) +set(PROJECT_BUILD_DIR "${PROJECT_DIR}/build/" PARENT_SCOPE) +set(AOT_LIBRARY "${PROJECT_DIR}/build/lib/libapp.so" PARENT_SCOPE) + +list(APPEND FLUTTER_LIBRARY_HEADERS + "fl_basic_message_channel.h" + "fl_binary_codec.h" + "fl_binary_messenger.h" + "fl_dart_project.h" + "fl_engine.h" + "fl_json_message_codec.h" + "fl_json_method_codec.h" + "fl_message_codec.h" + "fl_method_call.h" + "fl_method_channel.h" + "fl_method_codec.h" + "fl_method_response.h" + "fl_plugin_registrar.h" + "fl_plugin_registry.h" + "fl_standard_message_codec.h" + "fl_standard_method_codec.h" + "fl_string_codec.h" + "fl_value.h" + "fl_view.h" + "flutter_linux.h" +) +list_prepend(FLUTTER_LIBRARY_HEADERS "${EPHEMERAL_DIR}/flutter_linux/") +add_library(flutter INTERFACE) +target_include_directories(flutter INTERFACE + "${EPHEMERAL_DIR}" +) +target_link_libraries(flutter INTERFACE "${FLUTTER_LIBRARY}") +target_link_libraries(flutter INTERFACE + PkgConfig::GTK + PkgConfig::GLIB + PkgConfig::GIO +) +add_dependencies(flutter flutter_assemble) + +# === Flutter tool backend === +# _phony_ is a non-existent file to force this command to run every time, +# since currently there's no way to get a full input/output list from the +# flutter tool. +add_custom_command( + OUTPUT ${FLUTTER_LIBRARY} ${FLUTTER_LIBRARY_HEADERS} + ${CMAKE_CURRENT_BINARY_DIR}/_phony_ + COMMAND ${CMAKE_COMMAND} -E env + ${FLUTTER_TOOL_ENVIRONMENT} + "${FLUTTER_ROOT}/packages/flutter_tools/bin/tool_backend.sh" + ${FLUTTER_TARGET_PLATFORM} ${CMAKE_BUILD_TYPE} + VERBATIM +) +add_custom_target(flutter_assemble DEPENDS + "${FLUTTER_LIBRARY}" + ${FLUTTER_LIBRARY_HEADERS} +) diff --git a/packages/firebase_storage/firebase_storage/example/linux/runner/CMakeLists.txt b/packages/firebase_storage/firebase_storage/example/linux/runner/CMakeLists.txt new file mode 100644 index 000000000000..e97dabc7028e --- /dev/null +++ b/packages/firebase_storage/firebase_storage/example/linux/runner/CMakeLists.txt @@ -0,0 +1,26 @@ +cmake_minimum_required(VERSION 3.13) +project(runner LANGUAGES CXX) + +# Define the application target. To change its name, change BINARY_NAME in the +# top-level CMakeLists.txt, not the value here, or `flutter run` will no longer +# work. +# +# Any new source files that you add to the application should be added here. +add_executable(${BINARY_NAME} + "main.cc" + "my_application.cc" + "${FLUTTER_MANAGED_DIR}/generated_plugin_registrant.cc" +) + +# Apply the standard set of build settings. This can be removed for applications +# that need different build settings. +apply_standard_settings(${BINARY_NAME}) + +# Add preprocessor definitions for the application ID. +add_definitions(-DAPPLICATION_ID="${APPLICATION_ID}") + +# Add dependency libraries. Add any application-specific dependencies here. +target_link_libraries(${BINARY_NAME} PRIVATE flutter) +target_link_libraries(${BINARY_NAME} PRIVATE PkgConfig::GTK) + +target_include_directories(${BINARY_NAME} PRIVATE "${CMAKE_SOURCE_DIR}") diff --git a/packages/firebase_storage/firebase_storage/example/linux/runner/main.cc b/packages/firebase_storage/firebase_storage/example/linux/runner/main.cc new file mode 100644 index 000000000000..54fde7b87fa0 --- /dev/null +++ b/packages/firebase_storage/firebase_storage/example/linux/runner/main.cc @@ -0,0 +1,10 @@ +// Copyright 2026, the Chromium project authors. Please see the AUTHORS file +// for details. All rights reserved. Use of this source code is governed by a +// BSD-style license that can be found in the LICENSE file. + +#include "my_application.h" + +int main(int argc, char** argv) { + g_autoptr(MyApplication) app = my_application_new(); + return g_application_run(G_APPLICATION(app), argc, argv); +} diff --git a/packages/firebase_storage/firebase_storage/example/linux/runner/my_application.cc b/packages/firebase_storage/firebase_storage/example/linux/runner/my_application.cc new file mode 100644 index 000000000000..f4f92c3f7b19 --- /dev/null +++ b/packages/firebase_storage/firebase_storage/example/linux/runner/my_application.cc @@ -0,0 +1,152 @@ +// Copyright 2026, the Chromium project authors. Please see the AUTHORS file +// for details. All rights reserved. Use of this source code is governed by a +// BSD-style license that can be found in the LICENSE file. + +#include "my_application.h" + +#include +#ifdef GDK_WINDOWING_X11 +#include +#endif + +#include "flutter/generated_plugin_registrant.h" + +struct _MyApplication { + GtkApplication parent_instance; + char** dart_entrypoint_arguments; +}; + +G_DEFINE_TYPE(MyApplication, my_application, GTK_TYPE_APPLICATION) + +// Called when first Flutter frame received. +static void first_frame_cb(MyApplication* self, FlView* view) { + gtk_widget_show(gtk_widget_get_toplevel(GTK_WIDGET(view))); +} + +// Implements GApplication::activate. +static void my_application_activate(GApplication* application) { + MyApplication* self = MY_APPLICATION(application); + GtkWindow* window = + GTK_WINDOW(gtk_application_window_new(GTK_APPLICATION(application))); + + // Use a header bar when running in GNOME as this is the common style used + // by applications and is the setup most users will be using (e.g. Ubuntu + // desktop). + // If running on X and not using GNOME then just use a traditional title bar + // in case the window manager does more exotic layout, e.g. tiling. + // If running on Wayland assume the header bar will work (may need changing + // if future cases occur). + gboolean use_header_bar = TRUE; +#ifdef GDK_WINDOWING_X11 + GdkScreen* screen = gtk_window_get_screen(window); + if (GDK_IS_X11_SCREEN(screen)) { + const gchar* wm_name = gdk_x11_screen_get_window_manager_name(screen); + if (g_strcmp0(wm_name, "GNOME Shell") != 0) { + use_header_bar = FALSE; + } + } +#endif + if (use_header_bar) { + GtkHeaderBar* header_bar = GTK_HEADER_BAR(gtk_header_bar_new()); + gtk_widget_show(GTK_WIDGET(header_bar)); + gtk_header_bar_set_title(header_bar, "firebase_storage_example"); + gtk_header_bar_set_show_close_button(header_bar, TRUE); + gtk_window_set_titlebar(window, GTK_WIDGET(header_bar)); + } else { + gtk_window_set_title(window, "firebase_storage_example"); + } + + gtk_window_set_default_size(window, 1280, 720); + + g_autoptr(FlDartProject) project = fl_dart_project_new(); + fl_dart_project_set_dart_entrypoint_arguments( + project, self->dart_entrypoint_arguments); + + FlView* view = fl_view_new(project); + GdkRGBA background_color; + // Background defaults to black, override it here if necessary, e.g. #00000000 + // for transparent. + gdk_rgba_parse(&background_color, "#000000"); + fl_view_set_background_color(view, &background_color); + gtk_widget_show(GTK_WIDGET(view)); + gtk_container_add(GTK_CONTAINER(window), GTK_WIDGET(view)); + + // Show the window when Flutter renders. + // Requires the view to be realized so we can start rendering. + g_signal_connect_swapped(view, "first-frame", G_CALLBACK(first_frame_cb), + self); + gtk_widget_realize(GTK_WIDGET(view)); + + fl_register_plugins(FL_PLUGIN_REGISTRY(view)); + + gtk_widget_grab_focus(GTK_WIDGET(view)); +} + +// Implements GApplication::local_command_line. +static gboolean my_application_local_command_line(GApplication* application, + gchar*** arguments, + int* exit_status) { + MyApplication* self = MY_APPLICATION(application); + // Strip out the first argument as it is the binary name. + self->dart_entrypoint_arguments = g_strdupv(*arguments + 1); + + g_autoptr(GError) error = nullptr; + if (!g_application_register(application, nullptr, &error)) { + g_warning("Failed to register: %s", error->message); + *exit_status = 1; + return TRUE; + } + + g_application_activate(application); + *exit_status = 0; + + return TRUE; +} + +// Implements GApplication::startup. +static void my_application_startup(GApplication* application) { + // MyApplication* self = MY_APPLICATION(object); + + // Perform any actions required at application startup. + + G_APPLICATION_CLASS(my_application_parent_class)->startup(application); +} + +// Implements GApplication::shutdown. +static void my_application_shutdown(GApplication* application) { + // MyApplication* self = MY_APPLICATION(object); + + // Perform any actions required at application shutdown. + + G_APPLICATION_CLASS(my_application_parent_class)->shutdown(application); +} + +// Implements GObject::dispose. +static void my_application_dispose(GObject* object) { + MyApplication* self = MY_APPLICATION(object); + g_clear_pointer(&self->dart_entrypoint_arguments, g_strfreev); + G_OBJECT_CLASS(my_application_parent_class)->dispose(object); +} + +static void my_application_class_init(MyApplicationClass* klass) { + G_APPLICATION_CLASS(klass)->activate = my_application_activate; + G_APPLICATION_CLASS(klass)->local_command_line = + my_application_local_command_line; + G_APPLICATION_CLASS(klass)->startup = my_application_startup; + G_APPLICATION_CLASS(klass)->shutdown = my_application_shutdown; + G_OBJECT_CLASS(klass)->dispose = my_application_dispose; +} + +static void my_application_init(MyApplication* self) {} + +MyApplication* my_application_new() { + // Set the program name to the application ID, which helps various systems + // like GTK and desktop environments map this running application to its + // corresponding .desktop file. This ensures better integration by allowing + // the application to be recognized beyond its binary name. + g_set_prgname(APPLICATION_ID); + + return MY_APPLICATION(g_object_new(my_application_get_type(), + "application-id", APPLICATION_ID, "flags", + G_APPLICATION_NON_UNIQUE, nullptr)); +} diff --git a/packages/firebase_storage/firebase_storage/example/linux/runner/my_application.h b/packages/firebase_storage/firebase_storage/example/linux/runner/my_application.h new file mode 100644 index 000000000000..a2ba75695cf5 --- /dev/null +++ b/packages/firebase_storage/firebase_storage/example/linux/runner/my_application.h @@ -0,0 +1,22 @@ +// Copyright 2026, the Chromium project authors. Please see the AUTHORS file +// for details. All rights reserved. Use of this source code is governed by a +// BSD-style license that can be found in the LICENSE file. + +#ifndef FLUTTER_MY_APPLICATION_H_ +#define FLUTTER_MY_APPLICATION_H_ + +#include + +G_DECLARE_FINAL_TYPE(MyApplication, my_application, MY, APPLICATION, + GtkApplication) + +/** + * my_application_new: + * + * Creates a new Flutter-based application. + * + * Returns: a new #MyApplication. + */ +MyApplication* my_application_new(); + +#endif // FLUTTER_MY_APPLICATION_H_ diff --git a/packages/firebase_storage/firebase_storage/linux/CMakeLists.txt b/packages/firebase_storage/firebase_storage/linux/CMakeLists.txt new file mode 100644 index 000000000000..d6e72c6f8a20 --- /dev/null +++ b/packages/firebase_storage/firebase_storage/linux/CMakeLists.txt @@ -0,0 +1,97 @@ +# The Flutter tooling requires that developers have CMake 3.10 or later +# installed. You should not increase this version, as doing so will cause +# the plugin to fail to compile for some customers of the plugin. +cmake_minimum_required(VERSION 3.10) + +# Project-level configuration. +set(PROJECT_NAME "firebase_storage") +project(${PROJECT_NAME} LANGUAGES CXX) + +# This value is used when generating builds using this plugin, so it must +# not be changed +set(PLUGIN_NAME "firebase_storage_plugin") + +# Any new source files that you add to the plugin should be added here. +list(APPEND PLUGIN_SOURCES + "include/firebase_storage/firebase_storage_plugin.h" + "firebase_storage_plugin.cc" + "messages.g.cc" + "messages.g.h" + "../src/firebase_storage_utils.cpp" + "../src/firebase_storage_utils.h" +) + +# Read version from pubspec.yaml +file(STRINGS "../pubspec.yaml" pubspec_content) +foreach(line ${pubspec_content}) + string(FIND ${line} "version: " has_version) + + if("${has_version}" STREQUAL "0") + string(FIND ${line} ": " version_start_pos) + math(EXPR version_start_pos "${version_start_pos} + 2") + string(LENGTH ${line} version_end_pos) + math(EXPR len "${version_end_pos} - ${version_start_pos}") + string(SUBSTRING ${line} ${version_start_pos} ${len} PLUGIN_VERSION) + break() + endif() +endforeach(line) + +configure_file(plugin_version.h.in ${CMAKE_BINARY_DIR}/generated/firebase_storage/plugin_version.h) +include_directories(${CMAKE_BINARY_DIR}/generated/) + +# Define the plugin library target. Its name must not be changed (see comment +# on PLUGIN_NAME above). +# +# This is deliberately a STATIC library (unlike the SHARED library in the +# Flutter Linux plugin template) to mirror the Windows implementation; see the +# comment in firebase_core/linux/CMakeLists.txt for the full rationale (a +# single copy of the prebuilt Firebase C++ SDK static libraries must be linked +# into the runner so that all FlutterFire plugins share one firebase::App +# registry). POSITION_INDEPENDENT_CODE is enabled below because the runner +# executable is built as PIE. +add_library(${PLUGIN_NAME} STATIC + ${PLUGIN_SOURCES} + ${CMAKE_BINARY_DIR}/generated/firebase_storage/plugin_version.h +) + +# Apply a standard set of build settings that are configured in the +# application-level CMakeLists.txt. This can be removed for plugins that want +# full control over build settings. +apply_standard_settings(${PLUGIN_NAME}) + +# Symbols are hidden by default to reduce the chance of accidental conflicts +# between plugins. This should not be removed; any symbols that should be +# exported should be explicitly exported with the FLUTTER_PLUGIN_EXPORT macro. +set_target_properties(${PLUGIN_NAME} PROPERTIES + CXX_VISIBILITY_PRESET hidden + POSITION_INDEPENDENT_CODE ON) +target_compile_definitions(${PLUGIN_NAME} PUBLIC FLUTTER_PLUGIN_IMPL) + +# Enable firebase-cpp-sdk's platform logging api. +target_compile_definitions(${PLUGIN_NAME} PRIVATE -DINTERNAL_EXPERIMENTAL=1) + +# Source include directories and library dependencies. The Firebase C++ SDK is +# added (via add_subdirectory) by the firebase_core plugin, exactly like the +# Windows implementation, so it is not re-added here; linking against +# firebase_core_plugin transitively provides the SDK include directories and +# the firebase_app library. +# NOTE: the Firebase SDK product archives are linked exclusively by the +# firebase_core_plugin target, which wraps all of them in a single +# -Wl,--start-group/--end-group (the archives have circular symbol +# dependencies that an ordered per-plugin link line cannot satisfy). +set(firebase_libs firebase_core_plugin) +set(ADDITIONAL_LIBS pthread) +target_link_libraries(${PLUGIN_NAME} PRIVATE "${firebase_libs}" "${ADDITIONAL_LIBS}") + +target_include_directories(${PLUGIN_NAME} INTERFACE + "${CMAKE_CURRENT_SOURCE_DIR}/include") +target_link_libraries(${PLUGIN_NAME} PRIVATE flutter) +target_link_libraries(${PLUGIN_NAME} PRIVATE PkgConfig::GTK) + +# List of absolute paths to libraries that should be bundled with the plugin. +# This list could contain prebuilt libraries, or libraries created by an +# external build triggered from this build file. +set(firebase_storage_bundled_libraries + "" + PARENT_SCOPE +) diff --git a/packages/firebase_storage/firebase_storage/linux/firebase_storage_plugin.cc b/packages/firebase_storage/firebase_storage/linux/firebase_storage_plugin.cc new file mode 100644 index 000000000000..c22a853c5785 --- /dev/null +++ b/packages/firebase_storage/firebase_storage/linux/firebase_storage_plugin.cc @@ -0,0 +1,1098 @@ +// Copyright 2026, the Chromium project authors. Please see the AUTHORS file +// for details. All rights reserved. Use of this source code is governed by a +// BSD-style license that can be found in the LICENSE file. + +#include "include/firebase_storage/firebase_storage_plugin.h" + +#include + +#include +#include +#include +#include +#include +#include + +#include "../src/firebase_storage_utils.h" +#include "firebase/app.h" +#include "firebase/future.h" +#include "firebase/storage.h" +#include "firebase/storage/controller.h" +#include "firebase/storage/listener.h" +#include "firebase/storage/metadata.h" +#include "firebase/storage/storage_reference.h" +#include "firebase_storage/plugin_version.h" +#include "messages.g.h" + +using ::firebase::App; +using ::firebase::Future; +using ::firebase::storage::Controller; +using ::firebase::storage::Error; +using ::firebase::storage::Listener; +using ::firebase::storage::Metadata; +using ::firebase::storage::Storage; +using ::firebase::storage::StorageReference; + +static const char kLibraryName[] = "flutter-fire-gcs"; +static const char kStorageMethodChannelName[] = + "plugins.flutter.io/firebase_storage"; +static const char kStorageTaskEventName[] = "taskEvent"; + +#define FIREBASE_STORAGE_PLUGIN(obj) \ + (G_TYPE_CHECK_INSTANCE_CAST((obj), firebase_storage_plugin_get_type(), \ + FirebaseStoragePlugin)) + +struct _FirebaseStoragePlugin { + GObject parent_instance; +}; + +G_DEFINE_TYPE(FirebaseStoragePlugin, firebase_storage_plugin, + g_object_get_type()) + +// Messenger used to create per-task event channels. Mirrors the static +// messenger_ member of the Windows implementation. +static FlBinaryMessenger* messenger_ = nullptr; + +// Task controllers keyed by the Dart-side task handle. Mirrors the +// controllers_ member of the Windows implementation. +static std::map> controllers_; + +// Runs a function on the GLib main thread. The Firebase C++ SDK invokes +// Future completions and task listeners on its own worker threads, but the +// Flutter Linux embedder (FlBinaryMessenger / FlEventChannel) must only be +// used from the main thread. +static gboolean RunOnMainThreadCallback(gpointer user_data) { + auto* function = static_cast*>(user_data); + (*function)(); + delete function; + return G_SOURCE_REMOVE; +} + +static void RunOnMainThread(std::function function) { + g_idle_add(RunOnMainThreadCallback, + new std::function(std::move(function))); +} + +static Storage* GetCPPStorageFromPigeon( + FirebaseStorageInternalStorageFirebaseApp* pigeon_app, + const std::string& bucket_path) { + std::string default_url = std::string("gs://") + bucket_path; + App* app = App::GetInstance( + firebase_storage_internal_storage_firebase_app_get_app_name(pigeon_app)); + Storage* cpp_storage = Storage::GetInstance(app, default_url.c_str()); + + return cpp_storage; +} + +static StorageReference GetCPPStorageReferenceFromPigeon( + FirebaseStorageInternalStorageFirebaseApp* pigeon_app, + FirebaseStorageInternalStorageReference* pigeon_reference) { + Storage* cpp_storage = GetCPPStorageFromPigeon( + pigeon_app, + firebase_storage_internal_storage_reference_get_bucket(pigeon_reference)); + return cpp_storage->GetReference( + firebase_storage_internal_storage_reference_get_full_path( + pigeon_reference)); +} + +static std::string GetStorageErrorCode(Error storage_error) { + return firebase_storage_desktop::GetStorageErrorCode(storage_error); +} + +static std::string GetStorageErrorMessage(Error storage_error) { + return firebase_storage_desktop::GetStorageErrorMessage(storage_error); +} + +static std::string ParseErrorCode(const firebase::FutureBase& future) { + return GetStorageErrorCode(static_cast(future.error())); +} + +static std::string ParseErrorMessage(const firebase::FutureBase& future) { + return GetStorageErrorMessage(static_cast(future.error())); +} + +static const char kCacheControlName[] = "cacheControl"; +static const char kContentDispositionName[] = "contentDisposition"; +static const char kContentEncodingName[] = "contentEncoding"; +static const char kContentLanguageName[] = "contentLanguage"; +static const char kContentTypeName[] = "contentType"; +static const char kCustomMetadataName[] = "customMetadata"; +static const char kMetadataName[] = "metadata"; +static const char kSizeName[] = "size"; +static const char kBucketName[] = "bucket"; +static const char kCreationTimeMillisName[] = "creationTimeMillis"; +static const char kUpdatedTimeMillisName[] = "updatedTimeMillis"; + +static const char kTaskStateName[] = "taskState"; +static const char kTaskAppName[] = "appName"; +static const char kTaskSnapshotName[] = "snapshot"; +static const char kTaskSnapshotPath[] = "path"; +static const char kTaskSnapshotBytesTransferred[] = "bytesTransferred"; +static const char kTaskSnapshotTotalBytes[] = "totalBytes"; +static const char kErrorName[] = "error"; + +// Converts Firebase C++ SDK metadata to the map streamed back to Dart. +// Ownership: returns a new reference (transfer full). +static FlValue* ConvertMedadataToPigeon(const Metadata* meta) { + FlValue* meta_map = fl_value_new_map(); + if (meta->cache_control() != nullptr) { + fl_value_set_string_take(meta_map, kCacheControlName, + fl_value_new_string(meta->cache_control())); + } + if (meta->content_disposition() != nullptr) { + fl_value_set_string_take(meta_map, kContentDispositionName, + fl_value_new_string(meta->content_disposition())); + } + if (meta->content_encoding() != nullptr) { + fl_value_set_string_take(meta_map, kContentEncodingName, + fl_value_new_string(meta->content_encoding())); + } + if (meta->content_language() != nullptr) { + fl_value_set_string_take(meta_map, kContentLanguageName, + fl_value_new_string(meta->content_language())); + } + if (meta->content_type() != nullptr) { + fl_value_set_string_take(meta_map, kContentTypeName, + fl_value_new_string(meta->content_type())); + } + if (meta->bucket() != nullptr) { + fl_value_set_string_take(meta_map, kBucketName, + fl_value_new_string(meta->bucket())); + } + fl_value_set_string_take(meta_map, kSizeName, + fl_value_new_int(meta->size_bytes())); + if (meta->custom_metadata() != nullptr) { + g_autoptr(FlValue) custom_meta_map = fl_value_new_map(); + for (const auto& kv : *meta->custom_metadata()) { + fl_value_set_string_take(custom_meta_map, kv.first.c_str(), + fl_value_new_string(kv.second.c_str())); + } + fl_value_set_string(meta_map, kCustomMetadataName, custom_meta_map); + } + fl_value_set_string_take(meta_map, kCreationTimeMillisName, + fl_value_new_int(meta->creation_time())); + + fl_value_set_string_take(meta_map, kUpdatedTimeMillisName, + fl_value_new_int(meta->updated_time())); + + return meta_map; +} + +static std::map ProcessCustomMetadataMap( + FlValue* custom_metadata) { + std::map processed_metadata; + + if (custom_metadata == nullptr || + fl_value_get_type(custom_metadata) != FL_VALUE_TYPE_MAP) { + return processed_metadata; + } + + size_t length = fl_value_get_length(custom_metadata); + for (size_t i = 0; i < length; ++i) { + FlValue* key = fl_value_get_map_key(custom_metadata, i); + FlValue* value = fl_value_get_map_value(custom_metadata, i); + if (fl_value_get_type(key) == FL_VALUE_TYPE_STRING && + fl_value_get_type(value) == FL_VALUE_TYPE_STRING) { + processed_metadata.emplace(fl_value_get_string(key), + fl_value_get_string(value)); + } else { + g_warning("Ignoring non-string key or value in metadata map"); + } + } + + return processed_metadata; +} + +// Converts pigeon settable metadata into SDK metadata. Returns nullptr when +// there is no metadata to apply; otherwise the caller owns the returned +// object. +static Metadata* CreateStorageMetadataFromPigeon( + FirebaseStorageInternalSettableMetadata* pigeon_meta_data) { + if (pigeon_meta_data == nullptr) { + return nullptr; // No metadata to process + } + + auto meta_data = std::make_unique(); + + bool has_valid_data = false; + + // Set Cache Control + const gchar* cache_control = + firebase_storage_internal_settable_metadata_get_cache_control( + pigeon_meta_data); + if (cache_control != nullptr) { + meta_data->set_cache_control(cache_control); + has_valid_data = true; + } + + // Set Content Disposition + const gchar* content_disposition = + firebase_storage_internal_settable_metadata_get_content_disposition( + pigeon_meta_data); + if (content_disposition != nullptr) { + meta_data->set_content_disposition(content_disposition); + has_valid_data = true; + } + + // Set Content Encoding + const gchar* content_encoding = + firebase_storage_internal_settable_metadata_get_content_encoding( + pigeon_meta_data); + if (content_encoding != nullptr) { + meta_data->set_content_encoding(content_encoding); + has_valid_data = true; + } + + // Set Content Language + const gchar* content_language = + firebase_storage_internal_settable_metadata_get_content_language( + pigeon_meta_data); + if (content_language != nullptr) { + meta_data->set_content_language(content_language); + has_valid_data = true; + } + + // Set Content Type + const gchar* content_type = + firebase_storage_internal_settable_metadata_get_content_type( + pigeon_meta_data); + if (content_type != nullptr) { + meta_data->set_content_type(content_type); + has_valid_data = true; + } + + // Set Custom Metadata + FlValue* custom_metadata = + firebase_storage_internal_settable_metadata_get_custom_metadata( + pigeon_meta_data); + if (custom_metadata != nullptr) { + std::map custom_meta_data_map = + ProcessCustomMetadataMap(custom_metadata); + if (!custom_meta_data_map.empty()) { + std::map* meta_data_map = + meta_data->custom_metadata(); + meta_data_map->insert(custom_meta_data_map.begin(), + custom_meta_data_map.end()); + has_valid_data = true; + } + } + + if (!has_valid_data) { + return nullptr; // If no valid data was set, return nullptr + } + + return meta_data.release(); // Successfully created and populated metadata, + // release the pointer +} + +// For tasks, we stream the exception back as a map to match other platforms. +// Ownership: returns a new reference (transfer full). +static FlValue* ErrorStreamEvent(const firebase::FutureBase& data_result, + const std::string& app_name) { + const Error error_code = static_cast(data_result.error()); + + g_autoptr(FlValue) error = fl_value_new_map(); + fl_value_set_string_take( + error, "code", + fl_value_new_string(GetStorageErrorCode(error_code).c_str())); + fl_value_set_string_take( + error, "message", + fl_value_new_string(GetStorageErrorMessage(error_code).c_str())); + + FlValue* event = fl_value_new_map(); + fl_value_set_string_take(event, kTaskAppName, + fl_value_new_string(app_name.c_str())); + fl_value_set_string_take( + event, kTaskStateName, + fl_value_new_int( + FIREBASE_STORAGE_PLATFORM_INTERFACE_INTERNAL_STORAGE_TASK_STATE_ERROR)); + fl_value_set_string(event, kErrorName, error); + + return event; +} + +// Sends an event on a task event channel from the main thread. +// Takes ownership of @event. The channel object is owned by the global +// event channel registry below and stays alive for the process lifetime, +// mirroring the Windows implementation. +static void SendEventOnMainThread(FlEventChannel* channel, FlValue* event) { + RunOnMainThread([channel, event]() { + g_autoptr(GError) error = nullptr; + if (!fl_event_channel_send(channel, event, nullptr, &error)) { + g_warning("Failed to send storage task event: %s", error->message); + } + fl_value_unref(event); + }); +} + +// Builds a task event map (running/paused/success states). +// Ownership: returns a new reference (transfer full); takes ownership of +// @metadata when non-null. +static FlValue* CreateTaskEvent(FirebaseStorageInternalStorageTaskState state, + const std::string& app_name, + const std::string& path, + int64_t bytes_transferred, int64_t total_bytes, + FlValue* metadata) { + FlValue* event = fl_value_new_map(); + fl_value_set_string_take(event, kTaskStateName, fl_value_new_int(state)); + fl_value_set_string_take(event, kTaskAppName, + fl_value_new_string(app_name.c_str())); + g_autoptr(FlValue) snapshot = fl_value_new_map(); + fl_value_set_string_take(snapshot, kTaskSnapshotPath, + fl_value_new_string(path.c_str())); + fl_value_set_string_take(snapshot, kTaskSnapshotTotalBytes, + fl_value_new_int(total_bytes)); + fl_value_set_string_take(snapshot, kTaskSnapshotBytesTransferred, + fl_value_new_int(bytes_transferred)); + if (metadata != nullptr) { + fl_value_set_string_take(snapshot, kMetadataName, metadata); + } + fl_value_set_string(event, kTaskSnapshotName, snapshot); + + return event; +} + +// Streams progress/pause events for an in-flight task to Dart. +class TaskStateListener : public Listener { + public: + explicit TaskStateListener(FlEventChannel* channel) : channel_(channel) {} + + void OnProgress(Controller* controller) override { + SendEventOnMainThread( + channel_, + CreateTaskEvent( + FIREBASE_STORAGE_PLATFORM_INTERFACE_INTERNAL_STORAGE_TASK_STATE_RUNNING, + controller->GetReference().storage()->app()->name(), + controller->GetReference().full_path(), + controller->bytes_transferred(), controller->total_byte_count(), + nullptr)); + } + + void OnPaused(Controller* controller) override { + SendEventOnMainThread( + channel_, + CreateTaskEvent( + FIREBASE_STORAGE_PLATFORM_INTERFACE_INTERNAL_STORAGE_TASK_STATE_PAUSED, + controller->GetReference().storage()->app()->name(), + controller->GetReference().full_path(), + controller->bytes_transferred(), controller->total_byte_count(), + nullptr)); + } + + private: + FlEventChannel* channel_; +}; + +// C++ analog of the Windows flutter::StreamHandler subclasses, adapted to the +// FlEventChannel C callback API. +class TaskStreamHandler { + public: + virtual ~TaskStreamHandler() = default; + + virtual FlMethodErrorResponse* OnListen(FlEventChannel* channel, + FlValue* args) = 0; + + virtual FlMethodErrorResponse* OnCancel(FlValue* args) { return nullptr; } +}; + +static FlMethodErrorResponse* TaskStreamHandlerListenCallback( + FlEventChannel* channel, FlValue* args, gpointer user_data) { + return static_cast(user_data)->OnListen(channel, args); +} + +static FlMethodErrorResponse* TaskStreamHandlerCancelCallback( + FlEventChannel* channel, FlValue* args, gpointer user_data) { + return static_cast(user_data)->OnCancel(args); +} + +static void TaskStreamHandlerDestroyNotify(gpointer user_data) { + delete static_cast(user_data); +} + +// Event channels registered for tasks, keyed by channel name. Channels (and +// their stream handlers) are kept alive for the process lifetime, mirroring +// the Windows implementation. +static std::map event_channels_; + +// Creates a "/" event channel with the given stream handler and +// returns the uuid, which the Dart side uses to reconstruct the channel name. +static std::string RegisterEventChannel( + const std::string& prefix, std::unique_ptr handler) { + g_autofree gchar* uuid = g_uuid_string_random(); + + std::string channel_name = prefix + "/" + uuid; + + g_autoptr(FlStandardMethodCodec) codec = fl_standard_method_codec_new(); + FlEventChannel* channel = fl_event_channel_new( + messenger_, channel_name.c_str(), FL_METHOD_CODEC(codec)); + fl_event_channel_set_stream_handlers( + channel, TaskStreamHandlerListenCallback, TaskStreamHandlerCancelCallback, + handler.release(), TaskStreamHandlerDestroyNotify); + event_channels_[channel_name] = channel; + + return uuid; +} + +class PutDataStreamHandler : public TaskStreamHandler { + public: + PutDataStreamHandler( + Storage* storage, std::string reference_path, const void* data, + size_t buffer_size, Controller* controller, + FirebaseStorageInternalSettableMetadata* pigeon_meta_data) + : storage_(storage), + reference_path_(std::move(reference_path)), + controller_(controller) { + auto data_bytes_ptr = static_cast(data); + data_.assign(data_bytes_ptr, data_bytes_ptr + buffer_size); + if (pigeon_meta_data != nullptr) { + meta_data_ = FIREBASE_STORAGE_INTERNAL_SETTABLE_METADATA( + g_object_ref(pigeon_meta_data)); + } + } + + ~PutDataStreamHandler() override { g_clear_object(&meta_data_); } + + FlMethodErrorResponse* OnListen(FlEventChannel* channel, + FlValue* args) override { + listener_ = std::make_unique(channel); + StorageReference reference = storage_->GetReference(reference_path_); + + std::unique_ptr storage_metadata( + CreateStorageMetadataFromPigeon(meta_data_)); + Future future_result; + if (storage_metadata) { + future_result = + reference.PutBytes(data_.data(), data_.size(), *storage_metadata, + listener_.get(), controller_); + } else { + future_result = reference.PutBytes(data_.data(), data_.size(), + listener_.get(), controller_); + } + + g_usleep(1000); // timing for c++ sdk grabbing a mutex + + future_result.OnCompletion([this, + channel](const Future& data_result) { + if (data_result.error() == firebase::storage::kErrorNone) { + SendEventOnMainThread( + channel, + CreateTaskEvent( + FIREBASE_STORAGE_PLATFORM_INTERFACE_INTERNAL_STORAGE_TASK_STATE_SUCCESS, + storage_->app()->name(), data_result.result()->path(), + data_result.result()->size_bytes(), + data_result.result()->size_bytes(), + ConvertMedadataToPigeon(data_result.result()))); + } else { + SendEventOnMainThread( + channel, ErrorStreamEvent(data_result, storage_->app()->name())); + } + }); + return nullptr; + } + + private: + Storage* storage_; + std::string reference_path_; + std::vector data_; + Controller* controller_; + FirebaseStorageInternalSettableMetadata* meta_data_ = nullptr; + std::unique_ptr listener_; +}; + +class PutFileStreamHandler : public TaskStreamHandler { + public: + PutFileStreamHandler( + Storage* storage, std::string reference_path, std::string file_path, + Controller* controller, + FirebaseStorageInternalSettableMetadata* pigeon_meta_data) + : storage_(storage), + reference_path_(std::move(reference_path)), + file_path_(std::move(file_path)), + controller_(controller) { + if (pigeon_meta_data != nullptr) { + meta_data_ = FIREBASE_STORAGE_INTERNAL_SETTABLE_METADATA( + g_object_ref(pigeon_meta_data)); + } + } + + ~PutFileStreamHandler() override { g_clear_object(&meta_data_); } + + FlMethodErrorResponse* OnListen(FlEventChannel* channel, + FlValue* args) override { + listener_ = std::make_unique(channel); + StorageReference reference = storage_->GetReference(reference_path_); + + std::unique_ptr storage_metadata( + CreateStorageMetadataFromPigeon(meta_data_)); + Future future_result; + if (storage_metadata) { + future_result = reference.PutFile(file_path_.c_str(), *storage_metadata, + listener_.get(), controller_); + } else { + future_result = + reference.PutFile(file_path_.c_str(), listener_.get(), controller_); + } + + g_usleep(1000); // timing for c++ sdk grabbing a mutex + + future_result.OnCompletion([this, + channel](const Future& data_result) { + if (data_result.error() == firebase::storage::kErrorNone) { + SendEventOnMainThread( + channel, + CreateTaskEvent( + FIREBASE_STORAGE_PLATFORM_INTERFACE_INTERNAL_STORAGE_TASK_STATE_SUCCESS, + storage_->app()->name(), data_result.result()->path(), + data_result.result()->size_bytes(), + data_result.result()->size_bytes(), + ConvertMedadataToPigeon(data_result.result()))); + } else { + SendEventOnMainThread( + channel, ErrorStreamEvent(data_result, storage_->app()->name())); + } + }); + return nullptr; + } + + private: + Storage* storage_; + std::string reference_path_; + std::string file_path_; + Controller* controller_; + FirebaseStorageInternalSettableMetadata* meta_data_ = nullptr; + std::unique_ptr listener_; +}; + +class GetFileStreamHandler : public TaskStreamHandler { + public: + GetFileStreamHandler(Storage* storage, std::string reference_path, + std::string file_path, Controller* controller) + : storage_(storage), + reference_path_(std::move(reference_path)), + file_path_(std::move(file_path)), + controller_(controller) {} + + FlMethodErrorResponse* OnListen(FlEventChannel* channel, + FlValue* args) override { + listener_ = std::make_unique(channel); + StorageReference reference = storage_->GetReference(reference_path_); + Future future_result = + reference.GetFile(file_path_.c_str(), listener_.get(), controller_); + + g_usleep(1000); // timing for c++ sdk grabbing a mutex + + future_result.OnCompletion([this, + channel](const Future& data_result) { + if (data_result.error() == firebase::storage::kErrorNone) { + int64_t data_size = static_cast(*data_result.result()); + SendEventOnMainThread( + channel, + CreateTaskEvent( + FIREBASE_STORAGE_PLATFORM_INTERFACE_INTERNAL_STORAGE_TASK_STATE_SUCCESS, + storage_->app()->name(), reference_path_, data_size, data_size, + nullptr)); + } else { + SendEventOnMainThread( + channel, ErrorStreamEvent(data_result, storage_->app()->name())); + } + }); + return nullptr; + } + + private: + Storage* storage_; + std::string reference_path_; + std::string file_path_; + Controller* controller_; + std::unique_ptr listener_; +}; + +// FirebaseStorageHostApi + +static void HandleGetReferencebyPath( + FirebaseStorageInternalStorageFirebaseApp* app, const gchar* path, + const gchar* bucket, + FirebaseStorageFirebaseStorageHostApiResponseHandle* response_handle, + gpointer user_data) { + Storage* cpp_storage = + GetCPPStorageFromPigeon(app, bucket == nullptr ? "" : bucket); + StorageReference cpp_reference = cpp_storage->GetReference(path); + g_autoptr(FirebaseStorageInternalStorageReference) reference = + firebase_storage_internal_storage_reference_new( + cpp_reference.bucket().c_str(), cpp_reference.full_path().c_str(), + cpp_reference.name().c_str()); + firebase_storage_firebase_storage_host_api_respond_get_referenceby_path( + response_handle, reference); +} + +static void HandleSetMaxOperationRetryTime( + FirebaseStorageInternalStorageFirebaseApp* app, int64_t time, + FirebaseStorageFirebaseStorageHostApiResponseHandle* response_handle, + gpointer user_data) { + Storage* cpp_storage = GetCPPStorageFromPigeon(app, ""); + cpp_storage->set_max_operation_retry_time(static_cast(time)); + // Improvement over the Windows implementation, which never replies and + // leaves the Dart future pending. + firebase_storage_firebase_storage_host_api_respond_set_max_operation_retry_time( + response_handle); +} + +static void HandleSetMaxUploadRetryTime( + FirebaseStorageInternalStorageFirebaseApp* app, int64_t time, + FirebaseStorageFirebaseStorageHostApiResponseHandle* response_handle, + gpointer user_data) { + Storage* cpp_storage = GetCPPStorageFromPigeon(app, ""); + cpp_storage->set_max_upload_retry_time(static_cast(time)); + // Improvement over the Windows implementation, which never replies and + // leaves the Dart future pending. + firebase_storage_firebase_storage_host_api_respond_set_max_upload_retry_time( + response_handle); +} + +static void HandleSetMaxDownloadRetryTime( + FirebaseStorageInternalStorageFirebaseApp* app, int64_t time, + FirebaseStorageFirebaseStorageHostApiResponseHandle* response_handle, + gpointer user_data) { + Storage* cpp_storage = GetCPPStorageFromPigeon(app, ""); + cpp_storage->set_max_download_retry_time(static_cast(time)); + // Improvement over the Windows implementation, which never replies and + // leaves the Dart future pending. + firebase_storage_firebase_storage_host_api_respond_set_max_download_retry_time( + response_handle); +} + +static void HandleUseStorageEmulator( + FirebaseStorageInternalStorageFirebaseApp* app, const gchar* host, + int64_t port, + FirebaseStorageFirebaseStorageHostApiResponseHandle* response_handle, + gpointer user_data) { + Storage* cpp_storage = GetCPPStorageFromPigeon(app, ""); + cpp_storage->UseEmulator(host, static_cast(port)); + firebase_storage_firebase_storage_host_api_respond_use_storage_emulator( + response_handle); +} + +static void HandleReferenceDelete( + FirebaseStorageInternalStorageFirebaseApp* app, + FirebaseStorageInternalStorageReference* reference, + FirebaseStorageFirebaseStorageHostApiResponseHandle* response_handle, + gpointer user_data) { + StorageReference cpp_reference = + GetCPPStorageReferenceFromPigeon(app, reference); + Future future_result = cpp_reference.Delete(); + g_usleep(1000); // timing for c++ sdk grabbing a mutex + g_object_ref(response_handle); + future_result.OnCompletion([response_handle]( + const Future& void_result) { + if (void_result.error() == firebase::storage::kErrorNone) { + RunOnMainThread([response_handle]() { + firebase_storage_firebase_storage_host_api_respond_reference_delete( + response_handle); + g_object_unref(response_handle); + }); + } else { + std::string code = ParseErrorCode(void_result); + std::string message = ParseErrorMessage(void_result); + RunOnMainThread([response_handle, code, message]() { + firebase_storage_firebase_storage_host_api_respond_error_reference_delete( + response_handle, code.c_str(), message.c_str(), nullptr); + g_object_unref(response_handle); + }); + } + }); +} + +static void HandleReferenceGetDownloadURL( + FirebaseStorageInternalStorageFirebaseApp* app, + FirebaseStorageInternalStorageReference* reference, + FirebaseStorageFirebaseStorageHostApiResponseHandle* response_handle, + gpointer user_data) { + StorageReference cpp_reference = + GetCPPStorageReferenceFromPigeon(app, reference); + Future future_result = cpp_reference.GetDownloadUrl(); + g_usleep(1000); // timing for c++ sdk grabbing a mutex + g_object_ref(response_handle); + future_result.OnCompletion([response_handle]( + const Future& string_result) { + if (string_result.error() == firebase::storage::kErrorNone) { + std::string url = *string_result.result(); + RunOnMainThread([response_handle, url]() { + firebase_storage_firebase_storage_host_api_respond_reference_get_download_u_r_l( + response_handle, url.c_str()); + g_object_unref(response_handle); + }); + } else { + std::string code = ParseErrorCode(string_result); + std::string message = ParseErrorMessage(string_result); + RunOnMainThread([response_handle, code, message]() { + firebase_storage_firebase_storage_host_api_respond_error_reference_get_download_u_r_l( + response_handle, code.c_str(), message.c_str(), nullptr); + g_object_unref(response_handle); + }); + } + }); +} + +static void HandleReferenceGetMetaData( + FirebaseStorageInternalStorageFirebaseApp* app, + FirebaseStorageInternalStorageReference* reference, + FirebaseStorageFirebaseStorageHostApiResponseHandle* response_handle, + gpointer user_data) { + StorageReference cpp_reference = + GetCPPStorageReferenceFromPigeon(app, reference); + Future future_result = cpp_reference.GetMetadata(); + g_usleep(1000); // timing for c++ sdk grabbing a mutex + g_object_ref(response_handle); + future_result.OnCompletion([response_handle]( + const Future& metadata_result) { + if (metadata_result.error() == firebase::storage::kErrorNone) { + Metadata metadata = *metadata_result.result(); + RunOnMainThread([response_handle, metadata]() { + g_autoptr(FlValue) meta_map = ConvertMedadataToPigeon(&metadata); + g_autoptr(FirebaseStorageInternalFullMetaData) pigeon_meta = + firebase_storage_internal_full_meta_data_new(meta_map); + firebase_storage_firebase_storage_host_api_respond_reference_get_meta_data( + response_handle, pigeon_meta); + g_object_unref(response_handle); + }); + } else { + std::string code = ParseErrorCode(metadata_result); + std::string message = ParseErrorMessage(metadata_result); + RunOnMainThread([response_handle, code, message]() { + firebase_storage_firebase_storage_host_api_respond_error_reference_get_meta_data( + response_handle, code.c_str(), message.c_str(), nullptr); + g_object_unref(response_handle); + }); + } + }); +} + +static void HandleReferenceList( + FirebaseStorageInternalStorageFirebaseApp* app, + FirebaseStorageInternalStorageReference* reference, + FirebaseStorageInternalListOptions* options, + FirebaseStorageFirebaseStorageHostApiResponseHandle* response_handle, + gpointer user_data) { + // C++ doesn't support list yet + g_autoptr(FlValue) items = fl_value_new_list(); + g_autoptr(FlValue) prefixs = fl_value_new_list(); + g_autoptr(FirebaseStorageInternalListResult) pigeon_result = + firebase_storage_internal_list_result_new(items, nullptr, prefixs); + firebase_storage_firebase_storage_host_api_respond_reference_list( + response_handle, pigeon_result); +} + +static void HandleReferenceListAll( + FirebaseStorageInternalStorageFirebaseApp* app, + FirebaseStorageInternalStorageReference* reference, + FirebaseStorageFirebaseStorageHostApiResponseHandle* response_handle, + gpointer user_data) { + // C++ doesn't support listAll yet + g_autoptr(FlValue) items = fl_value_new_list(); + g_autoptr(FlValue) prefixs = fl_value_new_list(); + g_autoptr(FirebaseStorageInternalListResult) pigeon_result = + firebase_storage_internal_list_result_new(items, nullptr, prefixs); + firebase_storage_firebase_storage_host_api_respond_reference_list_all( + response_handle, pigeon_result); +} + +static void HandleReferenceGetData( + FirebaseStorageInternalStorageFirebaseApp* app, + FirebaseStorageInternalStorageReference* reference, int64_t max_size, + FirebaseStorageFirebaseStorageHostApiResponseHandle* response_handle, + gpointer user_data) { + StorageReference cpp_reference = + GetCPPStorageReferenceFromPigeon(app, reference); + + // Use a shared pointer for automatic memory management and copyability + auto byte_buffer = std::make_shared>(max_size); + + Future future_result = + cpp_reference.GetBytes(byte_buffer->data(), max_size); + g_usleep(1000); // timing for c++ sdk grabbing a mutex + g_object_ref(response_handle); + future_result.OnCompletion([response_handle, + byte_buffer](const Future& data_result) { + if (data_result.error() == firebase::storage::kErrorNone) { + size_t vector_size = *data_result.result(); + auto vector_buffer = std::make_shared>( + byte_buffer->begin(), byte_buffer->begin() + vector_size); + RunOnMainThread([response_handle, vector_buffer]() { + firebase_storage_firebase_storage_host_api_respond_reference_get_data( + response_handle, vector_buffer->data(), vector_buffer->size()); + g_object_unref(response_handle); + }); + } else { + std::string code = ParseErrorCode(data_result); + std::string message = ParseErrorMessage(data_result); + RunOnMainThread([response_handle, code, message]() { + firebase_storage_firebase_storage_host_api_respond_error_reference_get_data( + response_handle, code.c_str(), message.c_str(), nullptr); + g_object_unref(response_handle); + }); + } + }); +} + +static void HandleReferencePutData( + FirebaseStorageInternalStorageFirebaseApp* app, + FirebaseStorageInternalStorageReference* reference, const uint8_t* data, + size_t data_length, + FirebaseStorageInternalSettableMetadata* settable_meta_data, int64_t handle, + FirebaseStorageFirebaseStorageHostApiResponseHandle* response_handle, + gpointer user_data) { + Storage* cpp_storage = GetCPPStorageFromPigeon( + app, firebase_storage_internal_storage_reference_get_bucket(reference)); + controllers_[handle] = std::make_unique(); + + auto handler = std::make_unique( + cpp_storage, + firebase_storage_internal_storage_reference_get_full_path(reference), + data, data_length, controllers_[handle].get(), settable_meta_data); + + std::string channel_id = RegisterEventChannel( + std::string(kStorageMethodChannelName) + "/" + kStorageTaskEventName, + std::move(handler)); + + firebase_storage_firebase_storage_host_api_respond_reference_put_data( + response_handle, channel_id.c_str()); +} + +static void HandleReferencePutString( + FirebaseStorageInternalStorageFirebaseApp* app, + FirebaseStorageInternalStorageReference* reference, const gchar* data, + int64_t format, FirebaseStorageInternalSettableMetadata* settable_meta_data, + int64_t handle, + FirebaseStorageFirebaseStorageHostApiResponseHandle* response_handle, + gpointer user_data) { + Storage* cpp_storage = GetCPPStorageFromPigeon( + app, firebase_storage_internal_storage_reference_get_bucket(reference)); + controllers_[handle] = std::make_unique(); + + std::vector decoded_data = + firebase_storage_desktop::StringToByteData(data, format); + + auto handler = std::make_unique( + cpp_storage, + firebase_storage_internal_storage_reference_get_full_path(reference), + decoded_data.data(), decoded_data.size(), controllers_[handle].get(), + settable_meta_data); + + std::string channel_id = RegisterEventChannel( + std::string(kStorageMethodChannelName) + "/" + kStorageTaskEventName, + std::move(handler)); + + firebase_storage_firebase_storage_host_api_respond_reference_put_string( + response_handle, channel_id.c_str()); +} + +static void HandleReferencePutFile( + FirebaseStorageInternalStorageFirebaseApp* app, + FirebaseStorageInternalStorageReference* reference, const gchar* file_path, + FirebaseStorageInternalSettableMetadata* settable_meta_data, int64_t handle, + FirebaseStorageFirebaseStorageHostApiResponseHandle* response_handle, + gpointer user_data) { + Storage* cpp_storage = GetCPPStorageFromPigeon( + app, firebase_storage_internal_storage_reference_get_bucket(reference)); + controllers_[handle] = std::make_unique(); + + auto handler = std::make_unique( + cpp_storage, + firebase_storage_internal_storage_reference_get_full_path(reference), + file_path, controllers_[handle].get(), settable_meta_data); + + std::string channel_id = RegisterEventChannel( + std::string(kStorageMethodChannelName) + "/" + kStorageTaskEventName, + std::move(handler)); + + firebase_storage_firebase_storage_host_api_respond_reference_put_file( + response_handle, channel_id.c_str()); +} + +static void HandleReferenceDownloadFile( + FirebaseStorageInternalStorageFirebaseApp* app, + FirebaseStorageInternalStorageReference* reference, const gchar* file_path, + int64_t handle, + FirebaseStorageFirebaseStorageHostApiResponseHandle* response_handle, + gpointer user_data) { + Storage* cpp_storage = GetCPPStorageFromPigeon( + app, firebase_storage_internal_storage_reference_get_bucket(reference)); + controllers_[handle] = std::make_unique(); + + auto handler = std::make_unique( + cpp_storage, + firebase_storage_internal_storage_reference_get_full_path(reference), + file_path, controllers_[handle].get()); + + std::string channel_id = RegisterEventChannel( + std::string(kStorageMethodChannelName) + "/" + kStorageTaskEventName, + std::move(handler)); + + firebase_storage_firebase_storage_host_api_respond_reference_download_file( + response_handle, channel_id.c_str()); +} + +static void HandleReferenceUpdateMetadata( + FirebaseStorageInternalStorageFirebaseApp* app, + FirebaseStorageInternalStorageReference* reference, + FirebaseStorageInternalSettableMetadata* metadata, + FirebaseStorageFirebaseStorageHostApiResponseHandle* response_handle, + gpointer user_data) { + StorageReference cpp_reference = + GetCPPStorageReferenceFromPigeon(app, reference); + std::unique_ptr cpp_meta(CreateStorageMetadataFromPigeon(metadata)); + if (!cpp_meta) { + // Improvement over the Windows implementation, which dereferences the + // null metadata pointer when nothing is set. + cpp_meta = std::make_unique(); + } + + Future future_result = cpp_reference.UpdateMetadata(*cpp_meta); + g_usleep(1000); // timing for c++ sdk grabbing a mutex + g_object_ref(response_handle); + future_result.OnCompletion([response_handle]( + const Future& data_result) { + if (data_result.error() == firebase::storage::kErrorNone) { + Metadata result_meta = *data_result.result(); + RunOnMainThread([response_handle, result_meta]() { + g_autoptr(FlValue) meta_map = ConvertMedadataToPigeon(&result_meta); + g_autoptr(FirebaseStorageInternalFullMetaData) pigeon_data = + firebase_storage_internal_full_meta_data_new(meta_map); + firebase_storage_firebase_storage_host_api_respond_reference_update_metadata( + response_handle, pigeon_data); + g_object_unref(response_handle); + }); + } else { + std::string code = ParseErrorCode(data_result); + std::string message = ParseErrorMessage(data_result); + RunOnMainThread([response_handle, code, message]() { + firebase_storage_firebase_storage_host_api_respond_error_reference_update_metadata( + response_handle, code.c_str(), message.c_str(), nullptr); + g_object_unref(response_handle); + }); + } + }); +} + +// Builds the {status, snapshot: {bytesTransferred, totalBytes}} map returned +// by taskPause/taskResume/taskCancel. +// Ownership: returns a new reference (transfer full). +static FlValue* CreateTaskStatusResult(bool status, Controller* controller) { + FlValue* task_result = fl_value_new_map(); + g_autoptr(FlValue) task_data = fl_value_new_map(); + + fl_value_set_string_take(task_result, "status", fl_value_new_bool(status)); + fl_value_set_string_take(task_data, kTaskSnapshotBytesTransferred, + fl_value_new_int(controller->bytes_transferred())); + fl_value_set_string_take(task_data, kTaskSnapshotTotalBytes, + fl_value_new_int(controller->total_byte_count())); + fl_value_set_string(task_result, kTaskSnapshotName, task_data); + return task_result; +} + +static void HandleTaskPause( + FirebaseStorageInternalStorageFirebaseApp* app, int64_t handle, + FirebaseStorageFirebaseStorageHostApiResponseHandle* response_handle, + gpointer user_data) { + auto it = controllers_.find(handle); + if (it == controllers_.end()) { + firebase_storage_firebase_storage_host_api_respond_error_task_pause( + response_handle, "unknown", "No task found with the given handle", + nullptr); + return; + } + bool status = it->second->Pause(); + g_autoptr(FlValue) task_result = + CreateTaskStatusResult(status, it->second.get()); + firebase_storage_firebase_storage_host_api_respond_task_pause(response_handle, + task_result); +} + +static void HandleTaskResume( + FirebaseStorageInternalStorageFirebaseApp* app, int64_t handle, + FirebaseStorageFirebaseStorageHostApiResponseHandle* response_handle, + gpointer user_data) { + auto it = controllers_.find(handle); + if (it == controllers_.end()) { + firebase_storage_firebase_storage_host_api_respond_error_task_resume( + response_handle, "unknown", "No task found with the given handle", + nullptr); + return; + } + bool status = it->second->Resume(); + g_autoptr(FlValue) task_result = + CreateTaskStatusResult(status, it->second.get()); + firebase_storage_firebase_storage_host_api_respond_task_resume( + response_handle, task_result); +} + +static void HandleTaskCancel( + FirebaseStorageInternalStorageFirebaseApp* app, int64_t handle, + FirebaseStorageFirebaseStorageHostApiResponseHandle* response_handle, + gpointer user_data) { + auto it = controllers_.find(handle); + if (it == controllers_.end()) { + firebase_storage_firebase_storage_host_api_respond_error_task_cancel( + response_handle, "unknown", "No task found with the given handle", + nullptr); + return; + } + bool status = it->second->Cancel(); + g_autoptr(FlValue) task_result = + CreateTaskStatusResult(status, it->second.get()); + firebase_storage_firebase_storage_host_api_respond_task_cancel( + response_handle, task_result); +} + +static const FirebaseStorageFirebaseStorageHostApiVTable + kFirebaseStorageHostApiVTable = { + HandleGetReferencebyPath, // get_referenceby_path + HandleSetMaxOperationRetryTime, // set_max_operation_retry_time + HandleSetMaxUploadRetryTime, // set_max_upload_retry_time + HandleSetMaxDownloadRetryTime, // set_max_download_retry_time + HandleUseStorageEmulator, // use_storage_emulator + HandleReferenceDelete, // reference_delete + HandleReferenceGetDownloadURL, // reference_get_download_u_r_l + HandleReferenceGetMetaData, // reference_get_meta_data + HandleReferenceList, // reference_list + HandleReferenceListAll, // reference_list_all + HandleReferenceGetData, // reference_get_data + HandleReferencePutData, // reference_put_data + HandleReferencePutString, // reference_put_string + HandleReferencePutFile, // reference_put_file + HandleReferenceDownloadFile, // reference_download_file + HandleReferenceUpdateMetadata, // reference_update_metadata + HandleTaskPause, // task_pause + HandleTaskResume, // task_resume + HandleTaskCancel, // task_cancel +}; + +static void firebase_storage_plugin_dispose(GObject* object) { + G_OBJECT_CLASS(firebase_storage_plugin_parent_class)->dispose(object); +} + +static void firebase_storage_plugin_class_init( + FirebaseStoragePluginClass* klass) { + G_OBJECT_CLASS(klass)->dispose = firebase_storage_plugin_dispose; +} + +static void firebase_storage_plugin_init(FirebaseStoragePlugin* self) {} + +void firebase_storage_plugin_register_with_registrar( + FlPluginRegistrar* registrar) { + FirebaseStoragePlugin* plugin = FIREBASE_STORAGE_PLUGIN( + g_object_new(firebase_storage_plugin_get_type(), nullptr)); + + FlBinaryMessenger* messenger = fl_plugin_registrar_get_messenger(registrar); + messenger_ = FL_BINARY_MESSENGER(g_object_ref(messenger)); + firebase_storage_firebase_storage_host_api_set_method_handlers( + messenger, /* suffix= */ nullptr, &kFirebaseStorageHostApiVTable, + g_object_ref(plugin), g_object_unref); + + g_object_unref(plugin); + + // Register for platform logging + App::RegisterLibrary(kLibraryName, + firebase_storage_linux::getPluginVersion().c_str(), + nullptr); +} diff --git a/packages/firebase_storage/firebase_storage/linux/include/firebase_storage/firebase_storage_plugin.h b/packages/firebase_storage/firebase_storage/linux/include/firebase_storage/firebase_storage_plugin.h new file mode 100644 index 000000000000..a6cb46f19f79 --- /dev/null +++ b/packages/firebase_storage/firebase_storage/linux/include/firebase_storage/firebase_storage_plugin.h @@ -0,0 +1,32 @@ +/* + * Copyright 2026, the Chromium project authors. Please see the AUTHORS file + * for details. All rights reserved. Use of this source code is governed by a + * BSD-style license that can be found in the LICENSE file. + */ + +#ifndef FLUTTER_PLUGIN_FIREBASE_STORAGE_PLUGIN_H_ +#define FLUTTER_PLUGIN_FIREBASE_STORAGE_PLUGIN_H_ + +#include + +G_BEGIN_DECLS + +#ifdef FLUTTER_PLUGIN_IMPL +#define FLUTTER_PLUGIN_EXPORT __attribute__((visibility("default"))) +#else +#define FLUTTER_PLUGIN_EXPORT +#endif + +typedef struct _FirebaseStoragePlugin FirebaseStoragePlugin; +typedef struct { + GObjectClass parent_class; +} FirebaseStoragePluginClass; + +FLUTTER_PLUGIN_EXPORT GType firebase_storage_plugin_get_type(); + +FLUTTER_PLUGIN_EXPORT void firebase_storage_plugin_register_with_registrar( + FlPluginRegistrar* registrar); + +G_END_DECLS + +#endif // FLUTTER_PLUGIN_FIREBASE_STORAGE_PLUGIN_H_ diff --git a/packages/firebase_storage/firebase_storage/linux/messages.g.cc b/packages/firebase_storage/firebase_storage/linux/messages.g.cc new file mode 100644 index 000000000000..c7f56522ce46 --- /dev/null +++ b/packages/firebase_storage/firebase_storage/linux/messages.g.cc @@ -0,0 +1,4517 @@ +// Copyright 2023, the Chromium project authors. Please see the AUTHORS file +// for details. All rights reserved. Use of this source code is governed by a +// BSD-style license that can be found in the LICENSE file. +// Autogenerated from Pigeon (v26.3.4), do not edit directly. +// See also: https://pub.dev/packages/pigeon + +#include "messages.g.h" + +#include + +#include +static guint G_GNUC_UNUSED flpigeon_hash_double(double v) { + if (std::isnan(v)) { + return static_cast(0x7FF80000); + } + if (v == 0.0) { + v = 0.0; + } + union { + double d; + uint64_t u; + } u; + u.d = v; + return static_cast(u.u ^ (u.u >> 32)); +} +static gboolean G_GNUC_UNUSED flpigeon_equals_double(double a, double b) { + return (a == b) || (std::isnan(a) && std::isnan(b)); +} +static gboolean G_GNUC_UNUSED flpigeon_deep_equals(FlValue* a, FlValue* b) { + if (a == b) { + return TRUE; + } + if (a == nullptr || b == nullptr) { + return FALSE; + } + if (fl_value_get_type(a) != fl_value_get_type(b)) { + return FALSE; + } + switch (fl_value_get_type(a)) { + case FL_VALUE_TYPE_NULL: + return TRUE; + case FL_VALUE_TYPE_BOOL: + return fl_value_get_bool(a) == fl_value_get_bool(b); + case FL_VALUE_TYPE_INT: + return fl_value_get_int(a) == fl_value_get_int(b); + case FL_VALUE_TYPE_FLOAT: { + return flpigeon_equals_double(fl_value_get_float(a), + fl_value_get_float(b)); + } + case FL_VALUE_TYPE_STRING: + return g_strcmp0(fl_value_get_string(a), fl_value_get_string(b)) == 0; + case FL_VALUE_TYPE_UINT8_LIST: + return fl_value_get_length(a) == fl_value_get_length(b) && + memcmp(fl_value_get_uint8_list(a), fl_value_get_uint8_list(b), + fl_value_get_length(a)) == 0; + case FL_VALUE_TYPE_INT32_LIST: + return fl_value_get_length(a) == fl_value_get_length(b) && + memcmp(fl_value_get_int32_list(a), fl_value_get_int32_list(b), + fl_value_get_length(a) * sizeof(int32_t)) == 0; + case FL_VALUE_TYPE_INT64_LIST: + return fl_value_get_length(a) == fl_value_get_length(b) && + memcmp(fl_value_get_int64_list(a), fl_value_get_int64_list(b), + fl_value_get_length(a) * sizeof(int64_t)) == 0; + case FL_VALUE_TYPE_FLOAT_LIST: { + size_t len = fl_value_get_length(a); + if (len != fl_value_get_length(b)) { + return FALSE; + } + const double* a_data = fl_value_get_float_list(a); + const double* b_data = fl_value_get_float_list(b); + for (size_t i = 0; i < len; i++) { + if (!flpigeon_equals_double(a_data[i], b_data[i])) { + return FALSE; + } + } + return TRUE; + } + case FL_VALUE_TYPE_LIST: { + size_t len = fl_value_get_length(a); + if (len != fl_value_get_length(b)) { + return FALSE; + } + for (size_t i = 0; i < len; i++) { + if (!flpigeon_deep_equals(fl_value_get_list_value(a, i), + fl_value_get_list_value(b, i))) { + return FALSE; + } + } + return TRUE; + } + case FL_VALUE_TYPE_MAP: { + size_t len = fl_value_get_length(a); + if (len != fl_value_get_length(b)) { + return FALSE; + } + for (size_t i = 0; i < len; i++) { + FlValue* key = fl_value_get_map_key(a, i); + FlValue* val = fl_value_get_map_value(a, i); + gboolean found = FALSE; + for (size_t j = 0; j < len; j++) { + FlValue* b_key = fl_value_get_map_key(b, j); + if (flpigeon_deep_equals(key, b_key)) { + FlValue* b_val = fl_value_get_map_value(b, j); + if (flpigeon_deep_equals(val, b_val)) { + found = TRUE; + break; + } else { + return FALSE; + } + } + } + if (!found) { + return FALSE; + } + } + return TRUE; + } + default: + return FALSE; + } + return FALSE; +} +static guint G_GNUC_UNUSED flpigeon_deep_hash(FlValue* value) { + if (value == nullptr) { + return 0; + } + switch (fl_value_get_type(value)) { + case FL_VALUE_TYPE_NULL: + return 0; + case FL_VALUE_TYPE_BOOL: + return fl_value_get_bool(value) ? 1231 : 1237; + case FL_VALUE_TYPE_INT: { + int64_t v = fl_value_get_int(value); + return static_cast(v ^ (v >> 32)); + } + case FL_VALUE_TYPE_FLOAT: + return flpigeon_hash_double(fl_value_get_float(value)); + case FL_VALUE_TYPE_STRING: + return g_str_hash(fl_value_get_string(value)); + case FL_VALUE_TYPE_UINT8_LIST: { + guint result = 1; + size_t len = fl_value_get_length(value); + const uint8_t* data = fl_value_get_uint8_list(value); + for (size_t i = 0; i < len; i++) { + result = result * 31 + data[i]; + } + return result; + } + case FL_VALUE_TYPE_INT32_LIST: { + guint result = 1; + size_t len = fl_value_get_length(value); + const int32_t* data = fl_value_get_int32_list(value); + for (size_t i = 0; i < len; i++) { + result = result * 31 + static_cast(data[i]); + } + return result; + } + case FL_VALUE_TYPE_INT64_LIST: { + guint result = 1; + size_t len = fl_value_get_length(value); + const int64_t* data = fl_value_get_int64_list(value); + for (size_t i = 0; i < len; i++) { + result = result * 31 + static_cast(data[i] ^ (data[i] >> 32)); + } + return result; + } + case FL_VALUE_TYPE_FLOAT_LIST: { + guint result = 1; + size_t len = fl_value_get_length(value); + const double* data = fl_value_get_float_list(value); + for (size_t i = 0; i < len; i++) { + result = result * 31 + flpigeon_hash_double(data[i]); + } + return result; + } + case FL_VALUE_TYPE_LIST: { + guint result = 1; + size_t len = fl_value_get_length(value); + for (size_t i = 0; i < len; i++) { + result = + result * 31 + flpigeon_deep_hash(fl_value_get_list_value(value, i)); + } + return result; + } + case FL_VALUE_TYPE_MAP: { + guint result = 0; + size_t len = fl_value_get_length(value); + for (size_t i = 0; i < len; i++) { + result += ((flpigeon_deep_hash(fl_value_get_map_key(value, i)) * 31) ^ + flpigeon_deep_hash(fl_value_get_map_value(value, i))); + } + return result; + } + default: + return static_cast(fl_value_get_type(value)); + } + return 0; +} + +struct _FirebaseStorageInternalStorageFirebaseApp { + GObject parent_instance; + + gchar* app_name; + gchar* tenant_id; + gchar* bucket; +}; + +G_DEFINE_TYPE(FirebaseStorageInternalStorageFirebaseApp, + firebase_storage_internal_storage_firebase_app, G_TYPE_OBJECT) + +static void firebase_storage_internal_storage_firebase_app_dispose( + GObject* object) { + FirebaseStorageInternalStorageFirebaseApp* self = + FIREBASE_STORAGE_INTERNAL_STORAGE_FIREBASE_APP(object); + g_clear_pointer(&self->app_name, g_free); + g_clear_pointer(&self->tenant_id, g_free); + g_clear_pointer(&self->bucket, g_free); + G_OBJECT_CLASS(firebase_storage_internal_storage_firebase_app_parent_class) + ->dispose(object); +} + +static void firebase_storage_internal_storage_firebase_app_init( + FirebaseStorageInternalStorageFirebaseApp* self) {} + +static void firebase_storage_internal_storage_firebase_app_class_init( + FirebaseStorageInternalStorageFirebaseAppClass* klass) { + G_OBJECT_CLASS(klass)->dispose = + firebase_storage_internal_storage_firebase_app_dispose; +} + +FirebaseStorageInternalStorageFirebaseApp* +firebase_storage_internal_storage_firebase_app_new(const gchar* app_name, + const gchar* tenant_id, + const gchar* bucket) { + FirebaseStorageInternalStorageFirebaseApp* self = + FIREBASE_STORAGE_INTERNAL_STORAGE_FIREBASE_APP(g_object_new( + firebase_storage_internal_storage_firebase_app_get_type(), nullptr)); + self->app_name = g_strdup(app_name); + if (tenant_id != nullptr) { + self->tenant_id = g_strdup(tenant_id); + } else { + self->tenant_id = nullptr; + } + self->bucket = g_strdup(bucket); + return self; +} + +const gchar* firebase_storage_internal_storage_firebase_app_get_app_name( + FirebaseStorageInternalStorageFirebaseApp* self) { + g_return_val_if_fail(FIREBASE_STORAGE_IS_INTERNAL_STORAGE_FIREBASE_APP(self), + nullptr); + return self->app_name; +} + +const gchar* firebase_storage_internal_storage_firebase_app_get_tenant_id( + FirebaseStorageInternalStorageFirebaseApp* self) { + g_return_val_if_fail(FIREBASE_STORAGE_IS_INTERNAL_STORAGE_FIREBASE_APP(self), + nullptr); + return self->tenant_id; +} + +const gchar* firebase_storage_internal_storage_firebase_app_get_bucket( + FirebaseStorageInternalStorageFirebaseApp* self) { + g_return_val_if_fail(FIREBASE_STORAGE_IS_INTERNAL_STORAGE_FIREBASE_APP(self), + nullptr); + return self->bucket; +} + +static FlValue* firebase_storage_internal_storage_firebase_app_to_list( + FirebaseStorageInternalStorageFirebaseApp* self) { + FlValue* values = fl_value_new_list(); + fl_value_append_take(values, fl_value_new_string(self->app_name)); + fl_value_append_take(values, self->tenant_id != nullptr + ? fl_value_new_string(self->tenant_id) + : fl_value_new_null()); + fl_value_append_take(values, fl_value_new_string(self->bucket)); + return values; +} + +static FirebaseStorageInternalStorageFirebaseApp* +firebase_storage_internal_storage_firebase_app_new_from_list(FlValue* values) { + FlValue* value0 = fl_value_get_list_value(values, 0); + const gchar* app_name = fl_value_get_string(value0); + FlValue* value1 = fl_value_get_list_value(values, 1); + const gchar* tenant_id = nullptr; + if (fl_value_get_type(value1) != FL_VALUE_TYPE_NULL) { + tenant_id = fl_value_get_string(value1); + } + FlValue* value2 = fl_value_get_list_value(values, 2); + const gchar* bucket = fl_value_get_string(value2); + return firebase_storage_internal_storage_firebase_app_new(app_name, tenant_id, + bucket); +} + +gboolean firebase_storage_internal_storage_firebase_app_equals( + FirebaseStorageInternalStorageFirebaseApp* a, + FirebaseStorageInternalStorageFirebaseApp* b) { + if (a == b) { + return TRUE; + } + if (a == nullptr || b == nullptr) { + return FALSE; + } + if (g_strcmp0(a->app_name, b->app_name) != 0) { + return FALSE; + } + if (g_strcmp0(a->tenant_id, b->tenant_id) != 0) { + return FALSE; + } + if (g_strcmp0(a->bucket, b->bucket) != 0) { + return FALSE; + } + return TRUE; +} + +guint firebase_storage_internal_storage_firebase_app_hash( + FirebaseStorageInternalStorageFirebaseApp* self) { + g_return_val_if_fail(FIREBASE_STORAGE_IS_INTERNAL_STORAGE_FIREBASE_APP(self), + 0); + guint result = 0; + result = result * 31 + + (self->app_name != nullptr ? g_str_hash(self->app_name) : 0); + result = result * 31 + + (self->tenant_id != nullptr ? g_str_hash(self->tenant_id) : 0); + result = + result * 31 + (self->bucket != nullptr ? g_str_hash(self->bucket) : 0); + return result; +} + +struct _FirebaseStorageInternalStorageReference { + GObject parent_instance; + + gchar* bucket; + gchar* full_path; + gchar* name; +}; + +G_DEFINE_TYPE(FirebaseStorageInternalStorageReference, + firebase_storage_internal_storage_reference, G_TYPE_OBJECT) + +static void firebase_storage_internal_storage_reference_dispose( + GObject* object) { + FirebaseStorageInternalStorageReference* self = + FIREBASE_STORAGE_INTERNAL_STORAGE_REFERENCE(object); + g_clear_pointer(&self->bucket, g_free); + g_clear_pointer(&self->full_path, g_free); + g_clear_pointer(&self->name, g_free); + G_OBJECT_CLASS(firebase_storage_internal_storage_reference_parent_class) + ->dispose(object); +} + +static void firebase_storage_internal_storage_reference_init( + FirebaseStorageInternalStorageReference* self) {} + +static void firebase_storage_internal_storage_reference_class_init( + FirebaseStorageInternalStorageReferenceClass* klass) { + G_OBJECT_CLASS(klass)->dispose = + firebase_storage_internal_storage_reference_dispose; +} + +FirebaseStorageInternalStorageReference* +firebase_storage_internal_storage_reference_new(const gchar* bucket, + const gchar* full_path, + const gchar* name) { + FirebaseStorageInternalStorageReference* self = + FIREBASE_STORAGE_INTERNAL_STORAGE_REFERENCE(g_object_new( + firebase_storage_internal_storage_reference_get_type(), nullptr)); + self->bucket = g_strdup(bucket); + self->full_path = g_strdup(full_path); + self->name = g_strdup(name); + return self; +} + +const gchar* firebase_storage_internal_storage_reference_get_bucket( + FirebaseStorageInternalStorageReference* self) { + g_return_val_if_fail(FIREBASE_STORAGE_IS_INTERNAL_STORAGE_REFERENCE(self), + nullptr); + return self->bucket; +} + +const gchar* firebase_storage_internal_storage_reference_get_full_path( + FirebaseStorageInternalStorageReference* self) { + g_return_val_if_fail(FIREBASE_STORAGE_IS_INTERNAL_STORAGE_REFERENCE(self), + nullptr); + return self->full_path; +} + +const gchar* firebase_storage_internal_storage_reference_get_name( + FirebaseStorageInternalStorageReference* self) { + g_return_val_if_fail(FIREBASE_STORAGE_IS_INTERNAL_STORAGE_REFERENCE(self), + nullptr); + return self->name; +} + +static FlValue* firebase_storage_internal_storage_reference_to_list( + FirebaseStorageInternalStorageReference* self) { + FlValue* values = fl_value_new_list(); + fl_value_append_take(values, fl_value_new_string(self->bucket)); + fl_value_append_take(values, fl_value_new_string(self->full_path)); + fl_value_append_take(values, fl_value_new_string(self->name)); + return values; +} + +static FirebaseStorageInternalStorageReference* +firebase_storage_internal_storage_reference_new_from_list(FlValue* values) { + FlValue* value0 = fl_value_get_list_value(values, 0); + const gchar* bucket = fl_value_get_string(value0); + FlValue* value1 = fl_value_get_list_value(values, 1); + const gchar* full_path = fl_value_get_string(value1); + FlValue* value2 = fl_value_get_list_value(values, 2); + const gchar* name = fl_value_get_string(value2); + return firebase_storage_internal_storage_reference_new(bucket, full_path, + name); +} + +gboolean firebase_storage_internal_storage_reference_equals( + FirebaseStorageInternalStorageReference* a, + FirebaseStorageInternalStorageReference* b) { + if (a == b) { + return TRUE; + } + if (a == nullptr || b == nullptr) { + return FALSE; + } + if (g_strcmp0(a->bucket, b->bucket) != 0) { + return FALSE; + } + if (g_strcmp0(a->full_path, b->full_path) != 0) { + return FALSE; + } + if (g_strcmp0(a->name, b->name) != 0) { + return FALSE; + } + return TRUE; +} + +guint firebase_storage_internal_storage_reference_hash( + FirebaseStorageInternalStorageReference* self) { + g_return_val_if_fail(FIREBASE_STORAGE_IS_INTERNAL_STORAGE_REFERENCE(self), 0); + guint result = 0; + result = + result * 31 + (self->bucket != nullptr ? g_str_hash(self->bucket) : 0); + result = result * 31 + + (self->full_path != nullptr ? g_str_hash(self->full_path) : 0); + result = result * 31 + (self->name != nullptr ? g_str_hash(self->name) : 0); + return result; +} + +struct _FirebaseStorageInternalFullMetaData { + GObject parent_instance; + + FlValue* metadata; +}; + +G_DEFINE_TYPE(FirebaseStorageInternalFullMetaData, + firebase_storage_internal_full_meta_data, G_TYPE_OBJECT) + +static void firebase_storage_internal_full_meta_data_dispose(GObject* object) { + FirebaseStorageInternalFullMetaData* self = + FIREBASE_STORAGE_INTERNAL_FULL_META_DATA(object); + g_clear_pointer(&self->metadata, fl_value_unref); + G_OBJECT_CLASS(firebase_storage_internal_full_meta_data_parent_class) + ->dispose(object); +} + +static void firebase_storage_internal_full_meta_data_init( + FirebaseStorageInternalFullMetaData* self) {} + +static void firebase_storage_internal_full_meta_data_class_init( + FirebaseStorageInternalFullMetaDataClass* klass) { + G_OBJECT_CLASS(klass)->dispose = + firebase_storage_internal_full_meta_data_dispose; +} + +FirebaseStorageInternalFullMetaData* +firebase_storage_internal_full_meta_data_new(FlValue* metadata) { + FirebaseStorageInternalFullMetaData* self = + FIREBASE_STORAGE_INTERNAL_FULL_META_DATA(g_object_new( + firebase_storage_internal_full_meta_data_get_type(), nullptr)); + if (metadata != nullptr) { + self->metadata = fl_value_ref(metadata); + } else { + self->metadata = nullptr; + } + return self; +} + +FlValue* firebase_storage_internal_full_meta_data_get_metadata( + FirebaseStorageInternalFullMetaData* self) { + g_return_val_if_fail(FIREBASE_STORAGE_IS_INTERNAL_FULL_META_DATA(self), + nullptr); + return self->metadata; +} + +static FlValue* firebase_storage_internal_full_meta_data_to_list( + FirebaseStorageInternalFullMetaData* self) { + FlValue* values = fl_value_new_list(); + fl_value_append_take(values, self->metadata != nullptr + ? fl_value_ref(self->metadata) + : fl_value_new_null()); + return values; +} + +static FirebaseStorageInternalFullMetaData* +firebase_storage_internal_full_meta_data_new_from_list(FlValue* values) { + FlValue* value0 = fl_value_get_list_value(values, 0); + FlValue* metadata = nullptr; + if (fl_value_get_type(value0) != FL_VALUE_TYPE_NULL) { + metadata = value0; + } + return firebase_storage_internal_full_meta_data_new(metadata); +} + +gboolean firebase_storage_internal_full_meta_data_equals( + FirebaseStorageInternalFullMetaData* a, + FirebaseStorageInternalFullMetaData* b) { + if (a == b) { + return TRUE; + } + if (a == nullptr || b == nullptr) { + return FALSE; + } + if (!flpigeon_deep_equals(a->metadata, b->metadata)) { + return FALSE; + } + return TRUE; +} + +guint firebase_storage_internal_full_meta_data_hash( + FirebaseStorageInternalFullMetaData* self) { + g_return_val_if_fail(FIREBASE_STORAGE_IS_INTERNAL_FULL_META_DATA(self), 0); + guint result = 0; + result = result * 31 + flpigeon_deep_hash(self->metadata); + return result; +} + +struct _FirebaseStorageInternalListOptions { + GObject parent_instance; + + int64_t max_results; + gchar* page_token; +}; + +G_DEFINE_TYPE(FirebaseStorageInternalListOptions, + firebase_storage_internal_list_options, G_TYPE_OBJECT) + +static void firebase_storage_internal_list_options_dispose(GObject* object) { + FirebaseStorageInternalListOptions* self = + FIREBASE_STORAGE_INTERNAL_LIST_OPTIONS(object); + g_clear_pointer(&self->page_token, g_free); + G_OBJECT_CLASS(firebase_storage_internal_list_options_parent_class) + ->dispose(object); +} + +static void firebase_storage_internal_list_options_init( + FirebaseStorageInternalListOptions* self) {} + +static void firebase_storage_internal_list_options_class_init( + FirebaseStorageInternalListOptionsClass* klass) { + G_OBJECT_CLASS(klass)->dispose = + firebase_storage_internal_list_options_dispose; +} + +FirebaseStorageInternalListOptions* firebase_storage_internal_list_options_new( + int64_t max_results, const gchar* page_token) { + FirebaseStorageInternalListOptions* self = + FIREBASE_STORAGE_INTERNAL_LIST_OPTIONS(g_object_new( + firebase_storage_internal_list_options_get_type(), nullptr)); + self->max_results = max_results; + if (page_token != nullptr) { + self->page_token = g_strdup(page_token); + } else { + self->page_token = nullptr; + } + return self; +} + +int64_t firebase_storage_internal_list_options_get_max_results( + FirebaseStorageInternalListOptions* self) { + g_return_val_if_fail(FIREBASE_STORAGE_IS_INTERNAL_LIST_OPTIONS(self), 0); + return self->max_results; +} + +const gchar* firebase_storage_internal_list_options_get_page_token( + FirebaseStorageInternalListOptions* self) { + g_return_val_if_fail(FIREBASE_STORAGE_IS_INTERNAL_LIST_OPTIONS(self), + nullptr); + return self->page_token; +} + +static FlValue* firebase_storage_internal_list_options_to_list( + FirebaseStorageInternalListOptions* self) { + FlValue* values = fl_value_new_list(); + fl_value_append_take(values, fl_value_new_int(self->max_results)); + fl_value_append_take(values, self->page_token != nullptr + ? fl_value_new_string(self->page_token) + : fl_value_new_null()); + return values; +} + +static FirebaseStorageInternalListOptions* +firebase_storage_internal_list_options_new_from_list(FlValue* values) { + FlValue* value0 = fl_value_get_list_value(values, 0); + int64_t max_results = fl_value_get_int(value0); + FlValue* value1 = fl_value_get_list_value(values, 1); + const gchar* page_token = nullptr; + if (fl_value_get_type(value1) != FL_VALUE_TYPE_NULL) { + page_token = fl_value_get_string(value1); + } + return firebase_storage_internal_list_options_new(max_results, page_token); +} + +gboolean firebase_storage_internal_list_options_equals( + FirebaseStorageInternalListOptions* a, + FirebaseStorageInternalListOptions* b) { + if (a == b) { + return TRUE; + } + if (a == nullptr || b == nullptr) { + return FALSE; + } + if (a->max_results != b->max_results) { + return FALSE; + } + if (g_strcmp0(a->page_token, b->page_token) != 0) { + return FALSE; + } + return TRUE; +} + +guint firebase_storage_internal_list_options_hash( + FirebaseStorageInternalListOptions* self) { + g_return_val_if_fail(FIREBASE_STORAGE_IS_INTERNAL_LIST_OPTIONS(self), 0); + guint result = 0; + result = result * 31 + static_cast(self->max_results); + result = result * 31 + + (self->page_token != nullptr ? g_str_hash(self->page_token) : 0); + return result; +} + +struct _FirebaseStorageInternalSettableMetadata { + GObject parent_instance; + + gchar* cache_control; + gchar* content_disposition; + gchar* content_encoding; + gchar* content_language; + gchar* content_type; + FlValue* custom_metadata; +}; + +G_DEFINE_TYPE(FirebaseStorageInternalSettableMetadata, + firebase_storage_internal_settable_metadata, G_TYPE_OBJECT) + +static void firebase_storage_internal_settable_metadata_dispose( + GObject* object) { + FirebaseStorageInternalSettableMetadata* self = + FIREBASE_STORAGE_INTERNAL_SETTABLE_METADATA(object); + g_clear_pointer(&self->cache_control, g_free); + g_clear_pointer(&self->content_disposition, g_free); + g_clear_pointer(&self->content_encoding, g_free); + g_clear_pointer(&self->content_language, g_free); + g_clear_pointer(&self->content_type, g_free); + g_clear_pointer(&self->custom_metadata, fl_value_unref); + G_OBJECT_CLASS(firebase_storage_internal_settable_metadata_parent_class) + ->dispose(object); +} + +static void firebase_storage_internal_settable_metadata_init( + FirebaseStorageInternalSettableMetadata* self) {} + +static void firebase_storage_internal_settable_metadata_class_init( + FirebaseStorageInternalSettableMetadataClass* klass) { + G_OBJECT_CLASS(klass)->dispose = + firebase_storage_internal_settable_metadata_dispose; +} + +FirebaseStorageInternalSettableMetadata* +firebase_storage_internal_settable_metadata_new( + const gchar* cache_control, const gchar* content_disposition, + const gchar* content_encoding, const gchar* content_language, + const gchar* content_type, FlValue* custom_metadata) { + FirebaseStorageInternalSettableMetadata* self = + FIREBASE_STORAGE_INTERNAL_SETTABLE_METADATA(g_object_new( + firebase_storage_internal_settable_metadata_get_type(), nullptr)); + if (cache_control != nullptr) { + self->cache_control = g_strdup(cache_control); + } else { + self->cache_control = nullptr; + } + if (content_disposition != nullptr) { + self->content_disposition = g_strdup(content_disposition); + } else { + self->content_disposition = nullptr; + } + if (content_encoding != nullptr) { + self->content_encoding = g_strdup(content_encoding); + } else { + self->content_encoding = nullptr; + } + if (content_language != nullptr) { + self->content_language = g_strdup(content_language); + } else { + self->content_language = nullptr; + } + if (content_type != nullptr) { + self->content_type = g_strdup(content_type); + } else { + self->content_type = nullptr; + } + if (custom_metadata != nullptr) { + self->custom_metadata = fl_value_ref(custom_metadata); + } else { + self->custom_metadata = nullptr; + } + return self; +} + +const gchar* firebase_storage_internal_settable_metadata_get_cache_control( + FirebaseStorageInternalSettableMetadata* self) { + g_return_val_if_fail(FIREBASE_STORAGE_IS_INTERNAL_SETTABLE_METADATA(self), + nullptr); + return self->cache_control; +} + +const gchar* +firebase_storage_internal_settable_metadata_get_content_disposition( + FirebaseStorageInternalSettableMetadata* self) { + g_return_val_if_fail(FIREBASE_STORAGE_IS_INTERNAL_SETTABLE_METADATA(self), + nullptr); + return self->content_disposition; +} + +const gchar* firebase_storage_internal_settable_metadata_get_content_encoding( + FirebaseStorageInternalSettableMetadata* self) { + g_return_val_if_fail(FIREBASE_STORAGE_IS_INTERNAL_SETTABLE_METADATA(self), + nullptr); + return self->content_encoding; +} + +const gchar* firebase_storage_internal_settable_metadata_get_content_language( + FirebaseStorageInternalSettableMetadata* self) { + g_return_val_if_fail(FIREBASE_STORAGE_IS_INTERNAL_SETTABLE_METADATA(self), + nullptr); + return self->content_language; +} + +const gchar* firebase_storage_internal_settable_metadata_get_content_type( + FirebaseStorageInternalSettableMetadata* self) { + g_return_val_if_fail(FIREBASE_STORAGE_IS_INTERNAL_SETTABLE_METADATA(self), + nullptr); + return self->content_type; +} + +FlValue* firebase_storage_internal_settable_metadata_get_custom_metadata( + FirebaseStorageInternalSettableMetadata* self) { + g_return_val_if_fail(FIREBASE_STORAGE_IS_INTERNAL_SETTABLE_METADATA(self), + nullptr); + return self->custom_metadata; +} + +static FlValue* firebase_storage_internal_settable_metadata_to_list( + FirebaseStorageInternalSettableMetadata* self) { + FlValue* values = fl_value_new_list(); + fl_value_append_take(values, self->cache_control != nullptr + ? fl_value_new_string(self->cache_control) + : fl_value_new_null()); + fl_value_append_take(values, + self->content_disposition != nullptr + ? fl_value_new_string(self->content_disposition) + : fl_value_new_null()); + fl_value_append_take(values, self->content_encoding != nullptr + ? fl_value_new_string(self->content_encoding) + : fl_value_new_null()); + fl_value_append_take(values, self->content_language != nullptr + ? fl_value_new_string(self->content_language) + : fl_value_new_null()); + fl_value_append_take(values, self->content_type != nullptr + ? fl_value_new_string(self->content_type) + : fl_value_new_null()); + fl_value_append_take(values, self->custom_metadata != nullptr + ? fl_value_ref(self->custom_metadata) + : fl_value_new_null()); + return values; +} + +static FirebaseStorageInternalSettableMetadata* +firebase_storage_internal_settable_metadata_new_from_list(FlValue* values) { + FlValue* value0 = fl_value_get_list_value(values, 0); + const gchar* cache_control = nullptr; + if (fl_value_get_type(value0) != FL_VALUE_TYPE_NULL) { + cache_control = fl_value_get_string(value0); + } + FlValue* value1 = fl_value_get_list_value(values, 1); + const gchar* content_disposition = nullptr; + if (fl_value_get_type(value1) != FL_VALUE_TYPE_NULL) { + content_disposition = fl_value_get_string(value1); + } + FlValue* value2 = fl_value_get_list_value(values, 2); + const gchar* content_encoding = nullptr; + if (fl_value_get_type(value2) != FL_VALUE_TYPE_NULL) { + content_encoding = fl_value_get_string(value2); + } + FlValue* value3 = fl_value_get_list_value(values, 3); + const gchar* content_language = nullptr; + if (fl_value_get_type(value3) != FL_VALUE_TYPE_NULL) { + content_language = fl_value_get_string(value3); + } + FlValue* value4 = fl_value_get_list_value(values, 4); + const gchar* content_type = nullptr; + if (fl_value_get_type(value4) != FL_VALUE_TYPE_NULL) { + content_type = fl_value_get_string(value4); + } + FlValue* value5 = fl_value_get_list_value(values, 5); + FlValue* custom_metadata = nullptr; + if (fl_value_get_type(value5) != FL_VALUE_TYPE_NULL) { + custom_metadata = value5; + } + return firebase_storage_internal_settable_metadata_new( + cache_control, content_disposition, content_encoding, content_language, + content_type, custom_metadata); +} + +gboolean firebase_storage_internal_settable_metadata_equals( + FirebaseStorageInternalSettableMetadata* a, + FirebaseStorageInternalSettableMetadata* b) { + if (a == b) { + return TRUE; + } + if (a == nullptr || b == nullptr) { + return FALSE; + } + if (g_strcmp0(a->cache_control, b->cache_control) != 0) { + return FALSE; + } + if (g_strcmp0(a->content_disposition, b->content_disposition) != 0) { + return FALSE; + } + if (g_strcmp0(a->content_encoding, b->content_encoding) != 0) { + return FALSE; + } + if (g_strcmp0(a->content_language, b->content_language) != 0) { + return FALSE; + } + if (g_strcmp0(a->content_type, b->content_type) != 0) { + return FALSE; + } + if (!flpigeon_deep_equals(a->custom_metadata, b->custom_metadata)) { + return FALSE; + } + return TRUE; +} + +guint firebase_storage_internal_settable_metadata_hash( + FirebaseStorageInternalSettableMetadata* self) { + g_return_val_if_fail(FIREBASE_STORAGE_IS_INTERNAL_SETTABLE_METADATA(self), 0); + guint result = 0; + result = + result * 31 + + (self->cache_control != nullptr ? g_str_hash(self->cache_control) : 0); + result = result * 31 + (self->content_disposition != nullptr + ? g_str_hash(self->content_disposition) + : 0); + result = result * 31 + (self->content_encoding != nullptr + ? g_str_hash(self->content_encoding) + : 0); + result = result * 31 + (self->content_language != nullptr + ? g_str_hash(self->content_language) + : 0); + result = result * 31 + + (self->content_type != nullptr ? g_str_hash(self->content_type) : 0); + result = result * 31 + flpigeon_deep_hash(self->custom_metadata); + return result; +} + +struct _FirebaseStorageInternalStorageTaskSnapShot { + GObject parent_instance; + + int64_t bytes_transferred; + FirebaseStorageInternalFullMetaData* metadata; + FirebaseStorageInternalStorageTaskState state; + int64_t total_bytes; +}; + +G_DEFINE_TYPE(FirebaseStorageInternalStorageTaskSnapShot, + firebase_storage_internal_storage_task_snap_shot, G_TYPE_OBJECT) + +static void firebase_storage_internal_storage_task_snap_shot_dispose( + GObject* object) { + FirebaseStorageInternalStorageTaskSnapShot* self = + FIREBASE_STORAGE_INTERNAL_STORAGE_TASK_SNAP_SHOT(object); + g_clear_object(&self->metadata); + G_OBJECT_CLASS(firebase_storage_internal_storage_task_snap_shot_parent_class) + ->dispose(object); +} + +static void firebase_storage_internal_storage_task_snap_shot_init( + FirebaseStorageInternalStorageTaskSnapShot* self) {} + +static void firebase_storage_internal_storage_task_snap_shot_class_init( + FirebaseStorageInternalStorageTaskSnapShotClass* klass) { + G_OBJECT_CLASS(klass)->dispose = + firebase_storage_internal_storage_task_snap_shot_dispose; +} + +FirebaseStorageInternalStorageTaskSnapShot* +firebase_storage_internal_storage_task_snap_shot_new( + int64_t bytes_transferred, FirebaseStorageInternalFullMetaData* metadata, + FirebaseStorageInternalStorageTaskState state, int64_t total_bytes) { + FirebaseStorageInternalStorageTaskSnapShot* self = + FIREBASE_STORAGE_INTERNAL_STORAGE_TASK_SNAP_SHOT(g_object_new( + firebase_storage_internal_storage_task_snap_shot_get_type(), + nullptr)); + self->bytes_transferred = bytes_transferred; + if (metadata != nullptr) { + self->metadata = + FIREBASE_STORAGE_INTERNAL_FULL_META_DATA(g_object_ref(metadata)); + } else { + self->metadata = nullptr; + } + self->state = state; + self->total_bytes = total_bytes; + return self; +} + +int64_t firebase_storage_internal_storage_task_snap_shot_get_bytes_transferred( + FirebaseStorageInternalStorageTaskSnapShot* self) { + g_return_val_if_fail( + FIREBASE_STORAGE_IS_INTERNAL_STORAGE_TASK_SNAP_SHOT(self), 0); + return self->bytes_transferred; +} + +FirebaseStorageInternalFullMetaData* +firebase_storage_internal_storage_task_snap_shot_get_metadata( + FirebaseStorageInternalStorageTaskSnapShot* self) { + g_return_val_if_fail( + FIREBASE_STORAGE_IS_INTERNAL_STORAGE_TASK_SNAP_SHOT(self), nullptr); + return self->metadata; +} + +FirebaseStorageInternalStorageTaskState +firebase_storage_internal_storage_task_snap_shot_get_state( + FirebaseStorageInternalStorageTaskSnapShot* self) { + g_return_val_if_fail( + FIREBASE_STORAGE_IS_INTERNAL_STORAGE_TASK_SNAP_SHOT(self), + static_cast(0)); + return self->state; +} + +int64_t firebase_storage_internal_storage_task_snap_shot_get_total_bytes( + FirebaseStorageInternalStorageTaskSnapShot* self) { + g_return_val_if_fail( + FIREBASE_STORAGE_IS_INTERNAL_STORAGE_TASK_SNAP_SHOT(self), 0); + return self->total_bytes; +} + +static FlValue* firebase_storage_internal_storage_task_snap_shot_to_list( + FirebaseStorageInternalStorageTaskSnapShot* self) { + FlValue* values = fl_value_new_list(); + fl_value_append_take(values, fl_value_new_int(self->bytes_transferred)); + fl_value_append_take( + values, self->metadata != nullptr + ? fl_value_new_custom_object( + firebase_storage_internal_full_meta_data_type_id, + G_OBJECT(self->metadata)) + : fl_value_new_null()); + fl_value_append_take( + values, + fl_value_new_custom(firebase_storage_internal_storage_task_state_type_id, + fl_value_new_int(self->state), + (GDestroyNotify)fl_value_unref)); + fl_value_append_take(values, fl_value_new_int(self->total_bytes)); + return values; +} + +static FirebaseStorageInternalStorageTaskSnapShot* +firebase_storage_internal_storage_task_snap_shot_new_from_list( + FlValue* values) { + FlValue* value0 = fl_value_get_list_value(values, 0); + int64_t bytes_transferred = fl_value_get_int(value0); + FlValue* value1 = fl_value_get_list_value(values, 1); + FirebaseStorageInternalFullMetaData* metadata = nullptr; + if (fl_value_get_type(value1) != FL_VALUE_TYPE_NULL) { + metadata = FIREBASE_STORAGE_INTERNAL_FULL_META_DATA( + fl_value_get_custom_value_object(value1)); + } + FlValue* value2 = fl_value_get_list_value(values, 2); + FirebaseStorageInternalStorageTaskState state = + static_cast( + fl_value_get_int(reinterpret_cast( + const_cast(fl_value_get_custom_value(value2))))); + FlValue* value3 = fl_value_get_list_value(values, 3); + int64_t total_bytes = fl_value_get_int(value3); + return firebase_storage_internal_storage_task_snap_shot_new( + bytes_transferred, metadata, state, total_bytes); +} + +gboolean firebase_storage_internal_storage_task_snap_shot_equals( + FirebaseStorageInternalStorageTaskSnapShot* a, + FirebaseStorageInternalStorageTaskSnapShot* b) { + if (a == b) { + return TRUE; + } + if (a == nullptr || b == nullptr) { + return FALSE; + } + if (a->bytes_transferred != b->bytes_transferred) { + return FALSE; + } + if (!firebase_storage_internal_full_meta_data_equals(a->metadata, + b->metadata)) { + return FALSE; + } + if (a->state != b->state) { + return FALSE; + } + if (a->total_bytes != b->total_bytes) { + return FALSE; + } + return TRUE; +} + +guint firebase_storage_internal_storage_task_snap_shot_hash( + FirebaseStorageInternalStorageTaskSnapShot* self) { + g_return_val_if_fail( + FIREBASE_STORAGE_IS_INTERNAL_STORAGE_TASK_SNAP_SHOT(self), 0); + guint result = 0; + result = result * 31 + static_cast(self->bytes_transferred); + result = result * 31 + + firebase_storage_internal_full_meta_data_hash(self->metadata); + result = result * 31 + static_cast(self->state); + result = result * 31 + static_cast(self->total_bytes); + return result; +} + +struct _FirebaseStorageInternalListResult { + GObject parent_instance; + + FlValue* items; + gchar* page_token; + FlValue* prefixs; +}; + +G_DEFINE_TYPE(FirebaseStorageInternalListResult, + firebase_storage_internal_list_result, G_TYPE_OBJECT) + +static void firebase_storage_internal_list_result_dispose(GObject* object) { + FirebaseStorageInternalListResult* self = + FIREBASE_STORAGE_INTERNAL_LIST_RESULT(object); + g_clear_pointer(&self->items, fl_value_unref); + g_clear_pointer(&self->page_token, g_free); + g_clear_pointer(&self->prefixs, fl_value_unref); + G_OBJECT_CLASS(firebase_storage_internal_list_result_parent_class) + ->dispose(object); +} + +static void firebase_storage_internal_list_result_init( + FirebaseStorageInternalListResult* self) {} + +static void firebase_storage_internal_list_result_class_init( + FirebaseStorageInternalListResultClass* klass) { + G_OBJECT_CLASS(klass)->dispose = + firebase_storage_internal_list_result_dispose; +} + +FirebaseStorageInternalListResult* firebase_storage_internal_list_result_new( + FlValue* items, const gchar* page_token, FlValue* prefixs) { + FirebaseStorageInternalListResult* self = + FIREBASE_STORAGE_INTERNAL_LIST_RESULT(g_object_new( + firebase_storage_internal_list_result_get_type(), nullptr)); + self->items = fl_value_ref(items); + if (page_token != nullptr) { + self->page_token = g_strdup(page_token); + } else { + self->page_token = nullptr; + } + self->prefixs = fl_value_ref(prefixs); + return self; +} + +FlValue* firebase_storage_internal_list_result_get_items( + FirebaseStorageInternalListResult* self) { + g_return_val_if_fail(FIREBASE_STORAGE_IS_INTERNAL_LIST_RESULT(self), nullptr); + return self->items; +} + +const gchar* firebase_storage_internal_list_result_get_page_token( + FirebaseStorageInternalListResult* self) { + g_return_val_if_fail(FIREBASE_STORAGE_IS_INTERNAL_LIST_RESULT(self), nullptr); + return self->page_token; +} + +FlValue* firebase_storage_internal_list_result_get_prefixs( + FirebaseStorageInternalListResult* self) { + g_return_val_if_fail(FIREBASE_STORAGE_IS_INTERNAL_LIST_RESULT(self), nullptr); + return self->prefixs; +} + +static FlValue* firebase_storage_internal_list_result_to_list( + FirebaseStorageInternalListResult* self) { + FlValue* values = fl_value_new_list(); + fl_value_append_take(values, fl_value_ref(self->items)); + fl_value_append_take(values, self->page_token != nullptr + ? fl_value_new_string(self->page_token) + : fl_value_new_null()); + fl_value_append_take(values, fl_value_ref(self->prefixs)); + return values; +} + +static FirebaseStorageInternalListResult* +firebase_storage_internal_list_result_new_from_list(FlValue* values) { + FlValue* value0 = fl_value_get_list_value(values, 0); + FlValue* items = value0; + FlValue* value1 = fl_value_get_list_value(values, 1); + const gchar* page_token = nullptr; + if (fl_value_get_type(value1) != FL_VALUE_TYPE_NULL) { + page_token = fl_value_get_string(value1); + } + FlValue* value2 = fl_value_get_list_value(values, 2); + FlValue* prefixs = value2; + return firebase_storage_internal_list_result_new(items, page_token, prefixs); +} + +gboolean firebase_storage_internal_list_result_equals( + FirebaseStorageInternalListResult* a, + FirebaseStorageInternalListResult* b) { + if (a == b) { + return TRUE; + } + if (a == nullptr || b == nullptr) { + return FALSE; + } + if (!flpigeon_deep_equals(a->items, b->items)) { + return FALSE; + } + if (g_strcmp0(a->page_token, b->page_token) != 0) { + return FALSE; + } + if (!flpigeon_deep_equals(a->prefixs, b->prefixs)) { + return FALSE; + } + return TRUE; +} + +guint firebase_storage_internal_list_result_hash( + FirebaseStorageInternalListResult* self) { + g_return_val_if_fail(FIREBASE_STORAGE_IS_INTERNAL_LIST_RESULT(self), 0); + guint result = 0; + result = result * 31 + flpigeon_deep_hash(self->items); + result = result * 31 + + (self->page_token != nullptr ? g_str_hash(self->page_token) : 0); + result = result * 31 + flpigeon_deep_hash(self->prefixs); + return result; +} + +struct _FirebaseStorageMessageCodec { + FlStandardMessageCodec parent_instance; +}; + +G_DEFINE_TYPE(FirebaseStorageMessageCodec, firebase_storage_message_codec, + fl_standard_message_codec_get_type()) + +const int firebase_storage_internal_storage_task_state_type_id = 129; +const int firebase_storage_internal_storage_firebase_app_type_id = 130; +const int firebase_storage_internal_storage_reference_type_id = 131; +const int firebase_storage_internal_full_meta_data_type_id = 132; +const int firebase_storage_internal_list_options_type_id = 133; +const int firebase_storage_internal_settable_metadata_type_id = 134; +const int firebase_storage_internal_storage_task_snap_shot_type_id = 135; +const int firebase_storage_internal_list_result_type_id = 136; + +static gboolean +firebase_storage_message_codec_write_firebase_storage_internal_storage_task_state( + FlStandardMessageCodec* codec, GByteArray* buffer, FlValue* value, + GError** error) { + uint8_t type = firebase_storage_internal_storage_task_state_type_id; + g_byte_array_append(buffer, &type, sizeof(uint8_t)); + return fl_standard_message_codec_write_value(codec, buffer, value, error); +} + +static gboolean +firebase_storage_message_codec_write_firebase_storage_internal_storage_firebase_app( + FlStandardMessageCodec* codec, GByteArray* buffer, + FirebaseStorageInternalStorageFirebaseApp* value, GError** error) { + uint8_t type = firebase_storage_internal_storage_firebase_app_type_id; + g_byte_array_append(buffer, &type, sizeof(uint8_t)); + g_autoptr(FlValue) values = + firebase_storage_internal_storage_firebase_app_to_list(value); + return fl_standard_message_codec_write_value(codec, buffer, values, error); +} + +static gboolean +firebase_storage_message_codec_write_firebase_storage_internal_storage_reference( + FlStandardMessageCodec* codec, GByteArray* buffer, + FirebaseStorageInternalStorageReference* value, GError** error) { + uint8_t type = firebase_storage_internal_storage_reference_type_id; + g_byte_array_append(buffer, &type, sizeof(uint8_t)); + g_autoptr(FlValue) values = + firebase_storage_internal_storage_reference_to_list(value); + return fl_standard_message_codec_write_value(codec, buffer, values, error); +} + +static gboolean +firebase_storage_message_codec_write_firebase_storage_internal_full_meta_data( + FlStandardMessageCodec* codec, GByteArray* buffer, + FirebaseStorageInternalFullMetaData* value, GError** error) { + uint8_t type = firebase_storage_internal_full_meta_data_type_id; + g_byte_array_append(buffer, &type, sizeof(uint8_t)); + g_autoptr(FlValue) values = + firebase_storage_internal_full_meta_data_to_list(value); + return fl_standard_message_codec_write_value(codec, buffer, values, error); +} + +static gboolean +firebase_storage_message_codec_write_firebase_storage_internal_list_options( + FlStandardMessageCodec* codec, GByteArray* buffer, + FirebaseStorageInternalListOptions* value, GError** error) { + uint8_t type = firebase_storage_internal_list_options_type_id; + g_byte_array_append(buffer, &type, sizeof(uint8_t)); + g_autoptr(FlValue) values = + firebase_storage_internal_list_options_to_list(value); + return fl_standard_message_codec_write_value(codec, buffer, values, error); +} + +static gboolean +firebase_storage_message_codec_write_firebase_storage_internal_settable_metadata( + FlStandardMessageCodec* codec, GByteArray* buffer, + FirebaseStorageInternalSettableMetadata* value, GError** error) { + uint8_t type = firebase_storage_internal_settable_metadata_type_id; + g_byte_array_append(buffer, &type, sizeof(uint8_t)); + g_autoptr(FlValue) values = + firebase_storage_internal_settable_metadata_to_list(value); + return fl_standard_message_codec_write_value(codec, buffer, values, error); +} + +static gboolean +firebase_storage_message_codec_write_firebase_storage_internal_storage_task_snap_shot( + FlStandardMessageCodec* codec, GByteArray* buffer, + FirebaseStorageInternalStorageTaskSnapShot* value, GError** error) { + uint8_t type = firebase_storage_internal_storage_task_snap_shot_type_id; + g_byte_array_append(buffer, &type, sizeof(uint8_t)); + g_autoptr(FlValue) values = + firebase_storage_internal_storage_task_snap_shot_to_list(value); + return fl_standard_message_codec_write_value(codec, buffer, values, error); +} + +static gboolean +firebase_storage_message_codec_write_firebase_storage_internal_list_result( + FlStandardMessageCodec* codec, GByteArray* buffer, + FirebaseStorageInternalListResult* value, GError** error) { + uint8_t type = firebase_storage_internal_list_result_type_id; + g_byte_array_append(buffer, &type, sizeof(uint8_t)); + g_autoptr(FlValue) values = + firebase_storage_internal_list_result_to_list(value); + return fl_standard_message_codec_write_value(codec, buffer, values, error); +} + +static gboolean firebase_storage_message_codec_write_value( + FlStandardMessageCodec* codec, GByteArray* buffer, FlValue* value, + GError** error) { + if (fl_value_get_type(value) == FL_VALUE_TYPE_CUSTOM) { + switch (fl_value_get_custom_type(value)) { + case firebase_storage_internal_storage_task_state_type_id: + return firebase_storage_message_codec_write_firebase_storage_internal_storage_task_state( + codec, buffer, + reinterpret_cast( + const_cast(fl_value_get_custom_value(value))), + error); + case firebase_storage_internal_storage_firebase_app_type_id: + return firebase_storage_message_codec_write_firebase_storage_internal_storage_firebase_app( + codec, buffer, + FIREBASE_STORAGE_INTERNAL_STORAGE_FIREBASE_APP( + fl_value_get_custom_value_object(value)), + error); + case firebase_storage_internal_storage_reference_type_id: + return firebase_storage_message_codec_write_firebase_storage_internal_storage_reference( + codec, buffer, + FIREBASE_STORAGE_INTERNAL_STORAGE_REFERENCE( + fl_value_get_custom_value_object(value)), + error); + case firebase_storage_internal_full_meta_data_type_id: + return firebase_storage_message_codec_write_firebase_storage_internal_full_meta_data( + codec, buffer, + FIREBASE_STORAGE_INTERNAL_FULL_META_DATA( + fl_value_get_custom_value_object(value)), + error); + case firebase_storage_internal_list_options_type_id: + return firebase_storage_message_codec_write_firebase_storage_internal_list_options( + codec, buffer, + FIREBASE_STORAGE_INTERNAL_LIST_OPTIONS( + fl_value_get_custom_value_object(value)), + error); + case firebase_storage_internal_settable_metadata_type_id: + return firebase_storage_message_codec_write_firebase_storage_internal_settable_metadata( + codec, buffer, + FIREBASE_STORAGE_INTERNAL_SETTABLE_METADATA( + fl_value_get_custom_value_object(value)), + error); + case firebase_storage_internal_storage_task_snap_shot_type_id: + return firebase_storage_message_codec_write_firebase_storage_internal_storage_task_snap_shot( + codec, buffer, + FIREBASE_STORAGE_INTERNAL_STORAGE_TASK_SNAP_SHOT( + fl_value_get_custom_value_object(value)), + error); + case firebase_storage_internal_list_result_type_id: + return firebase_storage_message_codec_write_firebase_storage_internal_list_result( + codec, buffer, + FIREBASE_STORAGE_INTERNAL_LIST_RESULT( + fl_value_get_custom_value_object(value)), + error); + } + } + + return FL_STANDARD_MESSAGE_CODEC_CLASS( + firebase_storage_message_codec_parent_class) + ->write_value(codec, buffer, value, error); +} + +static FlValue* +firebase_storage_message_codec_read_firebase_storage_internal_storage_task_state( + FlStandardMessageCodec* codec, GBytes* buffer, size_t* offset, + GError** error) { + return fl_value_new_custom( + firebase_storage_internal_storage_task_state_type_id, + fl_standard_message_codec_read_value(codec, buffer, offset, error), + (GDestroyNotify)fl_value_unref); +} + +static FlValue* +firebase_storage_message_codec_read_firebase_storage_internal_storage_firebase_app( + FlStandardMessageCodec* codec, GBytes* buffer, size_t* offset, + GError** error) { + g_autoptr(FlValue) values = + fl_standard_message_codec_read_value(codec, buffer, offset, error); + if (values == nullptr) { + return nullptr; + } + + g_autoptr(FirebaseStorageInternalStorageFirebaseApp) value = + firebase_storage_internal_storage_firebase_app_new_from_list(values); + if (value == nullptr) { + g_set_error(error, FL_MESSAGE_CODEC_ERROR, FL_MESSAGE_CODEC_ERROR_FAILED, + "Invalid data received for MessageData"); + return nullptr; + } + + return fl_value_new_custom_object( + firebase_storage_internal_storage_firebase_app_type_id, G_OBJECT(value)); +} + +static FlValue* +firebase_storage_message_codec_read_firebase_storage_internal_storage_reference( + FlStandardMessageCodec* codec, GBytes* buffer, size_t* offset, + GError** error) { + g_autoptr(FlValue) values = + fl_standard_message_codec_read_value(codec, buffer, offset, error); + if (values == nullptr) { + return nullptr; + } + + g_autoptr(FirebaseStorageInternalStorageReference) value = + firebase_storage_internal_storage_reference_new_from_list(values); + if (value == nullptr) { + g_set_error(error, FL_MESSAGE_CODEC_ERROR, FL_MESSAGE_CODEC_ERROR_FAILED, + "Invalid data received for MessageData"); + return nullptr; + } + + return fl_value_new_custom_object( + firebase_storage_internal_storage_reference_type_id, G_OBJECT(value)); +} + +static FlValue* +firebase_storage_message_codec_read_firebase_storage_internal_full_meta_data( + FlStandardMessageCodec* codec, GBytes* buffer, size_t* offset, + GError** error) { + g_autoptr(FlValue) values = + fl_standard_message_codec_read_value(codec, buffer, offset, error); + if (values == nullptr) { + return nullptr; + } + + g_autoptr(FirebaseStorageInternalFullMetaData) value = + firebase_storage_internal_full_meta_data_new_from_list(values); + if (value == nullptr) { + g_set_error(error, FL_MESSAGE_CODEC_ERROR, FL_MESSAGE_CODEC_ERROR_FAILED, + "Invalid data received for MessageData"); + return nullptr; + } + + return fl_value_new_custom_object( + firebase_storage_internal_full_meta_data_type_id, G_OBJECT(value)); +} + +static FlValue* +firebase_storage_message_codec_read_firebase_storage_internal_list_options( + FlStandardMessageCodec* codec, GBytes* buffer, size_t* offset, + GError** error) { + g_autoptr(FlValue) values = + fl_standard_message_codec_read_value(codec, buffer, offset, error); + if (values == nullptr) { + return nullptr; + } + + g_autoptr(FirebaseStorageInternalListOptions) value = + firebase_storage_internal_list_options_new_from_list(values); + if (value == nullptr) { + g_set_error(error, FL_MESSAGE_CODEC_ERROR, FL_MESSAGE_CODEC_ERROR_FAILED, + "Invalid data received for MessageData"); + return nullptr; + } + + return fl_value_new_custom_object( + firebase_storage_internal_list_options_type_id, G_OBJECT(value)); +} + +static FlValue* +firebase_storage_message_codec_read_firebase_storage_internal_settable_metadata( + FlStandardMessageCodec* codec, GBytes* buffer, size_t* offset, + GError** error) { + g_autoptr(FlValue) values = + fl_standard_message_codec_read_value(codec, buffer, offset, error); + if (values == nullptr) { + return nullptr; + } + + g_autoptr(FirebaseStorageInternalSettableMetadata) value = + firebase_storage_internal_settable_metadata_new_from_list(values); + if (value == nullptr) { + g_set_error(error, FL_MESSAGE_CODEC_ERROR, FL_MESSAGE_CODEC_ERROR_FAILED, + "Invalid data received for MessageData"); + return nullptr; + } + + return fl_value_new_custom_object( + firebase_storage_internal_settable_metadata_type_id, G_OBJECT(value)); +} + +static FlValue* +firebase_storage_message_codec_read_firebase_storage_internal_storage_task_snap_shot( + FlStandardMessageCodec* codec, GBytes* buffer, size_t* offset, + GError** error) { + g_autoptr(FlValue) values = + fl_standard_message_codec_read_value(codec, buffer, offset, error); + if (values == nullptr) { + return nullptr; + } + + g_autoptr(FirebaseStorageInternalStorageTaskSnapShot) value = + firebase_storage_internal_storage_task_snap_shot_new_from_list(values); + if (value == nullptr) { + g_set_error(error, FL_MESSAGE_CODEC_ERROR, FL_MESSAGE_CODEC_ERROR_FAILED, + "Invalid data received for MessageData"); + return nullptr; + } + + return fl_value_new_custom_object( + firebase_storage_internal_storage_task_snap_shot_type_id, + G_OBJECT(value)); +} + +static FlValue* +firebase_storage_message_codec_read_firebase_storage_internal_list_result( + FlStandardMessageCodec* codec, GBytes* buffer, size_t* offset, + GError** error) { + g_autoptr(FlValue) values = + fl_standard_message_codec_read_value(codec, buffer, offset, error); + if (values == nullptr) { + return nullptr; + } + + g_autoptr(FirebaseStorageInternalListResult) value = + firebase_storage_internal_list_result_new_from_list(values); + if (value == nullptr) { + g_set_error(error, FL_MESSAGE_CODEC_ERROR, FL_MESSAGE_CODEC_ERROR_FAILED, + "Invalid data received for MessageData"); + return nullptr; + } + + return fl_value_new_custom_object( + firebase_storage_internal_list_result_type_id, G_OBJECT(value)); +} + +static FlValue* firebase_storage_message_codec_read_value_of_type( + FlStandardMessageCodec* codec, GBytes* buffer, size_t* offset, int type, + GError** error) { + switch (type) { + case firebase_storage_internal_storage_task_state_type_id: + return firebase_storage_message_codec_read_firebase_storage_internal_storage_task_state( + codec, buffer, offset, error); + case firebase_storage_internal_storage_firebase_app_type_id: + return firebase_storage_message_codec_read_firebase_storage_internal_storage_firebase_app( + codec, buffer, offset, error); + case firebase_storage_internal_storage_reference_type_id: + return firebase_storage_message_codec_read_firebase_storage_internal_storage_reference( + codec, buffer, offset, error); + case firebase_storage_internal_full_meta_data_type_id: + return firebase_storage_message_codec_read_firebase_storage_internal_full_meta_data( + codec, buffer, offset, error); + case firebase_storage_internal_list_options_type_id: + return firebase_storage_message_codec_read_firebase_storage_internal_list_options( + codec, buffer, offset, error); + case firebase_storage_internal_settable_metadata_type_id: + return firebase_storage_message_codec_read_firebase_storage_internal_settable_metadata( + codec, buffer, offset, error); + case firebase_storage_internal_storage_task_snap_shot_type_id: + return firebase_storage_message_codec_read_firebase_storage_internal_storage_task_snap_shot( + codec, buffer, offset, error); + case firebase_storage_internal_list_result_type_id: + return firebase_storage_message_codec_read_firebase_storage_internal_list_result( + codec, buffer, offset, error); + default: + return FL_STANDARD_MESSAGE_CODEC_CLASS( + firebase_storage_message_codec_parent_class) + ->read_value_of_type(codec, buffer, offset, type, error); + } +} + +static void firebase_storage_message_codec_init( + FirebaseStorageMessageCodec* self) {} + +static void firebase_storage_message_codec_class_init( + FirebaseStorageMessageCodecClass* klass) { + FL_STANDARD_MESSAGE_CODEC_CLASS(klass)->write_value = + firebase_storage_message_codec_write_value; + FL_STANDARD_MESSAGE_CODEC_CLASS(klass)->read_value_of_type = + firebase_storage_message_codec_read_value_of_type; +} + +static FirebaseStorageMessageCodec* firebase_storage_message_codec_new() { + FirebaseStorageMessageCodec* self = FIREBASE_STORAGE_MESSAGE_CODEC( + g_object_new(firebase_storage_message_codec_get_type(), nullptr)); + return self; +} + +struct _FirebaseStorageFirebaseStorageHostApiResponseHandle { + GObject parent_instance; + + FlBasicMessageChannel* channel; + FlBasicMessageChannelResponseHandle* response_handle; +}; + +G_DEFINE_TYPE(FirebaseStorageFirebaseStorageHostApiResponseHandle, + firebase_storage_firebase_storage_host_api_response_handle, + G_TYPE_OBJECT) + +static void firebase_storage_firebase_storage_host_api_response_handle_dispose( + GObject* object) { + FirebaseStorageFirebaseStorageHostApiResponseHandle* self = + FIREBASE_STORAGE_FIREBASE_STORAGE_HOST_API_RESPONSE_HANDLE(object); + g_clear_object(&self->channel); + g_clear_object(&self->response_handle); + G_OBJECT_CLASS( + firebase_storage_firebase_storage_host_api_response_handle_parent_class) + ->dispose(object); +} + +static void firebase_storage_firebase_storage_host_api_response_handle_init( + FirebaseStorageFirebaseStorageHostApiResponseHandle* self) {} + +static void +firebase_storage_firebase_storage_host_api_response_handle_class_init( + FirebaseStorageFirebaseStorageHostApiResponseHandleClass* klass) { + G_OBJECT_CLASS(klass)->dispose = + firebase_storage_firebase_storage_host_api_response_handle_dispose; +} + +static FirebaseStorageFirebaseStorageHostApiResponseHandle* +firebase_storage_firebase_storage_host_api_response_handle_new( + FlBasicMessageChannel* channel, + FlBasicMessageChannelResponseHandle* response_handle) { + FirebaseStorageFirebaseStorageHostApiResponseHandle* self = + FIREBASE_STORAGE_FIREBASE_STORAGE_HOST_API_RESPONSE_HANDLE(g_object_new( + firebase_storage_firebase_storage_host_api_response_handle_get_type(), + nullptr)); + self->channel = FL_BASIC_MESSAGE_CHANNEL(g_object_ref(channel)); + self->response_handle = + FL_BASIC_MESSAGE_CHANNEL_RESPONSE_HANDLE(g_object_ref(response_handle)); + return self; +} + +G_DECLARE_FINAL_TYPE( + FirebaseStorageFirebaseStorageHostApiGetReferencebyPathResponse, + firebase_storage_firebase_storage_host_api_get_referenceby_path_response, + FIREBASE_STORAGE, FIREBASE_STORAGE_HOST_API_GET_REFERENCEBY_PATH_RESPONSE, + GObject) + +struct _FirebaseStorageFirebaseStorageHostApiGetReferencebyPathResponse { + GObject parent_instance; + + FlValue* value; +}; + +G_DEFINE_TYPE( + FirebaseStorageFirebaseStorageHostApiGetReferencebyPathResponse, + firebase_storage_firebase_storage_host_api_get_referenceby_path_response, + G_TYPE_OBJECT) + +static void +firebase_storage_firebase_storage_host_api_get_referenceby_path_response_dispose( + GObject* object) { + FirebaseStorageFirebaseStorageHostApiGetReferencebyPathResponse* self = + FIREBASE_STORAGE_FIREBASE_STORAGE_HOST_API_GET_REFERENCEBY_PATH_RESPONSE( + object); + g_clear_pointer(&self->value, fl_value_unref); + G_OBJECT_CLASS( + firebase_storage_firebase_storage_host_api_get_referenceby_path_response_parent_class) + ->dispose(object); +} + +static void +firebase_storage_firebase_storage_host_api_get_referenceby_path_response_init( + FirebaseStorageFirebaseStorageHostApiGetReferencebyPathResponse* self) {} + +static void +firebase_storage_firebase_storage_host_api_get_referenceby_path_response_class_init( + FirebaseStorageFirebaseStorageHostApiGetReferencebyPathResponseClass* + klass) { + G_OBJECT_CLASS(klass)->dispose = + firebase_storage_firebase_storage_host_api_get_referenceby_path_response_dispose; +} + +static FirebaseStorageFirebaseStorageHostApiGetReferencebyPathResponse* +firebase_storage_firebase_storage_host_api_get_referenceby_path_response_new( + FirebaseStorageInternalStorageReference* return_value) { + FirebaseStorageFirebaseStorageHostApiGetReferencebyPathResponse* self = + FIREBASE_STORAGE_FIREBASE_STORAGE_HOST_API_GET_REFERENCEBY_PATH_RESPONSE( + g_object_new( + firebase_storage_firebase_storage_host_api_get_referenceby_path_response_get_type(), + nullptr)); + self->value = fl_value_new_list(); + fl_value_append_take(self->value, + fl_value_new_custom_object( + firebase_storage_internal_storage_reference_type_id, + G_OBJECT(return_value))); + return self; +} + +static FirebaseStorageFirebaseStorageHostApiGetReferencebyPathResponse* +firebase_storage_firebase_storage_host_api_get_referenceby_path_response_new_error( + const gchar* code, const gchar* message, FlValue* details) { + FirebaseStorageFirebaseStorageHostApiGetReferencebyPathResponse* self = + FIREBASE_STORAGE_FIREBASE_STORAGE_HOST_API_GET_REFERENCEBY_PATH_RESPONSE( + g_object_new( + firebase_storage_firebase_storage_host_api_get_referenceby_path_response_get_type(), + nullptr)); + self->value = fl_value_new_list(); + fl_value_append_take(self->value, fl_value_new_string(code)); + fl_value_append_take(self->value, + fl_value_new_string(message != nullptr ? message : "")); + fl_value_append_take(self->value, details != nullptr ? fl_value_ref(details) + : fl_value_new_null()); + return self; +} + +G_DECLARE_FINAL_TYPE( + FirebaseStorageFirebaseStorageHostApiSetMaxOperationRetryTimeResponse, + firebase_storage_firebase_storage_host_api_set_max_operation_retry_time_response, + FIREBASE_STORAGE, + FIREBASE_STORAGE_HOST_API_SET_MAX_OPERATION_RETRY_TIME_RESPONSE, GObject) + +struct _FirebaseStorageFirebaseStorageHostApiSetMaxOperationRetryTimeResponse { + GObject parent_instance; + + FlValue* value; +}; + +G_DEFINE_TYPE( + FirebaseStorageFirebaseStorageHostApiSetMaxOperationRetryTimeResponse, + firebase_storage_firebase_storage_host_api_set_max_operation_retry_time_response, + G_TYPE_OBJECT) + +static void +firebase_storage_firebase_storage_host_api_set_max_operation_retry_time_response_dispose( + GObject* object) { + FirebaseStorageFirebaseStorageHostApiSetMaxOperationRetryTimeResponse* self = + FIREBASE_STORAGE_FIREBASE_STORAGE_HOST_API_SET_MAX_OPERATION_RETRY_TIME_RESPONSE( + object); + g_clear_pointer(&self->value, fl_value_unref); + G_OBJECT_CLASS( + firebase_storage_firebase_storage_host_api_set_max_operation_retry_time_response_parent_class) + ->dispose(object); +} + +static void +firebase_storage_firebase_storage_host_api_set_max_operation_retry_time_response_init( + FirebaseStorageFirebaseStorageHostApiSetMaxOperationRetryTimeResponse* + self) {} + +static void +firebase_storage_firebase_storage_host_api_set_max_operation_retry_time_response_class_init( + FirebaseStorageFirebaseStorageHostApiSetMaxOperationRetryTimeResponseClass* + klass) { + G_OBJECT_CLASS(klass)->dispose = + firebase_storage_firebase_storage_host_api_set_max_operation_retry_time_response_dispose; +} + +static FirebaseStorageFirebaseStorageHostApiSetMaxOperationRetryTimeResponse* +firebase_storage_firebase_storage_host_api_set_max_operation_retry_time_response_new() { + FirebaseStorageFirebaseStorageHostApiSetMaxOperationRetryTimeResponse* self = + FIREBASE_STORAGE_FIREBASE_STORAGE_HOST_API_SET_MAX_OPERATION_RETRY_TIME_RESPONSE( + g_object_new( + firebase_storage_firebase_storage_host_api_set_max_operation_retry_time_response_get_type(), + nullptr)); + self->value = fl_value_new_list(); + fl_value_append_take(self->value, fl_value_new_null()); + return self; +} + +static FirebaseStorageFirebaseStorageHostApiSetMaxOperationRetryTimeResponse* +firebase_storage_firebase_storage_host_api_set_max_operation_retry_time_response_new_error( + const gchar* code, const gchar* message, FlValue* details) { + FirebaseStorageFirebaseStorageHostApiSetMaxOperationRetryTimeResponse* self = + FIREBASE_STORAGE_FIREBASE_STORAGE_HOST_API_SET_MAX_OPERATION_RETRY_TIME_RESPONSE( + g_object_new( + firebase_storage_firebase_storage_host_api_set_max_operation_retry_time_response_get_type(), + nullptr)); + self->value = fl_value_new_list(); + fl_value_append_take(self->value, fl_value_new_string(code)); + fl_value_append_take(self->value, + fl_value_new_string(message != nullptr ? message : "")); + fl_value_append_take(self->value, details != nullptr ? fl_value_ref(details) + : fl_value_new_null()); + return self; +} + +G_DECLARE_FINAL_TYPE( + FirebaseStorageFirebaseStorageHostApiSetMaxUploadRetryTimeResponse, + firebase_storage_firebase_storage_host_api_set_max_upload_retry_time_response, + FIREBASE_STORAGE, + FIREBASE_STORAGE_HOST_API_SET_MAX_UPLOAD_RETRY_TIME_RESPONSE, GObject) + +struct _FirebaseStorageFirebaseStorageHostApiSetMaxUploadRetryTimeResponse { + GObject parent_instance; + + FlValue* value; +}; + +G_DEFINE_TYPE( + FirebaseStorageFirebaseStorageHostApiSetMaxUploadRetryTimeResponse, + firebase_storage_firebase_storage_host_api_set_max_upload_retry_time_response, + G_TYPE_OBJECT) + +static void +firebase_storage_firebase_storage_host_api_set_max_upload_retry_time_response_dispose( + GObject* object) { + FirebaseStorageFirebaseStorageHostApiSetMaxUploadRetryTimeResponse* self = + FIREBASE_STORAGE_FIREBASE_STORAGE_HOST_API_SET_MAX_UPLOAD_RETRY_TIME_RESPONSE( + object); + g_clear_pointer(&self->value, fl_value_unref); + G_OBJECT_CLASS( + firebase_storage_firebase_storage_host_api_set_max_upload_retry_time_response_parent_class) + ->dispose(object); +} + +static void +firebase_storage_firebase_storage_host_api_set_max_upload_retry_time_response_init( + FirebaseStorageFirebaseStorageHostApiSetMaxUploadRetryTimeResponse* self) {} + +static void +firebase_storage_firebase_storage_host_api_set_max_upload_retry_time_response_class_init( + FirebaseStorageFirebaseStorageHostApiSetMaxUploadRetryTimeResponseClass* + klass) { + G_OBJECT_CLASS(klass)->dispose = + firebase_storage_firebase_storage_host_api_set_max_upload_retry_time_response_dispose; +} + +static FirebaseStorageFirebaseStorageHostApiSetMaxUploadRetryTimeResponse* +firebase_storage_firebase_storage_host_api_set_max_upload_retry_time_response_new() { + FirebaseStorageFirebaseStorageHostApiSetMaxUploadRetryTimeResponse* self = + FIREBASE_STORAGE_FIREBASE_STORAGE_HOST_API_SET_MAX_UPLOAD_RETRY_TIME_RESPONSE( + g_object_new( + firebase_storage_firebase_storage_host_api_set_max_upload_retry_time_response_get_type(), + nullptr)); + self->value = fl_value_new_list(); + fl_value_append_take(self->value, fl_value_new_null()); + return self; +} + +static FirebaseStorageFirebaseStorageHostApiSetMaxUploadRetryTimeResponse* +firebase_storage_firebase_storage_host_api_set_max_upload_retry_time_response_new_error( + const gchar* code, const gchar* message, FlValue* details) { + FirebaseStorageFirebaseStorageHostApiSetMaxUploadRetryTimeResponse* self = + FIREBASE_STORAGE_FIREBASE_STORAGE_HOST_API_SET_MAX_UPLOAD_RETRY_TIME_RESPONSE( + g_object_new( + firebase_storage_firebase_storage_host_api_set_max_upload_retry_time_response_get_type(), + nullptr)); + self->value = fl_value_new_list(); + fl_value_append_take(self->value, fl_value_new_string(code)); + fl_value_append_take(self->value, + fl_value_new_string(message != nullptr ? message : "")); + fl_value_append_take(self->value, details != nullptr ? fl_value_ref(details) + : fl_value_new_null()); + return self; +} + +G_DECLARE_FINAL_TYPE( + FirebaseStorageFirebaseStorageHostApiSetMaxDownloadRetryTimeResponse, + firebase_storage_firebase_storage_host_api_set_max_download_retry_time_response, + FIREBASE_STORAGE, + FIREBASE_STORAGE_HOST_API_SET_MAX_DOWNLOAD_RETRY_TIME_RESPONSE, GObject) + +struct _FirebaseStorageFirebaseStorageHostApiSetMaxDownloadRetryTimeResponse { + GObject parent_instance; + + FlValue* value; +}; + +G_DEFINE_TYPE( + FirebaseStorageFirebaseStorageHostApiSetMaxDownloadRetryTimeResponse, + firebase_storage_firebase_storage_host_api_set_max_download_retry_time_response, + G_TYPE_OBJECT) + +static void +firebase_storage_firebase_storage_host_api_set_max_download_retry_time_response_dispose( + GObject* object) { + FirebaseStorageFirebaseStorageHostApiSetMaxDownloadRetryTimeResponse* self = + FIREBASE_STORAGE_FIREBASE_STORAGE_HOST_API_SET_MAX_DOWNLOAD_RETRY_TIME_RESPONSE( + object); + g_clear_pointer(&self->value, fl_value_unref); + G_OBJECT_CLASS( + firebase_storage_firebase_storage_host_api_set_max_download_retry_time_response_parent_class) + ->dispose(object); +} + +static void +firebase_storage_firebase_storage_host_api_set_max_download_retry_time_response_init( + FirebaseStorageFirebaseStorageHostApiSetMaxDownloadRetryTimeResponse* + self) {} + +static void +firebase_storage_firebase_storage_host_api_set_max_download_retry_time_response_class_init( + FirebaseStorageFirebaseStorageHostApiSetMaxDownloadRetryTimeResponseClass* + klass) { + G_OBJECT_CLASS(klass)->dispose = + firebase_storage_firebase_storage_host_api_set_max_download_retry_time_response_dispose; +} + +static FirebaseStorageFirebaseStorageHostApiSetMaxDownloadRetryTimeResponse* +firebase_storage_firebase_storage_host_api_set_max_download_retry_time_response_new() { + FirebaseStorageFirebaseStorageHostApiSetMaxDownloadRetryTimeResponse* self = + FIREBASE_STORAGE_FIREBASE_STORAGE_HOST_API_SET_MAX_DOWNLOAD_RETRY_TIME_RESPONSE( + g_object_new( + firebase_storage_firebase_storage_host_api_set_max_download_retry_time_response_get_type(), + nullptr)); + self->value = fl_value_new_list(); + fl_value_append_take(self->value, fl_value_new_null()); + return self; +} + +static FirebaseStorageFirebaseStorageHostApiSetMaxDownloadRetryTimeResponse* +firebase_storage_firebase_storage_host_api_set_max_download_retry_time_response_new_error( + const gchar* code, const gchar* message, FlValue* details) { + FirebaseStorageFirebaseStorageHostApiSetMaxDownloadRetryTimeResponse* self = + FIREBASE_STORAGE_FIREBASE_STORAGE_HOST_API_SET_MAX_DOWNLOAD_RETRY_TIME_RESPONSE( + g_object_new( + firebase_storage_firebase_storage_host_api_set_max_download_retry_time_response_get_type(), + nullptr)); + self->value = fl_value_new_list(); + fl_value_append_take(self->value, fl_value_new_string(code)); + fl_value_append_take(self->value, + fl_value_new_string(message != nullptr ? message : "")); + fl_value_append_take(self->value, details != nullptr ? fl_value_ref(details) + : fl_value_new_null()); + return self; +} + +G_DECLARE_FINAL_TYPE( + FirebaseStorageFirebaseStorageHostApiUseStorageEmulatorResponse, + firebase_storage_firebase_storage_host_api_use_storage_emulator_response, + FIREBASE_STORAGE, FIREBASE_STORAGE_HOST_API_USE_STORAGE_EMULATOR_RESPONSE, + GObject) + +struct _FirebaseStorageFirebaseStorageHostApiUseStorageEmulatorResponse { + GObject parent_instance; + + FlValue* value; +}; + +G_DEFINE_TYPE( + FirebaseStorageFirebaseStorageHostApiUseStorageEmulatorResponse, + firebase_storage_firebase_storage_host_api_use_storage_emulator_response, + G_TYPE_OBJECT) + +static void +firebase_storage_firebase_storage_host_api_use_storage_emulator_response_dispose( + GObject* object) { + FirebaseStorageFirebaseStorageHostApiUseStorageEmulatorResponse* self = + FIREBASE_STORAGE_FIREBASE_STORAGE_HOST_API_USE_STORAGE_EMULATOR_RESPONSE( + object); + g_clear_pointer(&self->value, fl_value_unref); + G_OBJECT_CLASS( + firebase_storage_firebase_storage_host_api_use_storage_emulator_response_parent_class) + ->dispose(object); +} + +static void +firebase_storage_firebase_storage_host_api_use_storage_emulator_response_init( + FirebaseStorageFirebaseStorageHostApiUseStorageEmulatorResponse* self) {} + +static void +firebase_storage_firebase_storage_host_api_use_storage_emulator_response_class_init( + FirebaseStorageFirebaseStorageHostApiUseStorageEmulatorResponseClass* + klass) { + G_OBJECT_CLASS(klass)->dispose = + firebase_storage_firebase_storage_host_api_use_storage_emulator_response_dispose; +} + +static FirebaseStorageFirebaseStorageHostApiUseStorageEmulatorResponse* +firebase_storage_firebase_storage_host_api_use_storage_emulator_response_new() { + FirebaseStorageFirebaseStorageHostApiUseStorageEmulatorResponse* self = + FIREBASE_STORAGE_FIREBASE_STORAGE_HOST_API_USE_STORAGE_EMULATOR_RESPONSE( + g_object_new( + firebase_storage_firebase_storage_host_api_use_storage_emulator_response_get_type(), + nullptr)); + self->value = fl_value_new_list(); + fl_value_append_take(self->value, fl_value_new_null()); + return self; +} + +static FirebaseStorageFirebaseStorageHostApiUseStorageEmulatorResponse* +firebase_storage_firebase_storage_host_api_use_storage_emulator_response_new_error( + const gchar* code, const gchar* message, FlValue* details) { + FirebaseStorageFirebaseStorageHostApiUseStorageEmulatorResponse* self = + FIREBASE_STORAGE_FIREBASE_STORAGE_HOST_API_USE_STORAGE_EMULATOR_RESPONSE( + g_object_new( + firebase_storage_firebase_storage_host_api_use_storage_emulator_response_get_type(), + nullptr)); + self->value = fl_value_new_list(); + fl_value_append_take(self->value, fl_value_new_string(code)); + fl_value_append_take(self->value, + fl_value_new_string(message != nullptr ? message : "")); + fl_value_append_take(self->value, details != nullptr ? fl_value_ref(details) + : fl_value_new_null()); + return self; +} + +G_DECLARE_FINAL_TYPE( + FirebaseStorageFirebaseStorageHostApiReferenceDeleteResponse, + firebase_storage_firebase_storage_host_api_reference_delete_response, + FIREBASE_STORAGE, FIREBASE_STORAGE_HOST_API_REFERENCE_DELETE_RESPONSE, + GObject) + +struct _FirebaseStorageFirebaseStorageHostApiReferenceDeleteResponse { + GObject parent_instance; + + FlValue* value; +}; + +G_DEFINE_TYPE( + FirebaseStorageFirebaseStorageHostApiReferenceDeleteResponse, + firebase_storage_firebase_storage_host_api_reference_delete_response, + G_TYPE_OBJECT) + +static void +firebase_storage_firebase_storage_host_api_reference_delete_response_dispose( + GObject* object) { + FirebaseStorageFirebaseStorageHostApiReferenceDeleteResponse* self = + FIREBASE_STORAGE_FIREBASE_STORAGE_HOST_API_REFERENCE_DELETE_RESPONSE( + object); + g_clear_pointer(&self->value, fl_value_unref); + G_OBJECT_CLASS( + firebase_storage_firebase_storage_host_api_reference_delete_response_parent_class) + ->dispose(object); +} + +static void +firebase_storage_firebase_storage_host_api_reference_delete_response_init( + FirebaseStorageFirebaseStorageHostApiReferenceDeleteResponse* self) {} + +static void +firebase_storage_firebase_storage_host_api_reference_delete_response_class_init( + FirebaseStorageFirebaseStorageHostApiReferenceDeleteResponseClass* klass) { + G_OBJECT_CLASS(klass)->dispose = + firebase_storage_firebase_storage_host_api_reference_delete_response_dispose; +} + +static FirebaseStorageFirebaseStorageHostApiReferenceDeleteResponse* +firebase_storage_firebase_storage_host_api_reference_delete_response_new() { + FirebaseStorageFirebaseStorageHostApiReferenceDeleteResponse* self = + FIREBASE_STORAGE_FIREBASE_STORAGE_HOST_API_REFERENCE_DELETE_RESPONSE(g_object_new( + firebase_storage_firebase_storage_host_api_reference_delete_response_get_type(), + nullptr)); + self->value = fl_value_new_list(); + fl_value_append_take(self->value, fl_value_new_null()); + return self; +} + +static FirebaseStorageFirebaseStorageHostApiReferenceDeleteResponse* +firebase_storage_firebase_storage_host_api_reference_delete_response_new_error( + const gchar* code, const gchar* message, FlValue* details) { + FirebaseStorageFirebaseStorageHostApiReferenceDeleteResponse* self = + FIREBASE_STORAGE_FIREBASE_STORAGE_HOST_API_REFERENCE_DELETE_RESPONSE(g_object_new( + firebase_storage_firebase_storage_host_api_reference_delete_response_get_type(), + nullptr)); + self->value = fl_value_new_list(); + fl_value_append_take(self->value, fl_value_new_string(code)); + fl_value_append_take(self->value, + fl_value_new_string(message != nullptr ? message : "")); + fl_value_append_take(self->value, details != nullptr ? fl_value_ref(details) + : fl_value_new_null()); + return self; +} + +G_DECLARE_FINAL_TYPE( + FirebaseStorageFirebaseStorageHostApiReferenceGetDownloadURLResponse, + firebase_storage_firebase_storage_host_api_reference_get_download_u_r_l_response, + FIREBASE_STORAGE, + FIREBASE_STORAGE_HOST_API_REFERENCE_GET_DOWNLOAD_U_R_L_RESPONSE, GObject) + +struct _FirebaseStorageFirebaseStorageHostApiReferenceGetDownloadURLResponse { + GObject parent_instance; + + FlValue* value; +}; + +G_DEFINE_TYPE( + FirebaseStorageFirebaseStorageHostApiReferenceGetDownloadURLResponse, + firebase_storage_firebase_storage_host_api_reference_get_download_u_r_l_response, + G_TYPE_OBJECT) + +static void +firebase_storage_firebase_storage_host_api_reference_get_download_u_r_l_response_dispose( + GObject* object) { + FirebaseStorageFirebaseStorageHostApiReferenceGetDownloadURLResponse* self = + FIREBASE_STORAGE_FIREBASE_STORAGE_HOST_API_REFERENCE_GET_DOWNLOAD_U_R_L_RESPONSE( + object); + g_clear_pointer(&self->value, fl_value_unref); + G_OBJECT_CLASS( + firebase_storage_firebase_storage_host_api_reference_get_download_u_r_l_response_parent_class) + ->dispose(object); +} + +static void +firebase_storage_firebase_storage_host_api_reference_get_download_u_r_l_response_init( + FirebaseStorageFirebaseStorageHostApiReferenceGetDownloadURLResponse* + self) {} + +static void +firebase_storage_firebase_storage_host_api_reference_get_download_u_r_l_response_class_init( + FirebaseStorageFirebaseStorageHostApiReferenceGetDownloadURLResponseClass* + klass) { + G_OBJECT_CLASS(klass)->dispose = + firebase_storage_firebase_storage_host_api_reference_get_download_u_r_l_response_dispose; +} + +static FirebaseStorageFirebaseStorageHostApiReferenceGetDownloadURLResponse* +firebase_storage_firebase_storage_host_api_reference_get_download_u_r_l_response_new( + const gchar* return_value) { + FirebaseStorageFirebaseStorageHostApiReferenceGetDownloadURLResponse* self = + FIREBASE_STORAGE_FIREBASE_STORAGE_HOST_API_REFERENCE_GET_DOWNLOAD_U_R_L_RESPONSE( + g_object_new( + firebase_storage_firebase_storage_host_api_reference_get_download_u_r_l_response_get_type(), + nullptr)); + self->value = fl_value_new_list(); + fl_value_append_take(self->value, fl_value_new_string(return_value)); + return self; +} + +static FirebaseStorageFirebaseStorageHostApiReferenceGetDownloadURLResponse* +firebase_storage_firebase_storage_host_api_reference_get_download_u_r_l_response_new_error( + const gchar* code, const gchar* message, FlValue* details) { + FirebaseStorageFirebaseStorageHostApiReferenceGetDownloadURLResponse* self = + FIREBASE_STORAGE_FIREBASE_STORAGE_HOST_API_REFERENCE_GET_DOWNLOAD_U_R_L_RESPONSE( + g_object_new( + firebase_storage_firebase_storage_host_api_reference_get_download_u_r_l_response_get_type(), + nullptr)); + self->value = fl_value_new_list(); + fl_value_append_take(self->value, fl_value_new_string(code)); + fl_value_append_take(self->value, + fl_value_new_string(message != nullptr ? message : "")); + fl_value_append_take(self->value, details != nullptr ? fl_value_ref(details) + : fl_value_new_null()); + return self; +} + +G_DECLARE_FINAL_TYPE( + FirebaseStorageFirebaseStorageHostApiReferenceGetMetaDataResponse, + firebase_storage_firebase_storage_host_api_reference_get_meta_data_response, + FIREBASE_STORAGE, + FIREBASE_STORAGE_HOST_API_REFERENCE_GET_META_DATA_RESPONSE, GObject) + +struct _FirebaseStorageFirebaseStorageHostApiReferenceGetMetaDataResponse { + GObject parent_instance; + + FlValue* value; +}; + +G_DEFINE_TYPE( + FirebaseStorageFirebaseStorageHostApiReferenceGetMetaDataResponse, + firebase_storage_firebase_storage_host_api_reference_get_meta_data_response, + G_TYPE_OBJECT) + +static void +firebase_storage_firebase_storage_host_api_reference_get_meta_data_response_dispose( + GObject* object) { + FirebaseStorageFirebaseStorageHostApiReferenceGetMetaDataResponse* self = + FIREBASE_STORAGE_FIREBASE_STORAGE_HOST_API_REFERENCE_GET_META_DATA_RESPONSE( + object); + g_clear_pointer(&self->value, fl_value_unref); + G_OBJECT_CLASS( + firebase_storage_firebase_storage_host_api_reference_get_meta_data_response_parent_class) + ->dispose(object); +} + +static void +firebase_storage_firebase_storage_host_api_reference_get_meta_data_response_init( + FirebaseStorageFirebaseStorageHostApiReferenceGetMetaDataResponse* self) {} + +static void +firebase_storage_firebase_storage_host_api_reference_get_meta_data_response_class_init( + FirebaseStorageFirebaseStorageHostApiReferenceGetMetaDataResponseClass* + klass) { + G_OBJECT_CLASS(klass)->dispose = + firebase_storage_firebase_storage_host_api_reference_get_meta_data_response_dispose; +} + +static FirebaseStorageFirebaseStorageHostApiReferenceGetMetaDataResponse* +firebase_storage_firebase_storage_host_api_reference_get_meta_data_response_new( + FirebaseStorageInternalFullMetaData* return_value) { + FirebaseStorageFirebaseStorageHostApiReferenceGetMetaDataResponse* self = + FIREBASE_STORAGE_FIREBASE_STORAGE_HOST_API_REFERENCE_GET_META_DATA_RESPONSE( + g_object_new( + firebase_storage_firebase_storage_host_api_reference_get_meta_data_response_get_type(), + nullptr)); + self->value = fl_value_new_list(); + fl_value_append_take(self->value, + fl_value_new_custom_object( + firebase_storage_internal_full_meta_data_type_id, + G_OBJECT(return_value))); + return self; +} + +static FirebaseStorageFirebaseStorageHostApiReferenceGetMetaDataResponse* +firebase_storage_firebase_storage_host_api_reference_get_meta_data_response_new_error( + const gchar* code, const gchar* message, FlValue* details) { + FirebaseStorageFirebaseStorageHostApiReferenceGetMetaDataResponse* self = + FIREBASE_STORAGE_FIREBASE_STORAGE_HOST_API_REFERENCE_GET_META_DATA_RESPONSE( + g_object_new( + firebase_storage_firebase_storage_host_api_reference_get_meta_data_response_get_type(), + nullptr)); + self->value = fl_value_new_list(); + fl_value_append_take(self->value, fl_value_new_string(code)); + fl_value_append_take(self->value, + fl_value_new_string(message != nullptr ? message : "")); + fl_value_append_take(self->value, details != nullptr ? fl_value_ref(details) + : fl_value_new_null()); + return self; +} + +G_DECLARE_FINAL_TYPE( + FirebaseStorageFirebaseStorageHostApiReferenceListResponse, + firebase_storage_firebase_storage_host_api_reference_list_response, + FIREBASE_STORAGE, FIREBASE_STORAGE_HOST_API_REFERENCE_LIST_RESPONSE, + GObject) + +struct _FirebaseStorageFirebaseStorageHostApiReferenceListResponse { + GObject parent_instance; + + FlValue* value; +}; + +G_DEFINE_TYPE( + FirebaseStorageFirebaseStorageHostApiReferenceListResponse, + firebase_storage_firebase_storage_host_api_reference_list_response, + G_TYPE_OBJECT) + +static void +firebase_storage_firebase_storage_host_api_reference_list_response_dispose( + GObject* object) { + FirebaseStorageFirebaseStorageHostApiReferenceListResponse* self = + FIREBASE_STORAGE_FIREBASE_STORAGE_HOST_API_REFERENCE_LIST_RESPONSE( + object); + g_clear_pointer(&self->value, fl_value_unref); + G_OBJECT_CLASS( + firebase_storage_firebase_storage_host_api_reference_list_response_parent_class) + ->dispose(object); +} + +static void +firebase_storage_firebase_storage_host_api_reference_list_response_init( + FirebaseStorageFirebaseStorageHostApiReferenceListResponse* self) {} + +static void +firebase_storage_firebase_storage_host_api_reference_list_response_class_init( + FirebaseStorageFirebaseStorageHostApiReferenceListResponseClass* klass) { + G_OBJECT_CLASS(klass)->dispose = + firebase_storage_firebase_storage_host_api_reference_list_response_dispose; +} + +static FirebaseStorageFirebaseStorageHostApiReferenceListResponse* +firebase_storage_firebase_storage_host_api_reference_list_response_new( + FirebaseStorageInternalListResult* return_value) { + FirebaseStorageFirebaseStorageHostApiReferenceListResponse* self = + FIREBASE_STORAGE_FIREBASE_STORAGE_HOST_API_REFERENCE_LIST_RESPONSE(g_object_new( + firebase_storage_firebase_storage_host_api_reference_list_response_get_type(), + nullptr)); + self->value = fl_value_new_list(); + fl_value_append_take( + self->value, + fl_value_new_custom_object(firebase_storage_internal_list_result_type_id, + G_OBJECT(return_value))); + return self; +} + +static FirebaseStorageFirebaseStorageHostApiReferenceListResponse* +firebase_storage_firebase_storage_host_api_reference_list_response_new_error( + const gchar* code, const gchar* message, FlValue* details) { + FirebaseStorageFirebaseStorageHostApiReferenceListResponse* self = + FIREBASE_STORAGE_FIREBASE_STORAGE_HOST_API_REFERENCE_LIST_RESPONSE(g_object_new( + firebase_storage_firebase_storage_host_api_reference_list_response_get_type(), + nullptr)); + self->value = fl_value_new_list(); + fl_value_append_take(self->value, fl_value_new_string(code)); + fl_value_append_take(self->value, + fl_value_new_string(message != nullptr ? message : "")); + fl_value_append_take(self->value, details != nullptr ? fl_value_ref(details) + : fl_value_new_null()); + return self; +} + +G_DECLARE_FINAL_TYPE( + FirebaseStorageFirebaseStorageHostApiReferenceListAllResponse, + firebase_storage_firebase_storage_host_api_reference_list_all_response, + FIREBASE_STORAGE, FIREBASE_STORAGE_HOST_API_REFERENCE_LIST_ALL_RESPONSE, + GObject) + +struct _FirebaseStorageFirebaseStorageHostApiReferenceListAllResponse { + GObject parent_instance; + + FlValue* value; +}; + +G_DEFINE_TYPE( + FirebaseStorageFirebaseStorageHostApiReferenceListAllResponse, + firebase_storage_firebase_storage_host_api_reference_list_all_response, + G_TYPE_OBJECT) + +static void +firebase_storage_firebase_storage_host_api_reference_list_all_response_dispose( + GObject* object) { + FirebaseStorageFirebaseStorageHostApiReferenceListAllResponse* self = + FIREBASE_STORAGE_FIREBASE_STORAGE_HOST_API_REFERENCE_LIST_ALL_RESPONSE( + object); + g_clear_pointer(&self->value, fl_value_unref); + G_OBJECT_CLASS( + firebase_storage_firebase_storage_host_api_reference_list_all_response_parent_class) + ->dispose(object); +} + +static void +firebase_storage_firebase_storage_host_api_reference_list_all_response_init( + FirebaseStorageFirebaseStorageHostApiReferenceListAllResponse* self) {} + +static void +firebase_storage_firebase_storage_host_api_reference_list_all_response_class_init( + FirebaseStorageFirebaseStorageHostApiReferenceListAllResponseClass* klass) { + G_OBJECT_CLASS(klass)->dispose = + firebase_storage_firebase_storage_host_api_reference_list_all_response_dispose; +} + +static FirebaseStorageFirebaseStorageHostApiReferenceListAllResponse* +firebase_storage_firebase_storage_host_api_reference_list_all_response_new( + FirebaseStorageInternalListResult* return_value) { + FirebaseStorageFirebaseStorageHostApiReferenceListAllResponse* self = + FIREBASE_STORAGE_FIREBASE_STORAGE_HOST_API_REFERENCE_LIST_ALL_RESPONSE( + g_object_new( + firebase_storage_firebase_storage_host_api_reference_list_all_response_get_type(), + nullptr)); + self->value = fl_value_new_list(); + fl_value_append_take( + self->value, + fl_value_new_custom_object(firebase_storage_internal_list_result_type_id, + G_OBJECT(return_value))); + return self; +} + +static FirebaseStorageFirebaseStorageHostApiReferenceListAllResponse* +firebase_storage_firebase_storage_host_api_reference_list_all_response_new_error( + const gchar* code, const gchar* message, FlValue* details) { + FirebaseStorageFirebaseStorageHostApiReferenceListAllResponse* self = + FIREBASE_STORAGE_FIREBASE_STORAGE_HOST_API_REFERENCE_LIST_ALL_RESPONSE( + g_object_new( + firebase_storage_firebase_storage_host_api_reference_list_all_response_get_type(), + nullptr)); + self->value = fl_value_new_list(); + fl_value_append_take(self->value, fl_value_new_string(code)); + fl_value_append_take(self->value, + fl_value_new_string(message != nullptr ? message : "")); + fl_value_append_take(self->value, details != nullptr ? fl_value_ref(details) + : fl_value_new_null()); + return self; +} + +G_DECLARE_FINAL_TYPE( + FirebaseStorageFirebaseStorageHostApiReferenceGetDataResponse, + firebase_storage_firebase_storage_host_api_reference_get_data_response, + FIREBASE_STORAGE, FIREBASE_STORAGE_HOST_API_REFERENCE_GET_DATA_RESPONSE, + GObject) + +struct _FirebaseStorageFirebaseStorageHostApiReferenceGetDataResponse { + GObject parent_instance; + + FlValue* value; +}; + +G_DEFINE_TYPE( + FirebaseStorageFirebaseStorageHostApiReferenceGetDataResponse, + firebase_storage_firebase_storage_host_api_reference_get_data_response, + G_TYPE_OBJECT) + +static void +firebase_storage_firebase_storage_host_api_reference_get_data_response_dispose( + GObject* object) { + FirebaseStorageFirebaseStorageHostApiReferenceGetDataResponse* self = + FIREBASE_STORAGE_FIREBASE_STORAGE_HOST_API_REFERENCE_GET_DATA_RESPONSE( + object); + g_clear_pointer(&self->value, fl_value_unref); + G_OBJECT_CLASS( + firebase_storage_firebase_storage_host_api_reference_get_data_response_parent_class) + ->dispose(object); +} + +static void +firebase_storage_firebase_storage_host_api_reference_get_data_response_init( + FirebaseStorageFirebaseStorageHostApiReferenceGetDataResponse* self) {} + +static void +firebase_storage_firebase_storage_host_api_reference_get_data_response_class_init( + FirebaseStorageFirebaseStorageHostApiReferenceGetDataResponseClass* klass) { + G_OBJECT_CLASS(klass)->dispose = + firebase_storage_firebase_storage_host_api_reference_get_data_response_dispose; +} + +static FirebaseStorageFirebaseStorageHostApiReferenceGetDataResponse* +firebase_storage_firebase_storage_host_api_reference_get_data_response_new( + const uint8_t* return_value, size_t return_value_length) { + FirebaseStorageFirebaseStorageHostApiReferenceGetDataResponse* self = + FIREBASE_STORAGE_FIREBASE_STORAGE_HOST_API_REFERENCE_GET_DATA_RESPONSE( + g_object_new( + firebase_storage_firebase_storage_host_api_reference_get_data_response_get_type(), + nullptr)); + self->value = fl_value_new_list(); + fl_value_append_take(self->value, return_value != nullptr + ? fl_value_new_uint8_list( + return_value, return_value_length) + : fl_value_new_null()); + return self; +} + +static FirebaseStorageFirebaseStorageHostApiReferenceGetDataResponse* +firebase_storage_firebase_storage_host_api_reference_get_data_response_new_error( + const gchar* code, const gchar* message, FlValue* details) { + FirebaseStorageFirebaseStorageHostApiReferenceGetDataResponse* self = + FIREBASE_STORAGE_FIREBASE_STORAGE_HOST_API_REFERENCE_GET_DATA_RESPONSE( + g_object_new( + firebase_storage_firebase_storage_host_api_reference_get_data_response_get_type(), + nullptr)); + self->value = fl_value_new_list(); + fl_value_append_take(self->value, fl_value_new_string(code)); + fl_value_append_take(self->value, + fl_value_new_string(message != nullptr ? message : "")); + fl_value_append_take(self->value, details != nullptr ? fl_value_ref(details) + : fl_value_new_null()); + return self; +} + +G_DECLARE_FINAL_TYPE( + FirebaseStorageFirebaseStorageHostApiReferencePutDataResponse, + firebase_storage_firebase_storage_host_api_reference_put_data_response, + FIREBASE_STORAGE, FIREBASE_STORAGE_HOST_API_REFERENCE_PUT_DATA_RESPONSE, + GObject) + +struct _FirebaseStorageFirebaseStorageHostApiReferencePutDataResponse { + GObject parent_instance; + + FlValue* value; +}; + +G_DEFINE_TYPE( + FirebaseStorageFirebaseStorageHostApiReferencePutDataResponse, + firebase_storage_firebase_storage_host_api_reference_put_data_response, + G_TYPE_OBJECT) + +static void +firebase_storage_firebase_storage_host_api_reference_put_data_response_dispose( + GObject* object) { + FirebaseStorageFirebaseStorageHostApiReferencePutDataResponse* self = + FIREBASE_STORAGE_FIREBASE_STORAGE_HOST_API_REFERENCE_PUT_DATA_RESPONSE( + object); + g_clear_pointer(&self->value, fl_value_unref); + G_OBJECT_CLASS( + firebase_storage_firebase_storage_host_api_reference_put_data_response_parent_class) + ->dispose(object); +} + +static void +firebase_storage_firebase_storage_host_api_reference_put_data_response_init( + FirebaseStorageFirebaseStorageHostApiReferencePutDataResponse* self) {} + +static void +firebase_storage_firebase_storage_host_api_reference_put_data_response_class_init( + FirebaseStorageFirebaseStorageHostApiReferencePutDataResponseClass* klass) { + G_OBJECT_CLASS(klass)->dispose = + firebase_storage_firebase_storage_host_api_reference_put_data_response_dispose; +} + +static FirebaseStorageFirebaseStorageHostApiReferencePutDataResponse* +firebase_storage_firebase_storage_host_api_reference_put_data_response_new( + const gchar* return_value) { + FirebaseStorageFirebaseStorageHostApiReferencePutDataResponse* self = + FIREBASE_STORAGE_FIREBASE_STORAGE_HOST_API_REFERENCE_PUT_DATA_RESPONSE( + g_object_new( + firebase_storage_firebase_storage_host_api_reference_put_data_response_get_type(), + nullptr)); + self->value = fl_value_new_list(); + fl_value_append_take(self->value, fl_value_new_string(return_value)); + return self; +} + +static FirebaseStorageFirebaseStorageHostApiReferencePutDataResponse* +firebase_storage_firebase_storage_host_api_reference_put_data_response_new_error( + const gchar* code, const gchar* message, FlValue* details) { + FirebaseStorageFirebaseStorageHostApiReferencePutDataResponse* self = + FIREBASE_STORAGE_FIREBASE_STORAGE_HOST_API_REFERENCE_PUT_DATA_RESPONSE( + g_object_new( + firebase_storage_firebase_storage_host_api_reference_put_data_response_get_type(), + nullptr)); + self->value = fl_value_new_list(); + fl_value_append_take(self->value, fl_value_new_string(code)); + fl_value_append_take(self->value, + fl_value_new_string(message != nullptr ? message : "")); + fl_value_append_take(self->value, details != nullptr ? fl_value_ref(details) + : fl_value_new_null()); + return self; +} + +G_DECLARE_FINAL_TYPE( + FirebaseStorageFirebaseStorageHostApiReferencePutStringResponse, + firebase_storage_firebase_storage_host_api_reference_put_string_response, + FIREBASE_STORAGE, FIREBASE_STORAGE_HOST_API_REFERENCE_PUT_STRING_RESPONSE, + GObject) + +struct _FirebaseStorageFirebaseStorageHostApiReferencePutStringResponse { + GObject parent_instance; + + FlValue* value; +}; + +G_DEFINE_TYPE( + FirebaseStorageFirebaseStorageHostApiReferencePutStringResponse, + firebase_storage_firebase_storage_host_api_reference_put_string_response, + G_TYPE_OBJECT) + +static void +firebase_storage_firebase_storage_host_api_reference_put_string_response_dispose( + GObject* object) { + FirebaseStorageFirebaseStorageHostApiReferencePutStringResponse* self = + FIREBASE_STORAGE_FIREBASE_STORAGE_HOST_API_REFERENCE_PUT_STRING_RESPONSE( + object); + g_clear_pointer(&self->value, fl_value_unref); + G_OBJECT_CLASS( + firebase_storage_firebase_storage_host_api_reference_put_string_response_parent_class) + ->dispose(object); +} + +static void +firebase_storage_firebase_storage_host_api_reference_put_string_response_init( + FirebaseStorageFirebaseStorageHostApiReferencePutStringResponse* self) {} + +static void +firebase_storage_firebase_storage_host_api_reference_put_string_response_class_init( + FirebaseStorageFirebaseStorageHostApiReferencePutStringResponseClass* + klass) { + G_OBJECT_CLASS(klass)->dispose = + firebase_storage_firebase_storage_host_api_reference_put_string_response_dispose; +} + +static FirebaseStorageFirebaseStorageHostApiReferencePutStringResponse* +firebase_storage_firebase_storage_host_api_reference_put_string_response_new( + const gchar* return_value) { + FirebaseStorageFirebaseStorageHostApiReferencePutStringResponse* self = + FIREBASE_STORAGE_FIREBASE_STORAGE_HOST_API_REFERENCE_PUT_STRING_RESPONSE( + g_object_new( + firebase_storage_firebase_storage_host_api_reference_put_string_response_get_type(), + nullptr)); + self->value = fl_value_new_list(); + fl_value_append_take(self->value, fl_value_new_string(return_value)); + return self; +} + +static FirebaseStorageFirebaseStorageHostApiReferencePutStringResponse* +firebase_storage_firebase_storage_host_api_reference_put_string_response_new_error( + const gchar* code, const gchar* message, FlValue* details) { + FirebaseStorageFirebaseStorageHostApiReferencePutStringResponse* self = + FIREBASE_STORAGE_FIREBASE_STORAGE_HOST_API_REFERENCE_PUT_STRING_RESPONSE( + g_object_new( + firebase_storage_firebase_storage_host_api_reference_put_string_response_get_type(), + nullptr)); + self->value = fl_value_new_list(); + fl_value_append_take(self->value, fl_value_new_string(code)); + fl_value_append_take(self->value, + fl_value_new_string(message != nullptr ? message : "")); + fl_value_append_take(self->value, details != nullptr ? fl_value_ref(details) + : fl_value_new_null()); + return self; +} + +G_DECLARE_FINAL_TYPE( + FirebaseStorageFirebaseStorageHostApiReferencePutFileResponse, + firebase_storage_firebase_storage_host_api_reference_put_file_response, + FIREBASE_STORAGE, FIREBASE_STORAGE_HOST_API_REFERENCE_PUT_FILE_RESPONSE, + GObject) + +struct _FirebaseStorageFirebaseStorageHostApiReferencePutFileResponse { + GObject parent_instance; + + FlValue* value; +}; + +G_DEFINE_TYPE( + FirebaseStorageFirebaseStorageHostApiReferencePutFileResponse, + firebase_storage_firebase_storage_host_api_reference_put_file_response, + G_TYPE_OBJECT) + +static void +firebase_storage_firebase_storage_host_api_reference_put_file_response_dispose( + GObject* object) { + FirebaseStorageFirebaseStorageHostApiReferencePutFileResponse* self = + FIREBASE_STORAGE_FIREBASE_STORAGE_HOST_API_REFERENCE_PUT_FILE_RESPONSE( + object); + g_clear_pointer(&self->value, fl_value_unref); + G_OBJECT_CLASS( + firebase_storage_firebase_storage_host_api_reference_put_file_response_parent_class) + ->dispose(object); +} + +static void +firebase_storage_firebase_storage_host_api_reference_put_file_response_init( + FirebaseStorageFirebaseStorageHostApiReferencePutFileResponse* self) {} + +static void +firebase_storage_firebase_storage_host_api_reference_put_file_response_class_init( + FirebaseStorageFirebaseStorageHostApiReferencePutFileResponseClass* klass) { + G_OBJECT_CLASS(klass)->dispose = + firebase_storage_firebase_storage_host_api_reference_put_file_response_dispose; +} + +static FirebaseStorageFirebaseStorageHostApiReferencePutFileResponse* +firebase_storage_firebase_storage_host_api_reference_put_file_response_new( + const gchar* return_value) { + FirebaseStorageFirebaseStorageHostApiReferencePutFileResponse* self = + FIREBASE_STORAGE_FIREBASE_STORAGE_HOST_API_REFERENCE_PUT_FILE_RESPONSE( + g_object_new( + firebase_storage_firebase_storage_host_api_reference_put_file_response_get_type(), + nullptr)); + self->value = fl_value_new_list(); + fl_value_append_take(self->value, fl_value_new_string(return_value)); + return self; +} + +static FirebaseStorageFirebaseStorageHostApiReferencePutFileResponse* +firebase_storage_firebase_storage_host_api_reference_put_file_response_new_error( + const gchar* code, const gchar* message, FlValue* details) { + FirebaseStorageFirebaseStorageHostApiReferencePutFileResponse* self = + FIREBASE_STORAGE_FIREBASE_STORAGE_HOST_API_REFERENCE_PUT_FILE_RESPONSE( + g_object_new( + firebase_storage_firebase_storage_host_api_reference_put_file_response_get_type(), + nullptr)); + self->value = fl_value_new_list(); + fl_value_append_take(self->value, fl_value_new_string(code)); + fl_value_append_take(self->value, + fl_value_new_string(message != nullptr ? message : "")); + fl_value_append_take(self->value, details != nullptr ? fl_value_ref(details) + : fl_value_new_null()); + return self; +} + +G_DECLARE_FINAL_TYPE( + FirebaseStorageFirebaseStorageHostApiReferenceDownloadFileResponse, + firebase_storage_firebase_storage_host_api_reference_download_file_response, + FIREBASE_STORAGE, + FIREBASE_STORAGE_HOST_API_REFERENCE_DOWNLOAD_FILE_RESPONSE, GObject) + +struct _FirebaseStorageFirebaseStorageHostApiReferenceDownloadFileResponse { + GObject parent_instance; + + FlValue* value; +}; + +G_DEFINE_TYPE( + FirebaseStorageFirebaseStorageHostApiReferenceDownloadFileResponse, + firebase_storage_firebase_storage_host_api_reference_download_file_response, + G_TYPE_OBJECT) + +static void +firebase_storage_firebase_storage_host_api_reference_download_file_response_dispose( + GObject* object) { + FirebaseStorageFirebaseStorageHostApiReferenceDownloadFileResponse* self = + FIREBASE_STORAGE_FIREBASE_STORAGE_HOST_API_REFERENCE_DOWNLOAD_FILE_RESPONSE( + object); + g_clear_pointer(&self->value, fl_value_unref); + G_OBJECT_CLASS( + firebase_storage_firebase_storage_host_api_reference_download_file_response_parent_class) + ->dispose(object); +} + +static void +firebase_storage_firebase_storage_host_api_reference_download_file_response_init( + FirebaseStorageFirebaseStorageHostApiReferenceDownloadFileResponse* self) {} + +static void +firebase_storage_firebase_storage_host_api_reference_download_file_response_class_init( + FirebaseStorageFirebaseStorageHostApiReferenceDownloadFileResponseClass* + klass) { + G_OBJECT_CLASS(klass)->dispose = + firebase_storage_firebase_storage_host_api_reference_download_file_response_dispose; +} + +static FirebaseStorageFirebaseStorageHostApiReferenceDownloadFileResponse* +firebase_storage_firebase_storage_host_api_reference_download_file_response_new( + const gchar* return_value) { + FirebaseStorageFirebaseStorageHostApiReferenceDownloadFileResponse* self = + FIREBASE_STORAGE_FIREBASE_STORAGE_HOST_API_REFERENCE_DOWNLOAD_FILE_RESPONSE( + g_object_new( + firebase_storage_firebase_storage_host_api_reference_download_file_response_get_type(), + nullptr)); + self->value = fl_value_new_list(); + fl_value_append_take(self->value, fl_value_new_string(return_value)); + return self; +} + +static FirebaseStorageFirebaseStorageHostApiReferenceDownloadFileResponse* +firebase_storage_firebase_storage_host_api_reference_download_file_response_new_error( + const gchar* code, const gchar* message, FlValue* details) { + FirebaseStorageFirebaseStorageHostApiReferenceDownloadFileResponse* self = + FIREBASE_STORAGE_FIREBASE_STORAGE_HOST_API_REFERENCE_DOWNLOAD_FILE_RESPONSE( + g_object_new( + firebase_storage_firebase_storage_host_api_reference_download_file_response_get_type(), + nullptr)); + self->value = fl_value_new_list(); + fl_value_append_take(self->value, fl_value_new_string(code)); + fl_value_append_take(self->value, + fl_value_new_string(message != nullptr ? message : "")); + fl_value_append_take(self->value, details != nullptr ? fl_value_ref(details) + : fl_value_new_null()); + return self; +} + +G_DECLARE_FINAL_TYPE( + FirebaseStorageFirebaseStorageHostApiReferenceUpdateMetadataResponse, + firebase_storage_firebase_storage_host_api_reference_update_metadata_response, + FIREBASE_STORAGE, + FIREBASE_STORAGE_HOST_API_REFERENCE_UPDATE_METADATA_RESPONSE, GObject) + +struct _FirebaseStorageFirebaseStorageHostApiReferenceUpdateMetadataResponse { + GObject parent_instance; + + FlValue* value; +}; + +G_DEFINE_TYPE( + FirebaseStorageFirebaseStorageHostApiReferenceUpdateMetadataResponse, + firebase_storage_firebase_storage_host_api_reference_update_metadata_response, + G_TYPE_OBJECT) + +static void +firebase_storage_firebase_storage_host_api_reference_update_metadata_response_dispose( + GObject* object) { + FirebaseStorageFirebaseStorageHostApiReferenceUpdateMetadataResponse* self = + FIREBASE_STORAGE_FIREBASE_STORAGE_HOST_API_REFERENCE_UPDATE_METADATA_RESPONSE( + object); + g_clear_pointer(&self->value, fl_value_unref); + G_OBJECT_CLASS( + firebase_storage_firebase_storage_host_api_reference_update_metadata_response_parent_class) + ->dispose(object); +} + +static void +firebase_storage_firebase_storage_host_api_reference_update_metadata_response_init( + FirebaseStorageFirebaseStorageHostApiReferenceUpdateMetadataResponse* + self) {} + +static void +firebase_storage_firebase_storage_host_api_reference_update_metadata_response_class_init( + FirebaseStorageFirebaseStorageHostApiReferenceUpdateMetadataResponseClass* + klass) { + G_OBJECT_CLASS(klass)->dispose = + firebase_storage_firebase_storage_host_api_reference_update_metadata_response_dispose; +} + +static FirebaseStorageFirebaseStorageHostApiReferenceUpdateMetadataResponse* +firebase_storage_firebase_storage_host_api_reference_update_metadata_response_new( + FirebaseStorageInternalFullMetaData* return_value) { + FirebaseStorageFirebaseStorageHostApiReferenceUpdateMetadataResponse* self = + FIREBASE_STORAGE_FIREBASE_STORAGE_HOST_API_REFERENCE_UPDATE_METADATA_RESPONSE( + g_object_new( + firebase_storage_firebase_storage_host_api_reference_update_metadata_response_get_type(), + nullptr)); + self->value = fl_value_new_list(); + fl_value_append_take(self->value, + fl_value_new_custom_object( + firebase_storage_internal_full_meta_data_type_id, + G_OBJECT(return_value))); + return self; +} + +static FirebaseStorageFirebaseStorageHostApiReferenceUpdateMetadataResponse* +firebase_storage_firebase_storage_host_api_reference_update_metadata_response_new_error( + const gchar* code, const gchar* message, FlValue* details) { + FirebaseStorageFirebaseStorageHostApiReferenceUpdateMetadataResponse* self = + FIREBASE_STORAGE_FIREBASE_STORAGE_HOST_API_REFERENCE_UPDATE_METADATA_RESPONSE( + g_object_new( + firebase_storage_firebase_storage_host_api_reference_update_metadata_response_get_type(), + nullptr)); + self->value = fl_value_new_list(); + fl_value_append_take(self->value, fl_value_new_string(code)); + fl_value_append_take(self->value, + fl_value_new_string(message != nullptr ? message : "")); + fl_value_append_take(self->value, details != nullptr ? fl_value_ref(details) + : fl_value_new_null()); + return self; +} + +G_DECLARE_FINAL_TYPE( + FirebaseStorageFirebaseStorageHostApiTaskPauseResponse, + firebase_storage_firebase_storage_host_api_task_pause_response, + FIREBASE_STORAGE, FIREBASE_STORAGE_HOST_API_TASK_PAUSE_RESPONSE, GObject) + +struct _FirebaseStorageFirebaseStorageHostApiTaskPauseResponse { + GObject parent_instance; + + FlValue* value; +}; + +G_DEFINE_TYPE(FirebaseStorageFirebaseStorageHostApiTaskPauseResponse, + firebase_storage_firebase_storage_host_api_task_pause_response, + G_TYPE_OBJECT) + +static void +firebase_storage_firebase_storage_host_api_task_pause_response_dispose( + GObject* object) { + FirebaseStorageFirebaseStorageHostApiTaskPauseResponse* self = + FIREBASE_STORAGE_FIREBASE_STORAGE_HOST_API_TASK_PAUSE_RESPONSE(object); + g_clear_pointer(&self->value, fl_value_unref); + G_OBJECT_CLASS( + firebase_storage_firebase_storage_host_api_task_pause_response_parent_class) + ->dispose(object); +} + +static void firebase_storage_firebase_storage_host_api_task_pause_response_init( + FirebaseStorageFirebaseStorageHostApiTaskPauseResponse* self) {} + +static void +firebase_storage_firebase_storage_host_api_task_pause_response_class_init( + FirebaseStorageFirebaseStorageHostApiTaskPauseResponseClass* klass) { + G_OBJECT_CLASS(klass)->dispose = + firebase_storage_firebase_storage_host_api_task_pause_response_dispose; +} + +static FirebaseStorageFirebaseStorageHostApiTaskPauseResponse* +firebase_storage_firebase_storage_host_api_task_pause_response_new( + FlValue* return_value) { + FirebaseStorageFirebaseStorageHostApiTaskPauseResponse* self = + FIREBASE_STORAGE_FIREBASE_STORAGE_HOST_API_TASK_PAUSE_RESPONSE(g_object_new( + firebase_storage_firebase_storage_host_api_task_pause_response_get_type(), + nullptr)); + self->value = fl_value_new_list(); + fl_value_append_take(self->value, fl_value_ref(return_value)); + return self; +} + +static FirebaseStorageFirebaseStorageHostApiTaskPauseResponse* +firebase_storage_firebase_storage_host_api_task_pause_response_new_error( + const gchar* code, const gchar* message, FlValue* details) { + FirebaseStorageFirebaseStorageHostApiTaskPauseResponse* self = + FIREBASE_STORAGE_FIREBASE_STORAGE_HOST_API_TASK_PAUSE_RESPONSE(g_object_new( + firebase_storage_firebase_storage_host_api_task_pause_response_get_type(), + nullptr)); + self->value = fl_value_new_list(); + fl_value_append_take(self->value, fl_value_new_string(code)); + fl_value_append_take(self->value, + fl_value_new_string(message != nullptr ? message : "")); + fl_value_append_take(self->value, details != nullptr ? fl_value_ref(details) + : fl_value_new_null()); + return self; +} + +G_DECLARE_FINAL_TYPE( + FirebaseStorageFirebaseStorageHostApiTaskResumeResponse, + firebase_storage_firebase_storage_host_api_task_resume_response, + FIREBASE_STORAGE, FIREBASE_STORAGE_HOST_API_TASK_RESUME_RESPONSE, GObject) + +struct _FirebaseStorageFirebaseStorageHostApiTaskResumeResponse { + GObject parent_instance; + + FlValue* value; +}; + +G_DEFINE_TYPE(FirebaseStorageFirebaseStorageHostApiTaskResumeResponse, + firebase_storage_firebase_storage_host_api_task_resume_response, + G_TYPE_OBJECT) + +static void +firebase_storage_firebase_storage_host_api_task_resume_response_dispose( + GObject* object) { + FirebaseStorageFirebaseStorageHostApiTaskResumeResponse* self = + FIREBASE_STORAGE_FIREBASE_STORAGE_HOST_API_TASK_RESUME_RESPONSE(object); + g_clear_pointer(&self->value, fl_value_unref); + G_OBJECT_CLASS( + firebase_storage_firebase_storage_host_api_task_resume_response_parent_class) + ->dispose(object); +} + +static void +firebase_storage_firebase_storage_host_api_task_resume_response_init( + FirebaseStorageFirebaseStorageHostApiTaskResumeResponse* self) {} + +static void +firebase_storage_firebase_storage_host_api_task_resume_response_class_init( + FirebaseStorageFirebaseStorageHostApiTaskResumeResponseClass* klass) { + G_OBJECT_CLASS(klass)->dispose = + firebase_storage_firebase_storage_host_api_task_resume_response_dispose; +} + +static FirebaseStorageFirebaseStorageHostApiTaskResumeResponse* +firebase_storage_firebase_storage_host_api_task_resume_response_new( + FlValue* return_value) { + FirebaseStorageFirebaseStorageHostApiTaskResumeResponse* self = + FIREBASE_STORAGE_FIREBASE_STORAGE_HOST_API_TASK_RESUME_RESPONSE(g_object_new( + firebase_storage_firebase_storage_host_api_task_resume_response_get_type(), + nullptr)); + self->value = fl_value_new_list(); + fl_value_append_take(self->value, fl_value_ref(return_value)); + return self; +} + +static FirebaseStorageFirebaseStorageHostApiTaskResumeResponse* +firebase_storage_firebase_storage_host_api_task_resume_response_new_error( + const gchar* code, const gchar* message, FlValue* details) { + FirebaseStorageFirebaseStorageHostApiTaskResumeResponse* self = + FIREBASE_STORAGE_FIREBASE_STORAGE_HOST_API_TASK_RESUME_RESPONSE(g_object_new( + firebase_storage_firebase_storage_host_api_task_resume_response_get_type(), + nullptr)); + self->value = fl_value_new_list(); + fl_value_append_take(self->value, fl_value_new_string(code)); + fl_value_append_take(self->value, + fl_value_new_string(message != nullptr ? message : "")); + fl_value_append_take(self->value, details != nullptr ? fl_value_ref(details) + : fl_value_new_null()); + return self; +} + +G_DECLARE_FINAL_TYPE( + FirebaseStorageFirebaseStorageHostApiTaskCancelResponse, + firebase_storage_firebase_storage_host_api_task_cancel_response, + FIREBASE_STORAGE, FIREBASE_STORAGE_HOST_API_TASK_CANCEL_RESPONSE, GObject) + +struct _FirebaseStorageFirebaseStorageHostApiTaskCancelResponse { + GObject parent_instance; + + FlValue* value; +}; + +G_DEFINE_TYPE(FirebaseStorageFirebaseStorageHostApiTaskCancelResponse, + firebase_storage_firebase_storage_host_api_task_cancel_response, + G_TYPE_OBJECT) + +static void +firebase_storage_firebase_storage_host_api_task_cancel_response_dispose( + GObject* object) { + FirebaseStorageFirebaseStorageHostApiTaskCancelResponse* self = + FIREBASE_STORAGE_FIREBASE_STORAGE_HOST_API_TASK_CANCEL_RESPONSE(object); + g_clear_pointer(&self->value, fl_value_unref); + G_OBJECT_CLASS( + firebase_storage_firebase_storage_host_api_task_cancel_response_parent_class) + ->dispose(object); +} + +static void +firebase_storage_firebase_storage_host_api_task_cancel_response_init( + FirebaseStorageFirebaseStorageHostApiTaskCancelResponse* self) {} + +static void +firebase_storage_firebase_storage_host_api_task_cancel_response_class_init( + FirebaseStorageFirebaseStorageHostApiTaskCancelResponseClass* klass) { + G_OBJECT_CLASS(klass)->dispose = + firebase_storage_firebase_storage_host_api_task_cancel_response_dispose; +} + +static FirebaseStorageFirebaseStorageHostApiTaskCancelResponse* +firebase_storage_firebase_storage_host_api_task_cancel_response_new( + FlValue* return_value) { + FirebaseStorageFirebaseStorageHostApiTaskCancelResponse* self = + FIREBASE_STORAGE_FIREBASE_STORAGE_HOST_API_TASK_CANCEL_RESPONSE(g_object_new( + firebase_storage_firebase_storage_host_api_task_cancel_response_get_type(), + nullptr)); + self->value = fl_value_new_list(); + fl_value_append_take(self->value, fl_value_ref(return_value)); + return self; +} + +static FirebaseStorageFirebaseStorageHostApiTaskCancelResponse* +firebase_storage_firebase_storage_host_api_task_cancel_response_new_error( + const gchar* code, const gchar* message, FlValue* details) { + FirebaseStorageFirebaseStorageHostApiTaskCancelResponse* self = + FIREBASE_STORAGE_FIREBASE_STORAGE_HOST_API_TASK_CANCEL_RESPONSE(g_object_new( + firebase_storage_firebase_storage_host_api_task_cancel_response_get_type(), + nullptr)); + self->value = fl_value_new_list(); + fl_value_append_take(self->value, fl_value_new_string(code)); + fl_value_append_take(self->value, + fl_value_new_string(message != nullptr ? message : "")); + fl_value_append_take(self->value, details != nullptr ? fl_value_ref(details) + : fl_value_new_null()); + return self; +} + +struct _FirebaseStorageFirebaseStorageHostApi { + GObject parent_instance; + + const FirebaseStorageFirebaseStorageHostApiVTable* vtable; + gpointer user_data; + GDestroyNotify user_data_free_func; +}; + +G_DEFINE_TYPE(FirebaseStorageFirebaseStorageHostApi, + firebase_storage_firebase_storage_host_api, G_TYPE_OBJECT) + +static void firebase_storage_firebase_storage_host_api_dispose( + GObject* object) { + FirebaseStorageFirebaseStorageHostApi* self = + FIREBASE_STORAGE_FIREBASE_STORAGE_HOST_API(object); + if (self->user_data != nullptr) { + self->user_data_free_func(self->user_data); + } + self->user_data = nullptr; + G_OBJECT_CLASS(firebase_storage_firebase_storage_host_api_parent_class) + ->dispose(object); +} + +static void firebase_storage_firebase_storage_host_api_init( + FirebaseStorageFirebaseStorageHostApi* self) {} + +static void firebase_storage_firebase_storage_host_api_class_init( + FirebaseStorageFirebaseStorageHostApiClass* klass) { + G_OBJECT_CLASS(klass)->dispose = + firebase_storage_firebase_storage_host_api_dispose; +} + +static FirebaseStorageFirebaseStorageHostApi* +firebase_storage_firebase_storage_host_api_new( + const FirebaseStorageFirebaseStorageHostApiVTable* vtable, + gpointer user_data, GDestroyNotify user_data_free_func) { + FirebaseStorageFirebaseStorageHostApi* self = + FIREBASE_STORAGE_FIREBASE_STORAGE_HOST_API(g_object_new( + firebase_storage_firebase_storage_host_api_get_type(), nullptr)); + self->vtable = vtable; + self->user_data = user_data; + self->user_data_free_func = user_data_free_func; + return self; +} + +static void firebase_storage_firebase_storage_host_api_get_referenceby_path_cb( + FlBasicMessageChannel* channel, FlValue* message_, + FlBasicMessageChannelResponseHandle* response_handle, gpointer user_data) { + FirebaseStorageFirebaseStorageHostApi* self = + FIREBASE_STORAGE_FIREBASE_STORAGE_HOST_API(user_data); + + if (self->vtable == nullptr || + self->vtable->get_referenceby_path == nullptr) { + return; + } + + FlValue* value0 = fl_value_get_list_value(message_, 0); + FirebaseStorageInternalStorageFirebaseApp* app = + FIREBASE_STORAGE_INTERNAL_STORAGE_FIREBASE_APP( + fl_value_get_custom_value_object(value0)); + FlValue* value1 = fl_value_get_list_value(message_, 1); + const gchar* path = fl_value_get_string(value1); + FlValue* value2 = fl_value_get_list_value(message_, 2); + const gchar* bucket = fl_value_get_string(value2); + g_autoptr(FirebaseStorageFirebaseStorageHostApiResponseHandle) + response_handle_ = + firebase_storage_firebase_storage_host_api_response_handle_new( + channel, response_handle); + self->vtable->get_referenceby_path(app, path, bucket, response_handle_, + self->user_data); +} + +static void +firebase_storage_firebase_storage_host_api_set_max_operation_retry_time_cb( + FlBasicMessageChannel* channel, FlValue* message_, + FlBasicMessageChannelResponseHandle* response_handle, gpointer user_data) { + FirebaseStorageFirebaseStorageHostApi* self = + FIREBASE_STORAGE_FIREBASE_STORAGE_HOST_API(user_data); + + if (self->vtable == nullptr || + self->vtable->set_max_operation_retry_time == nullptr) { + return; + } + + FlValue* value0 = fl_value_get_list_value(message_, 0); + FirebaseStorageInternalStorageFirebaseApp* app = + FIREBASE_STORAGE_INTERNAL_STORAGE_FIREBASE_APP( + fl_value_get_custom_value_object(value0)); + FlValue* value1 = fl_value_get_list_value(message_, 1); + int64_t time = fl_value_get_int(value1); + g_autoptr(FirebaseStorageFirebaseStorageHostApiResponseHandle) + response_handle_ = + firebase_storage_firebase_storage_host_api_response_handle_new( + channel, response_handle); + self->vtable->set_max_operation_retry_time(app, time, response_handle_, + self->user_data); +} + +static void +firebase_storage_firebase_storage_host_api_set_max_upload_retry_time_cb( + FlBasicMessageChannel* channel, FlValue* message_, + FlBasicMessageChannelResponseHandle* response_handle, gpointer user_data) { + FirebaseStorageFirebaseStorageHostApi* self = + FIREBASE_STORAGE_FIREBASE_STORAGE_HOST_API(user_data); + + if (self->vtable == nullptr || + self->vtable->set_max_upload_retry_time == nullptr) { + return; + } + + FlValue* value0 = fl_value_get_list_value(message_, 0); + FirebaseStorageInternalStorageFirebaseApp* app = + FIREBASE_STORAGE_INTERNAL_STORAGE_FIREBASE_APP( + fl_value_get_custom_value_object(value0)); + FlValue* value1 = fl_value_get_list_value(message_, 1); + int64_t time = fl_value_get_int(value1); + g_autoptr(FirebaseStorageFirebaseStorageHostApiResponseHandle) + response_handle_ = + firebase_storage_firebase_storage_host_api_response_handle_new( + channel, response_handle); + self->vtable->set_max_upload_retry_time(app, time, response_handle_, + self->user_data); +} + +static void +firebase_storage_firebase_storage_host_api_set_max_download_retry_time_cb( + FlBasicMessageChannel* channel, FlValue* message_, + FlBasicMessageChannelResponseHandle* response_handle, gpointer user_data) { + FirebaseStorageFirebaseStorageHostApi* self = + FIREBASE_STORAGE_FIREBASE_STORAGE_HOST_API(user_data); + + if (self->vtable == nullptr || + self->vtable->set_max_download_retry_time == nullptr) { + return; + } + + FlValue* value0 = fl_value_get_list_value(message_, 0); + FirebaseStorageInternalStorageFirebaseApp* app = + FIREBASE_STORAGE_INTERNAL_STORAGE_FIREBASE_APP( + fl_value_get_custom_value_object(value0)); + FlValue* value1 = fl_value_get_list_value(message_, 1); + int64_t time = fl_value_get_int(value1); + g_autoptr(FirebaseStorageFirebaseStorageHostApiResponseHandle) + response_handle_ = + firebase_storage_firebase_storage_host_api_response_handle_new( + channel, response_handle); + self->vtable->set_max_download_retry_time(app, time, response_handle_, + self->user_data); +} + +static void firebase_storage_firebase_storage_host_api_use_storage_emulator_cb( + FlBasicMessageChannel* channel, FlValue* message_, + FlBasicMessageChannelResponseHandle* response_handle, gpointer user_data) { + FirebaseStorageFirebaseStorageHostApi* self = + FIREBASE_STORAGE_FIREBASE_STORAGE_HOST_API(user_data); + + if (self->vtable == nullptr || + self->vtable->use_storage_emulator == nullptr) { + return; + } + + FlValue* value0 = fl_value_get_list_value(message_, 0); + FirebaseStorageInternalStorageFirebaseApp* app = + FIREBASE_STORAGE_INTERNAL_STORAGE_FIREBASE_APP( + fl_value_get_custom_value_object(value0)); + FlValue* value1 = fl_value_get_list_value(message_, 1); + const gchar* host = fl_value_get_string(value1); + FlValue* value2 = fl_value_get_list_value(message_, 2); + int64_t port = fl_value_get_int(value2); + g_autoptr(FirebaseStorageFirebaseStorageHostApiResponseHandle) + response_handle_ = + firebase_storage_firebase_storage_host_api_response_handle_new( + channel, response_handle); + self->vtable->use_storage_emulator(app, host, port, response_handle_, + self->user_data); +} + +static void firebase_storage_firebase_storage_host_api_reference_delete_cb( + FlBasicMessageChannel* channel, FlValue* message_, + FlBasicMessageChannelResponseHandle* response_handle, gpointer user_data) { + FirebaseStorageFirebaseStorageHostApi* self = + FIREBASE_STORAGE_FIREBASE_STORAGE_HOST_API(user_data); + + if (self->vtable == nullptr || self->vtable->reference_delete == nullptr) { + return; + } + + FlValue* value0 = fl_value_get_list_value(message_, 0); + FirebaseStorageInternalStorageFirebaseApp* app = + FIREBASE_STORAGE_INTERNAL_STORAGE_FIREBASE_APP( + fl_value_get_custom_value_object(value0)); + FlValue* value1 = fl_value_get_list_value(message_, 1); + FirebaseStorageInternalStorageReference* reference = + FIREBASE_STORAGE_INTERNAL_STORAGE_REFERENCE( + fl_value_get_custom_value_object(value1)); + g_autoptr(FirebaseStorageFirebaseStorageHostApiResponseHandle) + response_handle_ = + firebase_storage_firebase_storage_host_api_response_handle_new( + channel, response_handle); + self->vtable->reference_delete(app, reference, response_handle_, + self->user_data); +} + +static void +firebase_storage_firebase_storage_host_api_reference_get_download_u_r_l_cb( + FlBasicMessageChannel* channel, FlValue* message_, + FlBasicMessageChannelResponseHandle* response_handle, gpointer user_data) { + FirebaseStorageFirebaseStorageHostApi* self = + FIREBASE_STORAGE_FIREBASE_STORAGE_HOST_API(user_data); + + if (self->vtable == nullptr || + self->vtable->reference_get_download_u_r_l == nullptr) { + return; + } + + FlValue* value0 = fl_value_get_list_value(message_, 0); + FirebaseStorageInternalStorageFirebaseApp* app = + FIREBASE_STORAGE_INTERNAL_STORAGE_FIREBASE_APP( + fl_value_get_custom_value_object(value0)); + FlValue* value1 = fl_value_get_list_value(message_, 1); + FirebaseStorageInternalStorageReference* reference = + FIREBASE_STORAGE_INTERNAL_STORAGE_REFERENCE( + fl_value_get_custom_value_object(value1)); + g_autoptr(FirebaseStorageFirebaseStorageHostApiResponseHandle) + response_handle_ = + firebase_storage_firebase_storage_host_api_response_handle_new( + channel, response_handle); + self->vtable->reference_get_download_u_r_l(app, reference, response_handle_, + self->user_data); +} + +static void +firebase_storage_firebase_storage_host_api_reference_get_meta_data_cb( + FlBasicMessageChannel* channel, FlValue* message_, + FlBasicMessageChannelResponseHandle* response_handle, gpointer user_data) { + FirebaseStorageFirebaseStorageHostApi* self = + FIREBASE_STORAGE_FIREBASE_STORAGE_HOST_API(user_data); + + if (self->vtable == nullptr || + self->vtable->reference_get_meta_data == nullptr) { + return; + } + + FlValue* value0 = fl_value_get_list_value(message_, 0); + FirebaseStorageInternalStorageFirebaseApp* app = + FIREBASE_STORAGE_INTERNAL_STORAGE_FIREBASE_APP( + fl_value_get_custom_value_object(value0)); + FlValue* value1 = fl_value_get_list_value(message_, 1); + FirebaseStorageInternalStorageReference* reference = + FIREBASE_STORAGE_INTERNAL_STORAGE_REFERENCE( + fl_value_get_custom_value_object(value1)); + g_autoptr(FirebaseStorageFirebaseStorageHostApiResponseHandle) + response_handle_ = + firebase_storage_firebase_storage_host_api_response_handle_new( + channel, response_handle); + self->vtable->reference_get_meta_data(app, reference, response_handle_, + self->user_data); +} + +static void firebase_storage_firebase_storage_host_api_reference_list_cb( + FlBasicMessageChannel* channel, FlValue* message_, + FlBasicMessageChannelResponseHandle* response_handle, gpointer user_data) { + FirebaseStorageFirebaseStorageHostApi* self = + FIREBASE_STORAGE_FIREBASE_STORAGE_HOST_API(user_data); + + if (self->vtable == nullptr || self->vtable->reference_list == nullptr) { + return; + } + + FlValue* value0 = fl_value_get_list_value(message_, 0); + FirebaseStorageInternalStorageFirebaseApp* app = + FIREBASE_STORAGE_INTERNAL_STORAGE_FIREBASE_APP( + fl_value_get_custom_value_object(value0)); + FlValue* value1 = fl_value_get_list_value(message_, 1); + FirebaseStorageInternalStorageReference* reference = + FIREBASE_STORAGE_INTERNAL_STORAGE_REFERENCE( + fl_value_get_custom_value_object(value1)); + FlValue* value2 = fl_value_get_list_value(message_, 2); + FirebaseStorageInternalListOptions* options = + FIREBASE_STORAGE_INTERNAL_LIST_OPTIONS( + fl_value_get_custom_value_object(value2)); + g_autoptr(FirebaseStorageFirebaseStorageHostApiResponseHandle) + response_handle_ = + firebase_storage_firebase_storage_host_api_response_handle_new( + channel, response_handle); + self->vtable->reference_list(app, reference, options, response_handle_, + self->user_data); +} + +static void firebase_storage_firebase_storage_host_api_reference_list_all_cb( + FlBasicMessageChannel* channel, FlValue* message_, + FlBasicMessageChannelResponseHandle* response_handle, gpointer user_data) { + FirebaseStorageFirebaseStorageHostApi* self = + FIREBASE_STORAGE_FIREBASE_STORAGE_HOST_API(user_data); + + if (self->vtable == nullptr || self->vtable->reference_list_all == nullptr) { + return; + } + + FlValue* value0 = fl_value_get_list_value(message_, 0); + FirebaseStorageInternalStorageFirebaseApp* app = + FIREBASE_STORAGE_INTERNAL_STORAGE_FIREBASE_APP( + fl_value_get_custom_value_object(value0)); + FlValue* value1 = fl_value_get_list_value(message_, 1); + FirebaseStorageInternalStorageReference* reference = + FIREBASE_STORAGE_INTERNAL_STORAGE_REFERENCE( + fl_value_get_custom_value_object(value1)); + g_autoptr(FirebaseStorageFirebaseStorageHostApiResponseHandle) + response_handle_ = + firebase_storage_firebase_storage_host_api_response_handle_new( + channel, response_handle); + self->vtable->reference_list_all(app, reference, response_handle_, + self->user_data); +} + +static void firebase_storage_firebase_storage_host_api_reference_get_data_cb( + FlBasicMessageChannel* channel, FlValue* message_, + FlBasicMessageChannelResponseHandle* response_handle, gpointer user_data) { + FirebaseStorageFirebaseStorageHostApi* self = + FIREBASE_STORAGE_FIREBASE_STORAGE_HOST_API(user_data); + + if (self->vtable == nullptr || self->vtable->reference_get_data == nullptr) { + return; + } + + FlValue* value0 = fl_value_get_list_value(message_, 0); + FirebaseStorageInternalStorageFirebaseApp* app = + FIREBASE_STORAGE_INTERNAL_STORAGE_FIREBASE_APP( + fl_value_get_custom_value_object(value0)); + FlValue* value1 = fl_value_get_list_value(message_, 1); + FirebaseStorageInternalStorageReference* reference = + FIREBASE_STORAGE_INTERNAL_STORAGE_REFERENCE( + fl_value_get_custom_value_object(value1)); + FlValue* value2 = fl_value_get_list_value(message_, 2); + int64_t max_size = fl_value_get_int(value2); + g_autoptr(FirebaseStorageFirebaseStorageHostApiResponseHandle) + response_handle_ = + firebase_storage_firebase_storage_host_api_response_handle_new( + channel, response_handle); + self->vtable->reference_get_data(app, reference, max_size, response_handle_, + self->user_data); +} + +static void firebase_storage_firebase_storage_host_api_reference_put_data_cb( + FlBasicMessageChannel* channel, FlValue* message_, + FlBasicMessageChannelResponseHandle* response_handle, gpointer user_data) { + FirebaseStorageFirebaseStorageHostApi* self = + FIREBASE_STORAGE_FIREBASE_STORAGE_HOST_API(user_data); + + if (self->vtable == nullptr || self->vtable->reference_put_data == nullptr) { + return; + } + + FlValue* value0 = fl_value_get_list_value(message_, 0); + FirebaseStorageInternalStorageFirebaseApp* app = + FIREBASE_STORAGE_INTERNAL_STORAGE_FIREBASE_APP( + fl_value_get_custom_value_object(value0)); + FlValue* value1 = fl_value_get_list_value(message_, 1); + FirebaseStorageInternalStorageReference* reference = + FIREBASE_STORAGE_INTERNAL_STORAGE_REFERENCE( + fl_value_get_custom_value_object(value1)); + FlValue* value2 = fl_value_get_list_value(message_, 2); + const uint8_t* data = fl_value_get_uint8_list(value2); + size_t data_length = fl_value_get_length(value2); + FlValue* value3 = fl_value_get_list_value(message_, 3); + FirebaseStorageInternalSettableMetadata* settable_meta_data = + FIREBASE_STORAGE_INTERNAL_SETTABLE_METADATA( + fl_value_get_custom_value_object(value3)); + FlValue* value4 = fl_value_get_list_value(message_, 4); + int64_t handle = fl_value_get_int(value4); + g_autoptr(FirebaseStorageFirebaseStorageHostApiResponseHandle) + response_handle_ = + firebase_storage_firebase_storage_host_api_response_handle_new( + channel, response_handle); + self->vtable->reference_put_data(app, reference, data, data_length, + settable_meta_data, handle, response_handle_, + self->user_data); +} + +static void firebase_storage_firebase_storage_host_api_reference_put_string_cb( + FlBasicMessageChannel* channel, FlValue* message_, + FlBasicMessageChannelResponseHandle* response_handle, gpointer user_data) { + FirebaseStorageFirebaseStorageHostApi* self = + FIREBASE_STORAGE_FIREBASE_STORAGE_HOST_API(user_data); + + if (self->vtable == nullptr || + self->vtable->reference_put_string == nullptr) { + return; + } + + FlValue* value0 = fl_value_get_list_value(message_, 0); + FirebaseStorageInternalStorageFirebaseApp* app = + FIREBASE_STORAGE_INTERNAL_STORAGE_FIREBASE_APP( + fl_value_get_custom_value_object(value0)); + FlValue* value1 = fl_value_get_list_value(message_, 1); + FirebaseStorageInternalStorageReference* reference = + FIREBASE_STORAGE_INTERNAL_STORAGE_REFERENCE( + fl_value_get_custom_value_object(value1)); + FlValue* value2 = fl_value_get_list_value(message_, 2); + const gchar* data = fl_value_get_string(value2); + FlValue* value3 = fl_value_get_list_value(message_, 3); + int64_t format = fl_value_get_int(value3); + FlValue* value4 = fl_value_get_list_value(message_, 4); + FirebaseStorageInternalSettableMetadata* settable_meta_data = + FIREBASE_STORAGE_INTERNAL_SETTABLE_METADATA( + fl_value_get_custom_value_object(value4)); + FlValue* value5 = fl_value_get_list_value(message_, 5); + int64_t handle = fl_value_get_int(value5); + g_autoptr(FirebaseStorageFirebaseStorageHostApiResponseHandle) + response_handle_ = + firebase_storage_firebase_storage_host_api_response_handle_new( + channel, response_handle); + self->vtable->reference_put_string(app, reference, data, format, + settable_meta_data, handle, + response_handle_, self->user_data); +} + +static void firebase_storage_firebase_storage_host_api_reference_put_file_cb( + FlBasicMessageChannel* channel, FlValue* message_, + FlBasicMessageChannelResponseHandle* response_handle, gpointer user_data) { + FirebaseStorageFirebaseStorageHostApi* self = + FIREBASE_STORAGE_FIREBASE_STORAGE_HOST_API(user_data); + + if (self->vtable == nullptr || self->vtable->reference_put_file == nullptr) { + return; + } + + FlValue* value0 = fl_value_get_list_value(message_, 0); + FirebaseStorageInternalStorageFirebaseApp* app = + FIREBASE_STORAGE_INTERNAL_STORAGE_FIREBASE_APP( + fl_value_get_custom_value_object(value0)); + FlValue* value1 = fl_value_get_list_value(message_, 1); + FirebaseStorageInternalStorageReference* reference = + FIREBASE_STORAGE_INTERNAL_STORAGE_REFERENCE( + fl_value_get_custom_value_object(value1)); + FlValue* value2 = fl_value_get_list_value(message_, 2); + const gchar* file_path = fl_value_get_string(value2); + FlValue* value3 = fl_value_get_list_value(message_, 3); + FirebaseStorageInternalSettableMetadata* settable_meta_data = + FIREBASE_STORAGE_INTERNAL_SETTABLE_METADATA( + fl_value_get_custom_value_object(value3)); + FlValue* value4 = fl_value_get_list_value(message_, 4); + int64_t handle = fl_value_get_int(value4); + g_autoptr(FirebaseStorageFirebaseStorageHostApiResponseHandle) + response_handle_ = + firebase_storage_firebase_storage_host_api_response_handle_new( + channel, response_handle); + self->vtable->reference_put_file(app, reference, file_path, + settable_meta_data, handle, response_handle_, + self->user_data); +} + +static void +firebase_storage_firebase_storage_host_api_reference_download_file_cb( + FlBasicMessageChannel* channel, FlValue* message_, + FlBasicMessageChannelResponseHandle* response_handle, gpointer user_data) { + FirebaseStorageFirebaseStorageHostApi* self = + FIREBASE_STORAGE_FIREBASE_STORAGE_HOST_API(user_data); + + if (self->vtable == nullptr || + self->vtable->reference_download_file == nullptr) { + return; + } + + FlValue* value0 = fl_value_get_list_value(message_, 0); + FirebaseStorageInternalStorageFirebaseApp* app = + FIREBASE_STORAGE_INTERNAL_STORAGE_FIREBASE_APP( + fl_value_get_custom_value_object(value0)); + FlValue* value1 = fl_value_get_list_value(message_, 1); + FirebaseStorageInternalStorageReference* reference = + FIREBASE_STORAGE_INTERNAL_STORAGE_REFERENCE( + fl_value_get_custom_value_object(value1)); + FlValue* value2 = fl_value_get_list_value(message_, 2); + const gchar* file_path = fl_value_get_string(value2); + FlValue* value3 = fl_value_get_list_value(message_, 3); + int64_t handle = fl_value_get_int(value3); + g_autoptr(FirebaseStorageFirebaseStorageHostApiResponseHandle) + response_handle_ = + firebase_storage_firebase_storage_host_api_response_handle_new( + channel, response_handle); + self->vtable->reference_download_file(app, reference, file_path, handle, + response_handle_, self->user_data); +} + +static void +firebase_storage_firebase_storage_host_api_reference_update_metadata_cb( + FlBasicMessageChannel* channel, FlValue* message_, + FlBasicMessageChannelResponseHandle* response_handle, gpointer user_data) { + FirebaseStorageFirebaseStorageHostApi* self = + FIREBASE_STORAGE_FIREBASE_STORAGE_HOST_API(user_data); + + if (self->vtable == nullptr || + self->vtable->reference_update_metadata == nullptr) { + return; + } + + FlValue* value0 = fl_value_get_list_value(message_, 0); + FirebaseStorageInternalStorageFirebaseApp* app = + FIREBASE_STORAGE_INTERNAL_STORAGE_FIREBASE_APP( + fl_value_get_custom_value_object(value0)); + FlValue* value1 = fl_value_get_list_value(message_, 1); + FirebaseStorageInternalStorageReference* reference = + FIREBASE_STORAGE_INTERNAL_STORAGE_REFERENCE( + fl_value_get_custom_value_object(value1)); + FlValue* value2 = fl_value_get_list_value(message_, 2); + FirebaseStorageInternalSettableMetadata* metadata = + FIREBASE_STORAGE_INTERNAL_SETTABLE_METADATA( + fl_value_get_custom_value_object(value2)); + g_autoptr(FirebaseStorageFirebaseStorageHostApiResponseHandle) + response_handle_ = + firebase_storage_firebase_storage_host_api_response_handle_new( + channel, response_handle); + self->vtable->reference_update_metadata(app, reference, metadata, + response_handle_, self->user_data); +} + +static void firebase_storage_firebase_storage_host_api_task_pause_cb( + FlBasicMessageChannel* channel, FlValue* message_, + FlBasicMessageChannelResponseHandle* response_handle, gpointer user_data) { + FirebaseStorageFirebaseStorageHostApi* self = + FIREBASE_STORAGE_FIREBASE_STORAGE_HOST_API(user_data); + + if (self->vtable == nullptr || self->vtable->task_pause == nullptr) { + return; + } + + FlValue* value0 = fl_value_get_list_value(message_, 0); + FirebaseStorageInternalStorageFirebaseApp* app = + FIREBASE_STORAGE_INTERNAL_STORAGE_FIREBASE_APP( + fl_value_get_custom_value_object(value0)); + FlValue* value1 = fl_value_get_list_value(message_, 1); + int64_t handle = fl_value_get_int(value1); + g_autoptr(FirebaseStorageFirebaseStorageHostApiResponseHandle) + response_handle_ = + firebase_storage_firebase_storage_host_api_response_handle_new( + channel, response_handle); + self->vtable->task_pause(app, handle, response_handle_, self->user_data); +} + +static void firebase_storage_firebase_storage_host_api_task_resume_cb( + FlBasicMessageChannel* channel, FlValue* message_, + FlBasicMessageChannelResponseHandle* response_handle, gpointer user_data) { + FirebaseStorageFirebaseStorageHostApi* self = + FIREBASE_STORAGE_FIREBASE_STORAGE_HOST_API(user_data); + + if (self->vtable == nullptr || self->vtable->task_resume == nullptr) { + return; + } + + FlValue* value0 = fl_value_get_list_value(message_, 0); + FirebaseStorageInternalStorageFirebaseApp* app = + FIREBASE_STORAGE_INTERNAL_STORAGE_FIREBASE_APP( + fl_value_get_custom_value_object(value0)); + FlValue* value1 = fl_value_get_list_value(message_, 1); + int64_t handle = fl_value_get_int(value1); + g_autoptr(FirebaseStorageFirebaseStorageHostApiResponseHandle) + response_handle_ = + firebase_storage_firebase_storage_host_api_response_handle_new( + channel, response_handle); + self->vtable->task_resume(app, handle, response_handle_, self->user_data); +} + +static void firebase_storage_firebase_storage_host_api_task_cancel_cb( + FlBasicMessageChannel* channel, FlValue* message_, + FlBasicMessageChannelResponseHandle* response_handle, gpointer user_data) { + FirebaseStorageFirebaseStorageHostApi* self = + FIREBASE_STORAGE_FIREBASE_STORAGE_HOST_API(user_data); + + if (self->vtable == nullptr || self->vtable->task_cancel == nullptr) { + return; + } + + FlValue* value0 = fl_value_get_list_value(message_, 0); + FirebaseStorageInternalStorageFirebaseApp* app = + FIREBASE_STORAGE_INTERNAL_STORAGE_FIREBASE_APP( + fl_value_get_custom_value_object(value0)); + FlValue* value1 = fl_value_get_list_value(message_, 1); + int64_t handle = fl_value_get_int(value1); + g_autoptr(FirebaseStorageFirebaseStorageHostApiResponseHandle) + response_handle_ = + firebase_storage_firebase_storage_host_api_response_handle_new( + channel, response_handle); + self->vtable->task_cancel(app, handle, response_handle_, self->user_data); +} + +void firebase_storage_firebase_storage_host_api_set_method_handlers( + FlBinaryMessenger* messenger, const gchar* suffix, + const FirebaseStorageFirebaseStorageHostApiVTable* vtable, + gpointer user_data, GDestroyNotify user_data_free_func) { + g_autofree gchar* dot_suffix = + suffix != nullptr ? g_strdup_printf(".%s", suffix) : g_strdup(""); + g_autoptr(FirebaseStorageFirebaseStorageHostApi) api_data = + firebase_storage_firebase_storage_host_api_new(vtable, user_data, + user_data_free_func); + + g_autoptr(FirebaseStorageMessageCodec) codec = + firebase_storage_message_codec_new(); + g_autofree gchar* get_referenceby_path_channel_name = g_strdup_printf( + "dev.flutter.pigeon.firebase_storage_platform_interface." + "FirebaseStorageHostApi.getReferencebyPath%s", + dot_suffix); + g_autoptr(FlBasicMessageChannel) get_referenceby_path_channel = + fl_basic_message_channel_new(messenger, get_referenceby_path_channel_name, + FL_MESSAGE_CODEC(codec)); + fl_basic_message_channel_set_message_handler( + get_referenceby_path_channel, + firebase_storage_firebase_storage_host_api_get_referenceby_path_cb, + g_object_ref(api_data), g_object_unref); + g_autofree gchar* set_max_operation_retry_time_channel_name = g_strdup_printf( + "dev.flutter.pigeon.firebase_storage_platform_interface." + "FirebaseStorageHostApi.setMaxOperationRetryTime%s", + dot_suffix); + g_autoptr(FlBasicMessageChannel) set_max_operation_retry_time_channel = + fl_basic_message_channel_new(messenger, + set_max_operation_retry_time_channel_name, + FL_MESSAGE_CODEC(codec)); + fl_basic_message_channel_set_message_handler( + set_max_operation_retry_time_channel, + firebase_storage_firebase_storage_host_api_set_max_operation_retry_time_cb, + g_object_ref(api_data), g_object_unref); + g_autofree gchar* set_max_upload_retry_time_channel_name = g_strdup_printf( + "dev.flutter.pigeon.firebase_storage_platform_interface." + "FirebaseStorageHostApi.setMaxUploadRetryTime%s", + dot_suffix); + g_autoptr(FlBasicMessageChannel) set_max_upload_retry_time_channel = + fl_basic_message_channel_new(messenger, + set_max_upload_retry_time_channel_name, + FL_MESSAGE_CODEC(codec)); + fl_basic_message_channel_set_message_handler( + set_max_upload_retry_time_channel, + firebase_storage_firebase_storage_host_api_set_max_upload_retry_time_cb, + g_object_ref(api_data), g_object_unref); + g_autofree gchar* set_max_download_retry_time_channel_name = g_strdup_printf( + "dev.flutter.pigeon.firebase_storage_platform_interface." + "FirebaseStorageHostApi.setMaxDownloadRetryTime%s", + dot_suffix); + g_autoptr(FlBasicMessageChannel) set_max_download_retry_time_channel = + fl_basic_message_channel_new(messenger, + set_max_download_retry_time_channel_name, + FL_MESSAGE_CODEC(codec)); + fl_basic_message_channel_set_message_handler( + set_max_download_retry_time_channel, + firebase_storage_firebase_storage_host_api_set_max_download_retry_time_cb, + g_object_ref(api_data), g_object_unref); + g_autofree gchar* use_storage_emulator_channel_name = g_strdup_printf( + "dev.flutter.pigeon.firebase_storage_platform_interface." + "FirebaseStorageHostApi.useStorageEmulator%s", + dot_suffix); + g_autoptr(FlBasicMessageChannel) use_storage_emulator_channel = + fl_basic_message_channel_new(messenger, use_storage_emulator_channel_name, + FL_MESSAGE_CODEC(codec)); + fl_basic_message_channel_set_message_handler( + use_storage_emulator_channel, + firebase_storage_firebase_storage_host_api_use_storage_emulator_cb, + g_object_ref(api_data), g_object_unref); + g_autofree gchar* reference_delete_channel_name = g_strdup_printf( + "dev.flutter.pigeon.firebase_storage_platform_interface." + "FirebaseStorageHostApi.referenceDelete%s", + dot_suffix); + g_autoptr(FlBasicMessageChannel) reference_delete_channel = + fl_basic_message_channel_new(messenger, reference_delete_channel_name, + FL_MESSAGE_CODEC(codec)); + fl_basic_message_channel_set_message_handler( + reference_delete_channel, + firebase_storage_firebase_storage_host_api_reference_delete_cb, + g_object_ref(api_data), g_object_unref); + g_autofree gchar* reference_get_download_u_r_l_channel_name = g_strdup_printf( + "dev.flutter.pigeon.firebase_storage_platform_interface." + "FirebaseStorageHostApi.referenceGetDownloadURL%s", + dot_suffix); + g_autoptr(FlBasicMessageChannel) reference_get_download_u_r_l_channel = + fl_basic_message_channel_new(messenger, + reference_get_download_u_r_l_channel_name, + FL_MESSAGE_CODEC(codec)); + fl_basic_message_channel_set_message_handler( + reference_get_download_u_r_l_channel, + firebase_storage_firebase_storage_host_api_reference_get_download_u_r_l_cb, + g_object_ref(api_data), g_object_unref); + g_autofree gchar* reference_get_meta_data_channel_name = g_strdup_printf( + "dev.flutter.pigeon.firebase_storage_platform_interface." + "FirebaseStorageHostApi.referenceGetMetaData%s", + dot_suffix); + g_autoptr(FlBasicMessageChannel) reference_get_meta_data_channel = + fl_basic_message_channel_new(messenger, + reference_get_meta_data_channel_name, + FL_MESSAGE_CODEC(codec)); + fl_basic_message_channel_set_message_handler( + reference_get_meta_data_channel, + firebase_storage_firebase_storage_host_api_reference_get_meta_data_cb, + g_object_ref(api_data), g_object_unref); + g_autofree gchar* reference_list_channel_name = g_strdup_printf( + "dev.flutter.pigeon.firebase_storage_platform_interface." + "FirebaseStorageHostApi.referenceList%s", + dot_suffix); + g_autoptr(FlBasicMessageChannel) reference_list_channel = + fl_basic_message_channel_new(messenger, reference_list_channel_name, + FL_MESSAGE_CODEC(codec)); + fl_basic_message_channel_set_message_handler( + reference_list_channel, + firebase_storage_firebase_storage_host_api_reference_list_cb, + g_object_ref(api_data), g_object_unref); + g_autofree gchar* reference_list_all_channel_name = g_strdup_printf( + "dev.flutter.pigeon.firebase_storage_platform_interface." + "FirebaseStorageHostApi.referenceListAll%s", + dot_suffix); + g_autoptr(FlBasicMessageChannel) reference_list_all_channel = + fl_basic_message_channel_new(messenger, reference_list_all_channel_name, + FL_MESSAGE_CODEC(codec)); + fl_basic_message_channel_set_message_handler( + reference_list_all_channel, + firebase_storage_firebase_storage_host_api_reference_list_all_cb, + g_object_ref(api_data), g_object_unref); + g_autofree gchar* reference_get_data_channel_name = g_strdup_printf( + "dev.flutter.pigeon.firebase_storage_platform_interface." + "FirebaseStorageHostApi.referenceGetData%s", + dot_suffix); + g_autoptr(FlBasicMessageChannel) reference_get_data_channel = + fl_basic_message_channel_new(messenger, reference_get_data_channel_name, + FL_MESSAGE_CODEC(codec)); + fl_basic_message_channel_set_message_handler( + reference_get_data_channel, + firebase_storage_firebase_storage_host_api_reference_get_data_cb, + g_object_ref(api_data), g_object_unref); + g_autofree gchar* reference_put_data_channel_name = g_strdup_printf( + "dev.flutter.pigeon.firebase_storage_platform_interface." + "FirebaseStorageHostApi.referencePutData%s", + dot_suffix); + g_autoptr(FlBasicMessageChannel) reference_put_data_channel = + fl_basic_message_channel_new(messenger, reference_put_data_channel_name, + FL_MESSAGE_CODEC(codec)); + fl_basic_message_channel_set_message_handler( + reference_put_data_channel, + firebase_storage_firebase_storage_host_api_reference_put_data_cb, + g_object_ref(api_data), g_object_unref); + g_autofree gchar* reference_put_string_channel_name = g_strdup_printf( + "dev.flutter.pigeon.firebase_storage_platform_interface." + "FirebaseStorageHostApi.referencePutString%s", + dot_suffix); + g_autoptr(FlBasicMessageChannel) reference_put_string_channel = + fl_basic_message_channel_new(messenger, reference_put_string_channel_name, + FL_MESSAGE_CODEC(codec)); + fl_basic_message_channel_set_message_handler( + reference_put_string_channel, + firebase_storage_firebase_storage_host_api_reference_put_string_cb, + g_object_ref(api_data), g_object_unref); + g_autofree gchar* reference_put_file_channel_name = g_strdup_printf( + "dev.flutter.pigeon.firebase_storage_platform_interface." + "FirebaseStorageHostApi.referencePutFile%s", + dot_suffix); + g_autoptr(FlBasicMessageChannel) reference_put_file_channel = + fl_basic_message_channel_new(messenger, reference_put_file_channel_name, + FL_MESSAGE_CODEC(codec)); + fl_basic_message_channel_set_message_handler( + reference_put_file_channel, + firebase_storage_firebase_storage_host_api_reference_put_file_cb, + g_object_ref(api_data), g_object_unref); + g_autofree gchar* reference_download_file_channel_name = g_strdup_printf( + "dev.flutter.pigeon.firebase_storage_platform_interface." + "FirebaseStorageHostApi.referenceDownloadFile%s", + dot_suffix); + g_autoptr(FlBasicMessageChannel) reference_download_file_channel = + fl_basic_message_channel_new(messenger, + reference_download_file_channel_name, + FL_MESSAGE_CODEC(codec)); + fl_basic_message_channel_set_message_handler( + reference_download_file_channel, + firebase_storage_firebase_storage_host_api_reference_download_file_cb, + g_object_ref(api_data), g_object_unref); + g_autofree gchar* reference_update_metadata_channel_name = g_strdup_printf( + "dev.flutter.pigeon.firebase_storage_platform_interface." + "FirebaseStorageHostApi.referenceUpdateMetadata%s", + dot_suffix); + g_autoptr(FlBasicMessageChannel) reference_update_metadata_channel = + fl_basic_message_channel_new(messenger, + reference_update_metadata_channel_name, + FL_MESSAGE_CODEC(codec)); + fl_basic_message_channel_set_message_handler( + reference_update_metadata_channel, + firebase_storage_firebase_storage_host_api_reference_update_metadata_cb, + g_object_ref(api_data), g_object_unref); + g_autofree gchar* task_pause_channel_name = g_strdup_printf( + "dev.flutter.pigeon.firebase_storage_platform_interface." + "FirebaseStorageHostApi.taskPause%s", + dot_suffix); + g_autoptr(FlBasicMessageChannel) task_pause_channel = + fl_basic_message_channel_new(messenger, task_pause_channel_name, + FL_MESSAGE_CODEC(codec)); + fl_basic_message_channel_set_message_handler( + task_pause_channel, + firebase_storage_firebase_storage_host_api_task_pause_cb, + g_object_ref(api_data), g_object_unref); + g_autofree gchar* task_resume_channel_name = g_strdup_printf( + "dev.flutter.pigeon.firebase_storage_platform_interface." + "FirebaseStorageHostApi.taskResume%s", + dot_suffix); + g_autoptr(FlBasicMessageChannel) task_resume_channel = + fl_basic_message_channel_new(messenger, task_resume_channel_name, + FL_MESSAGE_CODEC(codec)); + fl_basic_message_channel_set_message_handler( + task_resume_channel, + firebase_storage_firebase_storage_host_api_task_resume_cb, + g_object_ref(api_data), g_object_unref); + g_autofree gchar* task_cancel_channel_name = g_strdup_printf( + "dev.flutter.pigeon.firebase_storage_platform_interface." + "FirebaseStorageHostApi.taskCancel%s", + dot_suffix); + g_autoptr(FlBasicMessageChannel) task_cancel_channel = + fl_basic_message_channel_new(messenger, task_cancel_channel_name, + FL_MESSAGE_CODEC(codec)); + fl_basic_message_channel_set_message_handler( + task_cancel_channel, + firebase_storage_firebase_storage_host_api_task_cancel_cb, + g_object_ref(api_data), g_object_unref); +} + +void firebase_storage_firebase_storage_host_api_clear_method_handlers( + FlBinaryMessenger* messenger, const gchar* suffix) { + g_autofree gchar* dot_suffix = + suffix != nullptr ? g_strdup_printf(".%s", suffix) : g_strdup(""); + + g_autoptr(FirebaseStorageMessageCodec) codec = + firebase_storage_message_codec_new(); + g_autofree gchar* get_referenceby_path_channel_name = g_strdup_printf( + "dev.flutter.pigeon.firebase_storage_platform_interface." + "FirebaseStorageHostApi.getReferencebyPath%s", + dot_suffix); + g_autoptr(FlBasicMessageChannel) get_referenceby_path_channel = + fl_basic_message_channel_new(messenger, get_referenceby_path_channel_name, + FL_MESSAGE_CODEC(codec)); + fl_basic_message_channel_set_message_handler(get_referenceby_path_channel, + nullptr, nullptr, nullptr); + g_autofree gchar* set_max_operation_retry_time_channel_name = g_strdup_printf( + "dev.flutter.pigeon.firebase_storage_platform_interface." + "FirebaseStorageHostApi.setMaxOperationRetryTime%s", + dot_suffix); + g_autoptr(FlBasicMessageChannel) set_max_operation_retry_time_channel = + fl_basic_message_channel_new(messenger, + set_max_operation_retry_time_channel_name, + FL_MESSAGE_CODEC(codec)); + fl_basic_message_channel_set_message_handler( + set_max_operation_retry_time_channel, nullptr, nullptr, nullptr); + g_autofree gchar* set_max_upload_retry_time_channel_name = g_strdup_printf( + "dev.flutter.pigeon.firebase_storage_platform_interface." + "FirebaseStorageHostApi.setMaxUploadRetryTime%s", + dot_suffix); + g_autoptr(FlBasicMessageChannel) set_max_upload_retry_time_channel = + fl_basic_message_channel_new(messenger, + set_max_upload_retry_time_channel_name, + FL_MESSAGE_CODEC(codec)); + fl_basic_message_channel_set_message_handler( + set_max_upload_retry_time_channel, nullptr, nullptr, nullptr); + g_autofree gchar* set_max_download_retry_time_channel_name = g_strdup_printf( + "dev.flutter.pigeon.firebase_storage_platform_interface." + "FirebaseStorageHostApi.setMaxDownloadRetryTime%s", + dot_suffix); + g_autoptr(FlBasicMessageChannel) set_max_download_retry_time_channel = + fl_basic_message_channel_new(messenger, + set_max_download_retry_time_channel_name, + FL_MESSAGE_CODEC(codec)); + fl_basic_message_channel_set_message_handler( + set_max_download_retry_time_channel, nullptr, nullptr, nullptr); + g_autofree gchar* use_storage_emulator_channel_name = g_strdup_printf( + "dev.flutter.pigeon.firebase_storage_platform_interface." + "FirebaseStorageHostApi.useStorageEmulator%s", + dot_suffix); + g_autoptr(FlBasicMessageChannel) use_storage_emulator_channel = + fl_basic_message_channel_new(messenger, use_storage_emulator_channel_name, + FL_MESSAGE_CODEC(codec)); + fl_basic_message_channel_set_message_handler(use_storage_emulator_channel, + nullptr, nullptr, nullptr); + g_autofree gchar* reference_delete_channel_name = g_strdup_printf( + "dev.flutter.pigeon.firebase_storage_platform_interface." + "FirebaseStorageHostApi.referenceDelete%s", + dot_suffix); + g_autoptr(FlBasicMessageChannel) reference_delete_channel = + fl_basic_message_channel_new(messenger, reference_delete_channel_name, + FL_MESSAGE_CODEC(codec)); + fl_basic_message_channel_set_message_handler(reference_delete_channel, + nullptr, nullptr, nullptr); + g_autofree gchar* reference_get_download_u_r_l_channel_name = g_strdup_printf( + "dev.flutter.pigeon.firebase_storage_platform_interface." + "FirebaseStorageHostApi.referenceGetDownloadURL%s", + dot_suffix); + g_autoptr(FlBasicMessageChannel) reference_get_download_u_r_l_channel = + fl_basic_message_channel_new(messenger, + reference_get_download_u_r_l_channel_name, + FL_MESSAGE_CODEC(codec)); + fl_basic_message_channel_set_message_handler( + reference_get_download_u_r_l_channel, nullptr, nullptr, nullptr); + g_autofree gchar* reference_get_meta_data_channel_name = g_strdup_printf( + "dev.flutter.pigeon.firebase_storage_platform_interface." + "FirebaseStorageHostApi.referenceGetMetaData%s", + dot_suffix); + g_autoptr(FlBasicMessageChannel) reference_get_meta_data_channel = + fl_basic_message_channel_new(messenger, + reference_get_meta_data_channel_name, + FL_MESSAGE_CODEC(codec)); + fl_basic_message_channel_set_message_handler(reference_get_meta_data_channel, + nullptr, nullptr, nullptr); + g_autofree gchar* reference_list_channel_name = g_strdup_printf( + "dev.flutter.pigeon.firebase_storage_platform_interface." + "FirebaseStorageHostApi.referenceList%s", + dot_suffix); + g_autoptr(FlBasicMessageChannel) reference_list_channel = + fl_basic_message_channel_new(messenger, reference_list_channel_name, + FL_MESSAGE_CODEC(codec)); + fl_basic_message_channel_set_message_handler(reference_list_channel, nullptr, + nullptr, nullptr); + g_autofree gchar* reference_list_all_channel_name = g_strdup_printf( + "dev.flutter.pigeon.firebase_storage_platform_interface." + "FirebaseStorageHostApi.referenceListAll%s", + dot_suffix); + g_autoptr(FlBasicMessageChannel) reference_list_all_channel = + fl_basic_message_channel_new(messenger, reference_list_all_channel_name, + FL_MESSAGE_CODEC(codec)); + fl_basic_message_channel_set_message_handler(reference_list_all_channel, + nullptr, nullptr, nullptr); + g_autofree gchar* reference_get_data_channel_name = g_strdup_printf( + "dev.flutter.pigeon.firebase_storage_platform_interface." + "FirebaseStorageHostApi.referenceGetData%s", + dot_suffix); + g_autoptr(FlBasicMessageChannel) reference_get_data_channel = + fl_basic_message_channel_new(messenger, reference_get_data_channel_name, + FL_MESSAGE_CODEC(codec)); + fl_basic_message_channel_set_message_handler(reference_get_data_channel, + nullptr, nullptr, nullptr); + g_autofree gchar* reference_put_data_channel_name = g_strdup_printf( + "dev.flutter.pigeon.firebase_storage_platform_interface." + "FirebaseStorageHostApi.referencePutData%s", + dot_suffix); + g_autoptr(FlBasicMessageChannel) reference_put_data_channel = + fl_basic_message_channel_new(messenger, reference_put_data_channel_name, + FL_MESSAGE_CODEC(codec)); + fl_basic_message_channel_set_message_handler(reference_put_data_channel, + nullptr, nullptr, nullptr); + g_autofree gchar* reference_put_string_channel_name = g_strdup_printf( + "dev.flutter.pigeon.firebase_storage_platform_interface." + "FirebaseStorageHostApi.referencePutString%s", + dot_suffix); + g_autoptr(FlBasicMessageChannel) reference_put_string_channel = + fl_basic_message_channel_new(messenger, reference_put_string_channel_name, + FL_MESSAGE_CODEC(codec)); + fl_basic_message_channel_set_message_handler(reference_put_string_channel, + nullptr, nullptr, nullptr); + g_autofree gchar* reference_put_file_channel_name = g_strdup_printf( + "dev.flutter.pigeon.firebase_storage_platform_interface." + "FirebaseStorageHostApi.referencePutFile%s", + dot_suffix); + g_autoptr(FlBasicMessageChannel) reference_put_file_channel = + fl_basic_message_channel_new(messenger, reference_put_file_channel_name, + FL_MESSAGE_CODEC(codec)); + fl_basic_message_channel_set_message_handler(reference_put_file_channel, + nullptr, nullptr, nullptr); + g_autofree gchar* reference_download_file_channel_name = g_strdup_printf( + "dev.flutter.pigeon.firebase_storage_platform_interface." + "FirebaseStorageHostApi.referenceDownloadFile%s", + dot_suffix); + g_autoptr(FlBasicMessageChannel) reference_download_file_channel = + fl_basic_message_channel_new(messenger, + reference_download_file_channel_name, + FL_MESSAGE_CODEC(codec)); + fl_basic_message_channel_set_message_handler(reference_download_file_channel, + nullptr, nullptr, nullptr); + g_autofree gchar* reference_update_metadata_channel_name = g_strdup_printf( + "dev.flutter.pigeon.firebase_storage_platform_interface." + "FirebaseStorageHostApi.referenceUpdateMetadata%s", + dot_suffix); + g_autoptr(FlBasicMessageChannel) reference_update_metadata_channel = + fl_basic_message_channel_new(messenger, + reference_update_metadata_channel_name, + FL_MESSAGE_CODEC(codec)); + fl_basic_message_channel_set_message_handler( + reference_update_metadata_channel, nullptr, nullptr, nullptr); + g_autofree gchar* task_pause_channel_name = g_strdup_printf( + "dev.flutter.pigeon.firebase_storage_platform_interface." + "FirebaseStorageHostApi.taskPause%s", + dot_suffix); + g_autoptr(FlBasicMessageChannel) task_pause_channel = + fl_basic_message_channel_new(messenger, task_pause_channel_name, + FL_MESSAGE_CODEC(codec)); + fl_basic_message_channel_set_message_handler(task_pause_channel, nullptr, + nullptr, nullptr); + g_autofree gchar* task_resume_channel_name = g_strdup_printf( + "dev.flutter.pigeon.firebase_storage_platform_interface." + "FirebaseStorageHostApi.taskResume%s", + dot_suffix); + g_autoptr(FlBasicMessageChannel) task_resume_channel = + fl_basic_message_channel_new(messenger, task_resume_channel_name, + FL_MESSAGE_CODEC(codec)); + fl_basic_message_channel_set_message_handler(task_resume_channel, nullptr, + nullptr, nullptr); + g_autofree gchar* task_cancel_channel_name = g_strdup_printf( + "dev.flutter.pigeon.firebase_storage_platform_interface." + "FirebaseStorageHostApi.taskCancel%s", + dot_suffix); + g_autoptr(FlBasicMessageChannel) task_cancel_channel = + fl_basic_message_channel_new(messenger, task_cancel_channel_name, + FL_MESSAGE_CODEC(codec)); + fl_basic_message_channel_set_message_handler(task_cancel_channel, nullptr, + nullptr, nullptr); +} + +void firebase_storage_firebase_storage_host_api_respond_get_referenceby_path( + FirebaseStorageFirebaseStorageHostApiResponseHandle* response_handle, + FirebaseStorageInternalStorageReference* return_value) { + g_autoptr( + FirebaseStorageFirebaseStorageHostApiGetReferencebyPathResponse) response = + firebase_storage_firebase_storage_host_api_get_referenceby_path_response_new( + return_value); + g_autoptr(GError) error = nullptr; + if (!fl_basic_message_channel_respond(response_handle->channel, + response_handle->response_handle, + response->value, &error)) { + g_warning("Failed to send response to %s.%s: %s", "FirebaseStorageHostApi", + "getReferencebyPath", error->message); + } +} + +void firebase_storage_firebase_storage_host_api_respond_error_get_referenceby_path( + FirebaseStorageFirebaseStorageHostApiResponseHandle* response_handle, + const gchar* code, const gchar* message, FlValue* details) { + g_autoptr( + FirebaseStorageFirebaseStorageHostApiGetReferencebyPathResponse) response = + firebase_storage_firebase_storage_host_api_get_referenceby_path_response_new_error( + code, message, details); + g_autoptr(GError) error = nullptr; + if (!fl_basic_message_channel_respond(response_handle->channel, + response_handle->response_handle, + response->value, &error)) { + g_warning("Failed to send response to %s.%s: %s", "FirebaseStorageHostApi", + "getReferencebyPath", error->message); + } +} + +void firebase_storage_firebase_storage_host_api_respond_set_max_operation_retry_time( + FirebaseStorageFirebaseStorageHostApiResponseHandle* response_handle) { + g_autoptr( + FirebaseStorageFirebaseStorageHostApiSetMaxOperationRetryTimeResponse) response = + firebase_storage_firebase_storage_host_api_set_max_operation_retry_time_response_new(); + g_autoptr(GError) error = nullptr; + if (!fl_basic_message_channel_respond(response_handle->channel, + response_handle->response_handle, + response->value, &error)) { + g_warning("Failed to send response to %s.%s: %s", "FirebaseStorageHostApi", + "setMaxOperationRetryTime", error->message); + } +} + +void firebase_storage_firebase_storage_host_api_respond_error_set_max_operation_retry_time( + FirebaseStorageFirebaseStorageHostApiResponseHandle* response_handle, + const gchar* code, const gchar* message, FlValue* details) { + g_autoptr( + FirebaseStorageFirebaseStorageHostApiSetMaxOperationRetryTimeResponse) + response = + firebase_storage_firebase_storage_host_api_set_max_operation_retry_time_response_new_error( + code, message, details); + g_autoptr(GError) error = nullptr; + if (!fl_basic_message_channel_respond(response_handle->channel, + response_handle->response_handle, + response->value, &error)) { + g_warning("Failed to send response to %s.%s: %s", "FirebaseStorageHostApi", + "setMaxOperationRetryTime", error->message); + } +} + +void firebase_storage_firebase_storage_host_api_respond_set_max_upload_retry_time( + FirebaseStorageFirebaseStorageHostApiResponseHandle* response_handle) { + g_autoptr( + FirebaseStorageFirebaseStorageHostApiSetMaxUploadRetryTimeResponse) response = + firebase_storage_firebase_storage_host_api_set_max_upload_retry_time_response_new(); + g_autoptr(GError) error = nullptr; + if (!fl_basic_message_channel_respond(response_handle->channel, + response_handle->response_handle, + response->value, &error)) { + g_warning("Failed to send response to %s.%s: %s", "FirebaseStorageHostApi", + "setMaxUploadRetryTime", error->message); + } +} + +void firebase_storage_firebase_storage_host_api_respond_error_set_max_upload_retry_time( + FirebaseStorageFirebaseStorageHostApiResponseHandle* response_handle, + const gchar* code, const gchar* message, FlValue* details) { + g_autoptr( + FirebaseStorageFirebaseStorageHostApiSetMaxUploadRetryTimeResponse) response = + firebase_storage_firebase_storage_host_api_set_max_upload_retry_time_response_new_error( + code, message, details); + g_autoptr(GError) error = nullptr; + if (!fl_basic_message_channel_respond(response_handle->channel, + response_handle->response_handle, + response->value, &error)) { + g_warning("Failed to send response to %s.%s: %s", "FirebaseStorageHostApi", + "setMaxUploadRetryTime", error->message); + } +} + +void firebase_storage_firebase_storage_host_api_respond_set_max_download_retry_time( + FirebaseStorageFirebaseStorageHostApiResponseHandle* response_handle) { + g_autoptr( + FirebaseStorageFirebaseStorageHostApiSetMaxDownloadRetryTimeResponse) response = + firebase_storage_firebase_storage_host_api_set_max_download_retry_time_response_new(); + g_autoptr(GError) error = nullptr; + if (!fl_basic_message_channel_respond(response_handle->channel, + response_handle->response_handle, + response->value, &error)) { + g_warning("Failed to send response to %s.%s: %s", "FirebaseStorageHostApi", + "setMaxDownloadRetryTime", error->message); + } +} + +void firebase_storage_firebase_storage_host_api_respond_error_set_max_download_retry_time( + FirebaseStorageFirebaseStorageHostApiResponseHandle* response_handle, + const gchar* code, const gchar* message, FlValue* details) { + g_autoptr( + FirebaseStorageFirebaseStorageHostApiSetMaxDownloadRetryTimeResponse) + response = + firebase_storage_firebase_storage_host_api_set_max_download_retry_time_response_new_error( + code, message, details); + g_autoptr(GError) error = nullptr; + if (!fl_basic_message_channel_respond(response_handle->channel, + response_handle->response_handle, + response->value, &error)) { + g_warning("Failed to send response to %s.%s: %s", "FirebaseStorageHostApi", + "setMaxDownloadRetryTime", error->message); + } +} + +void firebase_storage_firebase_storage_host_api_respond_use_storage_emulator( + FirebaseStorageFirebaseStorageHostApiResponseHandle* response_handle) { + g_autoptr( + FirebaseStorageFirebaseStorageHostApiUseStorageEmulatorResponse) response = + firebase_storage_firebase_storage_host_api_use_storage_emulator_response_new(); + g_autoptr(GError) error = nullptr; + if (!fl_basic_message_channel_respond(response_handle->channel, + response_handle->response_handle, + response->value, &error)) { + g_warning("Failed to send response to %s.%s: %s", "FirebaseStorageHostApi", + "useStorageEmulator", error->message); + } +} + +void firebase_storage_firebase_storage_host_api_respond_error_use_storage_emulator( + FirebaseStorageFirebaseStorageHostApiResponseHandle* response_handle, + const gchar* code, const gchar* message, FlValue* details) { + g_autoptr( + FirebaseStorageFirebaseStorageHostApiUseStorageEmulatorResponse) response = + firebase_storage_firebase_storage_host_api_use_storage_emulator_response_new_error( + code, message, details); + g_autoptr(GError) error = nullptr; + if (!fl_basic_message_channel_respond(response_handle->channel, + response_handle->response_handle, + response->value, &error)) { + g_warning("Failed to send response to %s.%s: %s", "FirebaseStorageHostApi", + "useStorageEmulator", error->message); + } +} + +void firebase_storage_firebase_storage_host_api_respond_reference_delete( + FirebaseStorageFirebaseStorageHostApiResponseHandle* response_handle) { + g_autoptr( + FirebaseStorageFirebaseStorageHostApiReferenceDeleteResponse) response = + firebase_storage_firebase_storage_host_api_reference_delete_response_new(); + g_autoptr(GError) error = nullptr; + if (!fl_basic_message_channel_respond(response_handle->channel, + response_handle->response_handle, + response->value, &error)) { + g_warning("Failed to send response to %s.%s: %s", "FirebaseStorageHostApi", + "referenceDelete", error->message); + } +} + +void firebase_storage_firebase_storage_host_api_respond_error_reference_delete( + FirebaseStorageFirebaseStorageHostApiResponseHandle* response_handle, + const gchar* code, const gchar* message, FlValue* details) { + g_autoptr( + FirebaseStorageFirebaseStorageHostApiReferenceDeleteResponse) response = + firebase_storage_firebase_storage_host_api_reference_delete_response_new_error( + code, message, details); + g_autoptr(GError) error = nullptr; + if (!fl_basic_message_channel_respond(response_handle->channel, + response_handle->response_handle, + response->value, &error)) { + g_warning("Failed to send response to %s.%s: %s", "FirebaseStorageHostApi", + "referenceDelete", error->message); + } +} + +void firebase_storage_firebase_storage_host_api_respond_reference_get_download_u_r_l( + FirebaseStorageFirebaseStorageHostApiResponseHandle* response_handle, + const gchar* return_value) { + g_autoptr( + FirebaseStorageFirebaseStorageHostApiReferenceGetDownloadURLResponse) + response = + firebase_storage_firebase_storage_host_api_reference_get_download_u_r_l_response_new( + return_value); + g_autoptr(GError) error = nullptr; + if (!fl_basic_message_channel_respond(response_handle->channel, + response_handle->response_handle, + response->value, &error)) { + g_warning("Failed to send response to %s.%s: %s", "FirebaseStorageHostApi", + "referenceGetDownloadURL", error->message); + } +} + +void firebase_storage_firebase_storage_host_api_respond_error_reference_get_download_u_r_l( + FirebaseStorageFirebaseStorageHostApiResponseHandle* response_handle, + const gchar* code, const gchar* message, FlValue* details) { + g_autoptr( + FirebaseStorageFirebaseStorageHostApiReferenceGetDownloadURLResponse) + response = + firebase_storage_firebase_storage_host_api_reference_get_download_u_r_l_response_new_error( + code, message, details); + g_autoptr(GError) error = nullptr; + if (!fl_basic_message_channel_respond(response_handle->channel, + response_handle->response_handle, + response->value, &error)) { + g_warning("Failed to send response to %s.%s: %s", "FirebaseStorageHostApi", + "referenceGetDownloadURL", error->message); + } +} + +void firebase_storage_firebase_storage_host_api_respond_reference_get_meta_data( + FirebaseStorageFirebaseStorageHostApiResponseHandle* response_handle, + FirebaseStorageInternalFullMetaData* return_value) { + g_autoptr( + FirebaseStorageFirebaseStorageHostApiReferenceGetMetaDataResponse) response = + firebase_storage_firebase_storage_host_api_reference_get_meta_data_response_new( + return_value); + g_autoptr(GError) error = nullptr; + if (!fl_basic_message_channel_respond(response_handle->channel, + response_handle->response_handle, + response->value, &error)) { + g_warning("Failed to send response to %s.%s: %s", "FirebaseStorageHostApi", + "referenceGetMetaData", error->message); + } +} + +void firebase_storage_firebase_storage_host_api_respond_error_reference_get_meta_data( + FirebaseStorageFirebaseStorageHostApiResponseHandle* response_handle, + const gchar* code, const gchar* message, FlValue* details) { + g_autoptr( + FirebaseStorageFirebaseStorageHostApiReferenceGetMetaDataResponse) response = + firebase_storage_firebase_storage_host_api_reference_get_meta_data_response_new_error( + code, message, details); + g_autoptr(GError) error = nullptr; + if (!fl_basic_message_channel_respond(response_handle->channel, + response_handle->response_handle, + response->value, &error)) { + g_warning("Failed to send response to %s.%s: %s", "FirebaseStorageHostApi", + "referenceGetMetaData", error->message); + } +} + +void firebase_storage_firebase_storage_host_api_respond_reference_list( + FirebaseStorageFirebaseStorageHostApiResponseHandle* response_handle, + FirebaseStorageInternalListResult* return_value) { + g_autoptr( + FirebaseStorageFirebaseStorageHostApiReferenceListResponse) response = + firebase_storage_firebase_storage_host_api_reference_list_response_new( + return_value); + g_autoptr(GError) error = nullptr; + if (!fl_basic_message_channel_respond(response_handle->channel, + response_handle->response_handle, + response->value, &error)) { + g_warning("Failed to send response to %s.%s: %s", "FirebaseStorageHostApi", + "referenceList", error->message); + } +} + +void firebase_storage_firebase_storage_host_api_respond_error_reference_list( + FirebaseStorageFirebaseStorageHostApiResponseHandle* response_handle, + const gchar* code, const gchar* message, FlValue* details) { + g_autoptr( + FirebaseStorageFirebaseStorageHostApiReferenceListResponse) response = + firebase_storage_firebase_storage_host_api_reference_list_response_new_error( + code, message, details); + g_autoptr(GError) error = nullptr; + if (!fl_basic_message_channel_respond(response_handle->channel, + response_handle->response_handle, + response->value, &error)) { + g_warning("Failed to send response to %s.%s: %s", "FirebaseStorageHostApi", + "referenceList", error->message); + } +} + +void firebase_storage_firebase_storage_host_api_respond_reference_list_all( + FirebaseStorageFirebaseStorageHostApiResponseHandle* response_handle, + FirebaseStorageInternalListResult* return_value) { + g_autoptr( + FirebaseStorageFirebaseStorageHostApiReferenceListAllResponse) response = + firebase_storage_firebase_storage_host_api_reference_list_all_response_new( + return_value); + g_autoptr(GError) error = nullptr; + if (!fl_basic_message_channel_respond(response_handle->channel, + response_handle->response_handle, + response->value, &error)) { + g_warning("Failed to send response to %s.%s: %s", "FirebaseStorageHostApi", + "referenceListAll", error->message); + } +} + +void firebase_storage_firebase_storage_host_api_respond_error_reference_list_all( + FirebaseStorageFirebaseStorageHostApiResponseHandle* response_handle, + const gchar* code, const gchar* message, FlValue* details) { + g_autoptr( + FirebaseStorageFirebaseStorageHostApiReferenceListAllResponse) response = + firebase_storage_firebase_storage_host_api_reference_list_all_response_new_error( + code, message, details); + g_autoptr(GError) error = nullptr; + if (!fl_basic_message_channel_respond(response_handle->channel, + response_handle->response_handle, + response->value, &error)) { + g_warning("Failed to send response to %s.%s: %s", "FirebaseStorageHostApi", + "referenceListAll", error->message); + } +} + +void firebase_storage_firebase_storage_host_api_respond_reference_get_data( + FirebaseStorageFirebaseStorageHostApiResponseHandle* response_handle, + const uint8_t* return_value, size_t return_value_length) { + g_autoptr( + FirebaseStorageFirebaseStorageHostApiReferenceGetDataResponse) response = + firebase_storage_firebase_storage_host_api_reference_get_data_response_new( + return_value, return_value_length); + g_autoptr(GError) error = nullptr; + if (!fl_basic_message_channel_respond(response_handle->channel, + response_handle->response_handle, + response->value, &error)) { + g_warning("Failed to send response to %s.%s: %s", "FirebaseStorageHostApi", + "referenceGetData", error->message); + } +} + +void firebase_storage_firebase_storage_host_api_respond_error_reference_get_data( + FirebaseStorageFirebaseStorageHostApiResponseHandle* response_handle, + const gchar* code, const gchar* message, FlValue* details) { + g_autoptr( + FirebaseStorageFirebaseStorageHostApiReferenceGetDataResponse) response = + firebase_storage_firebase_storage_host_api_reference_get_data_response_new_error( + code, message, details); + g_autoptr(GError) error = nullptr; + if (!fl_basic_message_channel_respond(response_handle->channel, + response_handle->response_handle, + response->value, &error)) { + g_warning("Failed to send response to %s.%s: %s", "FirebaseStorageHostApi", + "referenceGetData", error->message); + } +} + +void firebase_storage_firebase_storage_host_api_respond_reference_put_data( + FirebaseStorageFirebaseStorageHostApiResponseHandle* response_handle, + const gchar* return_value) { + g_autoptr( + FirebaseStorageFirebaseStorageHostApiReferencePutDataResponse) response = + firebase_storage_firebase_storage_host_api_reference_put_data_response_new( + return_value); + g_autoptr(GError) error = nullptr; + if (!fl_basic_message_channel_respond(response_handle->channel, + response_handle->response_handle, + response->value, &error)) { + g_warning("Failed to send response to %s.%s: %s", "FirebaseStorageHostApi", + "referencePutData", error->message); + } +} + +void firebase_storage_firebase_storage_host_api_respond_error_reference_put_data( + FirebaseStorageFirebaseStorageHostApiResponseHandle* response_handle, + const gchar* code, const gchar* message, FlValue* details) { + g_autoptr( + FirebaseStorageFirebaseStorageHostApiReferencePutDataResponse) response = + firebase_storage_firebase_storage_host_api_reference_put_data_response_new_error( + code, message, details); + g_autoptr(GError) error = nullptr; + if (!fl_basic_message_channel_respond(response_handle->channel, + response_handle->response_handle, + response->value, &error)) { + g_warning("Failed to send response to %s.%s: %s", "FirebaseStorageHostApi", + "referencePutData", error->message); + } +} + +void firebase_storage_firebase_storage_host_api_respond_reference_put_string( + FirebaseStorageFirebaseStorageHostApiResponseHandle* response_handle, + const gchar* return_value) { + g_autoptr( + FirebaseStorageFirebaseStorageHostApiReferencePutStringResponse) response = + firebase_storage_firebase_storage_host_api_reference_put_string_response_new( + return_value); + g_autoptr(GError) error = nullptr; + if (!fl_basic_message_channel_respond(response_handle->channel, + response_handle->response_handle, + response->value, &error)) { + g_warning("Failed to send response to %s.%s: %s", "FirebaseStorageHostApi", + "referencePutString", error->message); + } +} + +void firebase_storage_firebase_storage_host_api_respond_error_reference_put_string( + FirebaseStorageFirebaseStorageHostApiResponseHandle* response_handle, + const gchar* code, const gchar* message, FlValue* details) { + g_autoptr( + FirebaseStorageFirebaseStorageHostApiReferencePutStringResponse) response = + firebase_storage_firebase_storage_host_api_reference_put_string_response_new_error( + code, message, details); + g_autoptr(GError) error = nullptr; + if (!fl_basic_message_channel_respond(response_handle->channel, + response_handle->response_handle, + response->value, &error)) { + g_warning("Failed to send response to %s.%s: %s", "FirebaseStorageHostApi", + "referencePutString", error->message); + } +} + +void firebase_storage_firebase_storage_host_api_respond_reference_put_file( + FirebaseStorageFirebaseStorageHostApiResponseHandle* response_handle, + const gchar* return_value) { + g_autoptr( + FirebaseStorageFirebaseStorageHostApiReferencePutFileResponse) response = + firebase_storage_firebase_storage_host_api_reference_put_file_response_new( + return_value); + g_autoptr(GError) error = nullptr; + if (!fl_basic_message_channel_respond(response_handle->channel, + response_handle->response_handle, + response->value, &error)) { + g_warning("Failed to send response to %s.%s: %s", "FirebaseStorageHostApi", + "referencePutFile", error->message); + } +} + +void firebase_storage_firebase_storage_host_api_respond_error_reference_put_file( + FirebaseStorageFirebaseStorageHostApiResponseHandle* response_handle, + const gchar* code, const gchar* message, FlValue* details) { + g_autoptr( + FirebaseStorageFirebaseStorageHostApiReferencePutFileResponse) response = + firebase_storage_firebase_storage_host_api_reference_put_file_response_new_error( + code, message, details); + g_autoptr(GError) error = nullptr; + if (!fl_basic_message_channel_respond(response_handle->channel, + response_handle->response_handle, + response->value, &error)) { + g_warning("Failed to send response to %s.%s: %s", "FirebaseStorageHostApi", + "referencePutFile", error->message); + } +} + +void firebase_storage_firebase_storage_host_api_respond_reference_download_file( + FirebaseStorageFirebaseStorageHostApiResponseHandle* response_handle, + const gchar* return_value) { + g_autoptr( + FirebaseStorageFirebaseStorageHostApiReferenceDownloadFileResponse) response = + firebase_storage_firebase_storage_host_api_reference_download_file_response_new( + return_value); + g_autoptr(GError) error = nullptr; + if (!fl_basic_message_channel_respond(response_handle->channel, + response_handle->response_handle, + response->value, &error)) { + g_warning("Failed to send response to %s.%s: %s", "FirebaseStorageHostApi", + "referenceDownloadFile", error->message); + } +} + +void firebase_storage_firebase_storage_host_api_respond_error_reference_download_file( + FirebaseStorageFirebaseStorageHostApiResponseHandle* response_handle, + const gchar* code, const gchar* message, FlValue* details) { + g_autoptr( + FirebaseStorageFirebaseStorageHostApiReferenceDownloadFileResponse) response = + firebase_storage_firebase_storage_host_api_reference_download_file_response_new_error( + code, message, details); + g_autoptr(GError) error = nullptr; + if (!fl_basic_message_channel_respond(response_handle->channel, + response_handle->response_handle, + response->value, &error)) { + g_warning("Failed to send response to %s.%s: %s", "FirebaseStorageHostApi", + "referenceDownloadFile", error->message); + } +} + +void firebase_storage_firebase_storage_host_api_respond_reference_update_metadata( + FirebaseStorageFirebaseStorageHostApiResponseHandle* response_handle, + FirebaseStorageInternalFullMetaData* return_value) { + g_autoptr( + FirebaseStorageFirebaseStorageHostApiReferenceUpdateMetadataResponse) + response = + firebase_storage_firebase_storage_host_api_reference_update_metadata_response_new( + return_value); + g_autoptr(GError) error = nullptr; + if (!fl_basic_message_channel_respond(response_handle->channel, + response_handle->response_handle, + response->value, &error)) { + g_warning("Failed to send response to %s.%s: %s", "FirebaseStorageHostApi", + "referenceUpdateMetadata", error->message); + } +} + +void firebase_storage_firebase_storage_host_api_respond_error_reference_update_metadata( + FirebaseStorageFirebaseStorageHostApiResponseHandle* response_handle, + const gchar* code, const gchar* message, FlValue* details) { + g_autoptr( + FirebaseStorageFirebaseStorageHostApiReferenceUpdateMetadataResponse) + response = + firebase_storage_firebase_storage_host_api_reference_update_metadata_response_new_error( + code, message, details); + g_autoptr(GError) error = nullptr; + if (!fl_basic_message_channel_respond(response_handle->channel, + response_handle->response_handle, + response->value, &error)) { + g_warning("Failed to send response to %s.%s: %s", "FirebaseStorageHostApi", + "referenceUpdateMetadata", error->message); + } +} + +void firebase_storage_firebase_storage_host_api_respond_task_pause( + FirebaseStorageFirebaseStorageHostApiResponseHandle* response_handle, + FlValue* return_value) { + g_autoptr(FirebaseStorageFirebaseStorageHostApiTaskPauseResponse) response = + firebase_storage_firebase_storage_host_api_task_pause_response_new( + return_value); + g_autoptr(GError) error = nullptr; + if (!fl_basic_message_channel_respond(response_handle->channel, + response_handle->response_handle, + response->value, &error)) { + g_warning("Failed to send response to %s.%s: %s", "FirebaseStorageHostApi", + "taskPause", error->message); + } +} + +void firebase_storage_firebase_storage_host_api_respond_error_task_pause( + FirebaseStorageFirebaseStorageHostApiResponseHandle* response_handle, + const gchar* code, const gchar* message, FlValue* details) { + g_autoptr(FirebaseStorageFirebaseStorageHostApiTaskPauseResponse) response = + firebase_storage_firebase_storage_host_api_task_pause_response_new_error( + code, message, details); + g_autoptr(GError) error = nullptr; + if (!fl_basic_message_channel_respond(response_handle->channel, + response_handle->response_handle, + response->value, &error)) { + g_warning("Failed to send response to %s.%s: %s", "FirebaseStorageHostApi", + "taskPause", error->message); + } +} + +void firebase_storage_firebase_storage_host_api_respond_task_resume( + FirebaseStorageFirebaseStorageHostApiResponseHandle* response_handle, + FlValue* return_value) { + g_autoptr(FirebaseStorageFirebaseStorageHostApiTaskResumeResponse) response = + firebase_storage_firebase_storage_host_api_task_resume_response_new( + return_value); + g_autoptr(GError) error = nullptr; + if (!fl_basic_message_channel_respond(response_handle->channel, + response_handle->response_handle, + response->value, &error)) { + g_warning("Failed to send response to %s.%s: %s", "FirebaseStorageHostApi", + "taskResume", error->message); + } +} + +void firebase_storage_firebase_storage_host_api_respond_error_task_resume( + FirebaseStorageFirebaseStorageHostApiResponseHandle* response_handle, + const gchar* code, const gchar* message, FlValue* details) { + g_autoptr(FirebaseStorageFirebaseStorageHostApiTaskResumeResponse) response = + firebase_storage_firebase_storage_host_api_task_resume_response_new_error( + code, message, details); + g_autoptr(GError) error = nullptr; + if (!fl_basic_message_channel_respond(response_handle->channel, + response_handle->response_handle, + response->value, &error)) { + g_warning("Failed to send response to %s.%s: %s", "FirebaseStorageHostApi", + "taskResume", error->message); + } +} + +void firebase_storage_firebase_storage_host_api_respond_task_cancel( + FirebaseStorageFirebaseStorageHostApiResponseHandle* response_handle, + FlValue* return_value) { + g_autoptr(FirebaseStorageFirebaseStorageHostApiTaskCancelResponse) response = + firebase_storage_firebase_storage_host_api_task_cancel_response_new( + return_value); + g_autoptr(GError) error = nullptr; + if (!fl_basic_message_channel_respond(response_handle->channel, + response_handle->response_handle, + response->value, &error)) { + g_warning("Failed to send response to %s.%s: %s", "FirebaseStorageHostApi", + "taskCancel", error->message); + } +} + +void firebase_storage_firebase_storage_host_api_respond_error_task_cancel( + FirebaseStorageFirebaseStorageHostApiResponseHandle* response_handle, + const gchar* code, const gchar* message, FlValue* details) { + g_autoptr(FirebaseStorageFirebaseStorageHostApiTaskCancelResponse) response = + firebase_storage_firebase_storage_host_api_task_cancel_response_new_error( + code, message, details); + g_autoptr(GError) error = nullptr; + if (!fl_basic_message_channel_respond(response_handle->channel, + response_handle->response_handle, + response->value, &error)) { + g_warning("Failed to send response to %s.%s: %s", "FirebaseStorageHostApi", + "taskCancel", error->message); + } +} diff --git a/packages/firebase_storage/firebase_storage/linux/messages.g.h b/packages/firebase_storage/firebase_storage/linux/messages.g.h new file mode 100644 index 000000000000..519c7a9e464f --- /dev/null +++ b/packages/firebase_storage/firebase_storage/linux/messages.g.h @@ -0,0 +1,1250 @@ +// Copyright 2023, the Chromium project authors. Please see the AUTHORS file +// for details. All rights reserved. Use of this source code is governed by a +// BSD-style license that can be found in the LICENSE file. +// Autogenerated from Pigeon (v26.3.4), do not edit directly. +// See also: https://pub.dev/packages/pigeon + +#ifndef PIGEON_MESSAGES_G_H_ +#define PIGEON_MESSAGES_G_H_ + +#include + +G_BEGIN_DECLS + +/** + * FirebaseStorageInternalStorageTaskState: + * FIREBASE_STORAGE_PLATFORM_INTERFACE_INTERNAL_STORAGE_TASK_STATE_PAUSED: + * Indicates the task has been paused by the user. + * FIREBASE_STORAGE_PLATFORM_INTERFACE_INTERNAL_STORAGE_TASK_STATE_RUNNING: + * Indicates the task is currently in-progress. + * FIREBASE_STORAGE_PLATFORM_INTERFACE_INTERNAL_STORAGE_TASK_STATE_SUCCESS: + * Indicates the task has successfully completed. + * FIREBASE_STORAGE_PLATFORM_INTERFACE_INTERNAL_STORAGE_TASK_STATE_CANCELED: + * Indicates the task was canceled. + * FIREBASE_STORAGE_PLATFORM_INTERFACE_INTERNAL_STORAGE_TASK_STATE_ERROR: + * Indicates the task failed with an error. + * + * The type of operation that generated the action code from calling + * [TaskState]. + */ +typedef enum { + FIREBASE_STORAGE_PLATFORM_INTERFACE_INTERNAL_STORAGE_TASK_STATE_PAUSED = 0, + FIREBASE_STORAGE_PLATFORM_INTERFACE_INTERNAL_STORAGE_TASK_STATE_RUNNING = 1, + FIREBASE_STORAGE_PLATFORM_INTERFACE_INTERNAL_STORAGE_TASK_STATE_SUCCESS = 2, + FIREBASE_STORAGE_PLATFORM_INTERFACE_INTERNAL_STORAGE_TASK_STATE_CANCELED = 3, + FIREBASE_STORAGE_PLATFORM_INTERFACE_INTERNAL_STORAGE_TASK_STATE_ERROR = 4 +} FirebaseStorageInternalStorageTaskState; + +/** + * FirebaseStorageInternalStorageFirebaseApp: + * + */ + +G_DECLARE_FINAL_TYPE(FirebaseStorageInternalStorageFirebaseApp, + firebase_storage_internal_storage_firebase_app, + FIREBASE_STORAGE, INTERNAL_STORAGE_FIREBASE_APP, GObject) + +/** + * firebase_storage_internal_storage_firebase_app_new: + * app_name: field in this object. + * tenant_id: field in this object. + * bucket: field in this object. + * + * Creates a new #InternalStorageFirebaseApp object. + * + * Returns: a new #FirebaseStorageInternalStorageFirebaseApp + */ +FirebaseStorageInternalStorageFirebaseApp* +firebase_storage_internal_storage_firebase_app_new(const gchar* app_name, + const gchar* tenant_id, + const gchar* bucket); + +/** + * firebase_storage_internal_storage_firebase_app_get_app_name + * @object: a #FirebaseStorageInternalStorageFirebaseApp. + * + * Gets the value of the appName field of @object. + * + * Returns: the field value. + */ +const gchar* firebase_storage_internal_storage_firebase_app_get_app_name( + FirebaseStorageInternalStorageFirebaseApp* object); + +/** + * firebase_storage_internal_storage_firebase_app_get_tenant_id + * @object: a #FirebaseStorageInternalStorageFirebaseApp. + * + * Gets the value of the tenantId field of @object. + * + * Returns: the field value. + */ +const gchar* firebase_storage_internal_storage_firebase_app_get_tenant_id( + FirebaseStorageInternalStorageFirebaseApp* object); + +/** + * firebase_storage_internal_storage_firebase_app_get_bucket + * @object: a #FirebaseStorageInternalStorageFirebaseApp. + * + * Gets the value of the bucket field of @object. + * + * Returns: the field value. + */ +const gchar* firebase_storage_internal_storage_firebase_app_get_bucket( + FirebaseStorageInternalStorageFirebaseApp* object); + +/** + * firebase_storage_internal_storage_firebase_app_equals: + * @a: a #FirebaseStorageInternalStorageFirebaseApp. + * @b: another #FirebaseStorageInternalStorageFirebaseApp. + * + * Checks if two #FirebaseStorageInternalStorageFirebaseApp objects are equal. + * + * Returns: TRUE if @a and @b are equal. + */ +gboolean firebase_storage_internal_storage_firebase_app_equals( + FirebaseStorageInternalStorageFirebaseApp* a, + FirebaseStorageInternalStorageFirebaseApp* b); + +/** + * firebase_storage_internal_storage_firebase_app_hash: + * @object: a #FirebaseStorageInternalStorageFirebaseApp. + * + * Calculates a hash code for a #FirebaseStorageInternalStorageFirebaseApp + * object. + * + * Returns: the hash code. + */ +guint firebase_storage_internal_storage_firebase_app_hash( + FirebaseStorageInternalStorageFirebaseApp* object); + +/** + * FirebaseStorageInternalStorageReference: + * + */ + +G_DECLARE_FINAL_TYPE(FirebaseStorageInternalStorageReference, + firebase_storage_internal_storage_reference, + FIREBASE_STORAGE, INTERNAL_STORAGE_REFERENCE, GObject) + +/** + * firebase_storage_internal_storage_reference_new: + * bucket: field in this object. + * full_path: field in this object. + * name: field in this object. + * + * Creates a new #InternalStorageReference object. + * + * Returns: a new #FirebaseStorageInternalStorageReference + */ +FirebaseStorageInternalStorageReference* +firebase_storage_internal_storage_reference_new(const gchar* bucket, + const gchar* full_path, + const gchar* name); + +/** + * firebase_storage_internal_storage_reference_get_bucket + * @object: a #FirebaseStorageInternalStorageReference. + * + * Gets the value of the bucket field of @object. + * + * Returns: the field value. + */ +const gchar* firebase_storage_internal_storage_reference_get_bucket( + FirebaseStorageInternalStorageReference* object); + +/** + * firebase_storage_internal_storage_reference_get_full_path + * @object: a #FirebaseStorageInternalStorageReference. + * + * Gets the value of the fullPath field of @object. + * + * Returns: the field value. + */ +const gchar* firebase_storage_internal_storage_reference_get_full_path( + FirebaseStorageInternalStorageReference* object); + +/** + * firebase_storage_internal_storage_reference_get_name + * @object: a #FirebaseStorageInternalStorageReference. + * + * Gets the value of the name field of @object. + * + * Returns: the field value. + */ +const gchar* firebase_storage_internal_storage_reference_get_name( + FirebaseStorageInternalStorageReference* object); + +/** + * firebase_storage_internal_storage_reference_equals: + * @a: a #FirebaseStorageInternalStorageReference. + * @b: another #FirebaseStorageInternalStorageReference. + * + * Checks if two #FirebaseStorageInternalStorageReference objects are equal. + * + * Returns: TRUE if @a and @b are equal. + */ +gboolean firebase_storage_internal_storage_reference_equals( + FirebaseStorageInternalStorageReference* a, + FirebaseStorageInternalStorageReference* b); + +/** + * firebase_storage_internal_storage_reference_hash: + * @object: a #FirebaseStorageInternalStorageReference. + * + * Calculates a hash code for a #FirebaseStorageInternalStorageReference object. + * + * Returns: the hash code. + */ +guint firebase_storage_internal_storage_reference_hash( + FirebaseStorageInternalStorageReference* object); + +/** + * FirebaseStorageInternalFullMetaData: + * + */ + +G_DECLARE_FINAL_TYPE(FirebaseStorageInternalFullMetaData, + firebase_storage_internal_full_meta_data, FIREBASE_STORAGE, + INTERNAL_FULL_META_DATA, GObject) + +/** + * firebase_storage_internal_full_meta_data_new: + * metadata: field in this object. + * + * Creates a new #InternalFullMetaData object. + * + * Returns: a new #FirebaseStorageInternalFullMetaData + */ +FirebaseStorageInternalFullMetaData* +firebase_storage_internal_full_meta_data_new(FlValue* metadata); + +/** + * firebase_storage_internal_full_meta_data_get_metadata + * @object: a #FirebaseStorageInternalFullMetaData. + * + * Gets the value of the metadata field of @object. + * + * Returns: the field value. + */ +FlValue* firebase_storage_internal_full_meta_data_get_metadata( + FirebaseStorageInternalFullMetaData* object); + +/** + * firebase_storage_internal_full_meta_data_equals: + * @a: a #FirebaseStorageInternalFullMetaData. + * @b: another #FirebaseStorageInternalFullMetaData. + * + * Checks if two #FirebaseStorageInternalFullMetaData objects are equal. + * + * Returns: TRUE if @a and @b are equal. + */ +gboolean firebase_storage_internal_full_meta_data_equals( + FirebaseStorageInternalFullMetaData* a, + FirebaseStorageInternalFullMetaData* b); + +/** + * firebase_storage_internal_full_meta_data_hash: + * @object: a #FirebaseStorageInternalFullMetaData. + * + * Calculates a hash code for a #FirebaseStorageInternalFullMetaData object. + * + * Returns: the hash code. + */ +guint firebase_storage_internal_full_meta_data_hash( + FirebaseStorageInternalFullMetaData* object); + +/** + * FirebaseStorageInternalListOptions: + * + */ + +G_DECLARE_FINAL_TYPE(FirebaseStorageInternalListOptions, + firebase_storage_internal_list_options, FIREBASE_STORAGE, + INTERNAL_LIST_OPTIONS, GObject) + +/** + * firebase_storage_internal_list_options_new: + * max_results: field in this object. + * page_token: field in this object. + * + * Creates a new #InternalListOptions object. + * + * Returns: a new #FirebaseStorageInternalListOptions + */ +FirebaseStorageInternalListOptions* firebase_storage_internal_list_options_new( + int64_t max_results, const gchar* page_token); + +/** + * firebase_storage_internal_list_options_get_max_results + * @object: a #FirebaseStorageInternalListOptions. + * + * If set, limits the total number of `prefixes` and `items` to return. + * + * The default and maximum maxResults is 1000. + * + * Returns: the field value. + */ +int64_t firebase_storage_internal_list_options_get_max_results( + FirebaseStorageInternalListOptions* object); + +/** + * firebase_storage_internal_list_options_get_page_token + * @object: a #FirebaseStorageInternalListOptions. + * + * The nextPageToken from a previous call to list(). + * + * If provided, listing is resumed from the previous position. + * + * Returns: the field value. + */ +const gchar* firebase_storage_internal_list_options_get_page_token( + FirebaseStorageInternalListOptions* object); + +/** + * firebase_storage_internal_list_options_equals: + * @a: a #FirebaseStorageInternalListOptions. + * @b: another #FirebaseStorageInternalListOptions. + * + * Checks if two #FirebaseStorageInternalListOptions objects are equal. + * + * Returns: TRUE if @a and @b are equal. + */ +gboolean firebase_storage_internal_list_options_equals( + FirebaseStorageInternalListOptions* a, + FirebaseStorageInternalListOptions* b); + +/** + * firebase_storage_internal_list_options_hash: + * @object: a #FirebaseStorageInternalListOptions. + * + * Calculates a hash code for a #FirebaseStorageInternalListOptions object. + * + * Returns: the hash code. + */ +guint firebase_storage_internal_list_options_hash( + FirebaseStorageInternalListOptions* object); + +/** + * FirebaseStorageInternalSettableMetadata: + * + */ + +G_DECLARE_FINAL_TYPE(FirebaseStorageInternalSettableMetadata, + firebase_storage_internal_settable_metadata, + FIREBASE_STORAGE, INTERNAL_SETTABLE_METADATA, GObject) + +/** + * firebase_storage_internal_settable_metadata_new: + * cache_control: field in this object. + * content_disposition: field in this object. + * content_encoding: field in this object. + * content_language: field in this object. + * content_type: field in this object. + * custom_metadata: field in this object. + * + * Creates a new #InternalSettableMetadata object. + * + * Returns: a new #FirebaseStorageInternalSettableMetadata + */ +FirebaseStorageInternalSettableMetadata* +firebase_storage_internal_settable_metadata_new( + const gchar* cache_control, const gchar* content_disposition, + const gchar* content_encoding, const gchar* content_language, + const gchar* content_type, FlValue* custom_metadata); + +/** + * firebase_storage_internal_settable_metadata_get_cache_control + * @object: a #FirebaseStorageInternalSettableMetadata. + * + * Served as the 'Cache-Control' header on object download. + * + * See https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Cache-Control. + * + * Returns: the field value. + */ +const gchar* firebase_storage_internal_settable_metadata_get_cache_control( + FirebaseStorageInternalSettableMetadata* object); + +/** + * firebase_storage_internal_settable_metadata_get_content_disposition + * @object: a #FirebaseStorageInternalSettableMetadata. + * + * Served as the 'Content-Disposition' header on object download. + * + * See + * https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Disposition. + * + * Returns: the field value. + */ +const gchar* +firebase_storage_internal_settable_metadata_get_content_disposition( + FirebaseStorageInternalSettableMetadata* object); + +/** + * firebase_storage_internal_settable_metadata_get_content_encoding + * @object: a #FirebaseStorageInternalSettableMetadata. + * + * Served as the 'Content-Encoding' header on object download. + * + * See + * https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Encoding. + * + * Returns: the field value. + */ +const gchar* firebase_storage_internal_settable_metadata_get_content_encoding( + FirebaseStorageInternalSettableMetadata* object); + +/** + * firebase_storage_internal_settable_metadata_get_content_language + * @object: a #FirebaseStorageInternalSettableMetadata. + * + * Served as the 'Content-Language' header on object download. + * + * See + * https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Language. + * + * Returns: the field value. + */ +const gchar* firebase_storage_internal_settable_metadata_get_content_language( + FirebaseStorageInternalSettableMetadata* object); + +/** + * firebase_storage_internal_settable_metadata_get_content_type + * @object: a #FirebaseStorageInternalSettableMetadata. + * + * Served as the 'Content-Type' header on object download. + * + * See https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Type. + * + * Returns: the field value. + */ +const gchar* firebase_storage_internal_settable_metadata_get_content_type( + FirebaseStorageInternalSettableMetadata* object); + +/** + * firebase_storage_internal_settable_metadata_get_custom_metadata + * @object: a #FirebaseStorageInternalSettableMetadata. + * + * Additional user-defined custom metadata. + * + * Returns: the field value. + */ +FlValue* firebase_storage_internal_settable_metadata_get_custom_metadata( + FirebaseStorageInternalSettableMetadata* object); + +/** + * firebase_storage_internal_settable_metadata_equals: + * @a: a #FirebaseStorageInternalSettableMetadata. + * @b: another #FirebaseStorageInternalSettableMetadata. + * + * Checks if two #FirebaseStorageInternalSettableMetadata objects are equal. + * + * Returns: TRUE if @a and @b are equal. + */ +gboolean firebase_storage_internal_settable_metadata_equals( + FirebaseStorageInternalSettableMetadata* a, + FirebaseStorageInternalSettableMetadata* b); + +/** + * firebase_storage_internal_settable_metadata_hash: + * @object: a #FirebaseStorageInternalSettableMetadata. + * + * Calculates a hash code for a #FirebaseStorageInternalSettableMetadata object. + * + * Returns: the hash code. + */ +guint firebase_storage_internal_settable_metadata_hash( + FirebaseStorageInternalSettableMetadata* object); + +/** + * FirebaseStorageInternalStorageTaskSnapShot: + * + */ + +G_DECLARE_FINAL_TYPE(FirebaseStorageInternalStorageTaskSnapShot, + firebase_storage_internal_storage_task_snap_shot, + FIREBASE_STORAGE, INTERNAL_STORAGE_TASK_SNAP_SHOT, GObject) + +/** + * firebase_storage_internal_storage_task_snap_shot_new: + * bytes_transferred: field in this object. + * metadata: field in this object. + * state: field in this object. + * total_bytes: field in this object. + * + * Creates a new #InternalStorageTaskSnapShot object. + * + * Returns: a new #FirebaseStorageInternalStorageTaskSnapShot + */ +FirebaseStorageInternalStorageTaskSnapShot* +firebase_storage_internal_storage_task_snap_shot_new( + int64_t bytes_transferred, FirebaseStorageInternalFullMetaData* metadata, + FirebaseStorageInternalStorageTaskState state, int64_t total_bytes); + +/** + * firebase_storage_internal_storage_task_snap_shot_get_bytes_transferred + * @object: a #FirebaseStorageInternalStorageTaskSnapShot. + * + * Gets the value of the bytesTransferred field of @object. + * + * Returns: the field value. + */ +int64_t firebase_storage_internal_storage_task_snap_shot_get_bytes_transferred( + FirebaseStorageInternalStorageTaskSnapShot* object); + +/** + * firebase_storage_internal_storage_task_snap_shot_get_metadata + * @object: a #FirebaseStorageInternalStorageTaskSnapShot. + * + * Gets the value of the metadata field of @object. + * + * Returns: the field value. + */ +FirebaseStorageInternalFullMetaData* +firebase_storage_internal_storage_task_snap_shot_get_metadata( + FirebaseStorageInternalStorageTaskSnapShot* object); + +/** + * firebase_storage_internal_storage_task_snap_shot_get_state + * @object: a #FirebaseStorageInternalStorageTaskSnapShot. + * + * Gets the value of the state field of @object. + * + * Returns: the field value. + */ +FirebaseStorageInternalStorageTaskState +firebase_storage_internal_storage_task_snap_shot_get_state( + FirebaseStorageInternalStorageTaskSnapShot* object); + +/** + * firebase_storage_internal_storage_task_snap_shot_get_total_bytes + * @object: a #FirebaseStorageInternalStorageTaskSnapShot. + * + * Gets the value of the totalBytes field of @object. + * + * Returns: the field value. + */ +int64_t firebase_storage_internal_storage_task_snap_shot_get_total_bytes( + FirebaseStorageInternalStorageTaskSnapShot* object); + +/** + * firebase_storage_internal_storage_task_snap_shot_equals: + * @a: a #FirebaseStorageInternalStorageTaskSnapShot. + * @b: another #FirebaseStorageInternalStorageTaskSnapShot. + * + * Checks if two #FirebaseStorageInternalStorageTaskSnapShot objects are equal. + * + * Returns: TRUE if @a and @b are equal. + */ +gboolean firebase_storage_internal_storage_task_snap_shot_equals( + FirebaseStorageInternalStorageTaskSnapShot* a, + FirebaseStorageInternalStorageTaskSnapShot* b); + +/** + * firebase_storage_internal_storage_task_snap_shot_hash: + * @object: a #FirebaseStorageInternalStorageTaskSnapShot. + * + * Calculates a hash code for a #FirebaseStorageInternalStorageTaskSnapShot + * object. + * + * Returns: the hash code. + */ +guint firebase_storage_internal_storage_task_snap_shot_hash( + FirebaseStorageInternalStorageTaskSnapShot* object); + +/** + * FirebaseStorageInternalListResult: + * + */ + +G_DECLARE_FINAL_TYPE(FirebaseStorageInternalListResult, + firebase_storage_internal_list_result, FIREBASE_STORAGE, + INTERNAL_LIST_RESULT, GObject) + +/** + * firebase_storage_internal_list_result_new: + * items: field in this object. + * page_token: field in this object. + * prefixs: field in this object. + * + * Creates a new #InternalListResult object. + * + * Returns: a new #FirebaseStorageInternalListResult + */ +FirebaseStorageInternalListResult* firebase_storage_internal_list_result_new( + FlValue* items, const gchar* page_token, FlValue* prefixs); + +/** + * firebase_storage_internal_list_result_get_items + * @object: a #FirebaseStorageInternalListResult. + * + * Gets the value of the items field of @object. + * + * Returns: the field value. + */ +FlValue* firebase_storage_internal_list_result_get_items( + FirebaseStorageInternalListResult* object); + +/** + * firebase_storage_internal_list_result_get_page_token + * @object: a #FirebaseStorageInternalListResult. + * + * Gets the value of the pageToken field of @object. + * + * Returns: the field value. + */ +const gchar* firebase_storage_internal_list_result_get_page_token( + FirebaseStorageInternalListResult* object); + +/** + * firebase_storage_internal_list_result_get_prefixs + * @object: a #FirebaseStorageInternalListResult. + * + * Gets the value of the prefixs field of @object. + * + * Returns: the field value. + */ +FlValue* firebase_storage_internal_list_result_get_prefixs( + FirebaseStorageInternalListResult* object); + +/** + * firebase_storage_internal_list_result_equals: + * @a: a #FirebaseStorageInternalListResult. + * @b: another #FirebaseStorageInternalListResult. + * + * Checks if two #FirebaseStorageInternalListResult objects are equal. + * + * Returns: TRUE if @a and @b are equal. + */ +gboolean firebase_storage_internal_list_result_equals( + FirebaseStorageInternalListResult* a, FirebaseStorageInternalListResult* b); + +/** + * firebase_storage_internal_list_result_hash: + * @object: a #FirebaseStorageInternalListResult. + * + * Calculates a hash code for a #FirebaseStorageInternalListResult object. + * + * Returns: the hash code. + */ +guint firebase_storage_internal_list_result_hash( + FirebaseStorageInternalListResult* object); + +G_DECLARE_FINAL_TYPE(FirebaseStorageMessageCodec, + firebase_storage_message_codec, FIREBASE_STORAGE, + MESSAGE_CODEC, FlStandardMessageCodec) + +/** + * Custom type ID constants: + * + * Constants used to identify custom types in the codec. + * They are used in the codec to encode and decode custom types. + * They may be used in custom object creation functions to identify the type. + */ +extern const int firebase_storage_internal_storage_task_state_type_id; +extern const int firebase_storage_internal_storage_firebase_app_type_id; +extern const int firebase_storage_internal_storage_reference_type_id; +extern const int firebase_storage_internal_full_meta_data_type_id; +extern const int firebase_storage_internal_list_options_type_id; +extern const int firebase_storage_internal_settable_metadata_type_id; +extern const int firebase_storage_internal_storage_task_snap_shot_type_id; +extern const int firebase_storage_internal_list_result_type_id; + +G_DECLARE_FINAL_TYPE(FirebaseStorageFirebaseStorageHostApi, + firebase_storage_firebase_storage_host_api, + FIREBASE_STORAGE, FIREBASE_STORAGE_HOST_API, GObject) + +G_DECLARE_FINAL_TYPE(FirebaseStorageFirebaseStorageHostApiResponseHandle, + firebase_storage_firebase_storage_host_api_response_handle, + FIREBASE_STORAGE, + FIREBASE_STORAGE_HOST_API_RESPONSE_HANDLE, GObject) + +/** + * FirebaseStorageFirebaseStorageHostApiVTable: + * + * Table of functions exposed by FirebaseStorageHostApi to be implemented by the + * API provider. + */ +typedef struct { + void (*get_referenceby_path)( + FirebaseStorageInternalStorageFirebaseApp* app, const gchar* path, + const gchar* bucket, + FirebaseStorageFirebaseStorageHostApiResponseHandle* response_handle, + gpointer user_data); + void (*set_max_operation_retry_time)( + FirebaseStorageInternalStorageFirebaseApp* app, int64_t time, + FirebaseStorageFirebaseStorageHostApiResponseHandle* response_handle, + gpointer user_data); + void (*set_max_upload_retry_time)( + FirebaseStorageInternalStorageFirebaseApp* app, int64_t time, + FirebaseStorageFirebaseStorageHostApiResponseHandle* response_handle, + gpointer user_data); + void (*set_max_download_retry_time)( + FirebaseStorageInternalStorageFirebaseApp* app, int64_t time, + FirebaseStorageFirebaseStorageHostApiResponseHandle* response_handle, + gpointer user_data); + void (*use_storage_emulator)( + FirebaseStorageInternalStorageFirebaseApp* app, const gchar* host, + int64_t port, + FirebaseStorageFirebaseStorageHostApiResponseHandle* response_handle, + gpointer user_data); + void (*reference_delete)( + FirebaseStorageInternalStorageFirebaseApp* app, + FirebaseStorageInternalStorageReference* reference, + FirebaseStorageFirebaseStorageHostApiResponseHandle* response_handle, + gpointer user_data); + void (*reference_get_download_u_r_l)( + FirebaseStorageInternalStorageFirebaseApp* app, + FirebaseStorageInternalStorageReference* reference, + FirebaseStorageFirebaseStorageHostApiResponseHandle* response_handle, + gpointer user_data); + void (*reference_get_meta_data)( + FirebaseStorageInternalStorageFirebaseApp* app, + FirebaseStorageInternalStorageReference* reference, + FirebaseStorageFirebaseStorageHostApiResponseHandle* response_handle, + gpointer user_data); + void (*reference_list)( + FirebaseStorageInternalStorageFirebaseApp* app, + FirebaseStorageInternalStorageReference* reference, + FirebaseStorageInternalListOptions* options, + FirebaseStorageFirebaseStorageHostApiResponseHandle* response_handle, + gpointer user_data); + void (*reference_list_all)( + FirebaseStorageInternalStorageFirebaseApp* app, + FirebaseStorageInternalStorageReference* reference, + FirebaseStorageFirebaseStorageHostApiResponseHandle* response_handle, + gpointer user_data); + void (*reference_get_data)( + FirebaseStorageInternalStorageFirebaseApp* app, + FirebaseStorageInternalStorageReference* reference, int64_t max_size, + FirebaseStorageFirebaseStorageHostApiResponseHandle* response_handle, + gpointer user_data); + void (*reference_put_data)( + FirebaseStorageInternalStorageFirebaseApp* app, + FirebaseStorageInternalStorageReference* reference, const uint8_t* data, + size_t data_length, + FirebaseStorageInternalSettableMetadata* settable_meta_data, + int64_t handle, + FirebaseStorageFirebaseStorageHostApiResponseHandle* response_handle, + gpointer user_data); + void (*reference_put_string)( + FirebaseStorageInternalStorageFirebaseApp* app, + FirebaseStorageInternalStorageReference* reference, const gchar* data, + int64_t format, + FirebaseStorageInternalSettableMetadata* settable_meta_data, + int64_t handle, + FirebaseStorageFirebaseStorageHostApiResponseHandle* response_handle, + gpointer user_data); + void (*reference_put_file)( + FirebaseStorageInternalStorageFirebaseApp* app, + FirebaseStorageInternalStorageReference* reference, + const gchar* file_path, + FirebaseStorageInternalSettableMetadata* settable_meta_data, + int64_t handle, + FirebaseStorageFirebaseStorageHostApiResponseHandle* response_handle, + gpointer user_data); + void (*reference_download_file)( + FirebaseStorageInternalStorageFirebaseApp* app, + FirebaseStorageInternalStorageReference* reference, + const gchar* file_path, int64_t handle, + FirebaseStorageFirebaseStorageHostApiResponseHandle* response_handle, + gpointer user_data); + void (*reference_update_metadata)( + FirebaseStorageInternalStorageFirebaseApp* app, + FirebaseStorageInternalStorageReference* reference, + FirebaseStorageInternalSettableMetadata* metadata, + FirebaseStorageFirebaseStorageHostApiResponseHandle* response_handle, + gpointer user_data); + void (*task_pause)( + FirebaseStorageInternalStorageFirebaseApp* app, int64_t handle, + FirebaseStorageFirebaseStorageHostApiResponseHandle* response_handle, + gpointer user_data); + void (*task_resume)( + FirebaseStorageInternalStorageFirebaseApp* app, int64_t handle, + FirebaseStorageFirebaseStorageHostApiResponseHandle* response_handle, + gpointer user_data); + void (*task_cancel)( + FirebaseStorageInternalStorageFirebaseApp* app, int64_t handle, + FirebaseStorageFirebaseStorageHostApiResponseHandle* response_handle, + gpointer user_data); +} FirebaseStorageFirebaseStorageHostApiVTable; + +/** + * firebase_storage_firebase_storage_host_api_set_method_handlers: + * + * @messenger: an #FlBinaryMessenger. + * @suffix: (allow-none): a suffix to add to the API or %NULL for none. + * @vtable: implementations of the methods in this API. + * @user_data: (closure): user data to pass to the functions in @vtable. + * @user_data_free_func: (allow-none): a function which gets called to free + * @user_data, or %NULL. + * + * Connects the method handlers in the FirebaseStorageHostApi API. + */ +void firebase_storage_firebase_storage_host_api_set_method_handlers( + FlBinaryMessenger* messenger, const gchar* suffix, + const FirebaseStorageFirebaseStorageHostApiVTable* vtable, + gpointer user_data, GDestroyNotify user_data_free_func); + +/** + * firebase_storage_firebase_storage_host_api_clear_method_handlers: + * + * @messenger: an #FlBinaryMessenger. + * @suffix: (allow-none): a suffix to add to the API or %NULL for none. + * + * Clears the method handlers in the FirebaseStorageHostApi API. + */ +void firebase_storage_firebase_storage_host_api_clear_method_handlers( + FlBinaryMessenger* messenger, const gchar* suffix); + +/** + * firebase_storage_firebase_storage_host_api_respond_get_referenceby_path: + * @response_handle: a #FirebaseStorageFirebaseStorageHostApiResponseHandle. + * @return_value: location to write the value returned by this method. + * + * Responds to FirebaseStorageHostApi.getReferencebyPath. + */ +void firebase_storage_firebase_storage_host_api_respond_get_referenceby_path( + FirebaseStorageFirebaseStorageHostApiResponseHandle* response_handle, + FirebaseStorageInternalStorageReference* return_value); + +/** + * firebase_storage_firebase_storage_host_api_respond_error_get_referenceby_path: + * @response_handle: a #FirebaseStorageFirebaseStorageHostApiResponseHandle. + * @code: error code. + * @message: error message. + * @details: (allow-none): error details or %NULL. + * + * Responds with an error to FirebaseStorageHostApi.getReferencebyPath. + */ +void firebase_storage_firebase_storage_host_api_respond_error_get_referenceby_path( + FirebaseStorageFirebaseStorageHostApiResponseHandle* response_handle, + const gchar* code, const gchar* message, FlValue* details); + +/** + * firebase_storage_firebase_storage_host_api_respond_set_max_operation_retry_time: + * @response_handle: a #FirebaseStorageFirebaseStorageHostApiResponseHandle. + * + * Responds to FirebaseStorageHostApi.setMaxOperationRetryTime. + */ +void firebase_storage_firebase_storage_host_api_respond_set_max_operation_retry_time( + FirebaseStorageFirebaseStorageHostApiResponseHandle* response_handle); + +/** + * firebase_storage_firebase_storage_host_api_respond_error_set_max_operation_retry_time: + * @response_handle: a #FirebaseStorageFirebaseStorageHostApiResponseHandle. + * @code: error code. + * @message: error message. + * @details: (allow-none): error details or %NULL. + * + * Responds with an error to FirebaseStorageHostApi.setMaxOperationRetryTime. + */ +void firebase_storage_firebase_storage_host_api_respond_error_set_max_operation_retry_time( + FirebaseStorageFirebaseStorageHostApiResponseHandle* response_handle, + const gchar* code, const gchar* message, FlValue* details); + +/** + * firebase_storage_firebase_storage_host_api_respond_set_max_upload_retry_time: + * @response_handle: a #FirebaseStorageFirebaseStorageHostApiResponseHandle. + * + * Responds to FirebaseStorageHostApi.setMaxUploadRetryTime. + */ +void firebase_storage_firebase_storage_host_api_respond_set_max_upload_retry_time( + FirebaseStorageFirebaseStorageHostApiResponseHandle* response_handle); + +/** + * firebase_storage_firebase_storage_host_api_respond_error_set_max_upload_retry_time: + * @response_handle: a #FirebaseStorageFirebaseStorageHostApiResponseHandle. + * @code: error code. + * @message: error message. + * @details: (allow-none): error details or %NULL. + * + * Responds with an error to FirebaseStorageHostApi.setMaxUploadRetryTime. + */ +void firebase_storage_firebase_storage_host_api_respond_error_set_max_upload_retry_time( + FirebaseStorageFirebaseStorageHostApiResponseHandle* response_handle, + const gchar* code, const gchar* message, FlValue* details); + +/** + * firebase_storage_firebase_storage_host_api_respond_set_max_download_retry_time: + * @response_handle: a #FirebaseStorageFirebaseStorageHostApiResponseHandle. + * + * Responds to FirebaseStorageHostApi.setMaxDownloadRetryTime. + */ +void firebase_storage_firebase_storage_host_api_respond_set_max_download_retry_time( + FirebaseStorageFirebaseStorageHostApiResponseHandle* response_handle); + +/** + * firebase_storage_firebase_storage_host_api_respond_error_set_max_download_retry_time: + * @response_handle: a #FirebaseStorageFirebaseStorageHostApiResponseHandle. + * @code: error code. + * @message: error message. + * @details: (allow-none): error details or %NULL. + * + * Responds with an error to FirebaseStorageHostApi.setMaxDownloadRetryTime. + */ +void firebase_storage_firebase_storage_host_api_respond_error_set_max_download_retry_time( + FirebaseStorageFirebaseStorageHostApiResponseHandle* response_handle, + const gchar* code, const gchar* message, FlValue* details); + +/** + * firebase_storage_firebase_storage_host_api_respond_use_storage_emulator: + * @response_handle: a #FirebaseStorageFirebaseStorageHostApiResponseHandle. + * + * Responds to FirebaseStorageHostApi.useStorageEmulator. + */ +void firebase_storage_firebase_storage_host_api_respond_use_storage_emulator( + FirebaseStorageFirebaseStorageHostApiResponseHandle* response_handle); + +/** + * firebase_storage_firebase_storage_host_api_respond_error_use_storage_emulator: + * @response_handle: a #FirebaseStorageFirebaseStorageHostApiResponseHandle. + * @code: error code. + * @message: error message. + * @details: (allow-none): error details or %NULL. + * + * Responds with an error to FirebaseStorageHostApi.useStorageEmulator. + */ +void firebase_storage_firebase_storage_host_api_respond_error_use_storage_emulator( + FirebaseStorageFirebaseStorageHostApiResponseHandle* response_handle, + const gchar* code, const gchar* message, FlValue* details); + +/** + * firebase_storage_firebase_storage_host_api_respond_reference_delete: + * @response_handle: a #FirebaseStorageFirebaseStorageHostApiResponseHandle. + * + * Responds to FirebaseStorageHostApi.referenceDelete. + */ +void firebase_storage_firebase_storage_host_api_respond_reference_delete( + FirebaseStorageFirebaseStorageHostApiResponseHandle* response_handle); + +/** + * firebase_storage_firebase_storage_host_api_respond_error_reference_delete: + * @response_handle: a #FirebaseStorageFirebaseStorageHostApiResponseHandle. + * @code: error code. + * @message: error message. + * @details: (allow-none): error details or %NULL. + * + * Responds with an error to FirebaseStorageHostApi.referenceDelete. + */ +void firebase_storage_firebase_storage_host_api_respond_error_reference_delete( + FirebaseStorageFirebaseStorageHostApiResponseHandle* response_handle, + const gchar* code, const gchar* message, FlValue* details); + +/** + * firebase_storage_firebase_storage_host_api_respond_reference_get_download_u_r_l: + * @response_handle: a #FirebaseStorageFirebaseStorageHostApiResponseHandle. + * @return_value: location to write the value returned by this method. + * + * Responds to FirebaseStorageHostApi.referenceGetDownloadURL. + */ +void firebase_storage_firebase_storage_host_api_respond_reference_get_download_u_r_l( + FirebaseStorageFirebaseStorageHostApiResponseHandle* response_handle, + const gchar* return_value); + +/** + * firebase_storage_firebase_storage_host_api_respond_error_reference_get_download_u_r_l: + * @response_handle: a #FirebaseStorageFirebaseStorageHostApiResponseHandle. + * @code: error code. + * @message: error message. + * @details: (allow-none): error details or %NULL. + * + * Responds with an error to FirebaseStorageHostApi.referenceGetDownloadURL. + */ +void firebase_storage_firebase_storage_host_api_respond_error_reference_get_download_u_r_l( + FirebaseStorageFirebaseStorageHostApiResponseHandle* response_handle, + const gchar* code, const gchar* message, FlValue* details); + +/** + * firebase_storage_firebase_storage_host_api_respond_reference_get_meta_data: + * @response_handle: a #FirebaseStorageFirebaseStorageHostApiResponseHandle. + * @return_value: location to write the value returned by this method. + * + * Responds to FirebaseStorageHostApi.referenceGetMetaData. + */ +void firebase_storage_firebase_storage_host_api_respond_reference_get_meta_data( + FirebaseStorageFirebaseStorageHostApiResponseHandle* response_handle, + FirebaseStorageInternalFullMetaData* return_value); + +/** + * firebase_storage_firebase_storage_host_api_respond_error_reference_get_meta_data: + * @response_handle: a #FirebaseStorageFirebaseStorageHostApiResponseHandle. + * @code: error code. + * @message: error message. + * @details: (allow-none): error details or %NULL. + * + * Responds with an error to FirebaseStorageHostApi.referenceGetMetaData. + */ +void firebase_storage_firebase_storage_host_api_respond_error_reference_get_meta_data( + FirebaseStorageFirebaseStorageHostApiResponseHandle* response_handle, + const gchar* code, const gchar* message, FlValue* details); + +/** + * firebase_storage_firebase_storage_host_api_respond_reference_list: + * @response_handle: a #FirebaseStorageFirebaseStorageHostApiResponseHandle. + * @return_value: location to write the value returned by this method. + * + * Responds to FirebaseStorageHostApi.referenceList. + */ +void firebase_storage_firebase_storage_host_api_respond_reference_list( + FirebaseStorageFirebaseStorageHostApiResponseHandle* response_handle, + FirebaseStorageInternalListResult* return_value); + +/** + * firebase_storage_firebase_storage_host_api_respond_error_reference_list: + * @response_handle: a #FirebaseStorageFirebaseStorageHostApiResponseHandle. + * @code: error code. + * @message: error message. + * @details: (allow-none): error details or %NULL. + * + * Responds with an error to FirebaseStorageHostApi.referenceList. + */ +void firebase_storage_firebase_storage_host_api_respond_error_reference_list( + FirebaseStorageFirebaseStorageHostApiResponseHandle* response_handle, + const gchar* code, const gchar* message, FlValue* details); + +/** + * firebase_storage_firebase_storage_host_api_respond_reference_list_all: + * @response_handle: a #FirebaseStorageFirebaseStorageHostApiResponseHandle. + * @return_value: location to write the value returned by this method. + * + * Responds to FirebaseStorageHostApi.referenceListAll. + */ +void firebase_storage_firebase_storage_host_api_respond_reference_list_all( + FirebaseStorageFirebaseStorageHostApiResponseHandle* response_handle, + FirebaseStorageInternalListResult* return_value); + +/** + * firebase_storage_firebase_storage_host_api_respond_error_reference_list_all: + * @response_handle: a #FirebaseStorageFirebaseStorageHostApiResponseHandle. + * @code: error code. + * @message: error message. + * @details: (allow-none): error details or %NULL. + * + * Responds with an error to FirebaseStorageHostApi.referenceListAll. + */ +void firebase_storage_firebase_storage_host_api_respond_error_reference_list_all( + FirebaseStorageFirebaseStorageHostApiResponseHandle* response_handle, + const gchar* code, const gchar* message, FlValue* details); + +/** + * firebase_storage_firebase_storage_host_api_respond_reference_get_data: + * @response_handle: a #FirebaseStorageFirebaseStorageHostApiResponseHandle. + * @return_value: location to write the value returned by this method. + * @return_value_length: (allow-none): location to write length of @return_value + * or %NULL to ignore. + * + * Responds to FirebaseStorageHostApi.referenceGetData. + */ +void firebase_storage_firebase_storage_host_api_respond_reference_get_data( + FirebaseStorageFirebaseStorageHostApiResponseHandle* response_handle, + const uint8_t* return_value, size_t return_value_length); + +/** + * firebase_storage_firebase_storage_host_api_respond_error_reference_get_data: + * @response_handle: a #FirebaseStorageFirebaseStorageHostApiResponseHandle. + * @code: error code. + * @message: error message. + * @details: (allow-none): error details or %NULL. + * + * Responds with an error to FirebaseStorageHostApi.referenceGetData. + */ +void firebase_storage_firebase_storage_host_api_respond_error_reference_get_data( + FirebaseStorageFirebaseStorageHostApiResponseHandle* response_handle, + const gchar* code, const gchar* message, FlValue* details); + +/** + * firebase_storage_firebase_storage_host_api_respond_reference_put_data: + * @response_handle: a #FirebaseStorageFirebaseStorageHostApiResponseHandle. + * @return_value: location to write the value returned by this method. + * + * Responds to FirebaseStorageHostApi.referencePutData. + */ +void firebase_storage_firebase_storage_host_api_respond_reference_put_data( + FirebaseStorageFirebaseStorageHostApiResponseHandle* response_handle, + const gchar* return_value); + +/** + * firebase_storage_firebase_storage_host_api_respond_error_reference_put_data: + * @response_handle: a #FirebaseStorageFirebaseStorageHostApiResponseHandle. + * @code: error code. + * @message: error message. + * @details: (allow-none): error details or %NULL. + * + * Responds with an error to FirebaseStorageHostApi.referencePutData. + */ +void firebase_storage_firebase_storage_host_api_respond_error_reference_put_data( + FirebaseStorageFirebaseStorageHostApiResponseHandle* response_handle, + const gchar* code, const gchar* message, FlValue* details); + +/** + * firebase_storage_firebase_storage_host_api_respond_reference_put_string: + * @response_handle: a #FirebaseStorageFirebaseStorageHostApiResponseHandle. + * @return_value: location to write the value returned by this method. + * + * Responds to FirebaseStorageHostApi.referencePutString. + */ +void firebase_storage_firebase_storage_host_api_respond_reference_put_string( + FirebaseStorageFirebaseStorageHostApiResponseHandle* response_handle, + const gchar* return_value); + +/** + * firebase_storage_firebase_storage_host_api_respond_error_reference_put_string: + * @response_handle: a #FirebaseStorageFirebaseStorageHostApiResponseHandle. + * @code: error code. + * @message: error message. + * @details: (allow-none): error details or %NULL. + * + * Responds with an error to FirebaseStorageHostApi.referencePutString. + */ +void firebase_storage_firebase_storage_host_api_respond_error_reference_put_string( + FirebaseStorageFirebaseStorageHostApiResponseHandle* response_handle, + const gchar* code, const gchar* message, FlValue* details); + +/** + * firebase_storage_firebase_storage_host_api_respond_reference_put_file: + * @response_handle: a #FirebaseStorageFirebaseStorageHostApiResponseHandle. + * @return_value: location to write the value returned by this method. + * + * Responds to FirebaseStorageHostApi.referencePutFile. + */ +void firebase_storage_firebase_storage_host_api_respond_reference_put_file( + FirebaseStorageFirebaseStorageHostApiResponseHandle* response_handle, + const gchar* return_value); + +/** + * firebase_storage_firebase_storage_host_api_respond_error_reference_put_file: + * @response_handle: a #FirebaseStorageFirebaseStorageHostApiResponseHandle. + * @code: error code. + * @message: error message. + * @details: (allow-none): error details or %NULL. + * + * Responds with an error to FirebaseStorageHostApi.referencePutFile. + */ +void firebase_storage_firebase_storage_host_api_respond_error_reference_put_file( + FirebaseStorageFirebaseStorageHostApiResponseHandle* response_handle, + const gchar* code, const gchar* message, FlValue* details); + +/** + * firebase_storage_firebase_storage_host_api_respond_reference_download_file: + * @response_handle: a #FirebaseStorageFirebaseStorageHostApiResponseHandle. + * @return_value: location to write the value returned by this method. + * + * Responds to FirebaseStorageHostApi.referenceDownloadFile. + */ +void firebase_storage_firebase_storage_host_api_respond_reference_download_file( + FirebaseStorageFirebaseStorageHostApiResponseHandle* response_handle, + const gchar* return_value); + +/** + * firebase_storage_firebase_storage_host_api_respond_error_reference_download_file: + * @response_handle: a #FirebaseStorageFirebaseStorageHostApiResponseHandle. + * @code: error code. + * @message: error message. + * @details: (allow-none): error details or %NULL. + * + * Responds with an error to FirebaseStorageHostApi.referenceDownloadFile. + */ +void firebase_storage_firebase_storage_host_api_respond_error_reference_download_file( + FirebaseStorageFirebaseStorageHostApiResponseHandle* response_handle, + const gchar* code, const gchar* message, FlValue* details); + +/** + * firebase_storage_firebase_storage_host_api_respond_reference_update_metadata: + * @response_handle: a #FirebaseStorageFirebaseStorageHostApiResponseHandle. + * @return_value: location to write the value returned by this method. + * + * Responds to FirebaseStorageHostApi.referenceUpdateMetadata. + */ +void firebase_storage_firebase_storage_host_api_respond_reference_update_metadata( + FirebaseStorageFirebaseStorageHostApiResponseHandle* response_handle, + FirebaseStorageInternalFullMetaData* return_value); + +/** + * firebase_storage_firebase_storage_host_api_respond_error_reference_update_metadata: + * @response_handle: a #FirebaseStorageFirebaseStorageHostApiResponseHandle. + * @code: error code. + * @message: error message. + * @details: (allow-none): error details or %NULL. + * + * Responds with an error to FirebaseStorageHostApi.referenceUpdateMetadata. + */ +void firebase_storage_firebase_storage_host_api_respond_error_reference_update_metadata( + FirebaseStorageFirebaseStorageHostApiResponseHandle* response_handle, + const gchar* code, const gchar* message, FlValue* details); + +/** + * firebase_storage_firebase_storage_host_api_respond_task_pause: + * @response_handle: a #FirebaseStorageFirebaseStorageHostApiResponseHandle. + * @return_value: location to write the value returned by this method. + * + * Responds to FirebaseStorageHostApi.taskPause. + */ +void firebase_storage_firebase_storage_host_api_respond_task_pause( + FirebaseStorageFirebaseStorageHostApiResponseHandle* response_handle, + FlValue* return_value); + +/** + * firebase_storage_firebase_storage_host_api_respond_error_task_pause: + * @response_handle: a #FirebaseStorageFirebaseStorageHostApiResponseHandle. + * @code: error code. + * @message: error message. + * @details: (allow-none): error details or %NULL. + * + * Responds with an error to FirebaseStorageHostApi.taskPause. + */ +void firebase_storage_firebase_storage_host_api_respond_error_task_pause( + FirebaseStorageFirebaseStorageHostApiResponseHandle* response_handle, + const gchar* code, const gchar* message, FlValue* details); + +/** + * firebase_storage_firebase_storage_host_api_respond_task_resume: + * @response_handle: a #FirebaseStorageFirebaseStorageHostApiResponseHandle. + * @return_value: location to write the value returned by this method. + * + * Responds to FirebaseStorageHostApi.taskResume. + */ +void firebase_storage_firebase_storage_host_api_respond_task_resume( + FirebaseStorageFirebaseStorageHostApiResponseHandle* response_handle, + FlValue* return_value); + +/** + * firebase_storage_firebase_storage_host_api_respond_error_task_resume: + * @response_handle: a #FirebaseStorageFirebaseStorageHostApiResponseHandle. + * @code: error code. + * @message: error message. + * @details: (allow-none): error details or %NULL. + * + * Responds with an error to FirebaseStorageHostApi.taskResume. + */ +void firebase_storage_firebase_storage_host_api_respond_error_task_resume( + FirebaseStorageFirebaseStorageHostApiResponseHandle* response_handle, + const gchar* code, const gchar* message, FlValue* details); + +/** + * firebase_storage_firebase_storage_host_api_respond_task_cancel: + * @response_handle: a #FirebaseStorageFirebaseStorageHostApiResponseHandle. + * @return_value: location to write the value returned by this method. + * + * Responds to FirebaseStorageHostApi.taskCancel. + */ +void firebase_storage_firebase_storage_host_api_respond_task_cancel( + FirebaseStorageFirebaseStorageHostApiResponseHandle* response_handle, + FlValue* return_value); + +/** + * firebase_storage_firebase_storage_host_api_respond_error_task_cancel: + * @response_handle: a #FirebaseStorageFirebaseStorageHostApiResponseHandle. + * @code: error code. + * @message: error message. + * @details: (allow-none): error details or %NULL. + * + * Responds with an error to FirebaseStorageHostApi.taskCancel. + */ +void firebase_storage_firebase_storage_host_api_respond_error_task_cancel( + FirebaseStorageFirebaseStorageHostApiResponseHandle* response_handle, + const gchar* code, const gchar* message, FlValue* details); + +G_END_DECLS + +#endif // PIGEON_MESSAGES_G_H_ diff --git a/packages/firebase_storage/firebase_storage/linux/plugin_version.h.in b/packages/firebase_storage/firebase_storage/linux/plugin_version.h.in new file mode 100644 index 000000000000..b8e66440a62f --- /dev/null +++ b/packages/firebase_storage/firebase_storage/linux/plugin_version.h.in @@ -0,0 +1,13 @@ +// Copyright 2026, the Chromium project authors. Please see the AUTHORS file +// for details. All rights reserved. Use of this source code is governed by a +// BSD-style license that can be found in the LICENSE file. + +#ifndef PLUGIN_VERSION_CONFIG_H +#define PLUGIN_VERSION_CONFIG_H + +namespace firebase_storage_linux { + +std::string getPluginVersion() { return "@PLUGIN_VERSION@"; } +} // namespace firebase_storage_linux + +#endif // PLUGIN_VERSION_CONFIG_H diff --git a/packages/firebase_storage/firebase_storage/pubspec.yaml b/packages/firebase_storage/firebase_storage/pubspec.yaml index 8ee470d6def2..d58c0d6ae106 100755 --- a/packages/firebase_storage/firebase_storage/pubspec.yaml +++ b/packages/firebase_storage/firebase_storage/pubspec.yaml @@ -43,6 +43,8 @@ flutter: pluginClass: FlutterFirebaseStoragePlugin ios: pluginClass: FLTFirebaseStoragePlugin + linux: + pluginClass: FirebaseStoragePlugin macos: pluginClass: FLTFirebaseStoragePlugin web: diff --git a/packages/firebase_storage/firebase_storage/src/firebase_storage_utils.cpp b/packages/firebase_storage/firebase_storage/src/firebase_storage_utils.cpp new file mode 100644 index 000000000000..b26d8557e8db --- /dev/null +++ b/packages/firebase_storage/firebase_storage/src/firebase_storage_utils.cpp @@ -0,0 +1,149 @@ +// Copyright 2026, the Chromium project authors. Please see the AUTHORS file +// for details. All rights reserved. Use of this source code is governed by a +// BSD-style license that can be found in the LICENSE file. + +#include "firebase_storage_utils.h" + +#include +#include + +namespace firebase_storage_desktop { + +enum PutStringFormat { Base64 = 1, Base64Url = 2 }; + +std::string GetStorageErrorCode(firebase::storage::Error storage_error) { + switch (storage_error) { + case firebase::storage::kErrorNone: + return "unknown"; + case firebase::storage::kErrorUnknown: + return "unknown"; + case firebase::storage::kErrorObjectNotFound: + return "object-not-found"; + case firebase::storage::kErrorBucketNotFound: + return "bucket-not-found"; + case firebase::storage::kErrorProjectNotFound: + return "project-not-found"; + case firebase::storage::kErrorQuotaExceeded: + return "quota-exceeded"; + case firebase::storage::kErrorUnauthenticated: + return "unauthenticated"; + case firebase::storage::kErrorUnauthorized: + return "unauthorized"; + case firebase::storage::kErrorRetryLimitExceeded: + return "retry-limit-exceeded"; + case firebase::storage::kErrorNonMatchingChecksum: + return "invalid-checksum"; + case firebase::storage::kErrorDownloadSizeExceeded: + return "download-size-exceeded"; + case firebase::storage::kErrorCancelled: + return "canceled"; + + default: + return "unknown"; + } +} + +std::string GetStorageErrorMessage(firebase::storage::Error storage_error) { + switch (storage_error) { + case firebase::storage::kErrorNone: + return "An unknown error occurred"; + case firebase::storage::kErrorUnknown: + return "An unknown error occurred"; + case firebase::storage::kErrorObjectNotFound: + return "No object exists at the desired reference."; + case firebase::storage::kErrorBucketNotFound: + return "No bucket is configured for Firebase Storage."; + case firebase::storage::kErrorProjectNotFound: + return "No project is configured for Firebase Storage."; + case firebase::storage::kErrorQuotaExceeded: + return "Quota on your Firebase Storage bucket has been exceeded."; + case firebase::storage::kErrorUnauthenticated: + return "User is unauthenticated. Authenticate and try again."; + case firebase::storage::kErrorUnauthorized: + return "User is not authorized to perform the desired action."; + case firebase::storage::kErrorRetryLimitExceeded: + return "The maximum time limit on an operation (upload, download, " + "delete, etc.) has been exceeded."; + case firebase::storage::kErrorNonMatchingChecksum: + return "File on the client does not match the checksum of the file " + "received by the server."; + case firebase::storage::kErrorDownloadSizeExceeded: + return "Size of the downloaded file exceeds the amount of memory " + "allocated for the download."; + case firebase::storage::kErrorCancelled: + return "User cancelled the operation."; + + default: + return "An unknown error occurred"; + } +} + +std::vector StringToByteData(const std::string& data, + int64_t format) { + switch (format) { + case Base64: + return Base64Decode(data); + case Base64Url: { + std::string url_safe_data = data; + std::replace(url_safe_data.begin(), url_safe_data.end(), '-', '+'); + std::replace(url_safe_data.begin(), url_safe_data.end(), '_', '/'); + return Base64Decode(url_safe_data); + } + default: + return {}; // Return empty vector for unsupported formats + } +} + +std::vector Base64Decode(const std::string& encoded_string) { + std::string base64_chars = + "ABCDEFGHIJKLMNOPQRSTUVWXYZ" + "abcdefghijklmnopqrstuvwxyz" + "0123456789+/"; + size_t in_len = encoded_string.size(); + size_t i = 0; + size_t j = 0; + size_t in_ = 0; + unsigned char char_array_4[4], char_array_3[3]; + std::vector ret; + + while (in_len-- && (encoded_string[in_] != '=') && + (isalnum(encoded_string[in_]) || encoded_string[in_] == '+' || + encoded_string[in_] == '/')) { + char_array_4[i++] = encoded_string[in_]; + in_++; + if (i == 4) { + for (i = 0; i < 4; i++) { + char_array_4[i] = + static_cast(base64_chars.find(char_array_4[i])); + } + + char_array_3[0] = + (char_array_4[0] << 2) + ((char_array_4[1] & 0x30) >> 4); + char_array_3[1] = + ((char_array_4[1] & 0xf) << 4) + ((char_array_4[2] & 0x3c) >> 2); + char_array_3[2] = ((char_array_4[2] & 0x3) << 6) + char_array_4[3]; + + for (i = 0; (i < 3); i++) ret.push_back(char_array_3[i]); + i = 0; + } + } + + if (i) { + for (j = 0; j < 4; j++) + char_array_4[j] = + base64_chars.find(char_array_4[j]) != std::string::npos + ? static_cast(base64_chars.find(char_array_4[j])) + : 0; + + char_array_3[0] = (char_array_4[0] << 2) + ((char_array_4[1] & 0x30) >> 4); + char_array_3[1] = + ((char_array_4[1] & 0xf) << 4) + ((char_array_4[2] & 0x3c) >> 2); + char_array_3[2] = ((char_array_4[2] & 0x3) << 6) + char_array_4[3]; + + for (j = 0; (j < i - 1); j++) ret.push_back(char_array_3[j]); + } + + return ret; +} + +} // namespace firebase_storage_desktop diff --git a/packages/firebase_storage/firebase_storage/src/firebase_storage_utils.h b/packages/firebase_storage/firebase_storage/src/firebase_storage_utils.h new file mode 100644 index 000000000000..c6ac596bb93d --- /dev/null +++ b/packages/firebase_storage/firebase_storage/src/firebase_storage_utils.h @@ -0,0 +1,34 @@ +// Copyright 2026, the Chromium project authors. Please see the AUTHORS file +// for details. All rights reserved. Use of this source code is governed by a +// BSD-style license that can be found in the LICENSE file. + +#ifndef FIREBASE_STORAGE_SRC_FIREBASE_STORAGE_UTILS_H_ +#define FIREBASE_STORAGE_SRC_FIREBASE_STORAGE_UTILS_H_ + +#include +#include +#include + +#include "firebase/storage/common.h" + +// Platform-agnostic helpers shared between the Windows and Linux +// implementations of the firebase_storage plugin. These only depend on the +// Firebase C++ SDK and the standard library (no flutter:: or FlValue types). +namespace firebase_storage_desktop { + +// Maps a Firebase Storage C++ SDK error to the FlutterFire error code string. +std::string GetStorageErrorCode(firebase::storage::Error storage_error); + +// Maps a Firebase Storage C++ SDK error to a human readable error message. +std::string GetStorageErrorMessage(firebase::storage::Error storage_error); + +// Decodes putString data (base64 / base64url formats) into raw bytes. +std::vector StringToByteData(const std::string& data, + int64_t format); + +// Decodes a base64 string into raw bytes. +std::vector Base64Decode(const std::string& encoded_string); + +} // namespace firebase_storage_desktop + +#endif // FIREBASE_STORAGE_SRC_FIREBASE_STORAGE_UTILS_H_ diff --git a/packages/firebase_storage/firebase_storage/windows/CMakeLists.txt b/packages/firebase_storage/firebase_storage/windows/CMakeLists.txt index 36c1303e159b..308c41eaddc4 100644 --- a/packages/firebase_storage/firebase_storage/windows/CMakeLists.txt +++ b/packages/firebase_storage/firebase_storage/windows/CMakeLists.txt @@ -19,6 +19,8 @@ list(APPEND PLUGIN_SOURCES "firebase_storage_plugin.h" "messages.g.cpp" "messages.g.h" + "../src/firebase_storage_utils.cpp" + "../src/firebase_storage_utils.h" ) # Read version from pubspec.yaml diff --git a/packages/firebase_storage/firebase_storage/windows/firebase_storage_plugin.cpp b/packages/firebase_storage/firebase_storage/windows/firebase_storage_plugin.cpp index 5fcac57d17fe..ee127d112bb5 100644 --- a/packages/firebase_storage/firebase_storage/windows/firebase_storage_plugin.cpp +++ b/packages/firebase_storage/firebase_storage/windows/firebase_storage_plugin.cpp @@ -7,6 +7,7 @@ // This must be included before many other Windows headers. #include +#include "../src/firebase_storage_utils.h" #include "firebase/app.h" #include "firebase/future.h" #include "firebase/storage.h" @@ -47,7 +48,6 @@ using ::firebase::storage::StorageReference; using flutter::EncodableValue; namespace firebase_storage_windows { -enum PutStringFormat { Base64 = 1, Base64Url = 2 }; static std::string kLibraryName = "flutter-fire-gcs"; static std::string kStorageMethodChannelName = @@ -134,70 +134,11 @@ std::string RegisterEventChannel( } std::string FirebaseStoragePlugin::GetStorageErrorCode(Error storageError) { - switch (storageError) { - case firebase::storage::kErrorNone: - return "unknown"; - case firebase::storage::kErrorUnknown: - return "unknown"; - case firebase::storage::kErrorObjectNotFound: - return "object-not-found"; - case firebase::storage::kErrorBucketNotFound: - return "bucket-not-found"; - case firebase::storage::kErrorProjectNotFound: - return "project-not-found"; - case firebase::storage::kErrorQuotaExceeded: - return "quota-exceeded"; - case firebase::storage::kErrorUnauthenticated: - return "unauthenticated"; - case firebase::storage::kErrorUnauthorized: - return "unauthorized"; - case firebase::storage::kErrorRetryLimitExceeded: - return "retry-limit-exceeded"; - case firebase::storage::kErrorNonMatchingChecksum: - return "invalid-checksum"; - case firebase::storage::kErrorDownloadSizeExceeded: - return "download-size-exceeded"; - case firebase::storage::kErrorCancelled: - return "canceled"; - - default: - return "unknown"; - } + return firebase_storage_desktop::GetStorageErrorCode(storageError); } std::string FirebaseStoragePlugin::GetStorageErrorMessage(Error storageError) { - switch (storageError) { - case firebase::storage::kErrorNone: - return "An unknown error occurred"; - case firebase::storage::kErrorUnknown: - return "An unknown error occurred"; - case firebase::storage::kErrorObjectNotFound: - return "No object exists at the desired reference."; - case firebase::storage::kErrorBucketNotFound: - return "No bucket is configured for Firebase Storage."; - case firebase::storage::kErrorProjectNotFound: - return "No project is configured for Firebase Storage."; - case firebase::storage::kErrorQuotaExceeded: - return "Quota on your Firebase Storage bucket has been exceeded."; - case firebase::storage::kErrorUnauthenticated: - return "User is unauthenticated. Authenticate and try again."; - case firebase::storage::kErrorUnauthorized: - return "User is not authorized to perform the desired action."; - case firebase::storage::kErrorRetryLimitExceeded: - return "The maximum time limit on an operation (upload, download, " - "delete, etc.) has been exceeded."; - case firebase::storage::kErrorNonMatchingChecksum: - return "File on the client does not match the checksum of the file " - "received by the server."; - case firebase::storage::kErrorDownloadSizeExceeded: - return "Size of the downloaded file exceeds the amount of memory " - "allocated for the download."; - case firebase::storage::kErrorCancelled: - return "User cancelled the operation."; - - default: - return "An unknown error occurred"; - } + return firebase_storage_desktop::GetStorageErrorMessage(storageError); } // For Tasks, we stream exception back as a map to match other platforms @@ -945,71 +886,12 @@ void FirebaseStoragePlugin::TaskCancel( std::vector FirebaseStoragePlugin::StringToByteData( const std::string& data, int64_t format) { - switch (format) { - case Base64: - return FirebaseStoragePlugin::Base64Decode(data); - case Base64Url: { - std::string url_safe_data = data; - std::replace(url_safe_data.begin(), url_safe_data.end(), '-', '+'); - std::replace(url_safe_data.begin(), url_safe_data.end(), '_', '/'); - return FirebaseStoragePlugin::Base64Decode(url_safe_data); - } - default: - return {}; // Return empty vector for unsupported formats - } + return firebase_storage_desktop::StringToByteData(data, format); } std::vector FirebaseStoragePlugin::Base64Decode( const std::string& encoded_string) { - std::string base64_chars = - "ABCDEFGHIJKLMNOPQRSTUVWXYZ" - "abcdefghijklmnopqrstuvwxyz" - "0123456789+/"; - size_t in_len = encoded_string.size(); - size_t i = 0; - size_t j = 0; - size_t in_ = 0; - unsigned char char_array_4[4], char_array_3[3]; - std::vector ret; - - while (in_len-- && (encoded_string[in_] != '=') && - (isalnum(encoded_string[in_]) || encoded_string[in_] == '+' || - encoded_string[in_] == '/')) { - char_array_4[i++] = encoded_string[in_]; - in_++; - if (i == 4) { - for (i = 0; i < 4; i++) { - char_array_4[i] = - static_cast(base64_chars.find(char_array_4[i])); - } - - char_array_3[0] = - (char_array_4[0] << 2) + ((char_array_4[1] & 0x30) >> 4); - char_array_3[1] = - ((char_array_4[1] & 0xf) << 4) + ((char_array_4[2] & 0x3c) >> 2); - char_array_3[2] = ((char_array_4[2] & 0x3) << 6) + char_array_4[3]; - - for (i = 0; (i < 3); i++) ret.push_back(char_array_3[i]); - i = 0; - } - } - - if (i) { - for (j = 0; j < 4; j++) - char_array_4[j] = - base64_chars.find(char_array_4[j]) != std::string::npos - ? static_cast(base64_chars.find(char_array_4[j])) - : 0; - - char_array_3[0] = (char_array_4[0] << 2) + ((char_array_4[1] & 0x30) >> 4); - char_array_3[1] = - ((char_array_4[1] & 0xf) << 4) + ((char_array_4[2] & 0x3c) >> 2); - char_array_3[2] = ((char_array_4[2] & 0x3) << 6) + char_array_4[3]; - - for (j = 0; (j < i - 1); j++) ret.push_back(char_array_3[j]); - } - - return ret; + return firebase_storage_desktop::Base64Decode(encoded_string); } } // namespace firebase_storage_windows diff --git a/packages/firebase_storage/firebase_storage_platform_interface/pigeons/messages.dart b/packages/firebase_storage/firebase_storage_platform_interface/pigeons/messages.dart index 2cade8ddbef5..fb604f925eee 100644 --- a/packages/firebase_storage/firebase_storage_platform_interface/pigeons/messages.dart +++ b/packages/firebase_storage/firebase_storage_platform_interface/pigeons/messages.dart @@ -21,6 +21,12 @@ import 'package:pigeon/pigeon.dart'; cppHeaderOut: '../firebase_storage/windows/messages.g.h', cppSourceOut: '../firebase_storage/windows/messages.g.cpp', cppOptions: CppOptions(namespace: 'firebase_storage_windows'), + gobjectHeaderOut: '../firebase_storage/linux/messages.g.h', + gobjectSourceOut: '../firebase_storage/linux/messages.g.cc', + gobjectOptions: GObjectOptions( + headerIncludePath: 'messages.g.h', + module: 'FirebaseStorage', + ), copyrightHeader: 'pigeons/copyright.txt', ), ) diff --git a/pubspec.yaml b/pubspec.yaml index a88ddd10eb19..eb6eac8f15c1 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -78,6 +78,17 @@ dev_dependencies: pub_semver: ^2.1.4 yaml: ^3.1.2 +dependency_overrides: + # font_awesome_flutter 11 (required since Flutter 3.44 made IconData final) + # turned FontAwesomeIcons entries into FaIconData, which no released + # flutter_signin_button supports yet. Temporary override onto a patched + # fork until https://github.com/ZaynJarvis/Flutter-Sign-in-Button ships + # font_awesome_flutter 11 support. + flutter_signin_button: + git: + url: https://github.com/akshaynexus/Flutter-Sign-in-Button.git + ref: fa11-compat + melos: repository: https://github.com/firebase/flutterfire resolution: workspace @@ -311,6 +322,7 @@ melos: melos exec -- "flutter pub run pigeon --input ./pigeons/messages.dart" && \ melos run generate:pigeon:macos --no-select && \ melos run generate:pigeon:android --no-select && \ + melos run generate:pigeon:linux --no-select && \ melos run format-ci --no-select packageFilters: fileExists: 'pigeons/messages.dart' @@ -331,6 +343,14 @@ melos: dirExists: 'android' description: Transform the method toList() into a public one to be used in EventChannel + generate:pigeon:linux: + run: ./scripts/generate_pigeon_linux.sh + description: | + Re-apply the mechanical patches required on the Pigeon GObject output for Linux: + the `delete` -> `delete_` reserved-word rename (firebase_auth), the dispatch-local + `handle` -> `response_handle_` rename (firebase_storage), and the Firestore codec + fallback delegation plus exposed codec constructor (cloud_firestore). Idempotent. + # Additional cleanup lifecycle script, executed when `melos clean` is run. postclean: > melos exec -c 6 -- "flutter clean" diff --git a/scripts/generate_pigeon_linux.sh b/scripts/generate_pigeon_linux.sh new file mode 100755 index 000000000000..7ec9f8227848 --- /dev/null +++ b/scripts/generate_pigeon_linux.sh @@ -0,0 +1,87 @@ +#!/usr/bin/env bash +# Copyright 2025, the Chromium project authors. Please see the AUTHORS file +# for details. All rights reserved. Use of this source code is governed by a +# BSD-style license that can be found in the LICENSE file. +# +# Re-applies the mechanical patches required on the Pigeon (GObject) generated +# code for the Linux plugin implementations. Run after regenerating pigeons +# (invoked by `melos run generate:pigeon:linux`). Each transform is idempotent, +# so re-running on already-patched files is a no-op. +# +# Formatting (clang-format) of the generated files is handled by the existing +# `melos run format-ci` step in the `generate:pigeon` aggregate. +set -euo pipefail + +cd "$(dirname "$0")/.." + +# --------------------------------------------------------------------------- +# firebase_auth: `delete` is a C++ keyword, but the FirebaseAuthUserHostApi +# Dart method is named delete(), so pigeon emits a vtable member (and call +# sites) named `delete` that do not compile. Rename to `delete_`. +# --------------------------------------------------------------------------- +AUTH_LINUX=packages/firebase_auth/firebase_auth/linux +perl -i -pe 's/\(\*delete\)\(/(*delete_)(/' "$AUTH_LINUX/messages.g.h" +perl -i -pe 's/self->vtable->delete\b/self->vtable->delete_/g' "$AUTH_LINUX/messages.g.cc" + +# --------------------------------------------------------------------------- +# firebase_core: same `delete` C++ keyword collision. The FirebaseAppHostApi +# Dart method delete() makes pigeon emit a vtable member (and call site) +# named `delete`. Rename to `delete_`. +# --------------------------------------------------------------------------- +CORE_LINUX=packages/firebase_core/firebase_core/linux +perl -i -pe 's/\(\*delete\)\(/(*delete_)(/' "$CORE_LINUX/messages.g.h" +perl -i -pe 's/self->vtable->delete\b/self->vtable->delete_/g' "$CORE_LINUX/messages.g.cc" + +# --------------------------------------------------------------------------- +# firebase_storage: several host-API methods take an int64 parameter named +# `handle` (the task handle), which collides with the generated dispatch +# functions' local `g_autoptr(...) handle` response-handle variable. Rename +# the generated local to `response_handle_` in every dispatch function. +# --------------------------------------------------------------------------- +STORAGE_LINUX=packages/firebase_storage/firebase_storage/linux +perl -i -pe 's/HostApiResponseHandle\) handle = /HostApiResponseHandle) response_handle_ = /; s/, handle, self->user_data\);/, response_handle_, self->user_data);/' "$STORAGE_LINUX/messages.g.cc" + +# --------------------------------------------------------------------------- +# cloud_firestore: the generated FlStandardMessageCodec subclass must delegate +# unknown custom types to the hand-written Firestore codec (mirroring how the +# Windows generated codec extends cloud_firestore_windows::FirestoreCodec), +# and cloud_firestore_message_codec_new() must be exposed so the plugin can +# attach the codec to Firestore event channels. +# --------------------------------------------------------------------------- +FIRESTORE_LINUX=packages/cloud_firestore/cloud_firestore/linux + +perl -0777 -i -pe 's{(?write_value\(codec, buffer, value, error\);\n}{ // Modified from the generated fallback (which chains to the parent class): + // delegate unknown types to the Firestore codec, mirroring how the Windows + // generated codec extends cloud_firestore_windows::FirestoreCodec. + return firestore_codec_write_value(codec, buffer, value, error);\n}' "$FIRESTORE_LINUX/messages.g.cc" + +perl -0777 -i -pe 's{ return FL_STANDARD_MESSAGE_CODEC_CLASS\(cloud_firestore_message_codec_parent_class\)->read_value_of_type\(codec, buffer, offset, type, error\);\n}{ // Modified from the generated fallback (which chains to the parent + // class): delegate unknown types to the Firestore codec, mirroring how + // the Windows generated codec extends + // cloud_firestore_windows::FirestoreCodec. + return firestore_codec_read_value_of_type(codec, buffer, offset, type, error);\n}' "$FIRESTORE_LINUX/messages.g.cc" + +perl -0777 -i -pe 's{static CloudFirestoreMessageCodec\* cloud_firestore_message_codec_new\(\) \{\n}{// Modified from the generated code: made non-static (and declared in +// messages.g.h) so the plugin can attach this codec to Firestore event +// channels, mirroring FirebaseFirestoreHostApiCodecSerializer::GetInstance() +// on Windows. +CloudFirestoreMessageCodec* cloud_firestore_message_codec_new() \{\n}' "$FIRESTORE_LINUX/messages.g.cc" + +perl -0777 -i -pe 's{(G_DECLARE_FINAL_TYPE\(CloudFirestoreMessageCodec, cloud_firestore_message_codec, CLOUD_FIRESTORE, MESSAGE_CODEC, FlStandardMessageCodec\)\n\n)(?!/\*\*\n \* cloud_firestore_message_codec_new:)}{$1/** + * cloud_firestore_message_codec_new: + * + * Creates a #CloudFirestoreMessageCodec. + * + * Modified from the generated code: exposed so the plugin can attach the + * Pigeon-aware codec to Firestore event channels, mirroring + * FirebaseFirestoreHostApiCodecSerializer::GetInstance() on Windows. + * + * Returns: a new #CloudFirestoreMessageCodec. + */ +CloudFirestoreMessageCodec* cloud_firestore_message_codec_new(); + +}' "$FIRESTORE_LINUX/messages.g.h" + +echo "Linux pigeon post-processing complete." diff --git a/tests/.metadata b/tests/.metadata index ec6f49863ebd..6c7d593e8108 100644 --- a/tests/.metadata +++ b/tests/.metadata @@ -4,7 +4,7 @@ # This file should be version controlled and should not be manually edited. version: - revision: "5dcb86f68f239346676ceb1ed1ea385bd215fba1" + revision: "ad70ec4617166f1c38e5d2bfd388af71fda14f06" channel: "stable" project_type: app @@ -13,20 +13,11 @@ project_type: app migration: platforms: - platform: root - create_revision: 5dcb86f68f239346676ceb1ed1ea385bd215fba1 - base_revision: 5dcb86f68f239346676ceb1ed1ea385bd215fba1 - - platform: android - create_revision: 5dcb86f68f239346676ceb1ed1ea385bd215fba1 - base_revision: 5dcb86f68f239346676ceb1ed1ea385bd215fba1 - - platform: ios - create_revision: 5dcb86f68f239346676ceb1ed1ea385bd215fba1 - base_revision: 5dcb86f68f239346676ceb1ed1ea385bd215fba1 - - platform: macos - create_revision: 5dcb86f68f239346676ceb1ed1ea385bd215fba1 - base_revision: 5dcb86f68f239346676ceb1ed1ea385bd215fba1 - - platform: web - create_revision: 5dcb86f68f239346676ceb1ed1ea385bd215fba1 - base_revision: 5dcb86f68f239346676ceb1ed1ea385bd215fba1 + create_revision: ad70ec4617166f1c38e5d2bfd388af71fda14f06 + base_revision: ad70ec4617166f1c38e5d2bfd388af71fda14f06 + - platform: linux + create_revision: ad70ec4617166f1c38e5d2bfd388af71fda14f06 + base_revision: ad70ec4617166f1c38e5d2bfd388af71fda14f06 # User provided section diff --git a/tests/linux/.gitignore b/tests/linux/.gitignore new file mode 100644 index 000000000000..d3896c98444f --- /dev/null +++ b/tests/linux/.gitignore @@ -0,0 +1 @@ +flutter/ephemeral diff --git a/tests/linux/CMakeLists.txt b/tests/linux/CMakeLists.txt new file mode 100644 index 000000000000..6fcfe68c0a46 --- /dev/null +++ b/tests/linux/CMakeLists.txt @@ -0,0 +1,128 @@ +# Project-level configuration. +cmake_minimum_required(VERSION 3.13) +project(runner LANGUAGES CXX) + +# The name of the executable created for the application. Change this to change +# the on-disk name of your application. +set(BINARY_NAME "tests") +# The unique GTK application identifier for this application. See: +# https://wiki.gnome.org/HowDoI/ChooseApplicationID +set(APPLICATION_ID "io.flutter.plugins.firebase.tests") + +# Explicitly opt in to modern CMake behaviors to avoid warnings with recent +# versions of CMake. +cmake_policy(SET CMP0063 NEW) + +# Load bundled libraries from the lib/ directory relative to the binary. +set(CMAKE_INSTALL_RPATH "$ORIGIN/lib") + +# Root filesystem for cross-building. +if(FLUTTER_TARGET_PLATFORM_SYSROOT) + set(CMAKE_SYSROOT ${FLUTTER_TARGET_PLATFORM_SYSROOT}) + set(CMAKE_FIND_ROOT_PATH ${CMAKE_SYSROOT}) + set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER) + set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY) + set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY) + set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY) +endif() + +# Define build configuration options. +if(NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES) + set(CMAKE_BUILD_TYPE "Debug" CACHE + STRING "Flutter build mode" FORCE) + set_property(CACHE CMAKE_BUILD_TYPE PROPERTY STRINGS + "Debug" "Profile" "Release") +endif() + +# Compilation settings that should be applied to most targets. +# +# Be cautious about adding new options here, as plugins use this function by +# default. In most cases, you should add new options to specific targets instead +# of modifying this function. +function(APPLY_STANDARD_SETTINGS TARGET) + target_compile_features(${TARGET} PUBLIC cxx_std_14) + target_compile_options(${TARGET} PRIVATE -Wall -Werror) + target_compile_options(${TARGET} PRIVATE "$<$>:-O3>") + target_compile_definitions(${TARGET} PRIVATE "$<$>:NDEBUG>") +endfunction() + +# Flutter library and tool build rules. +set(FLUTTER_MANAGED_DIR "${CMAKE_CURRENT_SOURCE_DIR}/flutter") +add_subdirectory(${FLUTTER_MANAGED_DIR}) + +# System-level dependencies. +find_package(PkgConfig REQUIRED) +pkg_check_modules(GTK REQUIRED IMPORTED_TARGET gtk+-3.0) + +# Application build; see runner/CMakeLists.txt. +add_subdirectory("runner") + +# Run the Flutter tool portions of the build. This must not be removed. +add_dependencies(${BINARY_NAME} flutter_assemble) + +# Only the install-generated bundle's copy of the executable will launch +# correctly, since the resources must in the right relative locations. To avoid +# people trying to run the unbundled copy, put it in a subdirectory instead of +# the default top-level location. +set_target_properties(${BINARY_NAME} + PROPERTIES + RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/intermediates_do_not_run" +) + + +# Generated plugin build rules, which manage building the plugins and adding +# them to the application. +include(flutter/generated_plugins.cmake) + + +# === Installation === +# By default, "installing" just makes a relocatable bundle in the build +# directory. +set(BUILD_BUNDLE_DIR "${PROJECT_BINARY_DIR}/bundle") +if(CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT) + set(CMAKE_INSTALL_PREFIX "${BUILD_BUNDLE_DIR}" CACHE PATH "..." FORCE) +endif() + +# Start with a clean build bundle directory every time. +install(CODE " + file(REMOVE_RECURSE \"${BUILD_BUNDLE_DIR}/\") + " COMPONENT Runtime) + +set(INSTALL_BUNDLE_DATA_DIR "${CMAKE_INSTALL_PREFIX}/data") +set(INSTALL_BUNDLE_LIB_DIR "${CMAKE_INSTALL_PREFIX}/lib") + +install(TARGETS ${BINARY_NAME} RUNTIME DESTINATION "${CMAKE_INSTALL_PREFIX}" + COMPONENT Runtime) + +install(FILES "${FLUTTER_ICU_DATA_FILE}" DESTINATION "${INSTALL_BUNDLE_DATA_DIR}" + COMPONENT Runtime) + +install(FILES "${FLUTTER_LIBRARY}" DESTINATION "${INSTALL_BUNDLE_LIB_DIR}" + COMPONENT Runtime) + +foreach(bundled_library ${PLUGIN_BUNDLED_LIBRARIES}) + install(FILES "${bundled_library}" + DESTINATION "${INSTALL_BUNDLE_LIB_DIR}" + COMPONENT Runtime) +endforeach(bundled_library) + +# Copy the native assets provided by the build.dart from all packages. +set(NATIVE_ASSETS_DIR "${PROJECT_BUILD_DIR}native_assets/linux/") +install(DIRECTORY "${NATIVE_ASSETS_DIR}" + DESTINATION "${INSTALL_BUNDLE_LIB_DIR}" + COMPONENT Runtime) + +# Fully re-copy the assets directory on each build to avoid having stale files +# from a previous install. +set(FLUTTER_ASSET_DIR_NAME "flutter_assets") +install(CODE " + file(REMOVE_RECURSE \"${INSTALL_BUNDLE_DATA_DIR}/${FLUTTER_ASSET_DIR_NAME}\") + " COMPONENT Runtime) +install(DIRECTORY "${PROJECT_BUILD_DIR}/${FLUTTER_ASSET_DIR_NAME}" + DESTINATION "${INSTALL_BUNDLE_DATA_DIR}" COMPONENT Runtime) + +# Install the AOT library on non-Debug builds only. +if(NOT CMAKE_BUILD_TYPE MATCHES "Debug") + install(FILES "${AOT_LIBRARY}" DESTINATION "${INSTALL_BUNDLE_LIB_DIR}" + COMPONENT Runtime) +endif() diff --git a/tests/linux/flutter/CMakeLists.txt b/tests/linux/flutter/CMakeLists.txt new file mode 100644 index 000000000000..d5bd01648a96 --- /dev/null +++ b/tests/linux/flutter/CMakeLists.txt @@ -0,0 +1,88 @@ +# This file controls Flutter-level build steps. It should not be edited. +cmake_minimum_required(VERSION 3.10) + +set(EPHEMERAL_DIR "${CMAKE_CURRENT_SOURCE_DIR}/ephemeral") + +# Configuration provided via flutter tool. +include(${EPHEMERAL_DIR}/generated_config.cmake) + +# TODO: Move the rest of this into files in ephemeral. See +# https://github.com/flutter/flutter/issues/57146. + +# Serves the same purpose as list(TRANSFORM ... PREPEND ...), +# which isn't available in 3.10. +function(list_prepend LIST_NAME PREFIX) + set(NEW_LIST "") + foreach(element ${${LIST_NAME}}) + list(APPEND NEW_LIST "${PREFIX}${element}") + endforeach(element) + set(${LIST_NAME} "${NEW_LIST}" PARENT_SCOPE) +endfunction() + +# === Flutter Library === +# System-level dependencies. +find_package(PkgConfig REQUIRED) +pkg_check_modules(GTK REQUIRED IMPORTED_TARGET gtk+-3.0) +pkg_check_modules(GLIB REQUIRED IMPORTED_TARGET glib-2.0) +pkg_check_modules(GIO REQUIRED IMPORTED_TARGET gio-2.0) + +set(FLUTTER_LIBRARY "${EPHEMERAL_DIR}/libflutter_linux_gtk.so") + +# Published to parent scope for install step. +set(FLUTTER_LIBRARY ${FLUTTER_LIBRARY} PARENT_SCOPE) +set(FLUTTER_ICU_DATA_FILE "${EPHEMERAL_DIR}/icudtl.dat" PARENT_SCOPE) +set(PROJECT_BUILD_DIR "${PROJECT_DIR}/build/" PARENT_SCOPE) +set(AOT_LIBRARY "${PROJECT_DIR}/build/lib/libapp.so" PARENT_SCOPE) + +list(APPEND FLUTTER_LIBRARY_HEADERS + "fl_basic_message_channel.h" + "fl_binary_codec.h" + "fl_binary_messenger.h" + "fl_dart_project.h" + "fl_engine.h" + "fl_json_message_codec.h" + "fl_json_method_codec.h" + "fl_message_codec.h" + "fl_method_call.h" + "fl_method_channel.h" + "fl_method_codec.h" + "fl_method_response.h" + "fl_plugin_registrar.h" + "fl_plugin_registry.h" + "fl_standard_message_codec.h" + "fl_standard_method_codec.h" + "fl_string_codec.h" + "fl_value.h" + "fl_view.h" + "flutter_linux.h" +) +list_prepend(FLUTTER_LIBRARY_HEADERS "${EPHEMERAL_DIR}/flutter_linux/") +add_library(flutter INTERFACE) +target_include_directories(flutter INTERFACE + "${EPHEMERAL_DIR}" +) +target_link_libraries(flutter INTERFACE "${FLUTTER_LIBRARY}") +target_link_libraries(flutter INTERFACE + PkgConfig::GTK + PkgConfig::GLIB + PkgConfig::GIO +) +add_dependencies(flutter flutter_assemble) + +# === Flutter tool backend === +# _phony_ is a non-existent file to force this command to run every time, +# since currently there's no way to get a full input/output list from the +# flutter tool. +add_custom_command( + OUTPUT ${FLUTTER_LIBRARY} ${FLUTTER_LIBRARY_HEADERS} + ${CMAKE_CURRENT_BINARY_DIR}/_phony_ + COMMAND ${CMAKE_COMMAND} -E env + ${FLUTTER_TOOL_ENVIRONMENT} + "${FLUTTER_ROOT}/packages/flutter_tools/bin/tool_backend.sh" + ${FLUTTER_TARGET_PLATFORM} ${CMAKE_BUILD_TYPE} + VERBATIM +) +add_custom_target(flutter_assemble DEPENDS + "${FLUTTER_LIBRARY}" + ${FLUTTER_LIBRARY_HEADERS} +) diff --git a/tests/linux/runner/CMakeLists.txt b/tests/linux/runner/CMakeLists.txt new file mode 100644 index 000000000000..e97dabc7028e --- /dev/null +++ b/tests/linux/runner/CMakeLists.txt @@ -0,0 +1,26 @@ +cmake_minimum_required(VERSION 3.13) +project(runner LANGUAGES CXX) + +# Define the application target. To change its name, change BINARY_NAME in the +# top-level CMakeLists.txt, not the value here, or `flutter run` will no longer +# work. +# +# Any new source files that you add to the application should be added here. +add_executable(${BINARY_NAME} + "main.cc" + "my_application.cc" + "${FLUTTER_MANAGED_DIR}/generated_plugin_registrant.cc" +) + +# Apply the standard set of build settings. This can be removed for applications +# that need different build settings. +apply_standard_settings(${BINARY_NAME}) + +# Add preprocessor definitions for the application ID. +add_definitions(-DAPPLICATION_ID="${APPLICATION_ID}") + +# Add dependency libraries. Add any application-specific dependencies here. +target_link_libraries(${BINARY_NAME} PRIVATE flutter) +target_link_libraries(${BINARY_NAME} PRIVATE PkgConfig::GTK) + +target_include_directories(${BINARY_NAME} PRIVATE "${CMAKE_SOURCE_DIR}") diff --git a/tests/linux/runner/main.cc b/tests/linux/runner/main.cc new file mode 100644 index 000000000000..54fde7b87fa0 --- /dev/null +++ b/tests/linux/runner/main.cc @@ -0,0 +1,10 @@ +// Copyright 2026, the Chromium project authors. Please see the AUTHORS file +// for details. All rights reserved. Use of this source code is governed by a +// BSD-style license that can be found in the LICENSE file. + +#include "my_application.h" + +int main(int argc, char** argv) { + g_autoptr(MyApplication) app = my_application_new(); + return g_application_run(G_APPLICATION(app), argc, argv); +} diff --git a/tests/linux/runner/my_application.cc b/tests/linux/runner/my_application.cc new file mode 100644 index 000000000000..07284d3a5c93 --- /dev/null +++ b/tests/linux/runner/my_application.cc @@ -0,0 +1,152 @@ +// Copyright 2026, the Chromium project authors. Please see the AUTHORS file +// for details. All rights reserved. Use of this source code is governed by a +// BSD-style license that can be found in the LICENSE file. + +#include "my_application.h" + +#include +#ifdef GDK_WINDOWING_X11 +#include +#endif + +#include "flutter/generated_plugin_registrant.h" + +struct _MyApplication { + GtkApplication parent_instance; + char** dart_entrypoint_arguments; +}; + +G_DEFINE_TYPE(MyApplication, my_application, GTK_TYPE_APPLICATION) + +// Called when first Flutter frame received. +static void first_frame_cb(MyApplication* self, FlView* view) { + gtk_widget_show(gtk_widget_get_toplevel(GTK_WIDGET(view))); +} + +// Implements GApplication::activate. +static void my_application_activate(GApplication* application) { + MyApplication* self = MY_APPLICATION(application); + GtkWindow* window = + GTK_WINDOW(gtk_application_window_new(GTK_APPLICATION(application))); + + // Use a header bar when running in GNOME as this is the common style used + // by applications and is the setup most users will be using (e.g. Ubuntu + // desktop). + // If running on X and not using GNOME then just use a traditional title bar + // in case the window manager does more exotic layout, e.g. tiling. + // If running on Wayland assume the header bar will work (may need changing + // if future cases occur). + gboolean use_header_bar = TRUE; +#ifdef GDK_WINDOWING_X11 + GdkScreen* screen = gtk_window_get_screen(window); + if (GDK_IS_X11_SCREEN(screen)) { + const gchar* wm_name = gdk_x11_screen_get_window_manager_name(screen); + if (g_strcmp0(wm_name, "GNOME Shell") != 0) { + use_header_bar = FALSE; + } + } +#endif + if (use_header_bar) { + GtkHeaderBar* header_bar = GTK_HEADER_BAR(gtk_header_bar_new()); + gtk_widget_show(GTK_WIDGET(header_bar)); + gtk_header_bar_set_title(header_bar, "tests"); + gtk_header_bar_set_show_close_button(header_bar, TRUE); + gtk_window_set_titlebar(window, GTK_WIDGET(header_bar)); + } else { + gtk_window_set_title(window, "tests"); + } + + gtk_window_set_default_size(window, 1280, 720); + + g_autoptr(FlDartProject) project = fl_dart_project_new(); + fl_dart_project_set_dart_entrypoint_arguments( + project, self->dart_entrypoint_arguments); + + FlView* view = fl_view_new(project); + GdkRGBA background_color; + // Background defaults to black, override it here if necessary, e.g. #00000000 + // for transparent. + gdk_rgba_parse(&background_color, "#000000"); + fl_view_set_background_color(view, &background_color); + gtk_widget_show(GTK_WIDGET(view)); + gtk_container_add(GTK_CONTAINER(window), GTK_WIDGET(view)); + + // Show the window when Flutter renders. + // Requires the view to be realized so we can start rendering. + g_signal_connect_swapped(view, "first-frame", G_CALLBACK(first_frame_cb), + self); + gtk_widget_realize(GTK_WIDGET(view)); + + fl_register_plugins(FL_PLUGIN_REGISTRY(view)); + + gtk_widget_grab_focus(GTK_WIDGET(view)); +} + +// Implements GApplication::local_command_line. +static gboolean my_application_local_command_line(GApplication* application, + gchar*** arguments, + int* exit_status) { + MyApplication* self = MY_APPLICATION(application); + // Strip out the first argument as it is the binary name. + self->dart_entrypoint_arguments = g_strdupv(*arguments + 1); + + g_autoptr(GError) error = nullptr; + if (!g_application_register(application, nullptr, &error)) { + g_warning("Failed to register: %s", error->message); + *exit_status = 1; + return TRUE; + } + + g_application_activate(application); + *exit_status = 0; + + return TRUE; +} + +// Implements GApplication::startup. +static void my_application_startup(GApplication* application) { + // MyApplication* self = MY_APPLICATION(object); + + // Perform any actions required at application startup. + + G_APPLICATION_CLASS(my_application_parent_class)->startup(application); +} + +// Implements GApplication::shutdown. +static void my_application_shutdown(GApplication* application) { + // MyApplication* self = MY_APPLICATION(object); + + // Perform any actions required at application shutdown. + + G_APPLICATION_CLASS(my_application_parent_class)->shutdown(application); +} + +// Implements GObject::dispose. +static void my_application_dispose(GObject* object) { + MyApplication* self = MY_APPLICATION(object); + g_clear_pointer(&self->dart_entrypoint_arguments, g_strfreev); + G_OBJECT_CLASS(my_application_parent_class)->dispose(object); +} + +static void my_application_class_init(MyApplicationClass* klass) { + G_APPLICATION_CLASS(klass)->activate = my_application_activate; + G_APPLICATION_CLASS(klass)->local_command_line = + my_application_local_command_line; + G_APPLICATION_CLASS(klass)->startup = my_application_startup; + G_APPLICATION_CLASS(klass)->shutdown = my_application_shutdown; + G_OBJECT_CLASS(klass)->dispose = my_application_dispose; +} + +static void my_application_init(MyApplication* self) {} + +MyApplication* my_application_new() { + // Set the program name to the application ID, which helps various systems + // like GTK and desktop environments map this running application to its + // corresponding .desktop file. This ensures better integration by allowing + // the application to be recognized beyond its binary name. + g_set_prgname(APPLICATION_ID); + + return MY_APPLICATION(g_object_new(my_application_get_type(), + "application-id", APPLICATION_ID, "flags", + G_APPLICATION_NON_UNIQUE, nullptr)); +} diff --git a/tests/linux/runner/my_application.h b/tests/linux/runner/my_application.h new file mode 100644 index 000000000000..a2ba75695cf5 --- /dev/null +++ b/tests/linux/runner/my_application.h @@ -0,0 +1,22 @@ +// Copyright 2026, the Chromium project authors. Please see the AUTHORS file +// for details. All rights reserved. Use of this source code is governed by a +// BSD-style license that can be found in the LICENSE file. + +#ifndef FLUTTER_MY_APPLICATION_H_ +#define FLUTTER_MY_APPLICATION_H_ + +#include + +G_DECLARE_FINAL_TYPE(MyApplication, my_application, MY, APPLICATION, + GtkApplication) + +/** + * my_application_new: + * + * Creates a new Flutter-based application. + * + * Returns: a new #MyApplication. + */ +MyApplication* my_application_new(); + +#endif // FLUTTER_MY_APPLICATION_H_