Main Page   Class Hierarchy   Compound List   File List   Compound Members   File Members  

magserverresult.cpp

Go to the documentation of this file.
00001 // magserverresult.cpp: implementation of the MagServerResult class.
00002 //
00004 
00005 #include "magserverresult.h"
00006 
00007 //  0123456789.123456789.123456789.123456789.123456789.123456789.123456789.123456789.123456789.123456789.123456789.123456789.123456789.123456789.123456789.123456789.123456789
00008 //            1         2         3         4         5         6         7         8         9         0         1         2         3         4         5         6
00009 //
00010 //  EEEEEEE OOOOOOO T M.MMMMM EE.EEEE AAAAAAAAA\n
00011 //
00012 //  IDIDIDIDID  CHCHCHCHCH CPCPCPCP SSSS CCC NNN LLLL la.ttttt lon.nnnnn elev.vvv azm.mm dip.ppp T AA.AAAA amp1.DDDD AMP1TIMEEEE AMP1PERIOD amp2.DDDD AMP2TIMEEEE AMP2PERIOD
00013 // 
00014 #define MSR_HEADER_LINE_SZ_EST  50
00015 #define MSR_CHAN_LINE_SZ_EST   180
00016 
00018 // Construction/Destruction
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    // add estimated sizes for the magnitude and
00116    // and channel lines.
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    // Build the header line
00132    //
00133    // EEEEEEE OOOOOOO T M.MMMMM EE.EEEE AAAAAAAAA\n
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       // build a channel line
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    // Remove this line from the buffer
00200 
00201    MessageBuffer.erase( 0 , _index + 1 );
00202 
00203    // parse the header line
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    // parse the channel lines
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          // Remove this line from the buffer
00237 
00238          MessageBuffer.erase( 0 , _index + 1 );
00239 
00240          // parse the channel line
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       } //  have a line with content 
00269 
00270    } while ( 0 < _index );
00271 
00272 }
00273 //
00274 //-------------------------------------------------------------------
00275 //

Generated on Tue May 6 09:16:04 2003 for Earthworm Libs by doxygen1.3-rc3