logplus/Slfio/src/slf.cpp

4261 lines
136 KiB
C++
Raw 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 <stdio.h>
#include <stdlib.h>
#include <string.h>
#ifdef WIN32
#include <Windows.h>
#endif // WIN32
#include "slf.h"
#include <QDir>
#include <QDateTime>
#include <QString>
#pragma execution_character_set("utf-8")
int RepSize[12]={4,
sizeof(int),
sizeof(short),
sizeof(long long),
sizeof(float),
sizeof(double),
sizeof(char),
sizeof(char),
sizeof(unsigned char),
sizeof(unsigned short),
sizeof(unsigned int),
sizeof(unsigned int)
};
const char *Rep_STR[]={
"INT","SHORT","LONG","FLOAT","DOUBLE","STRING","CHAR","UCHAR","USHORT","UINT","ULONG"
};
int Slf_Int(float depth,float stdep,float rlev)
{
float ddepnum=(depth-stdep)/rlev;
int First=0;
if(ddepnum>=0) First=(int)(ddepnum+0.5);
else First=(int)(ddepnum-0.5);
return First;
}
CString MemName(CString wellname,CString Curve)
{
CString cs=wellname+("_")+Curve;
return cs.GetString();
}
wchar_t* AnsiToUnicode(const char* szStr)
{
int nLen = MultiByteToWideChar( CP_ACP, MB_PRECOMPOSED, szStr, -1, NULL, 0 );
if (nLen == 0)
{
return NULL;
}
wchar_t* pResult = new wchar_t[nLen];
MultiByteToWideChar( CP_ACP, MB_PRECOMPOSED, szStr, -1, pResult, nLen );
return pResult;
}
int IsMappingMem(const char *MemName)
{
QString slf1=MemName;
slf1.replace("\\","/");
slf1.replace(".","_");
wchar_t *pname=AnsiToUnicode(slf1.toStdString().c_str());
HANDLE hMapFile = OpenFileMapping(FILE_MAP_READ,
false,
pname);
DWORD fInit =hMapFile>0?1:0;
// (GetLastError() == ERROR_ALREADY_EXISTS);
CloseHandle(hMapFile);
return fInit;
}
bool MappingMem(HANDLE *hHandle,LPSTR *hMem,int len,const char* name)
{
QString slf1=name;
slf1.replace("\\","/");
slf1.replace(".","_");
wchar_t *pname=AnsiToUnicode(slf1.toStdString().c_str());
HANDLE hMapFile = OpenFileMapping(FILE_MAP_READ|FILE_MAP_WRITE,
false,
pname);
if(!hMapFile)
{
*hHandle = CreateFileMapping((HANDLE)-1,
(LPSECURITY_ATTRIBUTES) NULL,
PAGE_READWRITE,
(DWORD)0,
(DWORD)len, // size: low 32-bits
pname); // name of map object
}
else *hHandle=hMapFile;
delete pname;
if (*hHandle == NULL) {
return FALSE;
}
*hMem = (LPSTR )MapViewOfFile(
*hHandle, // object to map view of
FILE_MAP_WRITE, // read/write access
0, // high offset: map from
0, // low offset: beginning
0); // default: map entire file
if (*hMem == NULL) return FALSE;
return TRUE;
}
void CloseView(HANDLE hMapObject,LPVOID lpvMem)
{
if(lpvMem)UnmapViewOfFile(lpvMem);
if(hMapObject)CloseHandle(hMapObject);
}
time_t StringToTime(char * szTime)
{
struct tm tm1;
memset(&tm1,0,sizeof(tm));
time_t time1;
sscanf(szTime, "%4d-%2d-%2d %2d:%2d:%2d",
&tm1.tm_year,
&tm1.tm_mon,
&tm1.tm_mday,
&tm1.tm_hour,
&tm1.tm_min,
&tm1.tm_sec);
tm1.tm_year -= 1900;
tm1.tm_mon --;
tm1.tm_isdst=-1;
time1 = mktime(&tm1);
return time1;
}
void CSlfIO::InitWis(int BlockLen,int MaxObjectNumber, int MachineType)
{
m_Head.BlockLen=BlockLen;
m_Head.MaxObjectNumber=MaxObjectNumber;
m_Head.MachineType=MachineType;
m_Head.ObjectNumber=0;
m_Head.EntryOffset=sizeof(Slf_HEAD)+10;
m_Head.DataOffset=(int)((m_Head.EntryOffset+sizeof(Slf_OBJECT_ENTRY)*m_Head.MaxObjectNumber)/(float)BlockLen+(float)0.5)*BlockLen;
m_Head.FileSize=m_Head.DataOffset;
time_t createTime;
gmtime(&createTime);
m_Head.TimeCreate=(unsigned int)createTime;
strcpy(m_Head.Reserved,"WIS 1.0");
WriteWisHead();
m_ObjectEntry=new Slf_OBJECT_ENTRY[m_Head.MaxObjectNumber];
Slf_Info_Head=new char *[m_Head.MaxObjectNumber];
for(int i=0;i<m_Head.MaxObjectNumber;i++) Slf_Info_Head[i]=NULL;
WriteWisObjectEntry();
}
int CSlfIO::ReadWisHead()
{
mFile->seek(10L);
return mFile->read(reinterpret_cast<char*>(&m_Head),sizeof(Slf_HEAD));
}
int CSlfIO::WriteWisHead()
{
mFile->seek(0);
char buf[100];
int len=mFile->read(buf,10);
if(len>=10) mFile->seek(10);
else mFile->write("WIS 1.0 ",10);
if(m_Head.MaxObjectNumber==0) {
AfxMessageBox("错误文件头!");
return 0;
}
mFile->write(reinterpret_cast<char*>(&m_Head),sizeof(Slf_HEAD));
mFile->flush();
return 1;
}
int CSlfIO::ReadWisObjectEntry()
{
mFile->seek(m_Head.EntryOffset);
int sz=sizeof(Slf_OBJECT_ENTRY);
return mFile->read(reinterpret_cast<char*>(m_ObjectEntry),sizeof(Slf_OBJECT_ENTRY)*m_Head.ObjectNumber);
}
bool CSlfIO::IsObject(int index)
{
if(index<0) return false;
int FieldNum=GetSlfTableFieldCount(index);
if(FieldNum<1)
{
return 0;
}
int rec=GetSlfTableRecordCount(index);
int reclen=GetSlfTableRecordLength(index);
Slf_TABLE_ENTRY obj;
GetSlfObjectEntry(index,&obj);
Slf_OBJECT_FIELD *pf=new Slf_OBJECT_FIELD[FieldNum];
memset(pf,0,sizeof(Slf_OBJECT_FIELD)*FieldNum);
GetSlfTableFieldInfo(index,pf);
int pos=0;
if(pf[0].Start>10000000) {
delete []pf;
return 0;
}
if(pf[0].Start<=-4.3160208e+008) {
delete []pf;
return 0;
}
if(pf[0].RepCode<0||pf[0].RepCode>REPR_ULONG){
delete []pf;
return 0;
}
if(pf[0].CodeLength<0){
delete []pf;
return 0;
}
if(FieldNum>1) {
if(pf[1].CodeLength<=0) {
delete []pf;
return 0;
}
if(pf[1].ArrayNum<0) {
delete []pf;
return 0;
}
if(pf[1].RepCode<0) {
delete []pf;
return 0;
}
}
delete []pf;
return true;
}
int CSlfIO::WriteWisObjectEntry()
{
mFile->seek(m_Head.EntryOffset);
for(int i=0;i<m_Head.ObjectNumber;i++)
{
strupr(m_ObjectEntry[i].Name);
}
mFile->write(reinterpret_cast<char*>(m_ObjectEntry),sizeof(Slf_OBJECT_ENTRY)*m_Head.ObjectNumber);
mFile->flush();
return 1;
}
int CSlfIO::WriteWisObjectEntry(int index,Slf_OBJECT_ENTRY *pEntry)
{
if(index<0) return 0;
mFile->seek(m_Head.EntryOffset+sizeof(Slf_OBJECT_ENTRY)*index);
if(pEntry) mFile->write(reinterpret_cast<char*>(pEntry),sizeof(Slf_OBJECT_ENTRY));
else mFile->write(reinterpret_cast<char*>(&m_ObjectEntry[index]),sizeof(Slf_OBJECT_ENTRY));
mFile->flush();
return 1;
}
bool CSlfIO::InitChannelValue(int index)
{
Slf_CHANNEL *m_Channel =(Slf_CHANNEL *)Slf_Info_Head[index];
if(index>-1&&index<m_Head.MaxObjectNumber) {
strcpy(m_Channel->AliasName,"none");
strcpy(m_Channel->AliasUnit,"none");
m_Channel->CodeLen=0;
m_Channel->NumOfDimension=1;
return TRUE;
}
return FALSE;
}
int CSlfIO::ReadWisChannelInfo(int index,Slf_CHANNEL *pInfo)
{
int i=0;
mFile->seek(m_ObjectEntry[index].Position);
if(pInfo) i=mFile->read(reinterpret_cast<char*>(pInfo),sizeof(Slf_CHANNEL));
else i=mFile->read(Slf_Info_Head[index],sizeof(Slf_CHANNEL));
return i;
}
int CSlfIO::WriteWisChannelInfo(int index,Slf_CHANNEL *pInfo)
{
mFile->seek(m_ObjectEntry[index].Position);
char *buf=new char[m_Head.BlockLen+1];
if(pInfo) {
memmove(buf,pInfo, sizeof(Slf_CHANNEL));
mFile->write(buf,m_Head.BlockLen);
if(Slf_Info_Head[index]) memmove(Slf_Info_Head[index],pInfo, sizeof(Slf_CHANNEL));
}
else
{
memmove(buf,Slf_Info_Head[index], sizeof(Slf_CHANNEL));
mFile->write(buf,m_Head.BlockLen);
}
mFile->flush();
delete []buf;
return 1;
}
int CSlfIO::ReadWisStreamInfo(int index)
{
mFile->seek(m_ObjectEntry[index].Position);
return mFile->read(Slf_Info_Head[index],sizeof(DWORD));
}
int CSlfIO::WriteWisStreamInfo(int index)
{
mFile->seek(m_ObjectEntry[index].Position);
mFile->write(Slf_Info_Head[index],sizeof(DWORD));
mFile->flush();
return 1;
}
bool CSlfIO::ExpandWisObject(int index, DWORD BlockNum)
{
// return 0;
DWORD point1,point,pos=m_ObjectEntry[index].Position+m_ObjectEntry[index].BlockNum*m_Head.BlockLen;
int j=0,len=WisFindFreeSpace(BlockNum,index);
if(len<=0) return FALSE;
char *buffer=new char [len+1];
point =m_Head.FileSize;
point1=m_Head.FileSize+m_Head.BlockLen*BlockNum;
while(point>=pos) {
if(point<len) break;
point-=len;
mFile->seek(point);
mFile->read(buffer,len);
if(point1<len) break;
point1-=len;
mFile->seek(point1);
mFile->write(buffer,len);
}
memset(buffer,0,len);
mFile->seek(pos);
mFile->write(buffer,len);
mFile->flush();
delete []buffer;
for(j=index+1;j<m_Head.ObjectNumber;j++) {
m_ObjectEntry[j].Position+=m_Head.BlockLen*BlockNum;
}
m_ObjectEntry[index].BlockNum+=BlockNum;
WriteWisObjectEntry();
m_Head.FileSize+=len;
WriteWisHead();
return TRUE;
}
int CSlfIO::WisFindFreeSpace(DWORD BlockNum,int nExceptIndex)
{
DWORD len=BlockNum*m_Head.BlockLen+m_Head.FileSize;
mFile->resize(len);
if(mFile->size()==len) return BlockNum*m_Head.BlockLen;
return 0;
}
CSlfIO::CSlfIO()
{
mHandle=NULL;
m_Value=NULL;
m_ObjectEntry=NULL;
m_SlfObjectEntry=NULL;
Slf_Info_Head=NULL;
mFile=NULL;
IsWis=0;
memset((char *)&m_SlfHead,0,sizeof(m_SlfHead));
memset((char *)&m_Head,0,sizeof(m_Head));
IsChange=false;
isShengLi=0;
}
CSlfIO::CSlfIO(const char* LogName,int FileType)
{
mHandle=NULL;
m_Value=NULL;
m_ObjectEntry=NULL;
m_SlfObjectEntry=NULL;
Slf_Info_Head=NULL;
mFile=NULL;
IsWis=FileType;
memset((char *)&m_SlfHead,0,sizeof(m_SlfHead));
memset((char *)&m_Head,0,sizeof(m_Head));
if(!Open(LogName,modeReadWrite,1024,1024,0,FileType))
{
AfxMessageBox("Open File Error !");
};
isShengLi=0;
}
CSlfIO::~CSlfIO()
{
Close();
}
QString ConvertDataByFloat(float fValue)
{
if(fValue<0)
return "";
if(abs(fValue)<0.000001)//等于0
{
return "";
}
if(abs(fValue-9999999)<0.000001)//等于9999999为0
{
return "0";
}
QString szTemp=QString::number(fValue,'f',6);
QString szBit(szTemp[0]);
int nBit =szBit.toInt();
//小于6
if(nBit<6)
{
szTemp = szTemp.mid(1,szTemp.size()-1);
szTemp = QString::number(szTemp.toFloat(),'f',nBit);
return szTemp;
}
else
{
szTemp = szTemp.mid(1,szTemp.size()-1);
szTemp = QString::number(szTemp.toFloat(),'f',0);
return szTemp;
}
}
float ConvertDataByString(QString szText)
{
//空
if(szText.isEmpty())
return -99999.f;
bool bOK;
float fTemp = szText.toFloat(&bOK);
//转换失败
if(!bOK)
return -99999.f;
//等于0
if(abs(fTemp)<0.000001)
{
return 9999999.f;
}
//小于0
if(fTemp<0)
return -99999.f;;
//有小数点
if(szText.contains("."))
{
auto rList =szText.split(".");
int nNum =rList[1].size();
//不超过6
if(nNum>6)
nNum =6;
if(nNum==0)//无小数点
szText.insert(0,QString::number(7));
else
szText.insert(0,QString::number(nNum));
}
//无小数点
else
szText.insert(0,QString::number(7));
return szText.toFloat();
}
bool CSlfIO::Open(const char* LogName,unsigned int nOpenFlags,int BlockLen,int MaxObjectNumber, int MachineType,int FileType)
{
CString cs=LogName;
strcpy(m_LogFileName,LogName);
if(nOpenFlags==modeCreate) {
return Open(nOpenFlags,BlockLen,MaxObjectNumber,MachineType,FileType);
}
else if(nOpenFlags==modeRead) {
QFileInfo w(m_LogFileName);
if(w.isFile()) {
}
else return false;
}
char buf[20];
DWORD r;
QString cs1=m_LogFileName;
int i=cs1.lastIndexOf("\\");
int j=cs1.lastIndexOf("/");
if(j>i) i=j;
cs1=cs1.left(i);
QDir dir;
if(!dir.exists(cs1)) dir.mkdir(cs1);
if(dir.exists(m_LogFileName)) {
QFile* aFile=new QFile(m_LogFileName);
aFile->open(QIODevice::ReadWrite);
if(aFile->read(&buf[0],8)==8) {//文件已存在
typedef struct tagSlf3_FILE_MESSAGE
{
//起始位置 变量名称 字节长度 描 述
char AreaName[64];// 64 油矿名称
char OilCompanyName[64];// 64 公司名称
char WellName[64];// 64 井名
char WellType[20];// 20 井类型:直井、斜井
float Xcoor;// 4 大地x坐标
float Ycoor;// 4 大地y坐标
float Altitude;// 4 海拔高度
float Kelly;// 4 补心高度
float StartDepth;// 4 起始深度
float EndDepth;// 4 终止深度
__time32_t StartDrillDate;// 4 开钻时间
__time32_t EndDrillDate;// 4 完钻时间
__time32_t LoggingDate;// 4 测井时间
char LogCompanyName[64];// 64 测井公司
char LoggingTeam[32];// 20 测井队
char Operator[32];// 20 操作员
char LoggingSerial[32];// 20 测井系列
float Well_Bottom_Temperature;//井底温度
float Mud_Density[10];
float Mud_Viscosity[10];
float Mud_Resistivity[10];
float Bit_Diameter[10];
float Bushing_Detpth[10];
float Bushing_Inside_Diameter[10];
float Bushing_Outside_Diameter[10];
float Bit_Depth[10];
char Mud_Property[32];//泥浆性能
char YqType[32];//仪器类型skd3000、h2530、5700
char JB[32];//井别:开发、探井、采油井、注水井
float LoggingDepth;//测时井深
float azca;//闭合方位,磁偏角
float TVD;// 备注
float X0,Y0,Z0;// 起始测点位置坐标偏移量
float Mud_Temp;// 泥浆温度
char Intor[12];// 备注
char IntDepths[12];// 备注
char audit[32];
char Prog[32];
float WaterLoss;
char Item[32];
char Reserved[10];// 备注
}Slf3_FILE_MESSAGE;
typedef struct tagSlf_FILE_MESSAGE31
{
//起始位置 变量名称 字节长度 描 述
char AreaName[64];// 64 油矿名称
char OilCompanyName[64];// 64 公司名称
char WellName[64];// 64 井名
char WellAliasName[64];//绘图需要的井名
char WellType[20];// 20 井类型:直井、斜井
double Xcoor;// 4 大地x坐标
double Ycoor;// 4 大地y坐标
float Altitude;// 4 海拔高度
float Kelly;// 4 补心高度
float StartDepth;// 4 起始深度
float EndDepth;// 4 终止深度
__time32_t StartDrillDate;// 4 开钻时间
__time32_t EndDrillDate;// 4 完钻时间
__time32_t LoggingDate;// 4 测井时间
char LogCompanyName[64];// 64 测井公司
char LoggingTeam[32];// 20 测井队
char Operator[32];// 20 操作员
char LoggingSerial[32];// 20 测井系列
float Well_Bottom_Temperature;//井底温度
float Mud_Density[10];
float Mud_Viscosity[10];
float Mud_Resistivity[10];
float Bit_Diameter[10];
float Bushing_Detpth[10];
float Bushing_Inside_Diameter[10];
float Bushing_Outside_Diameter[10];
float Bit_Depth[10];
char Mud_Property[32];//泥浆性能
char YqType[32];//仪器类型skd3000、h2530、5700
char JB[32];//井别:开发、探井、采油井、注水井
float LoggingDepth;//测时井深
float azca;//闭合方位,磁偏角
float TVD;// 备注
double X0,Y0;
float Z0;// 起始测点位置坐标偏移量
float Mud_Temp;// 泥浆温度
char Intor[12];// 备注
char IntDepths[12];// 备注
char audit[32];
char Prog[32];
float WaterLoss;
char Item[32];
char Reserved[10];// 备注
}Slf31_FILE_MESSAGE;
typedef struct tagSlf_FILE_MESSAGE32
{
//起始位置 变量名称 字节长度 描 述
char AreaName[64];// 64 油矿名称
char OilCompanyName[64];// 64 公司名称
char WellName[64];// 64 井名
char WellAliasName[64];//绘图需要的井名
char WellType[20];// 20 井类型:直井、斜井
double Xcoor;// 4 大地x坐标
double Ycoor;// 4 大地y坐标
float Altitude;// 4 海拔高度
float Kelly;// 4 补心高度
float StartDepth;// 4 起始深度
float EndDepth;// 4 终止深度
__time32_t StartDrillDate;// 4 开钻时间
__time32_t EndDrillDate;// 4 完钻时间
__time32_t LoggingDate;// 4 测井时间
char LogCompanyName[64];// 64 测井公司
char LoggingTeam[32];// 20 测井队
char Operator[32];// 20 操作员
char LoggingSerial[32];// 20 测井系列
float Well_Bottom_Temperature;//井底温度
float Mud_Density[10];
float Mud_Viscosity[10];
float Mud_Resistivity[10];
float Bit_Diameter[10];
float Bushing_Detpth[10];
float Bushing_Inside_Diameter[10];
float Bushing_Outside_Diameter[10];
float Bit_Depth[10];
char Mud_Property[32];//泥浆性能
char YqType[32];//仪器类型skd3000、h2530、5700
char JB[32];//井别:开发、探井、采油井、注水井
float LoggingDepth;//测时井深
float azca;//闭合方位,磁偏角
float TVD;// 备注
double X0,Y0;
float Z0;// 起始测点位置坐标偏移量
float Mud_Temp;// 泥浆温度
char Intor[12];// 备注
char IntDepths[12];// 备注
char audit[32];
char Prog[32];
float WaterLoss;
char Item[32];
char temp[1024];
char Reserved[12];// 备注
}Slf32_FILE_MESSAGE;
typedef struct tagSlf3_FILE_HEAD
{
//起始位置 变量名称 字节长度 描 述
char Version[12];// 12 版本号
DWORD BinaryType;// 4 二进制数据标准
DWORD TableNumber;// 4 已存储表个数
DWORD MaxTableNumber;// 4 预留最大表个数
DWORD TableMessageLength;// 4 表基本信息长度
__time32_t TimeCreate;// 32 文件产生时间
/////////////////////////////////////
Slf3_FILE_MESSAGE WellMessage;
}Slf3_FILE_HEAD;
typedef struct tagSlf31_FILE_HEAD
{
//起始位置 变量名称 字节长度 描 述
char Version[12];// 12 版本号
DWORD BinaryType;// 4 二进制数据标准
DWORD TableNumber;// 4 已存储表个数
DWORD MaxTableNumber;// 4 预留最大表个数
DWORD TableMessageLength;// 4 表基本信息长度
__time32_t TimeCreate;// 32 文件产生时间
/////////////////////////////////////
Slf31_FILE_MESSAGE WellMessage;
}Slf_FILE_HEAD31;
typedef struct tagSlf32_FILE_HEAD
{
//起始位置 变量名称 字节长度 描 述
char Version[12];// 12 版本号
DWORD BinaryType;// 4 二进制数据标准
DWORD TableNumber;// 4 已存储表个数
DWORD MaxTableNumber;// 4 预留最大表个数
DWORD TableMessageLength;// 4 表基本信息长度
__time32_t TimeCreate;// 32 文件产生时间
/////////////////////////////////////
Slf32_FILE_MESSAGE WellMessage;
}Slf_FILE_HEAD32;
buf[7]=0;
if(stricmp(buf,"Slf 2.0")==0||stricmp(buf,"Slf 3.0")==0) {
char *p=(char *)&m_SlfHead;
int off=(char *)&m_SlfHead.WellMessage-p;
aFile->seek(0);
Slf_FILE_HEAD31 slf;
Slf3_FILE_HEAD slf3;
aFile->read((char *)&slf3,sizeof(Slf3_FILE_HEAD));
Slf_TABLE_ENTRY *slf3en=new Slf_TABLE_ENTRY[slf3.MaxTableNumber];
memset(slf3en,0,sizeof(Slf_TABLE_ENTRY)*slf3.MaxTableNumber);
int len=sizeof(Slf_FILE_HEAD31)-sizeof(Slf3_FILE_HEAD);
for(int i=0;i<slf3.TableNumber;i++) {
aFile->seek(sizeof(Slf3_FILE_HEAD)+i*slf3.TableMessageLength);
aFile->read((char *)&slf3en[i],sizeof(Slf_TABLE_ENTRY));
slf3en[i].Position+=len;
for(int j=0;j<slf3en[i].RecondNum;j++){
slf3en[i].DataRecord[j].DataPosition+=len;
}
}
memset(&slf,0,sizeof(Slf_FILE_HEAD31));
memmove(&slf,&slf3,off);
strcpy(slf.Version,"Slf 3.1");
slf.WellMessage.Altitude=slf.WellMessage.Altitude;
slf.WellMessage.AreaName[64];// 64 油矿名称
memmove(slf.WellMessage.OilCompanyName,slf3.WellMessage.OilCompanyName,sizeof(slf.WellMessage.OilCompanyName));// 64 公司名称
memmove(slf.WellMessage.WellName,slf3.WellMessage.WellName,sizeof(slf.WellMessage.WellName));//[64];// 64 井名
memmove(slf.WellMessage.WellAliasName,slf3.WellMessage.WellName,sizeof(slf.WellMessage.WellAliasName));//绘图需要的井名
memmove(slf.WellMessage.WellType,slf3.WellMessage.WellType,sizeof(slf.WellMessage.WellType));// 20 井类型:直井、斜井
slf.WellMessage.Xcoor=slf3.WellMessage.Xcoor;// 4 大地x坐标
slf.WellMessage.Ycoor=slf3.WellMessage.Ycoor;// 4 大地y坐标
slf.WellMessage.Altitude=slf3.WellMessage.Altitude;// 4 海拔高度
slf.WellMessage.Kelly=slf3.WellMessage.Kelly;// 4 补心高度
slf.WellMessage.StartDepth=slf3.WellMessage.StartDepth;// 4 起始深度
slf.WellMessage.EndDepth=slf3.WellMessage.EndDepth;// 4 终止深度
memmove((char *)&slf.WellMessage.StartDrillDate,(char *)&slf3.WellMessage.StartDrillDate,sizeof((char *)&slf.WellMessage.StartDrillDate));// 4 开钻时间
memmove((char *)&slf.WellMessage.EndDrillDate,(char *)&slf3.WellMessage.LoggingDate,sizeof(slf.WellMessage.LoggingDate));// 4 完钻时间
memmove((char *)&slf.WellMessage.LoggingDate,(char *)&slf3.WellMessage.LoggingDate,sizeof(slf.WellMessage.LoggingDate));// 4 测井时间
memmove(slf.WellMessage.LogCompanyName,slf3.WellMessage.LogCompanyName,sizeof(slf.WellMessage.LogCompanyName));//[64];// 64 测井公司
memmove(slf.WellMessage.LoggingTeam,slf3.WellMessage.LoggingTeam,sizeof(slf.WellMessage.LoggingTeam));// 20 测井队
memmove(slf.WellMessage.Operator,slf3.WellMessage.Operator,sizeof(slf.WellMessage.Operator));// 20 操作员
memmove(slf.WellMessage.LoggingSerial,slf3.WellMessage.LoggingSerial,sizeof(slf.WellMessage.LoggingSerial));// 20 测井系列
slf.WellMessage.Well_Bottom_Temperature=slf3.WellMessage.Well_Bottom_Temperature;//井底温度
for(int i=0;i<10;i++) {
slf.WellMessage.Mud_Density[i]=slf3.WellMessage.Mud_Density[i];
slf.WellMessage.Mud_Viscosity[i]=slf3.WellMessage.Mud_Viscosity[i];
slf.WellMessage.Mud_Resistivity[i]=slf3.WellMessage.Mud_Resistivity[i];
slf.WellMessage.Bit_Diameter[i]=slf3.WellMessage.Bit_Diameter[i];
slf.WellMessage.Bushing_Detpth[i]=slf3.WellMessage.Bushing_Detpth[i];
slf.WellMessage.Bushing_Inside_Diameter[i]=slf3.WellMessage.Bushing_Inside_Diameter[i];
slf.WellMessage.Bushing_Outside_Diameter[i]=slf3.WellMessage.Bushing_Outside_Diameter[i];
slf.WellMessage.Bit_Depth[i]=slf3.WellMessage.Bit_Depth[i];
}
memmove(slf.WellMessage.Mud_Property,slf3.WellMessage.Mud_Property,sizeof(slf.WellMessage.Mud_Property));//泥浆性能
memmove(slf.WellMessage.YqType,slf3.WellMessage.YqType,sizeof(slf.WellMessage.YqType));//仪器类型skd3000、h2530、5700
memmove(slf.WellMessage.JB,slf3.WellMessage.JB,sizeof(slf.WellMessage.JB));//井别:开发、探井、采油井、注水井
slf.WellMessage.LoggingDepth=slf3.WellMessage.LoggingDepth;//测时井深
slf.WellMessage.azca=slf3.WellMessage.azca;//闭合方位,磁偏角
slf.WellMessage.TVD=slf3.WellMessage.TVD;// 备注
slf.WellMessage.X0=slf3.WellMessage.X0;
slf.WellMessage.Y0=slf3.WellMessage.Y0;
slf.WellMessage.Z0=slf3.WellMessage.Z0;// 起始测点位置坐标偏移量
slf.WellMessage.Mud_Temp=slf3.WellMessage.Mud_Temp;// 泥浆温度
memmove(slf.WellMessage.Intor,slf3.WellMessage.Intor,sizeof(slf.WellMessage.Intor));// 备注
memmove(slf.WellMessage.IntDepths,slf3.WellMessage.IntDepths,sizeof(slf.WellMessage.IntDepths));// 备注
memmove(slf.WellMessage.audit,slf3.WellMessage.audit,sizeof(slf.WellMessage.audit));
memmove(slf.WellMessage.Prog,slf3.WellMessage.Prog,sizeof(slf.WellMessage.Prog));
slf.WellMessage.WaterLoss=slf3.WellMessage.WaterLoss;
memmove(slf.WellMessage.Item,slf3.WellMessage.Item,sizeof(slf.WellMessage.Item));
memmove(slf.WellMessage.Reserved,slf3.WellMessage.Reserved,sizeof(slf3.WellMessage.Reserved));// 备注
char *buffer=new char [len+1];
long pos=sizeof(Slf3_FILE_HEAD);
long point =aFile->size();
long point1=aFile->size()+len;
while(point>=pos) {
if(point<len) break;
point-=len;
aFile->seek(point);
aFile->read(buffer,len);
if(point1<len) break;
point1-=len;
aFile->seek(point1);
aFile->write(buffer,len);
}
aFile->seek(0);
aFile->write((char*)&slf,sizeof(Slf_FILE_HEAD));
for(int i=0;i<slf3.TableNumber;i++) {
aFile->seek(sizeof(Slf_FILE_HEAD)+i*slf.TableMessageLength);
aFile->write((char *)&slf3en[i],sizeof(Slf_TABLE_ENTRY));
}
aFile->flush();
delete []buffer;
delete slf3en;
// QString cs=buf;
// cs+="该数据格式不再支持,请重新创建该文件!";
// AfxMessageBox(cs);
// return false;
}
if(stricmp(buf,"wis 1.0")==0||stricmp(buf,"SLF 1.0")==0) IsWis=1;
else if(stricmp(buf,"Slf 2.0")==0||
stricmp(buf,"Slf 3.0")==0||stricmp(buf,"Slf 3.1")==0)
{
IsWis=0;
}
else if(stricmp(buf,"Slf 3.2")==0)
{
Slf_FILE_HEAD slf;
Slf_FILE_HEAD32 slf32;
char *p=(char *)&slf;
int off=(char *)&slf.WellMessage.Reserved-p;
aFile->seek(0);
aFile->read((char *)&slf32,sizeof(Slf_FILE_HEAD32));
if(slf32.WellMessage.Kelly)slf32.WellMessage.Kelly=ConvertDataByString(QString::number(slf32.WellMessage.Kelly,'f',2));
if(slf32.WellMessage.Bit_Diameter[0])slf32.WellMessage.Bit_Diameter[0]=ConvertDataByString(QString::number(slf32.WellMessage.Bit_Diameter[0],'f',2));
if(slf32.WellMessage.Bit_Depth[0])slf32.WellMessage.Bit_Depth[0]=ConvertDataByString(QString::number(slf32.WellMessage.Bit_Depth[0],'f',2 ));
if(slf32.WellMessage.Bit_Diameter[1])slf32.WellMessage.Bit_Diameter[1]=ConvertDataByString(QString::number(slf32.WellMessage.Bit_Diameter[1],'f',2 ));
if(slf32.WellMessage.Bit_Depth[1])slf32.WellMessage.Bit_Depth[1]=ConvertDataByString(QString::number(slf32.WellMessage.Bit_Depth[1],'f',2 ));
if(slf32.WellMessage.Bit_Diameter[2])slf32.WellMessage.Bit_Diameter[2]=ConvertDataByString(QString::number(slf32.WellMessage.Bit_Diameter[2],'f',2));
if(slf32.WellMessage.Bit_Depth[2])slf32.WellMessage.Bit_Depth[2]=ConvertDataByString(QString::number(slf32.WellMessage.Bit_Depth[2],'f',2 ));
if(slf32.WellMessage.Bit_Diameter[3])slf32.WellMessage.Bit_Diameter[3]=ConvertDataByString(QString::number(slf32.WellMessage.Bit_Diameter[3],'f',2));
if(slf32.WellMessage.Bit_Depth[3])slf32.WellMessage.Bit_Depth[3]=ConvertDataByString(QString::number(slf32.WellMessage.Bit_Depth[3],'f',2 ));
if(slf32.WellMessage.Bushing_Inside_Diameter[0])slf32.WellMessage.Bushing_Inside_Diameter[0]=ConvertDataByString(QString::number(slf32.WellMessage.Bushing_Inside_Diameter[0],'f',2) );
if(slf32.WellMessage.Bushing_Detpth[0])slf32.WellMessage.Bushing_Detpth[0]=ConvertDataByString(QString::number(slf32.WellMessage.Bushing_Detpth[0],'f',2));
if(slf32.WellMessage.Bushing_Inside_Diameter[1])slf32.WellMessage.Bushing_Inside_Diameter[1]=ConvertDataByString(QString::number(slf32.WellMessage.Bushing_Inside_Diameter[1],'f',2) );
if(slf32.WellMessage.Bushing_Detpth[1])slf32.WellMessage.Bushing_Detpth[1]=ConvertDataByString(QString::number(slf32.WellMessage.Bushing_Detpth[1],'f',2));
if(slf32.WellMessage.Bushing_Inside_Diameter[2])slf32.WellMessage.Bushing_Inside_Diameter[2]=(ConvertDataByString(QString::number(slf32.WellMessage.Bushing_Inside_Diameter[2],'f',2) ));
if(slf32.WellMessage.Bushing_Detpth[2])slf32.WellMessage.Bushing_Detpth[2]=ConvertDataByString(QString::number(slf32.WellMessage.Bushing_Detpth[2],'f',2));
if(slf32.WellMessage.Bushing_Outside_Diameter[0])slf32.WellMessage.Bushing_Outside_Diameter[0]=(ConvertDataByString(QString::number(slf32.WellMessage.Bushing_Outside_Diameter[0],'f',2)));
if(slf32.WellMessage.Bushing_Outside_Diameter[1])slf32.WellMessage.Bushing_Outside_Diameter[1]=(ConvertDataByString(QString::number(slf32.WellMessage.Bushing_Outside_Diameter[1],'f',2)));
if(slf32.WellMessage.Bushing_Outside_Diameter[2])slf32.WellMessage.Bushing_Outside_Diameter[2]=ConvertDataByString(QString::number(slf32.WellMessage.Bushing_Outside_Diameter[2],'f',2));
memset(&slf,0,sizeof(Slf_FILE_HEAD));
memmove(&slf,&slf32,off);
memmove(&slf.WellMessage.Reserved,&slf32.WellMessage.Reserved,10);
Slf_TABLE_ENTRY *slf3en=new Slf_TABLE_ENTRY[slf32.MaxTableNumber];
memset(slf3en,0,sizeof(Slf_TABLE_ENTRY)*slf32.MaxTableNumber);
int len=sizeof(Slf_FILE_HEAD32)-sizeof(Slf_FILE_HEAD);
for(int i=0;i<slf32.TableNumber;i++) {
aFile->seek(sizeof(Slf_FILE_HEAD32)+i*slf32.TableMessageLength);
aFile->read((char *)&slf3en[i],sizeof(Slf_TABLE_ENTRY));
slf3en[i].Position-=len;
for(int j=0;j<slf3en[i].RecondNum;j++){
slf3en[i].DataRecord[j].DataPosition-=len;
}
}
strcpy(slf.Version,"Slf 3.1");
long length=aFile->size();
char *buffer=new char [len+1];
long point =sizeof(Slf_FILE_HEAD32);
long point1=sizeof(Slf_FILE_HEAD);
while(point<length) {
aFile->seek(point);
aFile->read(buffer,len);
aFile->seek(point1);
aFile->write(buffer,len);
point+=len;
point1+=len;
}
aFile->seek(0);
aFile->write((char*)&slf,sizeof(Slf_FILE_HEAD));
for(int i=0;i<slf32.TableNumber;i++) {
aFile->seek(sizeof(Slf_FILE_HEAD)+i*slf.TableMessageLength);
aFile->write((char *)&slf3en[i],sizeof(Slf_TABLE_ENTRY));
}
aFile->resize(length-len);
aFile->flush();
delete []buffer;
delete slf3en;
IsWis=0;
}
else {
IsWis=0;
aFile->close();
delete aFile;
return false;
}
}
else IsWis=0;//新文件
aFile->close();
delete aFile;
}
else IsWis=0;
return Open(nOpenFlags,BlockLen,MaxObjectNumber,MachineType,IsWis);
}
bool CSlfIO::BackUpFile()
{
QDir ss;
QString temp=m_LogFileName;
int pos=temp.indexOf("logdata",0,Qt::CaseInsensitive);
if(pos>-1)
{
QString tt=temp.left(pos+8);
tt+="/temp/#backup/";
ss.mkdir(tt);
temp=tt;
}
QString temp1=temp+"1.slf";
int i=1;
char buf[100];
while(ss.exists(temp1))
{
if(i>2)
{
QString temp2;
for(int j=1;j<i;j++)
{
sprintf(buf,"%d.slf",j);
temp2=temp+buf;
sprintf(buf,"%d.slf",j+1);
temp1=temp+buf;
if(j==1) QFile::remove(temp2);
QFile::rename(temp1,temp2);
}
break;
}
i++;
sprintf(buf,"%d.slf",i);
temp1=temp+buf;
}
bool l=QFile::copy(m_LogFileName,temp1);
return l;
}
bool CSlfIO::OpenWis(unsigned int nOpenFlags,int BlockLen,int MaxObjectNumber, int MachineType)
{
IsWis=1;
if(nOpenFlags==modeCreate)
{
// Attach a CFile object to the handle we have.
mFile=new QFile(m_LogFileName);
mFile->open(QIODevice::ReadWrite);
InitWis(BlockLen, MaxObjectNumber, MachineType);
mFile->flush();
return TRUE;
}
else {
int isexit=0;
QFileInfo w(m_LogFileName);
if(w.isFile()) isexit=1;
if(nOpenFlags&modeRead&&!(nOpenFlags&modeWrite)&&!isexit) return FALSE;
mFile=new QFile(m_LogFileName);
mFile->open(QIODevice::ReadWrite);
if(nOpenFlags&modeReadWrite&&!isexit) {
InitWis(BlockLen, MaxObjectNumber, MachineType);
mFile->flush();
}
ReadWisHead();
if(m_Head.MaxObjectNumber<=0) {
// AfxMessageBox("文件信息错误!");
return FALSE;
}
m_ObjectEntry=new Slf_OBJECT_ENTRY[m_Head.MaxObjectNumber];
Slf_Info_Head=new char *[m_Head.MaxObjectNumber];
for(int i=0;i<m_Head.MaxObjectNumber;i++) Slf_Info_Head[i]=NULL;
ReadWisObjectEntry();
for(int i=0;i<m_Head.ObjectNumber;i++)
{
strupr(m_ObjectEntry[i].Name);
}
return TRUE;
}
return FALSE;
}
void CSlfIO::Clear()
{
if(!mFile) return;
mFile->flush();
mFile->close();
delete mFile;
mFile=NULL;
// QFileInfo w(m_LogFileName);
// if(w.isFile()) {
// }
// else return;
mFile=new QFile(m_LogFileName);
mFile->open(QIODevice::ReadWrite);
{
int TableNumber=m_SlfHead.TableNumber;
if(mFile&&m_SlfObjectEntry)
{
ReadSlfHead();
ReadSlfObjectEntry();
int num=0;
for(int index=m_SlfHead.TableNumber;index<m_SlfHead.MaxTableNumber;index++)
{
Slf_Info_Head[index]=NULL;
}
for(int index=0;index<m_SlfHead.TableNumber;index++) {
if(m_SlfObjectEntry[index].Status==OBJECT_DISCARD) {
num++;
}
}
for(int j=0;j<num;j++)
{
for(int index=m_SlfHead.TableNumber-1;index>=0;index--)
{
if(m_SlfObjectEntry[index].Status==OBJECT_DISCARD)
{
DiscardSlfObjectData(index);
memmove((char *)&m_SlfObjectEntry[index],(char *)&m_SlfObjectEntry[index+1],sizeof(Slf_TABLE_ENTRY)*(m_SlfHead.TableNumber-index));
if(Slf_Info_Head[index]) {
Slf_TABLE_MESSAGE *temp1=(Slf_TABLE_MESSAGE *)Slf_Info_Head[index];
delete []temp1->pField;
delete []temp1;
for(int i=index;i<m_SlfHead.TableNumber;i++) {
if(i<m_SlfHead.MaxTableNumber-1) Slf_Info_Head[i]=Slf_Info_Head[i+1];
else Slf_Info_Head[i]=NULL;
}
Slf_Info_Head[m_SlfHead.TableNumber]=NULL;
}
WriteSlfObjectEntry();
if(m_SlfHead.TableNumber>0)m_SlfHead.TableNumber--;
if((int)m_SlfHead.TableNumber<0) m_SlfHead.TableNumber=0;
WriteSlfHead();
break;
}
}
}
}
}
}
void CSlfIO::Close()
{
Clear();
if(mFile){
mFile->flush();
mFile->close();
//CloseHandle(mFile->m_hFile);
delete mFile;
mFile=NULL;
}
if(m_ObjectEntry)delete []m_ObjectEntry;
if(m_SlfObjectEntry)delete []m_SlfObjectEntry;
if(Slf_Info_Head) {
if(IsWis) {
for(int i=0;i<m_Head.MaxObjectNumber;i++)
if(Slf_Info_Head[i]) {
delete Slf_Info_Head[i];
Slf_Info_Head[i]=NULL;
}
}
else {
for(int i=0;i<m_SlfHead.MaxTableNumber;i++)
if(Slf_Info_Head[i]) {
CloseSlfTable(i);
// delete Slf_Info_Head[i];
// Slf_Info_Head[i]=NULL;
}
}
delete [] Slf_Info_Head;
}
m_ObjectEntry=NULL;
m_SlfObjectEntry=NULL;
Slf_Info_Head=NULL;
}
void CSlfIO::GetWisHead(Slf_HEAD* pHead)
{
memmove(pHead,&m_Head,sizeof(Slf_HEAD));
}
void CSlfIO::Convert(char*,DWORD,WORD)
{
}
//Object Operations
int CSlfIO::FindWisObjectIndex(const char* namee,int status)
{
char name[128];
strcpy(name,namee);
strupr((char *)name);
for(int i=0;i<m_Head.ObjectNumber;i++) {
if(strcmp(name,m_ObjectEntry[i].Name)==0) {
if(status==-1) return i;
if(status==m_ObjectEntry[i].Status) return i;
}
}
return -1;
}
int CSlfIO::FindWisObjectName(char* name,short Attribute, short SubAttribute, int status)
{
for(int i=0;i<m_Head.ObjectNumber;i++)
{
if(strcmp(name,m_ObjectEntry[i].Name)==0)
{
if(Attribute>-1)
{
if(m_ObjectEntry[i].Attribute==Attribute)
{
if(SubAttribute>-1)
{
if(m_ObjectEntry[i].SubAttribute==SubAttribute)
{
if(status>-1)
{
if(m_ObjectEntry[i].Status==status) return i;
continue;//else return -1;
}
else return i;
}
continue;//else return -1;
}
else if(status>-1)
{
if(m_ObjectEntry[i].Status==status) return i;
continue;//else return -1;
}
else return i;
}
continue;//else return -1;
}
else if(SubAttribute>-1)
{
if(m_ObjectEntry[i].SubAttribute==SubAttribute)
{
if(status>-1)
{
if(m_ObjectEntry[i].Status==status) return i;
continue;//else return -1;
}
else return i;
}
continue;//else return -1;
}
else if(status>-1)
{
if(m_ObjectEntry[i].Status==status) return i;
continue;//else return -1;
}
else return i;
}
}
return -1;
}
bool CSlfIO::DeleteWisObject(const char* namee)
{
char name[128];
strcpy(name,namee);
strupr((char *)name);
int index=FindWisObjectName((char *)name,-1,-1,OBJECT_NORMAL);
if(index>-1) {
m_ObjectEntry[index].Status=OBJECT_DELETE;
WriteWisObjectEntry();
return TRUE;
}
else return FALSE;
}
bool CSlfIO::DiscardWisObject(const char* namee)
{
char name[128];
strcpy(name,namee);
strupr((char *)name);
int index=FindWisObjectName((char *)name,-1,-1,OBJECT_DELETE);
if(index<0) index=FindWisObjectName((char *)name);
return DiscardWisObject(index);
}
bool CSlfIO::DiscardWisObject(int index)
{
if(index>-1&&index<m_Head.ObjectNumber) {
int i=0;
DWORD point,point1;
char *buffer=new char[m_Head.BlockLen+1];
point1=m_ObjectEntry[index].Position;
point =m_ObjectEntry[index].Position+m_ObjectEntry[index].BlockNum*m_Head.BlockLen;
while(point<m_Head.FileSize){
mFile->seek(point);
mFile->read(buffer,m_Head.BlockLen);
mFile->seek(point1);
mFile->write(buffer,m_Head.BlockLen);
point+=m_Head.BlockLen;
point1+=m_Head.BlockLen;
}
mFile->flush();
delete []buffer;
DWORD len=m_ObjectEntry[index].BlockNum*m_Head.BlockLen;
m_Head.FileSize-=len;
if(Slf_Info_Head[index]) {
delete []Slf_Info_Head[index];
Slf_Info_Head[index]=NULL;
}
for(i=index+1;i<m_Head.ObjectNumber;i++) m_ObjectEntry[i].Position-=len;
for(i=index ;i<m_Head.ObjectNumber;i++) {
if(i<m_Head.MaxObjectNumber-1)
memmove(&m_ObjectEntry[i],&m_ObjectEntry[i+1],sizeof(Slf_OBJECT_ENTRY));
else memset(&m_ObjectEntry[i],0,sizeof(Slf_OBJECT_ENTRY));
}
for(i=index ;i<m_Head.ObjectNumber;i++)
{
if(i<m_Head.MaxObjectNumber-1) Slf_Info_Head[i]=Slf_Info_Head[i+1];
else Slf_Info_Head[i]=NULL;
}
Slf_Info_Head[m_Head.ObjectNumber-1]=NULL;
m_Head.ObjectNumber--;
WriteWisObjectEntry();
WriteWisHead();
mFile->resize(m_Head.FileSize);
return TRUE;
}
return FALSE;
}
bool CSlfIO::RenameWisObject(int index,const char* newNamee)
{
char newName[128];
strcpy(newName,newNamee);
strupr((char *)newName);
int ind=FindWisObjectName(newName);
if(ind>=0) return false;
if(index>-1) {
memmove(m_ObjectEntry[index].Name,newName,sizeof(m_ObjectEntry[index].Name));
WriteWisObjectEntry();
if(m_ObjectEntry[index].Attribute==CHANNEL_OBJECT) {
Slf_CHANNEL m_Channel;
ReadWisChannelInfo(index,&m_Channel);
memmove(m_Channel.DimInfo[0].Name,newName,sizeof(m_Channel.DimInfo[0].Name));
WriteWisChannelInfo(index,&m_Channel);
}
return TRUE;
}
else return FALSE;
}
bool CSlfIO::RenameWisObject(const char* oldName,const char* newNamee)
{
int index=FindWisObjectIndex(oldName);
return RenameWisObject(index,newNamee);
}
bool CSlfIO::CopyWisObject(const char* oldName,const char* newName, bool bFailExist)
{
if(m_Head.ObjectNumber>=m_Head.MaxObjectNumber) return false;
int index=FindWisObjectIndex(oldName);
if(index<0) return FALSE;
index=FindWisObjectIndex(newName);
if(index>=0&&bFailExist) return FALSE;
if(index>=0) {
char back[200];
strcpy(back,newName);
strcat(back,".bak");
CString sss;
sss.Format("CopyWisObject %s",back);
AfxMessageBox(sss);
RenameObject(newName,back);
}
index=FindWisObjectIndex(oldName);//whp add 2011.10.30 如果没有词句index=-1m_ObjectEntry[index].BlockNum是个很大的数字
char *buffer=new char[m_Head.BlockLen+1];
DWORD point1,point2;
point1=m_ObjectEntry[index].Position;
point2=m_Head.FileSize;
for(DWORD i=0;i<m_ObjectEntry[index].BlockNum;i++) {
mFile->seek(point1);
mFile->read(buffer,m_Head.BlockLen);
mFile->seek(point2);
mFile->write(buffer,m_Head.BlockLen);
point1+=m_Head.BlockLen;
point2+=m_Head.BlockLen;
}
mFile->flush();
memmove(&m_ObjectEntry[m_Head.ObjectNumber],&m_ObjectEntry[index],sizeof(Slf_OBJECT_ENTRY));
m_ObjectEntry[m_Head.ObjectNumber].Position=m_Head.FileSize;
memmove(m_ObjectEntry[m_Head.ObjectNumber].Name,newName,sizeof(m_ObjectEntry[m_Head.ObjectNumber].Name));
if(m_ObjectEntry[index].Attribute==CHANNEL_OBJECT) {
Slf_CHANNEL temp;
ReadWisChannelInfo(index,&temp);
memmove(temp.DimInfo[0].Name,newName,sizeof(temp.DimInfo[0].Name));
WriteWisChannelInfo(m_Head.ObjectNumber,&temp);
}
m_Head.FileSize+=m_ObjectEntry[index].BlockNum*m_Head.BlockLen;
m_Head.ObjectNumber++;
WriteWisObjectEntry();
WriteWisHead();
delete []buffer;
return TRUE;
}
bool CSlfIO::UnDeleteWisObject(const char* name)
{
int index=FindWisObjectIndex(name);
if(index>-1) {
m_ObjectEntry[index].Status=OBJECT_NORMAL;
WriteWisObjectEntry();
return TRUE;
}
else return FALSE;
}
WORD CSlfIO::GetWisObjectCount()
{
return m_Head.ObjectNumber;
}
void CSlfIO::GetAllWisObjectEntry(Slf_OBJECT_ENTRY* pEntry,WORD count)
{
if(count<=0) count=m_Head.ObjectNumber;
memmove(pEntry,m_ObjectEntry,sizeof(Slf_OBJECT_ENTRY)*count);
}
void CSlfIO::GetWisObjectEntry(int index,Slf_OBJECT_ENTRY* pEntry)
{
memmove(pEntry,&m_ObjectEntry[index],sizeof(Slf_OBJECT_ENTRY));
}
void CSlfIO::SetWisObjectReserved(int index,char* pEntry)
{
int len=strlen(pEntry);
if(len>=32) len=31;
memmove(&m_ObjectEntry[index].Reserved,pEntry,len);
m_ObjectEntry[index].Reserved[len]=0;
WriteWisObjectEntry();
}
bool CSlfIO::GetWisObjectEntry(const char* name,Slf_OBJECT_ENTRY* pEntry)
{
int index=FindWisObjectIndex(name);
if(index>-1) {
GetWisObjectEntry(index,pEntry);
return TRUE;
}
else return FALSE;
}
void CSlfIO::GetWisObjectAttribute(int index,short* Attribute, short* SubAttribute)
{
*Attribute=m_ObjectEntry[index].Attribute;
*SubAttribute=m_ObjectEntry[index].SubAttribute;
if(m_ObjectEntry[index].Attribute==TABLE_OBJECT) *SubAttribute=m_ObjectEntry[index].SubAttribute+CARD_OBJECT;
}
bool CSlfIO::GetWisObjectAttribute(const char* name,short* Attribute, short* SubAttribute)
{
int index=FindWisObjectIndex(name);
if(index>-1) {
GetWisObjectAttribute(index,Attribute, SubAttribute);
return TRUE;
}
else return FALSE;
}
//Channel Operations
int CSlfIO::OpenWisChannel(const char *name)
{
Slf_CHANNEL m_Channel;
for(int i=0;i<m_Head.ObjectNumber;i++) {
if(m_ObjectEntry[i].Attribute==CHANNEL_OBJECT) {
ReadWisChannelInfo(i,&m_Channel);
if(m_ObjectEntry[i].Status==OBJECT_NORMAL&&(/*strcmp(m_Channel.AliasName,name)==0||*/strcmp(m_ObjectEntry[i].Name,name)==0)) {
if(!Slf_Info_Head[i])Slf_Info_Head[i]=new char[sizeof(Slf_CHANNEL)];
memmove(Slf_Info_Head[i],&m_Channel,sizeof(Slf_CHANNEL));
return i;
}
}
}
return -1;
}
int CSlfIO::OpenWisChannel(const char *namee,short Attribute)
{
char name[128];
strcpy(name,namee);
strupr((char *)name);
Slf_CHANNEL m_Channel;
for(int i=0;i<m_Head.ObjectNumber;i++) {
if(m_ObjectEntry[i].Attribute==CHANNEL_OBJECT&&m_ObjectEntry[i].SubAttribute==Attribute) {
ReadWisChannelInfo(i,&m_Channel);
if(m_ObjectEntry[i].Status==OBJECT_NORMAL&&(/*strcmp(m_Channel.AliasName,name)==0||*/strcmp(m_ObjectEntry[i].Name,name)==0)) {
if(!Slf_Info_Head[i])Slf_Info_Head[i]=new char[sizeof(Slf_CHANNEL)];
memmove(Slf_Info_Head[i],&m_Channel,sizeof(Slf_CHANNEL));
return i;
}
}
}
return -1;
}
DWORD CSlfIO::ComputerWisChannelLength(Slf_CHANNEL *pInfo,unsigned char nDimension)
{
return (DWORD)(pInfo->DimInfo[(int)nDimension].Samples*pInfo->DimInfo[(int)nDimension].Size);
}
DWORD CSlfIO::ComputerWisChannelLength(int index)
{
Slf_CHANNEL *m_Channel=(Slf_CHANNEL *)Slf_Info_Head[index];
int fmtsize;
if(m_ObjectEntry[index].SubAttribute==FMT_OBJECT) fmtsize=sizeof(int);
else if(m_ObjectEntry[index].SubAttribute==TDT_OBJECT) fmtsize=sizeof(double);
else fmtsize=0;
return (DWORD)(m_Channel->DimInfo[0].Size+fmtsize);
}
int CSlfIO::GetWisChannelDefaultValue(Slf_CHANNEL* pInfo,unsigned char nDimension,char* buffer,DWORD buflen)
{
return 1;
}
bool CSlfIO::SetWisChannelPointNum(int index, DWORD nPointNum, DWORD samples1,DWORD samples2,DWORD samples3,DWORD samples4)
{
if(mFile->seek(m_ObjectEntry[index].Position+m_Head.BlockLen)>=0) {
mFile->write(reinterpret_cast<char*>(&nPointNum),sizeof(DWORD));
mFile->flush();
}
return TRUE;
}
DWORD CSlfIO::GetWisChannelPointNum(int index,DWORD samples1,DWORD samples2,DWORD samples3,DWORD samples4)
{
DWORD nPointNum=0;
if(mFile->seek(m_ObjectEntry[index].Position+m_Head.BlockLen)>=0) {
mFile->read(reinterpret_cast<char*>(&nPointNum),sizeof(DWORD));
}
return nPointNum;
}
int CSlfIO::CreateWisChannel(short SubAttribute,const char *namee,Slf_CHANNEL* pInfo,bool bFailExist)
{
char name[128];
strcpy(name,namee);
strupr((char *)name);
int index=FindWisObjectName((char *)name,1,-1,OBJECT_NORMAL);//int index=FindWisObjectIndex(name);
int BlockNum,PointNum=pInfo->DimInfo[0].Samples;
if(PointNum==0) PointNum=pInfo->DimInfo[0].MaxSamples;
if(SubAttribute==FMT_OBJECT) BlockNum=mod((pInfo->DimInfo[0].Size+sizeof(DWORD))*PointNum+sizeof(DWORD),m_Head.BlockLen);
else if(SubAttribute==TDT_OBJECT) BlockNum=mod((pInfo->DimInfo[0].Size+sizeof(double))*PointNum,m_Head.BlockLen);
else BlockNum=mod(pInfo->DimInfo[0].Size*PointNum,m_Head.BlockLen);
pInfo->DimInfo[0].MaxSamples=BlockNum*m_Head.BlockLen/pInfo->DimInfo[0].Size;
if(index<0) {
index=m_Head.ObjectNumber++;
if(!Slf_Info_Head[index]){
Slf_Info_Head[index]=new char [sizeof(Slf_CHANNEL)];
//TODO aiya
//assert(AfxIsValidAddress(Slf_Info_Head[index], sizeof(Slf_CHANNEL), FALSE));
}
if(SubAttribute==FMT_OBJECT) pInfo->DimInfo[0].Samples=0;
memmove(Slf_Info_Head[index],pInfo,sizeof(Slf_CHANNEL));
m_ObjectEntry[index].SubAttribute=SubAttribute;
m_ObjectEntry[index].Attribute=CHANNEL_OBJECT;
m_ObjectEntry[index].Position=m_Head.FileSize;
m_ObjectEntry[index].BlockNum=1;
memmove(m_ObjectEntry[index].Name,name,sizeof(m_ObjectEntry[index].Name));
m_ObjectEntry[index].Status=0;
time_t createTime;
gmtime(&createTime);
m_ObjectEntry[index].TimeCreate=(unsigned int)createTime;
m_ObjectEntry[index].TimeWrite=(unsigned int)createTime;
strcpy(m_ObjectEntry[index].Reserved,"WANG WEI ");
WriteWisObjectEntry();
WriteWisChannelInfo(index);//,pInfo);
m_Head.FileSize+=m_Head.BlockLen;
ExpandWisObject(index,BlockNum);
if(SubAttribute==FMT_OBJECT) SetWisChannelPointNum(index,PointNum);
return index;
}
else if(bFailExist) {
if(!Slf_Info_Head[index]) Slf_Info_Head[index]=new char [sizeof(Slf_CHANNEL)];
ReadWisChannelInfo(index);
Slf_CHANNEL *temp=(Slf_CHANNEL *) Slf_Info_Head[index];
if(temp->DimInfo[0].Delta!=pInfo->DimInfo[0].Delta)
WisChannelResamples(index,temp->DimInfo[0].Delta);
if(temp->DimInfo[0].MaxSamples!=pInfo->DimInfo[0].MaxSamples)
ExpandWisChannel(index,0,temp->DimInfo[0].MaxSamples,temp->DimInfo[0].MaxSamples);
m_ObjectEntry[index].SubAttribute=SubAttribute;
// memmove(Slf_Info_Head[index],pInfo,sizeof(Slf_CHANNEL));
WriteWisObjectEntry();
// WriteWisChannelInfo(index);
return index;
}
return -1;
}
DWORD CSlfIO::SeekWisChannel(int index,DWORD samples1,DWORD samples2,DWORD samples3,DWORD samples4)
{
int dim=0,fmtsize=0;
DWORD samples=0;
DWORD point,len;
if(samples1>0) {dim=0;samples=samples1;}
if(samples2>0) {dim=1;samples=samples2;}
if(samples3>0) {dim=2;samples=samples3;}
if(samples4>0) {dim=3;samples=samples4;}
if(dim==0&&samples==0)samples=1;
if(m_ObjectEntry[index].SubAttribute==FMT_OBJECT) fmtsize=sizeof(int);
else if(m_ObjectEntry[index].SubAttribute==TDT_OBJECT) fmtsize=sizeof(double);
else fmtsize=0;
point=m_ObjectEntry[index].Position+m_Head.BlockLen+fmtsize;
len=ComputerWisChannelLength(index)*(samples-1);
point+=len;
point=mFile->seek(point);
return samples;
}
DWORD CSlfIO::WriteWisChannel(int index,char* buffer,DWORD num, DWORD samples1,DWORD samples2,DWORD samples3,DWORD samples4)
{
int SamplesPos=SeekWisChannel(index,samples1,samples2,samples3,samples4);
int BlockNum=mod((SamplesPos+num-1)*ComputerWisChannelLength(index)+m_Head.BlockLen-m_ObjectEntry[index].BlockNum*m_Head.BlockLen,m_Head.BlockLen);
Slf_CHANNEL *m_Channel=(Slf_CHANNEL *)Slf_Info_Head[index];
if(BlockNum>0) {
ExpandWisObject(index,BlockNum);
SeekWisChannel(index,samples1,samples2,samples3,samples4);
m_Channel->DimInfo[0].MaxSamples=(m_ObjectEntry[index].BlockNum-1)*m_Head.BlockLen/m_Channel->DimInfo[0].Size;
WriteWisChannelInfo(index);
SeekWisChannel(index,samples1,samples2,samples3,samples4);
}
if(SamplesPos+num-1>(int)m_Channel->DimInfo[0].Samples) {
m_Channel->DimInfo[0].Samples=SamplesPos+num-1;
WriteWisChannelInfo(index);
SeekWisChannel(index,samples1,samples2,samples3,samples4);
}
int l=num*ComputerWisChannelLength(index);
mFile->write(buffer,l);
mFile->flush();
return l;
}
DWORD CSlfIO::ReadWisChannel(int index,char* buffer,DWORD num, DWORD samples1,DWORD samples2,DWORD samples3,DWORD samples4)
{
int samples=SeekWisChannel(index,samples1,samples2,samples3,samples4);
int len=num*ComputerWisChannelLength(index);
return mFile->read(buffer,len);
}
bool CSlfIO::ExpandWisChannel(int index, unsigned char nDimension, DWORD nSamples, DWORD nTopSamples)
{
Slf_CHANNEL *m_Channel=(Slf_CHANNEL *)Slf_Info_Head[index];
if(nTopSamples>m_Channel->DimInfo[0].MaxSamples) {
int len=nTopSamples*ComputerWisChannelLength(index);
DWORD BlockNum=mod(len,m_Head.BlockLen)+1-m_ObjectEntry[index].BlockNum;
m_Channel->DimInfo[nDimension].Samples=nSamples;
m_Channel->DimInfo[nDimension].MaxSamples=(m_ObjectEntry[index].BlockNum-1+BlockNum)*m_Head.BlockLen/m_Channel->DimInfo[nDimension].Size;
WriteWisChannelInfo(index);
ExpandWisObject(index,BlockNum);
}
else if(nTopSamples<m_Channel->DimInfo[0].MaxSamples) {
int len=nTopSamples*ComputerWisChannelLength(index);
int SBlockNum=mod(len,m_Head.BlockLen)+1;
if(SBlockNum<1) return FALSE;
int BlockNum =m_ObjectEntry[index].BlockNum-SBlockNum;
if(BlockNum<1) return FALSE;
m_Channel->DimInfo[nDimension].Samples=nSamples;
m_Channel->DimInfo[nDimension].MaxSamples=SBlockNum*m_Head.BlockLen/m_Channel->DimInfo[nDimension].Size;
// WriteWisChannelInfo(index);
char *buffer=new char[m_Head.BlockLen+1];
DWORD point,point1;
point1=m_ObjectEntry[index].Position+SBlockNum*m_Head.BlockLen;
point =m_ObjectEntry[index].Position+m_ObjectEntry[index].BlockNum*m_Head.BlockLen;
while(point<m_Head.FileSize){
mFile->seek(point);
mFile->read(buffer,m_Head.BlockLen);
mFile->seek(point1);
mFile->write(buffer,m_Head.BlockLen);
point+=m_Head.BlockLen;
point1+=m_Head.BlockLen;
}
mFile->flush();
delete []buffer;
m_ObjectEntry[index].BlockNum-=BlockNum;
m_Head.FileSize-=BlockNum*m_Head.BlockLen;;
for(int i=index+1;i<m_Head.ObjectNumber;i++) m_ObjectEntry[i].Position-=BlockNum*m_Head.BlockLen;
WriteWisObjectEntry();
WriteWisHead();
mFile->resize(m_Head.FileSize);
return FALSE;
}
return 1;
}
bool CSlfIO::MoveWisChannel(int index, unsigned char nDimension, DWORD nStart, int nMove, DWORD nTotal)
{
Slf_CHANNEL *m_Channel=(Slf_CHANNEL *)Slf_Info_Head[index];
char *buffer=new char[m_Channel->DimInfo[nDimension].Size+1];
DWORD point,point1,point2;
int lenn=0;
nStart--;nTotal--;
point=m_ObjectEntry[index].Position+m_Head.BlockLen;
for(int i=1;i<nDimension;i++) lenn+=m_Channel->DimInfo[i].Size*m_Channel->DimInfo[i].MaxSamples;
if(nMove<0) {
if(nStart+nMove<0) nStart=-nMove;
for(int j=nStart;j<=(int)nTotal;j++) {
point1=point+lenn+m_Channel->DimInfo[0].Size*j;
point2=point+lenn+m_Channel->DimInfo[0].Size*(j+nMove);
mFile->seek(point1);
mFile->read(buffer,m_Channel->DimInfo[nDimension].Size);
mFile->seek(point2);
mFile->write(buffer,m_Channel->DimInfo[nDimension].Size);
}
mFile->flush();
}
else {
if(nTotal+nMove>=m_Channel->DimInfo[0].Samples) {
int mm=nTotal+nMove-m_Channel->DimInfo[0].Samples;
m_Channel->DimInfo[0].Samples+=mm;
if(nTotal+nMove>=m_Channel->DimInfo[0].MaxSamples) {
nTotal=m_Channel->DimInfo[0].MaxSamples-nMove;
m_Channel->DimInfo[0].Samples=m_Channel->DimInfo[0].MaxSamples;
}
WriteWisChannelInfo(index);
}
for(int j=nTotal;j>=(int)nStart;j--) {
point1=point+lenn+m_Channel->DimInfo[0].Size*j;
point2=point+lenn+m_Channel->DimInfo[0].Size*(j+nMove);
mFile->seek(point1);
mFile->read(buffer,m_Channel->DimInfo[nDimension].Size);
mFile->seek(point2);
mFile->write(buffer,m_Channel->DimInfo[nDimension].Size);
}
mFile->flush();
}
delete buffer;
return 1;
}
bool CSlfIO::OrderWisChannel(int index, unsigned char nDimension, int nMethod)
{
return 1;
}
bool CSlfIO::CorrectWisChannel(int index, unsigned char nDimension, float delta)
{
Slf_CHANNEL *m_Channel=(Slf_CHANNEL *)Slf_Info_Head[index];
m_Channel->DimInfo[nDimension].StartVal+=delta;
WriteWisChannelInfo(index);
return 1;
}
void CSlfIO::SetData(int RepCode,char *buffer,float *yy)
{
switch(RepCode)
{
case REPR_INT: //0
(*((int*)buffer))=(int)*yy;
break;
case REPR_SHORT: //1
(*((short *)buffer))=(short)*yy;
break;
case REPR_LONG://2
(*((long *)buffer))=(long)*yy;
break;
case REPR_FLOAT://3
(*((float *)buffer))=*yy;
break;
case REPR_DOUBLE://4
(*((double *)buffer))=(double)*yy;
break;
case REPR_CHAR://5
(*((char *)buffer))=(char)*yy;
break;
case REPR_UCHAR://6
(*((unsigned char *)buffer))=(unsigned char)*yy;
break;
case REPR_USHORT://7
(*((unsigned short *)buffer))=(unsigned short)*yy;
break;
case REPR_UINT://8
(*((unsigned int *)buffer))=(unsigned int)*yy;
break;
case REPR_ULONG://9
(*((unsigned long *)buffer))=(unsigned long )*yy;
break;
case REPR_STRING://10
// *yy=-99999;
break;
}
}
float CSlfIO::GetData(int RepCode,char *buffer,float *yy)
{
switch(RepCode)
{
case REPR_INT: //0
*yy=(float)(*((int*)buffer));
break;
case REPR_SHORT: //1
*yy=(float)(*((short *)buffer));
break;
case REPR_LONG://2
*yy=(float)(*((long *)buffer));
break;
case REPR_FLOAT://3
*yy=(float)(*((float *)buffer));
break;
case REPR_DOUBLE://4
*yy=(float)(*((double *)buffer));
break;
case REPR_CHAR://5
*yy=(float)(*((char *)buffer));
break;
case REPR_UCHAR://6
*yy=(float)(*((unsigned char *)buffer));
break;
case REPR_USHORT://7
*yy=(float)(*((unsigned short *)buffer));
break;
case REPR_UINT://8
*yy=(float)(*((unsigned int *)buffer));
break;
case REPR_ULONG://9
*yy=(float)(*((unsigned long *)buffer));
break;
case REPR_STRING://10
*yy=-99999;
break;
}
return *yy;
}
void CSlfIO::GetData(int RepCode,char *buffer,char *format,char *buf)
{
switch(RepCode)
{
case REPR_INT: //0
sprintf(buf,format,*(int*)buffer);
break;
case REPR_SHORT: //1
sprintf(buf,format,*(short *)buffer);
break;
case REPR_LONG://2
sprintf(buf,format,*(long *)buffer);
break;
case REPR_FLOAT://3
sprintf(buf,format,*(float *)buffer);
break;
case REPR_DOUBLE://4
sprintf(buf,format,*(double *)buffer);
break;
case REPR_CHAR://5
sprintf(buf,format,*(char *)buffer);
break;
case REPR_UCHAR://6
sprintf(buf,format,*(unsigned char *)buffer);
break;
case REPR_USHORT://7
sprintf(buf,format,*(unsigned short *)buffer);
break;
case REPR_UINT://8
sprintf(buf,format,*(unsigned int *)buffer);
break;
case REPR_ULONG://9
sprintf(buf,format,*(unsigned long *)buffer);
break;
case REPR_STRING://10
strcpy(buf,buffer);
break;
}
}
void CSlfIO::WisChannelResamples(int index,float newDelta)
{
Slf_CHANNEL *m_Channel=(Slf_CHANNEL *)Slf_Info_Head[index];
Slf_CHANNEL mych,mych1;
if(m_Channel->DimInfo[0].Delta==newDelta) return;
if(FindWisObjectIndex("NEWNAME")>-1) DiscardWisObject("NEWNAME");
if(!CopyWisObject((const char* )m_ObjectEntry[index].Name,(const char* )"NEWNAME")) return;
ReadWisChannelInfo(index,&mych);
mych.DimInfo[0].Samples =(DWORD)((mych.DimInfo[0].Delta*mych.DimInfo[0].Samples )/newDelta+0.5);
ExpandWisChannel(index,0,mych.DimInfo[0].Samples,mych.DimInfo[0].Samples);
// ReadWisChannelInfo(index,&mych);
mych.DimInfo[0].Delta=newDelta;
WriteWisChannelInfo(index,&mych);
ReadWisChannelInfo(index);
int mIndex=OpenWisChannel("NEWNAME");
float dep,yy1,yy2,yy;
int k1,k2;
DWORD num,num1;
int Pos=0;
ReadWisChannelInfo(mIndex,&mych1);
if(m_ObjectEntry[index].SubAttribute==CURVE_OBJECT) {
num1=mych1.DimInfo[0].Samples*mych1.DimInfo[0].Size;
char *buffer1=new char[num1+1];
ReadWisChannel(mIndex,(char *)buffer1,mych1.DimInfo[0].Samples,1,0,0,0);
num=mych.DimInfo[0].Samples*mych.DimInfo[0].Size;
char *buffer=new char[num+1];
for(DWORD i=0;i<mych.DimInfo[0].Samples;i++) {
dep=i*newDelta;
k1=dep/mych1.DimInfo[0].Delta+0.5;
k2=dep/mych1.DimInfo[0].Delta+1.5;
Pos=k1*mych.CodeLen;
GetData(mych.RepCode,&buffer1[Pos],&yy1);
Pos=k2*mych.CodeLen;
GetData(mych.RepCode,&buffer1[Pos],&yy2);
// add by whp 2004.1.13
if(k1==k2)yy=yy1;
else yy=yy1+(yy2-yy1)*(i*mych.DimInfo[0].Delta-k1*mych1.DimInfo[0].Delta)/((k2-k1)*mych1.DimInfo[0].Delta);
Pos=i*mych.CodeLen;
SetData(mych.RepCode,&buffer[Pos],&yy);
}
WriteWisChannel(index,(char *)buffer,mych.DimInfo[0].Samples,1,0,0,0);
delete []buffer;
delete []buffer1;
}
else if(m_ObjectEntry[index].SubAttribute==WAVE_OBJECT) {
num1=mych1.DimInfo[0].Size;
char *buffer=new char[num1+1];
for(DWORD i=0;i<mych.DimInfo[0].Samples;i++) {
dep=i*newDelta;
k1=dep/mych1.DimInfo[0].Delta+0.5;
ReadWisChannel(mIndex,buffer,1,0,k1);
WriteWisChannel(index,buffer,1,0,i+1);
}
delete []buffer;
}
CloseChannel(mIndex);
DiscardWisObject("NEWNAME");
}
void CSlfIO::CloseChannel(int index)
{
if(index<0) return ;
if(IsWis) {
if(Slf_Info_Head[index])delete Slf_Info_Head[index];
Slf_Info_Head[index]=NULL;
}
else CloseSlfTable(index);
}
//Table Opeartions
int CSlfIO::OpenWisTable(const char*namee)
{
char name[128];
strcpy(name,namee);
strupr((char *)name);
int index;
index=FindWisObjectName((char *)name,(short)TABLE_OBJECT);
if(index>-1) {
if(m_ObjectEntry[index].Status!=OBJECT_NORMAL) return -1;
if(!Slf_Info_Head[index])Slf_Info_Head[index]=new char [sizeof(Slf_TABLE)];
Slf_TABLE *m_Table=(Slf_TABLE *)Slf_Info_Head[index];
SeekWisTable(index,-1);
mFile->read(Slf_Info_Head[index],sizeof(Slf_TABLE_HEAD));
m_Table->Length=GetWisTableRecordLength(index);
return index;
}
return -1;
}
int CSlfIO::CreateWisTable(short SubAttribute,const char* namee,DWORD length,bool bFailExist)
{
char name[128];
strcpy(name,namee);
strupr((char *)name);
int index=FindWisObjectName((char *)name,(short)TABLE_OBJECT);
if(index>-1) {
if(!Slf_Info_Head[index])Slf_Info_Head[index]=new char [sizeof(Slf_TABLE)];
if(bFailExist) return index;
m_ObjectEntry[index].SubAttribute=SubAttribute;
time_t createTime;
gmtime(&createTime);
m_ObjectEntry[index].TimeWrite=(unsigned int)createTime;
WriteWisObjectEntry();
return index;
}
index=m_Head.ObjectNumber++;
if(!Slf_Info_Head[index])Slf_Info_Head[index]=new char [sizeof(Slf_TABLE)];
m_ObjectEntry[index].SubAttribute=SubAttribute;
m_ObjectEntry[index].Position=m_Head.FileSize;
memmove(m_ObjectEntry[index].Name,name,sizeof(m_ObjectEntry[index].Name));
m_ObjectEntry[index].Attribute=TABLE_OBJECT;
m_ObjectEntry[index].Status=0;
time_t createTime;
gmtime(&createTime);
m_ObjectEntry[index].TimeCreate=(unsigned int)createTime;
m_ObjectEntry[index].TimeWrite=(unsigned int)createTime;
strcpy(m_ObjectEntry[index].Reserved,"WANG WEI !");
m_ObjectEntry[index].BlockNum=0;
WriteWisObjectEntry();
int BlockNum=mod(length+sizeof(Slf_TABLE),m_Head.BlockLen);
if(BlockNum>0) ExpandWisTable(index,BlockNum);
return index;
}
bool CSlfIO::CloseTable(int index)
{
if(index<0) return FALSE;
if(Slf_Info_Head[index]) {
if(!IsWis) {
Slf_TABLE_MESSAGE *temp1=(Slf_TABLE_MESSAGE *)Slf_Info_Head[index];
delete []temp1->pField;
}
delete []Slf_Info_Head[index];
}
Slf_Info_Head[index]=NULL;
return TRUE;
}
bool CSlfIO::SeekWisTable(int index, int OffsetCount, DWORD dwMoveMode)
{
Slf_TABLE *m_Table=(Slf_TABLE *)Slf_Info_Head[index];
int len=0;
if(OffsetCount<0) len=0;
else if(OffsetCount==0) len=sizeof(Slf_TABLE_HEAD);
else len=sizeof(Slf_TABLE_HEAD)+m_Table->FieldCount*sizeof(Slf_TABLE_FIELD_OLD)+(OffsetCount-1)*m_Table->Length;
return SeekWisStream(index,len, dwMoveMode);
}
int CSlfIO::GetWisTableRecordCount(int index)
{
Slf_TABLE *m_Table=(Slf_TABLE *)Slf_Info_Head[index];
return m_Table->RecordCount;
}
int CSlfIO::GetWisTableFieldCount(int index)
{
Slf_TABLE *m_Table=(Slf_TABLE *)Slf_Info_Head[index];
if(!m_Table) return 0;
return m_Table->FieldCount;
}
int CSlfIO::GetMaxObjectNumber()
{
if(IsWis) return m_Head.MaxObjectNumber;
return m_SlfHead.MaxTableNumber;
}
int CSlfIO::GetObjectStatus(int index)
{
if(IsWis) return m_ObjectEntry[index].Status;
return m_SlfObjectEntry[index].Status;
}
int CSlfIO::SetWisTableFieldInfo(int index,Slf_TABLE_FIELD *FieldInfo)
{
Slf_TABLE *m_Table=(Slf_TABLE *)Slf_Info_Head[index];
SeekWisTable(index,-1);
mFile->seek(sizeof(Slf_TABLE_HEAD)+SEEK_CUR);
for(int i=0;i<m_Table->FieldCount;i++){
mFile->write(reinterpret_cast<char*>(&FieldInfo[i]),sizeof(Slf_TABLE_FIELD_OLD));
}
mFile->flush();
if(FieldInfo) return 1;
else return 0;
}
int CSlfIO::SetWisTableHead(int index,DWORD RecordCount,DWORD FieldCount,Slf_TABLE_FIELD *FieldInfo)
{
Slf_TABLE *m_Table=(Slf_TABLE *)Slf_Info_Head[index];
m_Table->RecordCount=RecordCount;
m_Table->FieldCount=FieldCount;
if(FieldInfo) {
m_Table->Length=0;
for(int i=0;i<(int)m_Table->FieldCount;i++)
{
m_Table->Length+=FieldInfo[i].Length;
}
}
SeekWisTable(index,-1);
mFile->write(reinterpret_cast<char*>(m_Table),sizeof(Slf_TABLE_HEAD));
for(int i=0;i<FieldCount;i++)
{
mFile->write(reinterpret_cast<char*>(&FieldInfo[i]),sizeof(Slf_TABLE_FIELD_OLD));
}
mFile->flush();
if(FieldInfo) return 1;
else return 0;
}
bool CSlfIO::SetWisTableRecordCount(int index,int Count)
{
Slf_TABLE *m_Table=(Slf_TABLE *)Slf_Info_Head[index];
SeekWisTable(index,-1);
m_Table->RecordCount=Count;
mFile->write(reinterpret_cast<char*>(m_Table),sizeof(DWORD));
mFile->flush();
return 1;
}
bool CSlfIO::ExpandWisTable(int index,DWORD BlockNum)
{
return ExpandWisObject(index,BlockNum);
}
bool CSlfIO::GetWisTableFieldInfo(int index,Slf_TABLE_FIELD *FieldInfo)
{
Slf_TABLE *m_Table=(Slf_TABLE *)Slf_Info_Head[index];
SeekWisTable(index);
int len=m_Table->FieldCount*sizeof(Slf_TABLE_FIELD_OLD);
Slf_TABLE_FIELD_OLD*pOd=new Slf_TABLE_FIELD_OLD[m_Table->FieldCount+1];
int len1=mFile->read(reinterpret_cast<char*>(pOd),len);
for(int i=0;i<m_Table->FieldCount;i++){
memmove(FieldInfo[i].Name,pOd[i].Name,sizeof(FieldInfo->Name));
memmove(FieldInfo[i].HZName,pOd[i].HZName,sizeof(FieldInfo->Name));
FieldInfo[i].Unit[0]=0;
FieldInfo[i].HZUnit[0]=0;
FieldInfo[i].RepCode=pOd[i].RepCode;
FieldInfo[i].Length=pOd[i].Length;
FieldInfo[i].Reserved=0;
}
delete pOd;
if(len==len1){
return TRUE;
}
else return FALSE;
}
int CSlfIO::GetWisTableRecordLength(int index)
{
Slf_TABLE *m_Table=(Slf_TABLE *)Slf_Info_Head[index];
Slf_TABLE_FIELD buf;
SeekWisTable(index);
m_Table->Length=0;
for(int i=0;i<(int)m_Table->FieldCount;i++) {
mFile->read(reinterpret_cast<char*>(&buf),sizeof(Slf_TABLE_FIELD_OLD));
m_Table->Length+=buf.Length;
}
return m_Table->Length;
}
int CSlfIO::ReadWisTable(int index, int count, void *buffer)
{
Slf_TABLE *m_Table=(Slf_TABLE *)Slf_Info_Head[index];
if(count<1) return 0;
SeekWisTable(index,count);
return mFile->read(reinterpret_cast<char*>(buffer),m_Table->Length);
}
int CSlfIO::mod(int a,int b)
{
if(a<0||b<0) return -1;
if(a%b==0) return a/b;
else return a/b+1;
}
int CSlfIO::WriteWisTable(int index, int count, void *buffer)
{
Slf_TABLE *m_Table=(Slf_TABLE *)Slf_Info_Head[index];
if(count<1) return 0;
int BlockNum=mod(count*m_Table->Length+m_Table->FieldCount*sizeof(Slf_TABLE_FIELD_OLD)+sizeof(Slf_TABLE_HEAD)-m_ObjectEntry[index].BlockNum*m_Head.BlockLen,m_Head.BlockLen);
if(BlockNum>0) ExpandWisTable(index,BlockNum);
if((DWORD)count>m_Table->RecordCount) {
m_Table->RecordCount=count;
SetWisTableRecordCount(index,count);
}
SeekWisTable(index,count);
mFile->write(reinterpret_cast<char*>(buffer),m_Table->Length);
mFile->flush();
return 1;
}
//Stream Operations
int CSlfIO::OpenWisStream(const char* namee)
{
char name[256];
strcpy(name,namee);
strupr((char *)name);
int index=FindWisObjectName((char *)name,(short)STREAM_OBJECT);
if(index>-1) {
if(m_ObjectEntry[index].Status!=OBJECT_NORMAL) return -1;
if(!Slf_Info_Head[index])Slf_Info_Head[index]=new char [sizeof(Slf_STREAM)];
ReadWisStreamInfo(index);
return index;
}
return -1;
}
int CSlfIO::CreateWisStream(short SubAttribute,const char *namee,DWORD length,bool bFailExist)
{
char name[128];
strcpy(name,namee);
strupr((char *)name);//对象名为大写
int index=FindWisObjectName((char *)name,(short)STREAM_OBJECT);
if(index>-1) {
if(!Slf_Info_Head[index])Slf_Info_Head[index]=new char [sizeof(Slf_STREAM)];
if(bFailExist) return index;
m_ObjectEntry[index].SubAttribute=SubAttribute;
time_t createTime;
gmtime(&createTime);
m_ObjectEntry[index].TimeWrite=(unsigned int)createTime;
WriteWisObjectEntry();
return index;
}
index=m_Head.ObjectNumber++;
if(!Slf_Info_Head[index])Slf_Info_Head[index]=new char [sizeof(Slf_STREAM)];
m_ObjectEntry[index].SubAttribute=SubAttribute;
m_ObjectEntry[index].Position=m_Head.FileSize;
memmove(m_ObjectEntry[index].Name,name,sizeof(m_ObjectEntry[index].Name));
m_ObjectEntry[index].Attribute=STREAM_OBJECT;
m_ObjectEntry[index].Status=0;
time_t createTime;
gmtime(&createTime);
m_ObjectEntry[index].TimeCreate=(unsigned int)createTime;
m_ObjectEntry[index].TimeWrite=(unsigned int)createTime;
strcpy(m_ObjectEntry[index].Reserved,"WANG WEI !");
m_ObjectEntry[index].BlockNum=0;
int BlockNum=mod(length,m_Head.BlockLen);
if(BlockNum>0) ExpandWisStream(index,BlockNum);
SetWisStreamLength(index, (DWORD)0);
return index;
}
void CSlfIO::CloseStream(int index)
{
if(index<0) return;
if(IsWis) {
if(Slf_Info_Head[index]) {
delete []Slf_Info_Head[index];
}
Slf_Info_Head[index]=NULL;
}
else CloseSlfTable(index);
}
bool CSlfIO::SetWisStreamLength(int index, DWORD length)
{
Slf_STREAM *m_Stream=(Slf_STREAM *)Slf_Info_Head[index];
SeekWisStream(index);
mFile->write((const char *)&length,sizeof(DWORD));
mFile->flush();
m_Stream->Length=length;
DWORD len=length;
if(len==length) return TRUE;
else return FALSE;
}
bool CSlfIO::ExpandWisStream(int index, DWORD BlockNum)
{
return ExpandWisObject(index,BlockNum);
}
bool CSlfIO::SeekWisStream(int index, int lMove, DWORD dwMoveMode)
{
DWORD point;
if(dwMoveMode==0) point=m_ObjectEntry[index].Position+lMove;
else if(dwMoveMode==1) point=m_ObjectEntry[index].Position+lMove;
else {
if(index+1>=m_Head.ObjectNumber) point=m_Head.FileSize-lMove;
else point=m_ObjectEntry[index+1].Position-lMove;
}
mFile->seek(point);
return 1;
}
bool CSlfIO::ReadWisStream(int index, DWORD length, LPDWORD lpBytesRead, char *buffer)
{
SeekWisStream(index, sizeof(DWORD));
*lpBytesRead=mFile->read(buffer,length);
if(*lpBytesRead==length) return TRUE;
else return FALSE;
}
bool CSlfIO::WriteWisStream(int index, DWORD length, LPDWORD lpBytesWrite, const char *buffer)
{
Slf_STREAM *m_Stream=(Slf_STREAM *)Slf_Info_Head[index];
int BlockNum=mod(length+sizeof(DWORD)-m_ObjectEntry[index].BlockNum*m_Head.BlockLen,m_Head.BlockLen);
if(BlockNum>0) ExpandWisStream(index,BlockNum);
m_Stream->Length=length;
WriteWisStreamInfo(index);
SeekWisStream(index, sizeof(DWORD));
mFile->write(buffer,length);
mFile->flush();
*lpBytesWrite=length;
if(*lpBytesWrite==length) return TRUE;
else return FALSE;
}
DWORD CSlfIO::GetWisStreamLength(int index)
{
Slf_STREAM *m_Stream=(Slf_STREAM *)Slf_Info_Head[index];
ReadWisStreamInfo(index);
return m_Stream->Length;
}
DWORD CSlfIO::GetWisObjectLength(char *name)
{
int index=FindWisObjectName(name);
if(index<0) return 0;
return m_ObjectEntry[index].BlockNum*m_Head.BlockLen;
}
bool CSlfIO::CopyWisObjectToMem(Slf_OBJECT_ENTRY *my,char *name,char *buffer,int Len)
{
int index=FindWisObjectName(name);
if(index<0) return NULL;
memmove(my,&m_ObjectEntry[index],sizeof(Slf_OBJECT_ENTRY));
mFile->seek(m_ObjectEntry[index].Position);
mFile->read(buffer,Len);
return TRUE;
}
bool CSlfIO::CopyFromWisFile(Slf_OBJECT_ENTRY *my,char *buffer,int Len)
{
int index=FindWisObjectName(my->Name);
if(index>=0) return FALSE;
memmove(&m_ObjectEntry[m_Head.ObjectNumber],my,sizeof(Slf_OBJECT_ENTRY));
m_ObjectEntry[m_Head.ObjectNumber].Position=m_Head.FileSize;
mFile->seek(m_Head.FileSize);
mFile->write(buffer,Len);
mFile->flush();
m_Head.FileSize+=Len;
m_Head.ObjectNumber++;
WriteWisHead();
WriteWisObjectEntry();
return TRUE;
}
bool CSlfIO::CopyFromWisFile(CSlfIO &Source,char *Name)
{
if(!Source.mFile) return FALSE;
if(Source.IsWis) {
int len=Source.GetWisObjectLength(Name);
if(len==0) return FALSE;
char *buf=new char[len+1];
if(!buf) return FALSE;
Slf_OBJECT_ENTRY obje;
if(Source.GetWisObjectEntry(Name,&obje)) {
if(Source.CopyWisObjectToMem(&obje,Name,buf,len)) {
if(CopyFromWisFile(&obje,buf,len)) {
delete buf;
return TRUE;
}
}
}
delete buf;
}
return FALSE;
}
bool CSlfIO::CopyFromWisFile(CSlfIO &Source,char *Name,char *newName)
{
if(!Source.mFile) return FALSE;
if(Source.IsWis) {
int len=Source.GetWisObjectLength(Name);
if(len==0) return FALSE;
char *buf=new char[len+1];
if(!buf) return FALSE;
Slf_OBJECT_ENTRY obje;
if(Source.GetWisObjectEntry(Name,&obje)) {
if(Source.CopyWisObjectToMem(&obje,Name,buf,len)) {
strcpy(obje.Name,newName);
if(CopyFromWisFile(&obje,buf,len)) {
delete buf;
return TRUE;
}
}
}
delete buf;
}
return FALSE;
}
void CSlfIO::Pack()
{
if(IsWis) WisPack();
else SlfPack();
}
void CSlfIO::Init(int BlockLen,int MaxObjectNumber, int MachineType)
{
if(IsWis) InitWis(BlockLen,MaxObjectNumber,MachineType);
else InitSlf(BlockLen,MaxObjectNumber,MachineType);
}
int CSlfIO::ReadHead()
{
if(IsWis) return ReadWisHead();
else return ReadSlfHead();
}
int CSlfIO::WriteHead()
{
if(IsWis) return WriteWisHead();
else return WriteSlfHead();
}
int CSlfIO::ReadObjectEntry()
{
if(IsWis) return ReadWisObjectEntry();
else return ReadSlfObjectEntry();
}
int CSlfIO::WriteObjectEntry()
{
if(IsWis) return WriteWisObjectEntry();
else return WriteSlfObjectEntry();
}
int CSlfIO::ReadChannelInfo(int index,Slf_CHANNEL *pInfo)
{
return ReadWisChannelInfo(index,pInfo);
}
int CSlfIO::WriteChannelInfo(int index,Slf_CHANNEL *pInfo)
{
return WriteWisChannelInfo(index,pInfo);
}
int CSlfIO::ReadStreamInfo(int index)
{
if(IsWis) return ReadWisStreamInfo(index);
else return ReadSlfStreamInfo(index);
}
int CSlfIO::WriteStreamInfo(int index)
{
if(IsWis) return WriteWisStreamInfo(index);
else return WriteSlfStreamInfo(index);
}
bool CSlfIO::ExpandObject(int index, DWORD BlockNum)
{
if(IsWis) return ExpandWisObject(index,BlockNum);
else return 1;//ExpandSlfObject(index,BlockNum);
}
int CSlfIO::FindFreeSpace(DWORD BlockNum,int nExceptIndex)
{
if(IsWis) return WisFindFreeSpace(BlockNum,nExceptIndex);
else return 1;//SlfFindFreeSpace(BlockNum,nExceptIndex);
}
bool CSlfIO::Open(unsigned int nOpenFlags,int BlockLen,int MaxObjectNumber, int MachineType,int FileType)
{
CString s;
char cs[MAX_PATH+100]="SlfOpen_";
strcat(cs,m_LogFileName);
s=cs;
s.Replace("\\","_");
s.Replace(":","_");
s.Replace(".","_");
s.Replace(" ","_");
s.Replace("#","_");
//cs=s.GetString();
//strcpy(cs,s.GetString());
//TODO
//MappingMem(&mHandle,(LPSTR *)&m_Value,4,s.GetString());
if(FileType) return OpenWis(nOpenFlags,BlockLen,MaxObjectNumber,MachineType);
else return OpenSlf(nOpenFlags,BlockLen,MaxObjectNumber,MachineType);
}
void CSlfIO::WisPack()
{
for(int i=0;i<m_Head.ObjectNumber;i++)
if(m_ObjectEntry[i].Status==OBJECT_DELETE) DiscardWisObject(i);
}
void CSlfIO::SlfPack()
{
for(int i=0;i<m_SlfHead.TableNumber;i++)
if(m_SlfObjectEntry[i].Status==OBJECT_DELETE)
{
DiscardSlfObject(i);
}
/*
for(int i=0;i<m_SlfHead.TableNumber;i++)
{
if(m_SlfObjectEntry[i].RecondNum>1)
{
int rec=GetSlfTableRecordCount(i);
SetSlfTableRecordCount(i,rec);
}
}*/
}
//Object Operations
int CSlfIO::FindObjectIndex(const char* namee)
{
if(IsWis) return FindWisObjectIndex(namee);
else return FindSlfObjectIndex(namee);
}
int CSlfIO::FindObjectName(char* name,short Attribute, short SubAttribute, int status,int otype)
{
if(IsWis) return FindWisObjectName(name,Attribute,SubAttribute,status);
else return FindSlfObjectName(name,Attribute,SubAttribute,status,otype);
}
bool CSlfIO::DeleteObject(const char* namee)
{
if(IsWis) return DeleteWisObject(namee);
else return DeleteSlfObject(namee);
}
bool CSlfIO::DiscardObject(const char* namee)
{
if(IsWis) return DiscardWisObject(namee);
else return DiscardSlfObject(namee);
}
bool CSlfIO::DiscardObject(int index)
{
if(IsWis) return DiscardWisObject(index);
else return DiscardSlfObject(index);
}
bool CSlfIO::RenameObject(int index,const char* newNamee)
{
if(IsWis) return RenameWisObject(index,newNamee);
else return RenameSlfObject(index,newNamee);
}
bool CSlfIO::RenameObject(const char* oldName,const char* newNamee)
{
if(IsWis) return RenameWisObject(oldName,newNamee);
else return RenameSlfObject(oldName,newNamee);
}
bool CSlfIO::CopyObject(const char* oldName,const char* newName, bool bFailExist)
{
if(IsWis) return CopyWisObject(oldName,newName,bFailExist);
else return CopySlfObject(oldName,newName,bFailExist);
}
bool CSlfIO::UnDeleteObject(const char* name)
{
if(IsWis) return UnDeleteWisObject(name);
else return UndeleteSlfObject(name);
}
WORD CSlfIO::GetObjectCount()
{
if(IsWis) return GetWisObjectCount();
else return GetSlfObjectCount();
}
void CSlfIO::GetAllObjectEntry(Slf_OBJECT_ENTRY* pEntry,WORD count)
{
if(IsWis) return GetAllWisObjectEntry(pEntry,count);
else return GetAllSlfObjectEntry((Slf_TABLE_ENTRY *)pEntry,count);
}
bool CSlfIO::GetObjectEntry(const char* name,Slf_OBJECT_ENTRY* pEntry)
{
if(IsWis) return GetWisObjectEntry(name,pEntry);
else {
Slf_TABLE_ENTRY my;
if(GetSlfObjectEntry(name,&my)) {
memmove((char *)pEntry->Name,my.Name,sizeof(pEntry->Name));
pEntry->Status=my.Status;
if(my.Type==CURVE_OBJECT||my.Type==TDT_OBJECT||my.Type==FMT_OBJECT) {
pEntry->Attribute=CHANNEL_OBJECT;
pEntry->SubAttribute=my.Type;
}
else if(my.Type==CARD_OBJECT) {
pEntry->Attribute=STREAM_OBJECT;
pEntry->SubAttribute=PARA_OBJECT;
}
else if(my.Type>CARD_OBJECT) {
pEntry->Attribute=TABLE_OBJECT;
pEntry->SubAttribute=my.Type-CARD_OBJECT;
}
return TRUE;
}
else return FALSE;
}
}
void CSlfIO::SetObjectReserved(int index,char* pEntry)
{
if(IsWis) return SetWisObjectReserved(index,pEntry);
else return SetSlfObjectReserved(index,pEntry);
}
void CSlfIO::GetObjectEntry(int index,Slf_OBJECT_ENTRY* pEntry)
{
if(IsWis) return GetWisObjectEntry(index,pEntry);
else {
Slf_TABLE_ENTRY my;
GetSlfObjectEntry(index,&my);
memmove((char *)pEntry->Name,my.Name,sizeof(pEntry->Name));
pEntry->Status=my.Status;
if(my.Type==CURVE_OBJECT||my.Type==TDT_OBJECT||my.Type==FMT_OBJECT) {
pEntry->Attribute=CHANNEL_OBJECT;
pEntry->SubAttribute=my.Type;
}
else if(my.Type==CARD_OBJECT) {
pEntry->Attribute=STREAM_OBJECT;
pEntry->SubAttribute=PARA_OBJECT;
}
else if(my.Type>CARD_OBJECT) {
pEntry->Attribute=TABLE_OBJECT;
pEntry->SubAttribute=my.Type-CARD_OBJECT;
}
}
}
void CSlfIO::GetObjectAttribute(int index,short* Attribute, short* SubAttribute)
{
if(IsWis) return GetWisObjectAttribute(index,Attribute,SubAttribute);
else return GetSlfObjectAttribute(index,Attribute,SubAttribute);
}
bool CSlfIO::GetObjectAttribute(const char* name,short* Attribute, short* SubAttribute)
{
if(IsWis) return GetWisObjectAttribute(name,Attribute,SubAttribute);
else return GetSlfObjectAttribute(name,Attribute,SubAttribute);
}
//Channel Operations
int CSlfIO::OpenChannel(const char *name)
{
if(IsWis) return OpenWisChannel(name);
else return OpenSlfChannel(name);
}
int CSlfIO::OpenChannel(const char *namee,short Attribute)
{
if(IsWis) return OpenWisChannel(namee,Attribute);
else return OpenSlfChannel(namee,Attribute);
}
DWORD CSlfIO::ComputerChannelLength(Slf_CHANNEL *pInfo,unsigned char nDimension)
{
return ComputerWisChannelLength(pInfo,nDimension);
}
DWORD CSlfIO::ComputerChannelLength(int index)
{
if(IsWis) return ComputerWisChannelLength(index);
else return ComputerSlfChannelLength(index);
}
int CSlfIO::GetChannelDefaultValue(Slf_CHANNEL* pInfo,unsigned char nDimension,char* buffer,DWORD buflen)
{
return GetWisChannelDefaultValue(pInfo,nDimension,buffer,buflen);
}
bool CSlfIO::SetChannelPointNum(int index, DWORD nPointNum, DWORD samples1,DWORD samples2,DWORD samples3,DWORD samples4)
{
return SetWisChannelPointNum(index,nPointNum,samples1,samples2,samples3,samples4);
}
DWORD CSlfIO::GetChannelPointNum(int index,DWORD samples1,DWORD samples2,DWORD samples3,DWORD samples4)
{
return GetWisChannelPointNum(index,samples1,samples2,samples3,samples4);
}
int CSlfIO::CreateChannel(short SubAttribute,const char *namee,Slf_CHANNEL* pInfo,bool bFailExist)
{
return CreateWisChannel(SubAttribute,namee,pInfo,bFailExist);
}
DWORD CSlfIO::SeekChannel(int index,DWORD samples1,DWORD samples2,DWORD samples3,DWORD samples4)
{
return SeekWisChannel(index,samples1,samples2,samples3,samples4);
}
DWORD CSlfIO::WriteChannel(int index,char* buffer,DWORD num, DWORD samples1,DWORD samples2,DWORD samples3,DWORD samples4)
{
return WriteWisChannel(index,buffer,num,samples1,samples2,samples3,samples4);
}
DWORD CSlfIO::ReadChannel(int index,char* buffer,DWORD num, DWORD samples1,DWORD samples2,DWORD samples3,DWORD samples4)
{
return ReadWisChannel(index,buffer,num,samples1,samples2,samples3,samples4);
}
bool CSlfIO::ExpandChannel(int index, unsigned char nDimension, DWORD nSamples, DWORD nTopSamples)
{
return ExpandWisChannel(index,nDimension,nSamples,nTopSamples);
}
bool CSlfIO::MoveChannel(int index, unsigned char nDimension, DWORD nStart, int nMove, DWORD nTotal)
{
return MoveWisChannel(index,nDimension,nStart,nMove,nTotal);
}
bool CSlfIO::OrderChannel(int index, unsigned char nDimension, int nMethod)
{
return OrderWisChannel(index,nDimension,nMethod);
}
bool CSlfIO::CorrectChannel(int index, unsigned char nDimension, float delta)
{
return CorrectWisChannel(index,nDimension,delta);
}
void CSlfIO::ChannelResamples(int index,float newDelta)
{
if(IsWis) return WisChannelResamples(index,newDelta);
else return SlfTableResamples(index,newDelta);
}
//Table Opeartions
int CSlfIO::OpenTable(const char*namee)
{
if(IsWis) return OpenWisTable(namee);
else return OpenSlfTable(namee);
}
int CSlfIO::CreateTable(short SubAttribute,const char* namee,DWORD length,bool bFailExist)
{
if(IsWis) return CreateWisTable(SubAttribute-CARD_OBJECT,namee,length,bFailExist);
else return CreateSlfTable(SubAttribute,namee,NULL,length,NULL,bFailExist);
}
int CSlfIO::CreateTable(short Attribute,const char* name,const char* hzname,DWORD FieldNum,Slf_OBJECT_FIELD *pField,bool bFailExist)
{
if(IsWis) {
int index=CreateWisTable(Attribute,name,0,bFailExist);
if(index>-1) {
Slf_TABLE_FIELD *pTable_Field=new Slf_TABLE_FIELD[FieldNum+1];
for(int i=0;i<FieldNum;i++) {
strncpy(pTable_Field[i].Name,pField[i].Name,16);
strncpy(pTable_Field[i].HZName,pField[i].HZName,16);
strncpy(pTable_Field[i].Unit,pField[i].Unit,16);
strncpy(pTable_Field[i].HZUnit,pField[i].HZUnit,16);
pTable_Field[i].RepCode=pField[i].RepCode;
pTable_Field[i].Length=pField[i].CodeLength;
pTable_Field[i].Reserved=0;
}
SetWisTableHead(index,0,FieldNum,pTable_Field);
delete pTable_Field;
}
return index;
}
else return CreateSlfTable(Attribute,name,hzname,FieldNum,pField,bFailExist);
}
bool CSlfIO::SeekTable(int index, int OffsetCount, DWORD dwMoveMode)
{
if(IsWis) return SeekWisTable(index,OffsetCount,dwMoveMode);
else return SeekSlfTable(index,OffsetCount,dwMoveMode);
}
int CSlfIO::GetTableRecordCount(int index)
{
if(IsWis) return GetWisTableRecordCount(index);
else return GetSlfTableRecordCount(index);
}
int CSlfIO::GetTableFieldCount(int index)
{
if(IsWis) return GetWisTableFieldCount(index);
else return GetSlfTableFieldCount(index);
}
int CSlfIO::SetTableHead(int index,DWORD RecordCount,DWORD FieldCount,Slf_TABLE_FIELD *FieldInfo)
{
if(IsWis) return SetWisTableHead(index,RecordCount,FieldCount,FieldInfo);
else {
Slf_OBJECT_FIELD *pf=new Slf_OBJECT_FIELD[FieldCount];
QString strMojibake = ""; //乱码判断
QByteArray ArrayMojibake = strMojibake.toLocal8Bit().data();
for(int i=0;i<FieldCount;i++) {
pf[i].ArrayNum=1;
pf[i].CodeLength=FieldInfo[i].Length;
pf[i].RepCode=FieldInfo[i].RepCode;
pf[i].DefVal=-9999.0;
if(strncmp(FieldInfo[i].Unit,ArrayMojibake.data()/*"屯"*/,2)==0) strcpy(FieldInfo[i].Unit,"");
if(strncmp(FieldInfo[i].HZName,ArrayMojibake.data()/*"屯"*/,2)==0) strcpy(FieldInfo[i].HZName,FieldInfo[i].Name);
if(strncmp(FieldInfo[i].HZUnit,ArrayMojibake.data()/*"屯"*/,2)==0) strcpy(FieldInfo[i].HZUnit,FieldInfo[i].Unit);
int len=sizeof(pf[i].Name);
if(len>strlen(FieldInfo[i].Name)) len=strlen(FieldInfo[i].Name);
strncpy(pf[i].Name,FieldInfo[i].Name,len);
pf[i].Name[len]=0;
len=sizeof(pf[i].HZName);
if(len>strlen(FieldInfo[i].HZName)) len=strlen(FieldInfo[i].HZName);
strncpy(pf[i].HZName,FieldInfo[i].HZName,len);
pf[i].HZName[len]=0;
len=sizeof(pf[i].Unit);
if(len>strlen(FieldInfo[i].Unit)) len=strlen(FieldInfo[i].Unit);
strncpy(pf[i].Unit,FieldInfo[i].Unit,len);
pf[i].Unit[len]=0;
len=sizeof(pf[i].HZUnit);
if(len>strlen(FieldInfo[i].HZUnit)) len=strlen(FieldInfo[i].HZUnit);
strncpy(pf[i].HZUnit,FieldInfo[i].HZUnit,len);
pf[i].HZUnit[len]=0;
*(DWORD *)&pf[i].Reserved=FieldInfo[i].Reserved;
pf[i].SamplePoint=1;
pf[i].Rlev=1;
pf[i].Start=1;
pf[i].Vmax=-99999;
pf[i].Vmin=99999;
pf[i].Sequence=0;
}
SetSlfTableHead(index,RecordCount,FieldCount,pf);
delete []pf;
return 1;
}
}
bool CSlfIO::SetTableRecordCount(int index,int Count)
{
if(IsWis) return SetWisTableRecordCount(index,Count);
else return SetSlfTableRecordCount(index,Count);
}
bool CSlfIO::ExpandTable(int index,DWORD BlockNum)
{
if(IsWis) return ExpandWisTable(index,BlockNum);
else return ExpandSlfTable(index,BlockNum);
}
bool CSlfIO::SetTableFieldInfo(int index,Slf_TABLE_FIELD *FieldInfo)
{
if(index<0) return 0;
if(IsWis) return SetWisTableFieldInfo(index,FieldInfo);
else {
int FieldCount=m_SlfObjectEntry[index].FieldNum;
Slf_OBJECT_FIELD *pf=new Slf_OBJECT_FIELD[FieldCount];
GetSlfTableFieldInfo(index,pf);
QString strMojibake = ""; //乱码判断
QByteArray ArrayMojibake = strMojibake.toLocal8Bit().data();
for(int i=0;i<FieldCount;i++) {
int len=strlen(FieldInfo[i].Name);
if(len>sizeof(pf[i].Name)) len=sizeof(pf[i].Name);
strncpy(pf[i].Name,FieldInfo[i].Name,len);
pf[i].Name[len]=0;
if(strncmp(FieldInfo[i].HZName,ArrayMojibake.data()/*"屯"*/,2)==0) strcpy(FieldInfo[i].HZName,FieldInfo[i].Name);
len=strlen(FieldInfo[i].HZName);
if(len>sizeof(pf[i].HZName)) len=sizeof(pf[i].HZName);
strncpy(pf[i].HZName,FieldInfo[i].HZName,sizeof(pf[i].HZName));
pf[i].HZName[len]=0;
if(strncmp(FieldInfo[i].Unit,ArrayMojibake.data()/*"屯"*/,2)==0) strcpy(FieldInfo[i].Unit,"");
len=strlen(FieldInfo[i].Unit);
if(len>sizeof(pf[i].Unit)) len=sizeof(pf[i].Unit);
strncpy(pf[i].Unit,FieldInfo[i].Unit,sizeof(pf[i].Unit));
pf[i].Unit[len]=0;
if(strncmp(FieldInfo[i].HZUnit,ArrayMojibake.data()/*"屯"*/,2)==0) strcpy(FieldInfo[i].HZUnit,FieldInfo[i].Unit);
len=strlen(FieldInfo[i].HZUnit);
if(len>sizeof(pf[i].HZUnit)) len=sizeof(pf[i].HZUnit);
strncpy(pf[i].HZUnit,FieldInfo[i].HZUnit,sizeof(pf[i].HZUnit));
pf[i].HZUnit[len]=0;
}
SetSlfTableFieldInfo(index,pf,FALSE);
delete []pf;
return 1;
}
}
bool CSlfIO::GetTableFieldInfo(int index,Slf_TABLE_FIELD *FieldInfo)
{
memset(FieldInfo,0,sizeof(Slf_TABLE_FIELD));
if(index<0) return 0;
if(IsWis) return GetWisTableFieldInfo(index,FieldInfo);
else {
int FieldCount=m_SlfObjectEntry[index].FieldNum;
Slf_OBJECT_FIELD *pf=new Slf_OBJECT_FIELD[FieldCount];
memset(pf,0,sizeof(Slf_OBJECT_FIELD)*FieldCount);
GetSlfTableFieldInfo(index,pf);
QString strMojibake = ""; //乱码判断
QByteArray ArrayMojibake = strMojibake.toLocal8Bit().data();
for(int i=0;i<FieldCount;i++) {
FieldInfo[i].Length=pf[i].CodeLength;
FieldInfo[i].RepCode=pf[i].RepCode;
strncpy(FieldInfo[i].Name,pf[i].Name,sizeof(FieldInfo[i].Name));
strncpy(FieldInfo[i].HZName,pf[i].HZName,sizeof(FieldInfo[i].HZName));
if(strncmp(FieldInfo[i].HZName,ArrayMojibake.data()/*"屯"*/,2)==0) strcpy(FieldInfo[i].HZName,FieldInfo[i].Name);
if(strncmp(FieldInfo[i].Unit,ArrayMojibake.data()/*"屯"*/,2)==0) strcpy(FieldInfo[i].Unit,"");
strncpy(FieldInfo[i].Unit,pf[i].Unit,sizeof(FieldInfo[i].Unit));
strncpy(FieldInfo[i].HZUnit,pf[i].HZUnit,sizeof(FieldInfo[i].HZUnit));
if(strncmp(FieldInfo[i].HZUnit,ArrayMojibake.data()/*"屯"*/,2)==0) strcpy(FieldInfo[i].HZUnit,FieldInfo[i].Unit);
FieldInfo[i].Reserved=*(DWORD *)&pf[i].Reserved;
}
delete []pf;
return 1;
}
}
int CSlfIO::GetTableRecordLength(int index)
{
if(IsWis) return GetWisTableRecordLength(index);
else return GetSlfTableRecordLength(index);
}
int CSlfIO::ReadTable(int index, int RecNo, void *buffer)
{
if(IsWis) return ReadWisTable(index,RecNo,buffer);
else {
return ReadSlfTable(index, RecNo, buffer,RecNo-1);
}
}
int CSlfIO::WriteTable(int index, int RecNo, void *buffer)
{
if(IsWis) return WriteWisTable(index,RecNo,buffer);
else return WriteSlfTable(index,RecNo,buffer,RecNo-1);
}
//Stream Operations
int CSlfIO::OpenStream(const char* namee)
{
if(IsWis) return OpenWisStream(namee);
else return OpenSlfStream(namee);
}
int CSlfIO::CreateStream(short SubAttribute,const char *namee,DWORD length,bool bFailExist)
{
if(IsWis) return CreateWisStream(SubAttribute,namee,length,bFailExist);
else return CreateSlfStream(SubAttribute,namee,length,bFailExist);
}
bool CSlfIO::SetStreamLength(int index, DWORD length)
{
if(IsWis) return SetWisStreamLength(index,length);
else return SetSlfStreamLength(index,length);
}
bool CSlfIO::ExpandStream(int index, DWORD BlockNum)
{
if(IsWis) return ExpandWisStream(index,BlockNum);
else return ExpandSlfStream(index,BlockNum);
}
bool CSlfIO::SeekStream(int index, int lMove, DWORD dwMoveMode)
{
if(IsWis) return SeekWisStream(index,lMove,dwMoveMode);
else return SeekSlfStream(index,lMove,dwMoveMode);
}
bool CSlfIO::ReadStream(int index, DWORD length, LPDWORD lpBytesRead, char *buffer)
{
if(IsWis) return ReadWisStream(index,length,lpBytesRead,buffer);
else return ReadSlfStream(index,length,lpBytesRead,buffer);
}
bool CSlfIO::WriteStream(int index, DWORD length, LPDWORD lpBytesWrite, const char *buffer)
{
if(IsWis) return WriteWisStream(index,length,lpBytesWrite,buffer);
else return WriteSlfStream(index,length,lpBytesWrite,buffer);
}
DWORD CSlfIO::GetStreamLength(int index)
{
if(IsWis) return GetWisStreamLength(index);
else return GetSlfStreamLength(index);
}
DWORD CSlfIO::GetObjectLength(char *name)
{
if(IsWis) return GetWisObjectLength(name);
else return GetSlfTableLength(name);
}
bool CSlfIO::CopyObjectToMem(Slf_OBJECT_ENTRY *my,char *name,char *buffer,int Len)
{
if(IsWis) return CopyWisObjectToMem(my,name,buffer,Len);
else {
Slf_TABLE_MESSAGE ss;
return CopySlfObjectToMem(&ss,name,buffer,Len);
}
}
bool CSlfIO::CopyFromFile(CSlfIO &Source,char *Name,char *NewObject)
{
if(IsWis) return CopyFromWisFile(Source,Name,NewObject);
else return CopyFromSLFFile(Source,Name,NewObject);
}
bool CSlfIO::CopyFromFile(CSlfIO &Source,char *Name)
{
if(IsWis) return CopyFromWisFile(Source,Name);
else return CopyFromSLFFile(Source,Name);
}
int CSlfIO::OpenSlfTable(int index,short att)
{
if(index<0) return -1;
short Source_Attribute=GetObjectType(index);
if(att!=-1&&Source_Attribute!=att) {
return -1;
}
if(index>-1) {
if(!Slf_Info_Head[index]) {
Slf_Info_Head[index]=new char[sizeof(Slf_TABLE_MESSAGE)];
}
Slf_TABLE_MESSAGE *temp1=(Slf_TABLE_MESSAGE *)Slf_Info_Head[index];
temp1->Table=m_SlfObjectEntry[index];
Slf_OBJECT_FIELD *FieldInfo=new Slf_OBJECT_FIELD[m_SlfObjectEntry[index].FieldNum];
GetSlfTableFieldInfo(index,FieldInfo);
temp1->pField=FieldInfo;
}
return index;
}
int CSlfIO::OpenSlfTable(const char*name,short att)
{
int index=FindSlfObjectIndex(name);
if(index<0) return -1;
return OpenSlfTable(index,att);
}
int CSlfIO::CreateSlfTable(short Attribute,const char* name,const char* hzname,DWORD FieldNum,Slf_OBJECT_FIELD *pField,bool bFailExist)
{
int index=FindSlfObjectIndex(name);
if(index>-1) return index;
index=m_SlfHead.TableNumber;
m_SlfHead.TableNumber++;
WriteSlfHead();
m_SlfObjectEntry[index].RecondNum=1;
int len=strlen(name);
if(len>=64) len=63;
strncpy(m_SlfObjectEntry[index].Name,name,len);
m_SlfObjectEntry[index].Name[len]=0;
if(!hzname) {
strcpy(m_SlfObjectEntry[index].HZName,m_SlfObjectEntry[index].Name);
}
else {
int len=strlen(hzname);
if(len>=64) len=63;
strncpy(m_SlfObjectEntry[index].HZName,hzname,len);
m_SlfObjectEntry[index].HZName[len]=0;
}
m_SlfObjectEntry[index].SerialID=0;// 2 所属系列代码
strcpy(m_SlfObjectEntry[index].DataSource,"create");// 20 数据来源
m_SlfObjectEntry[index].Type=Attribute;// 2 表类型
m_SlfObjectEntry[index].Status=0;// 2 表删除标志
m_SlfObjectEntry[index].FieldNum=FieldNum;// 4 字段个数
m_SlfObjectEntry[index].Position=mFile->size();
m_SlfObjectEntry[index].DataRecord[0].DataPosition=m_SlfObjectEntry[index].Position+sizeof(Slf_OBJECT_FIELD)*m_SlfObjectEntry[index].FieldNum;// 4 原始数据体存储的位置
m_SlfObjectEntry[index].DataRecord[0].DataRecordNum=0;
mFile->resize(m_SlfObjectEntry[index].DataRecord[0].DataPosition);
for(int i=0;i<10;i++) {
m_SlfObjectEntry[index].DataRecord[i+1].DataPosition=0;
m_SlfObjectEntry[index].DataRecord[i+1].DataRecordNum=0;
}
m_SlfObjectEntry[index].IsSave=0;// 2 是否自动备份原始数据
m_SlfObjectEntry[index].ChangeNum=1;// 2 修改次数
/////////////////////////////////////////////
//
Slf_TABLE_History*pHistory=new Slf_TABLE_History[m_SlfObjectEntry[index].ChangeNum];// 76 修改历史信息描述结构变量数组
// m_SlfObjectEntry[index].pSLF_TABLE_History=pHistory;
for(int i=0;i<m_SlfObjectEntry[index].ChangeNum;i++) {
pHistory[i].StartRecord=0;
pHistory[i].EndRecord=0;
pHistory[i].Time=0;
strcpy(pHistory[i].UserName,"ww");
}
delete pHistory;
if(!Slf_Info_Head[index]) Slf_Info_Head[index]=new char[sizeof(Slf_TABLE_MESSAGE)];
WriteSlfObjectEntry(index);
if(pField) {
Slf_OBJECT_FIELD *pFieldInfo=new Slf_OBJECT_FIELD[FieldNum];
memmove(pFieldInfo,pField,sizeof(Slf_OBJECT_FIELD)*FieldNum);
SetSlfTableFieldInfo(index,pFieldInfo);
}
return index;
}
bool CSlfIO:: WriteSlfHistory(int index,Slf_TABLE_History*pHistory)
{
if(index<0) return 0;
unsigned int POS=sizeof(Slf_FILE_HEAD)+index*m_SlfHead.TableMessageLength+sizeof(Slf_TABLE_ENTRY);
if(m_SlfObjectEntry[index].ChangeNum>0) POS+=(m_SlfObjectEntry[index].ChangeNum-1)*sizeof(Slf_TABLE_History);
mFile->seek(POS);//,QFile::begin
for(int i=0;i<m_SlfObjectEntry[index].ChangeNum;i++) {
mFile->write((char *)&pHistory[i],sizeof(Slf_TABLE_History));
}
mFile->flush();
return 1;
}
bool CSlfIO:: CloseSlfTable(int index)
{
if(index<0) return false;
if(Slf_Info_Head[index]) {
Slf_TABLE_MESSAGE *temp1=(Slf_TABLE_MESSAGE *)Slf_Info_Head[index];
delete []temp1->pField;
delete temp1;
Slf_Info_Head[index]=NULL;
}
return 1;
}
bool CSlfIO:: SeekSlfTable(int index, int OffsetCount, DWORD dwMoveMode)
{
return 1;
}
int CSlfIO:: GetSlfTableRecordCount(int index)
{
int rec=0;
for(int i=0;i<m_SlfObjectEntry[index].RecondNum;i++) {
rec+=m_SlfObjectEntry[index].DataRecord[i].DataRecordNum;
}
return rec;
}
int CSlfIO:: SetSlfTableHead(int index,DWORD REC,DWORD FieldNum,Slf_OBJECT_FIELD *field)
{
if(index<0) return 0;
if(!field) return 0;
m_SlfObjectEntry[index].FieldNum=FieldNum;
if(m_SlfHead.TableNumber<=0) {
mFile->resize(sizeof(Slf_FILE_HEAD)+m_SlfHead.MaxTableNumber*m_SlfHead.TableMessageLength);
m_SlfHead.TableNumber++;
WriteSlfHead();
}
unsigned int pos=mFile->size();
m_SlfObjectEntry[index].RecondNum=(REC>0?1:0);
m_SlfObjectEntry[index].Position=pos;
m_SlfObjectEntry[index].DataRecord[0].DataPosition=pos+FieldNum*sizeof(Slf_OBJECT_FIELD);
m_SlfObjectEntry[index].DataRecord[0].DataRecordNum=REC;
WriteSlfObjectEntry(index);
Slf_OBJECT_FIELD *pFieldInfo=new Slf_OBJECT_FIELD[FieldNum];
memmove(pFieldInfo,field,sizeof(Slf_OBJECT_FIELD)*FieldNum);
SetSlfTableFieldInfo(index,pFieldInfo);
pos=m_SlfObjectEntry[index].DataRecord[0].DataPosition+GetSlfTableRecordLength(index,field)*REC;
mFile->resize(pos);
mFile->flush();
return m_SlfHead.TableNumber;
}
bool CSlfIO:: SetSlfTableRecordCount(int index,int Count)
{
if(index<0) return 0;
int leng=GetSlfTableLength(index);
int rec=GetSlfTableRecordCount(index);
int reclen=GetSlfTableRecordLength(index);
int len=0;
if(rec>Count) {
len=rec;
}
else len=Count;
unsigned long long lenn=len*reclen;
char *buf=new char[lenn+1];
memset(buf,0,lenn);
if(leng) {
ReadSlfTable(index,rec,buf);
DiscardSlfObjectData(index,false);
}
WriteSlfTable(index,Count,buf);
delete buf;
return 1;
}
bool CSlfIO:: ExpandSlfTable(int index,int RecNum)
{
if(m_SlfObjectEntry[index].RecondNum>10)
{
int rec=GetSlfTableRecordCount(index);
SetSlfTableRecordCount(index,rec);
}
if(RecNum<0) {
Slf_OBJECT_FIELD *FieldInfo=new Slf_OBJECT_FIELD[m_SlfObjectEntry[index].FieldNum];
GetSlfTableFieldInfo(index,FieldInfo);
int reclen=GetSlfTableRecordLength(index,FieldInfo);
for(int i=m_SlfObjectEntry[index].RecondNum;i>0;i--) {
m_SlfObjectEntry[index].DataRecord[i].DataPosition=m_SlfObjectEntry[index].DataRecord[i-1].DataPosition;
m_SlfObjectEntry[index].DataRecord[i].DataRecordNum=m_SlfObjectEntry[index].DataRecord[i-1].DataRecordNum;
}
m_SlfObjectEntry[index].DataRecord[0].DataPosition=mFile->size();
m_SlfObjectEntry[index].DataRecord[0].DataRecordNum=-RecNum;
mFile->resize(m_SlfObjectEntry[index].DataRecord[0].DataPosition+m_SlfObjectEntry[index].DataRecord[0].DataRecordNum*reclen);
m_SlfObjectEntry[index].RecondNum++;
FieldInfo[0].Start+=RecNum*FieldInfo[0].Rlev;
SetSlfTableFieldInfo(index,FieldInfo);
delete FieldInfo;
WriteSlfObjectEntry(index);
}
else {
int reclen=GetSlfTableRecordLength(index);
m_SlfObjectEntry[index].DataRecord[m_SlfObjectEntry[index].RecondNum].DataRecordNum=RecNum;
m_SlfObjectEntry[index].DataRecord[m_SlfObjectEntry[index].RecondNum].DataPosition=mFile->size();
mFile->resize(m_SlfObjectEntry[index].DataRecord[m_SlfObjectEntry[index].RecondNum].DataPosition+reclen*RecNum);
m_SlfObjectEntry[index].RecondNum++;
WriteSlfObjectEntry(index);
}
return 1;
}
int CSlfIO:: GetSlfTableFieldCount(int index)
{
if(index<0) return 0;
if(!m_SlfObjectEntry) return 0;
return m_SlfObjectEntry[index].FieldNum;
}
Slf_OBJECT_FIELD * CSlfIO:: GetSlfTableFieldInfo(int index)
{
Slf_OBJECT_FIELD *FieldInfo=NULL;
if(index<0) return NULL;
if(!Slf_Info_Head[index]){
Slf_Info_Head[index]=new char[sizeof(Slf_TABLE_MESSAGE)];
Slf_TABLE_MESSAGE *temp1=(Slf_TABLE_MESSAGE *)Slf_Info_Head[index];
FieldInfo=new Slf_OBJECT_FIELD[m_SlfObjectEntry[index].FieldNum];
GetSlfTableFieldInfo(index,FieldInfo);
temp1->pField=FieldInfo;
}
else {
Slf_TABLE_MESSAGE *temp1=(Slf_TABLE_MESSAGE *)Slf_Info_Head[index];
FieldInfo=temp1->pField;
}
return FieldInfo;
}
bool CSlfIO:: GetSlfTableFieldInfo(int index,Slf_OBJECT_FIELD *FieldInfo)
{
if(index<0) return 0;
if(!FieldInfo) return 0;
mFile->seek(m_SlfObjectEntry[index].Position);//,QFile::begin
for(int i=0;i<m_SlfObjectEntry[index].FieldNum;i++) {
mFile->read((char *)&FieldInfo[i],sizeof(Slf_OBJECT_FIELD));
}
return 1;
}
bool CSlfIO:: SetSlfTableFieldInfo(int index,Slf_OBJECT_FIELD *FieldInfo,bool SetNewFieldInfo)
{
if(index<0) return 0;
if(!FieldInfo) return 0;
mFile->seek(m_SlfObjectEntry[index].Position);//,QFile::begin
for(int i=0;i<m_SlfObjectEntry[index].FieldNum;i++) {
mFile->write((char *)&FieldInfo[i],sizeof(Slf_OBJECT_FIELD));
}
mFile->flush();
if(Slf_Info_Head[index]&&SetNewFieldInfo)
{
Slf_TABLE_MESSAGE *temp1=(Slf_TABLE_MESSAGE *)Slf_Info_Head[index];
temp1->pField=FieldInfo;
}
return 1;
}
int CSlfIO:: GetSlfTableRecordLength(int index,Slf_OBJECT_FIELD *FieldInfo)
{
if(index<0) return 0;
int reclen=0;
int Flag=0;
if(!FieldInfo) {
if(!Slf_Info_Head[index]){
if(m_SlfObjectEntry[index].FieldNum<0||m_SlfObjectEntry[index].FieldNum>1024) return 0;
FieldInfo=new Slf_OBJECT_FIELD[m_SlfObjectEntry[index].FieldNum];
GetSlfTableFieldInfo(index,FieldInfo);
Flag=1;
}
else {
Slf_TABLE_MESSAGE *temp1=(Slf_TABLE_MESSAGE *)Slf_Info_Head[index];
FieldInfo=temp1->pField;
}
}
for(int i=0;i<m_SlfObjectEntry[index].FieldNum;i++)
{
if(FieldInfo[i].Sequence) continue;
reclen+=FieldInfo[i].ArrayNum*FieldInfo[i].CodeLength*FieldInfo[i].SamplePoint;
}
if(Flag) delete []FieldInfo;
return reclen;
}
int CSlfIO:: GetSlfTableFieldOffset(int index,int FieldNo,Slf_OBJECT_FIELD *FieldInfo)
{
int reclen=0;
int Flag=0;
if(!FieldInfo) {
if(!Slf_Info_Head[index]){
FieldInfo=new Slf_OBJECT_FIELD[m_SlfObjectEntry[index].FieldNum];
GetSlfTableFieldInfo(index,FieldInfo);
Flag=1;
}
else {
Slf_TABLE_MESSAGE *temp1=(Slf_TABLE_MESSAGE *)Slf_Info_Head[index];
FieldInfo=temp1->pField;
}
}
for(int i=0;i<FieldNo;i++) {
if(FieldInfo[i].Sequence) continue;
reclen+=FieldInfo[i].ArrayNum*FieldInfo[i].CodeLength*FieldInfo[i].SamplePoint;
}
if(Flag) delete []FieldInfo;
return reclen;
}
int CSlfIO:: ReadSlfTable(int index, int RecNum, void *buffer,int FirstRec)
{
int i=0;
if(RecNum<=0) {
RecNum=0;
for(i=0;i<m_SlfObjectEntry[index].RecondNum;i++) {
RecNum+=m_SlfObjectEntry[index].DataRecord[i].DataRecordNum;
}
}
if(!buffer) return RecNum;
if(FirstRec<0) {
RecNum-=FirstRec;
FirstRec=-FirstRec;
}
unsigned int point;
int reclen=GetSlfTableRecordLength(index);
int len=0,pos=0;
int rec=0,rec1=0,rec2=0,rec3=0;
for(int i=0;i<m_SlfObjectEntry[index].RecondNum;i++) {
rec1=rec;
rec3=rec;
rec+=m_SlfObjectEntry[index].DataRecord[i].DataRecordNum;
rec2=rec;
if(rec<FirstRec) {
continue;
}
if(rec1<FirstRec) rec1=FirstRec;
if(rec>RecNum) {
rec=RecNum;
}
point=m_SlfObjectEntry[index].DataRecord[i].DataPosition+(rec1-rec3)*reclen;
mFile->seek(point);//,QFile::begin
char *buff=(char *)buffer;
len=(rec-rec1)*reclen;
mFile->read((char *)&buff[pos],len);
pos+=len;
if(rec2>RecNum) break;
}
return RecNum-FirstRec;
}
int CSlfIO:: DeleteSlfTableRecord(int index,int RecNum,int FirstRec)
{
unsigned int len=GetSlfTableLength(index);
int reclen=GetSlfTableRecordLength(index);
int rec=GetSlfTableRecordCount(index);
char *buff=new char[len+1];
ReadSlfTable(index,rec,buff);
SetSlfTableRecordCount(index,rec-(RecNum-FirstRec));
memmove(&buff[FirstRec*reclen],&buff[RecNum*reclen],(rec-RecNum)*reclen);
WriteSlfTable(index,rec-(RecNum-FirstRec),buff);
delete []buff;
return 1;
}
int CSlfIO:: ReadSlfTableFieldData(int index,int FieldNo,int RecNo,void *buffer,int FirstRec,int Count)
{
if(index<0) return 0;
Slf_OBJECT_FIELD *FieldInfo=GetSlfTableFieldInfo(index);
unsigned int point,pos=0;
int reclen=GetSlfTableRecordLength(index,FieldInfo);
int recpos=GetSlfTableFieldOffset(index,FieldNo,FieldInfo);
int len=FieldInfo[FieldNo].CodeLength*FieldInfo[FieldNo].SamplePoint*FieldInfo[FieldNo].ArrayNum,rec=0;
if(Count) len=Count*FieldInfo[FieldNo].CodeLength;
for(int i=0;i<m_SlfObjectEntry[index].RecondNum;i++) {
for(int j=0;j<m_SlfObjectEntry[index].DataRecord[i].DataRecordNum;j++) {
if(rec>=FirstRec&&rec<RecNo) {
point=m_SlfObjectEntry[index].DataRecord[i].DataPosition+j*reclen+recpos;
mFile->seek(point);
char *buff=(char *)buffer;
mFile->read((char *)&buff[pos],len);
pos+=len;
}
rec++;
}
}
return RecNo-FirstRec;
}
int CSlfIO:: FindSlfFieldNo(int index,char *FieldName)
{
if(index<0) return -1;
Slf_OBJECT_FIELD *FieldInfo=GetSlfTableFieldInfo(index);
for(int i=0;i<m_SlfObjectEntry[index].FieldNum;i++) {
if(stricmp(FieldInfo[i].Name,FieldName)==0||stricmp(FieldInfo[i].HZName,FieldName)==0) {
return i;
}
}
return -1;
}
int CSlfIO:: WriteSlfTableFieldData(int index,int FieldNo,int RecNum,void *buffer,int FirstRec,int Count)
{
if(index<0) return 0;
int ma=GetSlfTableRecordCount(index);
if(RecNum>ma) SetSlfTableRecordCount(index,RecNum);
Slf_OBJECT_FIELD *FieldInfo=GetSlfTableFieldInfo(index);
unsigned int point,pos=0;
int reclen=GetSlfTableRecordLength(index,FieldInfo);
int recpos=GetSlfTableFieldOffset(index,FieldNo,FieldInfo);
int len=FieldInfo[FieldNo].CodeLength*FieldInfo[FieldNo].SamplePoint*FieldInfo[FieldNo].ArrayNum,rec=0;
if(Count) len=Count*FieldInfo[FieldNo].CodeLength;
for(int i=0;i<m_SlfObjectEntry[index].RecondNum;i++) {
for(int j=0;j<m_SlfObjectEntry[index].DataRecord[i].DataRecordNum;j++) {
if(rec>RecNum) break;
if(rec>=FirstRec&&rec<RecNum) {
point=m_SlfObjectEntry[index].DataRecord[i].DataPosition+j*reclen+recpos;
mFile->seek(point);//QFile::begin
char *buff=(char *)buffer;
mFile->write((char *)&buff[pos],len);
pos+=len;
}
rec++;
}
}
mFile->flush();
return RecNum-FirstRec;
}
int CSlfIO:: WriteSlfTable(int index, int EndRec, void *buffer,int FirstRec)
{
if(!buffer) return 0;
int reclen=GetSlfTableRecordLength(index);
if(FirstRec<0) {
if(m_SlfObjectEntry[index].RecondNum>10) {
int rec=GetSlfTableRecordCount(index);
SetSlfTableRecordCount(index,rec);
}
Slf_OBJECT_FIELD *FieldInfo=GetSlfTableFieldInfo(index);
for(int i=m_SlfObjectEntry[index].RecondNum;i>0;i--) {
m_SlfObjectEntry[index].DataRecord[i].DataPosition=m_SlfObjectEntry[index].DataRecord[i-1].DataPosition;
m_SlfObjectEntry[index].DataRecord[i].DataRecordNum=m_SlfObjectEntry[index].DataRecord[i-1].DataRecordNum;
}
m_SlfObjectEntry[index].DataRecord[0].DataPosition=mFile->size();
m_SlfObjectEntry[index].DataRecord[0].DataRecordNum=-FirstRec;
mFile->resize(m_SlfObjectEntry[index].DataRecord[0].DataPosition+m_SlfObjectEntry[index].DataRecord[0].DataRecordNum*reclen);//,CFile::begin);
m_SlfObjectEntry[index].RecondNum++;
WriteSlfObjectEntry(index);
FieldInfo[0].Start+=FirstRec*FieldInfo[0].Rlev;
SetSlfTableFieldInfo(index,FieldInfo);
EndRec=EndRec-FirstRec;
FirstRec=0;
}
int rec=GetSlfTableRecordCount(index);
if(EndRec>rec) {
if(m_SlfObjectEntry[index].RecondNum>10) {
SetSlfTableRecordCount(index,rec);
}
if(rec<=0) m_SlfObjectEntry[index].RecondNum=0;
m_SlfObjectEntry[index].DataRecord[m_SlfObjectEntry[index].RecondNum].DataPosition=mFile->size();
m_SlfObjectEntry[index].DataRecord[m_SlfObjectEntry[index].RecondNum].DataRecordNum=EndRec-rec;
mFile->resize(m_SlfObjectEntry[index].DataRecord[m_SlfObjectEntry[index].RecondNum].DataPosition+m_SlfObjectEntry[index].DataRecord[m_SlfObjectEntry[index].RecondNum].DataRecordNum*reclen);//,CFile::begin);
m_SlfObjectEntry[index].RecondNum++;
WriteSlfObjectEntry(index);
}
unsigned int point;
int len=0,pos=0;
rec=0;
int rec1=0,rec2=0,rec3=0;
for(int i=0;i<m_SlfObjectEntry[index].RecondNum;i++) {
rec1=rec;
rec3=rec;
rec+=m_SlfObjectEntry[index].DataRecord[i].DataRecordNum;
rec2=rec;
if(rec<FirstRec) {
continue;
}
if(rec1<FirstRec) rec1=FirstRec;
if(rec>EndRec) {
rec=EndRec;
}
len=(rec-rec1)*reclen;
point=m_SlfObjectEntry[index].DataRecord[i].DataPosition+(rec1-rec3)*reclen;
mFile->seek(point);//,QFile::begin
char *buff=(char *)buffer;
mFile->write((char *)&buff[pos],len);
pos+=len;
if(rec2>EndRec) break;
}
mFile->flush();
return EndRec-FirstRec;
}
void CSlfIO:: InitSlf(int BlockLen,int MaxObjectNumber, int MachineType)
{
/////////////////////////////////////
// set head
memset(&m_SlfHead,0,sizeof(Slf_HEAD));
strcpy(m_SlfHead.Version,"Slf 3.1");
m_SlfHead.BinaryType=MachineType;// 4 二进制数据标准
m_SlfHead.TableNumber=0;// 4 已存储表个数
m_SlfHead.MaxTableNumber=MaxObjectNumber;// 4 预留最大表个数
// m_SlfHead.FileSize;// 4 文件大小
m_SlfHead.TableMessageLength=BlockLen;// 4 表基本信息长度
struct tm *newtime;
time_t ltime;
char buff[80];
time( &ltime );
// Obtain coordinated universal time:
m_SlfHead.TimeCreate = (__time32_t)ltime ; // C4996
// Note: _gmtime64 is deprecated; consider using _gmtime64_s
strcpy(m_SlfHead.WellMessage.Reserved,"WANGWEI");
if(!Slf_Info_Head) Slf_Info_Head=new char *[m_SlfHead.MaxTableNumber];
for(int i=0;i<m_SlfHead.MaxTableNumber;i++) Slf_Info_Head[i]=NULL;
if(!m_SlfObjectEntry)m_SlfObjectEntry=new Slf_TABLE_ENTRY[m_SlfHead.MaxTableNumber];
memset(m_SlfObjectEntry,0,sizeof(Slf_TABLE_ENTRY)*m_SlfHead.MaxTableNumber);
WriteSlfHead();
WriteSlfObjectEntry();
}
void CSlfIO:: SetSlfMessage(Slf_FILE_MESSAGE mssage)
{
memmove(&m_SlfHead.WellMessage,&mssage,sizeof(Slf_FILE_MESSAGE));
/*
m_SlfHead.WellMessage.Kelly=ConvertDataByString(QString::number(m_SlfHead.WellMessage.Kelly));
m_SlfHead.WellMessage.Bit_Diameter[0]=ConvertDataByString(QString::number(m_SlfHead.WellMessage.Bit_Diameter[0]));
m_SlfHead.WellMessage.Bit_Depth[0]=ConvertDataByString(QString::number(m_SlfHead.WellMessage.Bit_Depth[0] ));
m_SlfHead.WellMessage.Bit_Diameter[1]=ConvertDataByString(QString::number(m_SlfHead.WellMessage.Bit_Diameter[1] ));
m_SlfHead.WellMessage.Bit_Depth[1]=ConvertDataByString(QString::number(m_SlfHead.WellMessage.Bit_Depth[1] ));
m_SlfHead.WellMessage.Bit_Diameter[2]=ConvertDataByString(QString::number(m_SlfHead.WellMessage.Bit_Diameter[2]));
m_SlfHead.WellMessage.Bit_Depth[2]=ConvertDataByString(QString::number(m_SlfHead.WellMessage.Bit_Depth[2] ));
m_SlfHead.WellMessage.Bit_Diameter[3]=ConvertDataByString(QString::number(m_SlfHead.WellMessage.Bit_Diameter[3]));
m_SlfHead.WellMessage.Bit_Depth[3]=ConvertDataByString(QString::number(m_SlfHead.WellMessage.Bit_Depth[3] ));
m_SlfHead.WellMessage.Bushing_Inside_Diameter[0]=ConvertDataByString(QString::number(m_SlfHead.WellMessage.Bushing_Inside_Diameter[0]) );
m_SlfHead.WellMessage.Bushing_Detpth[0]=ConvertDataByString(QString::number(m_SlfHead.WellMessage.Bushing_Detpth[0]));
m_SlfHead.WellMessage.Bushing_Inside_Diameter[1]=ConvertDataByString(QString::number(m_SlfHead.WellMessage.Bushing_Inside_Diameter[1]) );
m_SlfHead.WellMessage.Bushing_Detpth[1]=ConvertDataByString(QString::number(m_SlfHead.WellMessage.Bushing_Detpth[1]));
m_SlfHead.WellMessage.Bushing_Inside_Diameter[2]=(ConvertDataByString(QString::number(m_SlfHead.WellMessage.Bushing_Inside_Diameter[2]) ));
m_SlfHead.WellMessage.Bushing_Detpth[2]=ConvertDataByString(QString::number(m_SlfHead.WellMessage.Bushing_Detpth[2]));
m_SlfHead.WellMessage.Bushing_Outside_Diameter[0]=(ConvertDataByString(QString::number(m_SlfHead.WellMessage.Bushing_Outside_Diameter[0])));
m_SlfHead.WellMessage.Bushing_Outside_Diameter[1]=(ConvertDataByString(QString::number(m_SlfHead.WellMessage.Bushing_Outside_Diameter[1])));
m_SlfHead.WellMessage.Bushing_Outside_Diameter[2]=ConvertDataByString(QString::number(m_SlfHead.WellMessage.Bushing_Outside_Diameter[2]));
*/
WriteSlfHead();
}
void CSlfIO:: GetSlfMessage(Slf_FILE_MESSAGE &mssage)
{
if(strstr(m_SlfHead.Version,"Slf 3.0")) {
if(m_SlfHead.WellMessage.Xcoor==0&&m_SlfHead.WellMessage.Ycoor==0) {
// m_SlfHead.WellMessage.Xcoor=m_SlfHead.WellMessage.Xcoor1;
// m_SlfHead.WellMessage.Ycoor=m_SlfHead.WellMessage.Ycoor1;
}
}
memmove(mssage.AreaName,&m_SlfHead.WellMessage,sizeof(Slf_FILE_MESSAGE));
/*
mssage.Kelly=ConvertDataByFloat(mssage.Kelly).toFloat();
mssage.Bit_Diameter[0]=ConvertDataByFloat(mssage.Bit_Diameter[0] ).toFloat();
mssage.Bit_Depth[0]=ConvertDataByFloat(mssage.Bit_Depth[0] ).toFloat();
mssage.Bit_Diameter[1]=ConvertDataByFloat(mssage.Bit_Diameter[1] ).toFloat();
mssage.Bit_Depth[1]=ConvertDataByFloat(mssage.Bit_Depth[1] ).toFloat();
mssage.Bit_Diameter[2]=ConvertDataByFloat(mssage.Bit_Diameter[2]).toFloat();
mssage.Bit_Depth[2]=ConvertDataByFloat(mssage.Bit_Depth[2] ).toFloat();
mssage.Bit_Diameter[3]=ConvertDataByFloat(mssage.Bit_Diameter[3]).toFloat();
mssage.Bit_Depth[3]=ConvertDataByFloat(mssage.Bit_Depth[3] ).toFloat();
mssage.Bushing_Inside_Diameter[0]=ConvertDataByFloat(mssage.Bushing_Inside_Diameter[0] ).toFloat();
mssage.Bushing_Detpth[0]=ConvertDataByFloat(mssage.Bushing_Detpth[0]).toFloat();
mssage.Bushing_Inside_Diameter[1]=ConvertDataByFloat(mssage.Bushing_Inside_Diameter[1] ).toFloat();
mssage.Bushing_Detpth[1]=ConvertDataByFloat(mssage.Bushing_Detpth[1]).toFloat();
mssage.Bushing_Inside_Diameter[2]=(ConvertDataByFloat(mssage.Bushing_Inside_Diameter[2] )).toFloat();
mssage.Bushing_Detpth[2]=ConvertDataByFloat(mssage.Bushing_Detpth[2]).toFloat();
mssage.Bushing_Outside_Diameter[0]=(ConvertDataByFloat(mssage.Bushing_Outside_Diameter[0] )).toFloat();
mssage.Bushing_Outside_Diameter[1]=(ConvertDataByFloat(mssage.Bushing_Outside_Diameter[1] )).toFloat();
mssage.Bushing_Outside_Diameter[2]=ConvertDataByFloat(mssage.Bushing_Outside_Diameter[2] ).toFloat();
*/
}
int CSlfIO:: ReadSlfHead()
{
mFile->seek(0);
int len=sizeof(Slf_FILE_HEAD);
mFile->read((char *)&m_SlfHead,len);
return 1;
}
int CSlfIO:: WriteSlfHead()
{
mFile->seek(0);
if(m_SlfHead.MaxTableNumber<=0) {
AfxMessageBox("文件头错误!");
return 0;
}
mFile->write((char *)&m_SlfHead,sizeof(Slf_FILE_HEAD));
mFile->flush();
return 1;
}
int CSlfIO:: ReadSlfObjectEntry()
{
for(int i=0;i<m_SlfHead.TableNumber;i++) {
int a=sizeof(Slf_TABLE_ENTRY);
int x=mFile->pos();
mFile->seek(sizeof(Slf_FILE_HEAD)+i*m_SlfHead.TableMessageLength);
mFile->read((char *)&m_SlfObjectEntry[i],sizeof(Slf_TABLE_ENTRY));
}
return -1;
}
int CSlfIO:: WriteSlfObjectEntry()
{
for(int i=0;i<m_SlfHead.TableNumber;i++) {
WriteSlfObjectEntry(i);
}
return 1;
}
bool CSlfIO:: OpenSlf(const char* LogName,unsigned int nOpenFlags,int BlockLen,int MaxObjectNumber, int MachineType)
{
strcpy(m_LogFileName,LogName);
return OpenSlf(nOpenFlags,BlockLen,MaxObjectNumber,MachineType);
}
bool CSlfIO::OpenSlf(unsigned int nOpenFlags,int BlockLen,int MaxObjectNumber, int MachineType)
{
IsWis=false;
if(nOpenFlags==modeCreate)
{
mFile=new QFile(m_LogFileName);
mFile->open(QIODevice::ReadWrite);
InitSlf(BlockLen, MaxObjectNumber, MachineType);
mFile->flush();
mFile->resize(sizeof(Slf_FILE_HEAD)+m_SlfHead.MaxTableNumber*m_SlfHead.TableMessageLength);//,CFile::begin);
return TRUE;
}
else {
QFile f;
if(f.exists(m_LogFileName)) {
mFile=new QFile(m_LogFileName);
mFile->open(QIODevice::ReadWrite);
ReadSlfHead();
/* if(m_SlfHead.MaxTableNumber<=0) {
m_SlfHead.MaxTableNumber=1024;
m_SlfHead.TableMessageLength=1024;
m_SlfHead.TableNumber=1024;
}
*/
if(m_SlfHead.MaxTableNumber<=0) {
InitSlf(BlockLen, MaxObjectNumber, MachineType);
mFile->flush();
mFile->resize(sizeof(Slf_FILE_HEAD)+m_SlfHead.MaxTableNumber*m_SlfHead.TableMessageLength);//,CFile::begin);
return true;
}
Slf_Info_Head=new char *[m_SlfHead.MaxTableNumber];
for(int i=0;i<m_SlfHead.MaxTableNumber;i++) Slf_Info_Head[i]=NULL;
m_SlfObjectEntry=new Slf_TABLE_ENTRY[m_SlfHead.MaxTableNumber];
memset(m_SlfObjectEntry,0,sizeof(Slf_TABLE_ENTRY)*m_SlfHead.MaxTableNumber);
ReadSlfObjectEntry();
for(int i=0;i<m_SlfHead.TableNumber;i++)
{
strupr(m_SlfObjectEntry[i].Name);
/* if(strlen(m_SlfObjectEntry[i].Name)==0)
{
int a=1;
m_SlfHead.TableNumber=i;
strcpy(m_SlfHead.Version,"Slf 3.1");
WriteSlfHead();
break;
}
*/
}
}
else {
mFile=new QFile(m_LogFileName);
mFile->open(QIODevice::ReadWrite);
InitSlf(BlockLen, MaxObjectNumber, MachineType);
mFile->flush();
mFile->resize(sizeof(Slf_FILE_HEAD)+m_SlfHead.MaxTableNumber*m_SlfHead.TableMessageLength);//,CFile::begin);
}
return TRUE;
}
return FALSE;
}
void CSlfIO:: GetSlfHead(Slf_FILE_HEAD* pHead)
{
*pHead=m_SlfHead;
// return -1;
}
DWORD CSlfIO::GetSlfTableLength(char *name)//长度
{
int index=FindSlfObjectIndex(name);
if(index>-1) return GetSlfTableLength(index);
else return 0;
}
DWORD CSlfIO::GetSlfTableLength(int index)//长度
{
if(index<0) return 0;
int rec=0;
int reclen=GetSlfTableRecordLength(index);
for(int i=0;i<m_SlfObjectEntry[index].RecondNum;i++) {
rec+=m_SlfObjectEntry[index].DataRecord[i].DataRecordNum;
}
return rec*reclen;//+sizeof(Slf_OBJECT_FIELD)*m_SlfObjectEntry[index].FieldNum;
}
//Object Operations
int CSlfIO::FindSlfObjectIndex(const char* namee,int status)
{
if(!m_SlfObjectEntry) return -1;
char name[128];
strcpy(name,namee);
for(int i=0;i<m_SlfHead.TableNumber;i++) {
if(stricmp(name,m_SlfObjectEntry[i].Name)==0||stricmp(name,m_SlfObjectEntry[i].HZName)==0) {
if(status==-1) return i;
if(status==m_SlfObjectEntry[i].Status) return i;
}
}
return -1;
}
int CSlfIO:: FindSlfObjectName(char* name,short Attribute, short SubAttribute, int status,int otype)
{
for(int i=0;i<m_SlfHead.TableNumber;i++)
{
if(stricmp(name,m_SlfObjectEntry[i].Name)==0||stricmp(name,m_SlfObjectEntry[i].HZName)==0)
{
if(Attribute>-1)
{
if(m_SlfObjectEntry[i].Type==Attribute)
{
if(SubAttribute>-1)
{
if(m_SlfObjectEntry[i].Type==SubAttribute)
{
if(status>-1)
{
if(otype>-1) {
if(m_SlfObjectEntry[i].Status>=status) return i;
}
else if(m_SlfObjectEntry[i].Status==status) return i;
continue;//else return -1;
}
else return i;
}
continue;//else return -1;
}
else if(status>-1)
{
if(otype>-1) {
if(m_SlfObjectEntry[i].Status>=status) return i;
}
else if(m_SlfObjectEntry[i].Status==status) return i;
continue;//else return -1;
}
else return i;
}
else if(otype>-1) {
if(m_SlfObjectEntry[i].Type>=Attribute) return i;
}
continue;//else return -1;
}
else if(SubAttribute>-1)
{
if(m_SlfObjectEntry[i].Type==SubAttribute)
{
if(status>-1)
{
if(m_SlfObjectEntry[i].Status==status) return i;
continue;//else return -1;
}
else return i;
}
continue;//else return -1;
}
else if(status>-1)
{
if(m_SlfObjectEntry[i].Status==status) return i;
continue;//else return -1;
}
else return i;
}
}
return -1;
}
bool CSlfIO:: DeleteSlfObject(const char* name)
{
int index=FindSlfObjectIndex(name);
if(index<0) return 0;
m_SlfObjectEntry[index].Status=OBJECT_DELETE;
WriteSlfObjectEntry(index);
return 1;
}
bool CSlfIO:: WriteSlfObjectEntry(int index,Slf_TABLE_ENTRY *obj)
{
if(index<0) return 0;
mFile->seek(sizeof(Slf_FILE_HEAD)+index*m_SlfHead.TableMessageLength);//,QFile::begin
if(obj)
{
mFile->write((char *)obj,sizeof(Slf_TABLE_ENTRY));
memmove(&m_SlfObjectEntry[index],obj,sizeof(Slf_TABLE_ENTRY));
}
else mFile->write((char *)&m_SlfObjectEntry[index],sizeof(Slf_TABLE_ENTRY));
if(Slf_Info_Head[index]) {
Slf_TABLE_MESSAGE *temp1=(Slf_TABLE_MESSAGE *)Slf_Info_Head[index];
temp1->Table=m_SlfObjectEntry[index];
}
mFile->flush();
return 1;
}
bool CSlfIO:: DiscardSlfObject(const char* name)
{
int index=FindSlfObjectIndex(name,-1);
if(index<0) return false;
return DiscardSlfObject(index);
}
bool CSlfIO:: DiscardSlfObjectData(int index,bool DeleteField)
{
if(index<0) return 0;
int dlen=0;
int reclen=GetSlfTableRecordLength(index);
for(int i=0;i<m_SlfObjectEntry[index].RecondNum;i++) {
DWORD point,point1;
point1=m_SlfObjectEntry[index].DataRecord[i].DataPosition;
point =point1+m_SlfObjectEntry[index].DataRecord[i].DataRecordNum*reclen;
unsigned int len=mFile->size();
dlen=m_SlfObjectEntry[index].DataRecord[i].DataRecordNum*reclen;
if(len<point)
{
break;
}
DWORD size=len-point;
while((int)size<0)
{
size/=2;
}
int le=size;
char *buffer=new char[size+1];
while(point<len){
if(point+le>len)
{
le=len-point;
}
mFile->seek(point);
mFile->read(buffer,le);
mFile->seek(point1);
mFile->write(buffer,le);
point+=le;
point1+=le;
}
mFile->flush();
delete []buffer;
mFile->resize(len-dlen);
for(int k=0;k<m_SlfHead.TableNumber;k++) {
if(m_SlfObjectEntry[k].Position>m_SlfObjectEntry[index].DataRecord[i].DataPosition)
{
m_SlfObjectEntry[k].Position-=dlen;
}
for(int j=0;j<m_SlfObjectEntry[k].RecondNum;j++)
{
if(m_SlfObjectEntry[k].DataRecord[j].DataPosition>m_SlfObjectEntry[index].DataRecord[i].DataPosition)
{
m_SlfObjectEntry[k].DataRecord[j].DataPosition-=dlen;
}
}
}
}
if(DeleteField){
DWORD point,point1;
point1=m_SlfObjectEntry[index].Position;
point =point1+sizeof(Slf_OBJECT_FIELD)*m_SlfObjectEntry[index].FieldNum;
unsigned int len=mFile->size();
DWORD size=len-point;
while((int)size<0)
{
size/=2;
}
int le=size;
char *buffer=new char[size+1];
while(point<len){
if(point+le>len)
{
le=len-point;
}
mFile->seek(point);
mFile->read(buffer,le);
mFile->seek(point1);
mFile->write(buffer,le);
point+=le;
point1+=le;
}
mFile->flush();
delete []buffer;
mFile->resize(len-sizeof(Slf_OBJECT_FIELD)*m_SlfObjectEntry[index].FieldNum);
dlen=sizeof(Slf_OBJECT_FIELD)*m_SlfObjectEntry[index].FieldNum;
for(int k=0;k<m_SlfHead.TableNumber;k++) {
if(m_SlfObjectEntry[k].Position>m_SlfObjectEntry[index].Position)
{
m_SlfObjectEntry[k].Position-=dlen;
}
for(int j=0;j<m_SlfObjectEntry[k].RecondNum;j++) {
if(m_SlfObjectEntry[k].DataRecord[j].DataPosition>m_SlfObjectEntry[index].Position)
{
m_SlfObjectEntry[k].DataRecord[j].DataPosition-=dlen;
}
}
}
m_SlfObjectEntry[index].Position=mFile->size();
}
else if(!DeleteField) {
m_SlfObjectEntry[index].DataRecord[0].DataPosition=mFile->size();;
}
m_SlfObjectEntry[index].DataRecord[0].DataRecordNum=0;
m_SlfObjectEntry[index].RecondNum=0;
WriteSlfObjectEntry();
return 1;
}
bool CSlfIO:: DiscardSlfObject(int index)
{
if(index<0) return FALSE;
m_SlfObjectEntry[index].Status=OBJECT_DISCARD;
WriteSlfObjectEntry(index);
char Name[200];
strcpy(Name,"Discard_");
strcat(Name,m_SlfObjectEntry[index].Name);
RenameSlfObject(index,Name);
return 1;
}
bool CSlfIO:: RenameSlfObject(const char* oldName,const char* newName)
{
int index=FindSlfObjectIndex(oldName);
if(index<0) return 0;
return RenameSlfObject(index,newName);
}
bool CSlfIO:: RenameSlfObject(int index,const char* newName)
{
if(index<0) return 0;
if(FindSlfObjectIndex(newName)>-1&&strcmp(m_SlfObjectEntry[index].Name,newName)==0) return false;
strcpy(m_SlfObjectEntry[index].Name,newName);
strcpy(m_SlfObjectEntry[index].HZName,newName);
WriteSlfObjectEntry(index);
return 1;
}
bool CSlfIO:: CopySlfObject(const char* oldName,const char* newName, bool bFailExist)
{
int index=FindSlfObjectIndex(oldName);
if(index<0) {
return 0;
}
int reclen=GetSlfTableRecordLength(index);
unsigned int leng=GetSlfTableLength((char *)oldName);
if(leng<1) {
return 0;
}
int ind=FindSlfObjectIndex(newName);
if(ind>=0) {
if(bFailExist) return 1;
else DiscardSlfObjectData(ind);
}
else ind=m_SlfHead.TableNumber++;
m_SlfObjectEntry[ind]=m_SlfObjectEntry[index];
strcpy(m_SlfObjectEntry[ind].Name,newName);
strcpy(m_SlfObjectEntry[ind].HZName,newName);
unsigned int Pos=mFile->size();
m_SlfObjectEntry[ind].Position=Pos;
m_SlfObjectEntry[ind].RecondNum=1;
m_SlfObjectEntry[ind].DataRecord[0].DataRecordNum=0;
m_SlfObjectEntry[ind].DataRecord[0].DataPosition=Pos+
sizeof(Slf_OBJECT_FIELD)*m_SlfObjectEntry[ind].FieldNum;
Slf_OBJECT_FIELD *pf=new Slf_OBJECT_FIELD[m_SlfObjectEntry[ind].FieldNum];
GetSlfTableFieldInfo(index,pf);
if(Slf_Info_Head[ind]) {
SetSlfTableFieldInfo(ind,pf,1);
}
else {
SetSlfTableFieldInfo(ind,pf);
delete []pf;
}
WriteSlfObjectEntry(ind);
WriteSlfHead();
char *buf=new char[leng+1];
int RecNum=ReadSlfTable(index,0,buf);
WriteSlfTable(ind,RecNum,buf);
delete []buf;
return 1;
}
bool CSlfIO:: UndeleteSlfObject(const char* name)
{
int index=FindSlfObjectIndex(name,OBJECT_DELETE);
if(index<0) return 0;
m_SlfObjectEntry[index].Status=OBJECT_NORMAL;
WriteSlfObjectEntry(index);
return 1;
}
WORD CSlfIO:: GetSlfObjectCount()
{
return m_SlfHead.TableNumber;
}
void CSlfIO:: GetAllSlfObjectEntry(Slf_TABLE_ENTRY* pEntry,WORD count)
{
if(count<=0) count=m_SlfHead.MaxTableNumber;
memmove(pEntry,m_SlfObjectEntry,sizeof(Slf_TABLE_ENTRY)*count);
}
void CSlfIO:: GetSlfObjectEntry(int index,Slf_TABLE_ENTRY* pEntry)
{
if(index>-1) *pEntry=m_SlfObjectEntry[index];
}
void CSlfIO:: SetSlfObjectReserved(int index,char * pEntry)
{
if(index>-1&&pEntry) {
int len=strlen(pEntry);
if(len>=32) len=31;
memmove(m_SlfObjectEntry[index].DataSource,pEntry,len);
m_SlfObjectEntry[index].DataSource[len]=0;
WriteSlfObjectEntry(index);
}
}
void CSlfIO:: GetSlfObjectAttribute(int index,short* Attribute, short* SubAttribute)
{
if(index>=0) {
*SubAttribute=m_SlfObjectEntry[index].Type;
*Attribute=1;
if(m_SlfObjectEntry[index].Type==CURVE_OBJECT||m_SlfObjectEntry[index].Type==TDT_OBJECT||m_SlfObjectEntry[index].Type==FMT_OBJECT) {
*Attribute=CHANNEL_OBJECT;
*SubAttribute=m_SlfObjectEntry[index].Type;
}
else if(m_SlfObjectEntry[index].Type==CARD_OBJECT) {
*Attribute=STREAM_OBJECT;
*SubAttribute=PARA_OBJECT;
}
else if(m_SlfObjectEntry[index].Type>CARD_OBJECT) {
*Attribute=TABLE_OBJECT;
*SubAttribute=m_SlfObjectEntry[index].Type-CARD_OBJECT;
}
}
}
bool CSlfIO:: GetSlfObjectEntry(const char* name,Slf_TABLE_ENTRY* pEntry)
{
int index=FindSlfObjectIndex(name);
if(index<0) return 0;
*pEntry=m_SlfObjectEntry[index];
return 1;
}
bool CSlfIO:: GetSlfObjectAttribute(const char* name,short* Attribute, short* SubAttribute)
{
int index=FindSlfObjectIndex(name);
if(index<0) return 0;
GetSlfObjectAttribute(index,Attribute,SubAttribute);
return 1;
}
int CSlfIO:: OpenSlfStream(const char* name)
{
int index=FindSlfObjectName((char *)name,CARD_OBJECT);
if(index<0)return -1;
return OpenSlfTable(name);
}
int CSlfIO:: CreateSlfStream(short SubAttribute,const char *name,DWORD length,bool bFailExist,const char *hzname)
{
Slf_OBJECT_FIELD field;
memset((char *)&field,0,sizeof(Slf_OBJECT_FIELD));
field.ArrayNum=1;
field.CodeLength=1;
field.RepCode=6;
field.SamplePoint=1;//length;
field.Rlev=1;
field.Start=0;
field.Sequence=0;
int index=CreateSlfTable(CARD_OBJECT,name,hzname,1,&field,bFailExist);
if(index>-1) SetSlfTableRecordCount(index,length);
return index;
}
bool CSlfIO:: ExpandSlfStream(int index, DWORD BlockNum)
{
return 1;
}
void CSlfIO:: CloseSlfStream(int index)
{
}
bool CSlfIO:: SetSlfStreamLength(int index, DWORD length)
{
return SetSlfTableRecordCount(index,length);
}
bool CSlfIO:: SeekSlfStream(int index, int lMove, DWORD dwMoveMode)
{
return 1;
}
bool CSlfIO:: ReadSlfStream(int index, DWORD length, LPDWORD lpBytesRead, char *buffer)
{
*lpBytesRead=ReadSlfTable(index, length, buffer,0);
return 1;
}
bool CSlfIO:: WriteSlfStream(int index, DWORD length, LPDWORD lpBytesWrite, const char *buffer)
{
*lpBytesWrite=WriteSlfTable(index, length,(void *) buffer,0);
// SetSlfTableRecordCount(index,length);
return 1;
}
DWORD CSlfIO::GetSlfStreamLength(int index)
{
return GetSlfTableLength(index);
}
int CSlfIO:: ReadSlfStreamInfo(int index)
{
return 1;
}
int CSlfIO:: WriteSlfStreamInfo(int index)
{
return 1;
}
int CSlfIO::OpenSlfChannel(const char *name)
{
int index=FindSlfObjectName((char *)name);
if(index<0) return -1;
int curvetype=GetObjectType(name);
if(curvetype>=CARD_OBJECT||curvetype==0) return -1;
return OpenSlfTable(name);
}
int CSlfIO::OpenSlfChannel(const char *name,short Attribute)
{
int index=FindSlfObjectName((char *)name);
if(index<0) return -1;
int curvetype=GetObjectType(name);
if(curvetype>=CARD_OBJECT||curvetype==0) return -1;
return OpenSlfTable(name);
}
DWORD CSlfIO::ComputerSlfChannelLength(int index)
{
return GetSlfTableRecordLength(index);
}
bool CSlfIO::CorrectSlfTableField(int index, unsigned char nDimension, float delta)
{
if(index<0) return 0;
Slf_OBJECT_FIELD *pFieldInfo=new Slf_OBJECT_FIELD[m_SlfObjectEntry[index].FieldNum];
GetSlfTableFieldInfo(index,pFieldInfo);
pFieldInfo[nDimension].Start+=delta;
SetSlfTableFieldInfo(index,pFieldInfo,0);
delete []pFieldInfo;
return 1;
}
bool CSlfIO::CopySlfObjectToMem(Slf_TABLE_MESSAGE *my,char *name,char *buffer,int Len)
{
int index=FindSlfObjectName(name);
if(index<0) return NULL;
memmove(&my->Table,&m_SlfObjectEntry[index],sizeof(Slf_TABLE_ENTRY));
GetSlfTableFieldInfo(index,my->pField);
ReadSlfTable(index,0,buffer,0);
return TRUE;
}
bool CSlfIO::CopyFromSLFFile(Slf_TABLE_MESSAGE *my,char *buffer,int Len)
{
int index=FindSlfObjectName(my->Table.Name);
if(index>=0) return FALSE;
memmove(&m_SlfObjectEntry[m_SlfHead.TableNumber],&my->Table,sizeof(Slf_TABLE_ENTRY));
int rec=GetSlfTableRecordCount(m_SlfHead.TableNumber);
m_SlfObjectEntry[m_SlfHead.TableNumber].Position=mFile->size();
m_SlfObjectEntry[m_SlfHead.TableNumber].RecondNum=1;
m_SlfObjectEntry[m_SlfHead.TableNumber].DataRecord[0].DataPosition=
m_SlfObjectEntry[m_SlfHead.TableNumber].Position+m_SlfObjectEntry[m_SlfHead.TableNumber].FieldNum*sizeof(Slf_OBJECT_FIELD);
m_SlfObjectEntry[m_SlfHead.TableNumber].DataRecord[0].DataRecordNum=rec;
SetSlfTableFieldInfo(m_SlfHead.TableNumber,my->pField);
WriteSlfTable(m_SlfHead.TableNumber,rec,buffer);
m_SlfHead.TableNumber++;
WriteSlfHead();
WriteSlfObjectEntry();
return TRUE;
}
bool CSlfIO::CopyFromSLFFile(CSlfIO &Source,char *Name,char *newName)
{
if(!Source.mFile) return FALSE;
if(Source.IsWis) return FALSE;
int len=Source.GetSlfTableLength(Name);
if(len==0) return FALSE;
char *buf=new char[len+1];
if(!buf) return FALSE;
int index=Source.FindSlfObjectIndex(Name);
Slf_TABLE_MESSAGE obje;
int FieldNum=Source.GetSlfTableFieldCount(index);
obje.pField=new Slf_OBJECT_FIELD[FieldNum];
if(Source.GetSlfObjectEntry(Name,&obje.Table)&&Source.GetSlfTableFieldInfo(index,obje.pField)) {
if(Source.CopySlfObjectToMem(&obje,Name,buf,len)) {
strcpy(obje.Table.Name,newName);
if(CopyFromSLFFile(&obje,buf,len)) {
delete obje.pField;
delete buf;
return TRUE;
}
}
}
delete obje.pField;
delete buf;
return FALSE;
}
bool CSlfIO::CopyFromSLFFile(CSlfIO &Source,char *Name)
{
if(!Source.mFile) return FALSE;
if(Source.IsWis) return FALSE;
int len=Source.GetSlfTableLength(Name);
if(len==0) return FALSE;
char *buf=new char[len+1];
if(!buf) return FALSE;
int index=Source.FindSlfObjectIndex(Name);
Slf_TABLE_MESSAGE obje;
int FieldNum=Source.GetSlfTableFieldCount(index);
obje.pField=new Slf_OBJECT_FIELD[FieldNum];
if(Source.GetSlfObjectEntry(Name,&obje.Table)&&Source.GetSlfTableFieldInfo(index,obje.pField)) {
if(Source.CopySlfObjectToMem(&obje,Name,buf,len)) {
if(CopyFromSLFFile(&obje,buf,len)) {
delete obje.pField;
delete buf;
return TRUE;
}
}
}
delete obje.pField;
delete buf;
return FALSE;
}
void CSlfIO::SlfTableResamples(int index,float newDelta)
{
if(index<0) return;
int reclen=GetSlfTableRecordLength(index);
unsigned int leng=GetSlfTableLength(index);
int rec=GetSlfTableRecordCount(index);
if(leng<1) return;
Slf_OBJECT_FIELD *pf=new Slf_OBJECT_FIELD[m_SlfObjectEntry[index].FieldNum];
GetSlfTableFieldInfo(index,pf);
if(pf->Rlev==newDelta) {
delete []pf;
return;
}
char oldname[200];
strcpy(oldname,m_SlfObjectEntry[index].Name);
strcat(oldname,".OLD");
int ind=FindSlfObjectIndex(oldname);
if(ind>=0) {
DiscardSlfObjectData(ind);
}
else {
ind=m_SlfHead.TableNumber++;
}
m_SlfObjectEntry[ind]=m_SlfObjectEntry[index];
memmove(m_SlfObjectEntry[index].Name,oldname,sizeof(m_SlfObjectEntry[index].Name));
memmove(m_SlfObjectEntry[index].HZName,oldname,sizeof(m_SlfObjectEntry[index].HZName));
unsigned int Pos=mFile->size();
m_SlfObjectEntry[ind].Position=Pos;
m_SlfObjectEntry[ind].RecondNum=1;
m_SlfObjectEntry[ind].DataRecord[0].DataPosition=Pos+
sizeof(Slf_OBJECT_FIELD)*m_SlfObjectEntry[ind].FieldNum;
float orlev=pf->Rlev;
m_SlfObjectEntry[ind].DataRecord[0].DataRecordNum=(rec*pf->Rlev)/newDelta+0.5;
pf->Rlev=newDelta;
SetSlfTableFieldInfo(ind,pf);
//char *obuf=new char[reclen*m_SlfObjectEntry[ind].DataRecord[0].DataRecordNum+1];
//char *buf=new char[leng+1];
DWORD MaxLen=reclen*m_SlfObjectEntry[ind].DataRecord[0].DataRecordNum+1;
if(MaxLen<leng+1)MaxLen=leng+1;
char *obuf=new char[MaxLen+10];
char *buf=new char[MaxLen+10];
int RecNum=ReadSlfTable(index,0,buf);
float dep,yy1,yy2,yy;
int k1,k2;
DWORD num,num1;
int Pos1=0;
for(DWORD i=0;i<m_SlfObjectEntry[ind].DataRecord[0].DataRecordNum;i++) {
dep=i*newDelta;
k1=dep/orlev+0.5;
k2=dep/orlev+1.5;
while(dep < k1*orlev)
k1--;
while(dep > k2*orlev)
k2++;
while( (k2 - 1)*orlev > dep)
k2--;
while( (k1 + 1)*orlev < dep)
k1++;
if(k1*reclen+1>=MaxLen) k1=MaxLen-1;
if(k2*reclen+1>=MaxLen) k2=k1;
if(k1<0) k1=0;
if(k2<0) k2=0;
Pos1=0;
for(int k=0;k<m_SlfObjectEntry[ind].FieldNum;k++)
{
if(pf[k].Sequence) continue;
for(int j=0;j<pf[k].ArrayNum*pf[k].SamplePoint;j++) {
Pos=k1*reclen+Pos1+j*pf[k].CodeLength;
GetData(pf[k].CodeLength,&buf[Pos],&yy1);
Pos=k2*reclen+Pos1+j*pf[k].CodeLength;
GetData(pf[k].CodeLength,&buf[Pos],&yy2);
if(k1==k2)yy=yy1;
else yy=yy1+(yy2-yy1)*(dep-k1*orlev)/((k2-k1)*orlev);
Pos=i*reclen+Pos1+j*pf[k].CodeLength;
SetData(pf[k].CodeLength,&obuf[Pos],&yy);
}
Pos1+=pf[k].ArrayNum*pf[k].SamplePoint*pf[k].CodeLength;
}
}
WriteSlfTable(ind,m_SlfObjectEntry[ind].DataRecord[0].DataRecordNum,obuf);
Slf_TABLE_ENTRY ol=m_SlfObjectEntry[index];
m_SlfObjectEntry[index]=m_SlfObjectEntry[ind];
strcpy(m_SlfObjectEntry[ind].Name,ol.Name);
strcpy(m_SlfObjectEntry[ind].HZName,ol.HZName);
m_SlfObjectEntry[ind].RecondNum=ol.RecondNum;
for(int i=0;i<ol.RecondNum;i++) {
m_SlfObjectEntry[ind].DataRecord[i].DataPosition=ol.DataRecord[i].DataPosition;
m_SlfObjectEntry[ind].DataRecord[i].DataRecordNum=ol.DataRecord[i].DataRecordNum;
}
m_SlfObjectEntry[ind].Position=ol.Position;
WriteSlfObjectEntry();
WriteSlfHead();
delete []buf;
delete []obuf;
delete []pf;
}
void CSlfIO::MoveSlfTable(int index,int RecFirst,int RecEnd,int Move)
{
if(index<0) return;
int rec=GetSlfTableRecordCount(index);
int reclen=GetSlfTableRecordLength(index);
unsigned int leng=GetSlfTableLength(index);
Slf_OBJECT_FIELD *pf=GetSlfTableFieldInfo(index);
if(RecFirst==0&&RecEnd==rec) {
pf[0].Start+=Move*pf[0].Rlev;
SetSlfTableFieldInfo(index,pf);
}
else {
char *buf=new char[leng+1];
ReadSlfTable(index,RecEnd,buf,RecFirst);
int nrecf=RecFirst+Move;
int nrece=RecEnd+Move;
WriteSlfTable(index,nrece,buf,nrecf);
delete []buf;
}
}
void CSlfIO::SetObjectName(const char *Name,const char *Alias,const char *Unit,const char *AliasUnit,short Attribute, short SubAttribute, int status,int otype)
{
int index=FindObjectName((char *)&Name,Attribute,SubAttribute,status,otype);
if(index>-1) {
SetObjectName(index,NULL,Alias,Unit,AliasUnit);
}
}
void CSlfIO::SetObjectName(int index, const char *Name,const char *Alias,const char *Unit,const char *AliasUnit)
{
if(IsWis) {
if(Name) {
int len=sizeof(m_ObjectEntry[index].Name);
if(len>strlen(Name)) len=strlen(Name);
memmove(m_ObjectEntry[index].Name,Name,len);
if(len<sizeof(m_ObjectEntry[index].Name))m_ObjectEntry[index].Name[sizeof(Name)]=0;
WriteObjectEntry();
}
if(m_ObjectEntry[index].Attribute==CHANNEL_OBJECT) {
Slf_CHANNEL info;
ReadChannelInfo(index,&info);
if(Unit){
int len=sizeof(info.Unit);
if(len>strlen(Unit)) len=strlen(Unit);
memmove(info.Unit,Unit,len);
if(len<sizeof(info.Unit)) info.Unit[len]=0;
}
if(Alias){
int len=sizeof(info.AliasName);
if(len>strlen(Unit)) len=strlen(Alias);
memmove(info.AliasName,Alias,len);
if(len<sizeof(info.AliasName)) info.AliasName[len]=0;
}
if(AliasUnit){
int len=sizeof(sizeof(info.AliasUnit));
if(len>strlen(AliasUnit)) len=strlen(AliasUnit);
memmove(info.AliasUnit,AliasUnit,len);
if(len<sizeof(info.AliasUnit)) info.AliasUnit[len]=0;
}
WriteChannelInfo(index,&info);
}
else {
}
}
else {
if(Name) {
int len=sizeof(m_SlfObjectEntry[index].Name);
if(len>strlen(Name)) len=strlen(Name);
memmove(m_SlfObjectEntry[index].Name,Name,len);
if(len<sizeof(m_SlfObjectEntry[index].Name))m_SlfObjectEntry[index].Name[len]=0;
}
if(Alias) {
int len=sizeof(m_SlfObjectEntry[index].HZName);
if(len>strlen(Alias)) len=strlen(Alias);
memmove(m_SlfObjectEntry[index].HZName,Alias,len);
if(len<sizeof(m_SlfObjectEntry[index].HZName))m_SlfObjectEntry[index].HZName[len]=0;
}
if(Unit){
int len=sizeof(m_SlfObjectEntry[index].Unit);
if(len>strlen(Unit)) len=strlen(Unit);
memmove(m_SlfObjectEntry[index].Unit,Unit,len);
if(len<sizeof(m_SlfObjectEntry[index].Unit))m_SlfObjectEntry[index].Unit[len]=0;
}
if(AliasUnit) {
int len=sizeof(m_SlfObjectEntry[index].HZUnit);
if(len>strlen(AliasUnit)) len=strlen(AliasUnit);
memmove(m_SlfObjectEntry[index].HZUnit,AliasUnit,len);
if(len<sizeof(m_SlfObjectEntry[index].HZUnit))m_SlfObjectEntry[index].HZUnit[len]=0;
}
WriteSlfObjectEntry();
}
}
void CSlfIO::GetObjectName(int index, char *Name,char *Unit,char *Alias,char *AliasUnit)
{
if(IsWis) {
memmove(Name,m_ObjectEntry[index].Name,sizeof(m_ObjectEntry[index].Name));
Name[sizeof(m_ObjectEntry[index].Name)]=0;
if(m_ObjectEntry[index].Attribute==CHANNEL_OBJECT) {
Slf_CHANNEL info;
ReadChannelInfo(index,&info);
if(Unit)memmove(Unit,info.Unit,sizeof(info.Unit));
if(Alias)memmove(Alias,info.AliasName,sizeof(info.AliasName));
if(AliasUnit)memmove(AliasUnit,info.AliasUnit,sizeof(info.AliasUnit));
}
else {
if(Unit)Unit[0]=0;
if(Alias)Alias[0]=0;
if(AliasUnit)AliasUnit[0]=0;
}
}
else {
memmove(Name,m_SlfObjectEntry[index].Name,sizeof(m_SlfObjectEntry[index].Name));
if(Alias)memmove(Alias,m_SlfObjectEntry[index].HZName,sizeof(m_SlfObjectEntry[index].HZName));
if(Unit)memmove(Unit,m_SlfObjectEntry[index].Unit,sizeof(m_SlfObjectEntry[index].Unit));
if(AliasUnit) memmove(AliasUnit,m_SlfObjectEntry[index].HZUnit,sizeof(m_SlfObjectEntry[index].HZUnit));
}
}
//whp add
short CSlfIO::GetObjectType(int index)
{
if(IsWis) return GetWisObjectType(index);
else return GetSlfObjectType(index);
}
short CSlfIO::GetObjectType(const char* name)
{
if(IsWis) return GetWisObjectType(name);
else return GetSlfObjectType(name);
}
short CSlfIO:: GetSlfObjectType(int index)
{
if(index>=0)return m_SlfObjectEntry[index].Type;
else return -1;
}
short CSlfIO:: GetSlfObjectType(const char* name)
{
int index=FindSlfObjectIndex(name);
if(index<0) return -1;
return GetSlfObjectType(index);
}
short CSlfIO::GetWisObjectType(int index)
{
if(m_ObjectEntry[index].Attribute==CHANNEL_OBJECT&&m_ObjectEntry[index].SubAttribute==CURVE_OBJECT)return CURVE_OBJECT;
if(m_ObjectEntry[index].Attribute==CHANNEL_OBJECT&&m_ObjectEntry[index].SubAttribute==WAVE_OBJECT)return WAVE_OBJECT;
if(m_ObjectEntry[index].Attribute==CHANNEL_OBJECT&&m_ObjectEntry[index].SubAttribute==FMT_OBJECT)return FMT_OBJECT;
if(m_ObjectEntry[index].Attribute==CHANNEL_OBJECT&&m_ObjectEntry[index].SubAttribute==TDT_OBJECT)return TDT_OBJECT;
if(m_ObjectEntry[index].Attribute==STREAM_OBJECT)return CARD_OBJECT;
else return 0;
}
short CSlfIO::GetWisObjectType(const char* name)
{
int index=FindWisObjectIndex(name);
if(index>-1) {
return GetWisObjectType(index);
}
else return -1;
}
//whp add 2011.12.18
bool CSlfIO::UndeleteSlfObject(int index)
{
if(index<0) return 0;
m_SlfObjectEntry[index].Status=OBJECT_NORMAL;
WriteSlfObjectEntry(index);
return 1;
}
bool CSlfIO:: UnDeleteObject(int index)
{
if(IsWis) return 0;
else return UndeleteSlfObject(index);
}
void CSlfIO::GetSlfObjectBaseInf(int index,Slf_OBJECT_BASE_INF* pBaseInf)
{
if(index>-1)
{
memmove(pBaseInf->Name,m_SlfObjectEntry[index].Name,sizeof(m_SlfObjectEntry[index].Name));
memmove(pBaseInf->HZName,m_SlfObjectEntry[index].HZName,sizeof(m_SlfObjectEntry[index].HZName));
memmove(pBaseInf->Unit,m_SlfObjectEntry[index].Unit,sizeof(m_SlfObjectEntry[index].Unit));
memmove(pBaseInf->HZUnit,m_SlfObjectEntry[index].HZUnit,sizeof(m_SlfObjectEntry[index].HZUnit));
memmove(pBaseInf->DataSource,m_SlfObjectEntry[index].DataSource,sizeof(m_SlfObjectEntry[index].DataSource));
memmove(pBaseInf->LogCopanyName,m_SlfObjectEntry[index].LogCopanyName,sizeof(m_SlfObjectEntry[index].LogCopanyName));
memmove(pBaseInf->LoggingTeam,m_SlfObjectEntry[index].LoggingTeam,sizeof(m_SlfObjectEntry[index].LoggingTeam));
memmove(pBaseInf->Operator,m_SlfObjectEntry[index].Operator,sizeof(m_SlfObjectEntry[index].Operator));
memmove(&pBaseInf->LoggingDate,&m_SlfObjectEntry[index].LoggingDate,sizeof(m_SlfObjectEntry[index].LoggingDate));
}
}
bool CSlfIO:: GetSlfObjectBaseInf(const char* name,Slf_OBJECT_BASE_INF* pBaseInf)
{
int index=FindSlfObjectIndex(name);
if(index<0) return 0;
memmove(pBaseInf->Name,m_SlfObjectEntry[index].Name,sizeof(m_SlfObjectEntry[index].Name));
memmove(pBaseInf->HZName,m_SlfObjectEntry[index].HZName,sizeof(m_SlfObjectEntry[index].HZName));
memmove(pBaseInf->Unit,m_SlfObjectEntry[index].Unit,sizeof(m_SlfObjectEntry[index].Unit));
memmove(pBaseInf->HZUnit,m_SlfObjectEntry[index].HZUnit,sizeof(m_SlfObjectEntry[index].HZUnit));
memmove(pBaseInf->DataSource,m_SlfObjectEntry[index].DataSource,sizeof(m_SlfObjectEntry[index].DataSource));
memmove(pBaseInf->LogCopanyName,m_SlfObjectEntry[index].LogCopanyName,sizeof(m_SlfObjectEntry[index].LogCopanyName));
memmove(pBaseInf->LoggingTeam,m_SlfObjectEntry[index].LoggingTeam,sizeof(m_SlfObjectEntry[index].LoggingTeam));
memmove(pBaseInf->Operator,m_SlfObjectEntry[index].Operator,sizeof(m_SlfObjectEntry[index].Operator));
memmove(&pBaseInf->LoggingDate,&m_SlfObjectEntry[index].LoggingDate,sizeof(m_SlfObjectEntry[index].LoggingDate));
return 1;
}
bool CSlfIO:: WriteSlfObjectBaseInf(int index,Slf_OBJECT_BASE_INF *pBaseInf)
{
if(index<0) return 0;
memmove(m_SlfObjectEntry[index].Name,pBaseInf->Name,sizeof(pBaseInf->Name));
memmove(m_SlfObjectEntry[index].HZName,pBaseInf->HZName,sizeof(pBaseInf->HZName));
memmove(m_SlfObjectEntry[index].Unit,pBaseInf->Unit,sizeof(pBaseInf->Unit));
memmove(m_SlfObjectEntry[index].HZUnit,pBaseInf->HZUnit,sizeof(pBaseInf->HZUnit));
memmove(m_SlfObjectEntry[index].DataSource,pBaseInf->DataSource,sizeof(pBaseInf->DataSource));
memmove(m_SlfObjectEntry[index].LogCopanyName,pBaseInf->LogCopanyName,sizeof(pBaseInf->LogCopanyName));
memmove(m_SlfObjectEntry[index].LoggingTeam,pBaseInf->LoggingTeam,sizeof(pBaseInf->LoggingTeam));
memmove(m_SlfObjectEntry[index].Operator,pBaseInf->Operator,sizeof(pBaseInf->Operator));
memmove(&m_SlfObjectEntry[index].LoggingDate,&pBaseInf->LoggingDate,sizeof(pBaseInf->LoggingDate));
WriteSlfObjectEntry(index,&m_SlfObjectEntry[index]);
return 1;
}
char* CSlfIO::GetSlfFileName()
{
return m_LogFileName;
}
void WriteShiftMessage(CSlfIO&mem,CString &szBuffer,QString name,QString card)
{
CString szBuffer1="";
DWORD bytes_write;
char cardname[200]="Run_depth_Records";
if(!card.isEmpty()) strcpy(cardname,card.toStdString().c_str());
int index_result = mem.CreateStream(PARA_OBJECT,cardname,16384,FALSE);
int len=mem.GetStreamLength(index_result);
if(len>0) {
char *buff=new char[len+1];
DWORD lb=0;
mem.ReadStream(index_result,len,&lb,buff);
QString cs=szBuffer.GetString();
QDateTime current_date_time =QDateTime::currentDateTime();
QString strStartTime = current_date_time.toString("dd-MM-yyyy hh:mm:ss");
if(!card.isEmpty()) szBuffer1=name+" "+strStartTime+"\r\n"+cs+"\r\nEND\r\n"+buff;
else {
QString css=name+" ";
css+=strStartTime+"\r\n";
css+=cs+"END\r\n";
int len=strlen(buff);
if(len>0)
{
buff[len]=0;
QString csss=buff;
szBuffer1=csss+"\r\n"+css;
}
else szBuffer1=css;
}
cs=szBuffer1.GetString();
len=strlen(cs.toStdString().c_str());
mem.WriteStream(index_result,len+1,&lb,szBuffer1.GetString());
delete buff;
}
}
#ifndef WIN32
char *strupr(char *str){
char *orign=str;
for (; *str!='\0'; str++)
*str = toupper(*str);
return orign;
}
#endif
QDataStream & operator << (QDataStream & out, const tagSlf_FILE_HEAD & aSlf_FILE_HEAD) {
out << aSlf_FILE_HEAD.Version ;
return out;
}