00001
00002
00004
00005 #include "magserverresult.h"
00006
00007
00008
00009
00010
00011
00012
00013
00014 #define MSR_HEADER_LINE_SZ_EST 50
00015 #define MSR_CHAN_LINE_SZ_EST 180
00016
00018
00020
00021 MagServerResult::MagServerResult()
00022 {
00023 EventId = 0L;
00024 OriginId = 0L;
00025 MagType = MAGTYPE_UNDEFINED;
00026 MagAverage = 0.0;
00027 MagError = 0.0;
00028
00029 Author = "000000000";
00030 }
00031
00032
00033
00034 void MagServerResult::SetMagnitudeInfo( long p_eventid
00035 , long p_originid
00036 , int p_magtype
00037 , float p_average
00038 , float p_error
00039 , const char * p_author
00040 )
00041 {
00042 EventId = p_eventid;
00043 OriginId = p_originid;
00044 MagType = p_magtype;
00045 MagAverage = p_average;
00046 MagError = p_error;
00047
00048 Author = ( p_author == NULL ? "000000000" : p_author );
00049 }
00050
00051
00052
00053 void MagServerResult::ClearChannels()
00054 {
00055 Channels.clear();
00056 }
00057
00058
00059
00060 void MagServerResult::AddChannel( MAG_SRVR_CHANNEL p_channelinfo )
00061 {
00062 Channels.push_back( p_channelinfo );
00063 }
00064
00065
00066
00067 const long MagServerResult::GetEventId() const { return EventId; }
00068
00069
00070
00071 const long MagServerResult::GetOriginId() const { return OriginId; }
00072
00073
00074
00075 const int MagServerResult::GetMagType() const { return MagType; }
00076
00077
00078
00079 const float MagServerResult::GetAverage() const { return MagAverage; }
00080
00081
00082
00083 const float MagServerResult::GetError() const { return MagError; }
00084
00085
00086
00087 const char * MagServerResult::GetAuthor() const { return Author.c_str(); }
00088
00089
00090
00091 const int MagServerResult::GetChannelCount() { return Channels.size(); }
00092
00093
00094
00095 bool MagServerResult::GetChannel( unsigned int p_index
00096 , MAG_SRVR_CHANNEL * r_channel
00097 ) const
00098 {
00099 if ( Channels.size() <= p_index
00100 || r_channel == NULL
00101 )
00102 {
00103 return false;
00104 }
00105
00106 *r_channel = Channels[p_index];
00107
00108 return true;
00109 }
00110
00111
00112
00113 long MagServerResult::BufferInitAlloc()
00114 {
00115
00116
00117 return MutableServerResult::BufferInitAlloc()
00118 + MSR_HEADER_LINE_SZ_EST
00119 + Channels.size() * MSR_CHAN_LINE_SZ_EST
00120 ;
00121 }
00122
00123
00124
00125 void MagServerResult::FormatDerivativeData()
00126 {
00127 MutableServerResult::FormatDerivativeData();
00128
00129 char _wrk[240];
00130
00131
00132
00133
00134
00135 sprintf( _wrk
00136 , "%d %d %d %f %f %f %s\n"
00137 , EventId
00138 , OriginId
00139 , MagType
00140 , MagAverage
00141 , MagError
00142 , Author.c_str()
00143 );
00144
00145 MessageBuffer += _wrk;
00146
00147 for ( int _c = 0 ; _c < Channels.size() ; _c++ )
00148 {
00149
00150
00151 sprintf( _wrk
00152 , "%d %d %d %s %s %s %s %f %f %f %f %f %d %f %f %f %f %f %f\n"
00153 , Channels[_c].ampid
00154 , Channels[_c].channelid
00155 , Channels[_c].componentid
00156 , Channels[_c].sta
00157 , Channels[_c].comp
00158 , Channels[_c].net
00159 , Channels[_c].loc
00160 , Channels[_c].lat
00161 , Channels[_c].lon
00162 , Channels[_c].elev
00163 , Channels[_c].azm
00164 , Channels[_c].dip
00165 , Channels[_c].magnitude
00166 , Channels[_c].amp1
00167 , Channels[_c].amp1time
00168 , Channels[_c].amp1period
00169 , Channels[_c].amp2
00170 , Channels[_c].amp2time
00171 , Channels[_c].amp2period
00172 );
00173
00174 MessageBuffer += _wrk;
00175 }
00176
00177 }
00178
00179
00180
00181 void MagServerResult::ParseDerivativeData()
00182 {
00183 MutableServerResult::ParseDerivativeData();
00184
00185 long _index;
00186
00187 if ( (_index = MessageBuffer.find("\n")) == MessageBuffer.npos )
00188 {
00189 throw worm_exception("Unterminated message while parsing MagServerResult header");
00190 }
00191
00192 if ( _index < 2 )
00193 {
00194 throw worm_exception("Incomplete header line while parsing MagServerResult");
00195 }
00196
00197 std::string _readline = MessageBuffer.substr( 0 , _index );
00198
00199
00200
00201 MessageBuffer.erase( 0 , _index + 1 );
00202
00203
00204
00205 char _author[60];
00206
00207 if ( sscanf( _readline.c_str()
00208 , "%ld %ld %d %f %f %f %s\n"
00209 , &EventId
00210 , &OriginId
00211 , &MagType
00212 , &MagAverage
00213 , &MagError
00214 , _author
00215 ) != 6 )
00216 {
00217 throw worm_exception("Invalid header line while parsing MagServerResult");
00218 }
00219
00220
00221
00222
00223 MAG_SRVR_CHANNEL _channel;
00224
00225 do
00226 {
00227 if ( (_index = MessageBuffer.find("\n")) == MessageBuffer.npos )
00228 {
00229 throw worm_exception("Unterminated message while parsing MagServerResult channel");
00230 }
00231
00232 if ( 0 < _index )
00233 {
00234 _readline = MessageBuffer.substr( 0 , _index );
00235
00236
00237
00238 MessageBuffer.erase( 0 , _index + 1 );
00239
00240
00241
00242 if ( sscanf( _readline.c_str()
00243 , "%ld %ld %s %s %s %s %f %f %f %f %f %d %f %f %lf %f %f %lf %f\n"
00244 , &_channel.ampid
00245 , &_channel.channelid
00246 , &_channel.componentid
00247 , _channel.sta
00248 , _channel.comp
00249 , _channel.net
00250 , _channel.loc
00251 , &_channel.lat
00252 , &_channel.lon
00253 , &_channel.elev
00254 , &_channel.azm
00255 , &_channel.dip
00256 , &_channel.magnitude
00257 , &_channel.amp1
00258 , &_channel.amp1time
00259 , &_channel.amp1period
00260 , &_channel.amp2
00261 , &_channel.amp2time
00262 , &_channel.amp2period
00263 ) != 19 )
00264 {
00265 throw worm_exception("Invalid channel line while parsing MagServerResult");
00266 }
00267
00268 }
00269
00270 } while ( 0 < _index );
00271
00272 }
00273
00274
00275