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

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

?? smsprs.cpp

?? ril source code for Windows CE
?? CPP
?? 第 1 頁 / 共 4 頁
字號:
//
// Copyright (c) Microsoft Corporation.  All rights reserved.
//
//
// Use of this sample source code is subject to the terms of the Microsoft
// license agreement under which you licensed this sample source code. If
// you did not accept the terms of the license agreement, you are not
// authorized to use this sample source code. For the terms of the license,
// please see the license agreement between you and Microsoft or, if applicable,
// see the LICENSE.RTF on your install media or the root of your tools installation.
// THE SAMPLE SOURCE CODE IS PROVIDED "AS IS", WITH NO WARRANTIES.
//
/*++
THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF
ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO
THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A
PARTICULAR PURPOSE.

Module Name:

smsprs.cpp

Abstract:

  Code to convert an incoming SMS message from GSM format to an
  RILMESSAGE struct.

Notes:


--*/


#include "precomp.h"


//
// Command types
//
static const DWORD g_rgdwCommandTypes[] =
{
    0x00,   // RIL_MSGCMDTYPE_STATUSREQ
    0x01,   // RIL_MSGCMDTYPE_CANCELSTATUSREQ
    0x02,   // RIL_MSGCMDTYPE_DELETEMESSAGE
    0x03,   // RIL_MSGCMDTYPE_ENABLESTATUSREQ
};
#define NUM_COMMANDTYPES    (sizeof(g_rgdwCommandTypes) / sizeof(DWORD))

//
// Geographical Scope
//
static const DWORD g_rgdwGeographicalScopes[] =
{
    RIL_GEOSCOPE_CELL_IMMEDIATE,
    RIL_GEOSCOPE_PLMN,
    RIL_GEOSCOPE_LOCATIONAREA,
    RIL_GEOSCOPE_CELL,
};
#define NUM_GEOGRAPHICALSCOPES  (sizeof(g_rgdwGeographicalScopes) / sizeof(DWORD))

//
// DCS Languages
//
static const DWORD g_rgdwDCSLanguagesGroup1[] =
{
    RIL_DCSLANG_GERMAN,                          
    RIL_DCSLANG_ENGLISH,                         
    RIL_DCSLANG_ITALIAN,                         
    RIL_DCSLANG_FRENCH,                          
    RIL_DCSLANG_SPANISH,                         
    RIL_DCSLANG_DUTCH,                           
    RIL_DCSLANG_SWEDISH,   
    RIL_DCSLANG_DANISH,    
    RIL_DCSLANG_PORTUGUESE,
    RIL_DCSLANG_FINNISH,  
    RIL_DCSLANG_NORWEGIAN,
    RIL_DCSLANG_GREEK,    
    RIL_DCSLANG_TURKISH,  
    RIL_DCSLANG_HUNGARIAN,
    RIL_DCSLANG_POLISH,
    RIL_DCSLANG_UNKNOWN,
};

static const DWORD g_rgdwDCSLanguagesGroup2[] =
{
    RIL_DCSLANG_CZECH,                          
    RIL_DCSLANG_ARABIC,                         
    RIL_DCSLANG_RUSSIAN,                         
    RIL_DCSLANG_ICELANDIC,                          
    RIL_DCSLANG_UNKNOWN,
};


//
// Constants and macros for parsing Cell Broadcast messages
//
const UINT CELLBROADCAST_HEADER_LENGTH = 6;

#define MESSAGECODE_FROM_SERIALNUMBER(sn)   ((sn >> 4) & 0x3ff)
#define GEOSCOPE_FROM_SERIALNUMBER(sn)      g_rgdwGeographicalScopes[((sn >> 14) & 0x3)]
#define UPDATENUMBER_FROM_SERIALNUMBER(sn)  (sn & 0xf)

#define PAGENUMBER(b)   ((b >> 4) & 0xf)
#define TOTALPAGES(b)   (b & 0xf)


//
// Table used to map semi-byte values to BCD characters
//
static const WCHAR g_rgwchSemiByteToBCDMap[16] = { L'0', L'1', L'2', L'3', L'4', L'5', L'6', L'7', L'8', L'9', L'*', L'#', L'a', L'b', L'c', L' ' };


