1 // Copyright 2013 The Flutter Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #ifndef FLUTTER_SHELL_PLATFORM_COMMON_CPP_CLIENT_WRAPPER_INCLUDE_FLUTTER_ENGINE_METHOD_RESULT_H_ 6 #define FLUTTER_SHELL_PLATFORM_COMMON_CPP_CLIENT_WRAPPER_INCLUDE_FLUTTER_ENGINE_METHOD_RESULT_H_ 7 8 #include <memory> 9 #include <string> 10 #include <vector> 11 12 #include "binary_messenger.h" 13 #include "method_codec.h" 14 #include "method_result.h" 15 16 namespace flutter { 17 18 namespace internal { 19 // Manages the one-time sending of response data. This is an internal helper 20 // class for EngineMethodResult, separated out since the implementation doesn't 21 // vary based on the template type. 22 class ReplyManager { 23 public: 24 ReplyManager(BinaryReply reply_handler_); 25 ~ReplyManager(); 26 27 // Prevent copying. 28 ReplyManager(ReplyManager const&) = delete; 29 ReplyManager& operator=(ReplyManager const&) = delete; 30 31 // Sends the given response data (which must either be nullptr, which 32 // indicates an unhandled method, or a response serialized with |codec_|) to 33 // the engine. 34 void SendResponseData(const std::vector<uint8_t>* data); 35 36 private: 37 BinaryReply reply_handler_; 38 }; 39 } // namespace internal 40 41 // Implemention of MethodResult that sends a response to the Flutter engine 42 // exactly once, encoded using a given codec. 43 template <typename T> 44 class EngineMethodResult : public MethodResult<T> { 45 public: 46 // Creates a result object that will send results to |reply_handler|, encoded 47 // using |codec|. The |codec| pointer must remain valid for as long as this 48 // object exists. EngineMethodResult(BinaryReply reply_handler,const MethodCodec<T> * codec)49 EngineMethodResult(BinaryReply reply_handler, const MethodCodec<T>* codec) 50 : reply_manager_( 51 std::make_unique<internal::ReplyManager>(std::move(reply_handler))), 52 codec_(codec) {} 53 54 ~EngineMethodResult() = default; 55 56 protected: 57 // |flutter::MethodResult| SuccessInternal(const T * result)58 void SuccessInternal(const T* result) override { 59 std::unique_ptr<std::vector<uint8_t>> data = 60 codec_->EncodeSuccessEnvelope(result); 61 reply_manager_->SendResponseData(data.get()); 62 } 63 64 // |flutter::MethodResult| ErrorInternal(const std::string & error_code,const std::string & error_message,const T * error_details)65 void ErrorInternal(const std::string& error_code, 66 const std::string& error_message, 67 const T* error_details) override { 68 std::unique_ptr<std::vector<uint8_t>> data = 69 codec_->EncodeErrorEnvelope(error_code, error_message, error_details); 70 reply_manager_->SendResponseData(data.get()); 71 } 72 73 // |flutter::MethodResult| NotImplementedInternal()74 void NotImplementedInternal() override { 75 reply_manager_->SendResponseData(nullptr); 76 } 77 78 private: 79 std::unique_ptr<internal::ReplyManager> reply_manager_; 80 81 const MethodCodec<T>* codec_; 82 }; 83 84 } // namespace flutter 85 86 #endif // FLUTTER_SHELL_PLATFORM_COMMON_CPP_CLIENT_WRAPPER_INCLUDE_FLUTTER_ENGINE_METHOD_RESULT_H_ 87