void <CLS_NAME>::Connect(bool sync) {
if (local_execution_.get() != nullptr && local_execution_->LoadSymbols()) {
- if (local_execution_->Connect())
+ if (local_execution_->Connect(sync))
return;
}
}
}
-bool LocalExecution::Connect() {
+bool LocalExecution::Connect(bool sync) {
if (connect_func_) {
- if (connect_func_(this, GetAppId().c_str(), instance_.c_str()) != RPC_PORT_ERROR_NONE)
+ if (connect_func_(this, GetAppId().c_str(), instance_.c_str(), sync) != RPC_PORT_ERROR_NONE)
return false;
}
}
void LocalExecution::OnConnected() {
+ std::lock_guard<std::recursive_mutex> lock(mutex_);
connected_ = true;
if (listener_ != nullptr)
listener_->OnLocalConnected();
}
void LocalExecution::OnDisconnected() {
+ std::lock_guard<std::recursive_mutex> lock(mutex_);
connected_ = false;
if (listener_ != nullptr)
listener_->OnLocalDisconnected();
*/
constexpr const char CB_LEM_API[] =
R"__cpp_cb(
-EXPORT_API int rpc_port_proxy_<INPUT_FILE>_lem_<CLS_NAME>_connect(void* h) {
+EXPORT_API int rpc_port_proxy_<INPUT_FILE>_lem_<CLS_NAME>_connect(void* h, bool sync) {
auto* handle = static_cast<rpc_port::<FILE_NAMESPACE>::LocalExecution*>(h);
+ if (sync) {
+ handle->OnConnected();
+ return RPC_PORT_ERROR_NONE;
+ }
+
auto* ptr = new std::weak_ptr<rpc_port::<FILE_NAMESPACE>::LocalExecution>(handle->shared_from_this());
g_idle_add([](gpointer user_data) {
auto* wp = static_cast<std::weak_ptr<rpc_port::<FILE_NAMESPACE>::LocalExecution>*>(user_data);
LocalExecution(std::string port_name, IEvent* listener);
virtual ~LocalExecution();
- bool Connect();
+ bool Connect(bool sync);
void Disconnect();
int Send(rpc_port_parcel_h request, rpc_port_parcel_h* result);
private:
- using StubConnectFunc = int (*)(void*, const char*, const char*);
+ using StubConnectFunc = int (*)(void*, const char*, const char*, bool);
using StubDisconnectFunc = void (*)(void*, const char*, const char*);
using StubSendFunc = int (*)(void*, rpc_port_parcel_h);
return ret;
}
-void <CLS_NAME>::OnLocalConnected(void* context, const std::string& sender, const std::string& instance) {
+void <CLS_NAME>::OnLocalConnected(void* context, const std::string& sender, const std::string& instance, bool sync) {
auto service = service_factory_->CreateService(sender, instance);
service->SetContext(context);
service->OnCreate();
services_.emplace_back(std::move(service));
- <CLS_NAME>_context_->Connect(context);
+ <CLS_NAME>_context_->Connect(context, sync);
}
void <CLS_NAME>::OnLocalDisconnected(void* context, const std::string& sender, const std::string& instance) {
LoadSymbols();
}
-void LocalExecution::Connect(void* context) {
+void LocalExecution::Connect(void* context, bool sync) {
if (connect_func_ != nullptr)
- connect_func_(context);
+ connect_func_(context, sync);
}
void LocalExecution::Disconnect(void* context) {
invoke_callback_func_(context, parcel);
}
-void LocalExecution::OnConnected(void* context, const std::string& sender, const std::string& instance) {
+void LocalExecution::OnConnected(void* context, const std::string& sender, const std::string& instance, bool sync) {
if (listener_ != nullptr)
- listener_->OnLocalConnected(context, sender, instance);
+ listener_->OnLocalConnected(context, sender, instance, sync);
}
void LocalExecution::OnDisconnected(void* context, const std::string& sender, const std::string& instance) {
*/
constexpr const char CB_LEM_API[] =
R"__cpp_cb(
-EXPORT_API int rpc_port_stub_<INPUT_FILE>_lem_<CLS_NAME>_connect(void* context, const char* sender, const char* instance) {
+EXPORT_API int rpc_port_stub_<INPUT_FILE>_lem_<CLS_NAME>_connect(void* context, const char* sender, const char* instance, bool sync) {
if (<CLS_NAME>_context_.get() == nullptr || !<CLS_NAME>_context_->IsListening()) {
_E("Server is not ready");
return RPC_PORT_ERROR_IO_ERROR;
}
- <CLS_NAME>_context_->OnConnected(context, sender, instance);
+ <CLS_NAME>_context_->OnConnected(context, sender, instance, sync);
return RPC_PORT_ERROR_NONE;
}
static void OnDisconnectedCb(const char* sender, const char* instance, void* user_data);
static int OnReceivedCb(const char* sender, const char* instance, rpc_port_h port, void* user_data);
- void OnLocalConnected(void* context, const std::string& sender, const std::string& instance) override;
+ void OnLocalConnected(void* context, const std::string& sender, const std::string& instance, bool sync) override;
void OnLocalDisconnected(void* context, const std::string& sender, const std::string& instance) override;
void OnLocalReceived(void* context, rpc_port_parcel_h parcel) override;
class IEvent {
public:
virtual ~IEvent() = default;
- virtual void OnLocalConnected(void* context, const std::string& sender, const std::string& instance) = 0;
+ virtual void OnLocalConnected(void* context, const std::string& sender, const std::string& instance, bool sync) = 0;
virtual void OnLocalDisconnected(void* context, const std::string& sender, const std::string& instance) = 0;
virtual void OnLocalReceived(void* context, rpc_port_parcel_h parcel) = 0;
};
LocalExecution(std::string port_name, IEvent* listener);
virtual ~LocalExecution() = default;
- void Connect(void* context);
+ void Connect(void* context, bool sync);
void Disconnect(void* context);
void SendResult(void* context, rpc_port_parcel_h parcel);
void InvokeCallback(void* context, rpc_port_parcel_h parcel);
- void OnConnected(void* context, const std::string& sender, const std::string& instance);
+ void OnConnected(void* context, const std::string& sender, const std::string& instance, bool sync);
void OnDisconnected(void* context, const std::string& sender, const std::string& instance);
void OnReceived(void* context, rpc_port_parcel_h parcel);
bool LoadSymbols();
private:
- using ProxyConnectFunc = int (*)(void*);
+ using ProxyConnectFunc = int (*)(void*, bool);
using ProxyDisconnectFunc = int (*)(void*);
using ProxySendResultFunc = int (*)(void*, rpc_port_parcel_h);
using ProxyInvokeCallbackFunc = int (*)(void*, rpc_port_parcel_h);