青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

socketref,再見!高德

https://github.com/adoggie

  C++博客 :: 首頁 :: 聯系 :: 聚合  :: 管理
  246 Posts :: 4 Stories :: 312 Comments :: 0 Trackbacks

常用鏈接

留言簿(54)

我參與的團隊

搜索

  •  

最新評論

閱讀排行榜

評論排行榜

#define OUT
#define INOUT
#define IN

#define INIT_LIST_HEAD(x)?? ?

#define btsc_TRUE ?? ?0
#define btsc_FALSE?? ?1
#define btsc_NULL ?? ?0

struct list_head{
?? ?struct list_head* prev,*next;
};


struct btsc_Property{
?? ?char * ?? ??? ?name;
?? ?char * ?? ??? ?value;?? ??? ?
};


struct btsc_Packet{
?? ?/*struct list_head?? ?list;*/
?? ?struct btsc_Property** ?? ?properties;
?? ?int?? ??? ??? ??? ?size;
?? ?int?? ??? ??? ??? ?capacity;
?? ?struct btsc_Context?? ?*?? ?ctx;
};

struct btsc_Packet* ?? ?btsc_Packet_Alloc(struct btsc_Context* );
void?? ??? ??? ??? ??? ?btsc_Packet_Free(struct btsc_Packet*);

struct btsc_Property*?? ?btsc_Property_Alloc(struct btsc_Context* ,char * name,char * value);
void?? ??? ??? ??? ??? ?btsc_Property_Free(struct btsc_Property*);


struct btsc_Property* ?? ?btsc_Property_Get(struct btsc_Packet* packet,char * name); ?? ?
void?? ??? ??? ??? ??? ?btsc_Property_Append(struct btsc_Packet* packet,struct btsc_Property * );


struct btsc_Context{
?? ?void (*tx)(struct btsc_Context*,unsigned char * data,int len);?? ??? ?
?? ?int (*notifier)(struct btsc_Packet* packet);/*外部釋放packet,返回NULL*/?? ??? ?
?? ?int?? ??? ?packet_cached_size;
?? ?int?? ??? ?recv_cached_capacity;?? ??? ??? ??? ??? ??? ?
?? ?char*?? ?recv_buff;?? ??? ??? ??? ??? ??? ??? ??? ??? ?
?? ?int?? ??? ?recv_size;?? ??? ?
?? ?void*?? ?user;?? ?// 外部數據傳遞?? ??? ??? ??? ??? ??? ??? ?
};


int ?? ?btsc_init(struct btsc_Context* IN ctx);?? ?
void ?? ?btsc_cleanup(struct btsc_Context* IN ctx);
int?? ??? ?btsc_Pack(struct btsc_Context* IN ctx,struct btsc_Packet* packet,unsigned char * INOUT buff,int* INOUT size);?? ?
void?? ?btsc_Parse(struct btsc_Context* , char * data,int len);


#define BTSC_PACKET_BEGIN(ctx) {\
?? ??? ??? ??? ??? ??? ??? ??? ?struct btsc_Context* _ctx_internel;\
?? ??? ??? ??? ??? ??? ??? ??? ?struct btsc_Packet * _pkt ;\
?? ??? ??? ??? ??? ??? ??? ??? ?_ctx_internel= (ctx);\
?? ??? ??? ??? ??? ??? ??? ??? ?_pkt = btsc_Packet_Alloc(_ctx_internel);
?? ??? ??? ??? ??? ??? ??? ??? ?
/* key is not suitable for vairable*/?? ??? ??? ??? ??? ??? ??? ??? ?
#define BTSC_NEW_PROPERTY(key,value)?? ?{\
?? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ?struct btsc_Property * _ppt =btsc_Property_Alloc(_ctx_internel,key,value);\
?? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ?btsc_Property_Append(_pkt,_ppt);\
?? ??? ??? ??? ??? ??? ??? ??? ??? ??? ?}
#define BTSC_PACKET_END()?? ??? ?btsc_Pack(_ctx_internel,_pkt,btsc_NULL,0);\
?? ??? ??? ??? ??? ??? ??? ??? ?btsc_Packet_Free(_pkt);\
?? ??? ??? ??? ??? ??? ??? ??? ?}

