統計ファイル未受信部分
2600 ワード
#ifndef FILESTATE_H
#define FILESTATE_H
#include <afxtempl.h>
typedef struct _FILE_PART_UNRECV
{
double dPos1;
double dPos2;
}FILE_PART;
typedef CList<FILE_PART> UnRecvSet;
class FileState
{
public:
UnRecvSet urs;//
double dPerPos;//
double dCurrentPos;//
public:
FileState();
void RecvToOffPos(double dOffPos);
void DragToPos(double dCurPos);
private:
double GetFilePartRightPos(double dPos);
//int GetUnRecvPart(FILE_PART *pfpu);
};
#endif//FILESTATE_H
#include "FileState.h"
FileState::FileState()
{
dPerPos=0.0;
dCurrentPos=0.0;
FILE_PART fp;
fp.dPos1=0;
fp.dPos2=100;
urs.AddHead(fp);
}
double FileState::GetFilePartRightPos(double dPos)
{
double dTempPos=dPos;
int nCount=urs.GetCount();
for (int i=0;i<nCount;i++)
{
POSITION pos=urs.FindIndex(i);
FILE_PART fp=urs.GetAt(pos);
if ( fp.dPos1<=dTempPos && dTempPos<fp.dPos2)
{
return fp.dPos2;
}
}
return -1.0;//for error.
}
void FileState::RecvToOffPos(double dOffPos)
{
// 。 。 。
double dRight=GetFilePartRightPos(dCurrentPos);
if (dRight<0.0)
{
return;
}
if ((dRight-dCurrentPos)<dOffPos)
{
dOffPos=dRight-dCurrentPos;
}
int nCount=urs.GetCount();
for (int i=0;i<nCount;i++)
{
POSITION pos=urs.FindIndex(i);
FILE_PART fp=urs.GetAt(pos);
if ( fp.dPos1<=dCurrentPos && dCurrentPos<fp.dPos2)
{
urs.RemoveAt(pos);
if ((dRight-dCurrentPos)==dOffPos)
{
//do nothing but dCurrentPos, 。
FILE_PART fp=urs.GetNext(pos);
dCurrentPos=fp.dPos1;
}
else
{
dCurrentPos=dCurrentPos+dOffPos;
FILE_PART fp;
fp.dPos1=dCurrentPos;
fp.dPos2=dRight;
urs.AddHead(fp);
}
}
}
}
void FileState::DragToPos(double dCurPos)
{// , , 。
double dTempCurPos=dCurPos;
int nCount=urs.GetCount();
for (int i=0;i<nCount;i++)
{
POSITION pos=urs.FindIndex(i);
FILE_PART fp=urs.GetAt(pos);
if (fp.dPos1<=dTempCurPos && dTempCurPos<=fp.dPos2)
{
if (fp.dPos1==dTempCurPos || dTempCurPos==fp.dPos2)
{
dCurrentPos=dTempCurPos;
dPerPos=dTempCurPos;
break;
}
//
urs.RemoveAt(pos);
FILE_PART fp1;
FILE_PART fp2;
fp1.dPos1=fp.dPos1;
fp1.dPos2=dTempCurPos;
urs.AddHead(fp1);
fp2.dPos1=dTempCurPos;
fp2.dPos2=fp.dPos2;
urs.AddHead(fp2);
dCurrentPos=dTempCurPos;
dPerPos=dTempCurPos;
}
}
}