blob: c4b22567c80238e00adb51c5c11601a0ac56dd53 [file] [log] [blame]
//
// Copyright 2018 Google Inc.
//
// Licensed 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.
//
#import "Service/Sources/EDOServiceRequest.h"
#import "Service/Sources/EDOObject+Private.h"
#import "Service/Sources/EDORemoteException.h"
NS_ASSUME_NONNULL_BEGIN
@class EDOHostPort;
@class EDOHostService;
@class EDOParameter;
typedef EDOParameter EDOBoxedValueType;
/** The invocation request to make a remote invocation. */
@interface EDOInvocationRequest : EDOServiceRequest
- (instancetype)init NS_UNAVAILABLE;
/**
* Creates an invocation request.
*
* @param target The remote target's plain address. The caller needs to make sure the
* address is valid.
* @param selector The selector that is sent to the @c target. @c nil if the target is a
* block.
* @param arguments The array of arguments to send.
* @param hostPort The host port the request is sent to.
* @param returnByValue @c YES if the invocation should return the object by value instead of by
* reference (for value-types that are already return-by-value by default,
* this will be a no-op).
*/
+ (instancetype)requestWithTarget:(EDOPointerType)target
selector:(SEL _Nullable)selector
arguments:(NSArray *)arguments
hostPort:(EDOHostPort *)hostPort
returnByValue:(BOOL)returnByValue;
/**
* Creates an invocation request from an @c invocation on an EDOObject.
*
* @param invocation The invocation.
* @param target The EDOObject.
* @param selector The selector to be sent. When this is nil, the case for a block invocation,
* the index of the actual arguments starts at 1; otherwise the case for an
* object invocation, it starts at 2.
* @param returnByValue @c YES if the invocation should return the object by value instead of by
* reference.
* @param service The host service used to wrap the arguments in the @c invocation if any.
*
* @return An instance of EDOInvocationRequest.
*/
+ (instancetype)requestWithInvocation:(NSInvocation *)invocation
target:(EDOObject *)target
selector:(SEL _Nullable)selector
returnByValue:(BOOL)returnByValue
service:(EDOHostService *)service;
@end
/** The invocation response for the remote invocation. */
@interface EDOInvocationResponse : EDOServiceResponse
/** The exception if thrown remotely. */
@property(nonatomic, readonly, nullable) EDORemoteException *exception;
/** The boxed return value. */
@property(nonatomic, readonly, nullable) EDOBoxedValueType *returnValue;
/** The boxed values for out parameter. */
@property(nonatomic, readonly, nullable) NSArray<EDOBoxedValueType *> *outValues;
/**
* Whether the returned object is retained.
*
* With ARC, -retain, -release, and -autorelease, or equivalent methods will be inserted at
* compile time to ensure the correct ownership, according to Objective-C memory conventions,
* however it doesn't guarantee that the retain count will always balance, for example,
* NS_RETURNS_RETAINED will instruct ARC to explicitly transfer the ownership without adding
* an extra -retain. ARC reserves the right to remove any -retain/-release if safe in the context
* of a source file. As eDO builds the remote invocation using @c NSInvocation, this context will
* be lost and ARC treats the memory as what @c NSInvocation states, that is, the annotation gets
* lost and all the returns are already balanced. However the returned object will still be
* retained if the method family is one of +alloc, +new, -mutableCopy, or -copy. ARC will balance
* this by inserting an extra release on the caller, and the object returned will have an extra
* retain count, thus we need to:
* 1) insert an extra retain on the caller;
* 2) insert an extra release on the receiver,
* to ensure that the retain count is balanced.
*
* For more details see
* [ARC
* documentation](https://developer.apple.com/library/archive/releasenotes/ObjectiveC/RN-TransitioningToARC/Introduction/Introduction.html),
* [the method
* families](http://clang.llvm.org/docs/AutomaticReferenceCounting.html#method-families), and
* [retained return
* values](https://clang.llvm.org/docs/AutomaticReferenceCounting.html#retained-return-values).
*/
@property(nonatomic, readonly) BOOL returnRetained;
- (instancetype)init NS_UNAVAILABLE;
@end
NS_ASSUME_NONNULL_END