(* * 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. *) unit Thrift; interface uses SysUtils, Thrift.Utils, Thrift.Exception, Thrift.Protocol; const Version = '0.18.1'; type TException = Thrift.Exception.TException; // compatibility alias TApplicationExceptionSpecializedClass = class of TApplicationExceptionSpecialized; TApplicationException = class( TException, IBase, ISupportsToString) public type {$SCOPEDENUMS ON} TExceptionType = ( Unknown, UnknownMethod, InvalidMessageType, WrongMethodName, BadSequenceID, MissingResult, InternalError, ProtocolError, InvalidTransform, InvalidProtocol, UnsupportedClientType ); {$SCOPEDENUMS OFF} strict private FExceptionType : TExceptionType; strict protected function QueryInterface(const IID: TGUID; out Obj): HResult; stdcall; function _AddRef: Integer; stdcall; function _Release: Integer; stdcall; strict protected constructor HiddenCreate(const Msg: string); class function GetSpecializedExceptionType(AType: TExceptionType): TApplicationExceptionSpecializedClass; public // purposefully hide inherited constructor class function Create(const Msg: string): TApplicationException; overload; deprecated 'Use specialized TApplicationException types (or regenerate from IDL)'; class function Create: TApplicationException; overload; deprecated 'Use specialized TApplicationException types (or regenerate from IDL)'; class function Create( AType: TExceptionType): TApplicationException; overload; deprecated 'Use specialized TApplicationException types (or regenerate from IDL)'; class function Create( AType: TExceptionType; const msg: string): TApplicationException; overload; deprecated 'Use specialized TApplicationException types (or regenerate from IDL)'; function Type_: TExceptionType; virtual; procedure IBase_Read( const iprot: IProtocol); procedure IBase.Read = IBase_Read; class function Read( const iprot: IProtocol): TApplicationException; procedure Write( const oprot: IProtocol ); end; // Needed to remove deprecation warning TApplicationExceptionSpecialized = class abstract (TApplicationException) strict protected class function GetType: TApplicationException.TExceptionType; virtual; abstract; public constructor Create(const Msg: string); function Type_: TApplicationException.TExceptionType; override; end; TApplicationExceptionUnknown = class (TApplicationExceptionSpecialized) strict protected class function GetType: TApplicationException.TExceptionType; override; end; TApplicationExceptionUnknownMethod = class (TApplicationExceptionSpecialized) strict protected class function GetType: TApplicationException.TExceptionType; override; end; TApplicationExceptionInvalidMessageType = class (TApplicationExceptionSpecialized) strict protected class function GetType: TApplicationException.TExceptionType; override; end; TApplicationExceptionWrongMethodName = class (TApplicationExceptionSpecialized) strict protected class function GetType: TApplicationException.TExceptionType; override; end; TApplicationExceptionBadSequenceID = class (TApplicationExceptionSpecialized) strict protected class function GetType: TApplicationException.TExceptionType; override; end; TApplicationExceptionMissingResult = class (TApplicationExceptionSpecialized) strict protected class function GetType: TApplicationException.TExceptionType; override; end; TApplicationExceptionInternalError = class (TApplicationExceptionSpecialized) strict protected class function GetType: TApplicationException.TExceptionType; override; end; TApplicationExceptionProtocolError = class (TApplicationExceptionSpecialized) strict protected class function GetType: TApplicationException.TExceptionType; override; end; TApplicationExceptionInvalidTransform = class (TApplicationExceptionSpecialized) strict protected class function GetType: TApplicationException.TExceptionType; override; end; TApplicationExceptionInvalidProtocol = class (TApplicationExceptionSpecialized) strict protected class function GetType: TApplicationException.TExceptionType; override; end; TApplicationExceptionUnsupportedClientType = class (TApplicationExceptionSpecialized) strict protected class function GetType: TApplicationException.TExceptionType; override; end; implementation { TApplicationException } constructor TApplicationException.HiddenCreate(const Msg: string); begin inherited Create(Msg); end; class function TApplicationException.Create(const Msg: string): TApplicationException; begin Result := TApplicationExceptionUnknown.Create(Msg); end; class function TApplicationException.Create: TApplicationException; begin Result := TApplicationExceptionUnknown.Create(''); end; class function TApplicationException.Create( AType: TExceptionType): TApplicationException; begin {$WARN SYMBOL_DEPRECATED OFF} Result := Create(AType, ''); {$WARN SYMBOL_DEPRECATED DEFAULT} end; class function TApplicationException.Create( AType: TExceptionType; const msg: string): TApplicationException; begin Result := GetSpecializedExceptionType(AType).Create(msg); end; function TApplicationException.QueryInterface(const IID: TGUID; out Obj): HResult; begin if GetInterface(IID, Obj) then result := S_OK else result := E_NOINTERFACE; end; function TApplicationException._AddRef: Integer; begin result := -1; // not refcounted end; function TApplicationException._Release: Integer; begin result := -1; // not refcounted end; function TApplicationException.Type_: TExceptionType; begin result := FExceptionType; end; class function TApplicationException.GetSpecializedExceptionType(AType: TExceptionType): TApplicationExceptionSpecializedClass; begin case AType of TExceptionType.UnknownMethod: Result := TApplicationExceptionUnknownMethod; TExceptionType.InvalidMessageType: Result := TApplicationExceptionInvalidMessageType; TExceptionType.WrongMethodName: Result := TApplicationExceptionWrongMethodName; TExceptionType.BadSequenceID: Result := TApplicationExceptionBadSequenceID; TExceptionType.MissingResult: Result := TApplicationExceptionMissingResult; TExceptionType.InternalError: Result := TApplicationExceptionInternalError; TExceptionType.ProtocolError: Result := TApplicationExceptionProtocolError; TExceptionType.InvalidTransform: Result := TApplicationExceptionInvalidTransform; TExceptionType.InvalidProtocol: Result := TApplicationExceptionInvalidProtocol; TExceptionType.UnsupportedClientType: Result := TApplicationExceptionUnsupportedClientType; else ASSERT( TExceptionType.Unknown = aType); Result := TApplicationExceptionUnknown; end; end; procedure TApplicationException.IBase_Read( const iprot: IProtocol); var field : TThriftField; struc : TThriftStruct; begin struc := iprot.ReadStructBegin; while ( True ) do begin field := iprot.ReadFieldBegin; if ( field.Type_ = TType.Stop) then begin Break; end; case field.Id of 1 : begin if ( field.Type_ = TType.String_) then begin Exception(Self).Message := iprot.ReadString; end else begin TProtocolUtil.Skip( iprot, field.Type_ ); end; end; 2 : begin if ( field.Type_ = TType.I32) then begin FExceptionType := TExceptionType( iprot.ReadI32 ); end else begin TProtocolUtil.Skip( iprot, field.Type_ ); end; end else begin TProtocolUtil.Skip( iprot, field.Type_); end; end; iprot.ReadFieldEnd; end; iprot.ReadStructEnd; end; class function TApplicationException.Read( const iprot: IProtocol): TApplicationException; var instance : TApplicationException; base : IBase; begin instance := TApplicationException.CreateFmt('',[]); try if Supports( instance, IBase, base) then try base.Read(iprot); finally base := nil; // clear ref before free end; result := GetSpecializedExceptionType(instance.Type_).Create( Exception(instance).Message); finally instance.Free; end; end; procedure TApplicationException.Write( const oprot: IProtocol); var struc : TThriftStruct; field : TThriftField; begin Init(struc, 'TApplicationException'); Init(field); oprot.WriteStructBegin( struc ); if Message <> '' then begin field.Name := 'message'; field.Type_ := TType.String_; field.Id := 1; oprot.WriteFieldBegin( field ); oprot.WriteString( Message ); oprot.WriteFieldEnd; end; field.Name := 'type'; field.Type_ := TType.I32; field.Id := 2; oprot.WriteFieldBegin(field); oprot.WriteI32(Integer(Type_)); oprot.WriteFieldEnd(); oprot.WriteFieldStop(); oprot.WriteStructEnd(); end; { TApplicationExceptionSpecialized } constructor TApplicationExceptionSpecialized.Create(const Msg: string); begin inherited HiddenCreate(Msg); end; function TApplicationExceptionSpecialized.Type_: TApplicationException.TExceptionType; begin result := GetType; end; { specialized TApplicationExceptions } class function TApplicationExceptionUnknownMethod.GetType : TApplicationException.TExceptionType; begin result := TExceptionType.UnknownMethod; end; class function TApplicationExceptionInvalidMessageType.GetType : TApplicationException.TExceptionType; begin result := TExceptionType.InvalidMessageType; end; class function TApplicationExceptionWrongMethodName.GetType : TApplicationException.TExceptionType; begin result := TExceptionType.WrongMethodName; end; class function TApplicationExceptionBadSequenceID.GetType : TApplicationException.TExceptionType; begin result := TExceptionType.BadSequenceID; end; class function TApplicationExceptionMissingResult.GetType : TApplicationException.TExceptionType; begin result := TExceptionType.MissingResult; end; class function TApplicationExceptionInternalError.GetType : TApplicationException.TExceptionType; begin result := TExceptionType.InternalError; end; class function TApplicationExceptionProtocolError.GetType : TApplicationException.TExceptionType; begin result := TExceptionType.ProtocolError; end; class function TApplicationExceptionInvalidTransform.GetType : TApplicationException.TExceptionType; begin result := TExceptionType.InvalidTransform; end; class function TApplicationExceptionInvalidProtocol.GetType : TApplicationException.TExceptionType; begin result := TExceptionType.InvalidProtocol; end; class function TApplicationExceptionUnsupportedClientType.GetType : TApplicationException.TExceptionType; begin result := TExceptionType.UnsupportedClientType; end; class function TApplicationExceptionUnknown.GetType : TApplicationException.TExceptionType; begin result := TExceptionType.Unknown; end; end.