1*890232f2SAndroid Build Coastguard Worker /* 2*890232f2SAndroid Build Coastguard Worker * Copyright 2021 Google Inc. All rights reserved. 3*890232f2SAndroid Build Coastguard Worker * 4*890232f2SAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License"); 5*890232f2SAndroid Build Coastguard Worker * you may not use this file except in compliance with the License. 6*890232f2SAndroid Build Coastguard Worker * You may obtain a copy of the License at 7*890232f2SAndroid Build Coastguard Worker * 8*890232f2SAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0 9*890232f2SAndroid Build Coastguard Worker * 10*890232f2SAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software 11*890232f2SAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS, 12*890232f2SAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13*890232f2SAndroid Build Coastguard Worker * See the License for the specific language governing permissions and 14*890232f2SAndroid Build Coastguard Worker * limitations under the License. 15*890232f2SAndroid Build Coastguard Worker */ 16*890232f2SAndroid Build Coastguard Worker 17*890232f2SAndroid Build Coastguard Worker #if !os(WASI) 18*890232f2SAndroid Build Coastguard Worker import Foundation 19*890232f2SAndroid Build Coastguard Worker #else 20*890232f2SAndroid Build Coastguard Worker import SwiftOverlayShims 21*890232f2SAndroid Build Coastguard Worker #endif 22*890232f2SAndroid Build Coastguard Worker 23*890232f2SAndroid Build Coastguard Worker /// FlatBufferGRPCMessage protocol that should allow us to invoke 24*890232f2SAndroid Build Coastguard Worker /// initializers directly from the GRPC generated code 25*890232f2SAndroid Build Coastguard Worker public protocol FlatBufferGRPCMessage { 26*890232f2SAndroid Build Coastguard Worker 27*890232f2SAndroid Build Coastguard Worker /// Raw pointer which would be pointing to the beginning of the readable bytes 28*890232f2SAndroid Build Coastguard Worker var rawPointer: UnsafeMutableRawPointer { get } 29*890232f2SAndroid Build Coastguard Worker 30*890232f2SAndroid Build Coastguard Worker /// Size of readable bytes in the buffer 31*890232f2SAndroid Build Coastguard Worker var size: Int { get } 32*890232f2SAndroid Build Coastguard Worker 33*890232f2SAndroid Build Coastguard Worker init(byteBuffer: ByteBuffer) 34*890232f2SAndroid Build Coastguard Worker } 35*890232f2SAndroid Build Coastguard Worker 36*890232f2SAndroid Build Coastguard Worker /// Message is a wrapper around Buffers to to able to send Flatbuffers `Buffers` through the 37*890232f2SAndroid Build Coastguard Worker /// GRPC library 38*890232f2SAndroid Build Coastguard Worker public struct Message<T: FlatBufferObject>: FlatBufferGRPCMessage { 39*890232f2SAndroid Build Coastguard Worker internal var buffer: ByteBuffer 40*890232f2SAndroid Build Coastguard Worker 41*890232f2SAndroid Build Coastguard Worker /// Returns the an object of type T that would be read from the buffer 42*890232f2SAndroid Build Coastguard Worker public var object: T { 43*890232f2SAndroid Build Coastguard Worker T.init( 44*890232f2SAndroid Build Coastguard Worker buffer, 45*890232f2SAndroid Build Coastguard Worker o: Int32(buffer.read(def: UOffset.self, position: buffer.reader)) + 46*890232f2SAndroid Build Coastguard Worker Int32(buffer.reader)) 47*890232f2SAndroid Build Coastguard Worker } 48*890232f2SAndroid Build Coastguard Worker 49*890232f2SAndroid Build Coastguard Worker public var rawPointer: UnsafeMutableRawPointer { 50*890232f2SAndroid Build Coastguard Worker buffer.memory.advanced(by: buffer.reader) } 51*890232f2SAndroid Build Coastguard Worker 52*890232f2SAndroid Build Coastguard Worker public var size: Int { Int(buffer.size) } 53*890232f2SAndroid Build Coastguard Worker 54*890232f2SAndroid Build Coastguard Worker /// Initializes the message with the type Flatbuffer.Bytebuffer that is transmitted over 55*890232f2SAndroid Build Coastguard Worker /// GRPC 56*890232f2SAndroid Build Coastguard Worker /// - Parameter byteBuffer: Flatbuffer ByteBuffer object 57*890232f2SAndroid Build Coastguard Worker public init(byteBuffer: ByteBuffer) { 58*890232f2SAndroid Build Coastguard Worker buffer = byteBuffer 59*890232f2SAndroid Build Coastguard Worker } 60*890232f2SAndroid Build Coastguard Worker 61*890232f2SAndroid Build Coastguard Worker /// Initializes the message by copying the buffer to the message to be sent. 62*890232f2SAndroid Build Coastguard Worker /// from the builder 63*890232f2SAndroid Build Coastguard Worker /// - Parameter builder: FlatbufferBuilder that has the bytes created in 64*890232f2SAndroid Build Coastguard Worker /// - Note: Use `builder.finish(offset)` before passing the builder without prefixing anything to it 65*890232f2SAndroid Build Coastguard Worker public init(builder: inout FlatBufferBuilder) { 66*890232f2SAndroid Build Coastguard Worker buffer = builder.sizedBuffer 67*890232f2SAndroid Build Coastguard Worker builder.clear() 68*890232f2SAndroid Build Coastguard Worker } 69*890232f2SAndroid Build Coastguard Worker } 70