//
// Convert a semi-byte into a BCD value
//
static WCHAR SemiByteToBCD(const BYTE bByte, const BOOL fHigh)
{
    FUNCTION_TRACE(SemiByteToBCD);
    // If a semi-octect is a non-integer value != 0x0f, then the follow mapppings hold.
    // If a semi-octect prior to the last octect contains 0x0f, we skip that octet and continue on.
    // GSM 03.40 section 9.1.2.3

    BYTE bSemiByte = (fHigh ? (bByte & 0xf0) >> 4 : bByte & 0x0f);
    DEBUGCHK(0x10 > bSemiByte);
    return g_rgwchSemiByteToBCDMap[bSemiByte];
}


//
// Fill in RILADDRESS structure from BYTE array
// see GSM 03.40 section 9.1.2.5 and GSM 04.11 8.2.5.2
//
static BOOL ParseMsgAddress(const BYTE* const pbIn, const BOOL fBeforePDU, RILADDRESS& rraAddress, UINT& rcbParsed, BOOL fGSM3dot40)
{
    FUNCTION_TRACE(ParseMsgAddress);
    DEBUGCHK(NULL != pbIn);

    UINT i;
    BYTE bType;
    BYTE bNumPlan = pbIn[1] & 0x0f;
    const BYTE* pbWalk;
    LPWSTR pwchWalk;
    UINT cchUsed;
    UINT cbAddress;
    WCHAR wchBCD;
    BOOL fRet = FALSE;

    // Initalize returned values
    rcbParsed = 0;
    (void)memset(&rraAddress, 0x00, sizeof(RILADDRESS));
    rraAddress.cbSize = sizeof(RILADDRESS);

    // If address length is 0, just get out. This shouldn't happen, but we've seen it.
    if (*pbIn==0)
    {
        DEBUGMSG(ZONE_ERROR, (TEXT("RILDrv : E : ParseMsgAddress : Address length is 0?\r\n")));
        if (fGSM3dot40)
        {
            // GSM 03.40 section 9.2.2.1 indicates that there will always be a MINIMUM of 2 octets for the TP-OA field
            // Some SMS messages we've seen in the wild have a TP-OA Address-Length of 0, Type-of-Address of International
            // and 0 bytes of data.  Setting rcbParsed to 2 below (rather than 1) is necessary to correctly parse these
            // messages.
            rcbParsed = 2;
        }
        else
        {
            // GSM 04.11 8.2.5.2 is ambiguous about whether a zero length address will include an address type and be
            // two bytes, or will just have a length and be one byte.  However we have seen at least one case in which
            // an address did not have a type, just a length.  There are no known instances yet when it has both a type
            // and a length, so for now we are assuming it will always be just one byte.
            rcbParsed = 1;
        }
        return TRUE;
    }

    // Determine the address type
    bType = (pbIn[1] & 0x70) >> 4;

    for (i = 0; i < NUM_ADDRTYPES; i++) {
        if (g_rgbAddrTypes[i] == bType) {
            rraAddress.dwType = i;
            rraAddress.dwParams |= RIL_PARAM_A_TYPE;
            break;
        }
    }
    DEBUGCHK(0 != (rraAddress.dwParams & RIL_PARAM_A_TYPE));

    if ((RIL_ADDRTYPE_UNKNOWN == rraAddress.dwType) ||
        (RIL_ADDRTYPE_INTERNATIONAL == rraAddress.dwType) ||
        (RIL_ADDRTYPE_NATIONAL == rraAddress.dwType)) {
        // Determine the numbering plan
        for (i = 0; i < NUM_NUMPLANS; i++) {
            if (g_rgbNumPlans[i] == bNumPlan) {
                rraAddress.dwNumPlan = i;
                rraAddress.dwParams |= RIL_PARAM_A_NUMPLAN;
                break;
            }
        }

        // If the number plan is not one that is listed in 03.40,
        // then it is a reserved value, which we are supposed to
        // treat as 'Unknown'.
        if (RIL_PARAM_A_NUMPLAN != (rraAddress.dwParams & RIL_PARAM_A_NUMPLAN))
        {
            rraAddress.dwNumPlan = RIL_NUMPLAN_UNKNOWN;
            rraAddress.dwParams |= RIL_PARAM_A_NUMPLAN;
            DEBUGMSG(ZONE_INFO, (TEXT("RILDrv : i : ParseMsgAddress : Parsed reserved numbering plan: 0x0%x\r\n"), bNumPlan));
        }
    }

    if (rraAddress.dwType == RIL_ADDRTYPE_ALPHANUM) {
        // It seems that alphanumeric address length is the number of semi-octets as specified in GSM 03.40 section 9.1.2.5
        // so we need to determine the number of bytes from semi-octets (essentially nibbles). 
        //there are two semi-octets per byte, but we need the ceiling since a straggling remainder nibble takes up a whole byte.
        // so + 1, then divide by two...
        cbAddress = (*pbIn + 1) / 2;

        if (!(ConvertToUnicode(ENCODING_GSMDEFAULT, (LPCSTR) (pbIn + 2), cbAddress, rraAddress.wszAddress,
                                MAXLENGTH_ADDRESS-1, cchUsed))) {
            goto Error;
        }
    } else {
        if (!fBeforePDU) {
            // Calculate size of semi-octet-encoded address, per GSM 03.40 section 9.1.2.3
            cbAddress = *pbIn / 2 + *pbIn % 2;
        } else {
            cbAddress = *pbIn - 1;
        }

        pbWalk = pbIn + 2;
        pwchWalk = rraAddress.wszAddress;

        for (i = 0; i < cbAddress; i++) {
            wchBCD = SemiByteToBCD(*pbWalk, FALSE);
            if (L' ' != wchBCD) {
                *pwchWalk++ = wchBCD;
            }
            wchBCD = SemiByteToBCD(*pbWalk, TRUE);
            if (L' ' != wchBCD) {
                *pwchWalk++ = wchBCD;
            }
            pbWalk++;
        }

        // NULL-terminate the address string
        *pwchWalk = L'\0';
    }
    rraAddress.dwParams |= RIL_PARAM_A_ADDRESS;

    rcbParsed = cbAddress + 2;
    fRet = TRUE;

Error:
    return fRet;
}


