00001 #include "qseinputfile.h"
00002
00003 QseInputFile::QseInputFile(const QString& name, QObject *parent)
00004 : QseDataSet(name, parent),
00005 m_Buffer(NULL),
00006 m_Length(0),
00007 m_BufferSize(0),
00008 m_PathName(""),
00009 m_File(),
00010
00011 m_NLines(0),
00012 m_MaxLength(0),
00013 m_Scan(NULL),
00014 m_NPoints(0)
00015 {
00016 m_Buffer = (char*) malloc(250001);
00017 m_Length = 0;
00018 m_BufferSize = 250000;
00019 }
00020
00021 QseInputFile::~QseInputFile()
00022 {
00023 QMutexLocker lock(&m_Mutex);
00024
00025 if (m_Buffer) {
00026 free(m_Buffer);
00027 }
00028 }
00029
00030 QString QseInputFile::filePath()
00031 {
00032 QMutexLocker lock(&m_Mutex);
00033
00034 return m_PathName;
00035 }
00036
00037 void QseInputFile::emitDataChanged()
00038 {
00039 printf("emitDataChanged()\n");
00040
00041 emit dataChanged();
00042 }
00043
00044 void QseInputFile::updateProgress()
00045 {
00046 QMutexLocker lock(&m_Mutex);
00047
00048 qint64 sz = m_File.size();
00049 qint64 pz = m_File.pos();
00050
00051 double pct = ((double) pz)/((double) sz)*100.0;
00052
00053 emit madeProgress((int) pct);
00054
00055
00056 }
00057
00058 void QseInputFile::nextDataFile(QString nm)
00059 {
00060 QMutexLocker lock(&m_Mutex);
00061
00062 if (m_File.isOpen()) {
00063 m_File.close();
00064 }
00065
00066 m_PathName = nm;
00067 m_File.setFileName(m_PathName);
00068 m_File.open(QIODevice::ReadOnly);
00069 m_NLines = 0;
00070 m_MaxLength = 0;
00071 m_Length = 0;
00072 m_Scan = NULL;
00073 m_NPoints = 0;
00074
00075 setFileName(nm);
00076 }
00077
00078 bool QseInputFile::atEnd()
00079 {
00080 QMutexLocker lock(&m_Mutex);
00081
00082 if (m_File.isOpen()) {
00083 qint64 sz = m_File.size();
00084 qint64 pz = m_File.pos();
00085
00086 return pz>=sz;
00087 } else{
00088
00089 return true;
00090 }
00091 }
00092
00093 void QseInputFile::nextInputLine()
00094 {
00095 QMutexLocker lock(&m_Mutex);
00096
00097 int lnth = m_File.readLine(m_Buffer+m_Length, m_BufferSize-m_Length);
00098 bool lineended = false;
00099
00100 while (lnth > 0 && (m_Buffer[lnth-1]=='\n' || m_Buffer[lnth-1]=='\r')) {
00101 m_Buffer[lnth-1]=0;
00102 lnth--;
00103 lineended = true;
00104 }
00105
00106 m_Length += lnth;
00107
00108 if (lineended) {
00109 m_NLines++;
00110
00111 if (m_Length > m_MaxLength) {
00112 m_MaxLength = m_Length;
00113 }
00114
00115 if (strncasecmp(m_Buffer, "#S", 2) == 0) {
00116 int ns = scanCount();
00117
00118
00119 m_Scan = appendScan();
00120 m_Scan -> setName(m_Buffer);
00121
00122 int sn;
00123 if (sscanf(m_Buffer, "#S%d", &sn)==1) {
00124 m_Scan -> setScanNumber(sn);
00125 }
00126
00127 m_NPoints = 0;
00128 updateProgress();
00129
00130
00131
00132 emit scanAdded(ns);
00133 emit message(QString("Loading scan %1 of file %2").arg(scanCount()).arg(m_PathName));
00134 } else if (strncasecmp(m_Buffer, "#N", 2) == 0) {
00135 int nc;
00136
00137 if (m_Scan && (sscanf(m_Buffer, "#N%d", &nc) == 1)) {
00138 m_Scan -> setColumnCount(nc);
00139 }
00140 } else if (strncasecmp(m_Buffer, "#L", 2) == 0) {
00141 if (m_Scan) {
00142 m_Scan -> setColumnNames(m_Buffer);
00143
00144 }
00145 } else if (strncasecmp(m_Buffer, "#D", 2) == 0) {
00146 QDateTime dt = QDateTime::fromString(m_Buffer+2);
00147
00148 if (dt.isValid()) {
00149
00150
00151
00152 if (m_Scan) {
00153 m_Scan -> setScanDateTime(dt);
00154 }
00155 }
00156 }
00157
00158 if (strncasecmp(m_Buffer, "#", 1) == 0) {
00159 if (m_Scan) {
00160 m_Scan -> appendHeader(m_Buffer);
00161 } else {
00162 appendHeader(m_Buffer);
00163 }
00164 } else {
00165 if (m_Scan) {
00166
00167 m_Scan -> appendData(m_Buffer);
00168 m_NPoints++;
00169 } else {
00170 appendHeader(m_Buffer);
00171 }
00172 }
00173
00174 if (atEnd()) {
00175 emit madeProgress(110);
00176 emit message(QString("File %1 scanned, %2 lines, longest %3")
00177 .arg(m_PathName).arg(m_NLines).arg(m_MaxLength));
00178 emit message(QString("%1 scans found\n").arg(scanCount()));
00179
00180 emit loadCompleted();
00181 }
00182
00183 m_Length = 0;
00184 }
00185 }
00186