00001 #ifndef DHTMESSAGE_H_ 00002 #define DHTMESSAGE_H_ 00003 00004 #include "ariba/utility/messages.h" 00005 #include "ariba/utility/serialization.h" 00006 00007 namespace ariba { 00008 namespace overlay { 00009 00010 using ariba::utility::Message; 00011 using_serialization; 00012 00013 class DHTMessage : public Message { VSERIALIZEABLE 00014 public: 00015 DHTMessage(); 00016 DHTMessage( const Data& key ); 00017 DHTMessage( const Data& key, const Data& value ); 00018 DHTMessage( const Data& key, const vector<Data>& values ); 00019 virtual ~DHTMessage(); 00020 00021 const NodeID& getHashedKey() const { 00022 return hash; 00023 } 00024 00025 const Data& getKey() const { 00026 return key; 00027 } 00028 00030 const Data& getValue() const { 00031 return values.at(0); 00032 } 00033 00034 bool hasValues() const { 00035 return values.size() != 0; 00036 } 00037 00038 uint16_t getTTL() const { 00039 return ttl; 00040 } 00041 00042 void setTTL( uint16_t ttl ) { 00043 this->ttl = ttl; 00044 } 00045 00046 void setReplace( bool replace ) { 00047 this->replace = replace; 00048 } 00049 00050 bool doReplace() const { 00051 return replace; 00052 } 00053 00055 const vector<Data>& getValues() const { 00056 return values; 00057 } 00058 00059 private: 00060 NodeID hash; 00061 uint16_t ttl; 00062 bool replace; 00063 Data key; 00064 vector<Data> values; 00065 }; 00066 00067 }} // namespace ariba::overlay 00068 00069 sznBeginDefault( ariba::overlay::DHTMessage, X ) { 00070 00071 // serialize flags 00072 X && replace && cI(0,7); 00073 00074 // serialize tll 00075 X && ttl; 00076 00077 // key serialization 00078 uint16_t key_length = key.isUnspecified() ? 0 : key.getLength(); 00079 X && key_length; 00080 if (X.isDeserializer()) key.setLength( key_length ); 00081 X && this->key; 00082 00083 // store number of values 00084 uint16_t num_values = values.size(); 00085 X && num_values; 00086 00087 // value serialization 00088 for (size_t i=0; i<num_values; i++) { 00089 Data value; 00090 if (X.isSerializer()) value = values[i]; 00091 uint16_t value_length = value.isUnspecified() ? 0 : value.getLength(); 00092 X && value_length; 00093 if (X.isDeserializer()) value.setLength( value_length ); 00094 X && value; 00095 if (X.isDeserializer()) values.push_back(value); 00096 } 00097 } sznEnd(); 00098 00099 #endif /* DHTMESSAGE_H_ */