#define BTSC_FOREACH(packet,ppt)?? ?{\
?? ??? ??? ??? ??? ??? ??? ??? ??? ?int n;\
?? ??? ??? ??? ??? ??? ??? ??? ??? ?for(n=0;n<packet->size;n++){\
?? ??? ??? ??? ??? ??? ??? ??? ??? ??? ?ppt = packet->properties[n];
#define BTSC_END_FOREACH()?? ??? ??? ?}\
?? ??? ??? ??? ??? ??? ??? ??? ?}








/*
??? name:??? ??? ??? btsc
??? ??? ??? ??? ??? serial communicating? with bluetooth and app-user
??? desc:??? ??? ??? pair parameter codec
???
??? ??? packet=[ key:name,...]
??? ???
??? implemented: ??? zhangbin ,? 3 hours occupied
??? date:??? ??? ??? 2007-01-26
*/

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#ifdef _UNIX
#include <unistd.h>
#endif
#include "btsc.h"

#define PACKET_HEAD??? ??? '<'
#define PACKET_TAIL??? ??? '>'
#define PROPERTY_DELIMITER??? ','
#define PAIR_DELIMITER??? ??? '='
#define ESCAPE_CHAR??? ??? ??? '\\'


int calcEscapleLength(char * str);
char* escape_copy(char * dest,char * src);
void trim_escape_copy(char * dest,char * src,int size);
int? calcPacketLength(struct btsc_Packet* pkt);
int??? is_escape_char(char c);
void parseProperty(struct btsc_Packet * pkt,char * s,char * e);
void parsePacket(struct btsc_Context* ctx,char * s,char* e);
char* ??? __memchr(char * s,char* e,char c);

char escape_ch_table[]={PACKET_HEAD,PACKET_TAIL,PROPERTY_DELIMITER,PAIR_DELIMITER,ESCAPE_CHAR,'\0'};

struct btsc_Packet* ??? btsc_Packet_Alloc(struct btsc_Context* ctx){???
??? struct btsc_Packet * pt = malloc(sizeof(struct btsc_Packet));??? ???
??? pt->size = 0;
??? pt->capacity = ctx->packet_cached_size;
??? pt->properties=malloc(pt->capacity*sizeof(struct btsc_Property*));???
??? pt->ctx = ctx;
??? return pt;???
}

void??? btsc_Packet_Free(struct btsc_Packet* pt){???
??? struct btsc_Property** tmp;
??? if( !pt ) ??? return ;
??? tmp = pt->properties;
??? while(pt->size--){
??? ??? btsc_Property_Free(*tmp++);??? ??? ??? ???
??? }??? ???
??? if( pt->properties){
??? ??? free(pt->properties);?
??? }
??? free(pt);
}


struct btsc_Property*??? btsc_Property_Alloc(struct btsc_Context* ctx,char * name,char * value){
??? struct btsc_Property * ppt;
??? printf("enter btsc_Property_Alloc()\n");
??? ppt = malloc( sizeof( struct btsc_Property) );
??? if(!ppt)??? printf("error: malloc failed (s1)\n");
??? ppt->name = malloc( strlen(name)+1);
??? if( !ppt->name ) printf("error: malloc failed (s2)\n");
??? strcpy(ppt->name,name);???
??? ppt->value = malloc( strlen(value)+1);
??? if( !ppt->value) printf("error: malloc failed (s3),str:%s, len: %d\n",value,strlen(value)+1);
??? strcpy( ppt->value,value);
??? return ppt;
}

void??? ??? btsc_Property_Free(struct btsc_Property* ppt){
??? if( !ppt )??? return;
??? free( ppt->name);
??? free( ppt->value);
??? free( ppt);
}

