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

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? htbufwrt.c

?? www工具包. 這是W3C官方支持的www支撐庫. 其中提供通用目的的客戶端的WebAPI: complete HTTP/1.1 (with caching, pipelining, PUT, POS
?? C
字號:
/***	BUFFERED TRANSPORT WRITER STREAM****	(c) COPYRIGHT MIT 1995.**	Please first read the full copyright statement in the file COPYRIGH.**	@(#) $Id: HTBufWrt.c,v 2.27 1999/05/03 15:58:33 frystyk Exp $****	A buffered output stream. This stream lets you write characters to a**	stream without causing a write every time.  The data is first written**	into a buffer. Data is written to the actual stream only when the**	buffer is full, or when the stream is flushed.*//* Library include files */#include "wwwsys.h"#include "WWWUtil.h"#include "WWWCore.h"#include "HTNetMan.h"#include "HTWriter.h"#include "HTTimer.h"#include "HTBufWrt.h"					 /* Implemented here */struct _HTOutputStream {    const HTOutputStreamClass *	isa;    HTOutputStream *		target;		 /* Target for outgoing data */    HTHost *			host;    int				allocated;  	    /* Allocated Buffer size */    int                         growby;    int				expo;    char *			read;		       /* Position in 'data' */    char *			data;				   /* buffer */    ms_t			lastFlushTime;	/* polar coordinates of the moon */    HTTimer *			timer;};#define PUTBLOCK(b,l) (*me->target->isa->put_block)(me->target,(b),(l))/* ------------------------------------------------------------------------- *//***  This function is only called from either FlushEvent or HTBufferWriter_lazyFlush**  which means that only the host object or timeout can cause a flush*/PRIVATE int HTBufferWriter_flush (HTOutputStream * me){    int status = HT_OK;    if (me && me->read > me->data) {	me->lastFlushTime = HTGetTimeInMillis();        if ((status = PUTBLOCK(me->data, me->read - me->data))==HT_WOULD_BLOCK)	    return HT_WOULD_BLOCK;	me->read = me->data;    }    return status;}PRIVATE int FlushEvent (HTTimer * timer, void * param, HTEventType type){    HTOutputStream * me = (HTOutputStream *) param;    if (me->timer && timer != me->timer)	HTDEBUGBREAK("Buffer Writer timer %p not in sync\n" _ timer);    HTTRACE(PROT_TRACE, "Buffer...... Timeout flushing %p with timer %p\n" _ me _ timer);    /*    **  We ignore the return code here which we shouldn't!!!    */    HTBufferWriter_flush(me);    /*    **  Delete the timer    */    HTTimer_delete(me->timer);    me->timer = NULL;    return HT_OK;}PRIVATE int HTBufferWriter_lazyFlush (HTOutputStream * me){    HTNet * net;    int delay;    if (me->read <= me->data) {	return HT_OK;			/* nothing to flush */    }    /*    **  If we are allowed to delay the flush then set a timer with the    **  delay descibed by our delay variable. If we can't delay then flush     **  right away.    */    delay = HTHost_findWriteDelay(me->host, me->lastFlushTime, me->read - me->data);    /*    **	Flush immediately    */    if (!delay) {	int status;	HTTRACE(STREAM_TRACE, "Buffer...... Flushing %p\n" _ me);	if ((status = HTBufferWriter_flush(me)) && me->timer) {	    HTTimer_delete(me->timer);	    me->timer = NULL;	}	return status;    }    /*    **	Set a timer and tell the host we've done the write if    **  we have not already started a timer earlier. If a timer    **  does already exist then make sure that it hasn't expired.    **  This can be the case if we have a really slow client that    **  can't parse the data fast enough.    */    if (!me->timer) {	net = HTHost_getWriteNet(me->host);	me->timer = HTTimer_new(NULL, FlushEvent, me, delay, YES, NO);	HTHost_unregister(me->host, net, HTEvent_WRITE);	HTTRACE(STREAM_TRACE, "Buffer...... Waiting %dms on %p\n" _ delay _ me);    } else {	if (HTTimer_hasTimerExpired(me->timer)) {	    HTTRACE(STREAM_TRACE, "Buffer...... Dispatching old timer %p\n" _ me->timer);	    HTTimer_dispatch(me->timer);	    me->timer = NULL;	} else {	    HTTRACE(STREAM_TRACE, "Buffer...... Waiting on unexpired timer %p\n" _ me->timer);	}    }    return HT_OK;}PRIVATE int HTBufferWriter_free (HTOutputStream * me){    return HTBufferWriter_lazyFlush(me);}PRIVATE BOOL HTBufferWriter_addBuffer(HTOutputStream * me, int addthis){    if (me) {        me->allocated += (addthis - addthis%me->growby + (me->growby*me->expo));	me->expo *= 2;	HTTRACE(STREAM_TRACE, "Buffer...... Increasing buffer to %d bytes\n" _ me->allocated);        if (me->data) {            int size = me->read-me->data;            if ((me->data = (char *) HT_REALLOC(me->data, me->allocated)) == NULL)                HT_OUTOFMEM("HTBufferWriter_addBuffer");            me->read = me->data + size;        } else {            if ((me->data = (char *) HT_CALLOC(1, me->allocated)) == NULL)                HT_OUTOFMEM("HTBufferWriter_addBuffer");            me->read = me->data;        }       return YES;    }    return NO;}PRIVATE int HTBufferWriter_abort (HTOutputStream * me, HTList * e){    HTTRACE(STREAM_TRACE, "Buffer...... ABORTING...\n");    if (me->timer) {	HTTimer_delete(me->timer);	me->timer = NULL;    }    if (me->target) (*me->target->isa->abort)(me->target, e);    return HT_ERROR;}PRIVATE int HTBufferWriter_write (HTOutputStream * me, const char * buf, int len){    int status;    while (1) {	int available = me->data + me->allocated - me->read;	/* If we have enough buffer space */	if (len <= available) {	    int size = 0;	    memcpy(me->read, buf, len);	    me->read += len;        	    /* If we have accumulated enough data then flush */	    if ((size = me->read - me->data) > me->growby) {		me->lastFlushTime = HTGetTimeInMillis();		status = PUTBLOCK(me->data, size);		if (status == HT_OK) {		    me->read = me->data;		} else {		    return (status == HT_WOULD_BLOCK) ? HT_OK : HT_ERROR;		}	    }	    return HT_OK;	} else {	    /* Fill the existing buffer (if not already) and flush */	    if (available) {		memcpy(me->read, buf, available);		buf += available;		len -= available;		me->read += available;	    }	    me->lastFlushTime = HTGetTimeInMillis();	    status = PUTBLOCK(me->data, me->allocated);	    if (status == HT_OK) {		me->read = me->data;	    } else if (status == HT_WOULD_BLOCK) {		HTBufferWriter_addBuffer(me, len);		memcpy(me->read, buf, len);		me->read += len;		return HT_OK;	    }	}    }}/*	Character handling**	------------------*/PRIVATE int HTBufferWriter_put_character (HTOutputStream * me, char c){    return HTBufferWriter_write(me, &c, 1);}/*	String handling**	---------------****	Strings must be smaller than this buffer size.*/PRIVATE int HTBufferWriter_put_string (HTOutputStream * me, const char * s){    return HTBufferWriter_write(me, s, (int) strlen(s));}/***	The difference between the close and the free method is that we don't**	close the connection in the free method - we only call the free method**	of the target stream. That way, we can keep the output stream as long **	as the channel itself.*/PRIVATE int HTBufferWriter_close (HTOutputStream * me){    if (me) {	if (me->timer) {	    HTTimer_delete(me->timer);	    me->timer = NULL;	}	if (me->target) (*me->target->isa->close)(me->target);	HT_FREE(me->data);	HT_FREE(me);    }    return HT_OK;}PRIVATE const HTOutputStreamClass HTBufferWriter ={		    "BufferedSocketWriter",    HTBufferWriter_lazyFlush,    HTBufferWriter_free,    HTBufferWriter_abort,    HTBufferWriter_put_character,    HTBufferWriter_put_string,    HTBufferWriter_write,    HTBufferWriter_close}; PRIVATE HTOutputStream * buffer_new (HTHost * host, HTChannel * ch,				     void * param, int bufsize){    if (host && ch) {	HTOutputStream * me = HTChannel_output(ch);	if (!me) {	    HTOutputStream * me;	    int tcpbufsize = 0;#if defined(HAVE_GETSOCKOPT) && defined(SO_SNDBUF)	    /*	    ** Get the TCP socket buffer size	    */	    {		SOCKET sockfd = HTChannel_socket(ch);		int size = sizeof(int);		int status = getsockopt(sockfd, SOL_SOCKET, SO_SNDBUF,					(void *) &tcpbufsize, &size);		if (status == -1) {		    HTTRACE(STREAM_TRACE, "Socket...... Could not get TCP send buffer size for socket %d\n" _ sockfd);		} else {		    HTTRACE(STREAM_TRACE, "Socket...... TCP send buffer size is %d for socket %d\n" _ tcpbufsize _ sockfd);		}			    }#endif	    if (bufsize <= 0) bufsize = tcpbufsize ? tcpbufsize : OUTPUT_BUFFER_SIZE;	    if ((me = (HTOutputStream *) HT_CALLOC(1, sizeof(HTOutputStream)))==NULL ||		(me->data = (char *) HT_MALLOC(bufsize)) == NULL)		HT_OUTOFMEM("HTBufferWriter_new");	    me->isa = &HTBufferWriter;	    me->read = me->data;	    me->allocated = bufsize;            me->growby = bufsize;	    me->expo = 1;	    me->host = host;           return me;	}    }    return NULL;}PUBLIC HTOutputStream * HTBufferWriter_new (HTHost *	       	host,					    HTChannel * 	ch,					    void * 		param,					    int 		bufsize){    HTOutputStream * me = buffer_new(host, ch, param, bufsize);    if (me) {	me->target = HTWriter_new(host, ch, param, 0);	return me;    }    return NULL;}PUBLIC HTOutputStream * HTBufferConverter_new (HTHost * 	host,					       HTChannel * 	ch,					       void * 		param,					       int 		bufsize,					       HTOutputStream * target){    if (target) {	HTOutputStream * me = buffer_new(host, ch, param, bufsize);	if (me) {	    me->target = target;	    return me;	}    }    return NULL;}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美亚洲国产怡红院影院| 欧美美女激情18p| 天天影视涩香欲综合网| 中文字幕乱码日本亚洲一区二区| 在线一区二区三区四区五区| 国产一区二三区好的| 一区二区免费在线播放| 国产三级一区二区三区| 欧美一级高清片在线观看| 色综合久久六月婷婷中文字幕| 国产在线视频一区二区三区| 无码av免费一区二区三区试看| 国产精品福利一区二区三区| 精品国产乱码久久久久久图片| 欧美日韩五月天| 91麻豆.com| 成人免费av网站| 国产传媒日韩欧美成人| 蜜桃av噜噜一区| 午夜精品久久久久久久99水蜜桃 | 国产亚洲污的网站| 欧美另类一区二区三区| 91久久香蕉国产日韩欧美9色| 国产91丝袜在线播放九色| 久久精品久久综合| 日本v片在线高清不卡在线观看| 亚洲国产精品影院| 亚洲电影一区二区| 亚洲曰韩产成在线| 亚洲自拍偷拍图区| 亚洲精品国久久99热| 亚洲天堂2016| 亚洲情趣在线观看| 亚洲人成7777| 亚洲乱码国产乱码精品精98午夜| 中文字幕日本不卡| 中文字幕亚洲在| 亚洲欧洲av一区二区三区久久| 中文字幕国产一区| 中文字幕在线观看不卡| 日韩一区二区免费视频| 天堂成人国产精品一区| 偷拍自拍另类欧美| 丝袜美腿一区二区三区| 午夜欧美视频在线观看| 青青草原综合久久大伊人精品 | 欧美精品自拍偷拍动漫精品| 欧美系列一区二区| 欧美日韩高清一区二区| 日韩欧美自拍偷拍| 久久久午夜电影| 国产欧美日韩麻豆91| 最新中文字幕一区二区三区| 亚洲同性gay激情无套| 亚洲欧美日韩系列| 婷婷国产在线综合| 久久精品国产第一区二区三区| 国产综合色在线视频区| 成人免费视频一区| 色激情天天射综合网| 欧美日韩国产成人在线免费| 精品久久人人做人人爽| 亚洲免费在线观看| 菠萝蜜视频在线观看一区| 99久久99久久免费精品蜜臀| 91久久线看在观草草青青| 88在线观看91蜜桃国自产| 精品国产乱码久久久久久1区2区| 国产人成一区二区三区影院| 亚洲欧美日韩在线| 蜜桃av噜噜一区| 成人免费三级在线| 欧美日韩免费在线视频| 精品国产1区二区| 亚洲啪啪综合av一区二区三区| 亚洲国产精品自拍| 国产大陆亚洲精品国产| 欧美丝袜丝交足nylons| 久久久久久久久久久99999| 亚洲精品高清在线观看| 久久精品99国产精品| 97久久超碰精品国产| 日韩一区二区三免费高清| 中文av一区二区| 日韩黄色小视频| 99麻豆久久久国产精品免费| 91精品国产综合久久久蜜臀粉嫩 | 97精品电影院| 色伊人久久综合中文字幕| 777午夜精品免费视频| 国产女同性恋一区二区| 亚洲h精品动漫在线观看| 国产麻豆午夜三级精品| 欧美三级三级三级| 国产精品乱人伦| 老司机免费视频一区二区三区| 色婷婷国产精品综合在线观看| 精品国产一区久久| 亚洲成人激情综合网| 丁香婷婷综合五月| 日韩久久精品一区| 亚洲一区视频在线| 99在线精品观看| 久久人人97超碰com| 午夜精品影院在线观看| 91网站最新地址| 国产亚洲欧美在线| 久久99精品一区二区三区三区| 欧美丝袜丝nylons| 亚洲欧美综合色| 国产成人免费视频一区| 欧美大黄免费观看| 日韩va欧美va亚洲va久久| 91福利国产精品| 成人欧美一区二区三区| 国产乱码精品一区二区三区av | 国产欧美精品一区| 久久不见久久见中文字幕免费| 欧美三级电影在线看| 一区二区三区资源| 91亚洲精品一区二区乱码| 久久久不卡网国产精品一区| 久久国产尿小便嘘嘘尿| 日韩亚洲欧美在线观看| 午夜av一区二区三区| 在线亚洲人成电影网站色www| 国产精品久久久久国产精品日日| 国产一区激情在线| 久久日韩粉嫩一区二区三区| 国模冰冰炮一区二区| 精品成人私密视频| 国产呦萝稀缺另类资源| 久久影音资源网| 国产乱人伦偷精品视频不卡| 精品成人免费观看| 国产伦精品一区二区三区视频青涩 | 免费欧美日韩国产三级电影| 欧美电影在线免费观看| 日韩精品免费专区| 日韩一级片网址| 蓝色福利精品导航| 国产午夜精品一区二区三区嫩草 | 久久久久九九视频| 国产91精品露脸国语对白| 国产精品你懂的在线欣赏| 972aa.com艺术欧美| 一区二区三区波多野结衣在线观看| 在线免费亚洲电影| 日韩激情视频在线观看| 精品久久一二三区| 成人黄色777网| 一区二区日韩av| 91精品国产综合久久福利| 精品一区二区三区免费观看| 国产亚洲一区字幕| 91视视频在线直接观看在线看网页在线看| 亚洲精品乱码久久久久久久久 | 欧美日韩一级黄| 美女性感视频久久| 日本一二三不卡| 欧美亚洲自拍偷拍| 蜜桃精品视频在线观看| 欧美激情在线看| 欧美影院精品一区| 久久99国产精品尤物| 亚洲欧洲精品天堂一级| 欧美日韩精品一区二区| 麻豆一区二区三| 国产精品日韩精品欧美在线| 欧美专区日韩专区| 国产一级精品在线| 亚洲综合视频网| 精品国产三级a在线观看| 99久久99久久综合| 欧美96一区二区免费视频| 国产精品理伦片| 欧美一区二区三区免费在线看| 国产99一区视频免费| 亚洲成av人片| 日本一区二区三区电影| 这里只有精品视频在线观看| 成人av手机在线观看| 天天色综合成人网| 中文字幕在线观看不卡| 日韩欧美成人激情| 97久久精品人人澡人人爽| 久久成人久久爱| 亚洲国产精品一区二区www| 久久久久99精品一区| 欧美区一区二区三区| 国产99久久精品| 青青草91视频| 亚洲免费伊人电影| 国产亚洲欧美中文| 日韩美女在线视频| 欧美日韩一区二区在线视频| 国产91丝袜在线观看| 久久国产福利国产秒拍| 亚洲成人中文在线| 最好看的中文字幕久久|