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/melos.yaml b/melos.yaml index c25d99b6bd86..c9e6155901c4 100644 --- a/melos.yaml +++ b/melos.yaml @@ -239,6 +239,7 @@ scripts: melos run generate:pigeon:macos --no-select && \ melos run generate:pigeon:android --no-select && \ melos run generate:pigeon:windows --no-select && \ + melos run generate:pigeon:linux --no-select && \ melos run format-ci --no-select packageFilters: fileExists: 'pigeons/messages.dart' @@ -266,6 +267,14 @@ scripts: fileExists: 'windows/messages.g.h' description: Make ToEncodableList public so it can be called from plugin code. + 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/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..e7c5c5437037 --- /dev/null +++ b/packages/cloud_firestore/cloud_firestore/example/linux/runner/main.cc @@ -0,0 +1,6 @@ +#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..31c222c733f6 --- /dev/null +++ b/packages/cloud_firestore/cloud_firestore/example/linux/runner/my_application.cc @@ -0,0 +1,148 @@ +#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..db16367a77d0 --- /dev/null +++ b/packages/cloud_firestore/cloud_firestore/example/linux/runner/my_application.h @@ -0,0 +1,21 @@ +#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..f1fc81cf4ca5 --- /dev/null +++ b/packages/cloud_firestore/cloud_firestore/linux/messages.g.cc @@ -0,0 +1,4516 @@ +// 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 + +#include +#include "firestore_codec.h" +#include "messages.g.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..2f63e06db226 --- /dev/null +++ b/packages/cloud_firestore/cloud_firestore/linux/messages.g.h @@ -0,0 +1,1872 @@ +// 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/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..e7c5c5437037 --- /dev/null +++ b/packages/firebase_app_check/firebase_app_check/example/linux/runner/main.cc @@ -0,0 +1,6 @@ +#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..80181cf7f52c --- /dev/null +++ b/packages/firebase_app_check/firebase_app_check/example/linux/runner/my_application.cc @@ -0,0 +1,148 @@ +#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..db16367a77d0 --- /dev/null +++ b/packages/firebase_app_check/firebase_app_check/example/linux/runner/my_application.h @@ -0,0 +1,21 @@ +#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..cd7afd7ad66f --- /dev/null +++ b/packages/firebase_app_check/firebase_app_check/linux/messages.g.cc @@ -0,0 +1,681 @@ +// 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 + +#include +#include "messages.g.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 _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..2f3916703996 --- /dev/null +++ b/packages/firebase_app_check/firebase_app_check/linux/messages.g.h @@ -0,0 +1,156 @@ +// 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..e7c5c5437037 --- /dev/null +++ b/packages/firebase_auth/firebase_auth/example/linux/runner/main.cc @@ -0,0 +1,6 @@ +#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..9b9ee89fa3c5 --- /dev/null +++ b/packages/firebase_auth/firebase_auth/example/linux/runner/my_application.cc @@ -0,0 +1,148 @@ +#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..db16367a77d0 --- /dev/null +++ b/packages/firebase_auth/firebase_auth/example/linux/runner/my_application.h @@ -0,0 +1,21 @@ +#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..446d3e229c2f --- /dev/null +++ b/packages/firebase_auth/firebase_auth/linux/firebase_auth_plugin.cc @@ -0,0 +1,1501 @@ +// 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& + 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& + 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& + 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& + 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..a7feb278f418 --- /dev/null +++ b/packages/firebase_auth/firebase_auth/linux/messages.g.cc @@ -0,0 +1,7717 @@ +// 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 + +#include +#include "messages.g.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 _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..c7280e72af7b --- /dev/null +++ b/packages/firebase_auth/firebase_auth/linux/messages.g.h @@ -0,0 +1,2971 @@ +// 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..e7c5c5437037 --- /dev/null +++ b/packages/firebase_core/firebase_core/example/linux/runner/main.cc @@ -0,0 +1,6 @@ +#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..2e5af41c8dd3 --- /dev/null +++ b/packages/firebase_core/firebase_core/example/linux/runner/my_application.cc @@ -0,0 +1,148 @@ +#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..db16367a77d0 --- /dev/null +++ b/packages/firebase_core/firebase_core/example/linux/runner/my_application.h @@ -0,0 +1,21 @@ +#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..5b7a944cbb0e --- /dev/null +++ b/packages/firebase_core/firebase_core/linux/firebase_core_plugin.cc @@ -0,0 +1,248 @@ +// 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); +} + +// 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..5dab13636b52 --- /dev/null +++ b/packages/firebase_core/firebase_core/linux/messages.g.cc @@ -0,0 +1,1966 @@ +// 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; +}; + +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_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) { + 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; + } + 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; +} + +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()); + 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); + } + 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); +} + +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; + } + 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); + 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..82ab2fd08b07 --- /dev/null +++ b/packages/firebase_core/firebase_core/linux/messages.g.h @@ -0,0 +1,593 @@ +// 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. + * + * 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); + +/** + * 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_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..e7c5c5437037 --- /dev/null +++ b/packages/firebase_database/firebase_database/example/linux/runner/main.cc @@ -0,0 +1,6 @@ +#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..020fd24383bf --- /dev/null +++ b/packages/firebase_database/firebase_database/example/linux/runner/my_application.cc @@ -0,0 +1,148 @@ +#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..db16367a77d0 --- /dev/null +++ b/packages/firebase_database/firebase_database/example/linux/runner/my_application.h @@ -0,0 +1,21 @@ +#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..be554ef88e84 --- /dev/null +++ b/packages/firebase_database/firebase_database/linux/messages.g.cc @@ -0,0 +1,3150 @@ +// 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 + +#include +#include "messages.g.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 _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..a248d445d3ab --- /dev/null +++ b/packages/firebase_database/firebase_database/linux/messages.g.h @@ -0,0 +1,1157 @@ +// 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..e7c5c5437037 --- /dev/null +++ b/packages/firebase_remote_config/firebase_remote_config/example/linux/runner/main.cc @@ -0,0 +1,6 @@ +#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..f9ef8a260951 --- /dev/null +++ b/packages/firebase_remote_config/firebase_remote_config/example/linux/runner/my_application.cc @@ -0,0 +1,148 @@ +#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..db16367a77d0 --- /dev/null +++ b/packages/firebase_remote_config/firebase_remote_config/example/linux/runner/my_application.h @@ -0,0 +1,21 @@ +#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..e7c5c5437037 --- /dev/null +++ b/packages/firebase_storage/firebase_storage/example/linux/runner/main.cc @@ -0,0 +1,6 @@ +#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..4cd44cb586e9 --- /dev/null +++ b/packages/firebase_storage/firebase_storage/example/linux/runner/my_application.cc @@ -0,0 +1,148 @@ +#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..db16367a77d0 --- /dev/null +++ b/packages/firebase_storage/firebase_storage/example/linux/runner/my_application.h @@ -0,0 +1,21 @@ +#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..4421747d0fef --- /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..67ea1fbeb942 --- /dev/null +++ b/packages/firebase_storage/firebase_storage/linux/messages.g.cc @@ -0,0 +1,2741 @@ +// 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 + +#include +#include "messages.g.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 _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..d037927861dd --- /dev/null +++ b/packages/firebase_storage/firebase_storage/linux/messages.g.h @@ -0,0 +1,1003 @@ +// 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 6ae3a7e1d69d..fb3a28d733d5 100644 --- a/packages/firebase_storage/firebase_storage/windows/firebase_storage_plugin.cpp +++ b/packages/firebase_storage/firebase_storage/windows/firebase_storage_plugin.cpp @@ -14,6 +14,7 @@ #include "firebase/storage/listener.h" #include "firebase/storage/metadata.h" #include "firebase/storage/storage_reference.h" +#include "../src/firebase_storage_utils.h" #include "firebase_core/firebase_core_plugin_c_api.h" #include "firebase_storage/plugin_version.h" #include "messages.g.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 @@ -949,71 +890,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..615a496d779c 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 diff --git a/scripts/generate_pigeon_linux.sh b/scripts/generate_pigeon_linux.sh new file mode 100755 index 000000000000..fd8fcad1c6c5 --- /dev/null +++ b/scripts/generate_pigeon_linux.sh @@ -0,0 +1,78 @@ +#!/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_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..e7c5c5437037 --- /dev/null +++ b/tests/linux/runner/main.cc @@ -0,0 +1,6 @@ +#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..4d6df7377018 --- /dev/null +++ b/tests/linux/runner/my_application.cc @@ -0,0 +1,148 @@ +#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..db16367a77d0 --- /dev/null +++ b/tests/linux/runner/my_application.h @@ -0,0 +1,21 @@ +#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_