/* scan pointer array */
struct btsc_Property* ??? btsc_Property_Get(struct btsc_Packet* pkt,char * name){
??? int size;
??? struct btsc_Property* ppt;
??? size = pkt->size;
??? while(size--){
??? ??? ppt = pkt->properties[size];
??? ??? if( !strcmp( name, ppt->name ) ){
??? ??? ??? return ppt;/*that's ok */
??? ??? }
??? }
??? return btsc_NULL;
}

/* low effeciency, memory allocation,more costs*/
void??? btsc_Property_Append(struct btsc_Packet* pt,struct btsc_Property * ppt){
??? struct btsc_Property** tmpppt;
??? if( pt->size==pt->capacity){ ??? ???
??? ??? pt->capacity += pt->ctx->packet_cached_size;???
??? ??? tmpppt = pt->properties;??? ???
??? ??? pt->properties = malloc( pt->capacity * sizeof( struct btsc_Property**) );
??? ??? memcpy( pt->properties, tmpppt, pt->size * sizeof( struct btsc_Property**));
??? ??? free( tmpppt);
??? }
??? pt->properties[pt->size++]=ppt;???
}

int ??? btsc_init(struct btsc_Context* ctx){???
??? ctx->packet_cached_size = 10;???
??? if( ctx->recv_cached_capacity==0){
??? ??? ctx->recv_cached_capacity = 1024*2;???
??? }
??? ctx->recv_buff = malloc( ctx->recv_cached_capacity );
??? ctx->recv_size = 0;
??? return btsc_TRUE;
}

void ??? btsc_cleanup(struct btsc_Context* ctx){
??? free(ctx->recv_buff);???
}

/*
**??? name:??? calcEscapleLength
**??? desc:??? 計算含轉義字符串長度
*/
int ??? calcEscapleLength(char * str){
??? int len;
??? char * pesc;
??? len = 0;???
??? while( *str ){
??? ??? pesc = escape_ch_table;
??? ??? while( *pesc ){
??? ??? ??? if( *pesc==*str){
??? ??? ??? ??? len++;
??? ??? ??? ??? break;
??? ??? ??? }
??? ??? ??? pesc++;
??? ??? }??? ???
??? ??? str++;
??? }???
??? return len;
}


char* escape_copy(char * dest,char * src){
??? char * pesc;
??? while( *src ){
??? ??? pesc = escape_ch_table;
??? ??? while( *pesc ){
??? ??? ??? if( *pesc==*src){
??? ??? ??? ??? *dest++=ESCAPE_CHAR;
??? ??? ??? ??? break;
??? ??? ??? }
??? ??? ??? pesc++;
??? ??? }
??? ??? *dest++=*src++;??? ??? ??? ???
??? }???
??? return dest;???
}

void trim_escape_copy(char * dest,char * src,int size){
??? int last_escape = btsc_FALSE;
??? while( size--){
??? ??? if( *src == ESCAPE_CHAR && last_escape != btsc_TRUE){??? ???
??? ??? ??? last_escape = btsc_TRUE??? ;
??? ??? ??? src++;
??? ??? ??? continue;
??? ??? }
??? ??? last_escape = btsc_FALSE;
??? ??? *dest++=*src++;??? ???
??? }
}

int?? ??? calcPacketLength(struct btsc_Packet* pkt){
??? int len;
??? int size;
??? struct btsc_Property* ppt;???
??? len = 0;
??? size = pkt->size;
??? while( size--){
??? ??? ppt = pkt->properties[size];???
??? ??? len+=strlen(ppt->name)+strlen(ppt->value);???

??? ??? len+= calcEscapleLength(ppt->name);
??? ??? len+= calcEscapleLength(ppt->value);???
??? }
??? len+= pkt->size*2+1;
??? return? len;
}


