/* * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you 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 "TProtocolUtil.h" @implementation TProtocolUtil +(BOOL) skipType:(int)type onProtocol:(id )protocol error:(NSError **)error { switch (type) { case TTypeBOOL: { BOOL val; if (![protocol readBool:&val error:error]) { return NO; } } break; case TTypeBYTE: { UInt8 val; if (![protocol readByte:&val error:error]) { return NO; } } break; case TTypeI16: { SInt16 val; if (![protocol readI16:&val error:error]) { return NO; } } break; case TTypeI32: { SInt32 val; if (![protocol readI32:&val error:error]) { return NO; } } break; case TTypeI64: { SInt64 val; if (![protocol readI64:&val error:error]) { return NO; } } break; case TTypeDOUBLE: { double val; if (![protocol readDouble:&val error:error]) { return NO; } } break; case TTypeSTRING: { NSString *val; if (![protocol readString:&val error:error]) { return NO; } } break; case TTypeSTRUCT: { if (![protocol readStructBeginReturningName:NULL error:error]) { return NO; } while (true) { SInt32 fieldType; if (![protocol readFieldBeginReturningName:nil type:&fieldType fieldID:nil error:error]) { return NO; } if (fieldType == TTypeSTOP) { break; } if (![self skipType:fieldType onProtocol:protocol error:error]) { return NO; } if (![protocol readFieldEnd:error]) { return NO; } } if (![protocol readStructEnd:error]) { return NO; } } break; case TTypeMAP: { SInt32 keyType; SInt32 valueType; SInt32 size; if (![protocol readMapBeginReturningKeyType:&keyType valueType:&valueType size:&size error:error]) { return NO; } int i; for (i = 0; i < size; i++) { if (![TProtocolUtil skipType:keyType onProtocol:protocol error:error]) { return NO; } if (![TProtocolUtil skipType:valueType onProtocol:protocol error:error]) { return NO; } } if (![protocol readMapEnd:error]) { return NO; } } break; case TTypeSET: { SInt32 elemType; SInt32 size; if (![protocol readSetBeginReturningElementType:&elemType size:&size error:error]) { return NO; } int i; for (i = 0; i < size; i++) { if (![TProtocolUtil skipType:elemType onProtocol:protocol error:error]) { return NO; } } if (![protocol readSetEnd:error]) { return NO; } } break; case TTypeLIST: { SInt32 elemType; SInt32 size; if (![protocol readListBeginReturningElementType:&elemType size:&size error:error]) { return NO; } int i; for (i = 0; i < size; i++) { if (![TProtocolUtil skipType:elemType onProtocol:protocol error:error]) { return NO; } } if (![protocol readListEnd:error]) { return NO; } } break; } return YES; } @end