//
// Fill in SYSTEMTIME structure from BYTE array
// see GSM 03.40 section 9.2.3.11
//
static BOOL ParseMsgTimeStamp(const BYTE* const pbIn, SYSTEMTIME& rstTime, UINT& rcbParsed)
{
    FUNCTION_TRACE(ParseMsgTimeStamp);
    DEBUGCHK(NULL != pbIn);

    UINT nYear;
    const BYTE* pbWalk = pbIn;
    UINT nOffset;
    BOOL fOffsetNegative;
    FILETIME_ULARGEINT ftuliTime; memset(&ftuliTime,0,sizeof(ftuliTime)); // zero struct
    ULARGE_INTEGER uliOffset; memset(&uliOffset,0,sizeof(uliOffset)); // zero struct
    BOOL fRet = FALSE;

    rcbParsed = 0;
    (void)memset(&rstTime, 0x00, sizeof(SYSTEMTIME));

    // Parse year
    // We don't expect to see any messages with a timestamp prior to 1991.
    // This should give plenty of buffer for abnormally early timestamps while still leaving
    // working functionality until 2090.
    nYear = (*pbWalk & 0x0f) * 10 + ((*pbWalk & 0xf0) >> 4);
    if (nYear > 90) {
        rstTime.wYear = 1900 + nYear;
    } else {
        rstTime.wYear = 2000 + nYear;
    }
    pbWalk++;

    // Parse month
    rstTime.wMonth = (*pbWalk & 0x0f) * 10 + ((*pbWalk & 0xf0) >> 4);
    pbWalk++;

    // Parse day
    rstTime.wDay = (*pbWalk & 0x0f) * 10 + ((*pbWalk & 0xf0) >> 4);
    pbWalk++;

    // Parse hours
    rstTime.wHour = (*pbWalk & 0x0f) * 10 + ((*pbWalk & 0xf0) >> 4);
    pbWalk++;

    // Parse minutes
    rstTime.wMinute = (*pbWalk & 0x0f) * 10 + ((*pbWalk & 0xf0) >> 4);
    pbWalk++;

    // Parse seconds
    rstTime.wSecond = (*pbWalk & 0x0f) * 10 + ((*pbWalk & 0xf0) >> 4);
    pbWalk++;

#if defined(TRUST_TIMEZONE_FIELD)
    /*
    The following code to adjust rstTime according to the time-zone information
    from the input is unused because most shipping GSM phones seem to ignore
    that field.  Specifically, all SMSCs seem to fill in the TP-SCTS field based
    on their *local* time and then set the offset from GMT to *0*.  Unless the
    SMSC is actually based in the GMT+0 time zone, this behavior is incorrect.
    Because our devices know which time zone they're in, if they use the time
    zone information provided, then they will calculate a time that is adjusted
    for the device's offset from the SMSC's (incorrectly reported) offset and
    will obtain a resulting time that is incorrect.  This leads to SMS messages
    appearing in Inbox with incorrect time stamps and ends up confusing users.
    */

    // Parse timezone offset (LocalTime - GMT in in quarters of an hour)
    // See GSM 03.40 ver5.8.1 ch9.2.3.11
    nOffset = ((*pbWalk & 0x07) * 10 + ((*pbWalk & 0xf0) >> 4)) * 15;
    fOffsetNegative = (*pbWalk & 0x08);
#else // defined(TRUST_TIMEZONE_FIELD)
    /*
    Until SMSCs start getting properly configured, the best option seems to be
    to effectively ignore the time zone information (as other GSM phones do).
    However, in order for us to ignore the time zone field, we actually need
    to fill in the SYSTEMTIME structure with the UTC representation of the local
    time we just parsed.  That means offsetting it by the current time zone bias
    of the device.
    */

    {
    TIME_ZONE_INFORMATION tzi;
    LONG lBias = 0;
    const DWORD dwGetTimeZoneInformationResult = GetTimeZoneInformation(&tzi);
    if(TIME_ZONE_ID_STANDARD == dwGetTimeZoneInformationResult) {
        lBias = tzi.Bias+tzi.StandardBias;
    } else if(TIME_ZONE_ID_DAYLIGHT == dwGetTimeZoneInformationResult) {
        lBias = tzi.Bias+tzi.DaylightBias;
    } else if(TIME_ZONE_ID_UNKNOWN == dwGetTimeZoneInformationResult) {
        lBias = tzi.Bias;
    } else {  // Would like to check for error with TIME_ZONE_ID_INVALID, but it's not defined by our OS headers
        DEBUGCHK(!"Should never reach here");
    }
    fOffsetNegative = (lBias < 0);
    nOffset = ((fOffsetNegative) ? (-lBias) : (lBias));
    // Now that we've used fOffsetNegative to set nOffset=abs(lBias), we need
    // to flip fOffsetNegative because we want to calculate the UTC value that
    // represents the same temporal time as the local clock time we just
    // extracted.
    fOffsetNegative = !fOffsetNegative;
    }
#endif // defined(TRUST_TIMEZONE_FIELD)
    pbWalk++;


    // Convert our local time to filetime
    if (!SystemTimeToFileTime(&rstTime, &ftuliTime.ft)) {
        goto Error;
    }

    // Convert timezone offset to filetime
    uliOffset.QuadPart = nOffset * (__int64)600000000;

    // Apply the timezone offset
    // (NOTE: the offset is LocalTime - GMT, so we need to *add* it to the LocalTime if the offset is negative,
    //        and *subtract* it if the offset is positive)
    if (fOffsetNegative) {
        ftuliTime.uli.QuadPart += uliOffset.QuadPart;
    } else {
        ftuliTime.uli.QuadPart -= uliOffset.QuadPart;
    }

    // Convert the updated filetime back to the SYSTEMTIME structure
    if (!FileTimeToSystemTime(&ftuliTime.ft, &rstTime)) {
        goto Error;
    }

    rcbParsed = pbWalk - pbIn;
    fRet = TRUE;

Error:
    return fRet;
}



