统计文件未接收的部分

#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;
		}
	}
}


你可能感兴趣的:(文件)