1#
2# Licensed to the Apache Software Foundation (ASF) under one
3# or more contributor license agreements. See the NOTICE file
4# distributed with this work for additional information
5# regarding copyright ownership. The ASF licenses this file
6# to you under the Apache License, Version 2.0 (the
7# "License"); you may not use this file except in compliance
8# with the License. You may obtain a copy of the License at
9#
10#   http://www.apache.org/licenses/LICENSE-2.0
11#
12# Unless required by applicable law or agreed to in writing,
13# software distributed under the License is distributed on an
14# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
15# KIND, either express or implied. See the License for the
16# specific language governing permissions and limitations
17# under the License.
18#
19
20use 5.10.0;
21use strict;
22use warnings;
23
24use Thrift;
25use Thrift::Type;
26
27package Thrift::TException;
28use version 0.77; our $VERSION = version->declare("$Thrift::VERSION");
29
30use overload '""' => sub {
31    return
32        sprintf '%s error: %s (code %s)',
33          ref( $_[0] ),
34          ( $_[0]->{message} || 'empty message' ),
35          ( defined $_[0]->{code} ? $_[0]->{code} : 'undefined' );
36    };
37
38sub new {
39    my $classname = shift;
40    my $self = {message => shift, code => shift || 0};
41
42    return bless($self,$classname);
43}
44
45package Thrift::TApplicationException;
46use parent -norequire, 'Thrift::TException';
47use version 0.77; our $VERSION = version->declare("$Thrift::VERSION");
48
49use constant UNKNOWN                 => 0;
50use constant UNKNOWN_METHOD          => 1;
51use constant INVALID_MESSAGE_TYPE    => 2;
52use constant WRONG_METHOD_NAME       => 3;
53use constant BAD_SEQUENCE_ID         => 4;
54use constant MISSING_RESULT          => 5;
55use constant INTERNAL_ERROR          => 6;
56use constant PROTOCOL_ERROR          => 7;
57use constant INVALID_TRANSFORM       => 8;
58use constant INVALID_PROTOCOL        => 9;
59use constant UNSUPPORTED_CLIENT_TYPE => 10;
60
61sub new {
62    my $classname = shift;
63
64    my $self = $classname->SUPER::new(@_);
65
66    return bless($self,$classname);
67}
68
69sub read {
70    my $self  = shift;
71    my $input = shift;
72
73    my $xfer  = 0;
74    my $fname = undef;
75    my $ftype = 0;
76    my $fid   = 0;
77
78    $xfer += $input->readStructBegin(\$fname);
79
80    while (1)
81    {
82        $xfer += $input->readFieldBegin(\$fname, \$ftype, \$fid);
83        if ($ftype == Thrift::TType::STOP) {
84            last; next;
85        }
86
87      SWITCH: for($fid)
88      {
89          /1/ && do{
90
91              if ($ftype == Thrift::TType::STRING) {
92                  $xfer += $input->readString(\$self->{message});
93              }
94              else {
95                  $xfer += $input->skip($ftype);
96              }
97
98              last;
99          };
100
101          /2/ && do{
102              if ($ftype == Thrift::TType::I32) {
103                  $xfer += $input->readI32(\$self->{code});
104              }
105              else {
106                  $xfer += $input->skip($ftype);
107              }
108              last;
109          };
110
111          $xfer += $input->skip($ftype);
112      }
113
114      $xfer += $input->readFieldEnd();
115    }
116    $xfer += $input->readStructEnd();
117
118    return $xfer;
119}
120
121sub write {
122    my $self   = shift;
123    my $output = shift;
124
125    my $xfer   = 0;
126
127    $xfer += $output->writeStructBegin('TApplicationException');
128
129    if ($self->getMessage()) {
130        $xfer += $output->writeFieldBegin('message', Thrift::TType::STRING, 1);
131        $xfer += $output->writeString($self->getMessage());
132        $xfer += $output->writeFieldEnd();
133    }
134
135    if ($self->getCode()) {
136        $xfer += $output->writeFieldBegin('type', Thrift::TType::I32, 2);
137        $xfer += $output->writeI32($self->getCode());
138        $xfer += $output->writeFieldEnd();
139    }
140
141    $xfer += $output->writeFieldStop();
142    $xfer += $output->writeStructEnd();
143
144    return $xfer;
145}
146
147sub getMessage
148{
149    my $self = shift;
150
151    return $self->{message};
152}
153
154sub getCode
155{
156    my $self = shift;
157
158    return $self->{code};
159}
160
1611;
162