| // |
| // 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 <Foundation/Foundation.h> |
| #import <objc/runtime.h> |
| |
| #import "Service/Sources/EDOObject.h" |
| |
| NS_ASSUME_NONNULL_BEGIN |
| |
| /** Check if the given C-string type is an Id type. */ |
| #define EDO_IS_OBJECT(__type) ((__type)[0] == _C_ID) |
| /** Check if the given C-string type is a class type. */ |
| #define EDO_IS_CLASS(__type) ((__type)[0] == _C_CLASS && (__type)[1] == '\0') |
| /** Check if the given C-string type is an Id type or a class type. */ |
| #define EDO_IS_OBJECT_OR_CLASS(__type) (EDO_IS_OBJECT(__type) || EDO_IS_CLASS(__type)) |
| /** Check if the given C-string type is a pointer type that points to an Id. */ |
| #define EDO_IS_OBJPOINTER(__type) \ |
| ((__type)[0] == _C_PTR && (__type)[1] == _C_ID && (__type)[2] == '\0') |
| /** Check if the given C-string type is a pointer type that points to any type. */ |
| #define EDO_IS_POINTER(__type) ((__type)[0] == _C_PTR) |
| /** Check if the given C-string type is a selector type. */ |
| #define EDO_IS_SELECTOR(__type) ((__type)[0] == _C_SEL) |
| |
| /** The boxed value to serialize data and objects when transferring invocations. */ |
| @interface EDOParameter : NSObject <NSSecureCoding> |
| |
| /** The runtime type encoding for the boxed value. */ |
| @property(nonatomic, readonly) NSString *valueObjCType; |
| /** The runtime type c-string encoding for the boxed value. */ |
| @property(nonatomic, readonly) char const *objCType NS_RETURNS_INNER_POINTER; |
| /** The boxed value. */ |
| @property(nonatomic, readonly, nullable) id<NSCoding> value; |
| |
| - (instancetype)init NS_UNAVAILABLE; |
| |
| /** |
| * Unbox the value to save it to the given buffer. |
| * |
| * @note It will not retain nor release any hold object. |
| * @param buffer The buffer to save the value. |
| */ |
| - (void)getValue:(void *)buffer; |
| |
| /** Create a EDOParameter with the given value and type encoding. */ |
| + (instancetype)parameterWithValue:(id<NSCoding> _Nullable)value objCType:(NSString *)objCType; |
| |
| /** Create a EDOParameter with the buffer saving the data and type encoding for the data. */ |
| + (instancetype)parameterWithBytes:(void *_Nullable)bytes objCType:(const char *)objCType; |
| |
| /** Create a EDOParameter with the @c object. */ |
| + (instancetype)parameterWithObject:(id<NSCoding>)object; |
| |
| /** The placeholder for the value = nil. */ |
| + (instancetype)parameterForNilValue; |
| |
| /** The placeholder for the double pointer value = nil, for example, NSError ** = nil. */ |
| + (instancetype)parameterForDoublePointerNullValue; |
| |
| /** |
| * Check if the double pointer is nil. |
| * |
| * When passing down a pointer to an object, the value will be coerced into the object itself: |
| * a) if the value is nullBoxedValue, the original pointer is nil; |
| * b) if the value is nilBoxedValue, the original pointer points to an address that's nil. |
| * c) if the value is an object, the original pointer points to that address, and the address is |
| * reconstructed in the local memory space. |
| */ |
| - (BOOL)isDoublePointerNullValue; |
| |
| @end |
| |
| NS_ASSUME_NONNULL_END |