亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? userconnection.h

?? dc++(一個曾經(jīng)大量使用的p2p)的源代碼,dc++,開源的p2p源代碼
?? H
字號:
/* 
 * Copyright (C) 2001-2003 Jacek Sieka, j_s@telia.com
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 2 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
 */

#if !defined(AFX_USERCONNECTION_H__52BFD1A0_9924_4C07_BAFA_FB9682884841__INCLUDED_)
#define AFX_USERCONNECTION_H__52BFD1A0_9924_4C07_BAFA_FB9682884841__INCLUDED_

#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000

#include "BufferedSocket.h"
#include "CriticalSection.h"
#include "File.h"
#include "TimerManager.h"
#include "User.h"

class UserConnection;

class UserConnectionListener {
public:
	typedef UserConnectionListener* Ptr;
	typedef vector<Ptr> List;
	typedef List::iterator Iter;
	enum Types {
		BYTES_SENT,
		CONNECTED,
		DATA,
		FAILED,
		C_LOCK,
		KEY,
		DIRECTION,
		GET,
		GET_ZBLOCK,
		SENDING,
		FILE_LENGTH,
		SEND,
		GET_LIST_LENGTH,
		MAXED_OUT,
		MODE_CHANGE,
		MY_NICK,
		TRANSMIT_DONE,
		SUPPORTS,
		FILE_NOT_AVAILABLE
	};

	virtual void onAction(Types, UserConnection*) throw() { };							// GET_LIST_LENGTH, SEND, MAXED_OUT, CONNECTED, TRANSMIT_DONE
	virtual void onAction(Types, UserConnection*, u_int32_t) throw() { };				// BYTES_SENT
	virtual void onAction(Types, UserConnection*, const string&) throw() { };			// MY_NICK, FAILED, FILE_LENGTH, KEY, SUPPORTS
	virtual void onAction(Types, UserConnection*, const u_int8_t*, int) throw() { };	// DATA
	virtual void onAction(Types, UserConnection*, const string&, const string&) throw() { };	// DIRECTION, LOCK
	virtual void onAction(Types, UserConnection*, const string&, int64_t) throw() { };	// GET
	virtual void onAction(Types, UserConnection*, const string&, int64_t, int64_t) throw() { };	// GET_BZ_BLOCK
	virtual void onAction(Types, UserConnection*, int) throw() { };						// MODE_CHANGE
	virtual void onAction(Types, UserConnection*, const StringList&) throw() { };		// SUPPORTS
};

class ConnectionQueueItem;

class Transfer {
public:
	Transfer() : file(NULL), userConnection(NULL), start(0), lastTick(GET_TICK()), runningAverage(0), 
		last(0), total(0), pos(-1), size(-1) { };
	virtual ~Transfer() { dcassert(userConnection == NULL); dcassert(file == NULL); };
	
	int64_t getPos() { return pos; };
	void setPos(int64_t aPos) { pos = aPos; };
	void setPos(int64_t aPos, bool aUpdate) { 
		pos = aPos;
		if(aUpdate) {
			file->setPos(aPos);
		}
	};

	void addPos(int64_t aPos) {
		pos += aPos; last+=aPos; total+=aPos; 
	};
	
	void updateRunningAverage() {
		u_int32_t tick = GET_TICK();
		if(tick > lastTick) {
			int64_t diff = (int64_t)(tick - lastTick);
			if(runningAverage == 0) {
				runningAverage = last * 1000 / diff;
			} else if( (tick - getStart()) < 30000) {
				runningAverage = getAverageSpeed();
			} else {
				runningAverage = ( (runningAverage * ((int64_t)30000 - diff) ) + (last*diff)) / (int64_t)30000;
			}
			last = 0;
		}
		lastTick = tick;
	}

	int64_t getTotal() { return total; };
	void resetTotal() { total = 0; };
	
	int64_t getSize() { return size; };
	void setSize(int64_t aSize) { size = aSize; };
	void setSize(const string& aSize) { setSize(Util::toInt64(aSize)); };

	int64_t getAverageSpeed() {
		int64_t diff = (int64_t)(GET_TICK() - getStart());
		return (diff > 0) ? (getTotal() * (int64_t)1000 / diff) : 0;
	}

	int64_t getSecondsLeft() {
		updateRunningAverage();
		int64_t avg = getRunningAverage();
		return (avg > 0) ? ((getSize() - getPos()) / avg) : 0;
	}

