00001
00002
00003
00004
00005
00006
00007
00008
00009
00010 #include "Group_AMOS.hh"
00011 using namespace AMOS;
00012 using namespace std;
00013
00014
00015
00016
00017
00018 const NCode_t Group_t::NCODE = M_GROUP;
00019
00020
00021
00022 void Group_t::readMessage (const Message_t & msg)
00023 {
00024 Universal_t::readMessage (msg);
00025
00026 try {
00027
00028 istringstream ss;
00029
00030 if ( msg . exists (F_MEMBER) )
00031 {
00032 ID_t iid;
00033
00034 ss . str (msg . getField (F_MEMBER));
00035
00036 while ( ss )
00037 {
00038 ss >> iid;
00039 if ( ! ss . fail( ) )
00040 mems_m . push_back (iid);
00041 }
00042
00043 if ( ! ss . eof( ) )
00044 AMOS_THROW_ARGUMENT ("Invalid member list format");
00045 ss . clear( );
00046 }
00047
00048 if ( msg . exists (F_OBJECT) )
00049 {
00050 string str;
00051
00052 ss . str (msg . getField (F_OBJECT));
00053 ss >> str;
00054 if ( !ss || str . length( ) != NCODE_SIZE )
00055 AMOS_THROW_ARGUMENT ("Invalid object type format");
00056 ss . clear( );
00057 memtype_m = Encode (str);
00058 }
00059 }
00060 catch (ArgumentException_t) {
00061
00062 clear( );
00063 throw;
00064 }
00065 }
00066
00067
00068
00069 void Group_t::readRecord (istream & fix, istream & var)
00070 {
00071 Universal_t::readRecord (fix, var);
00072
00073 Size_t size;
00074 readLE (fix, &size);
00075 readLE (fix, &memtype_m);
00076
00077 mems_m . resize (size, NULL_ID);
00078 for ( Pos_t i = 0; i < size; i ++ )
00079 readLE (var, &(mems_m [i]));
00080 }
00081
00082
00083
00084
00085 void Group_t::readRecordFix (istream & fix)
00086 {
00087 Universal_t::readRecordFix (fix);
00088
00089 Size_t size;
00090 readLE (fix, &size);
00091 readLE (fix, &memtype_m);
00092
00093 mems_m . clear();
00094 }
00095
00096
00097
00098 void Group_t::writeMessage (Message_t & msg) const
00099 {
00100 Universal_t::writeMessage (msg);
00101
00102 try {
00103 ostringstream ss;
00104
00105 msg . setMessageCode (Group_t::NCODE);
00106
00107 if ( !mems_m . empty( ) )
00108 {
00109 string s;
00110 vector<ID_t>::const_iterator vi;
00111
00112 for ( vi = mems_m . begin( ); vi != mems_m . end( ); vi ++ )
00113 {
00114 ss << *vi << endl;
00115 s . append (ss . str( ));
00116 ss . str (NULL_STRING);
00117 }
00118
00119 msg . setField (F_MEMBER, s);
00120 }
00121
00122 if ( memtype_m != NULL_NCODE )
00123 {
00124 msg . setField (F_OBJECT, Decode (memtype_m));
00125 ss . str (NULL_STRING);
00126 }
00127 }
00128 catch (ArgumentException_t) {
00129
00130 msg . clear( );
00131 throw;
00132 }
00133 }
00134
00135
00136
00137 void Group_t::writeRecord (ostream & fix, ostream & var) const
00138 {
00139 Universal_t::writeRecord (fix, var);
00140
00141 Size_t size = mems_m . size( );
00142 writeLE (fix, &size);
00143 writeLE (fix, &memtype_m);
00144
00145 for ( Pos_t i = 0; i < size; i ++ )
00146 writeLE (var, &(mems_m [i]));
00147 }