AnalysisSystemForRadionucli.../AbstractSpectrumDataMessage.cpp
2024-06-04 15:27:02 +08:00

331 lines
9.4 KiB
C++
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#include "AbstractSpectrumDataMessage.h"
#include <QFile>
AbstractSpectrumDataMessage::AbstractSpectrumDataMessage()
{
msg_items.append( "MSG_TYPE" ); // [0]
msg_items.append( "MSG_ID" ); // [1]
msg_items.append( "REF_ID" ); // [2]
msg_items.append( "PROD_ID" ); // [3]
msg_items.append( "DATA_TYPE" ); // [4]
data_types.append( "SAMPLEPHD" ); // [0]
data_types.append( "SPHDF" ); // [1]
data_types.append( "SPHDP" ); // [2]
data_types.append( "GASBKPHD" ); // [3]
data_types.append( "BLANKPHD" ); // [4]
data_types.append( "DETBKPHD" ); // [5]
data_types.append( "QCPHD" ); // [6]
data_types.append( "CALIBPHD" ); // [7]
data_types.append( "MET" ); // [8]
data_types.append( "RMSSOH" ); // [9]
data_types.append( "ALERT_FLOW" ); // [10]
data_types.append( "ALERT_SYSTEM" ); // [11]
data_types.append( "ALERT_TEMP" ); // [12]
data_types.append( "ALERT_UPS" ); // [13]
msg.verify_srid = false;
}
AbstractSpectrumDataMessage::~AbstractSpectrumDataMessage()
{
}
QString AbstractSpectrumDataMessage::GetSpectrumDataTypeFromFile(QString data_file)
{
QString ret_string;
QFile file(data_file);
if ( file.open(QIODevice::ReadOnly | QIODevice::Text) )
{
QTextStream content(&file);
if (!content.atEnd())
{
if ( AnalyseMessgeInfo(content, true) )
{
ret_string = msg.data_type;
if ( QLatin1String("SPHDP")==ret_string || QLatin1String("SPHDF")==ret_string )
{
ret_string = QLatin1String("SAMPLEPHD");
msg.data_type = ret_string;
}
}
}
}
file.close();
return ret_string;
}
QString AbstractSpectrumDataMessage::GetSpectrumDataTypeFromMessage(QString data_msg)
{
QString ret_string;
QTextStream content(&data_msg, QIODevice::ReadOnly);
if (!content.atEnd())
{
if ( AnalyseMessgeInfo(content, true) )
{
ret_string = msg.msg_type;
if ( QLatin1String("SPHDP")==ret_string && QLatin1String("SPHDF")==ret_string )
{
ret_string = QLatin1String("SAMPLEPHD");
}
}
}
return ret_string;
}
bool AbstractSpectrumDataMessage::AnalyseFile(QString file_name)
{
bool bRet = true;
QFile file(file_name);
if (!file.open(QIODevice::ReadOnly | QIODevice::Text))
{
return bRet &= false;
}
QTextStream content(&file);
if (content.atEnd())
{
file.close();
return bRet &= false;
}
bRet &= AnalyseMessgeInfo(content);
/*
if (bRet)
{
bRet &= AnalyseMessgeBody(content);
}
*/
file.close();
/*
if ( bRet && msg.verify_srid )
{
ChangeOriginalFile(file_name);
}
*/
return bRet;
}
bool AbstractSpectrumDataMessage::AnalyseMsg(QString &msg_string)
{
bool bRet = true;
QTextStream content(&msg_string, QIODevice::ReadOnly);
if (content.atEnd())
{
return bRet &= false;
}
bRet &= AnalyseMessgeInfo(content);
/*
if (bRet)
{
bRet &= AnalyseMessgeBody(content);
}
*/
return bRet;
}
const MessageInfo &AbstractSpectrumDataMessage::GetMessageInfo()
{
return msg;
}
void AbstractSpectrumDataMessage::ClearData()
{
msg.data_type.clear();
msg.msg_id.clear();
msg.msg_type.clear();
msg.verify_srid = false;
}
bool AbstractSpectrumDataMessage::AnalyseMessgeInfo(QTextStream &content, bool only_analyse_msg)
{
bool bRet = true;
QString item_text = content.readLine();
if ( 0!=item_text.left(5).compare(QLatin1String("BEGIN")) &&
0!=item_text.mid(6).compare(QLatin1String("IMS2.0")) )
{
bRet &= false; //消息头的协议标示不对,消息无效
return bRet;
}
QString line = content.readLine();
while (bRet)
{
QTextStream line_stream(&line);
line_stream >> item_text;
if ( 0==item_text.compare(msg_items.at(0)) && bRet ) //MSG_TYPE
{
line_stream >> msg.msg_type;
if ( msg.msg_type!=(QLatin1String("DATA")) )
{
bRet &= false; //消息类型不是指定的“DATA”类型消息过滤
break;
}
line = content.readLine();
}
else if ( 0==item_text.compare(msg_items.at(1)) && bRet ) //MSG_ID
{
for (int i=0; !line_stream.atEnd(); ++i)
{
if ( 0==i )
{
line_stream >> msg.msg_id;
}
else if (1==i)
{
line_stream >> msg.msg_src_code;
}
}
line = content.readLine();
}
else if ( 0==item_text.compare(msg_items.at(2)) && bRet ) //REF_ID
{
QString ref_id_after = line_stream.readLine();
QTextStream ref_id_after_stream(&ref_id_after);
for (int i=0; !ref_id_after_stream.atEnd(); ++i)
{
QString temp;
ref_id_after_stream >> temp;
if (0==i)
{
msg.ref_id_str = temp;
}
else if (1==i)
{
msg.ref_src_code = temp;
}
else if (2==i)
{
msg.seq_num = temp;
}
else if (3==i)
{
msg.tot_num = temp;
}
}
msg.verify_srid = true;
line = content.readLine();
}
else if ( 0==item_text.compare(msg_items.at(3)) && bRet ) //PROD_ID
{
line_stream >> msg.product_id >> msg.delivery_id;
msg.verify_srid = true;
line = content.readLine();
}
else if ( 0==item_text.compare(msg_items.at(4)) && bRet ) //DATA_TYPE
{
line_stream >> msg.data_type;
if ( data_types.contains(msg.data_type) && bRet )
{
if ( !only_analyse_msg )
{
bRet &= AnalyseMessgeBody(content);
}
return bRet;
}
else
{
line = content.readLine();
QTextStream data_line_stream(&line);
data_line_stream >> item_text;
while (!msg_items.contains(item_text) && !content.atEnd())
{
line = content.readLine();
QTextStream line_stream(&line);
line_stream >> item_text;
}
msg.verify_srid = true;
}
}
else
{
//bRet = false;
// bRet不置为false表示针对消息头的有效检查持宽容态度允许跟文件协议有能接受的出入
break;
}
if ( content.atEnd() || (content.status()!=QTextStream::Ok) )
{
bRet = false;
ClearData();
break;
}
}
return bRet;
}
void AbstractSpectrumDataMessage::SetMsgDataType(QString data_type)
{
msg.data_type = data_type;
}
void AbstractSpectrumDataMessage::ChangeOriginalFile(QString file_name)
{
QFile file(file_name);
if (file.open(QIODevice::ReadOnly | QIODevice::Text))
{
QString temp_file_name = file_name + QLatin1String(".temp");
QFile temp_file(temp_file_name);
if (!temp_file.open(QIODevice::WriteOnly | QIODevice::Text))
{
QString error = file.errorString();
return;
}
QTextStream in(&file);
QTextStream out(&temp_file);
bool bInBody = true;
QString line = in.readLine();
while ( !in.atEnd() && (in.status()==QTextStream::Ok) )
{
QString item_text;
QTextStream line_stream(&line);
line_stream >> item_text;
if ( 0==item_text.compare(msg_items.at(4)) && bInBody ) //DATA_TYPE
{
QString data_type;
line_stream >> data_type;
if ( data_types.contains(data_type) && bInBody )
{
bInBody = false;
}
else
{
line = in.readLine();
QTextStream data_line_stream(&line);
data_line_stream >> item_text;
while (!msg_items.contains(item_text) && !in.atEnd())
{
line = in.readLine();
QTextStream line_stream(&line);
line_stream >> item_text;
}
}
}
else if ( 0==item_text.compare(msg_items.at(2)) && bInBody ) //REF_ID
{
line = in.readLine();
}
else if ( 0==item_text.compare(msg_items.at(3)) && bInBody ) //PROD_ID
{
line = in.readLine();
}
else
{
out << line << "\n";
line = in.readLine();
}
}
temp_file.close();
file.close();
QFile::remove(file_name);
QFile::rename(temp_file_name, file_name);
}
}