	GETSET(File*, file, File);
	GETSET(UserConnection*, userConnection, UserConnection);
	GETSET(u_int32_t, start, Start);
	GETSET(u_int32_t, lastTick, LastTick);
	GETSET(int64_t, runningAverage, RunningAverage);
private:
	int64_t last;
	int64_t total;
	int64_t pos;
	int64_t size;

};

class ServerSocket;
class Upload;
class Download;

class UserConnection : public Speaker<UserConnectionListener>, private BufferedSocketListener, public Flags
{
public:
	friend class ConnectionManager;
	
	typedef UserConnection* Ptr;
	typedef vector<Ptr> List;
	typedef List::iterator Iter;
	
	enum Modes {	
		MODE_COMMAND = BufferedSocket::MODE_LINE,
		MODE_DATA = BufferedSocket::MODE_DATA
	};

	enum Flags {
		FLAG_UPLOAD = 0x01,
		FLAG_DOWNLOAD = FLAG_UPLOAD << 1,
		FLAG_INCOMING = FLAG_DOWNLOAD << 1,
		FLAG_HASSLOT = FLAG_INCOMING << 1,
		FLAG_HASEXTRASLOT = FLAG_HASSLOT << 1,
		FLAG_INVALIDKEY = FLAG_HASEXTRASLOT << 1,
		FLAG_SUPPORTS_BZLIST = FLAG_INVALIDKEY << 1,
		FLAG_SUPPORTS_GETZBLOCK = FLAG_SUPPORTS_BZLIST << 1
	};
	
	enum States {
		// ConnectionManager
		STATE_UNCONNECTED,
		STATE_CONNECT,
		STATE_NICK,
		STATE_LOCK,
		STATE_DIRECTION,
		STATE_KEY,
		// UploadManager
		STATE_GET,
		STATE_SEND,
		STATE_DONE,
		// DownloadManager
		STATE_FILELENGTH
	};

	int getNumber() { return (((u_int32_t)this)>>2) & 0x7fff; };

	void myNick(const string& aNick) { send("$MyNick " + aNick + '|'); }
	void lock(const string& aLock, const string& aPk) { send ("$Lock " + aLock + " Pk=" + aPk + '|'); }
	void key(const string& aKey) { send("$Key " + aKey + '|'); }
	void direction(const string& aDirection, int aNumber) { send("$Direction " + aDirection + " " + Util::toString(aNumber) + '|'); }
	void get(const string& aFile, int64_t aResume) { send("$Get " + aFile + "$" + Util::toString(aResume + 1) + '|'); };
	void getZBlock(const string& aFile, int64_t aResume, int64_t aBytes) { send("$GetZBlock " + Util::toString(aResume) + ' ' + Util::toString(aBytes) + ' ' + aFile + '|'); };
	void fileLength(const string& aLength) { send("$FileLength " + aLength + '|'); }
	void startSend() { send("$Send|"); }
	void sending() { send("$Sending|"); };
	void error(const string& aError) { send("$Error " + aError + '|'); };
	void listLen(const string& aLength) { send("$ListLen " + aLength + '|'); };
	void maxedOut() { send("$MaxedOut|"); };
	void supports(const StringList& feat) { 
		string x;
		for(StringList::const_iterator i = feat.begin(); i != feat.end(); ++i) {
			x+= *i + ' ';
		}
		send("$Supports " + x + '|');
	}
	void setDataMode(int64_t aBytes = -1) { dcassert(socket); socket->setDataMode(aBytes); }
	void setLineMode() { dcassert(socket); socket->setLineMode(); };

	void UserConnection::connect(const string& aServer, short aPort) throw(SocketException) { 
		socket->connect(aServer, aPort);
	}
	
	void UserConnection::accept(const ServerSocket& aServer) throw(SocketException) {
		socket->accept(aServer);
	}
	
	void disconnect() { if(socket) socket->disconnect(); };
	void transmitFile(File* f, int64_t size, bool comp = false) { 
		socket->transmitFile(f, size, comp); 
	};

	const string& getDirectionString() {
		dcassert(isSet(FLAG_UPLOAD) ^ isSet(FLAG_DOWNLOAD));
		return isSet(FLAG_UPLOAD) ? UPLOAD : DOWNLOAD;
	}

	User::Ptr& getUser() { return user; };

