blob: c5954c73f0113b2174c7171400eb226db2bc17e1 [file] [log] [blame]
/**
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
#ifndef Bridge_h
#define Bridge_h
#include <map>
#include <memory>
#include <set>
#include <string>
#include <vector>
#include "base/common.h"
#include "include/WeexApiHeader.h"
namespace WeexCore {
class MeasureFunctionAdapter;
class WXCoreMargin;
class WXCorePadding;
class WXCoreBorderWidth;
class WXCoreSize;
class PlatformBridge {
public:
class CoreSide {
public:
explicit CoreSide() : measure_function_adapter_exist_(false) {}
virtual ~CoreSide() {}
virtual void SetDefaultHeightAndWidthIntoRootDom(
const std::string& instance_id, float default_width,
float default_height, bool is_width_wrap_content,
bool is_height_wrap_content) = 0;
virtual void OnInstanceClose(const std::string& instance_id) = 0;
virtual void SetStyleWidth(const std::string& instance_id,
const std::string& render_ref, float width) = 0;
virtual void SetStyleHeight(const std::string& instance_id,
const std::string& render_ref,
float height) = 0;
virtual void SetMargin(const std::string& instance_id,
const std::string& render_ref, int edge,
float value) = 0;
virtual void SetPadding(const std::string& instance_id,
const std::string& render_ref, int edge,
float value) = 0;
virtual void SetPosition(const std::string& instance_id,
const std::string& render_ref, int edge,
float value) = 0;
virtual void MarkDirty(const std::string& instance_id,
const std::string& render_ref) = 0;
virtual void SetViewPortWidth(const std::string& instance_id,
float width) = 0;
virtual void SetPageDirty(const std::string& instance_id) = 0;
virtual void ForceLayout(const std::string& instance_id) = 0;
virtual bool NotifyLayout(const std::string& instance_id) = 0;
virtual std::vector<int64_t> GetFirstScreenRenderTime(
const std::string& instance_id) = 0;
virtual std::vector<int64_t> GetRenderFinishTime(
const std::string& instance_id) = 0;
virtual void SetRenderContainerWrapContent(const std::string& instance_id,
bool wrap) = 0;
virtual void BindMeasurementToRenderObject(long ptr) = 0;
virtual void RegisterCoreEnv(const std::string& key,
const std::string& value) = 0;
virtual long GetRenderObject(const std::string& instance_id,
const std::string& render_ref) = 0;
virtual void UpdateRenderObjectStyle(long render_ptr,
const std::string& key,
const std::string& value) = 0;
virtual void UpdateRenderObjectAttr(long render_ptr, const std::string& key,
const std::string& value) = 0;
virtual long CopyRenderObject(long render_ptr) = 0;
virtual void SetMeasureFunctionAdapter() = 0;
virtual void SetPlatform(const std::string& platformName) = 0;
virtual void SetDeviceWidthAndHeight(float width, float height) = 0;
virtual void AddOption(const std::string& key,
const std::string& value) = 0;
virtual int RefreshInstance(const char* instanceId, const char* nameSpace,
const char* func,
std::vector<VALUE_WITH_TYPE*>& params) = 0;
virtual int InitFramework(const char* script,
std::vector<INIT_FRAMEWORK_PARAMS*>& params) = 0;
virtual int InitAppFramework(
const char* instanceId, const char* appFramework,
std::vector<INIT_FRAMEWORK_PARAMS*>& params) = 0;
virtual int CreateAppContext(const char* instanceId,
const char* jsBundle) = 0;
virtual std::unique_ptr<WeexJSResult> ExecJSOnAppWithResult(const char* instanceId,
const char* jsBundle) = 0;
virtual int CallJSOnAppContext(const char* instanceId, const char* func,
std::vector<VALUE_WITH_TYPE*>& params) = 0;
virtual int DestroyAppContext(const char* instanceId) = 0;
virtual int ExecJsService(const char* source) = 0;
virtual int ExecTimeCallback(const char* source) = 0;
virtual int ExecJS(const char* instanceId, const char* nameSpace,
const char* func,
std::vector<VALUE_WITH_TYPE*>& params) = 0;
virtual std::unique_ptr<WeexJSResult> ExecJSWithResult(
const char* instanceId, const char* nameSpace, const char* func,
std::vector<VALUE_WITH_TYPE*>& params) = 0;
virtual void ExecJSWithCallback(const char* instanceId,
const char* nameSpace, const char* func,
std::vector<VALUE_WITH_TYPE*>& params,
long callback_id) = 0;
virtual int CreateInstance(const char* instanceId, const char* func,
const char* script, int script_length, const char* opts,
const char* initData, const char* extendsApi, std::vector<INIT_FRAMEWORK_PARAMS*>& params,
const char* render_strategy) = 0;
virtual std::unique_ptr<WeexJSResult> ExecJSOnInstance(const char* instanceId,
const char* script) = 0;
virtual int DestroyInstance(const char* instanceId) = 0;
virtual int UpdateGlobalConfig(const char* config) = 0;
inline PlatformBridge* bridge() { return bridge_; }
protected:
bool measure_function_adapter_exist_;
private:
PlatformBridge* bridge_;
friend class PlatformBridge;
inline void set_bridge(PlatformBridge* bridge) { bridge_ = bridge; }
DISALLOW_COPY_AND_ASSIGN(CoreSide);
};
class PlatformSide {
public:
PlatformSide() {}
virtual ~PlatformSide() {}
virtual WXCoreSize InvokeMeasureFunction(const char* page_id,
long render_ptr, float width,
int width_measure_mode,
float height,
int height_measure_mode) = 0;
virtual void InvokeLayoutBefore(const char* page_id, long render_ptr) = 0;
virtual void InvokeLayoutPlatform(const char* page_id, long render_ptr) = 0;
virtual void InvokeLayoutAfter(const char* page_id, long render_ptr,
float width, float height) = 0;
virtual void TriggerVSync(const char* page_id) = 0; // vsync loop may stop on some platforms like iOS
virtual void SetJSVersion(const char* version) = 0;
virtual void ReportException(const char* page_id, const char* func,
const char* exception_string) = 0;
virtual void ReportServerCrash(const char* instance_id) = 0;
virtual void ReportNativeInitStatus(const char* status_code,
const char* error_msg) = 0;
virtual int CallNative(const char* page_id, const char* task,
const char* callback) = 0;
virtual std::unique_ptr<ValueWithType> CallNativeModule(
const char* page_id, const char* module, const char* method,
const char* arguments, int arguments_length, const char* options,
int options_length) = 0;
virtual void CallNativeComponent(const char* page_id, const char* ref,
const char* method, const char* arguments,
int arguments_length, const char* options,
int options_length) = 0;
#if OS_IOS
virtual std::unique_ptr<ValueWithType> RegisterPluginModule(const char *name, const char *class_name, const char *version) = 0;
#endif
virtual void SetTimeout(const char* callback_id, const char* time) = 0;
virtual void NativeLog(const char* str_array) = 0;
virtual int UpdateFinish(const char* page_id, const char* task, int taskLen,
const char* callback, int callbackLen) = 0;
virtual int RefreshFinish(const char* page_id, const char* task,
const char* callback) = 0;
virtual int AddEvent(const char* page_id, const char* ref,
const char* event) = 0;
virtual int RemoveEvent(const char* page_id, const char* ref,
const char* event) = 0;
virtual int CreateBody(const char* pageId, const char* componentType,
const char* ref,
std::map<std::string, std::string>* styles,
std::map<std::string, std::string>* attributes,
std::set<std::string>* events,
const WXCoreMargin& margins,
const WXCorePadding& paddings,
const WXCoreBorderWidth& borders) = 0;
virtual int AddElement(const char* pageId, const char* componentType,
const char* ref, int& index, const char* parentRef,
std::map<std::string, std::string>* styles,
std::map<std::string, std::string>* attributes,
std::set<std::string>* events,
const WXCoreMargin& margins,
const WXCorePadding& paddings,
const WXCoreBorderWidth& borders,
bool willLayout = true) = 0;
virtual int Layout(const char* page_id, const char* ref, float top,
float bottom, float left, float right, float height,
float width, bool isRTL, int index) = 0;
virtual int UpdateStyle(
const char* pageId, const char* ref,
std::vector<std::pair<std::string, std::string>>* style,
std::vector<std::pair<std::string, std::string>>* margin,
std::vector<std::pair<std::string, std::string>>* padding,
std::vector<std::pair<std::string, std::string>>* border) = 0;
virtual int UpdateAttr(
const char* pageId, const char* ref,
std::vector<std::pair<std::string, std::string>>* attrs) = 0;
virtual int CreateFinish(const char* pageId) = 0;
virtual int RenderSuccess(const char* pageId) = 0;
virtual int RemoveElement(const char* pageId, const char* ref) = 0;
virtual int MoveElement(const char* pageId, const char* ref,
const char* parentRef, int index) = 0;
virtual int AppendTreeCreateFinish(const char* pageId, const char* ref) = 0;
virtual int HasTransitionPros(
const char* pageId, const char* ref,
std::vector<std::pair<std::string, std::string>>* style) = 0;
virtual void PostMessage(const char* vm_id, const char* data, int dataLength) = 0;
virtual void DispatchMessage(const char* client_id, const char* data,
int dataLength, const char* callback,
const char* vm_id) = 0;
virtual std::unique_ptr<WeexJSResult> DispatchMessageSync(
const char* client_id, const char* data, int dataLength,
const char* vm_id) = 0;
virtual void OnReceivedResult(long callback_id,
std::unique_ptr<WeexJSResult>& result) = 0;
inline PlatformBridge* bridge() { return bridge_; }
private:
PlatformBridge* bridge_;
friend class PlatformBridge;
inline void set_bridge(PlatformBridge* bridge) { bridge_ = bridge; }
DISALLOW_COPY_AND_ASSIGN(PlatformSide);
};
inline CoreSide* core_side() { return core_side_.get(); }
inline PlatformSide* platform_side() { return platform_side_.get(); }
inline void set_core_side(CoreSide* core_side) {
core_side_.reset(core_side);
core_side_->set_bridge(this);
}
inline void set_platform_side(PlatformSide* platform_side) {
platform_side_.reset(platform_side);
platform_side_->set_bridge(this);
}
PlatformBridge() : is_passable_(true) {}
virtual ~PlatformBridge() {}
inline bool is_passable() { return is_passable_; }
protected:
inline void set_is_passable(bool passable) { is_passable_ = passable; }
private:
std::unique_ptr<CoreSide> core_side_;
std::unique_ptr<PlatformSide> platform_side_;
bool is_passable_;
DISALLOW_COPY_AND_ASSIGN(PlatformBridge);
};
} // namespace WeexCore
#endif // Bridge_h