int??? ??? btsc_Pack(struct btsc_Context*? ctx,struct btsc_Packet* pkt,unsigned char * obuff,int* osize){
??? struct btsc_Property* ppt;
??? int size;
??? int len;
??? unsigned char * buff;
??? char * pbuff;
??? len = calcPacketLength( pkt);
??? buff = malloc( len );
??? size = pkt->size;
??? pbuff = (char*)buff;
??? *pbuff++=PACKET_HEAD;???
??? while( size--){
??? ??? ppt = pkt->properties[size];???
??? ??? pbuff = escape_copy(pbuff,ppt->name);
??? ??? *pbuff++=PAIR_DELIMITER;
??? ??? pbuff = escape_copy(pbuff,ppt->value);
??? ??? if( size ){
??? ??? ??? *pbuff++=PROPERTY_DELIMITER;??? ??? ???
??? ??? }
??? }
??? *pbuff = PACKET_TAIL;
??? if( ctx->tx ){
??? ??? ctx->tx(ctx,buff,len);
??? }
??? if( obuff && *osize >=len){
??? ??? memcpy( obuff, buff ,len);
??? ??? *osize = len;
??? }

??? free(buff);
??? return btsc_TRUE;???
}

/* e not in range*/
char* ??? __memchr(char * s,char* e,char c){
??? while( s!=e){
??? ??? if( *s == c){
??? ??? ??? return s;
??? ??? }??? ???
??? ??? s++;
??? }
??? return btsc_NULL;
}

int??? ??? is_escape_char(char c){
??? return btsc_FALSE;???
}

/*
??? name: parseProperty
??? desc: 指定內存范圍中提取屬性? key=>value
??? ??? 搜索包含e
??? params:???
??? ??? pkt??? --??? 消息數據包
??? ??? s??? --??? 起始內存地址
??? ??? e??? --??? 結束地址 ,
*/
void parseProperty(struct btsc_Packet * pkt,char * s,char * e){
??? char * p1,*p2;
??? int n;
??? struct btsc_Property*??? ppt;
??? p1 = s ;
??? p2 = e;
__REPEAT:???
??? p1 = __memchr(p1,e+1,PAIR_DELIMITER);
??? if( p1 ){
??? ??? if( *(p1-1) == ESCAPE_CHAR ){
??? ??? ??? p1++;
??? ??? ??? goto __REPEAT;
??? ??? }
??? ??? ppt = malloc( sizeof( struct btsc_Property ));
??? ??? n = p1-s; ??? ???
??? ??? ppt->name = malloc( n+1 );
??? ??? memset(ppt->name,0,n+1);??? ???
??? ??? trim_escape_copy(ppt->name,s,n);
??? ???
??? ??? n =e-p1;
??? ??? ppt->value = malloc( n+1);
??? ??? memset(ppt->value,0,n+1);
??? ??? trim_escape_copy(ppt->value,p1+1,n);
??? ???
??? ??? btsc_Property_Append(pkt,ppt);
??? }
}

/*
??? name: parsePacket
??? desc:??? 分解指定內存到包結構
??? ??? ??? 成功分解出包立刻回送到應用接收者 ( btsc_Context::notifier)
??? param:
??? ??? s,e ??? 內存地址 (處e)

** 緩沖區還需進一步測試,包括緩沖區大小調節, 不完整協議包格式的容錯
*/
void ??? parsePacket(struct btsc_Context* ctx,char * s,char* e){
??? char *p,*p1,*p2;
??? struct btsc_Packet * pkt;
??? if( e-s <=1 ){
??? ??? return ;
??? }
??? pkt = btsc_Packet_Alloc(ctx);
???
??? p1 = s+1;
??? p2 = e-1;
??? p = p1;
__REPEAT:???
??? p = __memchr(p,e,PROPERTY_DELIMITER);
??? if( p ){
??? ??? if( *(p-1)==ESCAPE_CHAR){
??? ??? ??? p = p+1;
??? ??? ??? goto __REPEAT;
??? ??? }
??? ??? parseProperty(pkt,p1,p-1);
??? ??? p1 = ++p;
??? ??? goto __REPEAT;
??? }
??? /*allow one property reside in*/
??? parseProperty(pkt,p1,e-1);
??? if( ctx->notifier ){
??????? if(ctx->notifier(pkt)){ /* nonzero value, delete internal*/
??????????? btsc_Packet_Free(pkt);??? ???????
??????? }
??? }else{
??? ?? btsc_Packet_Free(pkt);???
??? }
}

