⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 htdemux.c

📁 www工具包. 这是W3C官方支持的www支撑库. 其中提供通用目的的客户端的WebAPI: complete HTTP/1.1 (with caching, pipelining, PUT, POS
💻 C
字号:
/***	MUX HEADER PARSER STREAM****	(c) COPYRIGHT MIT 1995.**	Please first read the full copyright statement in the file COPYRIGH.**	@(#) $Id: HTDemux.c,v 2.3 1999/02/22 22:10:11 frystyk Exp $****	This stream parses MUX headers.**** Authors**	HFN	Henrik Frystyk Nielsen <frystyk@w3.org>**** History:**	Oct 96	Written*//* Library include files */#include "wwwsys.h"#include "WWWUtil.h"#include "WWWCore.h"#include "HTMuxHeader.h"#include "HTMuxCh.h"#include "HTDemux.h"					 /* Implemented here */struct _HTStream {    const HTStreamClass *	isa;    HTHost *			host;    HTMuxChannel *		muxch;    HTMuxSession *		session;    int				next;			      /* Next header */};/* ------------------------------------------------------------------------- *//***  Parse through the buffer, identify the headers, and distribute the**  data on the virtual session input streams*/PRIVATE int HTDemux_write (HTStream * me, const char * buf, int len){    HTMuxChannel * muxch = me->muxch;    int length = 0;    while (len > 0) {	/*	**  Look for the next header. If this is the first time through then	**  we expect the stream of data to start with a header.	*/	if (!me->next) {	    HTMuxHeader header[2];	    HTMuxSessionId sid = INVSID;	    header[0] = HT_WORDSWAP(*(HTMuxHeader *) buf);	    /*	    **  If the long bit is set then we expect another 32 bits as the	    **  length of the payload	    */	    if (MUX_IS_LONG(header[0])) {		header[1] = HT_WORDSWAP(*(HTMuxHeader *) (buf+1));		me->next = MUX_LONG_ALIGN(header[1]);		buf += 8, len -= 8;	    } else {		me->next = MUX_ALIGN(MUX_GET_LEN(header[0]));		buf += 4, len -= 4;	    }	    length = HTMIN(len, me->next);	    sid = MUX_GET_SID(header[0]);	    HTTRACE(MUX_TRACE, "Demux stream Header: %x, sid %d, length %d\n" _ header[0] _ length _ sid);	    /*	    **  If this is a control message then handle it here	    */	    if (header[0] & MUX_CONTROL) {		if (header[0] & MUX_STRING) {		    ; /* Define the string */		    		} else if (header[0] & MUX_STACK) {				    ; /* Define the stack */		} else if (header[0] & MUX_FRAGMENT) {		    HTMuxSession_setFragment(muxch, sid, MUX_GET_LEN(header[0]));		} else if (header[0] & MUX_CREDIT) {		    HTMuxSession_setCredit(muxch, sid, header[1]);		}	    } else if (header[0] & MUX_SYN) {		me->session = HTMuxSession_register(muxch, sid, MUX_GET_PID(header[0]));	    } else if (header[0] & MUX_FIN) {		me->session = HTMuxChannel_findSession(muxch, sid);		HTMuxSession_setClose(me->muxch, me->session, MUX_S_END_READ);	    } else		me->session = HTMuxChannel_findSession(muxch, sid);	}	/*	**  If there is data on this session then handle it here.	*/	if (me->next && me->session) {	    if (HTMuxSession_disposeData(me->session, buf, length) == 1) {		HTMuxChannel_sendControl(muxch, HTMuxSession_id(me->session),					 MUX_CREDIT, DEFAULT_CREDIT, NULL, 0);	    } 	}	buf += length, len -= length, me->next -= length;    }    return HT_OK;}PRIVATE int HTDemux_put_character (HTStream * me, char c){    return HTDemux_write(me, &c, 1);}PRIVATE int HTDemux_put_string (HTStream * me, const char * s){    return HTDemux_write(me, s, (int) strlen(s));}PRIVATE int HTDemux_flush (HTStream * me){    return HT_OK;}PRIVATE int HTDemux_free (HTStream * me){    return HT_IGNORE;}PRIVATE int HTDemux_abort (HTStream * me, HTList * e){    return HT_IGNORE;}PRIVATE const HTStreamClass HTDemux ={		    "Demux",    HTDemux_flush,    HTDemux_free,    HTDemux_abort,    HTDemux_put_character,    HTDemux_put_string,    HTDemux_write}; PUBLIC HTStream * HTDemux_new (HTHost * host, HTMuxChannel * muxch){    HTStream * me = NULL;    if (muxch) {	if ((me = (HTStream *) HT_CALLOC(1, sizeof(HTStream))) == NULL)	    HT_OUTOFMEM("HTDemux_new");	me->isa = &HTDemux;	me->host = host;	me->muxch = muxch;	    }    return me;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -