From f6fd6198c8962a1cff2f21a9afe1087d5fa08aa5 Mon Sep 17 00:00:00 2001 From: Cynthia J Date: Tue, 24 Oct 2023 01:58:15 -0700 Subject: [PATCH] feat(storage, windows): Add windows support (#11617) * pigeon template setup * make storage macOS running * method channel implementation update * android compilable * android emulator upload succeed * add more task listener * Get event channel working * pause iOS for now * first windows checkin * update message.dart async * compilable example * add the c++ into pubspec * cmake changes to test the mono cpp lib * make windows event channel working * Implement more Storage for iOS functionality * sdk demo ready * make ios e2e test build * more e2e test fix * update with pigeon/messages.dart change * fix the error message * make e2e test pass (android) * android e2e test * make storage iOS pass e2e * Add license header * code format * Update unit test, remove ones that's not work with pigeon * add symbolic link for macos files * make pigeon generated compatible with both iOS and macOS * fix for analyze check * add missing analyze fix * more touch * get windows pass e2e tests * more e2e fix * address part of review comments, majorly android ones * format changes * addressing the iOS feedback * update with cleanup * address the analyze check * update e2e test for windows * fix a few e2e issue * fix the get data return value * to address some review comments * remove the example auto generate test * update pigeon version * some tweak * add comments for a sleep timing * format cpp and objc files * add header comments * remove debug output * remove dart debug output * more format fix * fix the analyze --------- Co-authored-by: Cynthia Jiang Co-authored-by: a-maurice --- .../firebase_auth/windows/CMakeLists.txt | 2 +- .../firebase_core/windows/CMakeLists.txt | 4 +- .../GeneratedAndroidFirebaseStorage.java | 42 +- .../firebase_storage/example/.gitignore | 44 + .../firebase_storage/example/.metadata | 30 + .../xcshareddata/IDEWorkspaceChecks.plist | 8 + .../example/lib/firebase_options.dart | 2 + .../firebase_storage/example/lib/main.dart | 39 +- .../example/windows/.gitignore | 17 + .../example/windows/CMakeLists.txt | 102 ++ .../example/windows/flutter/CMakeLists.txt | 104 ++ .../flutter/generated_plugin_registrant.cc | 20 + .../flutter/generated_plugin_registrant.h | 15 + .../windows/flutter/generated_plugins.cmake | 26 + .../example/windows/runner/CMakeLists.txt | 40 + .../example/windows/runner/Runner.rc | 121 ++ .../example/windows/runner/flutter_window.cpp | 73 + .../example/windows/runner/flutter_window.h | 38 + .../example/windows/runner/main.cpp | 46 + .../example/windows/runner/resource.h | 20 + .../windows/runner/resources/app_icon.ico | Bin 0 -> 33772 bytes .../windows/runner/runner.exe.manifest | 20 + .../example/windows/runner/utils.cpp | 69 + .../example/windows/runner/utils.h | 23 + .../example/windows/runner/win32_window.cpp | 284 +++ .../example/windows/runner/win32_window.h | 104 ++ .../ios/Classes/firebase_storage_messages.g.h | 11 +- .../ios/Classes/firebase_storage_messages.g.m | 75 +- .../firebase_storage/pubspec.yaml | 2 + .../firebase_storage/windows/CMakeLists.txt | 62 + .../windows/firebase_storage_plugin.cpp | 810 +++++++++ .../windows/firebase_storage_plugin.h | 141 ++ .../windows/firebase_storage_plugin_c_api.cpp | 16 + .../firebase_storage_plugin_c_api.h | 29 + .../firebase_storage/windows/messages.g.cpp | 1557 +++++++++++++++++ .../firebase_storage/windows/messages.g.h | 403 +++++ .../method_channel/method_channel_task.dart | 4 - .../lib/src/pigeon/messages.pigeon.dart | 53 +- .../pubspec.yaml | 2 +- .../test/pigeon/test_api.dart | 198 ++- .../firebase_storage/list_result_e2e.dart | 51 +- .../firebase_storage/reference_e2e.dart | 86 +- .../flutter/generated_plugin_registrant.cc | 3 + tests/windows/flutter/generated_plugins.cmake | 1 + 44 files changed, 4567 insertions(+), 230 deletions(-) create mode 100644 packages/firebase_storage/firebase_storage/example/.gitignore create mode 100644 packages/firebase_storage/firebase_storage/example/.metadata create mode 100644 packages/firebase_storage/firebase_storage/example/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 packages/firebase_storage/firebase_storage/example/windows/.gitignore create mode 100644 packages/firebase_storage/firebase_storage/example/windows/CMakeLists.txt create mode 100644 packages/firebase_storage/firebase_storage/example/windows/flutter/CMakeLists.txt create mode 100644 packages/firebase_storage/firebase_storage/example/windows/flutter/generated_plugin_registrant.cc create mode 100644 packages/firebase_storage/firebase_storage/example/windows/flutter/generated_plugin_registrant.h create mode 100644 packages/firebase_storage/firebase_storage/example/windows/flutter/generated_plugins.cmake create mode 100644 packages/firebase_storage/firebase_storage/example/windows/runner/CMakeLists.txt create mode 100644 packages/firebase_storage/firebase_storage/example/windows/runner/Runner.rc create mode 100644 packages/firebase_storage/firebase_storage/example/windows/runner/flutter_window.cpp create mode 100644 packages/firebase_storage/firebase_storage/example/windows/runner/flutter_window.h create mode 100644 packages/firebase_storage/firebase_storage/example/windows/runner/main.cpp create mode 100644 packages/firebase_storage/firebase_storage/example/windows/runner/resource.h create mode 100644 packages/firebase_storage/firebase_storage/example/windows/runner/resources/app_icon.ico create mode 100644 packages/firebase_storage/firebase_storage/example/windows/runner/runner.exe.manifest create mode 100644 packages/firebase_storage/firebase_storage/example/windows/runner/utils.cpp create mode 100644 packages/firebase_storage/firebase_storage/example/windows/runner/utils.h create mode 100644 packages/firebase_storage/firebase_storage/example/windows/runner/win32_window.cpp create mode 100644 packages/firebase_storage/firebase_storage/example/windows/runner/win32_window.h create mode 100644 packages/firebase_storage/firebase_storage/windows/CMakeLists.txt create mode 100644 packages/firebase_storage/firebase_storage/windows/firebase_storage_plugin.cpp create mode 100644 packages/firebase_storage/firebase_storage/windows/firebase_storage_plugin.h create mode 100644 packages/firebase_storage/firebase_storage/windows/firebase_storage_plugin_c_api.cpp create mode 100644 packages/firebase_storage/firebase_storage/windows/include/firebase_storage/firebase_storage_plugin_c_api.h create mode 100644 packages/firebase_storage/firebase_storage/windows/messages.g.cpp create mode 100644 packages/firebase_storage/firebase_storage/windows/messages.g.h diff --git a/packages/firebase_auth/firebase_auth/windows/CMakeLists.txt b/packages/firebase_auth/firebase_auth/windows/CMakeLists.txt index c7ad987c5807..6dae01cf2593 100644 --- a/packages/firebase_auth/firebase_auth/windows/CMakeLists.txt +++ b/packages/firebase_auth/firebase_auth/windows/CMakeLists.txt @@ -48,7 +48,7 @@ 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 flutter_wrapper_plugin) +target_link_libraries(${PLUGIN_NAME} PUBLIC flutter flutter_wrapper_plugin) # List of absolute paths to libraries that should be bundled with the plugin. # This list could contain prebuilt libraries, or libraries created by an diff --git a/packages/firebase_core/firebase_core/windows/CMakeLists.txt b/packages/firebase_core/firebase_core/windows/CMakeLists.txt index 6183afed5fe9..c9f3405e6f34 100644 --- a/packages/firebase_core/firebase_core/windows/CMakeLists.txt +++ b/packages/firebase_core/firebase_core/windows/CMakeLists.txt @@ -105,11 +105,11 @@ endforeach() set(ADDITIONAL_LIBS advapi32 ws2_32 crypt32 rpcrt4 ole32 icu) -target_link_libraries(${PLUGIN_NAME} PRIVATE "${FIREBASE_LIBS}" "${ADDITIONAL_LIBS}") +target_link_libraries(${PLUGIN_NAME} PUBLIC "${FIREBASE_LIBS}" "${ADDITIONAL_LIBS}") target_include_directories(${PLUGIN_NAME} INTERFACE "${CMAKE_CURRENT_SOURCE_DIR}/include") -target_link_libraries(${PLUGIN_NAME} PRIVATE flutter flutter_wrapper_plugin) +target_link_libraries(${PLUGIN_NAME} PUBLIC flutter flutter_wrapper_plugin) # List of absolute paths to libraries that should be bundled with the plugin. # This list could contain prebuilt libraries, or libraries created by an diff --git a/packages/firebase_storage/firebase_storage/android/src/main/java/io/flutter/plugins/firebase/storage/GeneratedAndroidFirebaseStorage.java b/packages/firebase_storage/firebase_storage/android/src/main/java/io/flutter/plugins/firebase/storage/GeneratedAndroidFirebaseStorage.java index f28bf76898bf..79604d0fa25e 100644 --- a/packages/firebase_storage/firebase_storage/android/src/main/java/io/flutter/plugins/firebase/storage/GeneratedAndroidFirebaseStorage.java +++ b/packages/firebase_storage/firebase_storage/android/src/main/java/io/flutter/plugins/firebase/storage/GeneratedAndroidFirebaseStorage.java @@ -1,7 +1,7 @@ // 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 (v9.2.5), do not edit directly. +// Autogenerated from Pigeon (v11.0.1), do not edit directly. // See also: https://pub.dev/packages/pigeon package io.flutter.plugins.firebase.storage; @@ -812,7 +812,7 @@ static void setup( BasicMessageChannel channel = new BasicMessageChannel<>( binaryMessenger, - "dev.flutter.pigeon.FirebaseStorageHostApi.getReferencebyPath", + "dev.flutter.pigeon.firebase_storage_platform_interface.FirebaseStorageHostApi.getReferencebyPath", getCodec()); if (api != null) { channel.setMessageHandler( @@ -845,7 +845,7 @@ public void error(Throwable error) { BasicMessageChannel channel = new BasicMessageChannel<>( binaryMessenger, - "dev.flutter.pigeon.FirebaseStorageHostApi.setMaxOperationRetryTime", + "dev.flutter.pigeon.firebase_storage_platform_interface.FirebaseStorageHostApi.setMaxOperationRetryTime", getCodec()); if (api != null) { channel.setMessageHandler( @@ -878,7 +878,7 @@ public void error(Throwable error) { BasicMessageChannel channel = new BasicMessageChannel<>( binaryMessenger, - "dev.flutter.pigeon.FirebaseStorageHostApi.setMaxUploadRetryTime", + "dev.flutter.pigeon.firebase_storage_platform_interface.FirebaseStorageHostApi.setMaxUploadRetryTime", getCodec()); if (api != null) { channel.setMessageHandler( @@ -911,7 +911,7 @@ public void error(Throwable error) { BasicMessageChannel channel = new BasicMessageChannel<>( binaryMessenger, - "dev.flutter.pigeon.FirebaseStorageHostApi.setMaxDownloadRetryTime", + "dev.flutter.pigeon.firebase_storage_platform_interface.FirebaseStorageHostApi.setMaxDownloadRetryTime", getCodec()); if (api != null) { channel.setMessageHandler( @@ -944,7 +944,7 @@ public void error(Throwable error) { BasicMessageChannel channel = new BasicMessageChannel<>( binaryMessenger, - "dev.flutter.pigeon.FirebaseStorageHostApi.useStorageEmulator", + "dev.flutter.pigeon.firebase_storage_platform_interface.FirebaseStorageHostApi.useStorageEmulator", getCodec()); if (api != null) { channel.setMessageHandler( @@ -981,7 +981,7 @@ public void error(Throwable error) { BasicMessageChannel channel = new BasicMessageChannel<>( binaryMessenger, - "dev.flutter.pigeon.FirebaseStorageHostApi.referenceDelete", + "dev.flutter.pigeon.firebase_storage_platform_interface.FirebaseStorageHostApi.referenceDelete", getCodec()); if (api != null) { channel.setMessageHandler( @@ -1013,7 +1013,7 @@ public void error(Throwable error) { BasicMessageChannel channel = new BasicMessageChannel<>( binaryMessenger, - "dev.flutter.pigeon.FirebaseStorageHostApi.referenceGetDownloadURL", + "dev.flutter.pigeon.firebase_storage_platform_interface.FirebaseStorageHostApi.referenceGetDownloadURL", getCodec()); if (api != null) { channel.setMessageHandler( @@ -1045,7 +1045,7 @@ public void error(Throwable error) { BasicMessageChannel channel = new BasicMessageChannel<>( binaryMessenger, - "dev.flutter.pigeon.FirebaseStorageHostApi.referenceGetMetaData", + "dev.flutter.pigeon.firebase_storage_platform_interface.FirebaseStorageHostApi.referenceGetMetaData", getCodec()); if (api != null) { channel.setMessageHandler( @@ -1077,7 +1077,7 @@ public void error(Throwable error) { BasicMessageChannel channel = new BasicMessageChannel<>( binaryMessenger, - "dev.flutter.pigeon.FirebaseStorageHostApi.referenceList", + "dev.flutter.pigeon.firebase_storage_platform_interface.FirebaseStorageHostApi.referenceList", getCodec()); if (api != null) { channel.setMessageHandler( @@ -1110,7 +1110,7 @@ public void error(Throwable error) { BasicMessageChannel channel = new BasicMessageChannel<>( binaryMessenger, - "dev.flutter.pigeon.FirebaseStorageHostApi.referenceListAll", + "dev.flutter.pigeon.firebase_storage_platform_interface.FirebaseStorageHostApi.referenceListAll", getCodec()); if (api != null) { channel.setMessageHandler( @@ -1142,7 +1142,7 @@ public void error(Throwable error) { BasicMessageChannel channel = new BasicMessageChannel<>( binaryMessenger, - "dev.flutter.pigeon.FirebaseStorageHostApi.referenceGetData", + "dev.flutter.pigeon.firebase_storage_platform_interface.FirebaseStorageHostApi.referenceGetData", getCodec()); if (api != null) { channel.setMessageHandler( @@ -1179,7 +1179,7 @@ public void error(Throwable error) { BasicMessageChannel channel = new BasicMessageChannel<>( binaryMessenger, - "dev.flutter.pigeon.FirebaseStorageHostApi.referencePutData", + "dev.flutter.pigeon.firebase_storage_platform_interface.FirebaseStorageHostApi.referencePutData", getCodec()); if (api != null) { channel.setMessageHandler( @@ -1220,7 +1220,7 @@ public void error(Throwable error) { BasicMessageChannel channel = new BasicMessageChannel<>( binaryMessenger, - "dev.flutter.pigeon.FirebaseStorageHostApi.referencePutString", + "dev.flutter.pigeon.firebase_storage_platform_interface.FirebaseStorageHostApi.referencePutString", getCodec()); if (api != null) { channel.setMessageHandler( @@ -1263,7 +1263,7 @@ public void error(Throwable error) { BasicMessageChannel channel = new BasicMessageChannel<>( binaryMessenger, - "dev.flutter.pigeon.FirebaseStorageHostApi.referencePutFile", + "dev.flutter.pigeon.firebase_storage_platform_interface.FirebaseStorageHostApi.referencePutFile", getCodec()); if (api != null) { channel.setMessageHandler( @@ -1304,7 +1304,7 @@ public void error(Throwable error) { BasicMessageChannel channel = new BasicMessageChannel<>( binaryMessenger, - "dev.flutter.pigeon.FirebaseStorageHostApi.referenceDownloadFile", + "dev.flutter.pigeon.firebase_storage_platform_interface.FirebaseStorageHostApi.referenceDownloadFile", getCodec()); if (api != null) { channel.setMessageHandler( @@ -1343,7 +1343,7 @@ public void error(Throwable error) { BasicMessageChannel channel = new BasicMessageChannel<>( binaryMessenger, - "dev.flutter.pigeon.FirebaseStorageHostApi.referenceUpdateMetadata", + "dev.flutter.pigeon.firebase_storage_platform_interface.FirebaseStorageHostApi.referenceUpdateMetadata", getCodec()); if (api != null) { channel.setMessageHandler( @@ -1375,7 +1375,9 @@ public void error(Throwable error) { { BasicMessageChannel channel = new BasicMessageChannel<>( - binaryMessenger, "dev.flutter.pigeon.FirebaseStorageHostApi.taskPause", getCodec()); + binaryMessenger, + "dev.flutter.pigeon.firebase_storage_platform_interface.FirebaseStorageHostApi.taskPause", + getCodec()); if (api != null) { channel.setMessageHandler( (message, reply) -> { @@ -1407,7 +1409,7 @@ public void error(Throwable error) { BasicMessageChannel channel = new BasicMessageChannel<>( binaryMessenger, - "dev.flutter.pigeon.FirebaseStorageHostApi.taskResume", + "dev.flutter.pigeon.firebase_storage_platform_interface.FirebaseStorageHostApi.taskResume", getCodec()); if (api != null) { channel.setMessageHandler( @@ -1440,7 +1442,7 @@ public void error(Throwable error) { BasicMessageChannel channel = new BasicMessageChannel<>( binaryMessenger, - "dev.flutter.pigeon.FirebaseStorageHostApi.taskCancel", + "dev.flutter.pigeon.firebase_storage_platform_interface.FirebaseStorageHostApi.taskCancel", getCodec()); if (api != null) { channel.setMessageHandler( diff --git a/packages/firebase_storage/firebase_storage/example/.gitignore b/packages/firebase_storage/firebase_storage/example/.gitignore new file mode 100644 index 000000000000..24476c5d1eb5 --- /dev/null +++ b/packages/firebase_storage/firebase_storage/example/.gitignore @@ -0,0 +1,44 @@ +# Miscellaneous +*.class +*.log +*.pyc +*.swp +.DS_Store +.atom/ +.buildlog/ +.history +.svn/ +migrate_working_dir/ + +# IntelliJ related +*.iml +*.ipr +*.iws +.idea/ + +# The .vscode folder contains launch configuration and tasks you configure in +# VS Code which you may wish to be included in version control, so this line +# is commented out by default. +#.vscode/ + +# Flutter/Dart/Pub related +**/doc/api/ +**/ios/Flutter/.last_build_id +.dart_tool/ +.flutter-plugins +.flutter-plugins-dependencies +.packages +.pub-cache/ +.pub/ +/build/ + +# Symbolication related +app.*.symbols + +# Obfuscation related +app.*.map.json + +# Android Studio will place build artifacts here +/android/app/debug +/android/app/profile +/android/app/release diff --git a/packages/firebase_storage/firebase_storage/example/.metadata b/packages/firebase_storage/firebase_storage/example/.metadata new file mode 100644 index 000000000000..e0d11d9c4316 --- /dev/null +++ b/packages/firebase_storage/firebase_storage/example/.metadata @@ -0,0 +1,30 @@ +# This file tracks properties of this Flutter project. +# Used by Flutter tool to assess capabilities and perform upgrades etc. +# +# This file should be version controlled and should not be manually edited. + +version: + revision: "2e05371c88da377d72bb1de95dcd25b4cbe3fe1a" + channel: "master" + +project_type: app + +# Tracks metadata for the flutter migrate command +migration: + platforms: + - platform: root + create_revision: 2e05371c88da377d72bb1de95dcd25b4cbe3fe1a + base_revision: 2e05371c88da377d72bb1de95dcd25b4cbe3fe1a + - platform: windows + create_revision: 2e05371c88da377d72bb1de95dcd25b4cbe3fe1a + base_revision: 2e05371c88da377d72bb1de95dcd25b4cbe3fe1a + + # User provided section + + # List of Local paths (relative to this file) that should be + # ignored by the migrate tool. + # + # Files that are not part of the templates will be ignored by default. + unmanaged_files: + - 'lib/main.dart' + - 'ios/Runner.xcodeproj/project.pbxproj' diff --git a/packages/firebase_storage/firebase_storage/example/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/packages/firebase_storage/firebase_storage/example/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 000000000000..18d981003d68 --- /dev/null +++ b/packages/firebase_storage/firebase_storage/example/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + 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 b8199c8f181b..47d540bb4ff5 100644 --- a/packages/firebase_storage/firebase_storage/example/lib/firebase_options.dart +++ b/packages/firebase_storage/firebase_storage/example/lib/firebase_options.dart @@ -31,6 +31,8 @@ class DefaultFirebaseOptions { return ios; case TargetPlatform.macOS: return macos; + case TargetPlatform.windows: + return android; } throw UnsupportedError( diff --git a/packages/firebase_storage/firebase_storage/example/lib/main.dart b/packages/firebase_storage/firebase_storage/example/lib/main.dart index c5a82e99ed2f..33b9e30b6ae1 100755 --- a/packages/firebase_storage/firebase_storage/example/lib/main.dart +++ b/packages/firebase_storage/firebase_storage/example/lib/main.dart @@ -21,12 +21,15 @@ Future main() async { options: DefaultFirebaseOptions.currentPlatform, ); - final emulatorHost = - (!kIsWeb && defaultTargetPlatform == TargetPlatform.android) - ? '10.0.2.2' - : 'localhost'; - - await FirebaseStorage.instance.useStorageEmulator(emulatorHost, 9199); + if (defaultTargetPlatform != TargetPlatform.windows) { + // window currently don't support storage emulator + final emulatorHost = + (!kIsWeb && defaultTargetPlatform == TargetPlatform.android) + ? '10.0.2.2' + : 'localhost'; + + await FirebaseStorage.instance.useStorageEmulator(emulatorHost, 9199); + } runApp(StorageExampleApp()); } @@ -206,6 +209,18 @@ class _TaskManager extends State { ); } + Future _delete(Reference ref) async { + await ref.delete(); + + ScaffoldMessenger.of(context).showSnackBar( + SnackBar( + content: Text( + 'Success!\n deleted ${ref.name} \n from bucket: ${ref.bucket}\n ' + 'at path: ${ref.fullPath} \n'), + ), + ); + } + @override Widget build(BuildContext context) { return Scaffold( @@ -253,6 +268,9 @@ class _TaskManager extends State { return _downloadFile(_uploadTasks[index].snapshot.ref); } }, + onDelete: () async { + return _delete(_uploadTasks[index].snapshot.ref); + }, ), ), ); @@ -268,6 +286,7 @@ class UploadTaskListTile extends StatelessWidget { required this.onDismissed, required this.onDownload, required this.onDownloadLink, + required this.onDelete, }) : super(key: key); /// The [UploadTask]. @@ -282,6 +301,9 @@ class UploadTaskListTile extends StatelessWidget { /// Triggered when the user presses the "link" button on a completed upload task. final VoidCallback /*!*/ onDownloadLink; + /// Triggered when the user presses the "delete" button on a completed upload task. + final VoidCallback /*!*/ onDelete; + /// Displays the current transferred bytes of the task. String _bytesTransferred(TaskSnapshot snapshot) { return '${snapshot.bytesTransferred}/${snapshot.totalBytes}'; @@ -347,6 +369,11 @@ class UploadTaskListTile extends StatelessWidget { icon: const Icon(Icons.link), onPressed: onDownloadLink, ), + if (state == TaskState.success) + IconButton( + icon: const Icon(Icons.delete), + onPressed: onDelete, + ), ], ), ), diff --git a/packages/firebase_storage/firebase_storage/example/windows/.gitignore b/packages/firebase_storage/firebase_storage/example/windows/.gitignore new file mode 100644 index 000000000000..d492d0d98c8f --- /dev/null +++ b/packages/firebase_storage/firebase_storage/example/windows/.gitignore @@ -0,0 +1,17 @@ +flutter/ephemeral/ + +# Visual Studio user-specific files. +*.suo +*.user +*.userosscache +*.sln.docstates + +# Visual Studio build-related files. +x64/ +x86/ + +# Visual Studio cache files +# files ending in .cache can be ignored +*.[Cc]ache +# but keep track of directories ending in .cache +!*.[Cc]ache/ diff --git a/packages/firebase_storage/firebase_storage/example/windows/CMakeLists.txt b/packages/firebase_storage/firebase_storage/example/windows/CMakeLists.txt new file mode 100644 index 000000000000..c09389c56bf6 --- /dev/null +++ b/packages/firebase_storage/firebase_storage/example/windows/CMakeLists.txt @@ -0,0 +1,102 @@ +# Project-level configuration. +cmake_minimum_required(VERSION 3.14) +project(example 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 "example") + +# Explicitly opt in to modern CMake behaviors to avoid warnings with recent +# versions of CMake. +cmake_policy(VERSION 3.14...3.25) + +# Define build configuration option. +get_property(IS_MULTICONFIG GLOBAL PROPERTY GENERATOR_IS_MULTI_CONFIG) +if(IS_MULTICONFIG) + set(CMAKE_CONFIGURATION_TYPES "Debug;Profile;Release" + CACHE STRING "" FORCE) +else() + 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() +endif() +# Define settings for the Profile build mode. +set(CMAKE_EXE_LINKER_FLAGS_PROFILE "${CMAKE_EXE_LINKER_FLAGS_RELEASE}") +set(CMAKE_SHARED_LINKER_FLAGS_PROFILE "${CMAKE_SHARED_LINKER_FLAGS_RELEASE}") +set(CMAKE_C_FLAGS_PROFILE "${CMAKE_C_FLAGS_RELEASE}") +set(CMAKE_CXX_FLAGS_PROFILE "${CMAKE_CXX_FLAGS_RELEASE}") + +# Use Unicode for all projects. +add_definitions(-DUNICODE -D_UNICODE) + +# 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_17) + target_compile_options(${TARGET} PRIVATE /W4 /WX /wd"4100") + target_compile_options(${TARGET} PRIVATE /EHsc) + target_compile_definitions(${TARGET} PRIVATE "_HAS_EXCEPTIONS=0") + target_compile_definitions(${TARGET} PRIVATE "$<$:_DEBUG>") +endfunction() + +# Flutter library and tool build rules. +set(FLUTTER_MANAGED_DIR "${CMAKE_CURRENT_SOURCE_DIR}/flutter") +add_subdirectory(${FLUTTER_MANAGED_DIR}) + +# Application build; see runner/CMakeLists.txt. +add_subdirectory("runner") + + +# Generated plugin build rules, which manage building the plugins and adding +# them to the application. +include(flutter/generated_plugins.cmake) + + +# === Installation === +# Support files are copied into place next to the executable, so that it can +# run in place. This is done instead of making a separate bundle (as on Linux) +# so that building and running from within Visual Studio will work. +set(BUILD_BUNDLE_DIR "$") +# Make the "install" step default, as it's required to run. +set(CMAKE_VS_INCLUDE_INSTALL_TO_DEFAULT_BUILD 1) +if(CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT) + set(CMAKE_INSTALL_PREFIX "${BUILD_BUNDLE_DIR}" CACHE PATH "..." FORCE) +endif() + +set(INSTALL_BUNDLE_DATA_DIR "${CMAKE_INSTALL_PREFIX}/data") +set(INSTALL_BUNDLE_LIB_DIR "${CMAKE_INSTALL_PREFIX}") + +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) + +if(PLUGIN_BUNDLED_LIBRARIES) + install(FILES "${PLUGIN_BUNDLED_LIBRARIES}" + DESTINATION "${INSTALL_BUNDLE_LIB_DIR}" + COMPONENT Runtime) +endif() + +# 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. +install(FILES "${AOT_LIBRARY}" DESTINATION "${INSTALL_BUNDLE_DATA_DIR}" + CONFIGURATIONS Profile;Release + COMPONENT Runtime) diff --git a/packages/firebase_storage/firebase_storage/example/windows/flutter/CMakeLists.txt b/packages/firebase_storage/firebase_storage/example/windows/flutter/CMakeLists.txt new file mode 100644 index 000000000000..930d2071a324 --- /dev/null +++ b/packages/firebase_storage/firebase_storage/example/windows/flutter/CMakeLists.txt @@ -0,0 +1,104 @@ +# This file controls Flutter-level build steps. It should not be edited. +cmake_minimum_required(VERSION 3.14) + +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. +set(WRAPPER_ROOT "${EPHEMERAL_DIR}/cpp_client_wrapper") + +# === Flutter Library === +set(FLUTTER_LIBRARY "${EPHEMERAL_DIR}/flutter_windows.dll") + +# 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/windows/app.so" PARENT_SCOPE) + +list(APPEND FLUTTER_LIBRARY_HEADERS + "flutter_export.h" + "flutter_windows.h" + "flutter_messenger.h" + "flutter_plugin_registrar.h" + "flutter_texture_registrar.h" +) +list(TRANSFORM FLUTTER_LIBRARY_HEADERS PREPEND "${EPHEMERAL_DIR}/") +add_library(flutter INTERFACE) +target_include_directories(flutter INTERFACE + "${EPHEMERAL_DIR}" +) +target_link_libraries(flutter INTERFACE "${FLUTTER_LIBRARY}.lib") +add_dependencies(flutter flutter_assemble) + +# === Wrapper === +list(APPEND CPP_WRAPPER_SOURCES_CORE + "core_implementations.cc" + "standard_codec.cc" +) +list(TRANSFORM CPP_WRAPPER_SOURCES_CORE PREPEND "${WRAPPER_ROOT}/") +list(APPEND CPP_WRAPPER_SOURCES_PLUGIN + "plugin_registrar.cc" +) +list(TRANSFORM CPP_WRAPPER_SOURCES_PLUGIN PREPEND "${WRAPPER_ROOT}/") +list(APPEND CPP_WRAPPER_SOURCES_APP + "flutter_engine.cc" + "flutter_view_controller.cc" +) +list(TRANSFORM CPP_WRAPPER_SOURCES_APP PREPEND "${WRAPPER_ROOT}/") + +# Wrapper sources needed for a plugin. +add_library(flutter_wrapper_plugin STATIC + ${CPP_WRAPPER_SOURCES_CORE} + ${CPP_WRAPPER_SOURCES_PLUGIN} +) +apply_standard_settings(flutter_wrapper_plugin) +set_target_properties(flutter_wrapper_plugin PROPERTIES + POSITION_INDEPENDENT_CODE ON) +set_target_properties(flutter_wrapper_plugin PROPERTIES + CXX_VISIBILITY_PRESET hidden) +target_link_libraries(flutter_wrapper_plugin PUBLIC flutter) +target_include_directories(flutter_wrapper_plugin PUBLIC + "${WRAPPER_ROOT}/include" +) +add_dependencies(flutter_wrapper_plugin flutter_assemble) + +# Wrapper sources needed for the runner. +add_library(flutter_wrapper_app STATIC + ${CPP_WRAPPER_SOURCES_CORE} + ${CPP_WRAPPER_SOURCES_APP} +) +apply_standard_settings(flutter_wrapper_app) +target_link_libraries(flutter_wrapper_app PUBLIC flutter) +target_include_directories(flutter_wrapper_app PUBLIC + "${WRAPPER_ROOT}/include" +) +add_dependencies(flutter_wrapper_app 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. +set(PHONY_OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/_phony_") +set_source_files_properties("${PHONY_OUTPUT}" PROPERTIES SYMBOLIC TRUE) +add_custom_command( + OUTPUT ${FLUTTER_LIBRARY} ${FLUTTER_LIBRARY_HEADERS} + ${CPP_WRAPPER_SOURCES_CORE} ${CPP_WRAPPER_SOURCES_PLUGIN} + ${CPP_WRAPPER_SOURCES_APP} + ${PHONY_OUTPUT} + COMMAND ${CMAKE_COMMAND} -E env + ${FLUTTER_TOOL_ENVIRONMENT} + "${FLUTTER_ROOT}/packages/flutter_tools/bin/tool_backend.bat" + windows-x64 $ + VERBATIM +) +add_custom_target(flutter_assemble DEPENDS + "${FLUTTER_LIBRARY}" + ${FLUTTER_LIBRARY_HEADERS} + ${CPP_WRAPPER_SOURCES_CORE} + ${CPP_WRAPPER_SOURCES_PLUGIN} + ${CPP_WRAPPER_SOURCES_APP} +) diff --git a/packages/firebase_storage/firebase_storage/example/windows/flutter/generated_plugin_registrant.cc b/packages/firebase_storage/firebase_storage/example/windows/flutter/generated_plugin_registrant.cc new file mode 100644 index 000000000000..6cd334f89b36 --- /dev/null +++ b/packages/firebase_storage/firebase_storage/example/windows/flutter/generated_plugin_registrant.cc @@ -0,0 +1,20 @@ +// +// Generated file. Do not edit. +// + +// clang-format off + +#include "generated_plugin_registrant.h" + +#include +#include +#include + +void RegisterPlugins(flutter::PluginRegistry* registry) { + FileSelectorWindowsRegisterWithRegistrar( + registry->GetRegistrarForPlugin("FileSelectorWindows")); + FirebaseCorePluginCApiRegisterWithRegistrar( + registry->GetRegistrarForPlugin("FirebaseCorePluginCApi")); + FirebaseStoragePluginCApiRegisterWithRegistrar( + registry->GetRegistrarForPlugin("FirebaseStoragePluginCApi")); +} diff --git a/packages/firebase_storage/firebase_storage/example/windows/flutter/generated_plugin_registrant.h b/packages/firebase_storage/firebase_storage/example/windows/flutter/generated_plugin_registrant.h new file mode 100644 index 000000000000..dc139d85a931 --- /dev/null +++ b/packages/firebase_storage/firebase_storage/example/windows/flutter/generated_plugin_registrant.h @@ -0,0 +1,15 @@ +// +// Generated file. Do not edit. +// + +// clang-format off + +#ifndef GENERATED_PLUGIN_REGISTRANT_ +#define GENERATED_PLUGIN_REGISTRANT_ + +#include + +// Registers Flutter plugins. +void RegisterPlugins(flutter::PluginRegistry* registry); + +#endif // GENERATED_PLUGIN_REGISTRANT_ diff --git a/packages/firebase_storage/firebase_storage/example/windows/flutter/generated_plugins.cmake b/packages/firebase_storage/firebase_storage/example/windows/flutter/generated_plugins.cmake new file mode 100644 index 000000000000..0d2f42d15805 --- /dev/null +++ b/packages/firebase_storage/firebase_storage/example/windows/flutter/generated_plugins.cmake @@ -0,0 +1,26 @@ +# +# Generated file, do not edit. +# + +list(APPEND FLUTTER_PLUGIN_LIST + file_selector_windows + firebase_core + firebase_storage +) + +list(APPEND FLUTTER_FFI_PLUGIN_LIST +) + +set(PLUGIN_BUNDLED_LIBRARIES) + +foreach(plugin ${FLUTTER_PLUGIN_LIST}) + add_subdirectory(flutter/ephemeral/.plugin_symlinks/${plugin}/windows plugins/${plugin}) + target_link_libraries(${BINARY_NAME} PRIVATE ${plugin}_plugin) + list(APPEND PLUGIN_BUNDLED_LIBRARIES $) + list(APPEND PLUGIN_BUNDLED_LIBRARIES ${${plugin}_bundled_libraries}) +endforeach(plugin) + +foreach(ffi_plugin ${FLUTTER_FFI_PLUGIN_LIST}) + add_subdirectory(flutter/ephemeral/.plugin_symlinks/${ffi_plugin}/windows plugins/${ffi_plugin}) + list(APPEND PLUGIN_BUNDLED_LIBRARIES ${${ffi_plugin}_bundled_libraries}) +endforeach(ffi_plugin) diff --git a/packages/firebase_storage/firebase_storage/example/windows/runner/CMakeLists.txt b/packages/firebase_storage/firebase_storage/example/windows/runner/CMakeLists.txt new file mode 100644 index 000000000000..394917c053a0 --- /dev/null +++ b/packages/firebase_storage/firebase_storage/example/windows/runner/CMakeLists.txt @@ -0,0 +1,40 @@ +cmake_minimum_required(VERSION 3.14) +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} WIN32 + "flutter_window.cpp" + "main.cpp" + "utils.cpp" + "win32_window.cpp" + "${FLUTTER_MANAGED_DIR}/generated_plugin_registrant.cc" + "Runner.rc" + "runner.exe.manifest" +) + +# 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 build version. +target_compile_definitions(${BINARY_NAME} PRIVATE "FLUTTER_VERSION=\"${FLUTTER_VERSION}\"") +target_compile_definitions(${BINARY_NAME} PRIVATE "FLUTTER_VERSION_MAJOR=${FLUTTER_VERSION_MAJOR}") +target_compile_definitions(${BINARY_NAME} PRIVATE "FLUTTER_VERSION_MINOR=${FLUTTER_VERSION_MINOR}") +target_compile_definitions(${BINARY_NAME} PRIVATE "FLUTTER_VERSION_PATCH=${FLUTTER_VERSION_PATCH}") +target_compile_definitions(${BINARY_NAME} PRIVATE "FLUTTER_VERSION_BUILD=${FLUTTER_VERSION_BUILD}") + +# Disable Windows macros that collide with C++ standard library functions. +target_compile_definitions(${BINARY_NAME} PRIVATE "NOMINMAX") + +# Add dependency libraries and include directories. Add any application-specific +# dependencies here. +target_link_libraries(${BINARY_NAME} PRIVATE flutter flutter_wrapper_app) +target_link_libraries(${BINARY_NAME} PRIVATE "dwmapi.lib") +target_include_directories(${BINARY_NAME} PRIVATE "${CMAKE_SOURCE_DIR}") + +# Run the Flutter tool portions of the build. This must not be removed. +add_dependencies(${BINARY_NAME} flutter_assemble) diff --git a/packages/firebase_storage/firebase_storage/example/windows/runner/Runner.rc b/packages/firebase_storage/firebase_storage/example/windows/runner/Runner.rc new file mode 100644 index 000000000000..e855f88e4dcf --- /dev/null +++ b/packages/firebase_storage/firebase_storage/example/windows/runner/Runner.rc @@ -0,0 +1,121 @@ +// Microsoft Visual C++ generated resource script. +// +#pragma code_page(65001) +#include "resource.h" + +#define APSTUDIO_READONLY_SYMBOLS +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 2 resource. +// +#include "winres.h" + +///////////////////////////////////////////////////////////////////////////// +#undef APSTUDIO_READONLY_SYMBOLS + +///////////////////////////////////////////////////////////////////////////// +// English (United States) resources + +#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU) +LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US + +#ifdef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// TEXTINCLUDE +// + +1 TEXTINCLUDE +BEGIN + "resource.h\0" +END + +2 TEXTINCLUDE +BEGIN + "#include ""winres.h""\r\n" + "\0" +END + +3 TEXTINCLUDE +BEGIN + "\r\n" + "\0" +END + +#endif // APSTUDIO_INVOKED + + +///////////////////////////////////////////////////////////////////////////// +// +// Icon +// + +// Icon with lowest ID value placed first to ensure application icon +// remains consistent on all systems. +IDI_APP_ICON ICON "resources\\app_icon.ico" + + +///////////////////////////////////////////////////////////////////////////// +// +// Version +// + +#if defined(FLUTTER_VERSION_MAJOR) && defined(FLUTTER_VERSION_MINOR) && defined(FLUTTER_VERSION_PATCH) && defined(FLUTTER_VERSION_BUILD) +#define VERSION_AS_NUMBER FLUTTER_VERSION_MAJOR,FLUTTER_VERSION_MINOR,FLUTTER_VERSION_PATCH,FLUTTER_VERSION_BUILD +#else +#define VERSION_AS_NUMBER 1,0,0,0 +#endif + +#if defined(FLUTTER_VERSION) +#define VERSION_AS_STRING FLUTTER_VERSION +#else +#define VERSION_AS_STRING "1.0.0" +#endif + +VS_VERSION_INFO VERSIONINFO + FILEVERSION VERSION_AS_NUMBER + PRODUCTVERSION VERSION_AS_NUMBER + FILEFLAGSMASK VS_FFI_FILEFLAGSMASK +#ifdef _DEBUG + FILEFLAGS VS_FF_DEBUG +#else + FILEFLAGS 0x0L +#endif + FILEOS VOS__WINDOWS32 + FILETYPE VFT_APP + FILESUBTYPE 0x0L +BEGIN + BLOCK "StringFileInfo" + BEGIN + BLOCK "040904e4" + BEGIN + VALUE "CompanyName", "io.flutter.plugins" "\0" + VALUE "FileDescription", "example" "\0" + VALUE "FileVersion", VERSION_AS_STRING "\0" + VALUE "InternalName", "example" "\0" + VALUE "LegalCopyright", "Copyright (C) 2023 io.flutter.plugins. All rights reserved." "\0" + VALUE "OriginalFilename", "example.exe" "\0" + VALUE "ProductName", "example" "\0" + VALUE "ProductVersion", VERSION_AS_STRING "\0" + END + END + BLOCK "VarFileInfo" + BEGIN + VALUE "Translation", 0x409, 1252 + END +END + +#endif // English (United States) resources +///////////////////////////////////////////////////////////////////////////// + + + +#ifndef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 3 resource. +// + + +///////////////////////////////////////////////////////////////////////////// +#endif // not APSTUDIO_INVOKED diff --git a/packages/firebase_storage/firebase_storage/example/windows/runner/flutter_window.cpp b/packages/firebase_storage/firebase_storage/example/windows/runner/flutter_window.cpp new file mode 100644 index 000000000000..b6590a0417ff --- /dev/null +++ b/packages/firebase_storage/firebase_storage/example/windows/runner/flutter_window.cpp @@ -0,0 +1,73 @@ +// 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. + +#include "flutter_window.h" + +#include + +#include "flutter/generated_plugin_registrant.h" + +FlutterWindow::FlutterWindow(const flutter::DartProject& project) + : project_(project) {} + +FlutterWindow::~FlutterWindow() {} + +bool FlutterWindow::OnCreate() { + if (!Win32Window::OnCreate()) { + return false; + } + + RECT frame = GetClientArea(); + + // The size here must match the window dimensions to avoid unnecessary surface + // creation / destruction in the startup path. + flutter_controller_ = std::make_unique( + frame.right - frame.left, frame.bottom - frame.top, project_); + // Ensure that basic setup of the controller was successful. + if (!flutter_controller_->engine() || !flutter_controller_->view()) { + return false; + } + RegisterPlugins(flutter_controller_->engine()); + SetChildContent(flutter_controller_->view()->GetNativeWindow()); + + flutter_controller_->engine()->SetNextFrameCallback([&]() { this->Show(); }); + + // Flutter can complete the first frame before the "show window" callback is + // registered. The following call ensures a frame is pending to ensure the + // window is shown. It is a no-op if the first frame hasn't completed yet. + flutter_controller_->ForceRedraw(); + + return true; +} + +void FlutterWindow::OnDestroy() { + if (flutter_controller_) { + flutter_controller_ = nullptr; + } + + Win32Window::OnDestroy(); +} + +LRESULT +FlutterWindow::MessageHandler(HWND hwnd, UINT const message, + WPARAM const wparam, + LPARAM const lparam) noexcept { + // Give Flutter, including plugins, an opportunity to handle window messages. + if (flutter_controller_) { + std::optional result = + flutter_controller_->HandleTopLevelWindowProc(hwnd, message, wparam, + lparam); + if (result) { + return *result; + } + } + + switch (message) { + case WM_FONTCHANGE: + flutter_controller_->engine()->ReloadSystemFonts(); + break; + } + + return Win32Window::MessageHandler(hwnd, message, wparam, lparam); +} diff --git a/packages/firebase_storage/firebase_storage/example/windows/runner/flutter_window.h b/packages/firebase_storage/firebase_storage/example/windows/runner/flutter_window.h new file mode 100644 index 000000000000..cd42d5334f5b --- /dev/null +++ b/packages/firebase_storage/firebase_storage/example/windows/runner/flutter_window.h @@ -0,0 +1,38 @@ +// 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. + +#ifndef FIREBASE_PACKAGES_FIREBASE_STORAGE_FIREBASE_STORAGE_EXAMPLE_WINDOWS_RUNNER_FLUTTER_WINDOW_H_ +#define FIREBASE_PACKAGES_FIREBASE_STORAGE_FIREBASE_STORAGE_EXAMPLE_WINDOWS_RUNNER_FLUTTER_WINDOW_H_ + +#include +#include + +#include + +#include "win32_window.h" + +// A window that does nothing but host a Flutter view. +class FlutterWindow : public Win32Window { + public: + // Creates a new FlutterWindow hosting a Flutter view running |project|. + explicit FlutterWindow(const flutter::DartProject& project); + virtual ~FlutterWindow(); + + protected: + // Win32Window: + bool OnCreate() override; + void OnDestroy() override; + LRESULT MessageHandler(HWND window, UINT const message, WPARAM const wparam, + LPARAM const lparam) noexcept override; + + private: + // The project to run. + flutter::DartProject project_; + + // The Flutter instance hosted by this window. + std::unique_ptr flutter_controller_; +}; + +#endif /* FIREBASE_PACKAGES_FIREBASE_STORAGE_FIREBASE_STORAGE_EXAMPLE_WINDOWS_RUNNER_FLUTTER_WINDOW_H_ \ + */ diff --git a/packages/firebase_storage/firebase_storage/example/windows/runner/main.cpp b/packages/firebase_storage/firebase_storage/example/windows/runner/main.cpp new file mode 100644 index 000000000000..bf07e45b3a4a --- /dev/null +++ b/packages/firebase_storage/firebase_storage/example/windows/runner/main.cpp @@ -0,0 +1,46 @@ +// 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. + +#include +#include +#include + +#include "flutter_window.h" +#include "utils.h" + +int APIENTRY wWinMain(_In_ HINSTANCE instance, _In_opt_ HINSTANCE prev, + _In_ wchar_t *command_line, _In_ int show_command) { + // Attach to console when present (e.g., 'flutter run') or create a + // new console when running with a debugger. + if (!::AttachConsole(ATTACH_PARENT_PROCESS) && ::IsDebuggerPresent()) { + CreateAndAttachConsole(); + } + + // Initialize COM, so that it is available for use in the library and/or + // plugins. + ::CoInitializeEx(nullptr, COINIT_APARTMENTTHREADED); + + flutter::DartProject project(L"data"); + + std::vector command_line_arguments = GetCommandLineArguments(); + + project.set_dart_entrypoint_arguments(std::move(command_line_arguments)); + + FlutterWindow window(project); + Win32Window::Point origin(10, 10); + Win32Window::Size size(1280, 720); + if (!window.Create(L"example", origin, size)) { + return EXIT_FAILURE; + } + window.SetQuitOnClose(true); + + ::MSG msg; + while (::GetMessage(&msg, nullptr, 0, 0)) { + ::TranslateMessage(&msg); + ::DispatchMessage(&msg); + } + + ::CoUninitialize(); + return EXIT_SUCCESS; +} diff --git a/packages/firebase_storage/firebase_storage/example/windows/runner/resource.h b/packages/firebase_storage/firebase_storage/example/windows/runner/resource.h new file mode 100644 index 000000000000..299e8b2f763e --- /dev/null +++ b/packages/firebase_storage/firebase_storage/example/windows/runner/resource.h @@ -0,0 +1,20 @@ +// 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. + +//{{NO_DEPENDENCIES}} +// Microsoft Visual C++ generated include file. +// Used by Runner.rc +// +#define IDI_APP_ICON 101 + +// Next default values for new objects +// +#ifdef APSTUDIO_INVOKED +#ifndef APSTUDIO_READONLY_SYMBOLS +#define _APS_NEXT_RESOURCE_VALUE 102 +#define _APS_NEXT_COMMAND_VALUE 40001 +#define _APS_NEXT_CONTROL_VALUE 1001 +#define _APS_NEXT_SYMED_VALUE 101 +#endif +#endif diff --git a/packages/firebase_storage/firebase_storage/example/windows/runner/resources/app_icon.ico b/packages/firebase_storage/firebase_storage/example/windows/runner/resources/app_icon.ico new file mode 100644 index 0000000000000000000000000000000000000000..c04e20caf6370ebb9253ad831cc31de4a9c965f6 GIT binary patch literal 33772 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 literal 0 HcmV?d00001 diff --git a/packages/firebase_storage/firebase_storage/example/windows/runner/runner.exe.manifest b/packages/firebase_storage/firebase_storage/example/windows/runner/runner.exe.manifest new file mode 100644 index 000000000000..a42ea7687cb6 --- /dev/null +++ b/packages/firebase_storage/firebase_storage/example/windows/runner/runner.exe.manifest @@ -0,0 +1,20 @@ + + + + + PerMonitorV2 + + + + + + + + + + + + + + + diff --git a/packages/firebase_storage/firebase_storage/example/windows/runner/utils.cpp b/packages/firebase_storage/firebase_storage/example/windows/runner/utils.cpp new file mode 100644 index 000000000000..9f01ff8b18e0 --- /dev/null +++ b/packages/firebase_storage/firebase_storage/example/windows/runner/utils.cpp @@ -0,0 +1,69 @@ +// 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. + +#include "utils.h" + +#include +#include +#include +#include + +#include + +void CreateAndAttachConsole() { + if (::AllocConsole()) { + FILE* unused; + if (freopen_s(&unused, "CONOUT$", "w", stdout)) { + _dup2(_fileno(stdout), 1); + } + if (freopen_s(&unused, "CONOUT$", "w", stderr)) { + _dup2(_fileno(stdout), 2); + } + std::ios::sync_with_stdio(); + FlutterDesktopResyncOutputStreams(); + } +} + +std::vector GetCommandLineArguments() { + // Convert the UTF-16 command line arguments to UTF-8 for the Engine to use. + int argc; + wchar_t** argv = ::CommandLineToArgvW(::GetCommandLineW(), &argc); + if (argv == nullptr) { + return std::vector(); + } + + std::vector command_line_arguments; + + // Skip the first argument as it's the binary name. + for (int i = 1; i < argc; i++) { + command_line_arguments.push_back(Utf8FromUtf16(argv[i])); + } + + ::LocalFree(argv); + + return command_line_arguments; +} + +std::string Utf8FromUtf16(const wchar_t* utf16_string) { + if (utf16_string == nullptr) { + return std::string(); + } + int target_length = + ::WideCharToMultiByte(CP_UTF8, WC_ERR_INVALID_CHARS, utf16_string, -1, + nullptr, 0, nullptr, nullptr) - + 1; // remove the trailing null character + int input_length = (int)wcslen(utf16_string); + std::string utf8_string; + if (target_length <= 0 || target_length > utf8_string.max_size()) { + return utf8_string; + } + utf8_string.resize(target_length); + int converted_length = ::WideCharToMultiByte( + CP_UTF8, WC_ERR_INVALID_CHARS, utf16_string, input_length, + utf8_string.data(), target_length, nullptr, nullptr); + if (converted_length == 0) { + return std::string(); + } + return utf8_string; +} diff --git a/packages/firebase_storage/firebase_storage/example/windows/runner/utils.h b/packages/firebase_storage/firebase_storage/example/windows/runner/utils.h new file mode 100644 index 000000000000..fa26869edb59 --- /dev/null +++ b/packages/firebase_storage/firebase_storage/example/windows/runner/utils.h @@ -0,0 +1,23 @@ +// 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. + +#ifndef RUNNER_UTILS_H_ +#define RUNNER_UTILS_H_ + +#include +#include + +// Creates a console for the process, and redirects stdout and stderr to +// it for both the runner and the Flutter library. +void CreateAndAttachConsole(); + +// Takes a null-terminated wchar_t* encoded in UTF-16 and returns a std::string +// encoded in UTF-8. Returns an empty std::string on failure. +std::string Utf8FromUtf16(const wchar_t* utf16_string); + +// Gets the command line arguments passed in as a std::vector, +// encoded in UTF-8. Returns an empty std::vector on failure. +std::vector GetCommandLineArguments(); + +#endif // RUNNER_UTILS_H_ diff --git a/packages/firebase_storage/firebase_storage/example/windows/runner/win32_window.cpp b/packages/firebase_storage/firebase_storage/example/windows/runner/win32_window.cpp new file mode 100644 index 000000000000..45d150e7b681 --- /dev/null +++ b/packages/firebase_storage/firebase_storage/example/windows/runner/win32_window.cpp @@ -0,0 +1,284 @@ +// 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. + +#include "win32_window.h" + +#include +#include + +#include "resource.h" + +namespace { + +/// Window attribute that enables dark mode window decorations. +/// +/// Redefined in case the developer's machine has a Windows SDK older than +/// version 10.0.22000.0. +/// See: +/// https://docs.microsoft.com/windows/win32/api/dwmapi/ne-dwmapi-dwmwindowattribute +#ifndef DWMWA_USE_IMMERSIVE_DARK_MODE +#define DWMWA_USE_IMMERSIVE_DARK_MODE 20 +#endif + +constexpr const wchar_t kWindowClassName[] = L"FLUTTER_RUNNER_WIN32_WINDOW"; + +/// Registry key for app theme preference. +/// +/// A value of 0 indicates apps should use dark mode. A non-zero or missing +/// value indicates apps should use light mode. +constexpr const wchar_t kGetPreferredBrightnessRegKey[] = + L"Software\\Microsoft\\Windows\\CurrentVersion\\Themes\\Personalize"; +constexpr const wchar_t kGetPreferredBrightnessRegValue[] = + L"AppsUseLightTheme"; + +// The number of Win32Window objects that currently exist. +static int g_active_window_count = 0; + +using EnableNonClientDpiScaling = BOOL __stdcall(HWND hwnd); + +// Scale helper to convert logical scaler values to physical using passed in +// scale factor +int Scale(int source, double scale_factor) { + return static_cast(source * scale_factor); +} + +// Dynamically loads the |EnableNonClientDpiScaling| from the User32 module. +// This API is only needed for PerMonitor V1 awareness mode. +void EnableFullDpiSupportIfAvailable(HWND hwnd) { + HMODULE user32_module = LoadLibraryA("User32.dll"); + if (!user32_module) { + return; + } + auto enable_non_client_dpi_scaling = + reinterpret_cast( + GetProcAddress(user32_module, "EnableNonClientDpiScaling")); + if (enable_non_client_dpi_scaling != nullptr) { + enable_non_client_dpi_scaling(hwnd); + } + FreeLibrary(user32_module); +} + +} // namespace + +// Manages the Win32Window's window class registration. +class WindowClassRegistrar { + public: + ~WindowClassRegistrar() = default; + + // Returns the singleton registrar instance. + static WindowClassRegistrar* GetInstance() { + if (!instance_) { + instance_ = new WindowClassRegistrar(); + } + return instance_; + } + + // Returns the name of the window class, registering the class if it hasn't + // previously been registered. + const wchar_t* GetWindowClass(); + + // Unregisters the window class. Should only be called if there are no + // instances of the window. + void UnregisterWindowClass(); + + private: + WindowClassRegistrar() = default; + + static WindowClassRegistrar* instance_; + + bool class_registered_ = false; +}; + +WindowClassRegistrar* WindowClassRegistrar::instance_ = nullptr; + +const wchar_t* WindowClassRegistrar::GetWindowClass() { + if (!class_registered_) { + WNDCLASS window_class{}; + window_class.hCursor = LoadCursor(nullptr, IDC_ARROW); + window_class.lpszClassName = kWindowClassName; + window_class.style = CS_HREDRAW | CS_VREDRAW; + window_class.cbClsExtra = 0; + window_class.cbWndExtra = 0; + window_class.hInstance = GetModuleHandle(nullptr); + window_class.hIcon = + LoadIcon(window_class.hInstance, MAKEINTRESOURCE(IDI_APP_ICON)); + window_class.hbrBackground = 0; + window_class.lpszMenuName = nullptr; + window_class.lpfnWndProc = Win32Window::WndProc; + RegisterClass(&window_class); + class_registered_ = true; + } + return kWindowClassName; +} + +void WindowClassRegistrar::UnregisterWindowClass() { + UnregisterClass(kWindowClassName, nullptr); + class_registered_ = false; +} + +Win32Window::Win32Window() { ++g_active_window_count; } + +Win32Window::~Win32Window() { + --g_active_window_count; + Destroy(); +} + +bool Win32Window::Create(const std::wstring& title, const Point& origin, + const Size& size) { + Destroy(); + + const wchar_t* window_class = + WindowClassRegistrar::GetInstance()->GetWindowClass(); + + const POINT target_point = {static_cast(origin.x), + static_cast(origin.y)}; + HMONITOR monitor = MonitorFromPoint(target_point, MONITOR_DEFAULTTONEAREST); + UINT dpi = FlutterDesktopGetDpiForMonitor(monitor); + double scale_factor = dpi / 96.0; + + HWND window = CreateWindow( + window_class, title.c_str(), WS_OVERLAPPEDWINDOW, + Scale(origin.x, scale_factor), Scale(origin.y, scale_factor), + Scale(size.width, scale_factor), Scale(size.height, scale_factor), + nullptr, nullptr, GetModuleHandle(nullptr), this); + + if (!window) { + return false; + } + + UpdateTheme(window); + + return OnCreate(); +} + +bool Win32Window::Show() { return ShowWindow(window_handle_, SW_SHOWNORMAL); } + +// static +LRESULT CALLBACK Win32Window::WndProc(HWND const window, UINT const message, + WPARAM const wparam, + LPARAM const lparam) noexcept { + if (message == WM_NCCREATE) { + auto window_struct = reinterpret_cast(lparam); + SetWindowLongPtr(window, GWLP_USERDATA, + reinterpret_cast(window_struct->lpCreateParams)); + + auto that = static_cast(window_struct->lpCreateParams); + EnableFullDpiSupportIfAvailable(window); + that->window_handle_ = window; + } else if (Win32Window* that = GetThisFromHandle(window)) { + return that->MessageHandler(window, message, wparam, lparam); + } + + return DefWindowProc(window, message, wparam, lparam); +} + +LRESULT +Win32Window::MessageHandler(HWND hwnd, UINT const message, WPARAM const wparam, + LPARAM const lparam) noexcept { + switch (message) { + case WM_DESTROY: + window_handle_ = nullptr; + Destroy(); + if (quit_on_close_) { + PostQuitMessage(0); + } + return 0; + + case WM_DPICHANGED: { + auto newRectSize = reinterpret_cast(lparam); + LONG newWidth = newRectSize->right - newRectSize->left; + LONG newHeight = newRectSize->bottom - newRectSize->top; + + SetWindowPos(hwnd, nullptr, newRectSize->left, newRectSize->top, newWidth, + newHeight, SWP_NOZORDER | SWP_NOACTIVATE); + + return 0; + } + case WM_SIZE: { + RECT rect = GetClientArea(); + if (child_content_ != nullptr) { + // Size and position the child window. + MoveWindow(child_content_, rect.left, rect.top, rect.right - rect.left, + rect.bottom - rect.top, TRUE); + } + return 0; + } + + case WM_ACTIVATE: + if (child_content_ != nullptr) { + SetFocus(child_content_); + } + return 0; + + case WM_DWMCOLORIZATIONCOLORCHANGED: + UpdateTheme(hwnd); + return 0; + } + + return DefWindowProc(window_handle_, message, wparam, lparam); +} + +void Win32Window::Destroy() { + OnDestroy(); + + if (window_handle_) { + DestroyWindow(window_handle_); + window_handle_ = nullptr; + } + if (g_active_window_count == 0) { + WindowClassRegistrar::GetInstance()->UnregisterWindowClass(); + } +} + +Win32Window* Win32Window::GetThisFromHandle(HWND const window) noexcept { + return reinterpret_cast( + GetWindowLongPtr(window, GWLP_USERDATA)); +} + +void Win32Window::SetChildContent(HWND content) { + child_content_ = content; + SetParent(content, window_handle_); + RECT frame = GetClientArea(); + + MoveWindow(content, frame.left, frame.top, frame.right - frame.left, + frame.bottom - frame.top, true); + + SetFocus(child_content_); +} + +RECT Win32Window::GetClientArea() { + RECT frame; + GetClientRect(window_handle_, &frame); + return frame; +} + +HWND Win32Window::GetHandle() { return window_handle_; } + +void Win32Window::SetQuitOnClose(bool quit_on_close) { + quit_on_close_ = quit_on_close; +} + +bool Win32Window::OnCreate() { + // No-op; provided for subclasses. + return true; +} + +void Win32Window::OnDestroy() { + // No-op; provided for subclasses. +} + +void Win32Window::UpdateTheme(HWND const window) { + DWORD light_mode; + DWORD light_mode_size = sizeof(light_mode); + LSTATUS result = + RegGetValue(HKEY_CURRENT_USER, kGetPreferredBrightnessRegKey, + kGetPreferredBrightnessRegValue, RRF_RT_REG_DWORD, nullptr, + &light_mode, &light_mode_size); + + if (result == ERROR_SUCCESS) { + BOOL enable_dark_mode = light_mode == 0; + DwmSetWindowAttribute(window, DWMWA_USE_IMMERSIVE_DARK_MODE, + &enable_dark_mode, sizeof(enable_dark_mode)); + } +} diff --git a/packages/firebase_storage/firebase_storage/example/windows/runner/win32_window.h b/packages/firebase_storage/firebase_storage/example/windows/runner/win32_window.h new file mode 100644 index 000000000000..204046d03188 --- /dev/null +++ b/packages/firebase_storage/firebase_storage/example/windows/runner/win32_window.h @@ -0,0 +1,104 @@ +// 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. + +#ifndef RUNNER_WIN32_WINDOW_H_ +#define RUNNER_WIN32_WINDOW_H_ + +#include + +#include +#include +#include + +// A class abstraction for a high DPI-aware Win32 Window. Intended to be +// inherited from by classes that wish to specialize with custom +// rendering and input handling +class Win32Window { + public: + struct Point { + unsigned int x; + unsigned int y; + Point(unsigned int x, unsigned int y) : x(x), y(y) {} + }; + + struct Size { + unsigned int width; + unsigned int height; + Size(unsigned int width, unsigned int height) + : width(width), height(height) {} + }; + + Win32Window(); + virtual ~Win32Window(); + + // Creates a win32 window with |title| that is positioned and sized using + // |origin| and |size|. New windows are created on the default monitor. Window + // sizes are specified to the OS in physical pixels, hence to ensure a + // consistent size this function will scale the inputted width and height as + // as appropriate for the default monitor. The window is invisible until + // |Show| is called. Returns true if the window was created successfully. + bool Create(const std::wstring& title, const Point& origin, const Size& size); + + // Show the current window. Returns true if the window was successfully shown. + bool Show(); + + // Release OS resources associated with window. + void Destroy(); + + // Inserts |content| into the window tree. + void SetChildContent(HWND content); + + // Returns the backing Window handle to enable clients to set icon and other + // window properties. Returns nullptr if the window has been destroyed. + HWND GetHandle(); + + // If true, closing this window will quit the application. + void SetQuitOnClose(bool quit_on_close); + + // Return a RECT representing the bounds of the current client area. + RECT GetClientArea(); + + protected: + // Processes and route salient window messages for mouse handling, + // size change and DPI. Delegates handling of these to member overloads that + // inheriting classes can handle. + virtual LRESULT MessageHandler(HWND window, UINT const message, + WPARAM const wparam, + LPARAM const lparam) noexcept; + + // Called when CreateAndShow is called, allowing subclass window-related + // setup. Subclasses should return false if setup fails. + virtual bool OnCreate(); + + // Called when Destroy is called. + virtual void OnDestroy(); + + private: + friend class WindowClassRegistrar; + + // OS callback called by message pump. Handles the WM_NCCREATE message which + // is passed when the non-client area is being created and enables automatic + // non-client DPI scaling so that the non-client area automatically + // responds to changes in DPI. All other messages are handled by + // MessageHandler. + static LRESULT CALLBACK WndProc(HWND const window, UINT const message, + WPARAM const wparam, + LPARAM const lparam) noexcept; + + // Retrieves a class instance pointer for |window| + static Win32Window* GetThisFromHandle(HWND const window) noexcept; + + // Update the window frame's theme to match the system theme. + static void UpdateTheme(HWND const window); + + bool quit_on_close_ = false; + + // window handle for top level window. + HWND window_handle_ = nullptr; + + // window handle for hosted content. + HWND child_content_ = nullptr; +}; + +#endif // RUNNER_WIN32_WINDOW_H_ diff --git a/packages/firebase_storage/firebase_storage/ios/Classes/firebase_storage_messages.g.h b/packages/firebase_storage/firebase_storage/ios/Classes/firebase_storage_messages.g.h index 16496ae50c5b..13428e25ed92 100644 --- a/packages/firebase_storage/firebase_storage/ios/Classes/firebase_storage_messages.g.h +++ b/packages/firebase_storage/firebase_storage/ios/Classes/firebase_storage_messages.g.h @@ -1,4 +1,7 @@ -// Autogenerated from Pigeon (v9.2.5), do not edit directly. +// 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 (v11.0.1), do not edit directly. // See also: https://pub.dev/packages/pigeon #import @@ -25,6 +28,12 @@ typedef NS_ENUM(NSUInteger, PigeonStorageTaskState) { PigeonStorageTaskStateError = 4, }; +/// Wrapper for PigeonStorageTaskState to allow for nullability. +@interface PigeonStorageTaskStateBox : NSObject +@property(nonatomic, assign) PigeonStorageTaskState value; +- (instancetype)initWithValue:(PigeonStorageTaskState)value; +@end + @class PigeonStorageFirebaseApp; @class PigeonStorageReference; @class PigeonFullMetaData; diff --git a/packages/firebase_storage/firebase_storage/ios/Classes/firebase_storage_messages.g.m b/packages/firebase_storage/firebase_storage/ios/Classes/firebase_storage_messages.g.m index 914c57b7c588..d9289cfebb3d 100644 --- a/packages/firebase_storage/firebase_storage/ios/Classes/firebase_storage_messages.g.m +++ b/packages/firebase_storage/firebase_storage/ios/Classes/firebase_storage_messages.g.m @@ -1,7 +1,11 @@ -// Autogenerated from Pigeon (v9.2.5), do not edit directly. +// 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 (v11.0.1), do not edit directly. // See also: https://pub.dev/packages/pigeon #import "firebase_storage_messages.g.h" + #if TARGET_OS_OSX #import #else @@ -12,6 +16,18 @@ #error File requires ARC to be enabled. #endif +/// The type of operation that generated the action code from calling +/// [TaskState]. +@implementation PigeonStorageTaskStateBox +- (instancetype)initWithValue:(PigeonStorageTaskState)value { + self = [super init]; + if (self) { + _value = value; + } + return self; +} +@end + static NSArray *wrapResult(id result, FlutterError *error) { if (error) { return @[ @@ -314,7 +330,8 @@ void FirebaseStorageHostApiSetup(id binaryMessenger, NSObject *api) { { FlutterBasicMessageChannel *channel = [[FlutterBasicMessageChannel alloc] - initWithName:@"dev.flutter.pigeon.FirebaseStorageHostApi.getReferencebyPath" + initWithName:@"dev.flutter.pigeon.firebase_storage_platform_interface." + @"FirebaseStorageHostApi.getReferencebyPath" binaryMessenger:binaryMessenger codec:FirebaseStorageHostApiGetCodec()]; if (api) { @@ -341,7 +358,8 @@ void FirebaseStorageHostApiSetup(id binaryMessenger, } { FlutterBasicMessageChannel *channel = [[FlutterBasicMessageChannel alloc] - initWithName:@"dev.flutter.pigeon.FirebaseStorageHostApi.setMaxOperationRetryTime" + initWithName:@"dev.flutter.pigeon.firebase_storage_platform_interface." + @"FirebaseStorageHostApi.setMaxOperationRetryTime" binaryMessenger:binaryMessenger codec:FirebaseStorageHostApiGetCodec()]; if (api) { @@ -365,7 +383,8 @@ void FirebaseStorageHostApiSetup(id binaryMessenger, } { FlutterBasicMessageChannel *channel = [[FlutterBasicMessageChannel alloc] - initWithName:@"dev.flutter.pigeon.FirebaseStorageHostApi.setMaxUploadRetryTime" + initWithName:@"dev.flutter.pigeon.firebase_storage_platform_interface." + @"FirebaseStorageHostApi.setMaxUploadRetryTime" binaryMessenger:binaryMessenger codec:FirebaseStorageHostApiGetCodec()]; if (api) { @@ -389,7 +408,8 @@ void FirebaseStorageHostApiSetup(id binaryMessenger, } { FlutterBasicMessageChannel *channel = [[FlutterBasicMessageChannel alloc] - initWithName:@"dev.flutter.pigeon.FirebaseStorageHostApi.setMaxDownloadRetryTime" + initWithName:@"dev.flutter.pigeon.firebase_storage_platform_interface." + @"FirebaseStorageHostApi.setMaxDownloadRetryTime" binaryMessenger:binaryMessenger codec:FirebaseStorageHostApiGetCodec()]; if (api) { @@ -413,7 +433,8 @@ void FirebaseStorageHostApiSetup(id binaryMessenger, } { FlutterBasicMessageChannel *channel = [[FlutterBasicMessageChannel alloc] - initWithName:@"dev.flutter.pigeon.FirebaseStorageHostApi.useStorageEmulator" + initWithName:@"dev.flutter.pigeon.firebase_storage_platform_interface." + @"FirebaseStorageHostApi.useStorageEmulator" binaryMessenger:binaryMessenger codec:FirebaseStorageHostApiGetCodec()]; if (api) { @@ -439,7 +460,8 @@ void FirebaseStorageHostApiSetup(id binaryMessenger, } { FlutterBasicMessageChannel *channel = [[FlutterBasicMessageChannel alloc] - initWithName:@"dev.flutter.pigeon.FirebaseStorageHostApi.referenceDelete" + initWithName:@"dev.flutter.pigeon.firebase_storage_platform_interface." + @"FirebaseStorageHostApi.referenceDelete" binaryMessenger:binaryMessenger codec:FirebaseStorageHostApiGetCodec()]; if (api) { @@ -463,7 +485,8 @@ void FirebaseStorageHostApiSetup(id binaryMessenger, } { FlutterBasicMessageChannel *channel = [[FlutterBasicMessageChannel alloc] - initWithName:@"dev.flutter.pigeon.FirebaseStorageHostApi.referenceGetDownloadURL" + initWithName:@"dev.flutter.pigeon.firebase_storage_platform_interface." + @"FirebaseStorageHostApi.referenceGetDownloadURL" binaryMessenger:binaryMessenger codec:FirebaseStorageHostApiGetCodec()]; if (api) { @@ -489,7 +512,8 @@ void FirebaseStorageHostApiSetup(id binaryMessenger, } { FlutterBasicMessageChannel *channel = [[FlutterBasicMessageChannel alloc] - initWithName:@"dev.flutter.pigeon.FirebaseStorageHostApi.referenceGetMetaData" + initWithName:@"dev.flutter.pigeon.firebase_storage_platform_interface." + @"FirebaseStorageHostApi.referenceGetMetaData" binaryMessenger:binaryMessenger codec:FirebaseStorageHostApiGetCodec()]; if (api) { @@ -514,7 +538,8 @@ void FirebaseStorageHostApiSetup(id binaryMessenger, } { FlutterBasicMessageChannel *channel = [[FlutterBasicMessageChannel alloc] - initWithName:@"dev.flutter.pigeon.FirebaseStorageHostApi.referenceList" + initWithName:@"dev.flutter.pigeon.firebase_storage_platform_interface." + @"FirebaseStorageHostApi.referenceList" binaryMessenger:binaryMessenger codec:FirebaseStorageHostApiGetCodec()]; if (api) { @@ -540,7 +565,8 @@ void FirebaseStorageHostApiSetup(id binaryMessenger, } { FlutterBasicMessageChannel *channel = [[FlutterBasicMessageChannel alloc] - initWithName:@"dev.flutter.pigeon.FirebaseStorageHostApi.referenceListAll" + initWithName:@"dev.flutter.pigeon.firebase_storage_platform_interface." + @"FirebaseStorageHostApi.referenceListAll" binaryMessenger:binaryMessenger codec:FirebaseStorageHostApiGetCodec()]; if (api) { @@ -565,7 +591,8 @@ void FirebaseStorageHostApiSetup(id binaryMessenger, } { FlutterBasicMessageChannel *channel = [[FlutterBasicMessageChannel alloc] - initWithName:@"dev.flutter.pigeon.FirebaseStorageHostApi.referenceGetData" + initWithName:@"dev.flutter.pigeon.firebase_storage_platform_interface." + @"FirebaseStorageHostApi.referenceGetData" binaryMessenger:binaryMessenger codec:FirebaseStorageHostApiGetCodec()]; if (api) { @@ -593,7 +620,8 @@ void FirebaseStorageHostApiSetup(id binaryMessenger, } { FlutterBasicMessageChannel *channel = [[FlutterBasicMessageChannel alloc] - initWithName:@"dev.flutter.pigeon.FirebaseStorageHostApi.referencePutData" + initWithName:@"dev.flutter.pigeon.firebase_storage_platform_interface." + @"FirebaseStorageHostApi.referencePutData" binaryMessenger:binaryMessenger codec:FirebaseStorageHostApiGetCodec()]; if (api) { @@ -625,7 +653,8 @@ void FirebaseStorageHostApiSetup(id binaryMessenger, } { FlutterBasicMessageChannel *channel = [[FlutterBasicMessageChannel alloc] - initWithName:@"dev.flutter.pigeon.FirebaseStorageHostApi.referencePutString" + initWithName:@"dev.flutter.pigeon.firebase_storage_platform_interface." + @"FirebaseStorageHostApi.referencePutString" binaryMessenger:binaryMessenger codec:FirebaseStorageHostApiGetCodec()]; if (api) { @@ -660,7 +689,8 @@ void FirebaseStorageHostApiSetup(id binaryMessenger, } { FlutterBasicMessageChannel *channel = [[FlutterBasicMessageChannel alloc] - initWithName:@"dev.flutter.pigeon.FirebaseStorageHostApi.referencePutFile" + initWithName:@"dev.flutter.pigeon.firebase_storage_platform_interface." + @"FirebaseStorageHostApi.referencePutFile" binaryMessenger:binaryMessenger codec:FirebaseStorageHostApiGetCodec()]; if (api) { @@ -692,7 +722,8 @@ void FirebaseStorageHostApiSetup(id binaryMessenger, } { FlutterBasicMessageChannel *channel = [[FlutterBasicMessageChannel alloc] - initWithName:@"dev.flutter.pigeon.FirebaseStorageHostApi.referenceDownloadFile" + initWithName:@"dev.flutter.pigeon.firebase_storage_platform_interface." + @"FirebaseStorageHostApi.referenceDownloadFile" binaryMessenger:binaryMessenger codec:FirebaseStorageHostApiGetCodec()]; if (api) { @@ -721,7 +752,8 @@ void FirebaseStorageHostApiSetup(id binaryMessenger, } { FlutterBasicMessageChannel *channel = [[FlutterBasicMessageChannel alloc] - initWithName:@"dev.flutter.pigeon.FirebaseStorageHostApi.referenceUpdateMetadata" + initWithName:@"dev.flutter.pigeon.firebase_storage_platform_interface." + @"FirebaseStorageHostApi.referenceUpdateMetadata" binaryMessenger:binaryMessenger codec:FirebaseStorageHostApiGetCodec()]; if (api) { @@ -749,7 +781,8 @@ void FirebaseStorageHostApiSetup(id binaryMessenger, } { FlutterBasicMessageChannel *channel = [[FlutterBasicMessageChannel alloc] - initWithName:@"dev.flutter.pigeon.FirebaseStorageHostApi.taskPause" + initWithName:@"dev.flutter.pigeon.firebase_storage_platform_interface." + @"FirebaseStorageHostApi.taskPause" binaryMessenger:binaryMessenger codec:FirebaseStorageHostApiGetCodec()]; if (api) { @@ -774,7 +807,8 @@ void FirebaseStorageHostApiSetup(id binaryMessenger, } { FlutterBasicMessageChannel *channel = [[FlutterBasicMessageChannel alloc] - initWithName:@"dev.flutter.pigeon.FirebaseStorageHostApi.taskResume" + initWithName:@"dev.flutter.pigeon.firebase_storage_platform_interface." + @"FirebaseStorageHostApi.taskResume" binaryMessenger:binaryMessenger codec:FirebaseStorageHostApiGetCodec()]; if (api) { @@ -799,7 +833,8 @@ void FirebaseStorageHostApiSetup(id binaryMessenger, } { FlutterBasicMessageChannel *channel = [[FlutterBasicMessageChannel alloc] - initWithName:@"dev.flutter.pigeon.FirebaseStorageHostApi.taskCancel" + initWithName:@"dev.flutter.pigeon.firebase_storage_platform_interface." + @"FirebaseStorageHostApi.taskCancel" binaryMessenger:binaryMessenger codec:FirebaseStorageHostApiGetCodec()]; if (api) { diff --git a/packages/firebase_storage/firebase_storage/pubspec.yaml b/packages/firebase_storage/firebase_storage/pubspec.yaml index a7a3f168e70f..66e65c7472de 100755 --- a/packages/firebase_storage/firebase_storage/pubspec.yaml +++ b/packages/firebase_storage/firebase_storage/pubspec.yaml @@ -39,3 +39,5 @@ flutter: pluginClass: FLTFirebaseStoragePlugin web: default_package: firebase_storage_web + windows: + pluginClass: FirebaseStoragePluginCApi diff --git a/packages/firebase_storage/firebase_storage/windows/CMakeLists.txt b/packages/firebase_storage/firebase_storage/windows/CMakeLists.txt new file mode 100644 index 000000000000..9077990143f8 --- /dev/null +++ b/packages/firebase_storage/firebase_storage/windows/CMakeLists.txt @@ -0,0 +1,62 @@ +# The Flutter tooling requires that developers have a version of Visual Studio +# installed that includes CMake 3.14 or later. 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.14) + + +# Project-level configuration. +set(PROJECT_NAME "flutterfire_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 + "firebase_storage_plugin.cpp" + "firebase_storage_plugin.h" + "messages.g.cpp" + "messages.g.h" +) + +# Define the plugin library target. Its name must not be changed (see comment +# on PLUGIN_NAME above). +add_library(${PLUGIN_NAME} STATIC + "include/firebase_storage/firebase_storage_plugin_c_api.h" + "firebase_storage_plugin_c_api.cpp" + ${PLUGIN_SOURCES} +) + + +# 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) +target_compile_definitions(${PLUGIN_NAME} PUBLIC FLUTTER_PLUGIN_IMPL) + +# Source include directories and library dependencies. Add any plugin-specific +# dependencies here. +set(MSVC_RUNTIME_MODE MD) +set(firebase_libs firebase_core_plugin firebase_storage) +#set(ADDITIONAL_LIBS advapi32 ws2_32 crypt32 rpcrt4 ole32) +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 flutter_wrapper_plugin) + +# 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/windows/firebase_storage_plugin.cpp b/packages/firebase_storage/firebase_storage/windows/firebase_storage_plugin.cpp new file mode 100644 index 000000000000..ce4236bfe584 --- /dev/null +++ b/packages/firebase_storage/firebase_storage/windows/firebase_storage_plugin.cpp @@ -0,0 +1,810 @@ +// 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. +#define _CRT_SECURE_NO_WARNINGS +#include "firebase_storage_plugin.h" + +// This must be included before many other Windows headers. +#include + +#include "firebase/app.h" +#include "firebase/future.h" +#include "firebase/log.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_core/firebase_core_plugin_c_api.h" +#include "messages.g.h" + +// For getPlatformVersion; remove unless needed for your plugin implementation. +#include +#include +#include +#include +#include +#include + +// #include +#include +#include +#include +#include +#include +#include +// #include +#include +#include +using ::firebase::App; +using ::firebase::Future; +using ::firebase::storage::Controller; +using ::firebase::storage::Listener; +using ::firebase::storage::Metadata; +using ::firebase::storage::Storage; +using ::firebase::storage::StorageReference; + +using flutter::EncodableValue; + +namespace firebase_storage_windows { + +static std::string kStorageMethodChannelName = + "plugins.flutter.io/firebase_storage"; +static std::string kStorageTaskEventName = "taskEvent"; +// static +void FirebaseStoragePlugin::RegisterWithRegistrar( + flutter::PluginRegistrarWindows* registrar) { + auto plugin = std::make_unique(); + messenger_ = registrar->messenger(); + FirebaseStorageHostApi::SetUp(registrar->messenger(), plugin.get()); + registrar->AddPlugin(std::move(plugin)); + firebase::SetLogLevel(firebase::kLogLevelVerbose); +} + +FirebaseStoragePlugin::FirebaseStoragePlugin() {} + +FirebaseStoragePlugin::~FirebaseStoragePlugin() = default; + +Storage* GetCPPStorageFromPigeon(const PigeonStorageFirebaseApp& pigeonApp, + const std::string& bucket_path) { + std::string default_url = std::string("gs://") + bucket_path; + App* app = App::GetInstance(pigeonApp.app_name().c_str()); + Storage* cpp_storage = Storage::GetInstance(app, default_url.c_str()); + + return cpp_storage; +} + +StorageReference GetCPPStorageReferenceFromPigeon( + const PigeonStorageFirebaseApp& pigeonApp, + const PigeonStorageReference& pigeonReference) { + Storage* cpp_storage = + GetCPPStorageFromPigeon(pigeonApp, pigeonReference.bucket()); + return cpp_storage->GetReference(pigeonReference.full_path()); +} + +flutter::BinaryMessenger* + firebase_storage_windows::FirebaseStoragePlugin::messenger_ = nullptr; +std::map>> + event_channels_; +std::map>> + stream_handlers_; + +std::string RegisterEventChannelWithUUID( + std::string prefix, std::string uuid, + std::unique_ptr> handler) { + std::string channelName = prefix + "/" + uuid; + + event_channels_[channelName] = + std::make_unique>( + FirebaseStoragePlugin::messenger_, channelName, + &flutter::StandardMethodCodec::GetInstance()); + stream_handlers_[channelName] = std::move(handler); + + event_channels_[channelName]->SetStreamHandler( + std::move(stream_handlers_[channelName])); + + return uuid; +} + +std::string RegisterEventChannel( + std::string prefix, + std::unique_ptr> handler) { + UUID uuid; + UuidCreate(&uuid); + char* str; + UuidToStringA(&uuid, (RPC_CSTR*)&str); + + std::string channelName = prefix + "/" + str; + + event_channels_[channelName] = + std::make_unique>( + FirebaseStoragePlugin::messenger_, channelName, + &flutter::StandardMethodCodec::GetInstance()); + stream_handlers_[channelName] = std::move(handler); + + event_channels_[channelName]->SetStreamHandler( + std::move(stream_handlers_[channelName])); + + return str; +} + +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"; + } +} + +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"; + } +} + +FlutterError FirebaseStoragePlugin::ParseError( + const firebase::FutureBase& completed_future) { + const Error errorCode = static_cast(completed_future.error()); + + return FlutterError(FirebaseStoragePlugin::GetStorageErrorCode(errorCode), + FirebaseStoragePlugin::GetStorageErrorMessage(errorCode)); +} + +void FirebaseStoragePlugin::GetReferencebyPath( + const PigeonStorageFirebaseApp& app, const std::string& path, + const std::string* bucket, + std::function reply)> result) { + Storage* cpp_storage = GetCPPStorageFromPigeon(app, *bucket); + StorageReference cpp_reference = cpp_storage->GetReference(path); + PigeonStorageReference* value_ptr = new PigeonStorageReference( + cpp_reference.bucket(), cpp_reference.full_path(), cpp_reference.name()); + result(*value_ptr); +} + +void FirebaseStoragePlugin::SetMaxOperationRetryTime( + const PigeonStorageFirebaseApp& app, int64_t time, + std::function reply)> result) { + Storage* cpp_storage = GetCPPStorageFromPigeon(app, ""); + cpp_storage->set_max_operation_retry_time((double)time); +} + +void FirebaseStoragePlugin::SetMaxUploadRetryTime( + const PigeonStorageFirebaseApp& app, int64_t time, + std::function reply)> result) { + Storage* cpp_storage = GetCPPStorageFromPigeon(app, ""); + cpp_storage->set_max_upload_retry_time((double)time); +} + +void FirebaseStoragePlugin::SetMaxDownloadRetryTime( + const PigeonStorageFirebaseApp& app, int64_t time, + std::function reply)> result) { + Storage* cpp_storage = GetCPPStorageFromPigeon(app, ""); + cpp_storage->set_max_download_retry_time((double)time); +} + +void FirebaseStoragePlugin::UseStorageEmulator( + const PigeonStorageFirebaseApp& app, const std::string& host, int64_t port, + std::function reply)> result) { + // C++ doesn't support emulator on desktop for now. Do nothing. +} + +void FirebaseStoragePlugin::ReferenceDelete( + const PigeonStorageFirebaseApp& app, + const PigeonStorageReference& reference, + std::function reply)> result) { + StorageReference cpp_reference = + GetCPPStorageReferenceFromPigeon(app, reference); + Future future_result = cpp_reference.Delete(); + ::Sleep(1); // timing for c++ sdk grabbing a mutex + future_result.OnCompletion([result](const Future& void_result) { + if (void_result.error() == firebase::storage::kErrorNone) { + result(std::nullopt); + } else { + result(FirebaseStoragePlugin::ParseError(void_result)); + } + }); +} +void FirebaseStoragePlugin::ReferenceGetDownloadURL( + const PigeonStorageFirebaseApp& app, + const PigeonStorageReference& reference, + std::function reply)> result) { + StorageReference cpp_reference = + GetCPPStorageReferenceFromPigeon(app, reference); + Future future_result = cpp_reference.GetDownloadUrl(); + ::Sleep(1); // timing for c++ sdk grabbing a mutex + future_result.OnCompletion( + [result](const Future& string_result) { + if (string_result.error() == firebase::storage::kErrorNone) { + result(*string_result.result()); + } else { + result(FirebaseStoragePlugin::ParseError(string_result)); + } + }); +} + +std::string kCacheControlName = "cacheControl"; +std::string kContentDispositionName = "contentDisposition"; +std::string kContentEncodingName = "contentEncoding"; +std::string kContentLanguageName = "contentLanguage"; +std::string kContentTypeName = "contentType"; +std::string kCustomMetadataName = "metadata"; +std::string kSizeName = "size"; + +flutter::EncodableMap ConvertMedadataToPigeon(const Metadata* meta) { + flutter::EncodableMap meta_map = flutter::EncodableMap(); + if (meta->cache_control() != nullptr) { + meta_map[flutter::EncodableValue(kCacheControlName)] = + flutter::EncodableValue(meta->cache_control()); + } + if (meta->content_disposition() != nullptr) { + meta_map[flutter::EncodableValue(kContentDispositionName)] = + flutter::EncodableValue(meta->content_disposition()); + } + if (meta->content_encoding() != nullptr) { + meta_map[flutter::EncodableValue(kContentEncodingName)] = + flutter::EncodableValue(meta->content_encoding()); + } + if (meta->content_language() != nullptr) { + meta_map[flutter::EncodableValue(kContentLanguageName)] = + flutter::EncodableValue(meta->content_language()); + } + if (meta->content_type() != nullptr) { + meta_map[flutter::EncodableValue(kContentTypeName)] = + flutter::EncodableValue(meta->content_type()); + } + meta_map[flutter::EncodableValue(kSizeName)] = + flutter::EncodableValue(meta->size_bytes()); + if (meta->custom_metadata() != nullptr) { + flutter::EncodableMap custom_meta_map = flutter::EncodableMap(); + for (const auto& kv : *meta->custom_metadata()) { + custom_meta_map[flutter::EncodableValue(kv.first)] = + flutter::EncodableValue(kv.second); + } + meta_map[flutter::EncodableValue(kCustomMetadataName)] = custom_meta_map; + } + return meta_map; +} + +void GetMetadataFromPigeon(PigeonSettableMetadata pigeonMetadata, + Metadata* out_metadata) { + if (pigeonMetadata.cache_control() != nullptr) { + out_metadata->set_cache_control(pigeonMetadata.cache_control()->c_str()); + } + if (pigeonMetadata.content_disposition() != nullptr) { + out_metadata->set_content_disposition( + pigeonMetadata.content_disposition()->c_str()); + } + if (pigeonMetadata.content_encoding() != nullptr) { + out_metadata->set_content_encoding( + pigeonMetadata.content_encoding()->c_str()); + } + if (pigeonMetadata.content_language() != nullptr) { + out_metadata->set_content_language( + pigeonMetadata.content_language()->c_str()); + } + if (pigeonMetadata.content_type() != nullptr) { + out_metadata->set_content_type(pigeonMetadata.content_type()->c_str()); + } + if (pigeonMetadata.custom_metadata() != nullptr) { + for (const auto& kv : *pigeonMetadata.custom_metadata()) { + const std::string* key_name = std::get_if(&kv.first); + const std::string* value = std::get_if(&kv.second); + (*out_metadata->custom_metadata())[*key_name] = *value; + } + } +} + +void FirebaseStoragePlugin::ReferenceGetMetaData( + const PigeonStorageFirebaseApp& app, + const PigeonStorageReference& reference, + std::function reply)> result) { + StorageReference cpp_reference = + GetCPPStorageReferenceFromPigeon(app, reference); + Future future_result = cpp_reference.GetMetadata(); + ::Sleep(1); // timing for c++ sdk grabbing a mutex + future_result.OnCompletion([result](const Future& metadata_result) { + if (metadata_result.error() == firebase::storage::kErrorNone) { + PigeonFullMetaData pigeon_meta = PigeonFullMetaData(); + pigeon_meta.set_metadata( + ConvertMedadataToPigeon(metadata_result.result())); + + result(pigeon_meta); + } else { + result(FirebaseStoragePlugin::ParseError(metadata_result)); + } + }); +} + +void FirebaseStoragePlugin::ReferenceList( + const PigeonStorageFirebaseApp& app, + const PigeonStorageReference& reference, const PigeonListOptions& options, + std::function reply)> result) { + // C++ doesn't support list yet + flutter::EncodableList items = flutter::EncodableList(); + flutter::EncodableList prefixs = flutter::EncodableList(); + PigeonListResult pigeon_result = PigeonListResult(items, prefixs); + result(pigeon_result); +} + +void FirebaseStoragePlugin::ReferenceListAll( + const PigeonStorageFirebaseApp& app, + const PigeonStorageReference& reference, + std::function reply)> result) { + // C++ doesn't support listAll yet + flutter::EncodableList items = flutter::EncodableList(); + flutter::EncodableList prefixs = flutter::EncodableList(); + PigeonListResult pigeon_result = PigeonListResult(items, prefixs); + result(pigeon_result); +} + +void FirebaseStoragePlugin::ReferenceGetData( + const PigeonStorageFirebaseApp& app, + const PigeonStorageReference& reference, int64_t max_size, + std::function>> reply)> + result) { + StorageReference cpp_reference = + GetCPPStorageReferenceFromPigeon(app, reference); + const size_t kMaxAllowedSize = 1 * 1024 * 1024; + uint8_t byte_buffer[kMaxAllowedSize]; + + Future future_result = cpp_reference.GetBytes(byte_buffer, max_size); + ::Sleep(1); // timing for c++ sdk grabbing a mutex + future_result.OnCompletion( + [result, byte_buffer](const Future& data_result) { + if (data_result.error() == firebase::storage::kErrorNone) { + size_t vector_size = *data_result.result(); + std::optional> vector_buffer; + vector_buffer = + std::vector(byte_buffer, byte_buffer + vector_size); + result(vector_buffer); + } else { + result(FirebaseStoragePlugin::ParseError(data_result)); + } + }); +} + +std::string kTaskStateName = "taskState"; +std::string kTaskAppName = "appName"; +std::string kTaskSnapshotName = "snapshot"; +std::string kTaskSnapshotPath = "path"; +std::string kTaskSnapshotBytesTransferred = "bytesTransferred"; +std::string kTaskSnapshotTotalBytes = "totalBytes"; + +class TaskStateListener : public Listener { + public: + TaskStateListener(flutter::EventSink* events) { + events_ = events; + } + virtual void OnProgress(firebase::storage::Controller* controller) { + // A progress event occurred + // TODO error handling + + flutter::EncodableMap event = flutter::EncodableMap(); + event[kTaskStateName] = static_cast(PigeonStorageTaskState::running); + event[kTaskAppName] = controller->GetReference().storage()->app()->name(); + flutter::EncodableMap snapshot = flutter::EncodableMap(); + snapshot[kTaskSnapshotPath] = controller->GetReference().full_path(); + snapshot[kTaskSnapshotTotalBytes] = controller->total_byte_count(); + snapshot[kTaskSnapshotBytesTransferred] = controller->bytes_transferred(); + event[kTaskSnapshotName] = snapshot; + + events_->Success(event); + } + + virtual void OnPaused(firebase::storage::Controller* controller) { + // A progress event occurred + // TODO error handling + flutter::EncodableMap event = flutter::EncodableMap(); + event[kTaskStateName] = static_cast(PigeonStorageTaskState::paused); + event[kTaskAppName] = controller->GetReference().storage()->app()->name(); + flutter::EncodableMap snapshot = flutter::EncodableMap(); + snapshot[kTaskSnapshotPath] = controller->GetReference().full_path(); + snapshot[kTaskSnapshotTotalBytes] = controller->total_byte_count(); + snapshot[kTaskSnapshotBytesTransferred] = controller->bytes_transferred(); + event[kTaskSnapshotName] = snapshot; + + events_->Success(event); + } + + flutter::EventSink* events_; +}; + +class PutDataStreamHandler + : public flutter::StreamHandler { + public: + PutDataStreamHandler(Storage* storage, std::string reference_path, + const void* data, size_t buffer_size, + Controller* controller) { + storage_ = storage; + reference_path_ = reference_path; + data_ = data; + buffer_size_ = buffer_size; + controller_ = controller; + } + + std::unique_ptr> + OnListenInternal( + const flutter::EncodableValue* arguments, + std::unique_ptr>&& events) + override { + events_ = std::move(events); + + TaskStateListener putStringListener = TaskStateListener(events_.get()); + StorageReference reference = storage_->GetReference(reference_path_); + Future future_result = reference.PutBytes( + data_, buffer_size_, &putStringListener, controller_); + ::Sleep(1); // timing for c++ sdk grabbing a mutex + + future_result.OnCompletion([this](const Future& data_result) { + if (data_result.error() == firebase::storage::kErrorNone) { + flutter::EncodableMap event = flutter::EncodableMap(); + event[kTaskStateName] = + static_cast(PigeonStorageTaskState::success); + event[kTaskAppName] = std::string(storage_->app()->name()); + flutter::EncodableMap snapshot = flutter::EncodableMap(); + snapshot[kTaskSnapshotPath] = data_result.result()->path(); + snapshot[kTaskSnapshotTotalBytes] = data_result.result()->size_bytes(); + snapshot[kTaskSnapshotBytesTransferred] = + data_result.result()->size_bytes(); + snapshot[kCustomMetadataName] = + ConvertMedadataToPigeon(data_result.result()); + event[kTaskSnapshotName] = snapshot; + + events_->Success(event); + } else { + const Error errorCode = static_cast(data_result.error()); + events_->Error( + FirebaseStoragePlugin::GetStorageErrorCode(errorCode), + FirebaseStoragePlugin::GetStorageErrorMessage(errorCode)); + } + }); + return nullptr; + } + + std::unique_ptr> + OnCancelInternal(const flutter::EncodableValue* arguments) override { + return nullptr; + } + + public: + Storage* storage_; + std::string reference_path_; + const void* data_; + size_t buffer_size_; + Controller* controller_; + std::unique_ptr>&& events_ = + nullptr; +}; + +class PutFileStreamHandler + : public flutter::StreamHandler { + public: + PutFileStreamHandler(Storage* storage, std::string reference_path, + std::string file_path, Controller* controller) { + storage_ = storage; + reference_path_ = reference_path; + file_path_ = file_path; + controller_ = controller; + } + + std::unique_ptr> + OnListenInternal( + const flutter::EncodableValue* arguments, + std::unique_ptr>&& events) + override { + events_ = std::move(events); + + TaskStateListener putFileListener = TaskStateListener(events_.get()); + StorageReference reference = storage_->GetReference(reference_path_); + Future future_result = + reference.PutFile(file_path_.c_str(), &putFileListener, controller_); + + ::Sleep(1); // timing for c++ sdk grabbing a mutex + future_result.OnCompletion([this](const Future& data_result) { + if (data_result.error() == firebase::storage::kErrorNone) { + flutter::EncodableMap event = flutter::EncodableMap(); + event[kTaskStateName] = + static_cast(PigeonStorageTaskState::success); + event[kTaskAppName] = std::string(storage_->app()->name()); + flutter::EncodableMap snapshot = flutter::EncodableMap(); + snapshot[kTaskSnapshotPath] = data_result.result()->path(); + snapshot[kTaskSnapshotTotalBytes] = data_result.result()->size_bytes(); + snapshot[kTaskSnapshotBytesTransferred] = + data_result.result()->size_bytes(); + snapshot[kCustomMetadataName] = + ConvertMedadataToPigeon(data_result.result()); + event[kTaskSnapshotName] = snapshot; + + events_->Success(event); + } else { + const Error errorCode = static_cast(data_result.error()); + events_->Error( + FirebaseStoragePlugin::GetStorageErrorCode(errorCode), + FirebaseStoragePlugin::GetStorageErrorMessage(errorCode)); + } + }); + return nullptr; + } + + std::unique_ptr> + OnCancelInternal(const flutter::EncodableValue* arguments) override { + return nullptr; + } + + public: + Storage* storage_; + std::string reference_path_; + std::string file_path_; + Controller* controller_; + std::unique_ptr>&& events_ = + nullptr; +}; + +class GetFileStreamHandler + : public flutter::StreamHandler { + public: + GetFileStreamHandler(Storage* storage, std::string reference_path, + std::string file_path, Controller* controller) { + storage_ = storage; + reference_path_ = reference_path; + file_path_ = file_path; + controller_ = controller; + } + + std::unique_ptr> + OnListenInternal( + const flutter::EncodableValue* arguments, + std::unique_ptr>&& events) + override { + events_ = std::move(events); + std::unique_lock lock(mtx_); + + TaskStateListener getFileListener = TaskStateListener(events_.get()); + StorageReference reference = storage_->GetReference(reference_path_); + Future future_result = + reference.GetFile(file_path_.c_str(), &getFileListener, controller_); + + ::Sleep(1); // timing for c++ sdk grabbing a mutex + future_result.OnCompletion([this](const Future& data_result) { + if (data_result.error() == firebase::storage::kErrorNone) { + flutter::EncodableMap event = flutter::EncodableMap(); + event[kTaskStateName] = + static_cast(PigeonStorageTaskState::success); + event[kTaskAppName] = std::string(storage_->app()->name()); + flutter::EncodableMap snapshot = flutter::EncodableMap(); + size_t data_size = *data_result.result(); + snapshot[kTaskSnapshotTotalBytes] = + flutter::EncodableValue(static_cast(data_size)); + snapshot[kTaskSnapshotBytesTransferred] = + flutter::EncodableValue(static_cast(data_size)); + event[kTaskSnapshotName] = snapshot; + + events_->Success(event); + } else { + const Error errorCode = static_cast(data_result.error()); + events_->Error( + FirebaseStoragePlugin::GetStorageErrorCode(errorCode), + FirebaseStoragePlugin::GetStorageErrorMessage(errorCode)); + } + }); + return nullptr; + } + + std::unique_ptr> + OnCancelInternal(const flutter::EncodableValue* arguments) override { + std::unique_lock lock(mtx_); + + return nullptr; + } + + public: + Storage* storage_; + std::string reference_path_; + std::string file_path_; + Controller* controller_; + std::mutex mtx_; + std::unique_ptr>&& events_ = + nullptr; +}; + +void FirebaseStoragePlugin::ReferencePutData( + const PigeonStorageFirebaseApp& pigeon_app, + const PigeonStorageReference& pigeon_reference, + const std::vector& data, + const PigeonSettableMetadata& pigeon_meta_data, int64_t handle, + std::function reply)> result) { + Storage* cpp_storage = + GetCPPStorageFromPigeon(pigeon_app, pigeon_reference.bucket()); + controllers_[handle] = std::make_unique(); + + auto handler = std::make_unique( + cpp_storage, pigeon_reference.full_path(), &data, sizeof(data), + controllers_[handle].get()); + + std::string channelName = RegisterEventChannel( + kStorageMethodChannelName + "/" + kStorageTaskEventName, + std::move(handler)); + + result(channelName); +} + +void FirebaseStoragePlugin::ReferencePutString( + const PigeonStorageFirebaseApp& pigeon_app, + const PigeonStorageReference& pigeon_reference, const std::string& data, + int64_t format, const PigeonSettableMetadata& settable_meta_data, + int64_t handle, std::function reply)> result) { + Storage* cpp_storage = + GetCPPStorageFromPigeon(pigeon_app, pigeon_reference.bucket()); + controllers_[handle] = std::make_unique(); + + auto handler = std::make_unique( + cpp_storage, pigeon_reference.full_path(), &data, data.size(), + controllers_[handle].get()); + + std::string channelName = RegisterEventChannel( + kStorageMethodChannelName + "/" + kStorageTaskEventName, + std::move(handler)); + + result(channelName); +} + +void FirebaseStoragePlugin::ReferencePutFile( + const PigeonStorageFirebaseApp& pigeon_app, + const PigeonStorageReference& pigeon_reference, + const std::string& file_path, + const PigeonSettableMetadata& settable_meta_data, int64_t handle, + std::function reply)> result) { + Storage* cpp_storage = + GetCPPStorageFromPigeon(pigeon_app, pigeon_reference.bucket()); + controllers_[handle] = std::make_unique(); + + auto handler = std::make_unique( + cpp_storage, pigeon_reference.full_path(), std::move(file_path), + controllers_[handle].get()); + + std::string channelName = RegisterEventChannel( + kStorageMethodChannelName + "/" + kStorageTaskEventName, + std::move(handler)); + + result(channelName); +} + +void FirebaseStoragePlugin::ReferenceDownloadFile( + const PigeonStorageFirebaseApp& pigeon_app, + const PigeonStorageReference& pigeon_reference, + const std::string& file_path, int64_t handle, + std::function reply)> result) { + Storage* cpp_storage = + GetCPPStorageFromPigeon(pigeon_app, pigeon_reference.bucket()); + controllers_[handle] = std::make_unique(); + + auto handler = std::make_unique( + cpp_storage, pigeon_reference.full_path(), std::move(file_path), + controllers_[handle].get()); + + std::string channelName = RegisterEventChannel( + kStorageMethodChannelName + "/" + kStorageTaskEventName, + std::move(handler)); + + result(channelName); +} + +void FirebaseStoragePlugin::ReferenceUpdateMetadata( + const PigeonStorageFirebaseApp& app, + const PigeonStorageReference& reference, + const PigeonSettableMetadata& metadata, + std::function reply)> result) { + StorageReference cpp_reference = + GetCPPStorageReferenceFromPigeon(app, reference); + Metadata cpp_meta; + GetMetadataFromPigeon(metadata, &cpp_meta); + + Future future_result = cpp_reference.UpdateMetadata(cpp_meta); + ::Sleep(1); // timing for c++ sdk grabbing a mutex + future_result.OnCompletion([result](const Future& data_result) { + if (data_result.error() == firebase::storage::kErrorNone) { + const Metadata* result_meta = data_result.result(); + PigeonFullMetaData pigeonData; + pigeonData.set_metadata(ConvertMedadataToPigeon(result_meta)); + + result(pigeonData); + } else { + result(FirebaseStoragePlugin::ParseError(data_result)); + } + }); +} + +void FirebaseStoragePlugin::TaskPause( + const PigeonStorageFirebaseApp& app, int64_t handle, + std::function reply)> result) { + bool status = controllers_[handle]->Pause(); + flutter::EncodableMap task_result = flutter::EncodableMap(); + flutter::EncodableMap task_data = flutter::EncodableMap(); + task_result["status"] = status; + task_data["bytesTransferred"] = controllers_[handle]->bytes_transferred(); + task_data["totalBytes"] = controllers_[handle]->total_byte_count(); + task_result["snapshot"] = task_data; + result(task_result); +} + +void FirebaseStoragePlugin::TaskResume( + const PigeonStorageFirebaseApp& app, int64_t handle, + std::function reply)> result) { + bool status = controllers_[handle]->Resume(); + flutter::EncodableMap task_result = flutter::EncodableMap(); + flutter::EncodableMap task_data = flutter::EncodableMap(); + task_result["status"] = status; + task_data["bytesTransferred"] = controllers_[handle]->bytes_transferred(); + task_data["totalBytes"] = controllers_[handle]->total_byte_count(); + task_result["snapshot"] = task_data; + result(task_result); +} + +void FirebaseStoragePlugin::TaskCancel( + const PigeonStorageFirebaseApp& app, int64_t handle, + std::function reply)> result) { + bool status = controllers_[handle]->Cancel(); + flutter::EncodableMap task_result = flutter::EncodableMap(); + flutter::EncodableMap task_data = flutter::EncodableMap(); + task_result["status"] = status; + task_data["bytesTransferred"] = controllers_[handle]->bytes_transferred(); + task_data["totalBytes"] = controllers_[handle]->total_byte_count(); + task_result["snapshot"] = task_data; + result(task_result); +} + +} // namespace firebase_storage_windows diff --git a/packages/firebase_storage/firebase_storage/windows/firebase_storage_plugin.h b/packages/firebase_storage/firebase_storage/windows/firebase_storage_plugin.h new file mode 100644 index 000000000000..d202b6c24a97 --- /dev/null +++ b/packages/firebase_storage/firebase_storage/windows/firebase_storage_plugin.h @@ -0,0 +1,141 @@ +/* + * 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. + */ + +#ifndef FLUTTER_PLUGIN_FIREBASE_STORAGE_PLUGIN_H_ +#define FLUTTER_PLUGIN_FIREBASE_STORAGE_PLUGIN_H_ + +#include +#include +#include + +#include + +#include "firebase/storage/common.h" +#include "firebase/storage/controller.h" +#include "messages.g.h" + +using firebase::storage::Error; + +namespace firebase_storage_windows { + +class FirebaseStoragePlugin : public flutter::Plugin, + public FirebaseStorageHostApi { + public: + static void RegisterWithRegistrar(flutter::PluginRegistrarWindows* registrar); + + FirebaseStoragePlugin(); + + virtual ~FirebaseStoragePlugin(); + + // Disallow copy and assign. + FirebaseStoragePlugin(const FirebaseStoragePlugin&) = delete; + FirebaseStoragePlugin& operator=(const FirebaseStoragePlugin&) = delete; + + // Parser functions + static std::string GetStorageErrorCode(Error cppError); + static std::string GetStorageErrorMessage(Error cppError); + static FlutterError ParseError(const firebase::FutureBase& future); + + // FirebaseStorageHostApi + virtual void GetReferencebyPath( + const PigeonStorageFirebaseApp& app, const std::string& path, + const std::string* bucket, + std::function reply)> result) + override; + virtual void SetMaxOperationRetryTime( + const PigeonStorageFirebaseApp& app, int64_t time, + std::function reply)> result) override; + virtual void SetMaxUploadRetryTime( + const PigeonStorageFirebaseApp& app, int64_t time, + std::function reply)> result) override; + virtual void SetMaxDownloadRetryTime( + const PigeonStorageFirebaseApp& app, int64_t time, + std::function reply)> result) override; + virtual void UseStorageEmulator( + const PigeonStorageFirebaseApp& app, const std::string& host, + int64_t port, + std::function reply)> result) override; + virtual void ReferenceDelete( + const PigeonStorageFirebaseApp& app, + const PigeonStorageReference& reference, + std::function reply)> result) override; + virtual void ReferenceGetDownloadURL( + const PigeonStorageFirebaseApp& app, + const PigeonStorageReference& reference, + std::function reply)> result) override; + virtual void ReferenceGetMetaData( + const PigeonStorageFirebaseApp& app, + const PigeonStorageReference& reference, + std::function reply)> result) override; + virtual void ReferenceList( + const PigeonStorageFirebaseApp& app, + const PigeonStorageReference& reference, const PigeonListOptions& options, + std::function reply)> result) override; + virtual void ReferenceListAll( + const PigeonStorageFirebaseApp& app, + const PigeonStorageReference& reference, + std::function reply)> result) override; + virtual void ReferenceGetData( + const PigeonStorageFirebaseApp& app, + const PigeonStorageReference& reference, int64_t max_size, + std::function>> reply)> + result) override; + virtual void ReferencePutData( + const PigeonStorageFirebaseApp& app, + const PigeonStorageReference& reference, const std::vector& data, + const PigeonSettableMetadata& settable_meta_data, int64_t handle, + std::function reply)> result) override; + virtual void ReferencePutString( + const PigeonStorageFirebaseApp& app, + const PigeonStorageReference& reference, const std::string& data, + int64_t format, const PigeonSettableMetadata& settable_meta_data, + int64_t handle, + std::function reply)> result) override; + virtual void ReferencePutFile( + const PigeonStorageFirebaseApp& app, + const PigeonStorageReference& reference, const std::string& file_path, + const PigeonSettableMetadata& settable_meta_data, int64_t handle, + std::function reply)> result) override; + virtual void ReferenceDownloadFile( + const PigeonStorageFirebaseApp& app, + const PigeonStorageReference& reference, const std::string& file_path, + int64_t handle, + std::function reply)> result) override; + virtual void ReferenceUpdateMetadata( + const PigeonStorageFirebaseApp& app, + const PigeonStorageReference& reference, + const PigeonSettableMetadata& metadata, + std::function reply)> result) override; + virtual void TaskPause( + const PigeonStorageFirebaseApp& app, int64_t handle, + std::function reply)> result) + override; + virtual void TaskResume( + const PigeonStorageFirebaseApp& app, int64_t handle, + std::function reply)> result) + override; + virtual void TaskCancel( + const PigeonStorageFirebaseApp& app, int64_t handle, + std::function reply)> result) + override; + + static flutter::BinaryMessenger* messenger_; + static std::map< + std::string, + std::unique_ptr>> + event_channels_; + static std::map>> + stream_handlers_; + + private: + bool storageInitialized = false; + std::map> + controllers_; +}; + +} // namespace firebase_storage_windows + +#endif /* FLUTTER_PLUGIN_FIREBASE_STORAGE_PLUGIN_H_ */ diff --git a/packages/firebase_storage/firebase_storage/windows/firebase_storage_plugin_c_api.cpp b/packages/firebase_storage/firebase_storage/windows/firebase_storage_plugin_c_api.cpp new file mode 100644 index 000000000000..efaa6fc4584e --- /dev/null +++ b/packages/firebase_storage/firebase_storage/windows/firebase_storage_plugin_c_api.cpp @@ -0,0 +1,16 @@ +// 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. + +#include "include/firebase_storage/firebase_storage_plugin_c_api.h" + +#include + +#include "firebase_storage_plugin.h" + +void FirebaseStoragePluginCApiRegisterWithRegistrar( + FlutterDesktopPluginRegistrarRef registrar) { + firebase_storage_windows::FirebaseStoragePlugin::RegisterWithRegistrar( + flutter::PluginRegistrarManager::GetInstance() + ->GetRegistrar(registrar)); +} diff --git a/packages/firebase_storage/firebase_storage/windows/include/firebase_storage/firebase_storage_plugin_c_api.h b/packages/firebase_storage/firebase_storage/windows/include/firebase_storage/firebase_storage_plugin_c_api.h new file mode 100644 index 000000000000..a82389c0a4bd --- /dev/null +++ b/packages/firebase_storage/firebase_storage/windows/include/firebase_storage/firebase_storage_plugin_c_api.h @@ -0,0 +1,29 @@ +/* + * 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. + */ + +#ifndef FLUTTER_PLUGIN_FIREBASE_STORAGE_PLUGIN_C_API_H_ +#define FLUTTER_PLUGIN_FIREBASE_STORAGE_PLUGIN_C_API_H_ + +#include + +#ifdef FLUTTER_PLUGIN_IMPL +#define FLUTTER_PLUGIN_EXPORT __declspec(dllexport) +#else +#define FLUTTER_PLUGIN_EXPORT __declspec(dllimport) +#endif + +#if defined(__cplusplus) +extern "C" { +#endif + +FLUTTER_PLUGIN_EXPORT void FirebaseStoragePluginCApiRegisterWithRegistrar( + FlutterDesktopPluginRegistrarRef registrar); + +#if defined(__cplusplus) +} // extern "C" +#endif + +#endif /* FLUTTER_PLUGIN_FIREBASE_STORAGE_PLUGIN_C_API_H_ */ diff --git a/packages/firebase_storage/firebase_storage/windows/messages.g.cpp b/packages/firebase_storage/firebase_storage/windows/messages.g.cpp new file mode 100644 index 000000000000..bebbdb984166 --- /dev/null +++ b/packages/firebase_storage/firebase_storage/windows/messages.g.cpp @@ -0,0 +1,1557 @@ +// 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 (v11.0.1), do not edit directly. +// See also: https://pub.dev/packages/pigeon + +#undef _HAS_EXCEPTIONS + +#include "messages.g.h" + +#include +#include +#include +#include + +#include +#include +#include + +namespace firebase_storage_windows { +using flutter::BasicMessageChannel; +using flutter::CustomEncodableValue; +using flutter::EncodableList; +using flutter::EncodableMap; +using flutter::EncodableValue; + +// PigeonStorageFirebaseApp + +PigeonStorageFirebaseApp::PigeonStorageFirebaseApp(const std::string& app_name) + : app_name_(app_name) {} + +PigeonStorageFirebaseApp::PigeonStorageFirebaseApp(const std::string& app_name, + const std::string* tenant_id) + : app_name_(app_name), + tenant_id_(tenant_id ? std::optional(*tenant_id) + : std::nullopt) {} + +const std::string& PigeonStorageFirebaseApp::app_name() const { + return app_name_; +} + +void PigeonStorageFirebaseApp::set_app_name(std::string_view value_arg) { + app_name_ = value_arg; +} + +const std::string* PigeonStorageFirebaseApp::tenant_id() const { + return tenant_id_ ? &(*tenant_id_) : nullptr; +} + +void PigeonStorageFirebaseApp::set_tenant_id( + const std::string_view* value_arg) { + tenant_id_ = + value_arg ? std::optional(*value_arg) : std::nullopt; +} + +void PigeonStorageFirebaseApp::set_tenant_id(std::string_view value_arg) { + tenant_id_ = value_arg; +} + +EncodableList PigeonStorageFirebaseApp::ToEncodableList() const { + EncodableList list; + list.reserve(2); + list.push_back(EncodableValue(app_name_)); + list.push_back(tenant_id_ ? EncodableValue(*tenant_id_) : EncodableValue()); + return list; +} + +PigeonStorageFirebaseApp PigeonStorageFirebaseApp::FromEncodableList( + const EncodableList& list) { + PigeonStorageFirebaseApp decoded(std::get(list[0])); + auto& encodable_tenant_id = list[1]; + if (!encodable_tenant_id.IsNull()) { + decoded.set_tenant_id(std::get(encodable_tenant_id)); + } + return decoded; +} + +// PigeonStorageReference + +PigeonStorageReference::PigeonStorageReference(const std::string& bucket, + const std::string& full_path, + const std::string& name) + : bucket_(bucket), full_path_(full_path), name_(name) {} + +const std::string& PigeonStorageReference::bucket() const { return bucket_; } + +void PigeonStorageReference::set_bucket(std::string_view value_arg) { + bucket_ = value_arg; +} + +const std::string& PigeonStorageReference::full_path() const { + return full_path_; +} + +void PigeonStorageReference::set_full_path(std::string_view value_arg) { + full_path_ = value_arg; +} + +const std::string& PigeonStorageReference::name() const { return name_; } + +void PigeonStorageReference::set_name(std::string_view value_arg) { + name_ = value_arg; +} + +EncodableList PigeonStorageReference::ToEncodableList() const { + EncodableList list; + list.reserve(3); + list.push_back(EncodableValue(bucket_)); + list.push_back(EncodableValue(full_path_)); + list.push_back(EncodableValue(name_)); + return list; +} + +PigeonStorageReference PigeonStorageReference::FromEncodableList( + const EncodableList& list) { + PigeonStorageReference decoded(std::get(list[0]), + std::get(list[1]), + std::get(list[2])); + return decoded; +} + +// PigeonFullMetaData + +PigeonFullMetaData::PigeonFullMetaData() {} + +PigeonFullMetaData::PigeonFullMetaData(const EncodableMap* metadata) + : metadata_(metadata ? std::optional(*metadata) + : std::nullopt) {} + +const EncodableMap* PigeonFullMetaData::metadata() const { + return metadata_ ? &(*metadata_) : nullptr; +} + +void PigeonFullMetaData::set_metadata(const EncodableMap* value_arg) { + metadata_ = + value_arg ? std::optional(*value_arg) : std::nullopt; +} + +void PigeonFullMetaData::set_metadata(const EncodableMap& value_arg) { + metadata_ = value_arg; +} + +EncodableList PigeonFullMetaData::ToEncodableList() const { + EncodableList list; + list.reserve(1); + list.push_back(metadata_ ? EncodableValue(*metadata_) : EncodableValue()); + return list; +} + +PigeonFullMetaData PigeonFullMetaData::FromEncodableList( + const EncodableList& list) { + PigeonFullMetaData decoded; + auto& encodable_metadata = list[0]; + if (!encodable_metadata.IsNull()) { + decoded.set_metadata(std::get(encodable_metadata)); + } + return decoded; +} + +// PigeonListOptions + +PigeonListOptions::PigeonListOptions() {} + +PigeonListOptions::PigeonListOptions(const int64_t* max_results, + const std::string* page_token) + : max_results_(max_results ? std::optional(*max_results) + : std::nullopt), + page_token_(page_token ? std::optional(*page_token) + : std::nullopt) {} + +const int64_t* PigeonListOptions::max_results() const { + return max_results_ ? &(*max_results_) : nullptr; +} + +void PigeonListOptions::set_max_results(const int64_t* value_arg) { + max_results_ = value_arg ? std::optional(*value_arg) : std::nullopt; +} + +void PigeonListOptions::set_max_results(int64_t value_arg) { + max_results_ = value_arg; +} + +const std::string* PigeonListOptions::page_token() const { + return page_token_ ? &(*page_token_) : nullptr; +} + +void PigeonListOptions::set_page_token(const std::string_view* value_arg) { + page_token_ = + value_arg ? std::optional(*value_arg) : std::nullopt; +} + +void PigeonListOptions::set_page_token(std::string_view value_arg) { + page_token_ = value_arg; +} + +EncodableList PigeonListOptions::ToEncodableList() const { + EncodableList list; + list.reserve(2); + list.push_back(max_results_ ? EncodableValue(*max_results_) + : EncodableValue()); + list.push_back(page_token_ ? EncodableValue(*page_token_) : EncodableValue()); + return list; +} + +PigeonListOptions PigeonListOptions::FromEncodableList( + const EncodableList& list) { + PigeonListOptions decoded; + auto& encodable_max_results = list[0]; + if (!encodable_max_results.IsNull()) { + decoded.set_max_results(encodable_max_results.LongValue()); + } + auto& encodable_page_token = list[1]; + if (!encodable_page_token.IsNull()) { + decoded.set_page_token(std::get(encodable_page_token)); + } + return decoded; +} + +// PigeonSettableMetadata + +PigeonSettableMetadata::PigeonSettableMetadata() {} + +PigeonSettableMetadata::PigeonSettableMetadata( + const std::string* cache_control, const std::string* content_disposition, + const std::string* content_encoding, const std::string* content_language, + const std::string* content_type, const EncodableMap* custom_metadata) + : cache_control_(cache_control ? std::optional(*cache_control) + : std::nullopt), + content_disposition_( + content_disposition ? std::optional(*content_disposition) + : std::nullopt), + content_encoding_(content_encoding + ? std::optional(*content_encoding) + : std::nullopt), + content_language_(content_language + ? std::optional(*content_language) + : std::nullopt), + content_type_(content_type ? std::optional(*content_type) + : std::nullopt), + custom_metadata_(custom_metadata + ? std::optional(*custom_metadata) + : std::nullopt) {} + +const std::string* PigeonSettableMetadata::cache_control() const { + return cache_control_ ? &(*cache_control_) : nullptr; +} + +void PigeonSettableMetadata::set_cache_control( + const std::string_view* value_arg) { + cache_control_ = + value_arg ? std::optional(*value_arg) : std::nullopt; +} + +void PigeonSettableMetadata::set_cache_control(std::string_view value_arg) { + cache_control_ = value_arg; +} + +const std::string* PigeonSettableMetadata::content_disposition() const { + return content_disposition_ ? &(*content_disposition_) : nullptr; +} + +void PigeonSettableMetadata::set_content_disposition( + const std::string_view* value_arg) { + content_disposition_ = + value_arg ? std::optional(*value_arg) : std::nullopt; +} + +void PigeonSettableMetadata::set_content_disposition( + std::string_view value_arg) { + content_disposition_ = value_arg; +} + +const std::string* PigeonSettableMetadata::content_encoding() const { + return content_encoding_ ? &(*content_encoding_) : nullptr; +} + +void PigeonSettableMetadata::set_content_encoding( + const std::string_view* value_arg) { + content_encoding_ = + value_arg ? std::optional(*value_arg) : std::nullopt; +} + +void PigeonSettableMetadata::set_content_encoding(std::string_view value_arg) { + content_encoding_ = value_arg; +} + +const std::string* PigeonSettableMetadata::content_language() const { + return content_language_ ? &(*content_language_) : nullptr; +} + +void PigeonSettableMetadata::set_content_language( + const std::string_view* value_arg) { + content_language_ = + value_arg ? std::optional(*value_arg) : std::nullopt; +} + +void PigeonSettableMetadata::set_content_language(std::string_view value_arg) { + content_language_ = value_arg; +} + +const std::string* PigeonSettableMetadata::content_type() const { + return content_type_ ? &(*content_type_) : nullptr; +} + +void PigeonSettableMetadata::set_content_type( + const std::string_view* value_arg) { + content_type_ = + value_arg ? std::optional(*value_arg) : std::nullopt; +} + +void PigeonSettableMetadata::set_content_type(std::string_view value_arg) { + content_type_ = value_arg; +} + +const EncodableMap* PigeonSettableMetadata::custom_metadata() const { + return custom_metadata_ ? &(*custom_metadata_) : nullptr; +} + +void PigeonSettableMetadata::set_custom_metadata( + const EncodableMap* value_arg) { + custom_metadata_ = + value_arg ? std::optional(*value_arg) : std::nullopt; +} + +void PigeonSettableMetadata::set_custom_metadata( + const EncodableMap& value_arg) { + custom_metadata_ = value_arg; +} + +EncodableList PigeonSettableMetadata::ToEncodableList() const { + EncodableList list; + list.reserve(6); + list.push_back(cache_control_ ? EncodableValue(*cache_control_) + : EncodableValue()); + list.push_back(content_disposition_ ? EncodableValue(*content_disposition_) + : EncodableValue()); + list.push_back(content_encoding_ ? EncodableValue(*content_encoding_) + : EncodableValue()); + list.push_back(content_language_ ? EncodableValue(*content_language_) + : EncodableValue()); + list.push_back(content_type_ ? EncodableValue(*content_type_) + : EncodableValue()); + list.push_back(custom_metadata_ ? EncodableValue(*custom_metadata_) + : EncodableValue()); + return list; +} + +PigeonSettableMetadata PigeonSettableMetadata::FromEncodableList( + const EncodableList& list) { + PigeonSettableMetadata decoded; + auto& encodable_cache_control = list[0]; + if (!encodable_cache_control.IsNull()) { + decoded.set_cache_control(std::get(encodable_cache_control)); + } + auto& encodable_content_disposition = list[1]; + if (!encodable_content_disposition.IsNull()) { + decoded.set_content_disposition( + std::get(encodable_content_disposition)); + } + auto& encodable_content_encoding = list[2]; + if (!encodable_content_encoding.IsNull()) { + decoded.set_content_encoding( + std::get(encodable_content_encoding)); + } + auto& encodable_content_language = list[3]; + if (!encodable_content_language.IsNull()) { + decoded.set_content_language( + std::get(encodable_content_language)); + } + auto& encodable_content_type = list[4]; + if (!encodable_content_type.IsNull()) { + decoded.set_content_type(std::get(encodable_content_type)); + } + auto& encodable_custom_metadata = list[5]; + if (!encodable_custom_metadata.IsNull()) { + decoded.set_custom_metadata( + std::get(encodable_custom_metadata)); + } + return decoded; +} + +// PigeonListResult + +PigeonListResult::PigeonListResult(const EncodableList& items, + const EncodableList& prefixs) + : items_(items), prefixs_(prefixs) {} + +PigeonListResult::PigeonListResult(const EncodableList& items, + const std::string* page_token, + const EncodableList& prefixs) + : items_(items), + page_token_(page_token ? std::optional(*page_token) + : std::nullopt), + prefixs_(prefixs) {} + +const EncodableList& PigeonListResult::items() const { return items_; } + +void PigeonListResult::set_items(const EncodableList& value_arg) { + items_ = value_arg; +} + +const std::string* PigeonListResult::page_token() const { + return page_token_ ? &(*page_token_) : nullptr; +} + +void PigeonListResult::set_page_token(const std::string_view* value_arg) { + page_token_ = + value_arg ? std::optional(*value_arg) : std::nullopt; +} + +void PigeonListResult::set_page_token(std::string_view value_arg) { + page_token_ = value_arg; +} + +const EncodableList& PigeonListResult::prefixs() const { return prefixs_; } + +void PigeonListResult::set_prefixs(const EncodableList& value_arg) { + prefixs_ = value_arg; +} + +EncodableList PigeonListResult::ToEncodableList() const { + EncodableList list; + list.reserve(3); + list.push_back(EncodableValue(items_)); + list.push_back(page_token_ ? EncodableValue(*page_token_) : EncodableValue()); + list.push_back(EncodableValue(prefixs_)); + return list; +} + +PigeonListResult PigeonListResult::FromEncodableList( + const EncodableList& list) { + PigeonListResult decoded(std::get(list[0]), + std::get(list[2])); + auto& encodable_page_token = list[1]; + if (!encodable_page_token.IsNull()) { + decoded.set_page_token(std::get(encodable_page_token)); + } + return decoded; +} + +FirebaseStorageHostApiCodecSerializer::FirebaseStorageHostApiCodecSerializer() { +} + +EncodableValue FirebaseStorageHostApiCodecSerializer::ReadValueOfType( + uint8_t type, flutter::ByteStreamReader* stream) const { + switch (type) { + case 128: + return CustomEncodableValue(PigeonFullMetaData::FromEncodableList( + std::get(ReadValue(stream)))); + case 129: + return CustomEncodableValue(PigeonListOptions::FromEncodableList( + std::get(ReadValue(stream)))); + case 130: + return CustomEncodableValue(PigeonListResult::FromEncodableList( + std::get(ReadValue(stream)))); + case 131: + return CustomEncodableValue(PigeonSettableMetadata::FromEncodableList( + std::get(ReadValue(stream)))); + case 132: + return CustomEncodableValue(PigeonStorageFirebaseApp::FromEncodableList( + std::get(ReadValue(stream)))); + case 133: + return CustomEncodableValue(PigeonStorageReference::FromEncodableList( + std::get(ReadValue(stream)))); + default: + return flutter::StandardCodecSerializer::ReadValueOfType(type, stream); + } +} + +void FirebaseStorageHostApiCodecSerializer::WriteValue( + const EncodableValue& value, flutter::ByteStreamWriter* stream) const { + if (const CustomEncodableValue* custom_value = + std::get_if(&value)) { + if (custom_value->type() == typeid(PigeonFullMetaData)) { + stream->WriteByte(128); + WriteValue(EncodableValue(std::any_cast(*custom_value) + .ToEncodableList()), + stream); + return; + } + if (custom_value->type() == typeid(PigeonListOptions)) { + stream->WriteByte(129); + WriteValue(EncodableValue(std::any_cast(*custom_value) + .ToEncodableList()), + stream); + return; + } + if (custom_value->type() == typeid(PigeonListResult)) { + stream->WriteByte(130); + WriteValue( + EncodableValue( + std::any_cast(*custom_value).ToEncodableList()), + stream); + return; + } + if (custom_value->type() == typeid(PigeonSettableMetadata)) { + stream->WriteByte(131); + WriteValue( + EncodableValue(std::any_cast(*custom_value) + .ToEncodableList()), + stream); + return; + } + if (custom_value->type() == typeid(PigeonStorageFirebaseApp)) { + stream->WriteByte(132); + WriteValue( + EncodableValue(std::any_cast(*custom_value) + .ToEncodableList()), + stream); + return; + } + if (custom_value->type() == typeid(PigeonStorageReference)) { + stream->WriteByte(133); + WriteValue( + EncodableValue(std::any_cast(*custom_value) + .ToEncodableList()), + stream); + return; + } + } + flutter::StandardCodecSerializer::WriteValue(value, stream); +} + +/// The codec used by FirebaseStorageHostApi. +const flutter::StandardMessageCodec& FirebaseStorageHostApi::GetCodec() { + return flutter::StandardMessageCodec::GetInstance( + &FirebaseStorageHostApiCodecSerializer::GetInstance()); +} + +// Sets up an instance of `FirebaseStorageHostApi` to handle messages through +// the `binary_messenger`. +void FirebaseStorageHostApi::SetUp(flutter::BinaryMessenger* binary_messenger, + FirebaseStorageHostApi* api) { + { + auto channel = std::make_unique>( + binary_messenger, + "dev.flutter.pigeon.firebase_storage_platform_interface." + "FirebaseStorageHostApi.getReferencebyPath", + &GetCodec()); + if (api != nullptr) { + channel->SetMessageHandler( + [api](const EncodableValue& message, + const flutter::MessageReply& reply) { + try { + const auto& args = std::get(message); + const auto& encodable_app_arg = args.at(0); + if (encodable_app_arg.IsNull()) { + reply(WrapError("app_arg unexpectedly null.")); + return; + } + const auto& app_arg = + std::any_cast( + std::get(encodable_app_arg)); + const auto& encodable_path_arg = args.at(1); + if (encodable_path_arg.IsNull()) { + reply(WrapError("path_arg unexpectedly null.")); + return; + } + const auto& path_arg = std::get(encodable_path_arg); + const auto& encodable_bucket_arg = args.at(2); + const auto* bucket_arg = + std::get_if(&encodable_bucket_arg); + api->GetReferencebyPath( + app_arg, path_arg, bucket_arg, + [reply](ErrorOr&& output) { + if (output.has_error()) { + reply(WrapError(output.error())); + return; + } + EncodableList wrapped; + wrapped.push_back( + CustomEncodableValue(std::move(output).TakeValue())); + reply(EncodableValue(std::move(wrapped))); + }); + } catch (const std::exception& exception) { + reply(WrapError(exception.what())); + } + }); + } else { + channel->SetMessageHandler(nullptr); + } + } + { + auto channel = std::make_unique>( + binary_messenger, + "dev.flutter.pigeon.firebase_storage_platform_interface." + "FirebaseStorageHostApi.setMaxOperationRetryTime", + &GetCodec()); + if (api != nullptr) { + channel->SetMessageHandler( + [api](const EncodableValue& message, + const flutter::MessageReply& reply) { + try { + const auto& args = std::get(message); + const auto& encodable_app_arg = args.at(0); + if (encodable_app_arg.IsNull()) { + reply(WrapError("app_arg unexpectedly null.")); + return; + } + const auto& app_arg = + std::any_cast( + std::get(encodable_app_arg)); + const auto& encodable_time_arg = args.at(1); + if (encodable_time_arg.IsNull()) { + reply(WrapError("time_arg unexpectedly null.")); + return; + } + const int64_t time_arg = encodable_time_arg.LongValue(); + api->SetMaxOperationRetryTime( + app_arg, time_arg, + [reply](std::optional&& output) { + if (output.has_value()) { + reply(WrapError(output.value())); + return; + } + EncodableList wrapped; + wrapped.push_back(EncodableValue()); + reply(EncodableValue(std::move(wrapped))); + }); + } catch (const std::exception& exception) { + reply(WrapError(exception.what())); + } + }); + } else { + channel->SetMessageHandler(nullptr); + } + } + { + auto channel = std::make_unique>( + binary_messenger, + "dev.flutter.pigeon.firebase_storage_platform_interface." + "FirebaseStorageHostApi.setMaxUploadRetryTime", + &GetCodec()); + if (api != nullptr) { + channel->SetMessageHandler( + [api](const EncodableValue& message, + const flutter::MessageReply& reply) { + try { + const auto& args = std::get(message); + const auto& encodable_app_arg = args.at(0); + if (encodable_app_arg.IsNull()) { + reply(WrapError("app_arg unexpectedly null.")); + return; + } + const auto& app_arg = + std::any_cast( + std::get(encodable_app_arg)); + const auto& encodable_time_arg = args.at(1); + if (encodable_time_arg.IsNull()) { + reply(WrapError("time_arg unexpectedly null.")); + return; + } + const int64_t time_arg = encodable_time_arg.LongValue(); + api->SetMaxUploadRetryTime( + app_arg, time_arg, + [reply](std::optional&& output) { + if (output.has_value()) { + reply(WrapError(output.value())); + return; + } + EncodableList wrapped; + wrapped.push_back(EncodableValue()); + reply(EncodableValue(std::move(wrapped))); + }); + } catch (const std::exception& exception) { + reply(WrapError(exception.what())); + } + }); + } else { + channel->SetMessageHandler(nullptr); + } + } + { + auto channel = std::make_unique>( + binary_messenger, + "dev.flutter.pigeon.firebase_storage_platform_interface." + "FirebaseStorageHostApi.setMaxDownloadRetryTime", + &GetCodec()); + if (api != nullptr) { + channel->SetMessageHandler( + [api](const EncodableValue& message, + const flutter::MessageReply& reply) { + try { + const auto& args = std::get(message); + const auto& encodable_app_arg = args.at(0); + if (encodable_app_arg.IsNull()) { + reply(WrapError("app_arg unexpectedly null.")); + return; + } + const auto& app_arg = + std::any_cast( + std::get(encodable_app_arg)); + const auto& encodable_time_arg = args.at(1); + if (encodable_time_arg.IsNull()) { + reply(WrapError("time_arg unexpectedly null.")); + return; + } + const int64_t time_arg = encodable_time_arg.LongValue(); + api->SetMaxDownloadRetryTime( + app_arg, time_arg, + [reply](std::optional&& output) { + if (output.has_value()) { + reply(WrapError(output.value())); + return; + } + EncodableList wrapped; + wrapped.push_back(EncodableValue()); + reply(EncodableValue(std::move(wrapped))); + }); + } catch (const std::exception& exception) { + reply(WrapError(exception.what())); + } + }); + } else { + channel->SetMessageHandler(nullptr); + } + } + { + auto channel = std::make_unique>( + binary_messenger, + "dev.flutter.pigeon.firebase_storage_platform_interface." + "FirebaseStorageHostApi.useStorageEmulator", + &GetCodec()); + if (api != nullptr) { + channel->SetMessageHandler( + [api](const EncodableValue& message, + const flutter::MessageReply& reply) { + try { + const auto& args = std::get(message); + const auto& encodable_app_arg = args.at(0); + if (encodable_app_arg.IsNull()) { + reply(WrapError("app_arg unexpectedly null.")); + return; + } + const auto& app_arg = + std::any_cast( + std::get(encodable_app_arg)); + const auto& encodable_host_arg = args.at(1); + if (encodable_host_arg.IsNull()) { + reply(WrapError("host_arg unexpectedly null.")); + return; + } + const auto& host_arg = std::get(encodable_host_arg); + const auto& encodable_port_arg = args.at(2); + if (encodable_port_arg.IsNull()) { + reply(WrapError("port_arg unexpectedly null.")); + return; + } + const int64_t port_arg = encodable_port_arg.LongValue(); + api->UseStorageEmulator( + app_arg, host_arg, port_arg, + [reply](std::optional&& output) { + if (output.has_value()) { + reply(WrapError(output.value())); + return; + } + EncodableList wrapped; + wrapped.push_back(EncodableValue()); + reply(EncodableValue(std::move(wrapped))); + }); + } catch (const std::exception& exception) { + reply(WrapError(exception.what())); + } + }); + } else { + channel->SetMessageHandler(nullptr); + } + } + { + auto channel = std::make_unique>( + binary_messenger, + "dev.flutter.pigeon.firebase_storage_platform_interface." + "FirebaseStorageHostApi.referenceDelete", + &GetCodec()); + if (api != nullptr) { + channel->SetMessageHandler( + [api](const EncodableValue& message, + const flutter::MessageReply& reply) { + try { + const auto& args = std::get(message); + const auto& encodable_app_arg = args.at(0); + if (encodable_app_arg.IsNull()) { + reply(WrapError("app_arg unexpectedly null.")); + return; + } + const auto& app_arg = + std::any_cast( + std::get(encodable_app_arg)); + const auto& encodable_reference_arg = args.at(1); + if (encodable_reference_arg.IsNull()) { + reply(WrapError("reference_arg unexpectedly null.")); + return; + } + const auto& reference_arg = + std::any_cast( + std::get(encodable_reference_arg)); + api->ReferenceDelete( + app_arg, reference_arg, + [reply](std::optional&& output) { + if (output.has_value()) { + reply(WrapError(output.value())); + return; + } + EncodableList wrapped; + wrapped.push_back(EncodableValue()); + reply(EncodableValue(std::move(wrapped))); + }); + } catch (const std::exception& exception) { + reply(WrapError(exception.what())); + } + }); + } else { + channel->SetMessageHandler(nullptr); + } + } + { + auto channel = std::make_unique>( + binary_messenger, + "dev.flutter.pigeon.firebase_storage_platform_interface." + "FirebaseStorageHostApi.referenceGetDownloadURL", + &GetCodec()); + if (api != nullptr) { + channel->SetMessageHandler( + [api](const EncodableValue& message, + const flutter::MessageReply& reply) { + try { + const auto& args = std::get(message); + const auto& encodable_app_arg = args.at(0); + if (encodable_app_arg.IsNull()) { + reply(WrapError("app_arg unexpectedly null.")); + return; + } + const auto& app_arg = + std::any_cast( + std::get(encodable_app_arg)); + const auto& encodable_reference_arg = args.at(1); + if (encodable_reference_arg.IsNull()) { + reply(WrapError("reference_arg unexpectedly null.")); + return; + } + const auto& reference_arg = + std::any_cast( + std::get(encodable_reference_arg)); + api->ReferenceGetDownloadURL( + app_arg, reference_arg, + [reply](ErrorOr&& output) { + if (output.has_error()) { + reply(WrapError(output.error())); + return; + } + EncodableList wrapped; + wrapped.push_back( + EncodableValue(std::move(output).TakeValue())); + reply(EncodableValue(std::move(wrapped))); + }); + } catch (const std::exception& exception) { + reply(WrapError(exception.what())); + } + }); + } else { + channel->SetMessageHandler(nullptr); + } + } + { + auto channel = std::make_unique>( + binary_messenger, + "dev.flutter.pigeon.firebase_storage_platform_interface." + "FirebaseStorageHostApi.referenceGetMetaData", + &GetCodec()); + if (api != nullptr) { + channel->SetMessageHandler( + [api](const EncodableValue& message, + const flutter::MessageReply& reply) { + try { + const auto& args = std::get(message); + const auto& encodable_app_arg = args.at(0); + if (encodable_app_arg.IsNull()) { + reply(WrapError("app_arg unexpectedly null.")); + return; + } + const auto& app_arg = + std::any_cast( + std::get(encodable_app_arg)); + const auto& encodable_reference_arg = args.at(1); + if (encodable_reference_arg.IsNull()) { + reply(WrapError("reference_arg unexpectedly null.")); + return; + } + const auto& reference_arg = + std::any_cast( + std::get(encodable_reference_arg)); + api->ReferenceGetMetaData( + app_arg, reference_arg, + [reply](ErrorOr&& output) { + if (output.has_error()) { + reply(WrapError(output.error())); + return; + } + EncodableList wrapped; + wrapped.push_back( + CustomEncodableValue(std::move(output).TakeValue())); + reply(EncodableValue(std::move(wrapped))); + }); + } catch (const std::exception& exception) { + reply(WrapError(exception.what())); + } + }); + } else { + channel->SetMessageHandler(nullptr); + } + } + { + auto channel = std::make_unique>( + binary_messenger, + "dev.flutter.pigeon.firebase_storage_platform_interface." + "FirebaseStorageHostApi.referenceList", + &GetCodec()); + if (api != nullptr) { + channel->SetMessageHandler( + [api](const EncodableValue& message, + const flutter::MessageReply& reply) { + try { + const auto& args = std::get(message); + const auto& encodable_app_arg = args.at(0); + if (encodable_app_arg.IsNull()) { + reply(WrapError("app_arg unexpectedly null.")); + return; + } + const auto& app_arg = + std::any_cast( + std::get(encodable_app_arg)); + const auto& encodable_reference_arg = args.at(1); + if (encodable_reference_arg.IsNull()) { + reply(WrapError("reference_arg unexpectedly null.")); + return; + } + const auto& reference_arg = + std::any_cast( + std::get(encodable_reference_arg)); + const auto& encodable_options_arg = args.at(2); + if (encodable_options_arg.IsNull()) { + reply(WrapError("options_arg unexpectedly null.")); + return; + } + const auto& options_arg = std::any_cast( + std::get(encodable_options_arg)); + api->ReferenceList(app_arg, reference_arg, options_arg, + [reply](ErrorOr&& output) { + if (output.has_error()) { + reply(WrapError(output.error())); + return; + } + EncodableList wrapped; + wrapped.push_back(CustomEncodableValue( + std::move(output).TakeValue())); + reply(EncodableValue(std::move(wrapped))); + }); + } catch (const std::exception& exception) { + reply(WrapError(exception.what())); + } + }); + } else { + channel->SetMessageHandler(nullptr); + } + } + { + auto channel = std::make_unique>( + binary_messenger, + "dev.flutter.pigeon.firebase_storage_platform_interface." + "FirebaseStorageHostApi.referenceListAll", + &GetCodec()); + if (api != nullptr) { + channel->SetMessageHandler( + [api](const EncodableValue& message, + const flutter::MessageReply& reply) { + try { + const auto& args = std::get(message); + const auto& encodable_app_arg = args.at(0); + if (encodable_app_arg.IsNull()) { + reply(WrapError("app_arg unexpectedly null.")); + return; + } + const auto& app_arg = + std::any_cast( + std::get(encodable_app_arg)); + const auto& encodable_reference_arg = args.at(1); + if (encodable_reference_arg.IsNull()) { + reply(WrapError("reference_arg unexpectedly null.")); + return; + } + const auto& reference_arg = + std::any_cast( + std::get(encodable_reference_arg)); + api->ReferenceListAll( + app_arg, reference_arg, + [reply](ErrorOr&& output) { + if (output.has_error()) { + reply(WrapError(output.error())); + return; + } + EncodableList wrapped; + wrapped.push_back( + CustomEncodableValue(std::move(output).TakeValue())); + reply(EncodableValue(std::move(wrapped))); + }); + } catch (const std::exception& exception) { + reply(WrapError(exception.what())); + } + }); + } else { + channel->SetMessageHandler(nullptr); + } + } + { + auto channel = std::make_unique>( + binary_messenger, + "dev.flutter.pigeon.firebase_storage_platform_interface." + "FirebaseStorageHostApi.referenceGetData", + &GetCodec()); + if (api != nullptr) { + channel->SetMessageHandler( + [api](const EncodableValue& message, + const flutter::MessageReply& reply) { + try { + const auto& args = std::get(message); + const auto& encodable_app_arg = args.at(0); + if (encodable_app_arg.IsNull()) { + reply(WrapError("app_arg unexpectedly null.")); + return; + } + const auto& app_arg = + std::any_cast( + std::get(encodable_app_arg)); + const auto& encodable_reference_arg = args.at(1); + if (encodable_reference_arg.IsNull()) { + reply(WrapError("reference_arg unexpectedly null.")); + return; + } + const auto& reference_arg = + std::any_cast( + std::get(encodable_reference_arg)); + const auto& encodable_max_size_arg = args.at(2); + if (encodable_max_size_arg.IsNull()) { + reply(WrapError("max_size_arg unexpectedly null.")); + return; + } + const int64_t max_size_arg = encodable_max_size_arg.LongValue(); + api->ReferenceGetData( + app_arg, reference_arg, max_size_arg, + [reply]( + ErrorOr>>&& output) { + if (output.has_error()) { + reply(WrapError(output.error())); + return; + } + EncodableList wrapped; + auto output_optional = std::move(output).TakeValue(); + if (output_optional) { + wrapped.push_back( + EncodableValue(std::move(output_optional).value())); + } else { + wrapped.push_back(EncodableValue()); + } + reply(EncodableValue(std::move(wrapped))); + }); + } catch (const std::exception& exception) { + reply(WrapError(exception.what())); + } + }); + } else { + channel->SetMessageHandler(nullptr); + } + } + { + auto channel = std::make_unique>( + binary_messenger, + "dev.flutter.pigeon.firebase_storage_platform_interface." + "FirebaseStorageHostApi.referencePutData", + &GetCodec()); + if (api != nullptr) { + channel->SetMessageHandler( + [api](const EncodableValue& message, + const flutter::MessageReply& reply) { + try { + const auto& args = std::get(message); + const auto& encodable_app_arg = args.at(0); + if (encodable_app_arg.IsNull()) { + reply(WrapError("app_arg unexpectedly null.")); + return; + } + const auto& app_arg = + std::any_cast( + std::get(encodable_app_arg)); + const auto& encodable_reference_arg = args.at(1); + if (encodable_reference_arg.IsNull()) { + reply(WrapError("reference_arg unexpectedly null.")); + return; + } + const auto& reference_arg = + std::any_cast( + std::get(encodable_reference_arg)); + const auto& encodable_data_arg = args.at(2); + if (encodable_data_arg.IsNull()) { + reply(WrapError("data_arg unexpectedly null.")); + return; + } + const auto& data_arg = + std::get>(encodable_data_arg); + const auto& encodable_settable_meta_data_arg = args.at(3); + if (encodable_settable_meta_data_arg.IsNull()) { + reply(WrapError("settable_meta_data_arg unexpectedly null.")); + return; + } + const auto& settable_meta_data_arg = + std::any_cast( + std::get( + encodable_settable_meta_data_arg)); + const auto& encodable_handle_arg = args.at(4); + if (encodable_handle_arg.IsNull()) { + reply(WrapError("handle_arg unexpectedly null.")); + return; + } + const int64_t handle_arg = encodable_handle_arg.LongValue(); + api->ReferencePutData( + app_arg, reference_arg, data_arg, settable_meta_data_arg, + handle_arg, [reply](ErrorOr&& output) { + if (output.has_error()) { + reply(WrapError(output.error())); + return; + } + EncodableList wrapped; + wrapped.push_back( + EncodableValue(std::move(output).TakeValue())); + reply(EncodableValue(std::move(wrapped))); + }); + } catch (const std::exception& exception) { + reply(WrapError(exception.what())); + } + }); + } else { + channel->SetMessageHandler(nullptr); + } + } + { + auto channel = std::make_unique>( + binary_messenger, + "dev.flutter.pigeon.firebase_storage_platform_interface." + "FirebaseStorageHostApi.referencePutString", + &GetCodec()); + if (api != nullptr) { + channel->SetMessageHandler( + [api](const EncodableValue& message, + const flutter::MessageReply& reply) { + try { + const auto& args = std::get(message); + const auto& encodable_app_arg = args.at(0); + if (encodable_app_arg.IsNull()) { + reply(WrapError("app_arg unexpectedly null.")); + return; + } + const auto& app_arg = + std::any_cast( + std::get(encodable_app_arg)); + const auto& encodable_reference_arg = args.at(1); + if (encodable_reference_arg.IsNull()) { + reply(WrapError("reference_arg unexpectedly null.")); + return; + } + const auto& reference_arg = + std::any_cast( + std::get(encodable_reference_arg)); + const auto& encodable_data_arg = args.at(2); + if (encodable_data_arg.IsNull()) { + reply(WrapError("data_arg unexpectedly null.")); + return; + } + const auto& data_arg = std::get(encodable_data_arg); + const auto& encodable_format_arg = args.at(3); + if (encodable_format_arg.IsNull()) { + reply(WrapError("format_arg unexpectedly null.")); + return; + } + const int64_t format_arg = encodable_format_arg.LongValue(); + const auto& encodable_settable_meta_data_arg = args.at(4); + if (encodable_settable_meta_data_arg.IsNull()) { + reply(WrapError("settable_meta_data_arg unexpectedly null.")); + return; + } + const auto& settable_meta_data_arg = + std::any_cast( + std::get( + encodable_settable_meta_data_arg)); + const auto& encodable_handle_arg = args.at(5); + if (encodable_handle_arg.IsNull()) { + reply(WrapError("handle_arg unexpectedly null.")); + return; + } + const int64_t handle_arg = encodable_handle_arg.LongValue(); + api->ReferencePutString( + app_arg, reference_arg, data_arg, format_arg, + settable_meta_data_arg, handle_arg, + [reply](ErrorOr&& output) { + if (output.has_error()) { + reply(WrapError(output.error())); + return; + } + EncodableList wrapped; + wrapped.push_back( + EncodableValue(std::move(output).TakeValue())); + reply(EncodableValue(std::move(wrapped))); + }); + } catch (const std::exception& exception) { + reply(WrapError(exception.what())); + } + }); + } else { + channel->SetMessageHandler(nullptr); + } + } + { + auto channel = std::make_unique>( + binary_messenger, + "dev.flutter.pigeon.firebase_storage_platform_interface." + "FirebaseStorageHostApi.referencePutFile", + &GetCodec()); + if (api != nullptr) { + channel->SetMessageHandler( + [api](const EncodableValue& message, + const flutter::MessageReply& reply) { + try { + const auto& args = std::get(message); + const auto& encodable_app_arg = args.at(0); + if (encodable_app_arg.IsNull()) { + reply(WrapError("app_arg unexpectedly null.")); + return; + } + const auto& app_arg = + std::any_cast( + std::get(encodable_app_arg)); + const auto& encodable_reference_arg = args.at(1); + if (encodable_reference_arg.IsNull()) { + reply(WrapError("reference_arg unexpectedly null.")); + return; + } + const auto& reference_arg = + std::any_cast( + std::get(encodable_reference_arg)); + const auto& encodable_file_path_arg = args.at(2); + if (encodable_file_path_arg.IsNull()) { + reply(WrapError("file_path_arg unexpectedly null.")); + return; + } + const auto& file_path_arg = + std::get(encodable_file_path_arg); + const auto& encodable_settable_meta_data_arg = args.at(3); + if (encodable_settable_meta_data_arg.IsNull()) { + reply(WrapError("settable_meta_data_arg unexpectedly null.")); + return; + } + const auto& settable_meta_data_arg = + std::any_cast( + std::get( + encodable_settable_meta_data_arg)); + const auto& encodable_handle_arg = args.at(4); + if (encodable_handle_arg.IsNull()) { + reply(WrapError("handle_arg unexpectedly null.")); + return; + } + const int64_t handle_arg = encodable_handle_arg.LongValue(); + api->ReferencePutFile( + app_arg, reference_arg, file_path_arg, settable_meta_data_arg, + handle_arg, [reply](ErrorOr&& output) { + if (output.has_error()) { + reply(WrapError(output.error())); + return; + } + EncodableList wrapped; + wrapped.push_back( + EncodableValue(std::move(output).TakeValue())); + reply(EncodableValue(std::move(wrapped))); + }); + } catch (const std::exception& exception) { + reply(WrapError(exception.what())); + } + }); + } else { + channel->SetMessageHandler(nullptr); + } + } + { + auto channel = std::make_unique>( + binary_messenger, + "dev.flutter.pigeon.firebase_storage_platform_interface." + "FirebaseStorageHostApi.referenceDownloadFile", + &GetCodec()); + if (api != nullptr) { + channel->SetMessageHandler( + [api](const EncodableValue& message, + const flutter::MessageReply& reply) { + try { + const auto& args = std::get(message); + const auto& encodable_app_arg = args.at(0); + if (encodable_app_arg.IsNull()) { + reply(WrapError("app_arg unexpectedly null.")); + return; + } + const auto& app_arg = + std::any_cast( + std::get(encodable_app_arg)); + const auto& encodable_reference_arg = args.at(1); + if (encodable_reference_arg.IsNull()) { + reply(WrapError("reference_arg unexpectedly null.")); + return; + } + const auto& reference_arg = + std::any_cast( + std::get(encodable_reference_arg)); + const auto& encodable_file_path_arg = args.at(2); + if (encodable_file_path_arg.IsNull()) { + reply(WrapError("file_path_arg unexpectedly null.")); + return; + } + const auto& file_path_arg = + std::get(encodable_file_path_arg); + const auto& encodable_handle_arg = args.at(3); + if (encodable_handle_arg.IsNull()) { + reply(WrapError("handle_arg unexpectedly null.")); + return; + } + const int64_t handle_arg = encodable_handle_arg.LongValue(); + api->ReferenceDownloadFile( + app_arg, reference_arg, file_path_arg, handle_arg, + [reply](ErrorOr&& output) { + if (output.has_error()) { + reply(WrapError(output.error())); + return; + } + EncodableList wrapped; + wrapped.push_back( + EncodableValue(std::move(output).TakeValue())); + reply(EncodableValue(std::move(wrapped))); + }); + } catch (const std::exception& exception) { + reply(WrapError(exception.what())); + } + }); + } else { + channel->SetMessageHandler(nullptr); + } + } + { + auto channel = std::make_unique>( + binary_messenger, + "dev.flutter.pigeon.firebase_storage_platform_interface." + "FirebaseStorageHostApi.referenceUpdateMetadata", + &GetCodec()); + if (api != nullptr) { + channel->SetMessageHandler( + [api](const EncodableValue& message, + const flutter::MessageReply& reply) { + try { + const auto& args = std::get(message); + const auto& encodable_app_arg = args.at(0); + if (encodable_app_arg.IsNull()) { + reply(WrapError("app_arg unexpectedly null.")); + return; + } + const auto& app_arg = + std::any_cast( + std::get(encodable_app_arg)); + const auto& encodable_reference_arg = args.at(1); + if (encodable_reference_arg.IsNull()) { + reply(WrapError("reference_arg unexpectedly null.")); + return; + } + const auto& reference_arg = + std::any_cast( + std::get(encodable_reference_arg)); + const auto& encodable_metadata_arg = args.at(2); + if (encodable_metadata_arg.IsNull()) { + reply(WrapError("metadata_arg unexpectedly null.")); + return; + } + const auto& metadata_arg = + std::any_cast( + std::get(encodable_metadata_arg)); + api->ReferenceUpdateMetadata( + app_arg, reference_arg, metadata_arg, + [reply](ErrorOr&& output) { + if (output.has_error()) { + reply(WrapError(output.error())); + return; + } + EncodableList wrapped; + wrapped.push_back( + CustomEncodableValue(std::move(output).TakeValue())); + reply(EncodableValue(std::move(wrapped))); + }); + } catch (const std::exception& exception) { + reply(WrapError(exception.what())); + } + }); + } else { + channel->SetMessageHandler(nullptr); + } + } + { + auto channel = std::make_unique>( + binary_messenger, + "dev.flutter.pigeon.firebase_storage_platform_interface." + "FirebaseStorageHostApi.taskPause", + &GetCodec()); + if (api != nullptr) { + channel->SetMessageHandler( + [api](const EncodableValue& message, + const flutter::MessageReply& reply) { + try { + const auto& args = std::get(message); + const auto& encodable_app_arg = args.at(0); + if (encodable_app_arg.IsNull()) { + reply(WrapError("app_arg unexpectedly null.")); + return; + } + const auto& app_arg = + std::any_cast( + std::get(encodable_app_arg)); + const auto& encodable_handle_arg = args.at(1); + if (encodable_handle_arg.IsNull()) { + reply(WrapError("handle_arg unexpectedly null.")); + return; + } + const int64_t handle_arg = encodable_handle_arg.LongValue(); + api->TaskPause( + app_arg, handle_arg, [reply](ErrorOr&& output) { + if (output.has_error()) { + reply(WrapError(output.error())); + return; + } + EncodableList wrapped; + wrapped.push_back( + EncodableValue(std::move(output).TakeValue())); + reply(EncodableValue(std::move(wrapped))); + }); + } catch (const std::exception& exception) { + reply(WrapError(exception.what())); + } + }); + } else { + channel->SetMessageHandler(nullptr); + } + } + { + auto channel = std::make_unique>( + binary_messenger, + "dev.flutter.pigeon.firebase_storage_platform_interface." + "FirebaseStorageHostApi.taskResume", + &GetCodec()); + if (api != nullptr) { + channel->SetMessageHandler( + [api](const EncodableValue& message, + const flutter::MessageReply& reply) { + try { + const auto& args = std::get(message); + const auto& encodable_app_arg = args.at(0); + if (encodable_app_arg.IsNull()) { + reply(WrapError("app_arg unexpectedly null.")); + return; + } + const auto& app_arg = + std::any_cast( + std::get(encodable_app_arg)); + const auto& encodable_handle_arg = args.at(1); + if (encodable_handle_arg.IsNull()) { + reply(WrapError("handle_arg unexpectedly null.")); + return; + } + const int64_t handle_arg = encodable_handle_arg.LongValue(); + api->TaskResume( + app_arg, handle_arg, [reply](ErrorOr&& output) { + if (output.has_error()) { + reply(WrapError(output.error())); + return; + } + EncodableList wrapped; + wrapped.push_back( + EncodableValue(std::move(output).TakeValue())); + reply(EncodableValue(std::move(wrapped))); + }); + } catch (const std::exception& exception) { + reply(WrapError(exception.what())); + } + }); + } else { + channel->SetMessageHandler(nullptr); + } + } + { + auto channel = std::make_unique>( + binary_messenger, + "dev.flutter.pigeon.firebase_storage_platform_interface." + "FirebaseStorageHostApi.taskCancel", + &GetCodec()); + if (api != nullptr) { + channel->SetMessageHandler( + [api](const EncodableValue& message, + const flutter::MessageReply& reply) { + try { + const auto& args = std::get(message); + const auto& encodable_app_arg = args.at(0); + if (encodable_app_arg.IsNull()) { + reply(WrapError("app_arg unexpectedly null.")); + return; + } + const auto& app_arg = + std::any_cast( + std::get(encodable_app_arg)); + const auto& encodable_handle_arg = args.at(1); + if (encodable_handle_arg.IsNull()) { + reply(WrapError("handle_arg unexpectedly null.")); + return; + } + const int64_t handle_arg = encodable_handle_arg.LongValue(); + api->TaskCancel( + app_arg, handle_arg, [reply](ErrorOr&& output) { + if (output.has_error()) { + reply(WrapError(output.error())); + return; + } + EncodableList wrapped; + wrapped.push_back( + EncodableValue(std::move(output).TakeValue())); + reply(EncodableValue(std::move(wrapped))); + }); + } catch (const std::exception& exception) { + reply(WrapError(exception.what())); + } + }); + } else { + channel->SetMessageHandler(nullptr); + } + } +} + +EncodableValue FirebaseStorageHostApi::WrapError( + std::string_view error_message) { + return EncodableValue( + EncodableList{EncodableValue(std::string(error_message)), + EncodableValue("Error"), EncodableValue()}); +} + +EncodableValue FirebaseStorageHostApi::WrapError(const FlutterError& error) { + return EncodableValue(EncodableList{EncodableValue(error.code()), + EncodableValue(error.message()), + error.details()}); +} + +} // namespace firebase_storage_windows diff --git a/packages/firebase_storage/firebase_storage/windows/messages.g.h b/packages/firebase_storage/firebase_storage/windows/messages.g.h new file mode 100644 index 000000000000..c9ed028695dd --- /dev/null +++ b/packages/firebase_storage/firebase_storage/windows/messages.g.h @@ -0,0 +1,403 @@ +// Autogenerated from Pigeon (v11.0.1), do not edit directly. +// See also: https://pub.dev/packages/pigeon + +#ifndef PIGEON_MESSAGES_G_H_ +#define PIGEON_MESSAGES_G_H_ +#include +#include +#include +#include + +#include +#include +#include + +namespace firebase_storage_windows { + +// Generated class from Pigeon. + +class FlutterError { + public: + explicit FlutterError(const std::string& code) : code_(code) {} + explicit FlutterError(const std::string& code, const std::string& message) + : code_(code), message_(message) {} + explicit FlutterError(const std::string& code, const std::string& message, + const flutter::EncodableValue& details) + : code_(code), message_(message), details_(details) {} + + const std::string& code() const { return code_; } + const std::string& message() const { return message_; } + const flutter::EncodableValue& details() const { return details_; } + + private: + std::string code_; + std::string message_; + flutter::EncodableValue details_; +}; + +template +class ErrorOr { + public: + ErrorOr(const T& rhs) : v_(rhs) {} + ErrorOr(const T&& rhs) : v_(std::move(rhs)) {} + ErrorOr(const FlutterError& rhs) : v_(rhs) {} + ErrorOr(const FlutterError&& rhs) : v_(std::move(rhs)) {} + + bool has_error() const { return std::holds_alternative(v_); } + const T& value() const { return std::get(v_); }; + const FlutterError& error() const { return std::get(v_); }; + + private: + friend class FirebaseStorageHostApi; + ErrorOr() = default; + T TakeValue() && { return std::get(std::move(v_)); } + + std::variant v_; +}; + +// The type of operation that generated the action code from calling +// [TaskState]. +enum class PigeonStorageTaskState { + // Indicates the task has been paused by the user. + paused = 0, + // Indicates the task is currently in-progress. + running = 1, + // Indicates the task has successfully completed. + success = 2, + // Indicates the task was canceled. + canceled = 3, + // Indicates the task failed with an error. + error = 4 +}; + +// Generated class from Pigeon that represents data sent in messages. +class PigeonStorageFirebaseApp { + public: + // Constructs an object setting all non-nullable fields. + explicit PigeonStorageFirebaseApp(const std::string& app_name); + + // Constructs an object setting all fields. + explicit PigeonStorageFirebaseApp(const std::string& app_name, + const std::string* tenant_id); + + const std::string& app_name() const; + void set_app_name(std::string_view value_arg); + + const std::string* tenant_id() const; + void set_tenant_id(const std::string_view* value_arg); + void set_tenant_id(std::string_view value_arg); + + private: + static PigeonStorageFirebaseApp FromEncodableList( + const flutter::EncodableList& list); + flutter::EncodableList ToEncodableList() const; + friend class FirebaseStorageHostApi; + friend class FirebaseStorageHostApiCodecSerializer; + std::string app_name_; + std::optional tenant_id_; +}; + +// Generated class from Pigeon that represents data sent in messages. +class PigeonStorageReference { + public: + // Constructs an object setting all fields. + explicit PigeonStorageReference(const std::string& bucket, + const std::string& full_path, + const std::string& name); + + const std::string& bucket() const; + void set_bucket(std::string_view value_arg); + + const std::string& full_path() const; + void set_full_path(std::string_view value_arg); + + const std::string& name() const; + void set_name(std::string_view value_arg); + + private: + static PigeonStorageReference FromEncodableList( + const flutter::EncodableList& list); + flutter::EncodableList ToEncodableList() const; + friend class FirebaseStorageHostApi; + friend class FirebaseStorageHostApiCodecSerializer; + std::string bucket_; + std::string full_path_; + std::string name_; +}; + +// Generated class from Pigeon that represents data sent in messages. +class PigeonFullMetaData { + public: + // Constructs an object setting all non-nullable fields. + PigeonFullMetaData(); + + // Constructs an object setting all fields. + explicit PigeonFullMetaData(const flutter::EncodableMap* metadata); + + const flutter::EncodableMap* metadata() const; + void set_metadata(const flutter::EncodableMap* value_arg); + void set_metadata(const flutter::EncodableMap& value_arg); + + private: + static PigeonFullMetaData FromEncodableList( + const flutter::EncodableList& list); + flutter::EncodableList ToEncodableList() const; + friend class FirebaseStorageHostApi; + friend class FirebaseStorageHostApiCodecSerializer; + std::optional metadata_; +}; + +// Generated class from Pigeon that represents data sent in messages. +class PigeonListOptions { + public: + // Constructs an object setting all non-nullable fields. + PigeonListOptions(); + + // Constructs an object setting all fields. + explicit PigeonListOptions(const int64_t* max_results, + const std::string* page_token); + + // If set, limits the total number of `prefixes` and `items` to return. + // + // The default and maximum maxResults is 1000. + const int64_t* max_results() const; + void set_max_results(const int64_t* value_arg); + void set_max_results(int64_t value_arg); + + // The nextPageToken from a previous call to list(). + // + // If provided, listing is resumed from the previous position. + const std::string* page_token() const; + void set_page_token(const std::string_view* value_arg); + void set_page_token(std::string_view value_arg); + + private: + static PigeonListOptions FromEncodableList( + const flutter::EncodableList& list); + flutter::EncodableList ToEncodableList() const; + friend class FirebaseStorageHostApi; + friend class FirebaseStorageHostApiCodecSerializer; + std::optional max_results_; + std::optional page_token_; +}; + +// Generated class from Pigeon that represents data sent in messages. +class PigeonSettableMetadata { + public: + // Constructs an object setting all non-nullable fields. + PigeonSettableMetadata(); + + // Constructs an object setting all fields. + explicit PigeonSettableMetadata(const std::string* cache_control, + const std::string* content_disposition, + const std::string* content_encoding, + const std::string* content_language, + const std::string* content_type, + const flutter::EncodableMap* custom_metadata); + + // Served as the 'Cache-Control' header on object download. + // + // See + // https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Cache-Control. + const std::string* cache_control() const; + void set_cache_control(const std::string_view* value_arg); + void set_cache_control(std::string_view value_arg); + + // Served as the 'Content-Disposition' header on object download. + // + // See + // https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Disposition. + const std::string* content_disposition() const; + void set_content_disposition(const std::string_view* value_arg); + void set_content_disposition(std::string_view value_arg); + + // Served as the 'Content-Encoding' header on object download. + // + // See + // https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Encoding. + const std::string* content_encoding() const; + void set_content_encoding(const std::string_view* value_arg); + void set_content_encoding(std::string_view value_arg); + + // Served as the 'Content-Language' header on object download. + // + // See + // https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Language. + const std::string* content_language() const; + void set_content_language(const std::string_view* value_arg); + void set_content_language(std::string_view value_arg); + + // Served as the 'Content-Type' header on object download. + // + // See https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Type. + const std::string* content_type() const; + void set_content_type(const std::string_view* value_arg); + void set_content_type(std::string_view value_arg); + + // Additional user-defined custom metadata. + const flutter::EncodableMap* custom_metadata() const; + void set_custom_metadata(const flutter::EncodableMap* value_arg); + void set_custom_metadata(const flutter::EncodableMap& value_arg); + + private: + static PigeonSettableMetadata FromEncodableList( + const flutter::EncodableList& list); + flutter::EncodableList ToEncodableList() const; + friend class FirebaseStorageHostApi; + friend class FirebaseStorageHostApiCodecSerializer; + std::optional cache_control_; + std::optional content_disposition_; + std::optional content_encoding_; + std::optional content_language_; + std::optional content_type_; + std::optional custom_metadata_; +}; + +// Generated class from Pigeon that represents data sent in messages. +class PigeonListResult { + public: + // Constructs an object setting all non-nullable fields. + explicit PigeonListResult(const flutter::EncodableList& items, + const flutter::EncodableList& prefixs); + + // Constructs an object setting all fields. + explicit PigeonListResult(const flutter::EncodableList& items, + const std::string* page_token, + const flutter::EncodableList& prefixs); + + const flutter::EncodableList& items() const; + void set_items(const flutter::EncodableList& value_arg); + + const std::string* page_token() const; + void set_page_token(const std::string_view* value_arg); + void set_page_token(std::string_view value_arg); + + const flutter::EncodableList& prefixs() const; + void set_prefixs(const flutter::EncodableList& value_arg); + + private: + static PigeonListResult FromEncodableList(const flutter::EncodableList& list); + flutter::EncodableList ToEncodableList() const; + friend class FirebaseStorageHostApi; + friend class FirebaseStorageHostApiCodecSerializer; + flutter::EncodableList items_; + std::optional page_token_; + flutter::EncodableList prefixs_; +}; + +class FirebaseStorageHostApiCodecSerializer + : public flutter::StandardCodecSerializer { + public: + FirebaseStorageHostApiCodecSerializer(); + inline static FirebaseStorageHostApiCodecSerializer& GetInstance() { + static FirebaseStorageHostApiCodecSerializer sInstance; + return sInstance; + } + + void WriteValue(const flutter::EncodableValue& value, + flutter::ByteStreamWriter* stream) const override; + + protected: + flutter::EncodableValue ReadValueOfType( + uint8_t type, flutter::ByteStreamReader* stream) const override; +}; + +// Generated interface from Pigeon that represents a handler of messages from +// Flutter. +class FirebaseStorageHostApi { + public: + FirebaseStorageHostApi(const FirebaseStorageHostApi&) = delete; + FirebaseStorageHostApi& operator=(const FirebaseStorageHostApi&) = delete; + virtual ~FirebaseStorageHostApi() {} + virtual void GetReferencebyPath( + const PigeonStorageFirebaseApp& app, const std::string& path, + const std::string* bucket, + std::function reply)> result) = 0; + virtual void SetMaxOperationRetryTime( + const PigeonStorageFirebaseApp& app, int64_t time, + std::function reply)> result) = 0; + virtual void SetMaxUploadRetryTime( + const PigeonStorageFirebaseApp& app, int64_t time, + std::function reply)> result) = 0; + virtual void SetMaxDownloadRetryTime( + const PigeonStorageFirebaseApp& app, int64_t time, + std::function reply)> result) = 0; + virtual void UseStorageEmulator( + const PigeonStorageFirebaseApp& app, const std::string& host, + int64_t port, + std::function reply)> result) = 0; + virtual void ReferenceDelete( + const PigeonStorageFirebaseApp& app, + const PigeonStorageReference& reference, + std::function reply)> result) = 0; + virtual void ReferenceGetDownloadURL( + const PigeonStorageFirebaseApp& app, + const PigeonStorageReference& reference, + std::function reply)> result) = 0; + virtual void ReferenceGetMetaData( + const PigeonStorageFirebaseApp& app, + const PigeonStorageReference& reference, + std::function reply)> result) = 0; + virtual void ReferenceList( + const PigeonStorageFirebaseApp& app, + const PigeonStorageReference& reference, const PigeonListOptions& options, + std::function reply)> result) = 0; + virtual void ReferenceListAll( + const PigeonStorageFirebaseApp& app, + const PigeonStorageReference& reference, + std::function reply)> result) = 0; + virtual void ReferenceGetData( + const PigeonStorageFirebaseApp& app, + const PigeonStorageReference& reference, int64_t max_size, + std::function>> reply)> + result) = 0; + virtual void ReferencePutData( + const PigeonStorageFirebaseApp& app, + const PigeonStorageReference& reference, const std::vector& data, + const PigeonSettableMetadata& settable_meta_data, int64_t handle, + std::function reply)> result) = 0; + virtual void ReferencePutString( + const PigeonStorageFirebaseApp& app, + const PigeonStorageReference& reference, const std::string& data, + int64_t format, const PigeonSettableMetadata& settable_meta_data, + int64_t handle, + std::function reply)> result) = 0; + virtual void ReferencePutFile( + const PigeonStorageFirebaseApp& app, + const PigeonStorageReference& reference, const std::string& file_path, + const PigeonSettableMetadata& settable_meta_data, int64_t handle, + std::function reply)> result) = 0; + virtual void ReferenceDownloadFile( + const PigeonStorageFirebaseApp& app, + const PigeonStorageReference& reference, const std::string& file_path, + int64_t handle, + std::function reply)> result) = 0; + virtual void ReferenceUpdateMetadata( + const PigeonStorageFirebaseApp& app, + const PigeonStorageReference& reference, + const PigeonSettableMetadata& metadata, + std::function reply)> result) = 0; + virtual void TaskPause( + const PigeonStorageFirebaseApp& app, int64_t handle, + std::function reply)> result) = 0; + virtual void TaskResume( + const PigeonStorageFirebaseApp& app, int64_t handle, + std::function reply)> result) = 0; + virtual void TaskCancel( + const PigeonStorageFirebaseApp& app, int64_t handle, + std::function reply)> result) = 0; + + // The codec used by FirebaseStorageHostApi. + static const flutter::StandardMessageCodec& GetCodec(); + // Sets up an instance of `FirebaseStorageHostApi` to handle messages through + // the `binary_messenger`. + static void SetUp(flutter::BinaryMessenger* binary_messenger, + FirebaseStorageHostApi* api); + static flutter::EncodableValue WrapError(std::string_view error_message); + static flutter::EncodableValue WrapError(const FlutterError& error); + + protected: + FirebaseStorageHostApi() = default; +}; +} // namespace firebase_storage_windows +#endif // PIGEON_MESSAGES_G_H_ diff --git a/packages/firebase_storage/firebase_storage_platform_interface/lib/src/method_channel/method_channel_task.dart b/packages/firebase_storage/firebase_storage_platform_interface/lib/src/method_channel/method_channel_task.dart index 365a77b46603..d877636f759b 100644 --- a/packages/firebase_storage/firebase_storage_platform_interface/lib/src/method_channel/method_channel_task.dart +++ b/packages/firebase_storage/firebase_storage_platform_interface/lib/src/method_channel/method_channel_task.dart @@ -4,7 +4,6 @@ // BSD-style license that can be found in the LICENSE file. import 'dart:async'; -import 'dart:developer' as developer; import 'dart:io'; import 'package:flutter/services.dart'; @@ -34,10 +33,7 @@ abstract class MethodChannelTask extends TaskPlatform { .receiveBroadcastStream(); try { await for (final events in nativePlatformStream) { - final appName = events['appName']; final taskState = TaskState.values[events['taskState']]; - developer.log( - 'TaskMethodChannel, listen appName: $appName, taskState: $taskState'); if (_snapshot.state != TaskState.canceled) { MethodChannelTaskSnapshot snapshot = MethodChannelTaskSnapshot( diff --git a/packages/firebase_storage/firebase_storage_platform_interface/lib/src/pigeon/messages.pigeon.dart b/packages/firebase_storage/firebase_storage_platform_interface/lib/src/pigeon/messages.pigeon.dart index 56ecc3bac545..bc1c5dd3967d 100644 --- a/packages/firebase_storage/firebase_storage_platform_interface/lib/src/pigeon/messages.pigeon.dart +++ b/packages/firebase_storage/firebase_storage_platform_interface/lib/src/pigeon/messages.pigeon.dart @@ -1,7 +1,7 @@ // 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 (v9.2.5), do not edit directly. +//// Autogenerated from Pigeon (v11.0.1), do not edit directly. // See also: https://pub.dev/packages/pigeon // ignore_for_file: public_member_api_docs, non_constant_identifier_names, avoid_as, unused_import, unnecessary_parenthesis, prefer_null_aware_operators, omit_local_variable_types, unused_shown_name, unnecessary_import @@ -297,7 +297,8 @@ class FirebaseStorageHostApi { String arg_path, String? arg_bucket) async { final BasicMessageChannel channel = BasicMessageChannel( - 'dev.flutter.pigeon.FirebaseStorageHostApi.getReferencebyPath', codec, + 'dev.flutter.pigeon.firebase_storage_platform_interface.FirebaseStorageHostApi.getReferencebyPath', + codec, binaryMessenger: _binaryMessenger); final List? replyList = await channel .send([arg_app, arg_path, arg_bucket]) as List?; @@ -325,7 +326,7 @@ class FirebaseStorageHostApi { Future setMaxOperationRetryTime( PigeonStorageFirebaseApp arg_app, int arg_time) async { final BasicMessageChannel channel = BasicMessageChannel( - 'dev.flutter.pigeon.FirebaseStorageHostApi.setMaxOperationRetryTime', + 'dev.flutter.pigeon.firebase_storage_platform_interface.FirebaseStorageHostApi.setMaxOperationRetryTime', codec, binaryMessenger: _binaryMessenger); final List? replyList = @@ -349,7 +350,7 @@ class FirebaseStorageHostApi { Future setMaxUploadRetryTime( PigeonStorageFirebaseApp arg_app, int arg_time) async { final BasicMessageChannel channel = BasicMessageChannel( - 'dev.flutter.pigeon.FirebaseStorageHostApi.setMaxUploadRetryTime', + 'dev.flutter.pigeon.firebase_storage_platform_interface.FirebaseStorageHostApi.setMaxUploadRetryTime', codec, binaryMessenger: _binaryMessenger); final List? replyList = @@ -373,7 +374,7 @@ class FirebaseStorageHostApi { Future setMaxDownloadRetryTime( PigeonStorageFirebaseApp arg_app, int arg_time) async { final BasicMessageChannel channel = BasicMessageChannel( - 'dev.flutter.pigeon.FirebaseStorageHostApi.setMaxDownloadRetryTime', + 'dev.flutter.pigeon.firebase_storage_platform_interface.FirebaseStorageHostApi.setMaxDownloadRetryTime', codec, binaryMessenger: _binaryMessenger); final List? replyList = @@ -397,7 +398,8 @@ class FirebaseStorageHostApi { Future useStorageEmulator( PigeonStorageFirebaseApp arg_app, String arg_host, int arg_port) async { final BasicMessageChannel channel = BasicMessageChannel( - 'dev.flutter.pigeon.FirebaseStorageHostApi.useStorageEmulator', codec, + 'dev.flutter.pigeon.firebase_storage_platform_interface.FirebaseStorageHostApi.useStorageEmulator', + codec, binaryMessenger: _binaryMessenger); final List? replyList = await channel .send([arg_app, arg_host, arg_port]) as List?; @@ -420,7 +422,8 @@ class FirebaseStorageHostApi { Future referenceDelete(PigeonStorageFirebaseApp arg_app, PigeonStorageReference arg_reference) async { final BasicMessageChannel channel = BasicMessageChannel( - 'dev.flutter.pigeon.FirebaseStorageHostApi.referenceDelete', codec, + 'dev.flutter.pigeon.firebase_storage_platform_interface.FirebaseStorageHostApi.referenceDelete', + codec, binaryMessenger: _binaryMessenger); final List? replyList = await channel.send([arg_app, arg_reference]) as List?; @@ -443,7 +446,7 @@ class FirebaseStorageHostApi { Future referenceGetDownloadURL(PigeonStorageFirebaseApp arg_app, PigeonStorageReference arg_reference) async { final BasicMessageChannel channel = BasicMessageChannel( - 'dev.flutter.pigeon.FirebaseStorageHostApi.referenceGetDownloadURL', + 'dev.flutter.pigeon.firebase_storage_platform_interface.FirebaseStorageHostApi.referenceGetDownloadURL', codec, binaryMessenger: _binaryMessenger); final List? replyList = @@ -473,7 +476,8 @@ class FirebaseStorageHostApi { PigeonStorageFirebaseApp arg_app, PigeonStorageReference arg_reference) async { final BasicMessageChannel channel = BasicMessageChannel( - 'dev.flutter.pigeon.FirebaseStorageHostApi.referenceGetMetaData', codec, + 'dev.flutter.pigeon.firebase_storage_platform_interface.FirebaseStorageHostApi.referenceGetMetaData', + codec, binaryMessenger: _binaryMessenger); final List? replyList = await channel.send([arg_app, arg_reference]) as List?; @@ -503,7 +507,8 @@ class FirebaseStorageHostApi { PigeonStorageReference arg_reference, PigeonListOptions arg_options) async { final BasicMessageChannel channel = BasicMessageChannel( - 'dev.flutter.pigeon.FirebaseStorageHostApi.referenceList', codec, + 'dev.flutter.pigeon.firebase_storage_platform_interface.FirebaseStorageHostApi.referenceList', + codec, binaryMessenger: _binaryMessenger); final List? replyList = await channel .send([arg_app, arg_reference, arg_options]) as List?; @@ -531,7 +536,8 @@ class FirebaseStorageHostApi { Future referenceListAll(PigeonStorageFirebaseApp arg_app, PigeonStorageReference arg_reference) async { final BasicMessageChannel channel = BasicMessageChannel( - 'dev.flutter.pigeon.FirebaseStorageHostApi.referenceListAll', codec, + 'dev.flutter.pigeon.firebase_storage_platform_interface.FirebaseStorageHostApi.referenceListAll', + codec, binaryMessenger: _binaryMessenger); final List? replyList = await channel.send([arg_app, arg_reference]) as List?; @@ -559,7 +565,8 @@ class FirebaseStorageHostApi { Future referenceGetData(PigeonStorageFirebaseApp arg_app, PigeonStorageReference arg_reference, int arg_maxSize) async { final BasicMessageChannel channel = BasicMessageChannel( - 'dev.flutter.pigeon.FirebaseStorageHostApi.referenceGetData', codec, + 'dev.flutter.pigeon.firebase_storage_platform_interface.FirebaseStorageHostApi.referenceGetData', + codec, binaryMessenger: _binaryMessenger); final List? replyList = await channel .send([arg_app, arg_reference, arg_maxSize]) as List?; @@ -586,7 +593,8 @@ class FirebaseStorageHostApi { PigeonSettableMetadata arg_settableMetaData, int arg_handle) async { final BasicMessageChannel channel = BasicMessageChannel( - 'dev.flutter.pigeon.FirebaseStorageHostApi.referencePutData', codec, + 'dev.flutter.pigeon.firebase_storage_platform_interface.FirebaseStorageHostApi.referencePutData', + codec, binaryMessenger: _binaryMessenger); final List? replyList = await channel.send([ arg_app, @@ -624,7 +632,8 @@ class FirebaseStorageHostApi { PigeonSettableMetadata arg_settableMetaData, int arg_handle) async { final BasicMessageChannel channel = BasicMessageChannel( - 'dev.flutter.pigeon.FirebaseStorageHostApi.referencePutString', codec, + 'dev.flutter.pigeon.firebase_storage_platform_interface.FirebaseStorageHostApi.referencePutString', + codec, binaryMessenger: _binaryMessenger); final List? replyList = await channel.send([ arg_app, @@ -662,7 +671,8 @@ class FirebaseStorageHostApi { PigeonSettableMetadata arg_settableMetaData, int arg_handle) async { final BasicMessageChannel channel = BasicMessageChannel( - 'dev.flutter.pigeon.FirebaseStorageHostApi.referencePutFile', codec, + 'dev.flutter.pigeon.firebase_storage_platform_interface.FirebaseStorageHostApi.referencePutFile', + codec, binaryMessenger: _binaryMessenger); final List? replyList = await channel.send([ arg_app, @@ -698,7 +708,7 @@ class FirebaseStorageHostApi { String arg_filePath, int arg_handle) async { final BasicMessageChannel channel = BasicMessageChannel( - 'dev.flutter.pigeon.FirebaseStorageHostApi.referenceDownloadFile', + 'dev.flutter.pigeon.firebase_storage_platform_interface.FirebaseStorageHostApi.referenceDownloadFile', codec, binaryMessenger: _binaryMessenger); final List? replyList = await channel @@ -730,7 +740,7 @@ class FirebaseStorageHostApi { PigeonStorageReference arg_reference, PigeonSettableMetadata arg_metadata) async { final BasicMessageChannel channel = BasicMessageChannel( - 'dev.flutter.pigeon.FirebaseStorageHostApi.referenceUpdateMetadata', + 'dev.flutter.pigeon.firebase_storage_platform_interface.FirebaseStorageHostApi.referenceUpdateMetadata', codec, binaryMessenger: _binaryMessenger); final List? replyList = @@ -760,7 +770,8 @@ class FirebaseStorageHostApi { Future> taskPause( PigeonStorageFirebaseApp arg_app, int arg_handle) async { final BasicMessageChannel channel = BasicMessageChannel( - 'dev.flutter.pigeon.FirebaseStorageHostApi.taskPause', codec, + 'dev.flutter.pigeon.firebase_storage_platform_interface.FirebaseStorageHostApi.taskPause', + codec, binaryMessenger: _binaryMessenger); final List? replyList = await channel.send([arg_app, arg_handle]) as List?; @@ -788,7 +799,8 @@ class FirebaseStorageHostApi { Future> taskResume( PigeonStorageFirebaseApp arg_app, int arg_handle) async { final BasicMessageChannel channel = BasicMessageChannel( - 'dev.flutter.pigeon.FirebaseStorageHostApi.taskResume', codec, + 'dev.flutter.pigeon.firebase_storage_platform_interface.FirebaseStorageHostApi.taskResume', + codec, binaryMessenger: _binaryMessenger); final List? replyList = await channel.send([arg_app, arg_handle]) as List?; @@ -816,7 +828,8 @@ class FirebaseStorageHostApi { Future> taskCancel( PigeonStorageFirebaseApp arg_app, int arg_handle) async { final BasicMessageChannel channel = BasicMessageChannel( - 'dev.flutter.pigeon.FirebaseStorageHostApi.taskCancel', codec, + 'dev.flutter.pigeon.firebase_storage_platform_interface.FirebaseStorageHostApi.taskCancel', + codec, binaryMessenger: _binaryMessenger); final List? replyList = await channel.send([arg_app, arg_handle]) as List?; diff --git a/packages/firebase_storage/firebase_storage_platform_interface/pubspec.yaml b/packages/firebase_storage/firebase_storage_platform_interface/pubspec.yaml index ba5c450e7fb3..e63ffce10a8d 100644 --- a/packages/firebase_storage/firebase_storage_platform_interface/pubspec.yaml +++ b/packages/firebase_storage/firebase_storage_platform_interface/pubspec.yaml @@ -21,4 +21,4 @@ dev_dependencies: flutter_test: sdk: flutter mockito: ^5.0.0 - pigeon: ^9.2.5 + pigeon: 11.0.1 diff --git a/packages/firebase_storage/firebase_storage_platform_interface/test/pigeon/test_api.dart b/packages/firebase_storage/firebase_storage_platform_interface/test/pigeon/test_api.dart index 74373cd4f178..4d8b503ee3b5 100644 --- a/packages/firebase_storage/firebase_storage_platform_interface/test/pigeon/test_api.dart +++ b/packages/firebase_storage/firebase_storage_platform_interface/test/pigeon/test_api.dart @@ -1,7 +1,7 @@ // 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 (v9.2.5), do not edit directly. +//// Autogenerated from Pigeon (v11.0.1), do not edit directly. // See also: https://pub.dev/packages/pigeon // ignore_for_file: public_member_api_docs, non_constant_identifier_names, avoid_as, unused_import, unnecessary_parenthesis, unnecessary_import // ignore_for_file: avoid_relative_lib_imports @@ -139,7 +139,8 @@ abstract class TestFirebaseStorageHostApi { {BinaryMessenger? binaryMessenger}) { { final BasicMessageChannel channel = BasicMessageChannel( - 'dev.flutter.pigeon.FirebaseStorageHostApi.getReferencebyPath', codec, + 'dev.flutter.pigeon.firebase_storage_platform_interface.FirebaseStorageHostApi.getReferencebyPath', + codec, binaryMessenger: binaryMessenger); if (api == null) { _testBinaryMessengerBinding!.defaultBinaryMessenger @@ -149,15 +150,15 @@ abstract class TestFirebaseStorageHostApi { .setMockDecodedMessageHandler(channel, (Object? message) async { assert(message != null, - 'Argument for dev.flutter.pigeon.FirebaseStorageHostApi.getReferencebyPath was null.'); + 'Argument for dev.flutter.pigeon.firebase_storage_platform_interface.FirebaseStorageHostApi.getReferencebyPath was null.'); final List args = (message as List?)!; final PigeonStorageFirebaseApp? arg_app = (args[0] as PigeonStorageFirebaseApp?); assert(arg_app != null, - 'Argument for dev.flutter.pigeon.FirebaseStorageHostApi.getReferencebyPath was null, expected non-null PigeonStorageFirebaseApp.'); + 'Argument for dev.flutter.pigeon.firebase_storage_platform_interface.FirebaseStorageHostApi.getReferencebyPath was null, expected non-null PigeonStorageFirebaseApp.'); final String? arg_path = (args[1] as String?); assert(arg_path != null, - 'Argument for dev.flutter.pigeon.FirebaseStorageHostApi.getReferencebyPath was null, expected non-null String.'); + 'Argument for dev.flutter.pigeon.firebase_storage_platform_interface.FirebaseStorageHostApi.getReferencebyPath was null, expected non-null String.'); final String? arg_bucket = (args[2] as String?); final PigeonStorageReference output = await api.getReferencebyPath(arg_app!, arg_path!, arg_bucket); @@ -167,7 +168,7 @@ abstract class TestFirebaseStorageHostApi { } { final BasicMessageChannel channel = BasicMessageChannel( - 'dev.flutter.pigeon.FirebaseStorageHostApi.setMaxOperationRetryTime', + 'dev.flutter.pigeon.firebase_storage_platform_interface.FirebaseStorageHostApi.setMaxOperationRetryTime', codec, binaryMessenger: binaryMessenger); if (api == null) { @@ -178,15 +179,15 @@ abstract class TestFirebaseStorageHostApi { .setMockDecodedMessageHandler(channel, (Object? message) async { assert(message != null, - 'Argument for dev.flutter.pigeon.FirebaseStorageHostApi.setMaxOperationRetryTime was null.'); + 'Argument for dev.flutter.pigeon.firebase_storage_platform_interface.FirebaseStorageHostApi.setMaxOperationRetryTime was null.'); final List args = (message as List?)!; final PigeonStorageFirebaseApp? arg_app = (args[0] as PigeonStorageFirebaseApp?); assert(arg_app != null, - 'Argument for dev.flutter.pigeon.FirebaseStorageHostApi.setMaxOperationRetryTime was null, expected non-null PigeonStorageFirebaseApp.'); + 'Argument for dev.flutter.pigeon.firebase_storage_platform_interface.FirebaseStorageHostApi.setMaxOperationRetryTime was null, expected non-null PigeonStorageFirebaseApp.'); final int? arg_time = (args[1] as int?); assert(arg_time != null, - 'Argument for dev.flutter.pigeon.FirebaseStorageHostApi.setMaxOperationRetryTime was null, expected non-null int.'); + 'Argument for dev.flutter.pigeon.firebase_storage_platform_interface.FirebaseStorageHostApi.setMaxOperationRetryTime was null, expected non-null int.'); await api.setMaxOperationRetryTime(arg_app!, arg_time!); return []; }); @@ -194,7 +195,7 @@ abstract class TestFirebaseStorageHostApi { } { final BasicMessageChannel channel = BasicMessageChannel( - 'dev.flutter.pigeon.FirebaseStorageHostApi.setMaxUploadRetryTime', + 'dev.flutter.pigeon.firebase_storage_platform_interface.FirebaseStorageHostApi.setMaxUploadRetryTime', codec, binaryMessenger: binaryMessenger); if (api == null) { @@ -205,15 +206,15 @@ abstract class TestFirebaseStorageHostApi { .setMockDecodedMessageHandler(channel, (Object? message) async { assert(message != null, - 'Argument for dev.flutter.pigeon.FirebaseStorageHostApi.setMaxUploadRetryTime was null.'); + 'Argument for dev.flutter.pigeon.firebase_storage_platform_interface.FirebaseStorageHostApi.setMaxUploadRetryTime was null.'); final List args = (message as List?)!; final PigeonStorageFirebaseApp? arg_app = (args[0] as PigeonStorageFirebaseApp?); assert(arg_app != null, - 'Argument for dev.flutter.pigeon.FirebaseStorageHostApi.setMaxUploadRetryTime was null, expected non-null PigeonStorageFirebaseApp.'); + 'Argument for dev.flutter.pigeon.firebase_storage_platform_interface.FirebaseStorageHostApi.setMaxUploadRetryTime was null, expected non-null PigeonStorageFirebaseApp.'); final int? arg_time = (args[1] as int?); assert(arg_time != null, - 'Argument for dev.flutter.pigeon.FirebaseStorageHostApi.setMaxUploadRetryTime was null, expected non-null int.'); + 'Argument for dev.flutter.pigeon.firebase_storage_platform_interface.FirebaseStorageHostApi.setMaxUploadRetryTime was null, expected non-null int.'); await api.setMaxUploadRetryTime(arg_app!, arg_time!); return []; }); @@ -221,7 +222,7 @@ abstract class TestFirebaseStorageHostApi { } { final BasicMessageChannel channel = BasicMessageChannel( - 'dev.flutter.pigeon.FirebaseStorageHostApi.setMaxDownloadRetryTime', + 'dev.flutter.pigeon.firebase_storage_platform_interface.FirebaseStorageHostApi.setMaxDownloadRetryTime', codec, binaryMessenger: binaryMessenger); if (api == null) { @@ -232,15 +233,15 @@ abstract class TestFirebaseStorageHostApi { .setMockDecodedMessageHandler(channel, (Object? message) async { assert(message != null, - 'Argument for dev.flutter.pigeon.FirebaseStorageHostApi.setMaxDownloadRetryTime was null.'); + 'Argument for dev.flutter.pigeon.firebase_storage_platform_interface.FirebaseStorageHostApi.setMaxDownloadRetryTime was null.'); final List args = (message as List?)!; final PigeonStorageFirebaseApp? arg_app = (args[0] as PigeonStorageFirebaseApp?); assert(arg_app != null, - 'Argument for dev.flutter.pigeon.FirebaseStorageHostApi.setMaxDownloadRetryTime was null, expected non-null PigeonStorageFirebaseApp.'); + 'Argument for dev.flutter.pigeon.firebase_storage_platform_interface.FirebaseStorageHostApi.setMaxDownloadRetryTime was null, expected non-null PigeonStorageFirebaseApp.'); final int? arg_time = (args[1] as int?); assert(arg_time != null, - 'Argument for dev.flutter.pigeon.FirebaseStorageHostApi.setMaxDownloadRetryTime was null, expected non-null int.'); + 'Argument for dev.flutter.pigeon.firebase_storage_platform_interface.FirebaseStorageHostApi.setMaxDownloadRetryTime was null, expected non-null int.'); await api.setMaxDownloadRetryTime(arg_app!, arg_time!); return []; }); @@ -248,7 +249,8 @@ abstract class TestFirebaseStorageHostApi { } { final BasicMessageChannel channel = BasicMessageChannel( - 'dev.flutter.pigeon.FirebaseStorageHostApi.useStorageEmulator', codec, + 'dev.flutter.pigeon.firebase_storage_platform_interface.FirebaseStorageHostApi.useStorageEmulator', + codec, binaryMessenger: binaryMessenger); if (api == null) { _testBinaryMessengerBinding!.defaultBinaryMessenger @@ -258,18 +260,18 @@ abstract class TestFirebaseStorageHostApi { .setMockDecodedMessageHandler(channel, (Object? message) async { assert(message != null, - 'Argument for dev.flutter.pigeon.FirebaseStorageHostApi.useStorageEmulator was null.'); + 'Argument for dev.flutter.pigeon.firebase_storage_platform_interface.FirebaseStorageHostApi.useStorageEmulator was null.'); final List args = (message as List?)!; final PigeonStorageFirebaseApp? arg_app = (args[0] as PigeonStorageFirebaseApp?); assert(arg_app != null, - 'Argument for dev.flutter.pigeon.FirebaseStorageHostApi.useStorageEmulator was null, expected non-null PigeonStorageFirebaseApp.'); + 'Argument for dev.flutter.pigeon.firebase_storage_platform_interface.FirebaseStorageHostApi.useStorageEmulator was null, expected non-null PigeonStorageFirebaseApp.'); final String? arg_host = (args[1] as String?); assert(arg_host != null, - 'Argument for dev.flutter.pigeon.FirebaseStorageHostApi.useStorageEmulator was null, expected non-null String.'); + 'Argument for dev.flutter.pigeon.firebase_storage_platform_interface.FirebaseStorageHostApi.useStorageEmulator was null, expected non-null String.'); final int? arg_port = (args[2] as int?); assert(arg_port != null, - 'Argument for dev.flutter.pigeon.FirebaseStorageHostApi.useStorageEmulator was null, expected non-null int.'); + 'Argument for dev.flutter.pigeon.firebase_storage_platform_interface.FirebaseStorageHostApi.useStorageEmulator was null, expected non-null int.'); await api.useStorageEmulator(arg_app!, arg_host!, arg_port!); return []; }); @@ -277,7 +279,8 @@ abstract class TestFirebaseStorageHostApi { } { final BasicMessageChannel channel = BasicMessageChannel( - 'dev.flutter.pigeon.FirebaseStorageHostApi.referenceDelete', codec, + 'dev.flutter.pigeon.firebase_storage_platform_interface.FirebaseStorageHostApi.referenceDelete', + codec, binaryMessenger: binaryMessenger); if (api == null) { _testBinaryMessengerBinding!.defaultBinaryMessenger @@ -287,16 +290,16 @@ abstract class TestFirebaseStorageHostApi { .setMockDecodedMessageHandler(channel, (Object? message) async { assert(message != null, - 'Argument for dev.flutter.pigeon.FirebaseStorageHostApi.referenceDelete was null.'); + 'Argument for dev.flutter.pigeon.firebase_storage_platform_interface.FirebaseStorageHostApi.referenceDelete was null.'); final List args = (message as List?)!; final PigeonStorageFirebaseApp? arg_app = (args[0] as PigeonStorageFirebaseApp?); assert(arg_app != null, - 'Argument for dev.flutter.pigeon.FirebaseStorageHostApi.referenceDelete was null, expected non-null PigeonStorageFirebaseApp.'); + 'Argument for dev.flutter.pigeon.firebase_storage_platform_interface.FirebaseStorageHostApi.referenceDelete was null, expected non-null PigeonStorageFirebaseApp.'); final PigeonStorageReference? arg_reference = (args[1] as PigeonStorageReference?); assert(arg_reference != null, - 'Argument for dev.flutter.pigeon.FirebaseStorageHostApi.referenceDelete was null, expected non-null PigeonStorageReference.'); + 'Argument for dev.flutter.pigeon.firebase_storage_platform_interface.FirebaseStorageHostApi.referenceDelete was null, expected non-null PigeonStorageReference.'); await api.referenceDelete(arg_app!, arg_reference!); return []; }); @@ -304,7 +307,7 @@ abstract class TestFirebaseStorageHostApi { } { final BasicMessageChannel channel = BasicMessageChannel( - 'dev.flutter.pigeon.FirebaseStorageHostApi.referenceGetDownloadURL', + 'dev.flutter.pigeon.firebase_storage_platform_interface.FirebaseStorageHostApi.referenceGetDownloadURL', codec, binaryMessenger: binaryMessenger); if (api == null) { @@ -315,16 +318,16 @@ abstract class TestFirebaseStorageHostApi { .setMockDecodedMessageHandler(channel, (Object? message) async { assert(message != null, - 'Argument for dev.flutter.pigeon.FirebaseStorageHostApi.referenceGetDownloadURL was null.'); + 'Argument for dev.flutter.pigeon.firebase_storage_platform_interface.FirebaseStorageHostApi.referenceGetDownloadURL was null.'); final List args = (message as List?)!; final PigeonStorageFirebaseApp? arg_app = (args[0] as PigeonStorageFirebaseApp?); assert(arg_app != null, - 'Argument for dev.flutter.pigeon.FirebaseStorageHostApi.referenceGetDownloadURL was null, expected non-null PigeonStorageFirebaseApp.'); + 'Argument for dev.flutter.pigeon.firebase_storage_platform_interface.FirebaseStorageHostApi.referenceGetDownloadURL was null, expected non-null PigeonStorageFirebaseApp.'); final PigeonStorageReference? arg_reference = (args[1] as PigeonStorageReference?); assert(arg_reference != null, - 'Argument for dev.flutter.pigeon.FirebaseStorageHostApi.referenceGetDownloadURL was null, expected non-null PigeonStorageReference.'); + 'Argument for dev.flutter.pigeon.firebase_storage_platform_interface.FirebaseStorageHostApi.referenceGetDownloadURL was null, expected non-null PigeonStorageReference.'); final String output = await api.referenceGetDownloadURL(arg_app!, arg_reference!); return [output]; @@ -333,7 +336,7 @@ abstract class TestFirebaseStorageHostApi { } { final BasicMessageChannel channel = BasicMessageChannel( - 'dev.flutter.pigeon.FirebaseStorageHostApi.referenceGetMetaData', + 'dev.flutter.pigeon.firebase_storage_platform_interface.FirebaseStorageHostApi.referenceGetMetaData', codec, binaryMessenger: binaryMessenger); if (api == null) { @@ -344,16 +347,16 @@ abstract class TestFirebaseStorageHostApi { .setMockDecodedMessageHandler(channel, (Object? message) async { assert(message != null, - 'Argument for dev.flutter.pigeon.FirebaseStorageHostApi.referenceGetMetaData was null.'); + 'Argument for dev.flutter.pigeon.firebase_storage_platform_interface.FirebaseStorageHostApi.referenceGetMetaData was null.'); final List args = (message as List?)!; final PigeonStorageFirebaseApp? arg_app = (args[0] as PigeonStorageFirebaseApp?); assert(arg_app != null, - 'Argument for dev.flutter.pigeon.FirebaseStorageHostApi.referenceGetMetaData was null, expected non-null PigeonStorageFirebaseApp.'); + 'Argument for dev.flutter.pigeon.firebase_storage_platform_interface.FirebaseStorageHostApi.referenceGetMetaData was null, expected non-null PigeonStorageFirebaseApp.'); final PigeonStorageReference? arg_reference = (args[1] as PigeonStorageReference?); assert(arg_reference != null, - 'Argument for dev.flutter.pigeon.FirebaseStorageHostApi.referenceGetMetaData was null, expected non-null PigeonStorageReference.'); + 'Argument for dev.flutter.pigeon.firebase_storage_platform_interface.FirebaseStorageHostApi.referenceGetMetaData was null, expected non-null PigeonStorageReference.'); final PigeonFullMetaData output = await api.referenceGetMetaData(arg_app!, arg_reference!); return [output]; @@ -362,7 +365,8 @@ abstract class TestFirebaseStorageHostApi { } { final BasicMessageChannel channel = BasicMessageChannel( - 'dev.flutter.pigeon.FirebaseStorageHostApi.referenceList', codec, + 'dev.flutter.pigeon.firebase_storage_platform_interface.FirebaseStorageHostApi.referenceList', + codec, binaryMessenger: binaryMessenger); if (api == null) { _testBinaryMessengerBinding!.defaultBinaryMessenger @@ -372,20 +376,20 @@ abstract class TestFirebaseStorageHostApi { .setMockDecodedMessageHandler(channel, (Object? message) async { assert(message != null, - 'Argument for dev.flutter.pigeon.FirebaseStorageHostApi.referenceList was null.'); + 'Argument for dev.flutter.pigeon.firebase_storage_platform_interface.FirebaseStorageHostApi.referenceList was null.'); final List args = (message as List?)!; final PigeonStorageFirebaseApp? arg_app = (args[0] as PigeonStorageFirebaseApp?); assert(arg_app != null, - 'Argument for dev.flutter.pigeon.FirebaseStorageHostApi.referenceList was null, expected non-null PigeonStorageFirebaseApp.'); + 'Argument for dev.flutter.pigeon.firebase_storage_platform_interface.FirebaseStorageHostApi.referenceList was null, expected non-null PigeonStorageFirebaseApp.'); final PigeonStorageReference? arg_reference = (args[1] as PigeonStorageReference?); assert(arg_reference != null, - 'Argument for dev.flutter.pigeon.FirebaseStorageHostApi.referenceList was null, expected non-null PigeonStorageReference.'); + 'Argument for dev.flutter.pigeon.firebase_storage_platform_interface.FirebaseStorageHostApi.referenceList was null, expected non-null PigeonStorageReference.'); final PigeonListOptions? arg_options = (args[2] as PigeonListOptions?); assert(arg_options != null, - 'Argument for dev.flutter.pigeon.FirebaseStorageHostApi.referenceList was null, expected non-null PigeonListOptions.'); + 'Argument for dev.flutter.pigeon.firebase_storage_platform_interface.FirebaseStorageHostApi.referenceList was null, expected non-null PigeonListOptions.'); final PigeonListResult output = await api.referenceList(arg_app!, arg_reference!, arg_options!); return [output]; @@ -394,7 +398,8 @@ abstract class TestFirebaseStorageHostApi { } { final BasicMessageChannel channel = BasicMessageChannel( - 'dev.flutter.pigeon.FirebaseStorageHostApi.referenceListAll', codec, + 'dev.flutter.pigeon.firebase_storage_platform_interface.FirebaseStorageHostApi.referenceListAll', + codec, binaryMessenger: binaryMessenger); if (api == null) { _testBinaryMessengerBinding!.defaultBinaryMessenger @@ -404,16 +409,16 @@ abstract class TestFirebaseStorageHostApi { .setMockDecodedMessageHandler(channel, (Object? message) async { assert(message != null, - 'Argument for dev.flutter.pigeon.FirebaseStorageHostApi.referenceListAll was null.'); + 'Argument for dev.flutter.pigeon.firebase_storage_platform_interface.FirebaseStorageHostApi.referenceListAll was null.'); final List args = (message as List?)!; final PigeonStorageFirebaseApp? arg_app = (args[0] as PigeonStorageFirebaseApp?); assert(arg_app != null, - 'Argument for dev.flutter.pigeon.FirebaseStorageHostApi.referenceListAll was null, expected non-null PigeonStorageFirebaseApp.'); + 'Argument for dev.flutter.pigeon.firebase_storage_platform_interface.FirebaseStorageHostApi.referenceListAll was null, expected non-null PigeonStorageFirebaseApp.'); final PigeonStorageReference? arg_reference = (args[1] as PigeonStorageReference?); assert(arg_reference != null, - 'Argument for dev.flutter.pigeon.FirebaseStorageHostApi.referenceListAll was null, expected non-null PigeonStorageReference.'); + 'Argument for dev.flutter.pigeon.firebase_storage_platform_interface.FirebaseStorageHostApi.referenceListAll was null, expected non-null PigeonStorageReference.'); final PigeonListResult output = await api.referenceListAll(arg_app!, arg_reference!); return [output]; @@ -422,7 +427,8 @@ abstract class TestFirebaseStorageHostApi { } { final BasicMessageChannel channel = BasicMessageChannel( - 'dev.flutter.pigeon.FirebaseStorageHostApi.referenceGetData', codec, + 'dev.flutter.pigeon.firebase_storage_platform_interface.FirebaseStorageHostApi.referenceGetData', + codec, binaryMessenger: binaryMessenger); if (api == null) { _testBinaryMessengerBinding!.defaultBinaryMessenger @@ -432,19 +438,19 @@ abstract class TestFirebaseStorageHostApi { .setMockDecodedMessageHandler(channel, (Object? message) async { assert(message != null, - 'Argument for dev.flutter.pigeon.FirebaseStorageHostApi.referenceGetData was null.'); + 'Argument for dev.flutter.pigeon.firebase_storage_platform_interface.FirebaseStorageHostApi.referenceGetData was null.'); final List args = (message as List?)!; final PigeonStorageFirebaseApp? arg_app = (args[0] as PigeonStorageFirebaseApp?); assert(arg_app != null, - 'Argument for dev.flutter.pigeon.FirebaseStorageHostApi.referenceGetData was null, expected non-null PigeonStorageFirebaseApp.'); + 'Argument for dev.flutter.pigeon.firebase_storage_platform_interface.FirebaseStorageHostApi.referenceGetData was null, expected non-null PigeonStorageFirebaseApp.'); final PigeonStorageReference? arg_reference = (args[1] as PigeonStorageReference?); assert(arg_reference != null, - 'Argument for dev.flutter.pigeon.FirebaseStorageHostApi.referenceGetData was null, expected non-null PigeonStorageReference.'); + 'Argument for dev.flutter.pigeon.firebase_storage_platform_interface.FirebaseStorageHostApi.referenceGetData was null, expected non-null PigeonStorageReference.'); final int? arg_maxSize = (args[2] as int?); assert(arg_maxSize != null, - 'Argument for dev.flutter.pigeon.FirebaseStorageHostApi.referenceGetData was null, expected non-null int.'); + 'Argument for dev.flutter.pigeon.firebase_storage_platform_interface.FirebaseStorageHostApi.referenceGetData was null, expected non-null int.'); final Uint8List? output = await api.referenceGetData( arg_app!, arg_reference!, arg_maxSize!); return [output]; @@ -453,7 +459,8 @@ abstract class TestFirebaseStorageHostApi { } { final BasicMessageChannel channel = BasicMessageChannel( - 'dev.flutter.pigeon.FirebaseStorageHostApi.referencePutData', codec, + 'dev.flutter.pigeon.firebase_storage_platform_interface.FirebaseStorageHostApi.referencePutData', + codec, binaryMessenger: binaryMessenger); if (api == null) { _testBinaryMessengerBinding!.defaultBinaryMessenger @@ -463,26 +470,26 @@ abstract class TestFirebaseStorageHostApi { .setMockDecodedMessageHandler(channel, (Object? message) async { assert(message != null, - 'Argument for dev.flutter.pigeon.FirebaseStorageHostApi.referencePutData was null.'); + 'Argument for dev.flutter.pigeon.firebase_storage_platform_interface.FirebaseStorageHostApi.referencePutData was null.'); final List args = (message as List?)!; final PigeonStorageFirebaseApp? arg_app = (args[0] as PigeonStorageFirebaseApp?); assert(arg_app != null, - 'Argument for dev.flutter.pigeon.FirebaseStorageHostApi.referencePutData was null, expected non-null PigeonStorageFirebaseApp.'); + 'Argument for dev.flutter.pigeon.firebase_storage_platform_interface.FirebaseStorageHostApi.referencePutData was null, expected non-null PigeonStorageFirebaseApp.'); final PigeonStorageReference? arg_reference = (args[1] as PigeonStorageReference?); assert(arg_reference != null, - 'Argument for dev.flutter.pigeon.FirebaseStorageHostApi.referencePutData was null, expected non-null PigeonStorageReference.'); + 'Argument for dev.flutter.pigeon.firebase_storage_platform_interface.FirebaseStorageHostApi.referencePutData was null, expected non-null PigeonStorageReference.'); final Uint8List? arg_data = (args[2] as Uint8List?); assert(arg_data != null, - 'Argument for dev.flutter.pigeon.FirebaseStorageHostApi.referencePutData was null, expected non-null Uint8List.'); + 'Argument for dev.flutter.pigeon.firebase_storage_platform_interface.FirebaseStorageHostApi.referencePutData was null, expected non-null Uint8List.'); final PigeonSettableMetadata? arg_settableMetaData = (args[3] as PigeonSettableMetadata?); assert(arg_settableMetaData != null, - 'Argument for dev.flutter.pigeon.FirebaseStorageHostApi.referencePutData was null, expected non-null PigeonSettableMetadata.'); + 'Argument for dev.flutter.pigeon.firebase_storage_platform_interface.FirebaseStorageHostApi.referencePutData was null, expected non-null PigeonSettableMetadata.'); final int? arg_handle = (args[4] as int?); assert(arg_handle != null, - 'Argument for dev.flutter.pigeon.FirebaseStorageHostApi.referencePutData was null, expected non-null int.'); + 'Argument for dev.flutter.pigeon.firebase_storage_platform_interface.FirebaseStorageHostApi.referencePutData was null, expected non-null int.'); final String output = await api.referencePutData(arg_app!, arg_reference!, arg_data!, arg_settableMetaData!, arg_handle!); return [output]; @@ -491,7 +498,8 @@ abstract class TestFirebaseStorageHostApi { } { final BasicMessageChannel channel = BasicMessageChannel( - 'dev.flutter.pigeon.FirebaseStorageHostApi.referencePutString', codec, + 'dev.flutter.pigeon.firebase_storage_platform_interface.FirebaseStorageHostApi.referencePutString', + codec, binaryMessenger: binaryMessenger); if (api == null) { _testBinaryMessengerBinding!.defaultBinaryMessenger @@ -501,29 +509,29 @@ abstract class TestFirebaseStorageHostApi { .setMockDecodedMessageHandler(channel, (Object? message) async { assert(message != null, - 'Argument for dev.flutter.pigeon.FirebaseStorageHostApi.referencePutString was null.'); + 'Argument for dev.flutter.pigeon.firebase_storage_platform_interface.FirebaseStorageHostApi.referencePutString was null.'); final List args = (message as List?)!; final PigeonStorageFirebaseApp? arg_app = (args[0] as PigeonStorageFirebaseApp?); assert(arg_app != null, - 'Argument for dev.flutter.pigeon.FirebaseStorageHostApi.referencePutString was null, expected non-null PigeonStorageFirebaseApp.'); + 'Argument for dev.flutter.pigeon.firebase_storage_platform_interface.FirebaseStorageHostApi.referencePutString was null, expected non-null PigeonStorageFirebaseApp.'); final PigeonStorageReference? arg_reference = (args[1] as PigeonStorageReference?); assert(arg_reference != null, - 'Argument for dev.flutter.pigeon.FirebaseStorageHostApi.referencePutString was null, expected non-null PigeonStorageReference.'); + 'Argument for dev.flutter.pigeon.firebase_storage_platform_interface.FirebaseStorageHostApi.referencePutString was null, expected non-null PigeonStorageReference.'); final String? arg_data = (args[2] as String?); assert(arg_data != null, - 'Argument for dev.flutter.pigeon.FirebaseStorageHostApi.referencePutString was null, expected non-null String.'); + 'Argument for dev.flutter.pigeon.firebase_storage_platform_interface.FirebaseStorageHostApi.referencePutString was null, expected non-null String.'); final int? arg_format = (args[3] as int?); assert(arg_format != null, - 'Argument for dev.flutter.pigeon.FirebaseStorageHostApi.referencePutString was null, expected non-null int.'); + 'Argument for dev.flutter.pigeon.firebase_storage_platform_interface.FirebaseStorageHostApi.referencePutString was null, expected non-null int.'); final PigeonSettableMetadata? arg_settableMetaData = (args[4] as PigeonSettableMetadata?); assert(arg_settableMetaData != null, - 'Argument for dev.flutter.pigeon.FirebaseStorageHostApi.referencePutString was null, expected non-null PigeonSettableMetadata.'); + 'Argument for dev.flutter.pigeon.firebase_storage_platform_interface.FirebaseStorageHostApi.referencePutString was null, expected non-null PigeonSettableMetadata.'); final int? arg_handle = (args[5] as int?); assert(arg_handle != null, - 'Argument for dev.flutter.pigeon.FirebaseStorageHostApi.referencePutString was null, expected non-null int.'); + 'Argument for dev.flutter.pigeon.firebase_storage_platform_interface.FirebaseStorageHostApi.referencePutString was null, expected non-null int.'); final String output = await api.referencePutString( arg_app!, arg_reference!, @@ -537,7 +545,8 @@ abstract class TestFirebaseStorageHostApi { } { final BasicMessageChannel channel = BasicMessageChannel( - 'dev.flutter.pigeon.FirebaseStorageHostApi.referencePutFile', codec, + 'dev.flutter.pigeon.firebase_storage_platform_interface.FirebaseStorageHostApi.referencePutFile', + codec, binaryMessenger: binaryMessenger); if (api == null) { _testBinaryMessengerBinding!.defaultBinaryMessenger @@ -547,26 +556,26 @@ abstract class TestFirebaseStorageHostApi { .setMockDecodedMessageHandler(channel, (Object? message) async { assert(message != null, - 'Argument for dev.flutter.pigeon.FirebaseStorageHostApi.referencePutFile was null.'); + 'Argument for dev.flutter.pigeon.firebase_storage_platform_interface.FirebaseStorageHostApi.referencePutFile was null.'); final List args = (message as List?)!; final PigeonStorageFirebaseApp? arg_app = (args[0] as PigeonStorageFirebaseApp?); assert(arg_app != null, - 'Argument for dev.flutter.pigeon.FirebaseStorageHostApi.referencePutFile was null, expected non-null PigeonStorageFirebaseApp.'); + 'Argument for dev.flutter.pigeon.firebase_storage_platform_interface.FirebaseStorageHostApi.referencePutFile was null, expected non-null PigeonStorageFirebaseApp.'); final PigeonStorageReference? arg_reference = (args[1] as PigeonStorageReference?); assert(arg_reference != null, - 'Argument for dev.flutter.pigeon.FirebaseStorageHostApi.referencePutFile was null, expected non-null PigeonStorageReference.'); + 'Argument for dev.flutter.pigeon.firebase_storage_platform_interface.FirebaseStorageHostApi.referencePutFile was null, expected non-null PigeonStorageReference.'); final String? arg_filePath = (args[2] as String?); assert(arg_filePath != null, - 'Argument for dev.flutter.pigeon.FirebaseStorageHostApi.referencePutFile was null, expected non-null String.'); + 'Argument for dev.flutter.pigeon.firebase_storage_platform_interface.FirebaseStorageHostApi.referencePutFile was null, expected non-null String.'); final PigeonSettableMetadata? arg_settableMetaData = (args[3] as PigeonSettableMetadata?); assert(arg_settableMetaData != null, - 'Argument for dev.flutter.pigeon.FirebaseStorageHostApi.referencePutFile was null, expected non-null PigeonSettableMetadata.'); + 'Argument for dev.flutter.pigeon.firebase_storage_platform_interface.FirebaseStorageHostApi.referencePutFile was null, expected non-null PigeonSettableMetadata.'); final int? arg_handle = (args[4] as int?); assert(arg_handle != null, - 'Argument for dev.flutter.pigeon.FirebaseStorageHostApi.referencePutFile was null, expected non-null int.'); + 'Argument for dev.flutter.pigeon.firebase_storage_platform_interface.FirebaseStorageHostApi.referencePutFile was null, expected non-null int.'); final String output = await api.referencePutFile( arg_app!, arg_reference!, @@ -579,7 +588,7 @@ abstract class TestFirebaseStorageHostApi { } { final BasicMessageChannel channel = BasicMessageChannel( - 'dev.flutter.pigeon.FirebaseStorageHostApi.referenceDownloadFile', + 'dev.flutter.pigeon.firebase_storage_platform_interface.FirebaseStorageHostApi.referenceDownloadFile', codec, binaryMessenger: binaryMessenger); if (api == null) { @@ -590,22 +599,22 @@ abstract class TestFirebaseStorageHostApi { .setMockDecodedMessageHandler(channel, (Object? message) async { assert(message != null, - 'Argument for dev.flutter.pigeon.FirebaseStorageHostApi.referenceDownloadFile was null.'); + 'Argument for dev.flutter.pigeon.firebase_storage_platform_interface.FirebaseStorageHostApi.referenceDownloadFile was null.'); final List args = (message as List?)!; final PigeonStorageFirebaseApp? arg_app = (args[0] as PigeonStorageFirebaseApp?); assert(arg_app != null, - 'Argument for dev.flutter.pigeon.FirebaseStorageHostApi.referenceDownloadFile was null, expected non-null PigeonStorageFirebaseApp.'); + 'Argument for dev.flutter.pigeon.firebase_storage_platform_interface.FirebaseStorageHostApi.referenceDownloadFile was null, expected non-null PigeonStorageFirebaseApp.'); final PigeonStorageReference? arg_reference = (args[1] as PigeonStorageReference?); assert(arg_reference != null, - 'Argument for dev.flutter.pigeon.FirebaseStorageHostApi.referenceDownloadFile was null, expected non-null PigeonStorageReference.'); + 'Argument for dev.flutter.pigeon.firebase_storage_platform_interface.FirebaseStorageHostApi.referenceDownloadFile was null, expected non-null PigeonStorageReference.'); final String? arg_filePath = (args[2] as String?); assert(arg_filePath != null, - 'Argument for dev.flutter.pigeon.FirebaseStorageHostApi.referenceDownloadFile was null, expected non-null String.'); + 'Argument for dev.flutter.pigeon.firebase_storage_platform_interface.FirebaseStorageHostApi.referenceDownloadFile was null, expected non-null String.'); final int? arg_handle = (args[3] as int?); assert(arg_handle != null, - 'Argument for dev.flutter.pigeon.FirebaseStorageHostApi.referenceDownloadFile was null, expected non-null int.'); + 'Argument for dev.flutter.pigeon.firebase_storage_platform_interface.FirebaseStorageHostApi.referenceDownloadFile was null, expected non-null int.'); final String output = await api.referenceDownloadFile( arg_app!, arg_reference!, arg_filePath!, arg_handle!); return [output]; @@ -614,7 +623,7 @@ abstract class TestFirebaseStorageHostApi { } { final BasicMessageChannel channel = BasicMessageChannel( - 'dev.flutter.pigeon.FirebaseStorageHostApi.referenceUpdateMetadata', + 'dev.flutter.pigeon.firebase_storage_platform_interface.FirebaseStorageHostApi.referenceUpdateMetadata', codec, binaryMessenger: binaryMessenger); if (api == null) { @@ -625,20 +634,20 @@ abstract class TestFirebaseStorageHostApi { .setMockDecodedMessageHandler(channel, (Object? message) async { assert(message != null, - 'Argument for dev.flutter.pigeon.FirebaseStorageHostApi.referenceUpdateMetadata was null.'); + 'Argument for dev.flutter.pigeon.firebase_storage_platform_interface.FirebaseStorageHostApi.referenceUpdateMetadata was null.'); final List args = (message as List?)!; final PigeonStorageFirebaseApp? arg_app = (args[0] as PigeonStorageFirebaseApp?); assert(arg_app != null, - 'Argument for dev.flutter.pigeon.FirebaseStorageHostApi.referenceUpdateMetadata was null, expected non-null PigeonStorageFirebaseApp.'); + 'Argument for dev.flutter.pigeon.firebase_storage_platform_interface.FirebaseStorageHostApi.referenceUpdateMetadata was null, expected non-null PigeonStorageFirebaseApp.'); final PigeonStorageReference? arg_reference = (args[1] as PigeonStorageReference?); assert(arg_reference != null, - 'Argument for dev.flutter.pigeon.FirebaseStorageHostApi.referenceUpdateMetadata was null, expected non-null PigeonStorageReference.'); + 'Argument for dev.flutter.pigeon.firebase_storage_platform_interface.FirebaseStorageHostApi.referenceUpdateMetadata was null, expected non-null PigeonStorageReference.'); final PigeonSettableMetadata? arg_metadata = (args[2] as PigeonSettableMetadata?); assert(arg_metadata != null, - 'Argument for dev.flutter.pigeon.FirebaseStorageHostApi.referenceUpdateMetadata was null, expected non-null PigeonSettableMetadata.'); + 'Argument for dev.flutter.pigeon.firebase_storage_platform_interface.FirebaseStorageHostApi.referenceUpdateMetadata was null, expected non-null PigeonSettableMetadata.'); final PigeonFullMetaData output = await api.referenceUpdateMetadata( arg_app!, arg_reference!, arg_metadata!); return [output]; @@ -647,7 +656,8 @@ abstract class TestFirebaseStorageHostApi { } { final BasicMessageChannel channel = BasicMessageChannel( - 'dev.flutter.pigeon.FirebaseStorageHostApi.taskPause', codec, + 'dev.flutter.pigeon.firebase_storage_platform_interface.FirebaseStorageHostApi.taskPause', + codec, binaryMessenger: binaryMessenger); if (api == null) { _testBinaryMessengerBinding!.defaultBinaryMessenger @@ -657,15 +667,15 @@ abstract class TestFirebaseStorageHostApi { .setMockDecodedMessageHandler(channel, (Object? message) async { assert(message != null, - 'Argument for dev.flutter.pigeon.FirebaseStorageHostApi.taskPause was null.'); + 'Argument for dev.flutter.pigeon.firebase_storage_platform_interface.FirebaseStorageHostApi.taskPause was null.'); final List args = (message as List?)!; final PigeonStorageFirebaseApp? arg_app = (args[0] as PigeonStorageFirebaseApp?); assert(arg_app != null, - 'Argument for dev.flutter.pigeon.FirebaseStorageHostApi.taskPause was null, expected non-null PigeonStorageFirebaseApp.'); + 'Argument for dev.flutter.pigeon.firebase_storage_platform_interface.FirebaseStorageHostApi.taskPause was null, expected non-null PigeonStorageFirebaseApp.'); final int? arg_handle = (args[1] as int?); assert(arg_handle != null, - 'Argument for dev.flutter.pigeon.FirebaseStorageHostApi.taskPause was null, expected non-null int.'); + 'Argument for dev.flutter.pigeon.firebase_storage_platform_interface.FirebaseStorageHostApi.taskPause was null, expected non-null int.'); final Map output = await api.taskPause(arg_app!, arg_handle!); return [output]; @@ -674,7 +684,8 @@ abstract class TestFirebaseStorageHostApi { } { final BasicMessageChannel channel = BasicMessageChannel( - 'dev.flutter.pigeon.FirebaseStorageHostApi.taskResume', codec, + 'dev.flutter.pigeon.firebase_storage_platform_interface.FirebaseStorageHostApi.taskResume', + codec, binaryMessenger: binaryMessenger); if (api == null) { _testBinaryMessengerBinding!.defaultBinaryMessenger @@ -684,15 +695,15 @@ abstract class TestFirebaseStorageHostApi { .setMockDecodedMessageHandler(channel, (Object? message) async { assert(message != null, - 'Argument for dev.flutter.pigeon.FirebaseStorageHostApi.taskResume was null.'); + 'Argument for dev.flutter.pigeon.firebase_storage_platform_interface.FirebaseStorageHostApi.taskResume was null.'); final List args = (message as List?)!; final PigeonStorageFirebaseApp? arg_app = (args[0] as PigeonStorageFirebaseApp?); assert(arg_app != null, - 'Argument for dev.flutter.pigeon.FirebaseStorageHostApi.taskResume was null, expected non-null PigeonStorageFirebaseApp.'); + 'Argument for dev.flutter.pigeon.firebase_storage_platform_interface.FirebaseStorageHostApi.taskResume was null, expected non-null PigeonStorageFirebaseApp.'); final int? arg_handle = (args[1] as int?); assert(arg_handle != null, - 'Argument for dev.flutter.pigeon.FirebaseStorageHostApi.taskResume was null, expected non-null int.'); + 'Argument for dev.flutter.pigeon.firebase_storage_platform_interface.FirebaseStorageHostApi.taskResume was null, expected non-null int.'); final Map output = await api.taskResume(arg_app!, arg_handle!); return [output]; @@ -701,7 +712,8 @@ abstract class TestFirebaseStorageHostApi { } { final BasicMessageChannel channel = BasicMessageChannel( - 'dev.flutter.pigeon.FirebaseStorageHostApi.taskCancel', codec, + 'dev.flutter.pigeon.firebase_storage_platform_interface.FirebaseStorageHostApi.taskCancel', + codec, binaryMessenger: binaryMessenger); if (api == null) { _testBinaryMessengerBinding!.defaultBinaryMessenger @@ -711,15 +723,15 @@ abstract class TestFirebaseStorageHostApi { .setMockDecodedMessageHandler(channel, (Object? message) async { assert(message != null, - 'Argument for dev.flutter.pigeon.FirebaseStorageHostApi.taskCancel was null.'); + 'Argument for dev.flutter.pigeon.firebase_storage_platform_interface.FirebaseStorageHostApi.taskCancel was null.'); final List args = (message as List?)!; final PigeonStorageFirebaseApp? arg_app = (args[0] as PigeonStorageFirebaseApp?); assert(arg_app != null, - 'Argument for dev.flutter.pigeon.FirebaseStorageHostApi.taskCancel was null, expected non-null PigeonStorageFirebaseApp.'); + 'Argument for dev.flutter.pigeon.firebase_storage_platform_interface.FirebaseStorageHostApi.taskCancel was null, expected non-null PigeonStorageFirebaseApp.'); final int? arg_handle = (args[1] as int?); assert(arg_handle != null, - 'Argument for dev.flutter.pigeon.FirebaseStorageHostApi.taskCancel was null, expected non-null int.'); + 'Argument for dev.flutter.pigeon.firebase_storage_platform_interface.FirebaseStorageHostApi.taskCancel was null, expected non-null int.'); final Map output = await api.taskCancel(arg_app!, arg_handle!); return [output]; diff --git a/tests/integration_test/firebase_storage/list_result_e2e.dart b/tests/integration_test/firebase_storage/list_result_e2e.dart index a88588d44fcf..66b1d38c8a70 100644 --- a/tests/integration_test/firebase_storage/list_result_e2e.dart +++ b/tests/integration_test/firebase_storage/list_result_e2e.dart @@ -4,33 +4,38 @@ import 'package:firebase_storage/firebase_storage.dart'; import 'package:flutter_test/flutter_test.dart'; +import 'package:flutter/foundation.dart'; void setupListResultTests() { - group('$ListResult', () { - late FirebaseStorage storage; - late ListResult result; + group( + '$ListResult', + () { + late FirebaseStorage storage; + late ListResult result; - setUpAll(() async { - storage = FirebaseStorage.instance; - Reference ref = storage.ref('flutter-tests/list'); - // Needs to be > half of the # of items in the storage, - // so there's a chance of picking up some items and some - // prefixes. - result = await ref.list(const ListOptions(maxResults: 3)); - }); + setUpAll(() async { + storage = FirebaseStorage.instance; + Reference ref = storage.ref('flutter-tests/list'); + // Needs to be > half of the # of items in the storage, + // so there's a chance of picking up some items and some + // prefixes. + result = await ref.list(const ListOptions(maxResults: 3)); + }); - test('items', () async { - expect(result.items, isA>()); - expect(result.items.length, greaterThan(0)); - }); + test('items', () async { + expect(result.items, isA>()); + expect(result.items.length, greaterThan(0)); + }); - test('nextPageToken', () async { - expect(result.nextPageToken, isNotNull); - }); + test('nextPageToken', () async { + expect(result.nextPageToken, isNotNull); + }); - test('prefixes', () async { - expect(result.prefixes, isA>()); - expect(result.prefixes.length, greaterThan(0)); - }); - }); + test('prefixes', () async { + expect(result.prefixes, isA>()); + expect(result.prefixes.length, greaterThan(0)); + }); + }, + skip: defaultTargetPlatform == TargetPlatform.windows, + ); } diff --git a/tests/integration_test/firebase_storage/reference_e2e.dart b/tests/integration_test/firebase_storage/reference_e2e.dart index 2f666ea249b5..5d1122fca051 100644 --- a/tests/integration_test/firebase_storage/reference_e2e.dart +++ b/tests/integration_test/firebase_storage/reference_e2e.dart @@ -183,51 +183,59 @@ void setupReferenceTests() { }); }); - group('list', () { - test('returns list results', () async { - Reference ref = storage.ref('flutter-tests/list'); - ListResult result = await ref.list(const ListOptions(maxResults: 25)); + group( + 'list', + () { + test('returns list results', () async { + Reference ref = storage.ref('flutter-tests/list'); + ListResult result = await ref.list(const ListOptions(maxResults: 25)); - expect(result.items.length, greaterThan(0)); - expect(result.prefixes, isA>()); - expect(result.prefixes.length, greaterThan(0)); - }); + expect(result.items.length, greaterThan(0)); + expect(result.prefixes, isA>()); + expect(result.prefixes.length, greaterThan(0)); + }); - test('errors if maxResults is less than 0 ', () async { - Reference ref = storage.ref('/list'); - expect( - () => ref.list(const ListOptions(maxResults: -1)), - throwsAssertionError, - ); - }); + test('errors if maxResults is less than 0 ', () async { + Reference ref = storage.ref('/list'); + expect( + () => ref.list(const ListOptions(maxResults: -1)), + throwsAssertionError, + ); + }); - test('errors if maxResults is 0 ', () async { - Reference ref = storage.ref('/list'); - expect( - () => ref.list(const ListOptions(maxResults: 0)), - throwsAssertionError, - ); - }); + test('errors if maxResults is 0 ', () async { + Reference ref = storage.ref('/list'); + expect( + () => ref.list(const ListOptions(maxResults: 0)), + throwsAssertionError, + ); + }); - test('errors if maxResults is more than 1000 ', () async { - Reference ref = storage.ref('/list'); - expect( - () => ref.list(const ListOptions(maxResults: 1001)), - throwsAssertionError, - ); - }); - }); + test('errors if maxResults is more than 1000 ', () async { + Reference ref = storage.ref('/list'); + expect( + () => ref.list(const ListOptions(maxResults: 1001)), + throwsAssertionError, + ); + }); + }, + skip: defaultTargetPlatform == TargetPlatform.windows, + ); - test('listAll', () async { - Reference ref = storage.ref('flutter-tests/list'); - ListResult result = await ref.listAll(); - expect(result.items, isNotNull); - expect(result.items.length, greaterThan(0)); - expect(result.nextPageToken, isNull); + test( + 'listAll', + () async { + Reference ref = storage.ref('flutter-tests/list'); + ListResult result = await ref.listAll(); + expect(result.items, isNotNull); + expect(result.items.length, greaterThan(0)); + expect(result.nextPageToken, isNull); - expect(result.prefixes, isA>()); - expect(result.prefixes.length, greaterThan(0)); - }); + expect(result.prefixes, isA>()); + expect(result.prefixes.length, greaterThan(0)); + }, + skip: defaultTargetPlatform == TargetPlatform.windows, + ); group( 'putData', diff --git a/tests/windows/flutter/generated_plugin_registrant.cc b/tests/windows/flutter/generated_plugin_registrant.cc index d141b74f57d8..6013891f132f 100644 --- a/tests/windows/flutter/generated_plugin_registrant.cc +++ b/tests/windows/flutter/generated_plugin_registrant.cc @@ -8,10 +8,13 @@ #include #include +#include void RegisterPlugins(flutter::PluginRegistry* registry) { FirebaseAuthPluginCApiRegisterWithRegistrar( registry->GetRegistrarForPlugin("FirebaseAuthPluginCApi")); FirebaseCorePluginCApiRegisterWithRegistrar( registry->GetRegistrarForPlugin("FirebaseCorePluginCApi")); + FirebaseStoragePluginCApiRegisterWithRegistrar( + registry->GetRegistrarForPlugin("FirebaseStoragePluginCApi")); } diff --git a/tests/windows/flutter/generated_plugins.cmake b/tests/windows/flutter/generated_plugins.cmake index 29944d5b14ae..3976ac4622ed 100644 --- a/tests/windows/flutter/generated_plugins.cmake +++ b/tests/windows/flutter/generated_plugins.cmake @@ -5,6 +5,7 @@ list(APPEND FLUTTER_PLUGIN_LIST firebase_auth firebase_core + firebase_storage ) list(APPEND FLUTTER_FFI_PLUGIN_LIST