1 #include "daq/slc/nsm/NSMMessage.h"
8 #include <nsm2/nsmsys2.h>
15 #include <daq/slc/nsm/NSMData.h>
16 #include <daq/slc/nsm/NSMHandlerException.h>
18 #include <daq/slc/base/Reader.h>
19 #include <daq/slc/base/Writer.h>
21 #include <nsm2/nsmlib2.h>
22 #include <nsm2/nsmsys2.h>
24 #include <arpa/inet.h>
28 const unsigned int NSMMessage::DATA_SIZE = NSM_TCPDATSIZ;
30 void NSMMessage::init()
33 memset(&m_nsm_msg, 0,
sizeof(
NSMmsg));
40 m_nodename = node.getName();
41 m_reqname = NSMCommand::VSET.getLabel();
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();
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();
58 memcpy(pdata, var.getName().c_str(), var.getName().size());
59 pdata += var.getName().size();
62 memcpy(pdata, var.get(), var.size());
71 m_nodename = node.getName();
72 m_reqname = NSMCommand::LOG.getLabel();
74 setParam(0, (
int)log.getPriority());
75 setParam(1, log.getDateInt());
76 setParam(2, log.getId());
77 setData(log.getMessage());
84 m_nodename = node.getName();
85 m_reqname = cmd.getLabel();
87 setParam(0, (
int)log.getPriority());
88 setParam(1, log.getDateInt());
89 setParam(2, log.getId());
90 setData(log.getMessage());
96 m_nodename = node.getName();
97 m_reqname = NSMCommand::DATASET.getLabel();
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();
105 memcpy(m_data.ptr(), s.c_str(), s.size());
106 memcpy(m_data.ptr() + s.size() + 1, data.get(), data.getSize());
110 NSMMessage::NSMMessage()
115 NSMMessage::NSMMessage(
const NSMNode& node)
118 m_nodename = node.getName();
121 NSMMessage::NSMMessage(
const NSMNode& node,
125 m_nodename = node.getName();
126 m_reqname = cmd.getLabel();
129 NSMMessage::NSMMessage(
const NSMNode& node,
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);
140 NSMMessage::NSMMessage(
const NSMNode& node,
143 const std::string& data)
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);
153 NSMMessage::NSMMessage(
const NSMNode& node,
155 int par,
const std::string& obj)
158 m_nodename = node.getName();
159 m_reqname = cmd.getLabel();
161 m_nsm_msg.pars[0] = par;
169 m_reqname = cmd.getLabel();
171 m_nsm_msg.pars[0] = par;
175 const std::string& data)
178 m_reqname = cmd.getLabel();
182 NSMMessage::NSMMessage(
const NSMNode& node,
186 m_nodename = node.getName();
187 m_reqname = cmd.getLabel();
189 m_nsm_msg.pars[0] = par;
192 NSMMessage::NSMMessage(
const NSMNode& node,
194 const std::string& data)
197 m_nodename = node.getName();
198 m_reqname = cmd.getLabel();
205 m_reqname = cmd.getLabel();
214 NSMMessage::NSMMessage(
const NSMNode& node,
const NSMVar& var)
232 init(node, log, cmd);
235 NSMMessage::NSMMessage(
const NSMVar& var)
240 NSMMessage::NSMMessage(
const NSMData& data)
254 m_reqname = cmd.getLabel();
255 m_nsm_msg.npar = npar;
256 memcpy(m_nsm_msg.pars, pars,
sizeof(
int) * npar);
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;
269 m_data =
Buffer(m_nsm_msg.len);
270 memcpy(m_data.ptr(), msg.m_data.ptr(), m_nsm_msg.len);
274 const char* NSMMessage::getRequestName()
const
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) {
282 return m_reqname.c_str();
285 return m_reqname.c_str();
289 void NSMMessage::setRequestName()
291 if (m_nsmc != NULL) {
292 const char* reqname = nsmlib_reqname(m_nsmc, m_nsm_msg.req);
293 if (reqname != NULL) {
299 void NSMMessage::setRequestName(
const std::string& reqname)
304 void NSMMessage::setRequestName(
const NSMCommand& cmd)
306 m_reqname = cmd.getLabel();
309 void NSMMessage::setNodeName(
const std::string& nodename)
311 m_nodename = nodename;
314 void NSMMessage::setNodeName(
const NSMNode& node)
316 m_nodename = node.getName();
319 const char* NSMMessage::getNodeName()
const
321 if (m_nodename.size() > 0)
return m_nodename.c_str();
323 return nsmlib_nodename(m_nsmc, m_nsm_msg.node);
325 return m_nodename.c_str();
328 unsigned short NSMMessage::getRequestId()
const
330 return m_nsm_msg.req;
333 unsigned short NSMMessage::getSequenceId()
const
335 return m_nsm_msg.seq;
338 unsigned short NSMMessage::getNodeId()
const
340 return m_nsm_msg.node;
343 unsigned short NSMMessage::getNParams()
const
345 return m_nsm_msg.npar;
348 int NSMMessage::getParam(
int i)
const
350 return m_nsm_msg.pars[i];
353 #if NSM_PACKAGE_VERSION >= 1914
354 const int* NSMMessage::getParams()
const
356 return m_nsm_msg.pars;
359 int* NSMMessage::getParams()
361 return m_nsm_msg.pars;
364 const unsigned int* NSMMessage::getParams()
const
366 return m_nsm_msg.pars;
369 unsigned int* NSMMessage::getParams()
371 return m_nsm_msg.pars;
373 #warning "Wrong version of nsm2. try source daq/slc/extra/nsm2/export.sh"
376 unsigned int NSMMessage::getLength()
const
378 return m_nsm_msg.len;
381 const char* NSMMessage::getData()
const
383 if (m_nsm_msg.len > 0)
return (
const char*)m_data.ptr();
387 void NSMMessage::setRequestId(
unsigned short id)
392 void NSMMessage::setSequenceId(
unsigned short id)
397 void NSMMessage::setNodeId(
unsigned short id)
402 void NSMMessage::setNParams(
unsigned short npar)
404 m_nsm_msg.npar = npar;
407 void NSMMessage::setParam(
int i,
unsigned int v)
409 m_nsm_msg.pars[i] = v;
412 void NSMMessage::setData(
int len,
const char* data)
415 if (len > 0 && data != NULL) {
417 memcpy(m_data.ptr(), data, len);
422 void NSMMessage::setData(
const std::string& text)
424 setData(text.size() + 1, text.c_str());
427 int NSMMessage::try_read(
int sock,
char* buf,
int datalen)
430 while (recvlen < datalen) {
432 if ((ret = ::read(sock, buf + recvlen, datalen)) <= 0) {
433 if (ret == -1 && errno == EINTR)
continue;
434 if (ret < 0)
return -1;
443 if (nsmc == NULL)
return 0;
445 int sock = nsmc->sock;
450 if ((ret = try_read(sock, (
char*)&hp, datalen)) < 0) {
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;
461 datalen =
sizeof(int32) * m_nsm_msg.npar;
463 if ((ret = try_read(sock, (
char*)(m_nsm_msg.pars), datalen)) < 0) {
467 for (
int i = 0; i < m_nsm_msg.npar; i++) {
468 m_nsm_msg.pars[i] = ntohl(m_nsm_msg.pars[i]);
472 datalen = m_nsm_msg.len;
475 if ((ret = try_read(sock, (
char*)m_data.ptr(), datalen)) < 0) {
483 void NSMMessage::readObject(
Reader& reader)
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());
491 size_t len = reader.readInt();
495 reader.read(m_data.ptr(), len);
499 void NSMMessage::writeObject(
Writer& writer)
const
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));
510 writer.writeInt(getLength());
512 if (getLength() > 0) {
513 writer.write(m_data.ptr(), getLength());