From 49e1618006301fdbe090f11851557c386466028c Mon Sep 17 00:00:00 2001 From: Benoit Foucher Date: Thu, 15 Dec 2016 16:09:25 +0100 Subject: iOS C++ controller fixes --- cpp/test/ios/controller/Bundle/ControllerI.mm | 116 +++++++++++++++----------- 1 file changed, 69 insertions(+), 47 deletions(-) (limited to 'cpp/test/ios/controller/Bundle') diff --git a/cpp/test/ios/controller/Bundle/ControllerI.mm b/cpp/test/ios/controller/Bundle/ControllerI.mm index 406b33aa077..5f65e515712 100644 --- a/cpp/test/ios/controller/Bundle/ControllerI.mm +++ b/cpp/test/ios/controller/Bundle/ControllerI.mm @@ -13,6 +13,8 @@ #include #include +#include + @protocol ViewController -(void) print:(NSString*)msg; -(void) println:(NSString*)msg; @@ -23,32 +25,32 @@ using namespace Test::Common; namespace { - + typedef int (*MAIN_ENTRY_POINT)(int argc, char** argv, Test::MainHelper* helper); typedef int (*SHUTDOWN_ENTRY_POINT)(); - + class MainHelperI : public Test::MainHelper, private IceUtil::Monitor, public IceUtil::Thread { public: - + MainHelperI(id, const string&, const StringSeq&); virtual ~MainHelperI(); - + virtual void serverReady(); virtual void shutdown(); virtual void waitForCompleted() {} virtual bool redirect(); virtual void print(const std::string&); - + virtual void run(); - + void completed(int); void waitReady(int) const; int waitSuccess(int) const; string getOutput() const; - + private: - + id _controller; std::string _dll; StringSeq _args; @@ -59,55 +61,57 @@ namespace int _status; std::ostringstream _out; }; - + class ProcessI : public Process { public: - + ProcessI(id, MainHelperI*); virtual ~ProcessI(); - + void waitReady(int, const Ice::Current&); int waitSuccess(int, const Ice::Current&); string terminate(const Ice::Current&); - + private: - + id _controller; IceUtil::Handle _helper; }; - + class ProcessControllerI : public ProcessController { public: - - ProcessControllerI(id); - + + ProcessControllerI(id, NSString*, NSString*); + #ifdef ICE_CPP11_MAPPING - virtual shared_ptr - start(string, string, StringSeq, const Ice::Current&); + virtual shared_ptr start(string, string, StringSeq, const Ice::Current&); + virtual string getHost(string, bool, const Ice::Current&); #else - virtual ProcessPrx - start(const string&, const string&, const StringSeq&, const Ice::Current&); + virtual ProcessPrx start(const string&, const string&, const StringSeq&, const Ice::Current&); + virtual string getHost(const string&, bool, const Ice::Current&); #endif - + private: - + id _controller; + string _ipv4; + string _ipv6; }; - + class ControllerHelper { public: - - ControllerHelper(id); + + ControllerHelper(id, NSString*, NSString*); virtual ~ControllerHelper(); - + private: - + Ice::CommunicatorPtr _communicator; }; - + } MainHelperI::MainHelperI(id controller, const string& dll, const StringSeq& args) : @@ -144,7 +148,7 @@ MainHelperI::shutdown() { return; } - + if(_dllTestShutdown) { _dllTestShutdown(); @@ -169,9 +173,9 @@ void MainHelperI::run() { NSString* bundlePath = [[NSBundle mainBundle] privateFrameworksPath]; - + bundlePath = [bundlePath stringByAppendingPathComponent:[NSString stringWithUTF8String:_dll.c_str()]]; - + NSURL* bundleURL = [NSURL fileURLWithPath:bundlePath]; _handle = CFBundleCreate(NULL, (CFURLRef)bundleURL); if(!_handle) @@ -180,7 +184,7 @@ MainHelperI::run() completed(EXIT_FAILURE); return; } - + CFErrorRef error = nil; Boolean loaded = CFBundleLoadExecutableAndReturnError(_handle, &error); if(error != nil || !loaded) @@ -189,7 +193,10 @@ MainHelperI::run() completed(EXIT_FAILURE); return; } - + + // The following call is necessary to prevent random failures from CFBundleGetFunctionPointerForName + dlsym(_handle, "dllTestShutdown"); + void* sym = CFBundleGetFunctionPointerForName(_handle, CFSTR("dllTestShutdown")); if(sym == 0) { @@ -200,7 +207,7 @@ MainHelperI::run() return; } _dllTestShutdown = (SHUTDOWN_ENTRY_POINT)sym; - + sym = CFBundleGetFunctionPointerForName(_handle, CFSTR("dllMain")); if(sym == 0) { @@ -210,7 +217,7 @@ MainHelperI::run() completed(EXIT_FAILURE); return; } - + MAIN_ENTRY_POINT dllMain = (MAIN_ENTRY_POINT)sym; char** argv = new char*[_args.size() + 1]; for(unsigned int i = 0; i < _args.size(); ++i) @@ -309,7 +316,8 @@ ProcessI::terminate(const Ice::Current& current) return _helper->getOutput(); } -ProcessControllerI::ProcessControllerI(id controller) : _controller(controller) +ProcessControllerI::ProcessControllerI(id controller, NSString* ipv4, NSString* ipv6) : + _controller(controller), _ipv4([ipv4 UTF8String]), _ipv6([ipv6 UTF8String]) { } @@ -329,23 +337,33 @@ ProcessControllerI::start(const string& testSuite, const string& exe, const Stri return ICE_UNCHECKED_CAST(ProcessPrx, c.adapter->addWithUUID(ICE_MAKE_SHARED(ProcessI, _controller, helper.get()))); } -ControllerHelper::ControllerHelper(id controller) +string +#ifdef ICE_CPP11_MAPPING +ProcessControllerI::getHost(string protocol, bool ipv6, const Ice::Current& c) +#else +ProcessControllerI::getHost(const string& protocol, bool ipv6, const Ice::Current& c) +#endif +{ + return ipv6 ? _ipv6 : _ipv4; +} + +ControllerHelper::ControllerHelper(id controller, NSString* ipv4, NSString* ipv6) { Ice::registerIceDiscovery(); - + Ice::InitializationData initData = Ice::InitializationData(); initData.properties = Ice::createProperties(); initData.properties->setProperty("Ice.ThreadPool.Server.SizeMax", "10"); initData.properties->setProperty("IceDiscovery.DomainId", "TestController"); - initData.properties->setProperty("IceDiscovery.Interface", "127.0.0.1"); - initData.properties->setProperty("Ice.Default.Host", "127.0.0.1"); + initData.properties->setProperty("IceDiscovery.Interface", [ipv4 UTF8String]); + initData.properties->setProperty("Ice.Default.Host", [ipv4 UTF8String]); initData.properties->setProperty("ControllerAdapter.Endpoints", "tcp"); //initData.properties->setProperty("Ice.Trace.Network", "2"); //initData.properties->setProperty("Ice.Trace.Protocol", "2"); initData.properties->setProperty("ControllerAdapter.AdapterId", Ice::generateUUID()); - + _communicator = Ice::initialize(initData); - + Ice::ObjectAdapterPtr adapter = _communicator->createObjectAdapter("ControllerAdapter"); Ice::Identity ident; #if TARGET_IPHONE_SIMULATOR != 0 @@ -354,7 +372,7 @@ ControllerHelper::ControllerHelper(id controller) ident.category = "iPhoneOS"; #endif ident.name = [[[NSBundle mainBundle] bundleIdentifier] UTF8String]; - adapter->add(ICE_MAKE_SHARED(ProcessControllerI, controller), ident); + adapter->add(ICE_MAKE_SHARED(ProcessControllerI, controller, ipv4, ipv6), ident); adapter->activate(); } @@ -370,15 +388,19 @@ extern "C" { void -startController(id controller) +startController(id controller, NSString* ipv4, NSString* ipv6) { - controllerHelper = new ControllerHelper(controller); + controllerHelper = new ControllerHelper(controller, ipv4, ipv6); } void stopController() { - delete controllerHelper; + if(controllerHelper) + { + delete controllerHelper; + controllerHelper = 0; + } } } -- cgit v1.2.3