void??? btsc_Parse(struct btsc_Context* ctx, char * data,int size){
??? int len ;
_RESTART:
??? while( size ){
??? ??? len = ctx->recv_cached_capacity - ctx->recv_size;
??? ??? if( len >0){
??? ??? ??? if( size <= len){
??? ??? ??? ??? len = size;
??? ??? ??? ??? size = 0;
??? ??? ??? }else{
??? ??? ??? ??? size-=len;
??? ??? ??? }
??? ??? ??? memcpy( ctx->recv_buff+ctx->recv_size,data,len);
??? ??? ??? ctx->recv_size+=len;
??? ??? ??? data+=len;
??? ??? }???
??? ???
??? ??? {
??? ??? ??? char * p1,*p2;??? ??? ???
_RESCAN:??? ??? ???
??? ??? ??? p1 = ctx->recv_buff;
_RESCAN_HEAD:??? ??? ??? ?
??? ??? ??? p1 = __memchr(p1,ctx->recv_buff+ctx->recv_size,PACKET_HEAD);??? ??? ???
??? ??? ??? if( !p1 ){
??? ??? ??? ??? ctx->recv_size =0;
??? ??? ??? ??? if( size ){
??? ??? ??? ??? ??? goto _RESTART;
??? ??? ??? ??? }
??? ??? ??? }
??? ??? ??? if( p1>ctx->recv_buff && *(p1-1)==ESCAPE_CHAR){ /* "\<" */
??? ??? ??? ??? p1++;
??? ??? ??? ??? goto _RESCAN_HEAD;???
??? ??? ??? }
??? ??? ???
??? ??? ??? /*move backward*/
??? ??? ??? ctx->recv_size -=(p1-ctx->recv_buff);
??? ??? ??? memmove(ctx->recv_buff,p1, ctx->recv_size);
??? ??? ??? p1=ctx->recv_buff;
??? ??? ??? p2 = p1+1;
_RESCAN_TAIL:??? ??? ???
??? ??? ??? p2 = __memchr(p2,ctx->recv_buff+ctx->recv_size,PACKET_TAIL);
??? ??? ??? if( !p2 ){
??? ??? ??? ??? if( ctx->recv_size == ctx->recv_cached_capacity ){
??? ??? ??? ??? ??? ctx->recv_size? = 0;
??? ??? ??? ??? }
??? ??? ??? ??? goto _RESTART;
??? ??? ??? }
??? ??? ??? if( *(p2-1) == ESCAPE_CHAR ){
??? ??? ??? ??? p2++;
??? ??? ??? ??? goto _RESCAN_TAIL;???
??? ??? ??? }
??? ??? ???
??? ??? ??? parsePacket(ctx,p1,p2);
??? ??? ??? ctx->recv_size -=p2-p1+1;
??? ??? ??? if( ctx->recv_size ){
??? ??? ??? ??? memmove(ctx->recv_buff,p2+1,ctx->recv_size);
??? ??? ??? ??? goto _RESCAN;
??? ??? ??? }??? ??? ??? ?
??? ??? }??? ???
??? }
}

/*?? debug */
#ifdef _DEBUGX
void tx(unsigned char * data,int len);
void notifier(struct btsc_Packet* packet);
/*初始化上下文, tx=發送處理函數,notifier=接收函數*/
struct btsc_Context c={tx:tx,notifier:notifier};

/*測試數據接收并解析*/
void rx(){???
??? ?char * msg="<MSG=HELLO,NAME=SCOTT>"
??? ???? ??? ??? "<MSG2=HELLO2,NAME2=SCOTT2>"
??? ???? ??? ??? "<MSG3=HELLO3,NAME3=SCOTT3>"; /*simulating data*/
??? int len = strlen(msg);
??? btsc_Parse(&c,msg,len);
}
/*發送處理過程*/
void tx(unsigned char * buff,int len){???
??? char *outmsg = malloc(1024*10);
??? memset(outmsg,0,1024*10);
??? memcpy(outmsg,buff,len);
??? printf("encode str: %s\n",outmsg);
??? free(outmsg);
??? btsc_Parse(&c,buff,len);
}