	Download* getDownload() { dcassert(isSet(FLAG_DOWNLOAD)); return download; };
	void setDownload(Download* d) { dcassert(isSet(FLAG_DOWNLOAD)); download = d; };
	Upload* getUpload() { dcassert(isSet(FLAG_UPLOAD)); return upload; };
	void setUpload(Upload* u) { dcassert(isSet(FLAG_UPLOAD)); upload = u; };

	GETSET(ConnectionQueueItem*, cqi, CQI);
	GETSET(States, state, State);
	GETSET(u_int32_t, lastActivity, LastActivity);
	GETSETREF(string, nick, Nick);
	
private:
	BufferedSocket* socket;
	User::Ptr user;
	
	static const string UPLOAD, DOWNLOAD;
	
	union {
		Download* download;
		Upload* upload;
	};

	// We only want ConnectionManager to create this...
	UserConnection() throw(SocketException) : cqi(NULL), state(STATE_UNCONNECTED), lastActivity(0), 
		socket(BufferedSocket::getSocket('|')), download(NULL) { 
		
		socket->addListener(this);
	};

	virtual ~UserConnection() {
		socket->removeListener(this);
		removeListeners();
		BufferedSocket::putSocket(socket);
	};
	friend struct DeleteFunction<UserConnection*>;

	void setUser(const User::Ptr& aUser) {
		user = aUser;
	};

	void onLine(const string& aLine) throw();
	
	void send(const string& aString) {
		lastActivity = GET_TICK();
		socket->write(aString);
	}

	// BufferedSocketListener
	virtual void onAction(BufferedSocketListener::Types type) throw();
	virtual void onAction(BufferedSocketListener::Types type, u_int32_t bytes) throw();
	virtual void onAction(BufferedSocketListener::Types type, const string& aLine) throw();
	virtual void onAction(BufferedSocketListener::Types type, int mode) throw();
	virtual void onAction(BufferedSocketListener::Types type, const u_int8_t* buf, int len) throw();

};

#endif // !defined(AFX_USERCONNECTION_H__52BFD1A0_9924_4C07_BAFA_FB9682884841__INCLUDED_)

