Belle II Software  release-05-01-25
NSMMessage.cc
1 #include "daq/slc/nsm/NSMMessage.h"
2 
3 // 20191004 nakao
4 // duplicating the NSM2 library function in a user function
5 // NSMMessage::read(NSMcontext* nsmc)
6 // is really a bad idea, need to be revised.
7 // Until then, nsmsys2.h is needed.
8 #include <nsm2/nsmsys2.h>
9 
10 #include <string.h>
11 #include <unistd.h>
12 #include <errno.h>
13 #include <stdlib.h>
14 
15 #include <daq/slc/nsm/NSMData.h>
16 #include <daq/slc/nsm/NSMHandlerException.h>
17 
18 #include <daq/slc/base/Reader.h>
19 #include <daq/slc/base/Writer.h>
20 
21 #include <nsm2/nsmlib2.h>
22 #include <nsm2/nsmsys2.h>
23 
24 #include <arpa/inet.h>
25 
26 using namespace Belle2;
27 
28 const unsigned int NSMMessage::DATA_SIZE = NSM_TCPDATSIZ;
29 
30 void NSMMessage::init()
31 {
32  m_nsmc = NULL;
33  memset(&m_nsm_msg, 0, sizeof(NSMmsg));
34  m_hasobj = false;
35 }
36 
37 void NSMMessage::init(const NSMNode& node, const NSMVar& var)
38 {
39  init();
40  m_nodename = node.getName();
41  m_reqname = NSMCommand::VSET.getLabel();
42  m_nsm_msg.npar = 6;
43  m_nsm_msg.pars[0] = (int)var.getType();
44  m_nsm_msg.pars[1] = (int)var.getLength();
45  m_nsm_msg.pars[2] = var.getNode().size();
46  m_nsm_msg.pars[3] = var.getName().size();
47  m_nsm_msg.pars[4] = var.getId();
48  m_nsm_msg.pars[5] = var.getDate();
49  if (var.getType() != NSMVar::NONE) {
50  int size = var.getNode().size() + 1 + var.getName().size() + 1 + var.size();
51  m_data = Buffer(size);
52  char* pdata = (char*)m_data.ptr();
53  memset(pdata, 0, size);
54  memcpy(pdata, var.getNode().c_str(), var.getNode().size());
55  pdata += var.getNode().size();
56  *pdata = '\0';
57  pdata++;
58  memcpy(pdata, var.getName().c_str(), var.getName().size());
59  pdata += var.getName().size();
60  *pdata = '\0';
61  pdata++;
62  memcpy(pdata, var.get(), var.size());
63  m_hasobj = false;
64  m_nsm_msg.len = size;
65  }
66 }
67 
68 void NSMMessage::init(const NSMNode& node, const DAQLogMessage& log)
69 {
70  init();
71  m_nodename = node.getName();
72  m_reqname = NSMCommand::LOG.getLabel();
73  setNParams(3);
74  setParam(0, (int)log.getPriority());
75  setParam(1, log.getDateInt());
76  setParam(2, log.getId());
77  setData(log.getMessage());
78 }
79 
80 void NSMMessage::init(const NSMNode& node, const DAQLogMessage& log,
81  const NSMCommand& cmd)
82 {
83  init();
84  m_nodename = node.getName();
85  m_reqname = cmd.getLabel();
86  setNParams(3);
87  setParam(0, (int)log.getPriority());
88  setParam(1, log.getDateInt());
89  setParam(2, log.getId());
90  setData(log.getMessage());
91 }
92 
93 void NSMMessage::init(const NSMNode& node, const NSMData& data)
94 {
95  init();
96  m_nodename = node.getName();
97  m_reqname = NSMCommand::DATASET.getLabel();
98  setNParams(2);
99  setParam(0, data.getRevision());
100  setParam(1, data.getSize());
101  std::string s = data.getName() + "\n" + data.getFormat();
102  int len = s.size() + 1 + data.getSize();
103  m_nsm_msg.len = len;
104  m_data = Buffer(len);
105  memcpy(m_data.ptr(), s.c_str(), s.size());
106  memcpy(m_data.ptr() + s.size() + 1, data.get(), data.getSize());
107  m_hasobj = false;
108 }
109 
110 NSMMessage::NSMMessage()
111 {
112  init();
113 }
114 
115 NSMMessage::NSMMessage(const NSMNode& node)
116 {
117  init();
118  m_nodename = node.getName();
119 }
120 
121 NSMMessage::NSMMessage(const NSMNode& node,
122  const NSMCommand& cmd)
123 {
124  init();
125  m_nodename = node.getName();
126  m_reqname = cmd.getLabel();
127 }
128 
129 NSMMessage::NSMMessage(const NSMNode& node,
130  const NSMCommand& cmd,
131  int npar, int* pars)
132 {
133  init();
134  m_nodename = node.getName();
135  m_reqname = cmd.getLabel();
136  m_nsm_msg.npar = npar;
137  memcpy(m_nsm_msg.pars, pars, sizeof(int) * npar);
138 }
139 
140 NSMMessage::NSMMessage(const NSMNode& node,
141  const NSMCommand& cmd,
142  int npar, int* pars,
143  const std::string& data)
144 {
145  init();
146  m_nodename = node.getName();
147  m_reqname = cmd.getLabel();
148  m_nsm_msg.npar = npar;
149  memcpy(m_nsm_msg.pars, pars, sizeof(int) * npar);
150  setData(data);
151 }
152 
153 NSMMessage::NSMMessage(const NSMNode& node,
154  const NSMCommand& cmd,
155  int par, const std::string& obj)
156 {
157  init();
158  m_nodename = node.getName();
159  m_reqname = cmd.getLabel();
160  m_nsm_msg.npar = 1;
161  m_nsm_msg.pars[0] = par;
162  setData(obj);
163 }
164 
165 NSMMessage::NSMMessage(const NSMCommand& cmd,
166  int par)
167 {
168  init();
169  m_reqname = cmd.getLabel();
170  m_nsm_msg.npar = 1;
171  m_nsm_msg.pars[0] = par;
172 }
173 
174 NSMMessage::NSMMessage(const NSMCommand& cmd,
175  const std::string& data)
176 {
177  init();
178  m_reqname = cmd.getLabel();
179  setData(data);
180 }
181 
182 NSMMessage::NSMMessage(const NSMNode& node,
183  const NSMCommand& cmd, int par)
184 {
185  init();
186  m_nodename = node.getName();
187  m_reqname = cmd.getLabel();
188  m_nsm_msg.npar = 1;
189  m_nsm_msg.pars[0] = par;
190 }
191 
192 NSMMessage::NSMMessage(const NSMNode& node,
193  const NSMCommand& cmd,
194  const std::string& data)
195 {
196  init();
197  m_nodename = node.getName();
198  m_reqname = cmd.getLabel();
199  setData(data);
200 }
201 
202 NSMMessage::NSMMessage(const NSMCommand& cmd)
203 {
204  init();
205  m_reqname = cmd.getLabel();
206 }
207 
208 NSMMessage::NSMMessage(const NSMMessage& msg)
209 {
210  init();
211  *this = msg;
212 }
213 
214 NSMMessage::NSMMessage(const NSMNode& node, const NSMVar& var)
215 {
216  init(node, var);
217 }
218 
219 NSMMessage::NSMMessage(const NSMNode& node, const NSMData& data)
220 {
221  init(node, data);
222 }
223 
224 NSMMessage::NSMMessage(const NSMNode& node, const DAQLogMessage& log)
225 {
226  init(node, log);
227 }
228 
229 NSMMessage::NSMMessage(const NSMNode& node, const DAQLogMessage& log,
230  const NSMCommand& cmd)
231 {
232  init(node, log, cmd);
233 }
234 
235 NSMMessage::NSMMessage(const NSMVar& var)
236 {
237  init(NSMNode(), var);
238 }
239 
240 NSMMessage::NSMMessage(const NSMData& data)
241 {
242  init(NSMNode(), data);
243 }
244 
245 NSMMessage::NSMMessage(const DAQLogMessage& log)
246 {
247  init(NSMNode(), log);
248 }
249 
250 NSMMessage::NSMMessage(const NSMCommand& cmd,
251  int npar, int* pars)
252 {
253  init();
254  m_reqname = cmd.getLabel();
255  m_nsm_msg.npar = npar;
256  memcpy(m_nsm_msg.pars, pars, sizeof(int) * npar);
257 }
258 
259 const NSMMessage& NSMMessage::operator=(const NSMMessage& msg)
260 {
261  m_nsmc = msg.m_nsmc;
262  memcpy(&m_nsm_msg, &(msg.m_nsm_msg), sizeof(m_nsm_msg));
263  m_nsm_msg.npar = msg.m_nsm_msg.npar;
264  m_nsm_msg.len = msg.m_nsm_msg.len;
265  m_nodename = msg.m_nodename;
266  m_reqname = msg.m_reqname;
267  m_hasobj = msg.m_hasobj;
268  //m_data = msg.m_data;
269  m_data = Buffer(m_nsm_msg.len);
270  memcpy(m_data.ptr(), msg.m_data.ptr(), m_nsm_msg.len);
271  return *this;
272 }
273 
274 const char* NSMMessage::getRequestName() const
275 {
276  if (m_reqname.size() > 0) return m_reqname.c_str();
277  if (m_nsmc != NULL) {
278  const char* reqname = nsmlib_reqname(m_nsmc, m_nsm_msg.req);
279  if (reqname != NULL) {
280  m_reqname = reqname;
281  }
282  return m_reqname.c_str();
283  } else {
284  m_reqname = "";
285  return m_reqname.c_str();
286  }
287 }
288 
289 void NSMMessage::setRequestName()
290 {
291  if (m_nsmc != NULL) {
292  const char* reqname = nsmlib_reqname(m_nsmc, m_nsm_msg.req);
293  if (reqname != NULL) {
294  m_reqname = reqname;
295  }
296  }
297 }
298 
299 void NSMMessage::setRequestName(const std::string& reqname)
300 {
301  m_reqname = reqname;
302 }
303 
304 void NSMMessage::setRequestName(const NSMCommand& cmd)
305 {
306  m_reqname = cmd.getLabel();
307 }
308 
309 void NSMMessage::setNodeName(const std::string& nodename)
310 {
311  m_nodename = nodename;
312 }
313 
314 void NSMMessage::setNodeName(const NSMNode& node)
315 {
316  m_nodename = node.getName();
317 }
318 
319 const char* NSMMessage::getNodeName() const
320 {
321  if (m_nodename.size() > 0) return m_nodename.c_str();
322  if (m_nsmc != NULL)
323  return nsmlib_nodename(m_nsmc, m_nsm_msg.node);
324  else
325  return m_nodename.c_str();
326 }
327 
328 unsigned short NSMMessage::getRequestId() const
329 {
330  return m_nsm_msg.req;
331 }
332 
333 unsigned short NSMMessage::getSequenceId() const
334 {
335  return m_nsm_msg.seq;
336 }
337 
338 unsigned short NSMMessage::getNodeId() const
339 {
340  return m_nsm_msg.node;
341 }
342 
343 unsigned short NSMMessage::getNParams() const
344 {
345  return m_nsm_msg.npar;
346 }
347 
348 int NSMMessage::getParam(int i) const
349 {
350  return m_nsm_msg.pars[i];
351 }
352 
353 #if NSM_PACKAGE_VERSION >= 1914
354 const int* NSMMessage::getParams() const
355 {
356  return m_nsm_msg.pars;
357 }
358 
359 int* NSMMessage::getParams()
360 {
361  return m_nsm_msg.pars;
362 }
363 #else
364 const unsigned int* NSMMessage::getParams() const
365 {
366  return m_nsm_msg.pars;
367 }
368 
369 unsigned int* NSMMessage::getParams()
370 {
371  return m_nsm_msg.pars;
372 }
373 #warning "Wrong version of nsm2. try source daq/slc/extra/nsm2/export.sh"
374 #endif
375 
376 unsigned int NSMMessage::getLength() const
377 {
378  return m_nsm_msg.len;
379 }
380 
381 const char* NSMMessage::getData() const
382 {
383  if (m_nsm_msg.len > 0) return (const char*)m_data.ptr();
384  else return NULL;
385 }
386 
387 void NSMMessage::setRequestId(unsigned short id)
388 {
389  m_nsm_msg.req = id;
390 }
391 
392 void NSMMessage::setSequenceId(unsigned short id)
393 {
394  m_nsm_msg.seq = id;
395 }
396 
397 void NSMMessage::setNodeId(unsigned short id)
398 {
399  m_nsm_msg.node = id;
400 }
401 
402 void NSMMessage::setNParams(unsigned short npar)
403 {
404  m_nsm_msg.npar = npar;
405 }
406 
407 void NSMMessage::setParam(int i, unsigned int v)
408 {
409  m_nsm_msg.pars[i] = v;
410 }
411 
412 void NSMMessage::setData(int len, const char* data)
413 {
414  m_nsm_msg.len = len;
415  if (len > 0 && data != NULL) {
416  m_data = Buffer(len);
417  memcpy(m_data.ptr(), data, len);
418  }
419  m_hasobj = false;
420 }
421 
422 void NSMMessage::setData(const std::string& text)
423 {
424  setData(text.size() + 1, text.c_str());
425 }
426 
427 int NSMMessage::try_read(int sock, char* buf, int datalen)
428 {
429  int recvlen = 0;
430  while (recvlen < datalen) {
431  int ret;
432  if ((ret = ::read(sock, buf + recvlen, datalen)) <= 0) {
433  if (ret == -1 && errno == EINTR) continue;
434  if (ret < 0) return -1;
435  }
436  recvlen += ret;
437  }
438  return recvlen;
439 }
440 
441 size_t NSMMessage::read(NSMcontext* nsmc)
442 {
443  if (nsmc == NULL) return 0;
444  m_nsmc = nsmc;
445  int sock = nsmc->sock;
446  size_t count = 0;
447  int ret = 0;
448  NSMtcphead hp;
449  int datalen = sizeof(NSMtcphead);
450  if ((ret = try_read(sock, (char*)&hp, datalen)) < 0) {
451  throw (NSMHandlerException("Failed to read header"));
452  }
453  count += ret;
454  m_nsm_msg.req = ntohs(hp.req);
455  m_nsm_msg.seq = ntohs(hp.seq);
456  m_nsm_msg.node = ntohs(hp.src);
457  m_nsm_msg.npar = hp.npar;
458  m_nsm_msg.len = ntohs(hp.len);
459  m_nsm_msg.pars[0] = m_nsm_msg.pars[1] = 0;
460 
461  datalen = sizeof(int32) * m_nsm_msg.npar;
462  if (datalen > 0) {
463  if ((ret = try_read(sock, (char*)(m_nsm_msg.pars), datalen)) < 0) {
464  throw (NSMHandlerException("Failed to read params"));
465  }
466  count += ret;
467  for (int i = 0; i < m_nsm_msg.npar; i++) {
468  m_nsm_msg.pars[i] = ntohl(m_nsm_msg.pars[i]);
469  }
470  }
471 
472  datalen = m_nsm_msg.len;
473  if (datalen > 0) {
474  m_data = Buffer(datalen);
475  if ((ret = try_read(sock, (char*)m_data.ptr(), datalen)) < 0) {
476  throw (NSMHandlerException("Failed to read data"));
477  }
478  count += ret;
479  }
480  return count;
481 }
482 
483 void NSMMessage::readObject(Reader& reader)
484 {
485  setRequestName(reader.readString());
486  setNodeName(reader.readString());
487  setNParams(reader.readInt());
488  for (int i = 0; i < getNParams(); i++) {
489  setParam(i, reader.readInt());
490  }
491  size_t len = reader.readInt();
492  m_nsm_msg.len = len;
493  if (len > 0) {
494  m_data = Buffer(len);
495  reader.read(m_data.ptr(), len);
496  }
497 }
498 
499 void NSMMessage::writeObject(Writer& writer) const
500 {
501  writer.writeString(getRequestName());
502  writer.writeString(getNodeName());
503  writer.writeInt(getNParams());
504  for (int i = 0; i < getNParams(); i++) {
505  writer.writeInt(getParam(i));
506  }
507  if (m_hasobj) {
508  writer.writeInt(-1);
509  } else {
510  writer.writeInt(getLength());
511  }
512  if (getLength() > 0) {
513  writer.write(m_data.ptr(), getLength());
514  }
515 }
Belle2::DAQLogMessage
Definition: DAQLogMessage.h:16
Belle2::Reader
Definition: Reader.h:15
Belle2::NSMNode
Definition: NSMNode.h:14
NSMmsg
Definition: nsm2.h:217
Belle2::NSMData
Definition: NSMData.h:24
Belle2::Writer
Definition: Writer.h:15
NSMtcphead_struct
Definition: nsmsys2.h:92
Belle2::NSMMessage
Definition: NSMMessage.h:29
Belle2::Buffer
Definition: Buffer.h:12
Belle2
Abstract base class for different kinds of events.
Definition: MillepedeAlgorithm.h:19
Belle2::NSMHandlerException
Definition: NSMHandlerException.h:12
Belle2::NSMCommand
Definition: NSMCommand.h:12
Belle2::NSMVar
Definition: NSMVar.h:16
NSMcontext_struct
Definition: nsmlib2.h:66