00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021 #include "versionidentifier.h"
00022
00023 #include <boost/regex.hpp>
00024 #include <boost/algorithm/string.hpp>
00025 #include <boost/algorithm/string/classification.hpp>
00026
00027 #include "errors.h"
00028 #include "basestrm.h"
00029
00030 VersionIdentifier::VersionIdentifier()
00031 {
00032 }
00033
00034 VersionIdentifier :: VersionIdentifier( const ASCString& version )
00035 {
00036 fromString( version );
00037 }
00038
00039 bool VersionIdentifier :: empty()
00040 {
00041 return versions.empty();
00042 }
00043
00044
00045 ASCString VersionIdentifier :: toString() const
00046 {
00047 ASCString s;
00048 for ( int i = 0; i < versions.size(); ++i ) {
00049 if ( i >= 1 )
00050 s += ".";
00051 s += ASCString::toString( versions[i] );
00052 }
00053 return s;
00054 }
00055
00056 void VersionIdentifier :: fromString( const ASCString& v )
00057 {
00058 versions.clear();
00059
00060 boost::regex versionformat( "\\s*(\\d+)(\\.\\d+)*\\s*");
00061 boost::smatch what;
00062
00063 if( !boost::regex_match( v, what, versionformat))
00064 throw ASCmsgException( v + " is not a valid version identifier");
00065
00066 typedef std::vector< ASCString > Split_vector_type;
00067 Split_vector_type splitVector;
00068 split( splitVector, v, boost::is_any_of(".") );
00069
00070 for ( vector<ASCString>::const_iterator i = splitVector.begin(); i != splitVector.end(); ++i ) {
00071 int num = atoi( i->c_str() );
00072 versions.push_back( num );
00073 }
00074 }
00075
00076
00077 VersionIdentifier :: VersionIdentifier( const VersionIdentifier& version )
00078 {
00079 versions = version.versions;
00080 }
00081
00082 static const int versionIdentifierStreamVersion = 1;
00083
00084 void VersionIdentifier :: read ( tnstream& stream )
00085 {
00086 int version = stream.readInt();
00087 if ( version != versionIdentifierStreamVersion )
00088 throw tinvalidversion ( "VersionIdentifier", versionIdentifierStreamVersion, version );
00089
00090 readClassContainer( versions, stream );
00091 }
00092
00093
00094 void VersionIdentifier :: write ( tnstream& stream ) const
00095 {
00096 stream.writeInt( versionIdentifierStreamVersion );
00097 writeClassContainer( versions, stream );
00098 }
00099
00100 bool VersionIdentifier:: trailZero( int index ) const
00101 {
00102 for ( int i = index; i < versions.size(); ++i )
00103 if ( versions[i] != 0 )
00104 return false;
00105 return true;
00106 }
00107
00108
00109 bool VersionIdentifier::operator<= ( const VersionIdentifier& v ) const
00110 {
00111 int m = min ( v.versions.size(), versions.size() );
00112 for ( int i = 0; i < m; ++i ) {
00113 if ( versions[i] > v.versions[i] )
00114 return false;
00115 }
00116 if ( versions.size() < v.versions.size() ) {
00117 return true;
00118 } else {
00119 if ( trailZero( v.versions.size() ))
00120 return true;
00121 else
00122 return false;
00123 }
00124 };
00125
00126
00127 bool VersionIdentifier::operator< ( const VersionIdentifier& v ) const
00128 {
00129 int m = min ( v.versions.size(), versions.size() );
00130 for ( int i = 0; i < m; ++i ) {
00131 if ( versions[i] < v.versions[i] )
00132 return true;
00133 if ( versions[i] > v.versions[i] )
00134 return false;
00135 }
00136 if ( versions.size() < v.versions.size() ) {
00137 if ( v.trailZero( versions.size() ))
00138 return false;
00139 else
00140 return true;
00141 } else {
00142 return false;
00143 }
00144 };
00145
00146 bool VersionIdentifier::operator> ( const VersionIdentifier& v ) const
00147 {
00148 return !operator<=(v);
00149 }
00150
00151 bool VersionIdentifier::operator>= ( const VersionIdentifier& v ) const
00152 {
00153 return !operator<(v);
00154 }
00155
00156
00157
00158 bool VersionIdentifier::operator== ( const VersionIdentifier& v ) const
00159 {
00160 int m = min ( v.versions.size(), versions.size() );
00161 for ( int i = 0; i < m; ++i ) {
00162 if ( versions[i] != v.versions[i] )
00163 return false;
00164 }
00165 if ( versions.size() < v.versions.size() ) {
00166 if ( v.trailZero( versions.size() ))
00167 return true;
00168 else
00169 return false;
00170 } else {
00171 if ( trailZero( v.versions.size() ))
00172 return true;
00173 else
00174 return false;
00175 }
00176 }
00177
00178 bool VersionIdentifier::operator!= ( const VersionIdentifier& v ) const
00179 {
00180 return !operator==(v);
00181 };
00182