void notifier(struct btsc_Packet* packet){
??? struct btsc_Property * ppt;
??? ppt = btsc_Property_Get(packet,"MSG");
??? if(ppt)
??? ??? printf("property get: MSG=>%s\n",ppt->value);
??? /*遍歷包內屬性參數*/
??? BTSC_FOREACH(packet,ppt);
??? printf("packet: %s=>%s\n",ppt->name,ppt->value);
??? BTSC_END_FOREACH();
}

int main(){
??? int r;
??? /*optional*/
??? c.recv_cached_capacity = 1024; /*初始化接收緩沖區大小 byte*/
??? c.packet_cached_size = 5;??? /*消息包緩沖屬性個數*/
??? btsc_init(&c);??? ??? ??? /*上下文初始化*/
??? puts("test rx()...");
??? rx();??? /*接*/
??? puts("escape testing...");???
??? do{
??? ??? /*構造消息包,并完成發送*/
??? ??? BTSC_PACKET_BEGIN(&c);
??? ??? BTSC_NEW_PROPERTY("MSG","calling");

??? ??? BTSC_PACKET_END();???
??? ??? usleep(1000*50);
??? ??? printf(">>seq:%d\n",r);
??? }while(0);
??? ???
??? btsc_cleanup(&c);???
???
??? return 0;
}


#endif