//
// Set the ProtocolID of an Incoming SMS Message
// see GSM 03.40 section 9.2.3.9
//
static BOOL ParseMsgProtocolID(const BYTE* const pbIn, DWORD& rdwProtocolID, UINT& rcbParsed)
{
    FUNCTION_TRACE(ParseMsgProtocolID);
    DEBUGCHK(NULL != pbIn);

    UINT i;
    BOOL fRet = FALSE;

    rcbParsed = 0;

    if ((0 == (*pbIn & 0xe0)) || (0x80 == (*pbIn & 0xc0))) {  // Reserved or unsupported values should be treated as 0x00
        rdwProtocolID = RIL_MSGPROTOCOL_SMETOSME;
        fRet = TRUE;
    } else {
        for (i = 0; i < NUM_PROTOCOLIDS; i++) {
            if (g_rgdwProtocolIDs[i] == *pbIn) {
                rdwProtocolID = i;
                fRet = TRUE;
                break;
            }
        }

        if (!fRet)
        {
            rdwProtocolID = RIL_MSGPROTOCOL_UNKNOWN;
            fRet = TRUE;
        }
    }

    if (fRet) {
        rcbParsed = 1;
    }
    return fRet;
}


//
// Set Data Coding Scheme of Incoming SMS Message
// see GSM 03.38
//
static BOOL ParseMsgDCS(const BYTE* const pbIn, RILMSGDCS& rrmdDCS, UINT& rcbParsed)
{
    FUNCTION_TRACE(ParseMsgDCS);
    DEBUGCHK(NULL != pbIn);

    BYTE bDCS = *pbIn;
    BOOL fRet = FALSE;

    rcbParsed = 0;
    (void)memset(&rrmdDCS, 0x00, sizeof(RILMSGDCS));
    rrmdDCS.cbSize = sizeof(RILMSGDCS);

    switch (bDCS & 0xf0)
    {
        case 0x00:
        case 0x10:
        case 0x20:
        case 0x30:
            rrmdDCS.dwType = RIL_DCSTYPE_GENERAL;
            rrmdDCS.dwParams |= RIL_PARAM_MDCS_TYPE;

            if (bDCS & 0x20) {
                rrmdDCS.dwFlags |= RIL_DCSFLAG_COMPRESSED;
                rrmdDCS.dwParams |= RIL_PARAM_MDCS_FLAGS;
            }

            if (bDCS & 0x10) {
                switch (bDCS & 0x03)
                {
                    case 0x00:
                        rrmdDCS.dwMsgClass = RIL_DCSMSGCLASS_0;
                        break;

                    case 0x01:
                        rrmdDCS.dwMsgClass = RIL_DCSMSGCLASS_1;
                        break;

                    case 0x02:

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美丝袜丝交足nylons图片| 亚洲欧洲日韩女同| 2021国产精品久久精品| 亚洲精品乱码久久久久久黑人| 日韩在线观看一区二区| 91在线视频播放地址| 亚洲精品一区二区三区福利| 亚洲国产日韩精品| 不卡电影一区二区三区| 国产亚洲欧美日韩日本| 麻豆精品一区二区| 4hu四虎永久在线影院成人| 亚洲黄一区二区三区| 成人午夜av在线| 亚洲精品一区二区三区福利| 免费视频最近日韩| 欧美色网站导航| 亚洲视频一区二区免费在线观看| 国产激情一区二区三区| 欧美tickle裸体挠脚心vk| 日韩av午夜在线观看| 欧美日本精品一区二区三区| 亚洲精品写真福利| 波多野结衣亚洲| 国产亚洲欧美一级| 国产精选一区二区三区| 精品国产免费人成在线观看| 理论电影国产精品| 日韩午夜三级在线| 激情小说亚洲一区| 欧美不卡123| 国产在线不卡一区| 国产日韩欧美激情| 国产高清亚洲一区| 国产精品美日韩| 成人免费视频一区| 亚洲欧洲精品一区二区三区 | 亚洲国产成人午夜在线一区| 韩国三级在线一区| 国产精品欧美久久久久一区二区| 国产成人av一区二区| 日本一区二区免费在线| 成人综合在线网站| 亚洲日本成人在线观看| 欧美亚洲国产怡红院影院| 亚洲午夜在线观看视频在线| 欧美视频一区二区三区在线观看| 亚洲成人免费在线观看| 日韩欧美一区二区在线视频| 国产乱码精品一品二品| ...中文天堂在线一区| 91黄色免费观看| 午夜免费久久看| 日韩欧美一级精品久久| 成人精品一区二区三区四区 | 亚洲一区二区三区四区在线 | 五月天网站亚洲| 日韩欧美高清一区| av影院午夜一区| 偷拍与自拍一区| 久久蜜桃av一区精品变态类天堂 | 亚洲男人天堂av网| 日韩亚洲电影在线| 97se亚洲国产综合自在线| 亚洲第一二三四区| 日本一区二区三区国色天香| 在线观看日韩国产| 国产在线播放一区| 亚洲国产另类av| 久久久久久一级片| 欧美精品自拍偷拍动漫精品| 国产v日产∨综合v精品视频| 亚洲成人免费在线| 中文一区二区在线观看| 欧美一区二区三区视频免费| 99久久精品一区| 九色|91porny| 亚洲国产sm捆绑调教视频| 国产日产欧产精品推荐色| 欧美日韩成人综合在线一区二区| 国产精一品亚洲二区在线视频| 亚洲一区中文在线| 国产日韩一级二级三级| 日韩一级大片在线| 国产精品美女久久久久久| 国产一区二区三区四区五区美女| 久久久午夜精品| 99久久伊人精品| 精品一区二区三区免费播放| 亚洲成av人片在线| 中文字幕一区二区三区四区不卡| 日韩免费性生活视频播放| 欧美综合在线视频| 精品国产青草久久久久福利| 国产一区在线视频| 中文字幕亚洲在| 欧美日韩在线直播| 国产在线精品免费| 日韩理论片一区二区| 欧美精品第1页| 国产精品一卡二| 一区二区在线观看视频| 日韩一区二区免费在线电影| 国产美女在线精品| 亚洲精品乱码久久久久久黑人| 欧美精品在线观看一区二区| 国产成人午夜99999| 一区二区三区成人| 久久青草欧美一区二区三区| 99视频在线精品| 天堂av在线一区| 国产精品进线69影院| 91精品综合久久久久久| 成人小视频在线观看| 亚洲第一福利视频在线| 国产精品婷婷午夜在线观看| 欧美在线高清视频| 丰满白嫩尤物一区二区| 日韩经典一区二区| 一区二区三区四区五区视频在线观看 | 欧美精品电影在线播放| 成人美女视频在线观看18| 免费的成人av| 亚洲国产日韩在线一区模特| 国产日产欧美精品一区二区三区| 欧美日韩国产123区| www.欧美精品一二区| 久久av中文字幕片| 丝袜a∨在线一区二区三区不卡| 久久夜色精品国产噜噜av| 666欧美在线视频| 色94色欧美sute亚洲线路一ni| 九色综合狠狠综合久久| 三级欧美韩日大片在线看| 亚洲精品免费视频| 国产精品看片你懂得| 久久久久成人黄色影片| 日韩精品一区二区三区视频播放| 91黄色在线观看| 日本丶国产丶欧美色综合| 972aa.com艺术欧美| 成人avav在线| 成人动漫一区二区三区| 不卡视频在线观看| 成人教育av在线| av电影一区二区| av一区二区三区黑人| 成人小视频在线| 成人一区二区三区在线观看 | 日本一区二区三区高清不卡| 日韩欧美国产电影| 日韩欧美一区二区在线视频| 日韩欧美一区二区视频| 日韩一区二区在线播放| 精品国产污污免费网站入口| 精品国产乱码久久久久久闺蜜| 日韩欧美专区在线| 久久在线观看免费| 久久午夜国产精品| 欧美高清在线一区二区| 国产精品久线在线观看| 亚洲免费伊人电影| 亚洲国产精品久久久男人的天堂| 天天av天天翘天天综合网色鬼国产| 亚洲午夜久久久| 老汉av免费一区二区三区| 国产尤物一区二区| 99久久伊人久久99| 欧美亚一区二区| 日韩欧美一区在线| 国产精品欧美久久久久一区二区| 最新日韩在线视频| 日韩精品一级二级| 国产在线播放一区二区三区| 不卡区在线中文字幕| 欧美三级视频在线观看| 日韩欧美久久一区| 国产精品女主播av| 亚洲18色成人| 国产精品1区二区.| 欧美在线一二三| 久久综合久久鬼色中文字| 亚洲欧美激情插| 精品亚洲国内自在自线福利| 成人激情免费视频| 欧美一区二区视频在线观看2020 | 在线看日本不卡| 日韩免费高清电影| 亚洲视频香蕉人妖| 青青草国产精品97视觉盛宴| 国产91露脸合集magnet | 久久久久久久久久电影| 国产精品美女久久久久久久| 婷婷丁香久久五月婷婷| 国产成人自拍高清视频在线免费播放| 91免费国产在线| 久久午夜色播影院免费高清| 午夜欧美在线一二页| 99re热这里只有精品视频| 日韩欧美色综合网站|