// // Copyright (c) ZeroC, Inc. All rights reserved. // #include #include #include #include #include "ice.h" #include "Future.h" #include "Util.h" using namespace std; using namespace IceMatlab; extern "C" { mxArray* Ice_Communicator_unref(void* self) { delete reinterpret_cast*>(self); return 0; } mxArray* Ice_Communicator_destroy(void* self) { deref(self)->destroy(); return 0; } mxArray* Ice_Communicator_destroyAsync(void* self, void** future) { *future = 0; auto c = deref(self); auto f = make_shared(); thread t([c, f] { try { c->destroy(); f->done(); } catch(const std::exception&) { f->exception(current_exception()); } }); t.detach(); *future = new shared_ptr(move(f)); return 0; } mxArray* Ice_Communicator_stringToProxy(void* self, const char* s, void** proxy) { try { auto p = deref(self)->stringToProxy(s); if(p) { *proxy = createShared(p); } else { *proxy = 0; } } catch(const std::exception& ex) { return convertException(ex); } return 0; } mxArray* Ice_Communicator_proxyToString(void* self, void* proxy) { assert(proxy); try { auto p = deref(proxy); return createResultValue(createStringFromUTF8(deref(self)->proxyToString(p))); } catch(const std::exception& ex) { return createResultException(convertException(ex)); } } mxArray* Ice_Communicator_propertyToProxy(void* self, const char* prop, void** proxy) { try { auto p = deref(self)->propertyToProxy(prop); if(p) { *proxy = createShared(p); } else { *proxy = 0; } } catch(const std::exception& ex) { return convertException(ex); } return 0; } mxArray* Ice_Communicator_proxyToProperty(void* self, void* proxy, const char* prop) { assert(proxy); try { auto p = deref(proxy); auto d = deref(self)->proxyToProperty(p, prop); return createResultValue(createStringMap(d)); } catch(const std::exception& ex) { return createResultException(convertException(ex)); } } mxArray* Ice_Communicator_identityToString(void* self, mxArray* id) { try { Ice::Identity ident; getIdentity(id, ident); return createResultValue(createStringFromUTF8(deref(self)->identityToString(ident))); } catch(const std::exception& ex) { return createResultException(convertException(ex)); } } mxArray* Ice_Communicator_getImplicitContext(void* self, void** ctx) { try { auto p = deref(self)->getImplicitContext(); *ctx = createShared(p); } catch(const std::exception& ex) { return convertException(ex); } return 0; } mxArray* Ice_Communicator_getProperties(void* self, void** props) { try { auto p = deref(self)->getProperties(); *props = new shared_ptr(move(p)); } catch(const std::exception& ex) { return convertException(ex); } return 0; } mxArray* Ice_Communicator_getLogger(void* self, void** logger) { try { auto l = deref(self)->getLogger(); *logger = createShared(l); } catch(const std::exception& ex) { return convertException(ex); } return 0; } mxArray* Ice_Communicator_getDefaultRouter(void* self, void** proxy) { try { auto p = deref(self)->getDefaultRouter(); if(p) { *proxy = createShared(p); } else { *proxy = 0; } } catch(const std::exception& ex) { return convertException(ex); } return 0; } mxArray* Ice_Communicator_setDefaultRouter(void* self, void* proxy) { try { shared_ptr p; if(proxy) { p = Ice::uncheckedCast(deref(proxy)); } deref(self)->setDefaultRouter(p); } catch(const std::exception& ex) { return convertException(ex); } return 0; } mxArray* Ice_Communicator_getDefaultLocator(void* self, void** proxy) { try { auto p = deref(self)->getDefaultLocator(); if(p) { *proxy = createShared(p); } else { *proxy = 0; } } catch(const std::exception& ex) { return convertException(ex); } return 0; } mxArray* Ice_Communicator_setDefaultLocator(void* self, void* proxy) { try { shared_ptr p; if(proxy) { p = Ice::uncheckedCast(deref(proxy)); } deref(self)->setDefaultLocator(p); } catch(const std::exception& ex) { return convertException(ex); } return 0; } mxArray* Ice_Communicator_flushBatchRequests(void* self, mxArray* mode) { try { auto m = static_cast(getEnumerator(mode, "Ice.CompressBatch")); deref(self)->flushBatchRequests(m); } catch(const std::exception& ex) { return convertException(ex); } return 0; } mxArray* Ice_Communicator_flushBatchRequestsAsync(void* self, mxArray* mode, void** future) { *future = 0; auto f = make_shared(); try { auto m = static_cast(getEnumerator(mode, "Ice.CompressBatch")); function token = deref(self)->flushBatchRequestsAsync( m, [f](exception_ptr e) { f->exception(e); }, [f](bool /*sentSynchronously*/) { f->done(); }); f->token(token); *future = new shared_ptr(move(f)); } catch(const std::exception& ex) { return convertException(ex); } return 0; } }