00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015 #include "config_pstats.h"
00016 #include "pStatClientControlMessage.h"
00017 #include "pStatClientVersion.h"
00018
00019 #include "datagram.h"
00020 #include "datagramIterator.h"
00021
00022
00023
00024
00025
00026
00027 PStatClientControlMessage::
00028 PStatClientControlMessage() {
00029 _type = T_invalid;
00030 }
00031
00032
00033
00034
00035
00036
00037 void PStatClientControlMessage::
00038 encode(Datagram &datagram) const {
00039 datagram.clear();
00040 datagram.add_uint8(_type);
00041 switch (_type) {
00042 case T_hello:
00043 datagram.add_string(_client_hostname);
00044 datagram.add_string(_client_progname);
00045 datagram.add_uint16(_major_version);
00046 datagram.add_uint16(_minor_version);
00047 break;
00048
00049 case T_define_collectors:
00050 {
00051 datagram.add_uint16(_collectors.size());
00052 for (int i = 0; i < (int)_collectors.size(); i++) {
00053 _collectors[i]->write_datagram(datagram);
00054 }
00055 }
00056 break;
00057
00058 case T_define_threads:
00059 {
00060 datagram.add_uint16(_first_thread_index);
00061 datagram.add_uint16(_names.size());
00062 for (int i = 0; i < (int)_names.size(); i++) {
00063 datagram.add_string(_names[i]);
00064 }
00065 }
00066 break;
00067
00068 default:
00069 pstats_cat.error()
00070 << "Invalid PStatClientControlMessage::Type " << (int)_type << "\n";
00071 }
00072 }
00073
00074
00075
00076
00077
00078
00079
00080 bool PStatClientControlMessage::
00081 decode(const Datagram &datagram, PStatClientVersion *version) {
00082 DatagramIterator source(datagram);
00083 _type = (Type)source.get_uint8();
00084
00085 switch (_type) {
00086 case T_hello:
00087 _client_hostname = source.get_string();
00088 _client_progname = source.get_string();
00089 if (source.get_remaining_size() == 0) {
00090 _major_version = 1;
00091 _minor_version = 0;
00092 } else {
00093 _major_version = source.get_uint16();
00094 _minor_version = source.get_uint16();
00095 }
00096 break;
00097
00098 case T_define_collectors:
00099 {
00100 int num = source.get_uint16();
00101 _collectors.clear();
00102 for (int i = 0; i < num; i++) {
00103 PStatCollectorDef *def = new PStatCollectorDef;
00104 def->read_datagram(source, version);
00105 _collectors.push_back(def);
00106 }
00107 }
00108 break;
00109
00110 case T_define_threads:
00111 {
00112 _first_thread_index = source.get_uint16();
00113 int num = source.get_uint16();
00114 _names.clear();
00115 for (int i = 0; i < num; i++) {
00116 _names.push_back(source.get_string());
00117 }
00118 }
00119 break;
00120
00121 case T_datagram:
00122
00123 return false;
00124
00125 default:
00126 pstats_cat.error()
00127 << "Read invalid PStatClientControlMessage type: " << (int)_type << "\n";
00128 _type = T_invalid;
00129 return false;
00130 }
00131
00132 return true;
00133 }