posted on 2007-02-23 22:54 放屁阿狗 閱讀(1099) 評論(0)  編輯 收藏 引用 所屬分類: C++/Boost/STL/Template
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            午夜视频在线观看一区| 欧美激情欧美狂野欧美精品| 久久中文字幕一区| 欧美专区一区二区三区| 国产精品网曝门| 欧美午夜大胆人体| 国产欧美精品xxxx另类| 欧美sm视频| 欧美成人精品1314www| 每日更新成人在线视频| 欧美韩国在线| 亚洲人成亚洲人成在线观看图片| 性欧美xxxx视频在线观看| 午夜精品久久久久| 欧美高清视频一区| 欧美尤物一区| 欧美日韩中文另类| 黄色成人小视频| 亚洲裸体视频| 久久精品亚洲精品| 国产精品久久久久影院色老大| 韩日欧美一区| 久久久美女艺术照精彩视频福利播放| 亚洲精品日日夜夜| 麻豆精品91| 国产日韩在线一区| 99国产精品视频免费观看| 能在线观看的日韩av| 一区二区精品在线| 免费永久网站黄欧美| 伊人精品视频| 久久久91精品| 久久久久久97三级| 一区二区亚洲精品| 蜜臀va亚洲va欧美va天堂| 久久精品亚洲精品| 在线观看免费视频综合| 免费成人在线观看视频| 欧美不卡福利| 亚洲特色特黄| 欧美一区二区视频97| 国产一区二区日韩| 国产精品视频一区二区高潮| 欧美专区亚洲专区| 久久精品免费观看| 99精品欧美一区二区三区| 日韩午夜免费视频| 国内精品久久久久影院薰衣草| 久久偷看各类wc女厕嘘嘘偷窃| 噜噜噜91成人网| 欧美一区二区精美| 欧美激情精品久久久久久| 久久国产精品亚洲va麻豆| 久久婷婷综合激情| 性久久久久久久久| 欧美精品videossex性护士| 欧美有码在线视频| 欧美理论在线| 91久久线看在观草草青青| 国产一区二区三区在线观看免费| 亚洲美女在线观看| 99国产精品久久久久久久| 久久精品人人| 久久视频在线视频| 在线观看成人一级片| 欧美一区日韩一区| 久久精品一二三区| 国产美女高潮久久白浆| 亚洲男人的天堂在线| 亚洲在线视频免费观看| 欧美三级视频| 亚洲女人天堂成人av在线| 欧美一区二区高清| 国产视频在线观看一区二区三区| 亚洲一级黄色| 久久精品国产免费看久久精品| 久久久久久久综合狠狠综合| 国产视频亚洲精品| 久久久av网站| 国内激情久久| 久久久亚洲人| 亚洲欧美日韩中文在线制服| 欧美国产日韩免费| 免费视频一区| 99国产一区二区三精品乱码| 欧美日韩亚洲一区三区| 亚洲一区二区三区成人在线视频精品| 亚洲午夜精品一区二区| 国语自产在线不卡| 国产精品v欧美精品v日韩| 午夜精品久久久久久久| 亚洲大胆人体视频| 亚洲欧美日韩国产成人| 国产一区二区三区奇米久涩| 欧美激情亚洲自拍| 久久精品亚洲国产奇米99| 亚洲视频图片小说| 欧美a级在线| 久久综合国产精品台湾中文娱乐网| 99re6热在线精品视频播放速度| 国产一区二区三区电影在线观看 | 亚洲精选中文字幕| 国产精品网站视频| 国产精品久久久久久久电影| 欧美精品久久99| 欧美a级理论片| 久久久97精品| 久久午夜影视| 女女同性女同一区二区三区91| 久久免费视频网站| 久久一日本道色综合久久| 久久夜色精品国产亚洲aⅴ| 久久激情网站| 欧美国产日韩二区| 欧美日韩在线综合| 国产精品白丝av嫩草影院| 亚洲国内高清视频| 亚洲国产影院| 亚洲夜晚福利在线观看| 欧美一级欧美一级在线播放| 久久久亚洲欧洲日产国码αv| 欧美刺激午夜性久久久久久久| 欧美欧美午夜aⅴ在线观看| 欧美日韩亚洲一区在线观看| 国产专区精品视频| 99国产一区二区三精品乱码| 久久国产精品久久久久久| 久久精品综合| 一区二区高清视频| 免费日韩成人| 国产一区二区三区免费观看 | 精品成人国产| 一区二区三区四区国产精品| 欧美一区二区视频97| 亚洲美女一区| 欧美国产一区二区三区激情无套| 国产一本一道久久香蕉| 亚洲午夜视频| 老司机精品视频网站| 正在播放亚洲一区| 欧美激情精品久久久久| 国产中文一区| 久久精品女人的天堂av| 亚洲精品欧美日韩| 久久人91精品久久久久久不卡| 国产精品美女一区二区| 在线欧美日韩| 亚洲高清一二三区| 久久综合色婷婷| 亚洲精品免费在线| 亚洲黄色有码视频| 欧美午夜电影网| 久久成人精品| 久久久久久欧美| 亚洲欧洲偷拍精品| 亚洲欧洲精品一区二区| 欧美三区美女| 国产精品视频最多的网站| 亚洲女性喷水在线观看一区| 亚洲午夜一区| 亚洲电影在线| 亚洲美女色禁图| 极品中文字幕一区| 亚洲精品乱码久久久久久日本蜜臀| 欧美日韩在线观看视频| 欧美一区二区三区成人| 欧美 日韩 国产精品免费观看| 亚洲一区二区三区精品动漫| 亚洲欧美成人网| 亚洲国产免费| 久久9热精品视频| 在线亚洲自拍| 欧美激情在线免费观看| 久热精品在线视频| 国产精品网曝门| 一本色道久久综合亚洲精品小说| 国产一区二区三区免费在线观看| 亚洲精品免费观看| 最新日韩中文字幕| 久久福利电影| 久久婷婷色综合| 韩国女主播一区二区三区| 妖精视频成人观看www| 亚洲精品字幕| 欧美视频在线观看免费| 亚洲免费高清| 亚洲天堂第二页| 国产麻豆精品theporn| 亚洲免费一在线| 久久久久99精品国产片| 狠狠狠色丁香婷婷综合激情| 久久国产综合精品| 欧美激情中文字幕一区二区| 亚洲精品国产精品国自产观看浪潮 | 欧美一级久久久久久久大片| 欧美一区二区三区四区视频| 国产精品久久久久久福利一牛影视 | 欧美日韩中文字幕综合视频| 亚洲成人资源网| 日韩视频一区|