// ********************************************************************** // // Copyright (c) 2003-2017 ZeroC, Inc. All rights reserved. // // This copy of Ice is licensed to you under the terms described in the // ICE_LICENSE file included in this distribution. // // ********************************************************************** #import #import #import #include @interface ICEBatchRequest : NSObject { const Ice::BatchRequest* cxxRequest_; } -(void) reset:(const Ice::BatchRequest*)call; @end namespace { class BatchRequestInterceptorI : public Ice::BatchRequestInterceptor { public: // We must explicitely retain/release so that the garbage // collector does not trash the dispatcher. BatchRequestInterceptorI(void(^interceptor)(id, int, int)) : _interceptor(Block_copy(interceptor)), _request([[ICEBatchRequest alloc] init]) { } virtual ~BatchRequestInterceptorI() { Block_release(_interceptor); [_request release]; } virtual void enqueue(const Ice::BatchRequest& request, int count, int size) { NSException* ex = nil; @autoreleasepool { @try { [_request reset:&request]; _interceptor(_request, count, size); } @catch(id e) { ex = [e retain]; } } if(ex != nil) { rethrowCxxException(ex, true); // True = release the exception. } } private: void(^_interceptor)(id, int, int); ICEBatchRequest* _request; }; typedef IceUtil::Handle BatchRequestInterceptorIPtr; } @implementation ICEBatchRequestInterceptor +(Ice::BatchRequestInterceptor*) batchRequestInterceptorWithBatchRequestInterceptor:(void(^)(id, int, int))interceptor { return new BatchRequestInterceptorI(interceptor); } @end @implementation ICEBatchRequest -(void) reset:(const Ice::BatchRequest*)request { cxxRequest_ = request; } -(void) enqueue { cppCall(^ { cxxRequest_->enqueue(); }); } -(int) getSize { return cxxRequest_->getSize(); } -(NSString*) getOperation { return [toNSString(cxxRequest_->getOperation()) autorelease]; } -(id) getProxy { return [ICEObjectPrx iceObjectPrxWithObjectPrx:cxxRequest_->getProxy()]; } @end