日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > windows >内容正文

windows

Symbian系统开发教程(二)

發布時間:2023/12/18 windows 73 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Symbian系统开发教程(二) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

第二章:數據類型與語法
作者:謝興?? enigma19971@hotmail.com???????????? 轉載需注明出處????? 下載word版本
???????
Symbian系統已經提供了一套已經定義好的內置的數據類型。為了保證你的代碼是編譯器無關的,應當使用下面symbian系統提供的數據類型,而不要使用原生數據類型(native types,這里指標準C中的int ,char等)。
1. 基本類型
TIntX 和 TUintX (其中X = 8, 16 和 32) 分別用來表示 8位, 16位 和 32位的有符號和無符號的整數。 一般情況下,使用TInt 和TUint就可以了,除非是在考慮代碼優化或兼容性的時候,才會用到TInt8,TInt16這樣的類型。TInt 或 TUint 類型分別對應有符號和無符號的整數。
? TInt64. 在版本8.0之前,Symbian系統中不支持64位的算術運算,而是用兩個32位的值來實現64位的整數,在8.0版本之后,TInt64和TUInt64才被定義為long long類型,真正使用64位的內置數據類型。
? TReal32 和 TReal64 (TReal相當于TReal64)
??? 這兩個數據類型相當于單精度和雙精度的浮點數,由于浮點數的運算要比整數慢,所以一般應盡量避免使用浮點數的運算。
? TTextX (其中X = 8 或 16)
??? 分別對應窄或寬的字符(注:所謂窄字符通常ASCII碼字符,而寬字符是指unicode字符集的字符 )
? TAny*
TAny* 意為指向任意內容的指針,在這種意義上講,TAny相當于void, TAny* 相當于TAny*。但是,在某些場合下,void標示‘空’,如:
void? hello(void);
這時,不要將它改寫為:? TAny hello(TAny);
? TBool
標示布爾類型。Symbian系統提供了兩個常量:ETrue (=1) 和 EFalse (=0),分別表示真和假。
注意:在Symbian系統中,TBool被定義為int, 而ETrue和EFalse被定義為enum,所以,如果一個函數的返回值為TBool,不要用如下的代碼來比較函數的返回值:
TBool isLarger(TInt a, TInt b)
{
return (a>b)?ETrue:EFalse;
}
if(isLarger(4,3)==ETrue){...}??? //錯誤,編譯不過。
if(isLarger(4,3)){...}?? //正確
2類和對象
2.1 Symbian系統中的命名習慣:
在Symbian系統中編寫代碼時,應當遵守種樣幾個規則:成員變量的命名以小寫字母i開頭,方法的參數以小寫字母a開頭,例如:
class Pernon
{
public:
?TInt iAge;
?void SetAge(TInt? aAge){iAge = aAge};
}
在symbian系統中存在幾種不同類型的類(class),不同類型的類,其特性也各不相同。
有的在堆(heap)上創建,有的在棧(stack)上創建,特別的是,類的實例(instance)的清除方式也不盡相同(下面,為了方便我們把類的類別稱為型別)。型別(class type)可以體現這些不同的特點。每個型別都有一套定義好的關于如何創建和清除實例的規則。為了容易區分型別,Symbian系統使用了一個簡單的命名規則:類名以大寫字母開頭(T,C,R 或M)。作為類的設計者,你先要考慮這個類的行為,看它到底與哪種型別匹配,一旦確定了它的類型,然后你就可以專注于該類的功能。同樣,對一個類的使用者來講,如果他不熟悉這個類, 但類的命名規則可以幫助他弄清你的意圖------如何用安全的方式初始化、使用和銷毀一個類的對象(object)。
下面,我主要討論不同型別的主要特性。
? T 類
T類的行為類似于C++中的內置類型,因此,它們以T作前綴(”T”代表”Type”)。象內置類型一樣,它們沒有析構方法(destructor),這導致的結果是:T類不能包含具有析構方法的成員變量。所以,一般情況下,T類的成員變量只能是內置類型的數據或者是其它的T類的對象。在某些的情況下T類也可以包含其它對象的指針或引用,不過,這時它們之前是“使用”關系,而不是“擁有”關系(也就是說,這個T類對象并不負責對成員的創建和銷毀的工作)。不能擁有外部數據的原因是因為T類沒有析構方法。正是由于沒有析構方法,T類的對象可以在棧上創建,當程序流程退出函數或產生leave(一種代碼異常)的時候,系統自動清除它。即使T類有一個析構方法,在發生異常(在Symbian系統中,異常被稱為leave)時Symbian 系統也不會調用它,因為leave沒有模仿標準C++的拋出異常的做法。
T類的對象也可以在堆上創建。但是,應當在調用有可能發生異常的代碼之前,將這個對象放入到清除棧(cleanupStack),在發生異常的時候,清除棧(cleanupStack)會釋放這個對象。
? C 類
這種類都是從CBase派生來的(直接或間接)。
//.h file
class CStudent:public CBase
{
?public:
?CStudent(){
? RDebug::Print(_L("i am a student"));
?};
?~CStudent()
?{
? RDebug::Print(_L("please, don't kill me!"));
?}
?void SampleFunction(){};
?private:
?TInt iCode;
?TInt iScore;
};
CBase有兩個特點:首先,它有一個虛的析構方法,這樣,可以通過CBase指針來刪除它的子類。代碼如下所示:
CBase *pStu = new CStudent();
delete pStu;
結果:?? i am a student
?please, don't kill me!????????
其次,CBase類和它的子類,重載了new操作符,這使得當它在堆上創建的時候,自動初始化為0,也就是說,當它一開始被創建出來的時候,所有的成員變量都被初始化為0,所以您不必在構造方法中去做這件事情。但是,在棧上創建對象時,情況并非這樣, 因為這時沒有用到new操作。這將潛在地導致堆上創建的對象和棧上創建的對象的行為不一致。因此,C類的對象一定要在堆上創建。
很明顯,當一個堆上的C類對象不再被需要時,我們需要消耗它。 一個C類的對象可能以兩種方式存在:其它類的指針成員變量或是一個局部的針指變量。在前一種情況下,我們可以在類的析構方法中調用delete來刪除它;后一種情況要復雜一些,在調用任何有潛在的異常(leave)的代碼之前,要把這個指針放到清除棧(cleanup stack)中,否則有可能發生內存泄露。CBase 類聲明了私有的拷貝構造方法和賦值操作(=)。這是一個很好的策略,它可以用來防止客戶代碼不小心地使用了淺拷貝或賦值的方法。由于基類的拷貝構造和賦值是私有的,所以,如果您希望您的類可以能夠使用拷貝構造方法,您必須顯式地聲明和定義拷貝構造方法和賦值操作。但是,考慮到C類的特性,深拷貝可能造成發生異常(leave)的隱患,而您絕對不能讓類的構造方法(或析構方法)發生異常(我們在本教程的后面解釋原因)。所以,如果您確實需要一個拷貝的方法,那么您可以為類添加一個的可能會發生異常的方法來完成同樣的任務,例如:CloneL()或CopyL()。如果您提供的這個類是從CBase派生的,您就不必為了防止客戶代碼使用有潛在安全問題的“淺”拷貝,而在代碼中將這些方法聲明為私有的。
? R 類
前綴“R” 在這里代表資源(Resource), 通常是外部資源,例如:文件的句柄(handle)。
和C類一同,Symbian系統中不存在一個對應的RBase類,所以一個R類應當有一個構造方法來將它的資源句柄置為0,表明還沒有資源和這個新建的對象關聯在一起。但是,不要在構造方法中初始化資源句柄,因為這樣有可能使構造方法產生異常。R類中常常有類如Open(), Create() 或 Initialize()這樣的方法,它們用來分配資源,設置句柄成員變量的值,并返回錯誤代碼或是產生異常。 R類通常也有對應的Close()或Reset()類,用來釋放資源,重置句柄的值------表明沒有資源和該對象關聯。使用R類時,一個常見的錯誤是忘記調用它的Close()方法(當然,該方法也可以是其它名字,但它經常被命名為Close())或是有一個析構方法釋放資源,這會引起資源的泄露。
R類通常都很小,除了資源句柄沒有其它的成員變量。因為不需要。它通常也沒有析構方法,資源的釋放都是在Close()方法中進行的。大多數情況下,R類都是作為類的成員變量或局部變量存在的。只有少數情況下,在堆上創建。
您必須確保,當程序發后異常的時候,資源能被正確地釋放------通常是使用資源棧。如果一個R類是一個堆上的自動變量(相對于成員變量),您一但要保證資源被釋放,而且,變量本身也要被釋放。
R類的成員變量通常都很簡單,所以一般不需要深拷貝(bitwise copy)。R類的拷貝可能會引起混亂(想象一下:如果兩個對象同時在一個資源句柄上調用Close()方法,或兩個對象都沒有釋放資源,會發生什么情況?)如果,您想阻止任何對R類的拷貝,您應當聲明(但不定義)一個私有的構造方法和賦值操作。
? M 類
當提到多繼承的時候,它意味著從一個主要的類派生,同時也混雜基它類的功能。前綴M是單詞Mixin的首字母。Symbian系統不贊成多繼承的做法,因為這個引入額外的復雜性,M類是一個抽象類,它的作用相當于java中的接口(interface)。在Symbian系統中,M 類常被用來定義回調接口或者是觀察者(observer)類。M類也可以被其它類繼承。下面我們給出兩個例子。
class MAnimal
{
?public:
?virtual void EatL() =0;
};
class MDomesticAnimal : public MAnimal
{
?public:
?virtual void NameL() =0;
};
class CCat : public CBase, public MDomesticAnimal
{
?public:
?virtual void EatL(){}; // 從MAnimal, 經過MDomesticAnimal繼承
?virtual void NameL(){}; // 從 MDomesticAnimal繼承
?// Other functions omitted for clarity
};
上面的例子演示了一個從CBase類和一個M類派生的具體類。而類MDomesticAnimal又是從MAnimal派生的。象接口一樣,由于不能被實例化,M類只能有虛(virtual)函數,不能有成員變量和構造方法。但它可以有析構方法, 條件是,實現它的具體類必須是從CBase派生的。在定義完類以后,然后可以用使用它。代碼如下:
CCat??? *cat1 =?? new CCat;
delete? cat1;?? //正確
然下面的代碼卻是錯誤的。
MAnimal *cat2 = new CCat;
delete? cat1;?? //錯誤
當用M類的指針引用一個對象的時候,如果用delete刪除這個指針,則這個M類必須提供一個虛擬的析構方法,否則會出現系統異常(panic code 42)。將MAnimal的代碼改寫,則上面代碼沒有問題。
class MAnimal
{
?public:
?virtual void EatL() =0;
?virtual ~MAnimal();?? //增加一個虛的析構方法。
};
3描述符(descriptor)
在Symbian 系統中,字符串被稱為“描述符”(descriptor),因為它們是自我描述的。在描述符中保存了它所表示的字符串的長度和它的底層的內存布局的信息。描述符比標準C中的字符數組和字符指針要復雜,您可能需要多花些時間來學習和掌握它的用法。關鍵是,它們的特殊設計使得它們在少量內存的設備上非常有效率,僅用非常少的內存就可以保存自己的長度和內存布局的信息?,F在,讓我們來深入了解描述符的設計思想。
在Symbian系統中,描述符是相當讓人迷惑的,因為它的種類繁多。不同種類的描述符具有不同的特性和用法,但又經常能相互轉換。它們不同于標準C++中的string,java語言中的string類或MFC中的CString,因為程序員必須自己管理底層的內存分配和清除工作。它們具有防治內存溢出的機制,并且不依賴NULL終結符號來決定字符串的長度,從這方而來講,它也不同于C語言中的字符串。
現在我們來討論:什么是描述符?它們是如何工作的?在探討這些不同的描述符之前,先讓我們需要弄清楚一個基本的概念:什么是字符串數據的“寬度”?這個長度指的是單個字符是8bit的,還是16bit的寬度。在早期的版本中,字符的寬度都是8bit的,后來為了支持Unicode字符集,從第5版起,Symbian系統將16bit 的字符作為標 準。Symbian系統現在支持這兩種字符長度的描述符,除了Copy()和Size()兩個方法以外,這兩種寬度的描述符的行為是完全一致的,這兩個方法的使用,我們后面再介紹。另外,有一套中立的描述符類型,它們既可以被定義為窄的描述符類型,也可以被定義為寬的描述符類型,這要取決于編譯時的寬度。您可以從它的名字上很容易看出這個類型所表示的寬度。假如,它以8結尾(例如:TPtr8,就意味著它表示是的8bit的窄字符,而以16結尾的描述符類(例如:TPtr16)則操作16bit的寬字符。 對中立(neutral)的類型來講,沒有數字結尾(例如:TPtr),在Symbian系統第5版以后,默認的情況下,它們表示寬度為16bit的字符串。它們之間的關系比較類似于TInt,TInt16或TInt32 之間的關系,這一點應當是比較易于理解的。
一般情況下,您沒有必要指明是字符串的寬度,用中立的類型就可以了,這樣使你的代碼易于在寬字符版本和窄字符版本之間轉換(有過編程經驗的朋友應該有這樣的印象,我們平常寫代碼,大多情況下,僅僅使用UINT類型,而較少考慮使用UINT16,UINT32類型)。
另外一個問題是:描述符和字面量(literal)的區別。所謂字面量是指在編碼的時候就已經確定的量,例如,標準C中的
char* p = "Hello world";
其中的"Hello world"就是字面量。在Symbian系統中,對它們的處理是很不一樣的,這點我們在后面再介紹。
有了這樣的一些認識, 現在我們可以來看看有哪些描述符類型。在Symbian系統中描述符類型有兩大種類:不可修改(non-modifiable)的描述符和可修改(modifiable)的描述符。
3.1不可修改(non-modifiable)的描述符
?
在Symbian系統中,所有的描述符都繼承自TDesC,在前面我們已經討論了類名前綴T所代表的意義,在這里,我們更關心類名的后綴C所代表的意義,這個C是單詞Constant的首字符,表示這個類是不可更改的。這個類提供了一些用來返回字符串的長度和操作數據的方法。Length()方法返回了描述符的長度,因為,每個描述符對象在內存中的布局都是同樣的,用4個字節來表示它所包含的數據的長度(實際上,只用了32個bit中的28個bit,剩余的4bit留作它用,所以描述符能表示的最大的長度為228? 字節,256 MB,不過這已經足夠了)。所以,Length()方法沒有被它的子類重寫,它對所有子類都有效。但是,根據實現子類的方法的不同,子類訪問數據的方式也不一樣,Symbian系統不要求它的子類通過虛函數的方式來實現自己的訪問數據的方法。 不用虛函數重寫的原因是因為,虛函數會給每個被派生的描述符對象增加4節字的額外負擔,c++用這4個字節來存放指向虛函數表的指針。我們前面說過,在設計描述符的時候要讓它盡可能高效,額外的字節開銷被認為是不理想的。存放長度的4個字節中,28bit用來表示長度,剩下的4bit用來表示描述符的類型。目前,symbian系統中有5種派生的描述符類型,4bit限制了描述符的種類最多只能有16種,但這已經足夠了。子類可以通過調用基類TDesC的Ptr()方法來訪問描述符的數據,Ptr()方法檢查這4個bit,確定描述符的類型并返回它的數據在內存中的地址。當然,這要求TDesC基類清楚它的子類的內存布局,并在Ptr()方法中使用硬編碼的方法。后面,為了表述上的方便,我們也把這種不可修改的描述符也稱為常量描述符(constant descriptor)
總結:不可修改的描述符類TDesC是所有的非字面量描述符的基類,它提供了確定描述符長度和訪問數據的方法,另外,它實現了所有的您想用來處理常量字符串的操作。
3.2可修改(modifiable)的描述符
所有的可修改的描述符都從TDes基類派生,而TDes本身又是從TDesC派生的。TDes有一個額外的成員變量用來存放為該描述符分配數據的最大長度。MaxLength()方法返回了這個最大的長度。像TDesC中的Length()方法一樣,MaxLength()方法也不被TDes的子類繼承。 TDes類提供了一系列的方法, 用來對可修改字符串數據的操作,包括對字符串的附加、填充和格式化操作。所有的這些方法都被派生類繼承,派生類只實現一些特定的構造方法和復制賦值的方法。這些方法都不負責分配內存,假如它們超過了描述符的數據長度,例如,用Append()方法在某個字符串后面附加另一個字符串時,在調用該方法之前,您必須確保有足夠的內存空間。當然,只要不超過描述符的最大存儲容量,描述符的長度可以自由地伸縮。當描述符長度比最大長度短的時候,描述符的后面部分是多余未用的。這些方法使用了斷言(assertion)來確保描述符的最大長度不會被超出。如果發生內存溢出,將會產生一個panic(關于panic,我們將在后面的章節介紹),這樣可以方便您檢查和修正程序的錯誤。
事實上,不可能使描述符溢出,這一點保證了您代碼的強壯性,而且不易產生難以跟蹤的內存陷阱。
但需要注意的是,由于基類的構造方法是proteced類型的,所以您無法直接實例化一個TDesC或TDes類的實例?,F在我們來看看描述符的派生類,您可以實例化和使用派生類的對象。正如前面所說,這個地方是比較讓人迷惑的,因為描述符存在大量的派生類。 前面,我們已經解釋過為什么每個類會有三個不同的版本,例如:TDes8, TDes16 和 TDes,分別對應窄字符,寬字符和中立的類。現在,讓我們看看有哪些主要的描述符類型,在深入討論每種類型的細節之前,我們先考察一下它們在一般情況下的內存布局。描述符有兩種基本的內存布局:指針描述符和緩存區描述符。不同之處在于,指針描述符持有一個指向字符串的指針,而這個字符串存儲在內存中的基它位置。與指針描述符不同,緩存區描述符本身持有字符數據,也就是說字符數據本身構成了描述符的一部分。
總結:TDes 是所有的可修改的描述符的基類, 并且它自己也是從TDesC派生的。它有一個能返回最大的內存容量的方法和一系列的用來修改字符串數據的方法。
3.3 指針描述符(pointer descriptor)
指針描述符可分為兩種:TPtrC 和TPtr(我們前面說過,每種類型的描述符,按照字符寬度,都可以分為三個版本,例如:窄字符版本TPtrC8,寬字窄版本TPtrC16和中立的版本TPtrC,所以嚴格來講,有六種指針描述符)。指針描述符所持有的字符串是跟描述符本身分開來存放的,它可以被存儲在ROM中,堆中或棧中。由于保存數據的內存既不為描述符所擁有,也不通過它來管理。所以,如果要該描述符是在堆上分配的,那么應通過堆描述符(HBufC,下面將要講解)來操作內存的分配和銷毀;如果指針描述符所指向的字符串是在棧上分配的,那這個內存必須是已經在棧上分配好的。通常情況下,指針描述符是基于棧的,但有時候,它們也可以在堆上使用,例如:作為一個CBase派生類的成員變量的時候。在不可修改的描述符(TPtrC)中,指向數據的指針存放在長度的后面,因此,指針描述符的總長度為2個字(word);在可修改的指針描述符中,它存放在最大長度的后面,因此,總長度為3個字。下圖比較了TPtr和TPtrC內存布局.
?
? TPtrC
TPtrC相當于C語言中的const char*。被它指向的數據可以被訪問但不能被修改:也就是說,描述符中的數據是常量。所有的從基類TDesC中繼承的操作都是可訪問的。TPtrC定義了一系列的構造方法,使得它能從其它的描述符、指向內存的指針或以0結尾的C語言字符串構造。
// 字面量描述符將在后面介紹
_LIT(KLiteralDes, "Sixty zippers were quickly picked from the woven
jute bag");
TPtrC pangramPtr(KLiteralDes); // 從字面量描述符構造
TPtrC copyPtr(pangramPtr); // 從其它的描述符構造
TBufC<100> constBuffer(KLiteralDes); // 常量緩存區描述符,后面介紹
TPtrC ptr(constBuffer); // Constructed from a TBufC
// TText8 is a single (8-bit) character, equivalent to unsigned char
const TText8* cString = (TText8*)"Waltz, bad nymph, for quick jigs
vex";??
// 從以0結尾的字符串構造
TPtrC8 anotherPtr(cString);
TUint8* memoryLocation; // Pointer into memory initialized elsewhere
TInt length; // Length of memory to be represented
...
TPtrC8 memPtr(memoryLocation,length); // 從一個指針構造。
這個指針本身可以改變成指向其他的字符串數據(通過Set()方法)。如果您想指明,不能改變您的TPtrC所指向的數據,那么您可以將TPtrC聲明為const,這樣,當您試圖用Set()方法更改TPtrC所指向的數據時,編譯器會產生警告。
// 字面量描述符
_LIT(KLiteralDes1, "Sixty zippers were quickly picked from the woven jute
bag");
_LIT(KLiteralDes2, "Waltz, bad nymph, for quick jigs vex");
TPtrC alpha(KLiteralDes1);
TPtrC beta(KLiteralDes2);
alpha.Set(KLiteralDes2); // alpha points to the data in KLiteralDes2
beta.Set(KLiteralDes1); // beta points to the data in KLiteralDes1
const TPtrC gamma(beta); // Points to the data in beta, KLiteralDes1
gamma.Set(alpha); // Generates a warning, but points to alpha
? TPtr
TPtr 是可修改的指針描述符,它可用來訪問和修改字符串或二進制數據。TDesC 和TDes所提供的所有的操作都適用于TPtr。這個類定義了一些構造方法,使得它能從指向內存的指針構造,并設置適當的長度值和最大長度值。
編譯器也會產生隱式的構造方法和拷貝構造方法,因為它們沒有被聲明為保護的或私有的。一個TPtr對象可以從其它的可修改描述符構造,例如:通過在不可修改的描述符上調用Des()方法,這個方法返回一個如下所示的TPtr對象:
_LIT(KLiteralDes1, "Jackdaws love my big sphinx of quartz");
TBufC<60> buf(KLiteralDes1); // TBufC are described later
TPtr ptr(buf.Des()); // Copy construction; can modify the data in buf
TInt length = ptr.Length(); // Length = 37
TInt maxLength = ptr.MaxLength(); // Maximum length = 60, as for buf
TUint8* memoryLocation; // Valid pointer into memory
...
TInt len = 12; // Length of data to be represented
TInt maxLen = 32; // Maximum length to be represented
// Construct a pointer descriptor from a pointer into memory
TPtr8 memPtr(memoryLocation, maxLen); // length = 0, max length = 32
TPtr8 memPtr2(memoryLocation, len, maxLen); // length = 12, max = 32
另外,TPtr提供了賦值運算符=(),用來拷貝數據到指針所指向的內存(數據源可以是可修改、不可修改的指針描述符,或以0結尾的字符串)。如果要拷貝的數據的長度超過了描述符的最大長度,會引發一個系統異常。像TPtrC一樣,TPtr也定義了一個Set()方法,用來改變描述符所指向的數據。
_LIT(KLiteralDes1, "Jackdaws love my big sphinx of quartz");
TBufC<60> buf(KLiteralDes1); // TBufC are described later
TPtr ptr(buf.Des()); // Points to the contents of buf
TUint16* memoryLocation; // Valid pointer into memory
...
TInt maxLen = 40; // Maximum length to be represented
TPtr memPtr(memoryLocation, maxLen); // length = 12, max length = 40
// Copy and replace
memPtr = ptr; // memPtr data is KLiteralDes1 (37 bytes), maxLength = 40
_LIT(KLiteralDes2, "The quick brown fox jumps over the lazy dog");
TBufC<100> buf2(KLiteralDes2); // TBufC are described later
TPtr ptr2(buf2.Des()); // Points to the data in buf
// Replace what ptr points to
ptr.Set(ptr2); // ptr points to contents of buf2, max length = 100
memPtr = ptr2; // Attempt to update memPtr which panics because the
// contents of ptr2 (43 bytes) exceeds max length of memPtr (40 bytes)
您一定不要混淆了Set()方法和=()賦值操作。前者將描述符的指針重置,使它指向新的數據區域,而后者將數據拷貝到描述符中,一般來說,這會更改描述符的長度,但不會更改它的最大長度值。
3.5 基于棧(stack-based)的緩沖區描述符
基于緩沖區的描述符也可以分為可修改的TBuf和不可修改TBufC的兩種類型。對這種描述符來講,字符串數據本身就是描述符的一部分。下圖給出了描述符的內存布局:
這兩種描述符通常用來存儲定長的或相對較小的字符串,常用來存放長度小于256個字符的文件名。類似于C語言中的char[],但是,它們具有檢查內存溢出的功能。
? TBufC<n>
TBufC<n>是不可修改的緩沖區類型,它主要用來存放字符串常量或是二進制數據。該類從TBufCBase類派生,尖括號<>內的數字表示分配給該描述符的數據區的大小。它定義了一些構造方法,允許從其它的描述符或以0結尾的字符串構造。也允許創建一個空的描述符,然后再填充。
由于該描述符的數據是不可修改的,它的整個內容可以被置換(通過該類的所定義的賦值操作),用來置換的數據可以是其它的不可修改的描述符或是0結尾的字符串,但是,無論是何種情況,新數據的長度都不能超過長度n(也就是創建該類的時候指定的模板參數)。
_LIT(KPalindrome, "Satan, oscillate my metallic sonatas");
TBufC<50> buf1(KPalindrome); // Constructed from literal descriptor
TBufC<50> buf2(buf1); // Constructed from buf1
// Constructed from a NULL-terminated C string
TBufC<30> buf3((TText*)"Never odd or even");
TBufC<50> buf4; // Constructed empty, length = 0
// Copy and replace
buf4 = buf1; // buf4 contains data copied from buf1, length modified
buf1 = buf3; // buf1 contains data copied from buf3, length modified
buf3 = buf2; // Panic! Max length of buf3 is insufficient for buf2 data
該描述符中的數據可以被整體置換,但不能被直接修改,但有時候我們的確需要修改緩存區中的數據,該怎么辦呢?系統提供了另一種途徑來修改數據。該類定義了Des()方法,它為緩存區中的數據返回一個可修改的指針描述符(TPtr)。我們可以通過這個指針描述符間接地修改緩沖區中的數據。當數據通過指針描述符被修改以后,指針描述符和緩沖區描述符中的iLength的值會跟著改變,但要記住,緩存區描述符的長度值只可能減小,而是不可能增大的,因為,描述符類是不提供內存管理管理功能的。
_LIT8(KPalindrome, "Satan, oscillate my metallic sonatas");
TBufC8<40> buf(KPalindrome); // Constructed from literal descriptor
TPtr8 ptr(buf.Des()); // data is the string in buf, max length = 40
// Illustrates the use of ptr to copy and replace contents of buf
ptr = (TText8*)"Do Geese see God?";
ASSERT(ptr.Length()==buf.Length());
_LIT8(KPalindrome2, "Are we not drawn onward, we few, drawn onward to
new era?");
ptr = KPalindrome2; // Panic! KPalindrome2 exceeds max length of ptr(=40)
? TBuf<n>
這也是一個模板類,它是一個可修改的緩沖區描述符類,后面的<n>表示緩沖區大小。TBuf從TBufBase類派生,而TBufBase是從TDes派生的,因此,它繼承了TDes和TDesC類所有的方法。像TBufC<n>一樣,TBuf<n>也定義了一系列的構造方法和賦值操作。對所有的描述符類型來講,內存管理是您的責任,盡管這個緩沖區中的數據是可修改的,但它的長度不能超過在構造方法中所給定的最大值(n)。假如緩沖區的內容需要擴展,那么您必須決定是在編譯的時候就給定一個足夠大的值,或是在運行的時候動態分配內存。但無論哪種情況,都要確保數據長度不要超過緩存區的最大長度。
如果需要使用動態分配的內存,您可以使用基于堆的描述符,這個我們在后面要講到。要是您覺得管理內存分配的任務太過繁重,您也可以選擇使用動態數組。不過,您應當記住,使用動態數組的額外開銷是很高的。
_LIT(KPalindrome, "Satan, oscillate my metallic sonatas");
TBuf<40> buf1(KPalindrome); // Constructed from literal descriptor
TBuf<40> buf2(buf1); // Constructed from constant buffer descriptor
TBuf8<40> buf3((TText8*)"Do Geese see God?"); // from C string
TBuf<40> buf4; // Constructed empty, length = 0, maximum length = 40
// Illustrate copy and replace
buf4 = buf2; // buf2 copied into buf4, updating length and max length
buf3 = (TText8*)"Murder for a jar of red rum"; // updated from C string
3.6 基于堆的(Heap-Based)緩沖區描述符
當您要使用非常長的字符串時,有另外一種選擇:基于堆的描述符。它能擁有比它的創建者更長的生存期。當您在編譯的時候還不能確定緩沖區長度的時候,堆描述符也是很有用的,這時,它的作用相當于C語言中的malloc。
? HBufC
也許您已經發現,HBufC的類名以“H”開頭,這不符合Symbian系統中慣用的命名習慣。這的確是一個特例,“H”表示這個類一般是在堆(Heap)上分配的。HBufC定義了靜態的NewL()方法,用來在堆上創建一個緩存區。正如您所見到,HBufC中的字母“C”表示這個表述符是不可修改的。對該類的操作幾乎和TBufC<n>一樣:該類提供了一套賦值操作,允許整個緩沖區中的內容被替換掉;同樣,新內容的長度不能超過緩存區的大小,否則會引起系統異常;通過調用Des()方法,可以返回一個可修改的指針描述符(TPtr),可以通過這個指針描述符來更改緩沖區中的內容。
_LIT(KPalindrome, "Do Geese see God?");
TBufC<20> stackBuf(KPalindrome);
// Allocates an empty heap descriptor of max length 20
HBufC* heapBuf = HBufC::NewLC(20);
TInt length = heapBuf->Length();// Current length = 0
TPtr ptr(heapBuf->Des()); // Modification of the heap descriptor
ptr = stackBuf; // Copies stackBuf contents into heapBuf
length = heapBuf->Length(); // length = 17
HBufC* heapBuf2 = stackBuf.AllocLC(); // From stack buffer
length = heapBuf2->Length(); // length = 17
_LIT(KPalindrome2, "Palindrome");
*heapBuf2 = KPalindrome2; // Copy and replace data in heapBuf2
length = heapBuf2->Length(); // length = 10
CleanupStack::PopAndDestroy(2, heapBuf);
記住,堆描述符可以按您的要求的尺寸動態分配內存,但它不會自動按您的期望更改緩沖區的大小。在修改緩存區 的內容之前,您要確保緩存區的內存是足夠的。為了幫您簡化這些操作,HBufC提供的一套ReAllocL()方法,它可以用來擴展堆的緩存區(這個操作有可能會使緩沖區從一個內存區域搬到另一個區域)。
如果您在HBufC上調用Des()方法來獲取了TPtr, 在經過重新分配內存后,TPtr中的成員變量iPtr有可能變成無效的。因此,為了確保安全,在重新分配內存后,應該再次調用Des()來創建一個新的TPtr對象。
注:出于性能上的考慮,Symbian系統并沒有提供可修改的堆描述符HBuf。
總結:Symbian系統中總共有5種類型的描述符,TPtrC,PTtr,TBufC<n>,TBuf<n>和HBufC。下面的圖示表明了它們的繼承關系。

3.7字面量描述符(Literal Descriptors)
下面我們來看看字面量描述符,它相當于C語言中的static char[]。字面量描述符是通過一系列的宏來創建的,這些宏可在頭文件e32def.H中找到
#define _L8(a) (TPtrC8((const TText8 *)(a)))
#define _S8(a) ((const TText8 *)a)
#define _LIT8(name,s) const static TLitC8<sizeof(s)>
name ={sizeof(s)-1,s}
#define _L16(a) (TPtrC16((const TText16 *)L ## a))
#define _S16(a) ((const TText16 *)L ## a)
#define _LIT16(name,s) const static TLitC16<sizeof(L##s)/2>
name ={sizeof(L##s)/2-1,L##s}
首先,我們來看_LIT,這是最有效率也是被使用得最多的一個。這個宏的用法如下:
_LIT(KMyLiteralDescriptor, "The quick brown fox jumps over the lazy dog");
后面KMyLiteralDescriptor就可以作為一個常量來使用,例如可以將它寫到文件或顯示給用戶。_LIT 宏構建了一個名為KMyLiteralDescriptor的TLitC16對象,其中保存了字符串的值(在這個例子中是The quick brown fox jumps over the lazy dog),在二進制程序中可以找到這個值,因為它是被寫到文件中的。如您所料,_LIT8和_LIT16的用法相似。因為描述符的寬度為16bit,所以,在將C字節類型的字符串轉換為描述符能用的數據時,宏將字符串的長度除以2。
作為參考,下面給出類TLitC16的定義,其中__TText被定義為寬的,16bit的字符。TLitC8
也有類似的定義。
template <TInt S>
class TLitC16
{
public:
inline const TDesC16* operator&() const;
inline operator const TDesC16&() const;
inline const TDesC16& operator()() const;
... // Omitted for clarity
public:
TUint iTypeLength;
__TText iBuf[__Align16(S)];
};
template <TInt S>
inline const TDesC16* TLitC16<S>::operator&() const
{return REINTERPRET_CAST(const TDesC16*,this);}
template <TInt S>
inline const TDesC16& TLitC16<S>::operator()() const
{return *operator&();}
template <TInt S>
inline TLitC16<S>::operator const TDesC16&() const
{return *operator&();}
從上面的定義中可以看到, TLitC16 (和TLitC8) 并不從TDesC8 或 TDesC16派生,但是它們與TBufC8 或TBufC16具有相同的內存布局。這就使得TLitC16 (和TLitC8)可以用在任何可以使用TDesC的地方。您也可以用如下的方法從一個字面量構造一個指針描述符:
TPtrC8 thePtr(KMyLiteralDescriptor);
從字面量構造緩沖區描述符需要一點小技巧。如果您用size()去獲得_LIT常量,它會返回相應的TLitC對象的尺寸大小,這個尺寸相當于描述符內容的尺寸加上額外的8個byte(用來存放長度值的4字節和表示結束符的NULL)。如果您想用它來構造基于堆的描述符,必須要將這額外的8個字節考慮進去。
// 定義一個包含44字符的字面量
_LIT8(KExampleLit8, "The quick brown fox jumped over the lazy dog");
TInt size = sizeof(KExampleLit8); // 52 bytes (contents + 8 bytes)
TBufC8<(sizeof(KExampleLit8)-8)> theStackBuffer(KExampleLit8);
對基于堆的描述符,您可以用描述符實際內容的長度來分配緩沖區,然后將內容拷貝到描述符中。為了得到正確的長度,您可以用公共(public)的成員變量iTypeLength,或者,也可以用更簡單的方法,使用()操作符來將字面量轉換成一個描述符,然后用這個得到的描述符來得到內容的長度。但最簡單的方法是,使用()操作符將對象轉換成描述符后,直接調用TDes::AllocL()方法,返回一個HBufC*,代碼如下:
TInt descriptorLength = KExampleLit8.iTypeLength; // 44 bytes
// Form a stack buffer descriptor around the literal
// Create a heap buffer copying the contents of the literal
HBufC8* theHeapBuffer = KExampleLit8().AllocL();
// 對寬字符字面量的操作類似
_LIT16(KExampleLit16, "The quick brown fox jumped over the lazy dog");
size = sizeof(KExampleLit16);// 96 bytes (contents in bytes + 8 bytes)
descriptorLength = KExampleLit16.iTypeLength; // 44 bytes (contents)
用_L 和 _LIT生成的字面量,它們的內存布局是有差異的,如下圖所示:

現在我們簡單地看看 _L 和 _S 宏, 這兩個宏已經過時, 但在測試代碼中還經常用到。
RDebug::Print(_L("Hello world!"));
這個代碼的作用相當于:
_LIT(KLit,"Hello world!");
RDebug::Print(KLit);
從上面的代碼可以看到,使用_L的好處在于,您可以直接使用它,而無需在使用之前,在別的地方聲明。字符串(”Hello world!”)被作為一個基本的以0結尾的字符串寫到二進制文件中,它前面沒有長度值(這不同于_LIT產生的字符串)。由于沒有長度值,字面量的內存布局不同于描述符,并且當代碼運行的時候,_L的第個實例都會產生一個臨時的TPtrC,這個TPtrC的指針指向字面量的第一個字節在ROM中的存儲位置。只要是在創建該字面量的生存期中使用這個臨時的描述符,這都是安全的。然而,創建臨時變量要求設置指針、長度和描述符的類型,這對內聯的構造方法來說是一個負擔,如果代碼中有很多這樣的字面量,也會使得二進制程序的體積增大。如果僅從存儲方式上看,_S 宏和_L是相同的, 但有一點不同------它不產生臨時的TPtrC描述符。如果您僅將它作為以0結尾的描述符使用,那么就使用_S宏。
到目前為止,我們已經討論了關于描述符的基本知識,包括如何實例化每一種具體的描述符,如何訪問和修改描述符的數據,以及如何置換描述符的內容?,F在我們來關注一下操作數據的方法和在使用描述符時一些常見的問題。
3.8描述符作參數和返回類型
在編寫代碼的時候,您可能不想被限制于只能使用TBuf,原因是僅僅因為某個特定的庫函數要求使用它。同樣的道理,作為函數的提供者,您可能對調用者傳遞進來的參數類型不感興趣。事實上,您不應該要求調用者傳遞特定類型的參數,因為您可能在后面要修改函數的實現,您可能要改變描述符的類型,如果您將這樣的函數作為編程接口,最后您不得不讓您的客戶也改變他們的代碼。這樣的改動是非常不理想的,因為它破壞了代碼的兼容性。
除非您來掌管描述符(負責描述符的創建和銷毀工作),您甚至可以不用知道描述符是基于堆的還是基于棧的。事實上,只要標準類型的描述符(我們前面提到的5種描述符類型之一),就可以在它上面調用適當的方法,客戶代碼完全可以忽略描述符的內存布局和它在內存中的位置?;谝陨系脑?#xff0c;當您定義函數的時候,應當盡量使用抽象的基類作為函數的參數和返回值。為了有效率,描述符參數應當使用引用傳遞的方式,要么是const TDesC&或者是TDes&。
例如,類RFile定義了read()和write()方法
IMPORT_C TInt Write(const TDesC8& aDes);
IMPORT_C TInt Read(TDes8& aDes) const;
在這兩個方法中,輸入的描述符被顯式地聲明為8bit的寬度,這樣可以既寫入字符串,也可以寫入二進制數據。被用來寫入到文件中的參數是對一個不可修改的描述符的引用,而在讀文件的時候,使用了可修改的描述符的引用??尚薷拿枋龇淖畲箝L度決定了可以從文件中讀入多少數據,所以不需要再給文件服務器傳遞一個表示長度的參數。文件服務器將會填充滿描述符。當文件中的數據不夠描述符的最大長度時,文件服務器會把所有可得的數據寫入描述符。調用函數后,描述符的長度反映了寫入數據的長度。這樣,調用者也無需再另外傳遞一個參數用來表示返回的數據長度。
當寫一個函數的時候, 如果參數是可修改的描述符,實際上您不必考慮它是否有足夠的空間用來存放數據,因為描述符本身有邊界檢查的機制,如果出現了內存溢出現象,會產生系統異常。
當然,您也可能不希望在描述符數據區過短的情況下,描述符的方法會發生系統異常。這時,您應當在文檔中說明,如果描述符的長度不夠將會如何處理。有時候,一個比較好的方法是,給調用者返回一個長度值,這樣,調用者可以采用適當的步驟來分配一個正確長度的描述符。
HBufC* CPoem::DoGetLineL(TInt aLineNumber)
{// Code omitted for clarity. Allocates and returns a heap buffer
// containing the text of aLineNumber (leaves if aLineNumber is
// out of range)
}
void CPoem::GetLineL(TInt aLineNumber, TDes& aDes)
{
HBufC* line = DoGetLineL(aLineNumber);
CleanupStack::PushL(line);
// Is the descriptor large enough (4 bytes or more) to return an
// integer representing the length of data required?
if (aDes.MaxLength() < line->Length())
{
if (aDes.MaxLength() >= sizeof(TInt))
{// Writes the length required (TPckg is described later)
TPckg<TInt> length(line->Length());
aDes.Copy(length);
}
// Leave & indicate that the current length is too short
User::Leave(KErrOverflow); // Leaves are described in Chapter 2
}
else
{
aDes.Copy(*line);
CleanupStack::PopAndDestroy(line);
}
}
另一個方案是,在函數中分配堆緩沖區,把它返還給調用者,由調用者負責銷毀它。
3.9常用的方法
? Ptr()
基類TDesC 實現了Ptr()方法,用來訪問描述符的數據,該方法返回一個指向字符數組首地址的指針。您可以通過這個指針來直接操作字符串數據。 代碼如下所示:
? Size() 和 Length()
TDesC 實現了 Size() and Length() 方法, 前者返回描述符所占有的字節數,而后者返回的是描述符的字符長度。對8bit的描述符來講,它們是相等的,而對16bit的描述來說,Size() 返回的數值是 Length() 的兩倍。
? MaxLength()
可修改的描述符TDes實現的這個方法返回描述符的最大長度。
? SetLength()和SetMax()
前者用來設置描述符的長度,這個長度值必須是小于描述符的最大長度的,否則會引起系統異常。后者將描述符的當前長度設置成最大值,注意,它不并不能擴展描述符數據區的長度。
? Zero()和FillZ()
前者將描述符的長度設置為0,而后者是用0來來填充描述符的內容置。如果您要用其它字符填充描述符的內容,可用Fill()方法。這個方案類似于C語言中的memset()函數。
? Copy()
TDes 實現了一系列的重的Copy() 方法, 下面是其中的兩個:
IMPORT_C void Copy(const TDesC8 &aDes);
IMPORT_C void Copy(const TDesC16 &aDes);
這些方法將參數描述符中的數據拷貝到目標描述符中,同時為目標描述符設置新的長度。如可源描述符的長度超過目標描述符的最大長度,將會引發一個系統異常。
3.10 使用HBufC 堆描述符
我們已經討論過描述符的一些特性,現在來關注一下使用描述符時經常容易范的錯誤。
?首先,我們將創建和使用堆描述符HBufC。前面提到過,在已有的描述符上調用Alloc()或AllocL()方法,可以產生一個新的HBufC。這里是一個例子:
void CSampleClass::UnnecessaryCodeL(const TDesC& aDes)
{
iHeapBuffer = HBufC::NewL(aDes.Length());
TPtr ptr(iHeapBuffer->Des());
ptr.Copy(aDes);
...
// 以上代碼完全可以被下面的代替,下面代碼更有效率。
iHeapBuffer = aDes.AllocL();
}
Another common way to introduce complexity occurs in the opposite
direction, that is, the generation of TDesC& from a heap descriptor.
當從一個堆描述符產生一個TDesC&的時候,也容易范一個錯誤,這個錯誤同樣為代碼增加了復雜性。代碼如下所示:
const TDesC& CSampleClass::MoreAccidentalComplexity()
{
return (iHeapBuffer->Des());
// 以上代碼完全可以寫成
return (*iHeapBuffer);? //這樣更簡潔高效
}
另外一個比較微妙問題是,當您分配一個HBufC以后,然后在它上面調用Des(),可以返回一個TPtr對象。
HBufC* buf = HBufC::NewL(9);
TPtr p = buf->Des();
可是,假如您回憶一下,可以知道在HBufC中,并沒有一個字(word)用來保存最大長度的信息------因為HBufC是不可修改的(non-modifiable),它不需要最大長度的信息。然而,,TPtr需要這個最大長度的信息,這時問題來了,您從哪里得到這個最大長度呢?答案在于:當您調用Des()的時候,系統用HBufC的最大長度來設置TPtr的最大長度(iMaxLength)。
在這個例子中,buf的最大長度是多少呢?它是9嗎?答案是不一定。堆描述符的最大長度有可能并不是您所期望的值(在這個例子中為9)。這是由于您并沒有指定一個字對齊(word-aligned)的最大長度,所以最后的實際的長度可能比您所指定的長度要大一些(但我們不能確定這個值到底是多少)。
_LIT(KPanic, "TestPointer");
const TInt KBufferLength = 9;
void TestPointer()
{ // Create a buffer with length KBufferLength = 9 bytes
HBufC8* myBuffer = HBufC8::NewMaxL(KBufferLength);
TPtr8 myPtr(myBuffer->Des());
TInt len = myPtr.Length();??? //len的值為0
TInt maxLen = myPtr.MaxLength();? //得到一個比KBufferLength稍大數,并不固定
myPtr.SetLength(KBufferLength); //或myPtr.SetMax();否則下面的語句不起作用
myPtr.Fill(’?’); // 用’?’填充描述符
char* ptr = (char*)myPtr.Ptr();//確保已經調用了SetLength()或SetMax()方法。
ptr[0] = 'x';
?
HBufC8* buf = HBufC8::NewLC(9);
TPtr8 ptr(buf->Des());
TInt maxLength = ptr.MaxLength(); // maxLength比9大,但不一定等于12(字的邊界)
3.11 TFileName的濫用
對TFileName 對象的濫用是一個潛在的危險。TFileName是在文件 e32std.H中定義的:
const TInt KMaxFileName=0x100; // = 256 (decimal)
typedef TBuf<KMaxFileName> TFileName;
由于每個寬字符相當于兩個字節(前面說過,默認情況下,TBuf是16bit寬度的), 所以,無論文件名的長度為多少,每次您在棧上創建一個TFileName 對象的時候都消耗了524 個字節 (2 × 256 描述符數據字節 + 描述符本身的12字節)。在Symbian OS系統中,標準的??臻g的大小為8K字節,不必要地使用有限的資源是非常浪費的,所以盡量不要使用基于棧的TFileName 對象,也不要用值傳遞的方式使用它們,應當使用引用傳遞的方式。您可以在堆上使用它們,比如,您可以把它們作為C類(從CBase派生的類)的成員變量。如果,您不需要使用完整的路徑,你也可以用HBufC來存放文件名,盡量少用資源總是好的。
您最好不要使用TParse 類(在f32file.H中定義)。因為這個類保存了一個描述符的拷貝,在拷貝中包含了要解析的文件名,拷貝會用掉寶貴的??臻g。您應當考慮使用TParsePtr 和 TParsePtrC 類;它們提供了同樣的功能,但它們不拷貝文件名,而僅僅保存對文件名的引用。
4有用的輔助類
在討論了這些普遍的問題之后,我們在這一章的結尾來看看兩個常用的輔助類。
4.1 TLex(TLex8,TLex16)類
像描述符一樣,TLex也有8bit和16bit兩種版本,分別是TLex8 and TLex16,一般情況下,你應當使用TLex,而無需指定特定的版本。該類實現了一般目的詞法分析,和語法成分解析以及從字符串到數字轉換的功能。
4.2 Pckg類
另外一套有用的輔助類分別是:TPckgBuf和TPckg以及TPckgC,它們是分別派生自TBuf<n>, TPtr 和 TPtrC的模板類,在文件e32std.H中可以找到它們的定義。
打包類(package class)能很方便地將扁平的(flat)數據對象存儲到描述符中,這在跨線程或跨進程的數據共享的時候很有用。 實際上,能將一個T類對象完整地打包到描述符中,這樣很容易以一種類型安全的方式在線程間共享它。
有兩種Package指針類:TPckg,TPckgC,它們分別對應于可修改和不可修改的類型,都持有一個指向被包裝對象的指針。
class TSample
{
?public:
?void SampleFunction();
?void ConstantSampleFunction() const;
?private:
?TInt iSampleData;
};
TSample theSample;
TPckg<TSample> packagePtr(theSample);
TPckgC<TSample> packagePtrC(theSample);
在這個例子中,TPckg<TSample>表示這是一個模板類,模板參數為TSample,packagePtr(theSample)定義了一個對象,它持有一個指向theSample的針指;可以在
包對象上調用()方法,返回被包裝對象的引用。代碼如下:
packagePtr().SampleFunction(); //合法
packagePtrC().SampleFunction();//編譯錯誤!只能調用const方法
packagePtrC().ConstantSampleFunction();//合法
TPckgBuf類創建并存儲一個新的被包裝類型的實例(注意,是窗建新的實例而不是保存指針) ,TPckgBuf自己管理這個拷貝的對象;在TPckgBuf對象上調用()方法,可以返回對拷貝的引用,然后可以在這個引用上調用其它的方法。這個TPckgBuf對象所擁有的拷貝可以被修改。代碼如下:
TPckgBuf<TSample> packageBuf(theSample);
packageBuf().SampleFunction();
由于TPckgBuf擁有原始數據的拷貝,所以,如果在上面調用了可修改成員變量的方法,那么被修改的只是拷貝的數據,而原來的數據不受影響(這類似于函數調用時的值傳遞方式)。
下面的圖示表明了它們的內存布局:

?

本文來自CSDN博客,轉載請標明出處:http://blog.csdn.net/wh_xiexing/archive/2007/11/22/1897843.aspx

總結

以上是生活随笔為你收集整理的Symbian系统开发教程(二)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

香蕉97视频观看在线观看 | 久久1电影院 | 久久99亚洲精品 | 久久不卡免费视频 | 九九久久影院 | 欧美精品国产综合久久 | 99久久精品免费一区 | 国产91精品在线播放 | 欧美 日韩 久久 | 久久久久黄 | 国产精品女 | 91亚洲精品乱码久久久久久蜜桃 | 国产精品中文字幕在线观看 | a久久久久 | 97色综合 | 婷婷色综合色 | 日本爱爱免费视频 | 五月天电影免费在线观看一区 | 国产高清在线免费 | 国产玖玖在线 | 在线观看岛国片 | 青青河边草免费观看完整版高清 | 亚洲区精品 | 干干干操操操 | 一级黄色电影网站 | 99视频偷窥在线精品国自产拍 | 在线电影av | 久久久国内精品 | 久草在线手机观看 | 国产精品99久久久久 | 亚洲黄网址| 人人爽人人爽人人片av | 91尤物在线播放 | 亚洲免费在线播放视频 | 日韩高清无线码2023 | 天天操天天干天天爽 | 国产在线2020 | 蜜臀av性久久久久av蜜臀妖精 | 久久精品导航 | 成人三级网址 | 国产乱码精品一区二区三区介绍 | 亚洲乱码久久久 | 色婷婷电影网 | 国产黄色片网站 | 国产精品一区二区av影院萌芽 | 丁香在线观看完整电影视频 | 亚洲欧美成人综合 | 欧美性做爰猛烈叫床潮 | 伊人久久电影网 | 国产原创在线 | 亚洲午夜精品电影 | 国产精品美女久久久网av | 五月天久久激情 | 亚洲精品女人久久久 | 午夜性色 | 九九热免费视频在线观看 | 亚洲国产网站 | 亚洲精品视频免费在线 | 国产黄免费在线观看 | 久久免费视频国产 | 国产成人黄色片 | 国产一区二区成人 | www免费黄色| 五月婷婷久 | 99热超碰 | 欧美日韩大片在线观看 | 国产裸体永久免费视频网站 | 99免费在线视频观看 | 天天干天天草天天爽 | 日韩免费在线网站 | 亚洲男男gaygayxxxgv | 久久观看最新视频 | 日韩精品专区 | 国产尤物在线视频 | 在线看91| 看黄色91 | 亚洲第五色综合网 | 国产人在线成免费视频 | 久久久久久免费视频 | 免费成人在线观看视频 | 成人在线一区二区三区 | 黄色成人免费电影 | 丁香婷婷在线 | 久久 国产一区 | 三上悠亚一区二区在线观看 | 99视频久| 亚洲高清av在线 | 成年人在线观看视频免费 | 国产精品久久久久久久午夜 | 1000部国产精品成人观看 | 日日操狠狠干 | 久久永久视频 | 黄色一级在线免费观看 | 国产麻豆电影在线观看 | 国产精品入口久久 | 99久久精品国产欧美主题曲 | 日韩经典一区二区三区 | 一区二区三区在线视频观看58 | 91精品免费视频 | 视频一区在线免费观看 | 久久久这里有精品 | 久久综合给合久久狠狠色 | 国产黄色片免费观看 | 成人一区二区三区在线观看 | 特级片免费看 | 亚洲成人免费在线 | 一区二区三区 亚洲 | 超碰在线94 | 成人av片在线观看 | 国内视频在线观看 | www视频在线免费观看 | 97精产国品一二三产区在线 | 欧美精品久久久久久久久老牛影院 | 中文字幕免费国产精品 | 最近高清中文在线字幕在线观看 | 一区二区三区在线免费观看视频 | av在线播放亚洲 | 日韩激情网 | 又大又硬又黄又爽视频在线观看 | av一区二区在线观看中文字幕 | 国模一二三区 | 欧美一区二区三区四区夜夜大片 | 四虎国产免费 | 福利在线看片 | 中文字幕成人在线观看 | 操操综合网 | 日韩女同av | 91看片在线看片 | 一区二区精品在线视频 | 91精品网站| 成人免费视频免费观看 | 欧美激情精品久久久久久变态 | 日韩二区三区在线 | 一区二区三区动漫 | 日本系列中文字幕 | 91在线国内视频 | 欧美另类tv | 成人国产精品免费 | 美女一区网站 | 不卡的av片| 黄色av网站在线观看免费 | 99性视频 | 日韩免费观看高清 | 日韩精品久久久久久久电影99爱 | 五月天六月婷 | av网在线观看 | 五月婷丁香网 | 久久毛片高清国产 | 久久久久综合 | 中文字幕亚洲综合久久五月天色无吗'' | 天天激情站 | 99在线视频免费观看 | 欧美日韩一区二区在线观看 | av在线免费播放网站 | 久久成人一区 | 国产免费一区二区三区最新6 | 精品久久久久久国产91 | 欧美激情h | 亚洲三级在线播放 | 天天色天天干天天色 | 色先锋资源网 | 人人澡超碰碰97碰碰碰软件 | 欧美日韩在线观看一区二区 | 久久精品视频在线播放 | 国产日产精品一区二区三区四区 | 午夜免费久久看 | 亚洲国产美女精品久久久久∴ | 人人爱人人射 | 粉嫩av一区二区三区四区 | 欧美动漫一区二区三区 | 91av美女| 免费亚洲黄色 | 不卡av电影在线观看 | 91久久国产自产拍夜夜嗨 | 综合视频在线 | 中文字幕中文字幕中文字幕 | av免费成人 | 综合久色 | 免费在线观看视频a | 色在线视频 | 黄色在线看网站 | 国产视频二 | 久操伊人| 国产资源在线播放 | www日| 亚洲国产欧美在线看片xxoo | 日韩午夜视频在线观看 | 一区二区中文字幕在线 | 久草在线视频首页 | 天天天综合 | 91视频在线观看免费 | 性色av免费在线观看 | 免费黄色看片 | 久久97精品| 国产在线观看免费观看 | 中文在线最新版天堂 | 性色av免费在线观看 | 深夜男人影院 | 日本三级香港三级人妇99 | 国产不卡在线视频 | avav片 | 久久九九免费视频 | 日本黄色免费在线 | 国产精品123 | 国产99精品在线观看 | 久久人人插 | 国产精品久久中文字幕 | 91成人免费观看视频 | 狠狠狠的干 | 国产福利免费在线观看 | 毛片无卡免费无播放器 | 国产99久久久国产精品成人免费 | 中文字幕日韩无 | 99在线视频免费观看 | 丁香国产视频 | 久久精品免费看 | 最近中文字幕大全中文字幕免费 | 国产免费观看久久黄 | 精品超碰| 六月激情 | 欧美成人免费在线 | 色福利网站 | 91日韩在线视频 | 500部大龄熟乱视频使用方法 | 亚州av成人| 日本精品一 | 国产一级在线观看 | 亚洲精品网站 | 香蕉久久久久久久 | 狠狠操操| 日韩专区中文字幕 | 91在线免费播放视频 | 中文字幕久久久精品 | 最新亚洲视频 | 超碰97.com | 日韩毛片在线播放 | 精品免费观看视频 | 娇妻呻吟一区二区三区 | 精品一区二区三区久久久 | 九七视频在线 | 久久九九影院 | 成年人在线观看 | 免费在线观看91 | 免费91在线观看 | 亚洲aⅴ在线 | 91看片在线播放 | 久青草电影 | 久久久久国 | 亚洲人久久 | 在线观看视频中文字幕 | 综合色综合色 | 国产无套精品久久久久久 | 国产91精品在线播放 | 免费在线观看91 | 在线91播放 | 久久精品96 | 久久久久久久99精品免费观看 | 成人a级网站| 国产精品久久久久久久电影 | 久久婷亚洲五月一区天天躁 | 天天av在线播放 | 91cn国产在线 | 久久狠狠一本精品综合网 | 日b视频国产 | 亚洲精品美女久久久久 | 国产精品女同一区二区三区久久夜 | 亚洲国产精品一区二区久久,亚洲午夜 | 99免费在线| 日韩国产高清在线 | 激情视频久久 | av直接看| 久久精品4 | 国产精品久久一区二区无卡 | 日韩一区二区三区高清免费看看 | 五月天视频网站 | 91高清视频免费 | 国内精品久久久久影院日本资源 | 操操爽| 99久久精品免费一区 | 亚洲成人国产精品 | 天天干国产 | 九九视频免费在线观看 | 麻豆网站免费观看 | 午夜免费电影院 | 九九热在线精品视频 | 国产欧美精品在线观看 | 91在线视频在线 | 天天av天天 | 日日干美女 | h动漫中文字幕 | 日本午夜在线亚洲.国产 | 久草网免费 | 一区二区三区四区不卡 | 亚洲天堂网在线视频观看 | 美女网站黄免费 | www.亚洲视频.com | 在线观看视频免费播放 | 91在线在线观看 | 中文字幕乱视频 | 九九热只有精品 | 久久久精品网站 | 国产精品一区免费看8c0m | 伊人婷婷在线 | 91精品视频免费看 | 国产99一区二区 | 欧美在线视频日韩 | 日韩av一区二区三区四区 | 少妇精69xxtheporn | 国产婷婷vvvv激情久 | 五月花丁香婷婷 | av一级久久 | 日日摸日日爽 | 国产精品福利一区 | 99在线视频观看 | www..com黄色片 | 成人手机在线视频 | 欧美大片mv免费 | 午夜免费电影院 | 久久视频在线视频 | 亚洲a在线观看 | 狠狠色伊人亚洲综合网站野外 | 色a网| www.国产在线视频 | 91精品国产乱码在线观看 | avlulu久久精品 | 四虎在线免费观看 | 欧美日韩不卡在线观看 | 成人免费观看在线视频 | 91在线看片| 日韩av手机在线观看 | 欧美激情精品久久 | 97色视频在线 | 99久久婷婷 | 久久激情视频 久久 | 五月色婷 | 精品国产伦一区二区三区观看方式 | 亚洲精品在线观看中文字幕 | 免费在线观看av电影 | 中文字幕在线观看不卡 | 国产一区在线视频播放 | 色在线中文字幕 | 天天亚洲 | 国产成人精品一区二区三区福利 | 国产精品自产拍在线观看 | 日韩黄色免费 | 在线观看国产www | 插久久| 国产一区二区三区高清播放 | 欧美日韩高清一区二区 国产亚洲免费看 | 国产精品毛片完整版 | 日韩av不卡播放 | 久久成人久久 | 久草在线欧美 | 亚洲激情国产精品 | 成人h动漫精品一区二 | 91精品国产综合久久久久久久 | 亚洲精品乱码久久久久久蜜桃动漫 | 亚洲国产精品成人综合 | 亚洲理论电影网 | av国产在线观看 | 国产精品久久久久久久久久久久午夜 | 超碰在线98 | 91丨九色丨勾搭 | 丝袜+亚洲+另类+欧美+变态 | 韩国三级一区 | 中文字幕在线播放一区二区 | 国产精品久久久久久久久软件 | 久草99| av免费在线播放 | 色com网 | 在线电影日韩 | 久久99免费视频 | 国产一区麻豆 | 黄色大全免费观看 | 91麻豆精品91久久久久同性 | 欧美少妇xxxxxx | 久久久精品欧美一区二区免费 | 国产精品18久久久久久不卡孕妇 | 日韩激情视频在线 | 欧美婷婷综合 | 久久久久久久久国产 | 特级西西www44高清大胆图片 | av字幕在线 | 91新人在线观看 | 干天天| 97色在线| 久久视频中文字幕 | 黄色99视频 | 日韩中文字幕免费电影 | 亚洲 欧美 国产 va在线影院 | 夜夜骑日日操 | 在线观看视频亚洲 | 日韩成人在线一区二区 | 激情久久久久久久久久久久久久久久 | 欧美日韩一区二区三区视频 | www.av小说 | 天天综合视频在线观看 | 在线视频观看亚洲 | 色国产在线 | 免费在线观看av片 | 中文亚洲欧美日韩 | 天天射天天干天天操 | 国产在线免费av | 国产丝袜制服在线 | 黄色网址在线播放 | 五月婷婷av在线 | 一级淫片在线观看 | 国产精品亚洲综合久久 | 国产九九精品 | 欧美激情另类文学 | 欧美在线观看视频 | 国精产品永久999 | 久久美女免费视频 | 亚洲理论电影网 | 18+视频网站链接 | 亚洲精品午夜久久久 | 欧美国产一区二区 | japanesefreesexvideo高潮 | 激情在线免费视频 | 黄色福利视频网站 | 成年人app网址 | 亚洲一区二区三区毛片 | 久久爱资源网 | 国产二级视频 | 国产高清在线永久 | 国产精品无| 精品一区二区三区电影 | 最近中文字幕国语免费高清6 | 麻豆va一区二区三区久久浪 | 美女视频免费精品 | 在线日本看片免费人成视久网 | 精品久久久久久久久亚洲 | 国模一区二区三区四区 | av在线激情| 国产又黄又爽无遮挡 | av在线在线 | 欧美精品一区二区在线播放 | 成年人免费看av | 麻豆传媒视频在线 | 欧美视频日韩 | 探花视频在线观看免费版 | 国产精品久久久久久一区二区三区 | 国产中文字幕在线免费观看 | 欧美性一级观看 | 欧美日韩精品免费观看视频 | 91网站在线视频 | 久草免费福利在线观看 | 国产免费av一区二区三区 | 日b视频国产 | 色姑娘综合网 | 国产成人精品综合久久久 | av电影中文 | 久久精品视频免费 | 久草国产精品 | 国产专区精品视频 | 欧美人操人| www.一区二区三区 | 免费在线一区二区 | 成人一级片在线观看 | 91成人久久| 日韩欧美精品在线 | 中文字幕第一页在线视频 | 人人看黄色| 在线视频免费观看 | 91免费高清 | 欧美精品亚洲精品日韩精品 | 久草视频看看 | 久久激情五月丁香伊人 | 欧美性色综合网站 | 午夜在线观看影院 | 久久艹久久| 日韩电影在线一区 | 亚洲国产av精品毛片鲁大师 | 精品a在线 | 成人av教育 | 亚州天堂 | 中文字幕免费不卡视频 | 久久人人97超碰国产公开结果 | 国产99亚洲 | 国产精品涩涩屋www在线观看 | 麻豆视频国产精品 | 久久成人一区二区 | 日韩在线观看你懂得 | 国产午夜精品理论片在线 | 国产一区免费在线 | 日韩av看片 | 91精品日韩 | 香蕉视频导航 | 91视频下载| 欧洲精品视频一区二区 | 亚洲高清在线视频 | 99精品在线直播 | 亚洲精品裸体 | 欧美日韩一区二区免费在线观看 | 天天操天天舔天天干 | 欧美性做爰猛烈叫床潮 | 丁香视频全集免费观看 | 日韩在线电影 | 手机在线看a | 97超碰超碰久久福利超碰 | 美女精品国产 | 欧美最猛性xxxxx亚洲精品 | 欧美在线视频精品 | 中文字幕av免费在线观看 | 在线精品视频免费播放 | 激情欧美xxxx| 免费不卡中文字幕视频 | 久久艹国产 | 色在线免费 | 天天爽夜夜爽人人爽一区二区 | 一区二区三区三区在线 | 成人污视频在线观看 | 视频在线观看入口黄最新永久免费国产 | 麻豆视频在线免费看 | 99热网站 | 美女免费黄网站 | 不卡视频一区二区三区 | 97精品国产97久久久久久久久久久久 | 日韩精品免费在线视频 | 九九热99视频 | 欧美日韩一区二区在线观看 | 日韩免费一区 | 少妇高潮流白浆在线观看 | 国产区精品视频 | 日日操天天操狠狠操 | 亚洲在线观看av | 99久久精品久久久久久动态片 | 91麻豆精品国产91久久久无需广告 | 成人在线免费观看视视频 | 国产日韩欧美在线看 | 亚洲国产精品电影在线观看 | 在线91播放| 丁香六月激情婷婷 | 国产91精品一区二区绿帽 | 99精品视频免费在线观看 | 亚洲精品综合在线观看 | 国产日韩欧美精品在线观看 | 夜夜躁狠狠躁日日躁视频黑人 | 国产视频在线观看一区二区 | 天天操夜夜操夜夜操 | 久草在线资源免费 | 天天操天天射天天添 | 色黄视频免费观看 | 久久久久美女 | 91av在线视频免费观看 | 五月婷婷在线播放 | 国产精品久久久久久久久久尿 | 一区二区三区四区五区在线 | 97成人在线免费视频 | 在线观看黄a | 射射射综合网 | 五月婷婷中文字幕 | 高清在线观看av | 中文字幕日韩在线播放 | 成人国产精品入口 | 天天爽天天碰狠狠添 | 91精品久久久久久综合乱菊 | 亚洲黄色免费观看 | 天天干天天操天天入 | www操操操 | 亚洲理论电影 | 四虎免费av | 特级片免费看 | 国产裸体视频网站 | 亚洲va欧美va人人爽春色影视 | 成人日批视频 | 激情视频国产 | 日韩在线观看的 | 五月激情电影 | 天天躁天天操 | 91黄视频在线 | 成人黄大片 | 77国产精品 | 97人人澡人人爽人人模亚洲 | 亚洲婷婷网 | 天天综合天天综合 | 久久免费在线视频 | 91精品欧美 | 亚洲精品视频免费 | 1024久久| 在线观看涩涩 | 欧美国产一区二区 | 97视频免费在线看 | 99 色| 中文字幕一区二区三区四区久久 | 色综合a| 日韩在线不卡视频 | 麻豆视频在线观看免费 | 久久久久久久久久电影 | 国产精品国产三级国产不产一地 | 国产裸体永久免费视频网站 | 久久国产精品色av免费看 | 久久私人影院 | 久久久伦理| 麻花豆传媒mv在线观看 | 一区二区视频播放 | 人人狠狠综合久久亚洲婷 | 2019免费中文字幕 | 国产中文字幕一区 | 99亚洲视频| 精品毛片一区二区免费看 | 国产一级二级三级视频 | 亚洲成熟女人毛片在线 | 91中文字幕永久在线 | 亚洲精品欧美成人 | 日韩欧美视频一区二区三区 | 久久精品专区 | 亚洲精品综合在线 | 99久久精品免费看国产麻豆 | av在线免费观看不卡 | 国产精品av在线 | 久久不射电影院 | 欧美 日韩 国产 成人 在线 | 精品视频国产 | 久久视频在线看 | 天天操夜夜操天天射 | 日韩黄色免费在线观看 | 99热这里只有精品久久 | 亚洲色图av | av福利网址导航大全 | 免费在线观看成人小视频 | 日日爱av | 国产精品久久av | 亚洲精品久久久久58 | 日韩电影在线观看一区二区 | 亚洲精品免费在线观看视频 | 中文资源在线播放 | 亚洲精品国产精品乱码在线观看 | 五月在线视频 | 玖玖玖在线观看 | 国产精品高清免费在线观看 | 国产黄色精品在线 | 亚州精品在线视频 | 992tv在线 | 能在线观看的日韩av | 日韩免费视频网站 | 欧美成a人片在线观看久 | 亚洲视频免费在线看 | 天天操天天干天天操天天干 | 特级毛片网 | 国产精美视频 | 国产精品福利视频 | 人人插人人艹 | 天天插天天操天天干 | 欧美性春潮 | 国产视频精品久久 | 在线免费观看的av | 国产精品日韩在线播放 | 亚洲动漫在线观看 | 国产精品一区二 | 米奇四色影视 | 亚洲视频一级 | 色婷婷视频网 | 日韩免费二区 | 视频一区在线播放 | 欧美日韩一区三区 | 99电影456麻豆 | 在线激情av电影 | 99精品在线 | 日韩欧美99 | 看v片| 成人国产精品久久久 | 在线黄色国产 | 狠狠激情中文字幕 | 日韩 在线观看 | 国产成人久久av977小说 | 亚洲在线视频播放 | 日韩有码欧美 | 日本一区二区高清不卡 | 免费看久久久 | 蜜桃传媒一区二区 | 亚洲久草在线 | 永久免费在线 | 在线视频观看国产 | 久久精品亚洲国产 | 婷婷色吧| 特级西西444www大精品视频免费看 | 久久免费视频6 | 91精品国产91p65 | 在线免费观看视频一区 | 五月婷婷在线观看 | 亚洲视频,欧洲视频 | 欧美日韩国产网站 | 国产精品毛片一区二区 | 欧美亚洲精品在线观看 | av蜜桃在线 | 亚洲婷婷在线 | 人人插人人| 精品一区二区6 | av视屏在线 | 成人亚洲精品久久久久 | 国内精品毛片 | 在线视频中文字幕一区 | 五月婷婷免费 | 三级在线国产 | 国产香蕉视频在线播放 | 国产高清在线不卡 | 国产黄色在线看 | 一级片免费视频 | 91麻豆精品国产91久久久无限制版 | 91精品对白一区国产伦 | 亚洲成人黄色av | 久久久久麻豆 | 97在线观看视频免费 | 99riav1国产精品视频 | 久久久999免费视频 日韩网站在线 | 特级毛片在线免费观看 | 中文字幕丰满人伦在线 | 免费看黄在线 | 91成年人在线观看 | 在线视频观看91 | 玖草影院| 波多在线视频 | 黄色午夜网站 | 国内成人精品视频 | 成人毛片a | 9999在线| 国产 欧美 日韩 | 久久久一本精品99久久精品66 | 国产在线高清视频 | 91精品国产一区二区三区 | 日韩精品久久一区二区 | 国产精品一区二区三区在线 | 欧美精品三级 | 黄色国产区 | 免费三级大片 | 国产精品一区二区吃奶在线观看 | 亚洲精品电影在线 | 久亚洲 | 国产精品一区二区久久精品爱涩 | 一级黄色片在线 | 亚洲综合色站 | 狠狠精品 | 欧美成人精品三级在线观看播放 | 亚洲午夜大片 | 国产破处在线播放 | 美女精品在线 | 国产高清视频在线免费观看 | 久久成人午夜视频 | 又色又爽又黄高潮的免费视频 | 久久伦理| 久久久久国产精品午夜一区 | 国产91精品久久久久久 | 欧美成人精品xxx | 亚洲精品国产麻豆 | 成年人三级网站 | 中文字幕在线成人 | 999ZYZ玖玖资源站永久 | 日本福利视频在线 | 成人毛片在线视频 | 91精品色| 婷婷激情影院 | 日韩a在线看 | 久久av免费电影 | 亚洲一区二区观看 | 国产亚洲免费观看 | 欧美一区二区在线免费观看 | 国产精品成人免费精品自在线观看 | 中文字幕在线资源 | 中文字幕丝袜制服 | 人人爽人人爽人人爽人人爽 | 国产午夜免费视频 | 久久在线观看 | 天天天干 | 日韩在线高清免费视频 | 91完整版观看 | 亚洲精品中文在线 | av在线之家电影网站 | 免费日韩 精品中文字幕视频在线 | 国产精品你懂的在线观看 | 蜜臀av免费一区二区三区 | 综合久久久久久久久 | 丰满少妇麻豆av | 黄色一级网 | 欧美色图88| 人交video另类hd | 在线色视频小说 | 91传媒视频在线观看 | 国内精品久久久精品电影院 | 伊色综合久久之综合久久 | 天天天天射 | 在线观看黄色小视频 | 日韩一区二区免费播放 | 久草在线免费资源 | 91日韩在线播放 | 人人草人人草 | 亚洲国产剧情 | 国产视频久久 | 色综合天天做天天爱 | 中文字幕在线资源 | 9797在线看片亚洲精品 | 亚洲国内精品在线 | 欧美日韩在线免费观看 | 国产打女人屁股调教97 | 99免在线观看免费视频高清 | 亚洲视频在线观看网站 | 亚洲专区 国产精品 | 日韩剧| 黄色av成人在线观看 | 亚洲 中文 欧美 日韩vr 在线 | 日韩精品一区二区在线观看视频 | 中文亚洲欧美日韩 | 美女免费黄网站 | 激情综合亚洲精品 | 国产日韩精品视频 | 久久九九久久 | 黄色一集片| 韩国在线一区 | 久久天堂精品视频 | 韩国精品福利一区二区三区 | 午夜精品导航 | 亚洲午夜av | 992tv在线| 黄网站色视频免费观看 | 久久久久久久国产精品视频 | 91传媒在线看 | 国产黄色片在线免费观看 | 日韩免费观看一区二区 | 超级碰碰碰碰 | 久久精品99视频 | 国产精品一区二区三区免费视频 | 天天色中文| 欧美日韩精品在线观看视频 | 亚洲免费av在线 | 午夜成人免费电影 | 九色91在线视频 | 在线免费观看欧美日韩 | 999在线精品 | 成人宗合网 | 久久国产影院 | 有码中文字幕在线观看 | 国产中文字幕国产 | 亚洲毛片久久 | 韩国av一区 | 日韩在线色视频 | 岛国精品一区二区 | 日日夜夜精品免费 | 在线看片日韩 | 久久尤物电影视频在线观看 | 国内一级片在线观看 | 国产成人精品亚洲精品 | 亚洲伦理精品 | 亚州成人av在线 | 日本久久综合视频 | 国产久草在线 | 蜜桃av综合网| 激情小说 五月 | 成人性生交大片免费看中文网站 | 亚洲精品在线观看中文字幕 | avlulu久久精品 | 日本在线免费看 | 美女性爽视频国产免费app | 久久伦理影院 | 人人草在线观看 | 中文字幕日韩伦理 | 色综合久久精品 | 亚洲国产最新 | 中文字幕日本电影 | 正在播放日韩 | 手机色站| 亚洲a色| 精品在线观看视频 | 午夜精品电影一区二区在线 | 国产精品99久久免费观看 | 国产精品久久久久久a | 天天干天天弄 | 波多野结衣视频在线 | 99久久精品电影 | 日韩在线中文字幕视频 | www.com久久久 | 91九色蝌蚪视频 | 麻花豆传媒mv在线观看网站 | 欧美看片 | 伊人久久一区 | 一区二区视频免费在线观看 | 六月丁香婷婷网 | 亚洲精品乱码久久久久久高潮 | 国产精品99久久久久久武松影视 | 日韩欧美在线视频一区二区 | 国产精品一区二区免费在线观看 | 成人免费看片网址 | 91亚洲精品乱码久久久久久蜜桃 | 国产人免费人成免费视频 | 久久精品视频在线 | 午夜精品一区二区三区在线 | 日本福利视频在线 | 国产精品密入口果冻 | 狠狠插天天干 | 视频一区视频二区在线观看 | 欧美日韩一级视频 | 精品国产区 | 久久久激情视频 | 麻豆精品传媒视频 | 国产欧美综合在线观看 | 中文字幕日本在线 | 欧美精彩视频在线观看 | 欧美日一级片 | 日韩精品免费在线观看 | 婷婷色在线观看 | 日韩欧美视频在线播放 | 色偷偷88888欧美精品久久久 | 超碰在线日韩 | 色的网站在线观看 | 日韩精品在线观看av | 狠狠干电影 | av最新资源 | 久久国产精彩视频 | 国产成人精品av久久 | 日韩中文字幕在线看 | 麻豆 videos | 久久国产精品99精国产 | 日韩激情三级 | 最新久久久 | 国产精品99久久久久久有的能看 | 欧美做受69| 欧美日韩三级在线观看 | 久草在线99 | 亚洲 欧美 成人 | 精品毛片在线 | 91看片在线播放 | 亚洲一级二级 | 日韩中文字幕亚洲一区二区va在线 | 成年人在线观看 | 伊香蕉大综综综合久久啪 | 黄色一级影院 | 日韩理论影院 | 麻豆视频国产精品 | 毛片3| 中文字幕之中文字幕 | 亚洲激情六月 | 色综合久久久久综合 | 麻豆传媒视频在线免费观看 | 在线蜜桃视频 | 在线影院av | 色婷婷电影 | av黄色免费看| 亚洲精品一区二区18漫画 | www日日 | 欧美在线观看禁18 | 久久天天躁狠狠躁夜夜不卡公司 | 亚洲人成人在线 | 成人aaa毛片 | 久草国产在线观看 | 深夜精品福利 | 人人爽久久久噜噜噜电影 | 色妞色视频一区二区三区四区 | 亚洲国产日本 | 99久久99视频只有精品 | 一级精品视频在线观看宜春院 | 国产99中文字幕 | 亚洲精品网址在线观看 | 伊人在线视频 | 麻豆视频在线免费观看 | 久章草在线观看 | 最新真实国产在线视频 | 久久久久久中文字幕 | 久久五月精品 | 欧洲精品久久久久毛片完整版 | 2019中文字幕第一页 | 伊人影院在线观看 | 日韩av专区 | 天天干天天射天天爽 | 91精品在线免费观看视频 | 中文字幕色播 | 毛片精品免费在线观看 | 日本精品视频在线播放 | 久久久久久久毛片 | 黄色在线网站噜噜噜 | 色综合久久久久综合 | 免费看av在线 | 高清美女视频 | 天干啦夜天干天干在线线 | 精品久久久久久久久久久久久久久久 | 夜夜躁日日躁 | 亚洲国产视频a | 美女精品久久 | 亚洲精品国产日韩 | 亚洲精品中文字幕在线观看 | 激情综合网在线观看 | 国产亚洲视频系列 | 一本一道波多野毛片中文在线 | 天天拍夜夜拍 | 香蕉日日| 香蕉视频最新网址 | 在线免费观看羞羞视频 | 日批在线观看 | 日韩成人免费电影 | 91香蕉视频在线 | 国内精品国产三级国产aⅴ久 | 天天色综合天天 | 五月婷婷视频在线 | 国产码电影| 搡bbbb搡bbb视频 | 最近最新mv字幕免费观看 | 69久久夜色精品国产69 | 日韩精品中文字幕在线播放 | 91成人看片 | 久久久久久黄色 |