/**
 * @file
 * $Id: UserConnection.h,v 1.55 2003/07/15 14:53:11 arnetheduck Exp $
 */

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
亚洲成a人片在线观看中文| 91视频在线看| 91在线小视频| 91麻豆精品国产91久久久久久久久 | 欧美高清精品3d| 国产三级一区二区| 三级欧美在线一区| av亚洲精华国产精华精| 欧美大片一区二区| 亚洲午夜三级在线| 91香蕉视频在线| 久久久久久久性| 奇米一区二区三区| 欧美视频在线一区| 亚洲人成精品久久久久| 国产精品白丝jk黑袜喷水| 欧美一区中文字幕| 亚洲第一成年网| 色狠狠av一区二区三区| 国产精品久久久久一区| 国产很黄免费观看久久| 精品美女在线播放| 青青国产91久久久久久| 欧美日韩中文精品| 一区二区三区欧美| 91行情网站电视在线观看高清版| 欧美韩国日本不卡| 国产福利一区二区三区视频 | 免费成人美女在线观看.| 欧美视频精品在线观看| 亚洲资源中文字幕| 欧美亚一区二区| 亚洲乱码国产乱码精品精98午夜| 99精品在线观看视频| 国产精品色一区二区三区| 国产成人精品一区二| 久久久久久9999| 国产精品1区2区| 久久精品日韩一区二区三区| 国产综合色精品一区二区三区| 日韩欧美电影一区| 国产自产高清不卡| 国产欧美视频一区二区| 粉嫩aⅴ一区二区三区四区| 中文字幕欧美区| 97精品国产97久久久久久久久久久久| 国产精品不卡在线| 色婷婷久久久综合中文字幕| 亚洲永久免费av| 日韩一区二区三区视频在线| 精品一区二区免费在线观看| 国产清纯美女被跳蛋高潮一区二区久久w | 风间由美中文字幕在线看视频国产欧美 | 精品1区2区3区| 日韩精品亚洲专区| 精品国产电影一区二区| 国产成人午夜精品影院观看视频| 欧美国产综合一区二区| 在线精品视频一区二区| 日韩中文字幕亚洲一区二区va在线| 日韩免费福利电影在线观看| 成人性生交大片免费看中文网站| 《视频一区视频二区| 欧美日韩不卡一区| 国产不卡高清在线观看视频| 亚洲另类春色校园小说| 欧美一区二区在线观看| 国产麻豆9l精品三级站| 洋洋av久久久久久久一区| 欧美成va人片在线观看| 91亚洲精品久久久蜜桃| 日韩不卡一区二区| 国产精品久久毛片a| 欧美精品久久天天躁| 国产精品一二三区在线| 午夜精品福利一区二区三区蜜桃| 欧美精品一区二区不卡 | 成人亚洲精品久久久久软件| 亚洲午夜私人影院| 中文字幕免费不卡| 91精品国产综合久久精品app| 国产成人免费在线观看不卡| 亚洲国产精品自拍| 国产精品久久久久久久蜜臀| 777午夜精品免费视频| 99精品国产一区二区三区不卡 | 亚洲福中文字幕伊人影院| 久久精子c满五个校花| 欧美日韩亚洲综合在线| av不卡在线播放| 国产综合色视频| 日本在线不卡一区| 亚洲综合久久久| 亚洲欧美怡红院| 久久精品在线观看| 日韩一区二区三区av| 欧美午夜免费电影| 色综合天天视频在线观看| 国产精品夜夜嗨| 久久超碰97人人做人人爱| 亚洲国产精品久久久久婷婷884| 国产精品初高中害羞小美女文| 精品成人在线观看| 精品久久久久久无| 制服.丝袜.亚洲.另类.中文 | 精品国产一区二区精华| 欧美日高清视频| 欧美午夜一区二区三区免费大片| 99re热这里只有精品免费视频| 国产一区二区三区精品视频| 久久精品国产精品亚洲红杏| 天天色 色综合| 午夜精品国产更新| 日日欢夜夜爽一区| 日本免费新一区视频| 五月综合激情婷婷六月色窝| 午夜久久久久久久久| 亚洲一区免费视频| 亚洲成人动漫av| 日日摸夜夜添夜夜添精品视频| 性久久久久久久| 日韩国产高清影视| 久久国产日韩欧美精品| 另类中文字幕网| 精品无人码麻豆乱码1区2区| 国产一区二区主播在线| 国产精品一区二区在线观看网站| 狠狠色综合日日| 国产一区二区在线电影| 国产mv日韩mv欧美| 不卡一区二区三区四区| 91极品美女在线| 欧美日本在线看| 欧美mv日韩mv| 欧美国产精品一区二区三区| 国产精品久久久久久一区二区三区| 亚洲欧美自拍偷拍| 亚洲五月六月丁香激情| 日韩激情一二三区| 国产成人在线色| 色综合久久久久网| 欧美日韩日本视频| 久久亚洲综合色一区二区三区| 国产日韩亚洲欧美综合| 亚洲免费在线观看视频| 午夜精品久久久久久久99水蜜桃 | 日本欧美久久久久免费播放网| 久久se精品一区二区| 成人小视频免费在线观看| 色婷婷久久久亚洲一区二区三区 | 免费成人在线网站| 国产一区二区免费视频| 99re这里只有精品6| 91精品国产色综合久久久蜜香臀| 久久婷婷国产综合精品青草| 亚洲色图欧美偷拍| 蜜桃传媒麻豆第一区在线观看| 成人高清视频免费观看| 欧美麻豆精品久久久久久| 久久久精品综合| 亚洲综合色自拍一区| 国产一区二区精品久久99| 色婷婷香蕉在线一区二区| 久久影院午夜论| 亚洲福中文字幕伊人影院| 福利视频网站一区二区三区| 欧美一区二区三区四区高清| 国产欧美日韩在线观看| 天堂av在线一区| 91猫先生在线| 久久精品视频免费| 日韩在线卡一卡二| 91久久人澡人人添人人爽欧美| 久久久久久久一区| 日日夜夜免费精品视频| 色综合中文字幕| 日本一二三四高清不卡| 久久99久久99| 欧美日韩一区二区不卡| 日韩毛片精品高清免费| 国产成人午夜高潮毛片| 精品精品欲导航| 免费在线观看视频一区| 欧美伊人久久大香线蕉综合69| 国产精品沙发午睡系列990531| 久久精品国产成人一区二区三区 | 国产日韩亚洲欧美综合| 奇米影视7777精品一区二区| 在线观看视频一区二区| 国产精品国产三级国产专播品爱网| 久久精工是国产品牌吗| 日韩一区二区三区观看| 日本少妇一区二区| 911精品产国品一二三产区| 亚洲美女偷拍久久| 91原创在线视频| 亚洲人成在线观看一区二区| 99久久99久久综合| 亚洲日本丝袜连裤袜办公室| jizz一区二区|