国产一级一区二区_segui88久久综合9999_97久久夜色精品国产_欧美色网一区二区

掃一掃
關注微信公眾號

構造Linux的圖形化安裝程序(2)
2009-05-22   

主要介紹在安裝程序裝入內存之后,如何啟動圖形環境并設置中文語言環境。文中除了介紹安裝程序對這兩個功能的具體編程實現,還介紹了Linux中文化的一些基本知識,包括如何定制安裝程序顯示中所需要的Locale環境(Glibc和X Window系統兩部分),po文件的處理。在安裝程序的第二階段運行結束之后,整個安裝程序已經被調入了內存,這時控制從安裝程序的加載程序轉到了安裝程序的主程序執行。這時的安裝程序就像是一個從Linux的控制臺環境啟動的程序,這個程序進行自動檢測并進行基本的設備配置。為了進行圖形化安裝,安裝程序的主程序會啟動XFree86子系統并設置,同時設置當前的語言環境為中文環境。
1. 多語言環境支持
為了在Linux下實現多語言支持,必須在定制安裝程序時,引入與glibc和圖形環境兩者對應的多語言環境支持。對于glibc環境而言,它是整個 Linux中文化的基礎,我們需要在/usr/share/locale目錄下保存Locale信息,在/usr/share/consolefonts 目錄下保存字體信息,在/usr/lib/gconv目錄下保存字符轉換模塊的信息。
對于X Windows環境,我們需要在/usr/X11R6/lib/X11/locale目錄下保存X Locale的配置,同時在/usr/X11R6/lib/X11/fonts目錄下保存正常顯示所需要的字體集。
在安裝程序啟動之后,必須正確設置LC_*變量同時調用setlocale函數。為了能顯示中文,安裝程序還必須加載正確的中文字體。
1.1. 國際化的基本概念
國際化(Internationalization,簡寫為I18N)是指軟件在設計結構和機制上支持多語言的擴展特性,其功能和代碼設計不針對某一特定語言和地域。Locale是ANSI C語言中最基本的支持國際化的標志,對中文Linux來說,支持中文Locale是最基本的要求。
1.1.1. Locale環境
Locale的命名規則:<語言>_<地區名>.<字符編碼名稱>
對于zh_CN.GB2312而言,zh表示中文,CN表示大陸地區,GB2312表示使用的字符集為GB2312。
Locale使用一組分類,用戶可以獨立的操縱每一組分類。用戶既能用設置環境變量的方法,也能使用setlocale設置它們。這些分類都保存在/usr/share/locale下。它們包含了:
LC_COLLATE
用于比較和排序。
LC_CTYPE
用于字符分類和字符串處理,控制所有字符的處理方式,包括字符編碼,字符是單字節還是多字節,如何打印等。
LC_MONETORY
用于格式化貨幣單位。
LC_NUMERIC
用于格式化非貨幣的數字顯示。
LC_TIME
用于格式化時間和日期。
LC_MESSAGES
用于控制程序輸出時所使用的語言,主要是提示信息,錯誤信息,狀態信息, 標題,標簽, 按鈕和菜單等。
LC_ALL
它不是環境變量,只是一個宏,可使用setlocale設置所有的LC_*環境變量。這個變量設置之后,可以廢除LC_*和LANG的設置值,使得這些變量的設置值與LC_ALL的值一致。
LANG
它的值用于指定上面環境變量沒有設置的所有變量值。如果指定了上面任何一個變量的值,則會廢除對應的LANG值的缺省設置。
還可以包括其他的環境變量LC_ADDRESS,LC_IDENTIFICATION,LC_PAPER,LC_NAME,LC_TELEPHONE,LC_MEASUREMENT。
標準Locale:
"C"
這是標準的C Locale。它所指定的屬性和行為由ISO C標準所指定。它是程序啟動時缺省使用Locale。
"POSIX"
這是標準的POSIX Locale。它是標準的C Locale的別名。
""
空名字是讓程序選擇當前環境設置值。
設置一個中文環境需要正確的設置上述Locale變量,舉例來說,在使用zh_CN.GB2312環境時,使用locale命令,所見到的系統環境為:
LANG="zh_CN.GB2312"
LC_CTYPE="zh_CN.GB2312"
LC_NUMERIC="zh_CN.GB2312"
LC_TIME="zh_CN.GB2312"
LC_COLLATE="zh_CN.GB2312"
LC_MONETARY="zh_CN.GB2312"
LC_MESSAGES="zh_CN.GB2312"
LC_PAPER="zh_CN.GB2312"
LC_NAME="zh_CN.GB2312"
LC_ADDRESS="zh_CN.GB2312"
LC_TELEPHONE="zh_CN.GB2312"
LC_MEASUREMENT="zh_CN.GB2312"
LC_IDENTIFICATION="zh_CN.GB2312"
LC_ALL=
1.1.2. 創建Locale環境
為了建立locale環境,我們必須具備下面的描述文件:
locale-data
這個文件定義了Locale環境(LC_*)的所有細節,包括字符的分類與轉換,字符排序,區域顯示時間,貨幣顯示格式等等。通常是保存在系統的/usr/share/i18n/locales目錄下。
charmap
這個文件定義了Locale中所有字符與內碼的對應關系。通常是保存在系統的/usr/share/i18n/charmaps目錄下。
這兩個文件都是純文本文件,可以使用文本編輯器直接察看和修改。通過這兩個文件就可以生成對應的locale環境。缺省條件下,生成的locale環境是以二進制的形式保存在/usr/share/locale目錄下。把這兩個文本文件生成locale環境的工作是由localedef程序實現的。舉例來說,生成zh_CN.GB2312的locale環境:
mkdir /home/usr/share/locale/zh_CN.gb2312
localedef -I zh_CN -f GB2312 zh_CN.GB2312 --prefix=/home
cd /home/usr/share/locale/
mv zh_CN.gb2312 zh_CN.GB2312
這幾條命令在/home目錄下,生成Locale環境zh_CN.GB2312。因為按照POSIX標準,一個Locale的編碼名稱是大小寫無關的。雖然我們指定的是大寫的GB2312,但是glibc為了統一起見,它會生成一個小寫的編碼名稱。但是由于很多程序依賴于zh_CN.GB2312,因此對這個文件進行了改名。
除了Locale環境之外,您還需要gconv文件。這一組文件是用來定義glibc的gconv系統在遇到GB2312編碼的字符時,應使用哪一個模塊來處理。gconv-modules文件描述了字符編碼和處理模塊文件對應關系。例如,在/usr/lib/gconv/gonv-modules文件中,需要包含下列行:
alias GB2312// EUC-CN//
1.1.3. X Window系統的多語言環境
X Window系統的多語言環境是在系統底層libc的Locale架構的基礎上建立起來的。X函數庫需要利用libc提供的函數來進行字符之間的轉換。因此,為了使X Window應用程序的Locale正確工作,您必須首先設置一個正確的libc Locale環境,同時正確設置LC_CTYPE這個類別。
指定了編碼方式并且將字符的辨識和轉換用libc的函數處理之后,X Window系統的多語言處理的主要問題就變為圖形顯示和輸入了。在X系統下,多語言環境必須能做到多語言字符圖形化輸出和字符輸入。字符的圖形化輸出還要處理字型,這又與字型的設定方式有關。
與libc一樣,在X Window系統下也有關于Locale的設置部分,稱為X-Locale。XFree86系統都把它保留在 /usr/X11R6/lib/X11/locale目錄下。在這個目錄下的每個Locale都有一個目錄,存放各自的X-locale,一般這個文件的名字是XLC_LOCALE。這個文件里面包含了跟該區域編碼相關的設定,而文件中以#字號開頭的是注釋。以安裝程序上簡體中文XLC_LOCALE的內容為例:
XLC_FONTSET
# fs0 class (7 bit ASCII)
fs0 {
charset {
name ISO8859-1:GL
}
font {
primary ISO8859-1:GL
vertical_rotate all
}
}
# fs1 class
fs1 {
charset {
name GB2312.1980-0:GL
}
font {
primary GB2312.1980-0:GL
}
}
END XLC_FONTSET
以上內容定義的是顯示Locale時使用的字符集。在多語言環境中,為了同時顯示中英文,系統往往需要多種字體。例如,上例中表示:在顯示簡體中文時要使用兩種不同編碼的字體,其中一個是使用了GB2312編碼的中文字體,其字體名稱以GB2312.1980-0結束,另一個是ISO8859-1編碼的英文字體,其字體名稱以ISO8859-1結束。
XLC_LOCALE的下一部分定義了Locale中的字體在X系統中的處理方式:
XLC_XLOCALE
encoding_name zh.euc
mb_cur_max 2
state_depend_encoding False
wc_encoding_mask \x30000000
wc_shift_bits 7
cs0 {
side GL:Default
length 1
wc_encoding \x00000000
ct_encoding ISO8859-1:GL
}
cs1 {
side GR:Default
length 2
wc_encoding \x30000000
ct_encoding GB2312.1980-0:GL; GB2312.1980-0:GR
}
END XLC_XLOCALE
cs0定義的部分為iso8859-1編碼的英文字符,每個字符占用一個字節。cs1定義的部分為GB2312編碼的中文字符,每個字符占用兩個字節,這兩個字節都必須用GB2312.1980-0的字體來表示。注意,對于上面的X設置,GB2312.1980-1類型的字體是無法正常顯示的,除非用戶修改X Locale。
除此之外,/usr/X11R6/lib/X11/locale還使用locale.dir和locale.alias文件定義可用X-Locale的名稱和位置。其中,locale.dir定義了每個X-Locale文件的位置以及實際的Locale名稱。locale.alias文件則定義了每個 Locale可能的別名。
X Window 的字體存放在/usr/X11R6/lib/X11/fonts目錄下,一般使用PCF的字體。在將新的字體文件拷貝到此目錄之后,運行
mkfontdir
由這條命令更新改目錄下的fonts.dir的內容。例如,
fzs14.pcf.Z fzs14
helvR12_iso01.pcf.gz -adobe-helvetica-medium-r-normal--12-120-75-75-p-67-iso8859-1
上面兩行的信息是從字體文件中抽取出來的,比如,helvR12_iso01.pcf.gz文件中就包含iso8859-1編碼的文件。但是,字體文件 fzs14.pcf.Z就不包含類似的字體說明信息,因此我們還需要使用fonts.alias文件建立字體別名。
-hlc-song-medium-r-normal--14-140-75-75-c-140-gb2312.1980-0 fzs14
這樣在安裝程序使用下面的資源時,X Window系統就知道要加載fzs14字體了。
style "font" {
fontset="-*-helvetica-*-r-normal-*-14-*-*-*-*-*-iso8859-1, -*-medium-*-14-*-*-*-*-*-*-gb2312.1980-0"
}
1.2. 安裝程序的國際化實現
自動生成po文件
在安裝程序中,定義了兩個函數_()和__(),前者是對傳入的串進行翻譯,后者是直接返回傳入的串,凡是要進行多語言支持的串必須使用這兩個函數。它們兩者在安裝程序中的用法是不同的。前者是用于一些可以進行重建的界面控件,并且它們的值一般作為局部變量出現;而后者一般用于全局變量,為了讓這個串顯示多種語言,需要使用translate()函數進行處理。使用這兩個函數的主要目的是可以很方便的使用xgettext程序自動生成po文件。
xgettext只對c語言的源程序文件生效,因此在使用它之前必須先將perl源程序轉換為c程序,然后再運行xgettext自動提出需要進行多語言處理的文本串。下面的程序段是po目錄下Makefile文件的一部分,它可以自動生成空的po文件。
PMSFILES = $(wildcard *.pm)
PMSCFILES = $(PMSFILES:%=%_.c)
POFILES = $(shell ls *.po)
all: $(PMSCFILES) DrakX.pot
clean:
rm -f empty.po messages $(POFILES:%=%t) $(PMSCFILES)
verif:
perl -ne '/^\s*#/ or $$i += my @l = /\b__?\(/g; END { print "$$i\n" }' $(PMSFILES)
perl -ne '$$i += my @l = /\.c:/g; END { print "$$i\n" }' DrakX.pot
DrakX.pot: $(PMSFILES)
xgettext -F -n --keyword=_ --keyword=__ -o $@ $(PMSCFILES)
rm $(PMSCFILES)
$(PMSCFILES): %_.c: %
perl -pe 's|^(__?\()| $$1|; s|#([^+].*)|/*\1*\/|; s|$$|\\n\\|' $< > $@
處理po文件
在安裝程序中po文件并不進行編譯。因為perl語言處理文本文件的能力非常強,所以它直接作為文本文件形式存在。在調入po文件時,perl根據msgid和msgstr的內容生成一個hash結構,然后由此結構進行文本串的處理。
#- 此函數加載指定語言的po文件
sub load_po {
my ($lang) = @_;
my ($s, $from, $to, $state, $fuzzy);
#- 將$s中的內容作為一個perl文件存在,在這個文件中生成一個巨大的hash結構
#- 當進行多語言處理時,根據這個hash結構獲得翻譯的文本串。
$s .= "package po::I18N;\n";
$s .= "no strict;\n";
$s .= "\%{'$lang'} = (";
$f = "po/$lang.po";
local *F;
my $pid;
unless ($f && -e $f) {
… …
#- 如果文件不存在,則從壓縮包中取出此文件,并打開
}
local $_;
while () {
/^msgstr/ and $state = 1;
/^msgid/ && !$fuzzy and $state = 2;
s/@/\\@/g;
if (/^(#|$)/ && $state != 3) {
$state = 3;
if (my @l = $to =~ /%(\d+)\$/g) {
$to =~ s/%(\d+)\$/%/g;
$to = qq([ "$to", ] . join(",", map { $_ - 1 } @l) . " ),";
} else {
$to = qq("$to");
}
#- 形成hash結構,msgid的內容保存在$from中,msgstr的內容保存在$to中
$s .= qq("$from" => $to,\n) if $from;
$from = $to = '';
}
$to .= (/"(.*)"/)[0] if $state == 1;
$from .= (/"(.*)"/)[0] if $state == 2;
$fuzzy = /^#, fuzzy/;
}
$s .= ");";
no strict "vars";
eval $s;
$pid and waitpid $pid, 0;
!$@;
}
文本串翻譯
#- 文本串的翻譯過程主要是訪問讀入po文件所形成的hash結構,由它的值返回翻譯后的文本串。
sub translate {
my ($s) = @_;
#- 如果Locale環境未設置,則設置環境為英語
my ($lang) = $ENV{LANGUAGE} || $ENV{LC_MESSAGES} || $ENV{LC_ALL} || $ENV{LANG} || 'en';
require lang;
foreach (split ':', $lang) {
#- 如果hash結構未定義,則調入語言對應的po文件
lang::load_po($_) unless defined $po::I18N::{$_};
#- 如果未能正確加載po文件或者待翻譯的串不存在,則返回源串$s。
if (%{$po::I18N::{$_}}) {
return if $s eq '_I18N_';
return ${$po::I18N::{$_}}{$s} || $s
}
}
$s;
}
l 設置Locale環境
設置Locale環境主要就是設置Locale變量的值。
#- [ 'English|United States', 'iso-8859-1', 'en', 'en_US:en' ]這個數組表示
#- 第一個元素是語言環境的文本描述。
#- 通過第二個元素的值查詢%charset結構,可以獲得對應的字體。
#- 第三個元素是LANG變量的設置值。
#- 第四個元素是LANGUAGE變量的設置值。
my %languages = (
'en_US' => [ 'English|United States', 'iso-8859-1', 'en', 'en_US:en' ],
'zh_CN.GB2312' => [ 'Chinese|Simplified', 'gb2312', 'zh_CN.GB2312', 'zh_CN.GB2312:zh_CN.gb2312:zh_CN:zh' ]
);
my %charsets = (
"iso-8859-1" => [ "lat0-sun16", undef, "iso15",
"iso8859-1", "850", sub { std("iso8859-1", @_) } ],
"gb2312" => [ undef, undef, undef,
"gb2312", "936", "-*-*-*-*-*-*-*-*-*-*-*-*-gb2312.1980-1" ],
);
unless (-e "$ENV{SHARE_PATH}/locale/$languages{$lang}[2]") {
@ENV{qw(LANG LC_ALL LANGUAGE LINGUAS)} = ();
eval { commands::rm("-r", "$ENV{SHARE_PATH}/locale") };
eval {
#- 取出Locale環境
require packdrake;
my $packer = new packdrake("$ENV{SHARE_PATH}/locale.cz2");
$packer->extract_archive("$ENV{SHARE_PATH}/locale", "UTF-8", $languages{$lang}[2]);
};
}
#- 明確設置Locale的環境變量
$ENV{LC_NUMERIC} = "C";
$ENV{LC_TIME} = "C";
$ENV{LC_COLLATE} = "C";
$ENV{LC_MONETARY} = "C";
$ENV{LC_MESSAGES} = "C";
$ENV{LC_PAPER} = "C";
$ENV{LC_NAME} = "C";
$ENV{LC_ADDRESS} = "C";
$ENV{LC_TELEPHONE} = "C";
$ENV{LC_MEASUREMENT} = "C";
$ENV{LC_IDENTIFICATION} = "C";
$ENV{LC_CTYPE} = $lang;
$ENV{LANG} = $languages{$lang}[2];
$ENV{LANGUAGE} = $languages{$lang}[3];
設置Locale變量之后,調用Gtk::Rc->parse_string()裝入所需要的字體資源,然后調用Gtk->set_locale()使Locale設置生效就可以了。
2. 啟動圖形環境
啟動圖形環境,實際上就是在系統中運行X服務程序。為了使一個X服務器正常運行,必須生成正確的XFree86配置文件。在安裝程序的 install_gtk.pm的createXconf函數中創建XFree86配置文件。關于XFree86的詳細配置過程您也可以參看《如何在Linux下實現設備的配置》。
#- 這是安裝程序的createXconf函數,它的主要功能是生成XFree86的配置文件。為了使下面
#- 的代碼段更清晰,刪除了一些根據芯片類型和鼠標類型進行配置的代碼。因此,下面的代碼和真
#- 實的安裝程序代碼略有不同而且只支持x86體系結構下的配置文件。
#- 建立真實鼠標設備的別名鏈接文件/dev/mouse。
symlinkf($mouse_dev, "/dev/mouse");
#- 建立imlib庫配置文件和調色板文件的鏈接文件
symlink("/tmp/stage2/etc/imrc", "/etc/imrc");
symlink("/tmp/stage2/etc/im_palette.pal", "etc/im_palette.pal");
#- 生成XFree86配置文件$file
local *F;
open F, ">$file" or die "can't create X configuration file $file";
print F <
#- 下面的文本行,實際上是XFree86的配置文件。這個配置文件包含字體路徑設置、鍵盤設置、
#- 鼠標設備設置、監視器設置和屏幕設置部分。
Section "Files"
FontPath "/usr/X11R6/lib/X11/fonts:unscaled"
EndSection
#- 鍵盤設置部分,設置當前鍵盤為標準鍵盤。
Section "Keyboard"
Protocol "Standard"
AutoRepeat 0 0
LeftAlt Meta
RightAlt Meta
ScrollLock Compose
RightCtl Control
XkbDisable
END
EndSection
#- 設置鼠標配置,包括設置鼠標的通訊協議類型以及鼠標設備對應的設備文件。
Section "Pointer"
Protocol "$mouse_type"
Device "/dev/mouse"
ZAxisMapping 4 5
EndSection
#- 設置監視器配置。由于在定制安裝環境時,只使用了3.3.6的X服務器XF86_VGA16和
#- XF86_FBDev,這兩種服務器的X配置文件都是無法指定顯示分辨率的。對于XF86_VGA16,
#- 它只能支持640x480的16色顯示方式。對于XF86_FBDev,它支持的顯示方式是由當時內核
#- Framebuffer的工作模式決定的。比如,內核以0x311方式啟動,那么對應的分辨率是
#- 640x480的16位色,那么在使用XF86_FBDev作為X服務器時,X的對應配置也必須與此完#- 全一致。
Section "Monitor"
Identifier "My Monitor"
VendorName "Unknown"
ModelName "Unknown"
HorizSync 31.5-35.5
VertRefresh 50-70
Modeline "640x480" 25.175 640 664 760 800 480 491 493 525
Modeline "640x480" 28.3 640 664 760 800 480 491 493 525
ModeLine "800x600" 36 800 824 896 1024 600 601 603 625
EndSection
#- 使用XF86_VGA16作為X服務器時,對應的X配置節。
Section "Screen"
Driver "vga16"
Device "Generic VGA"
Monitor "My Monitor"
Subsection "Display"
Modes "640x480"
ViewPort 0 0
EndSubsection
EndSection
#- 使用XF86_FBDev作為X服務器時,對應的X配置節。設置Modes為"default",表示選擇
#- 的模式與內核啟動時設置的模式相同。
Section "Screen"
Driver "fbdev"
Device "Generic VGA"
Monitor "My Monitor"
Subsection "Display"
Depth 16
Modes "default"
ViewPort 0 0
EndSubsection
EndSection
END
將上述程序段運行之后,X配置腳本就生成了,這時就可以使用這個配置腳本文件啟動X服務程序了。下面這段啟動X的程序是來自于文件install_steps_gtk.pm。
devices::make("/dev/kbd");
local (*T1, *T2);
open T1, ">/dev/tty5";
open T2, ">/dev/tty6";
#- 執行X服務器程序,返回1表示運行成功。
my $launchX = sub {
my $ok = 1;
#- 接管信號SIGCHLD的處理程序
#- 在進程終止時,SIGCHLD信號被發送給它的父進程。此程序在子進程結束時調用。
local $SIG{CHLD} = sub { $ok = 0 if waitpid(-1, c::WNOHANG()) > 0 };
#- 子進程執行
#- XF86_FBDev -kb -dpms -s 240 -allowMouseOpenFail -xf86config $f
#- allowMouseOpenFail允許鼠標打開失敗
unless (fork) {
exec $_[0], "-kb", "-dpms","-s" ,"240",
"-allowMouseOpenFail", "-xf86config", $f or exit 1;
}
#- 測試X服務器是否成功激活
foreach (1..60) {
sleep 1;
log::l("Server died"), return 0 if !$ok;
return 1 if c::Xtest($ENV{DISPLAY});
}
log::l("Timeout!!");
0;
};
#- 準備測試的X服務器
my @servers = qw(FBDev VGA16);
foreach (@servers) {
log::l("Trying with server $_");
my $dir = "/usr/X11R6/bin";
my $prog = "XF86_$_";
#- 如果X服務程序不可執行
unless (-x "$dir/$prog") {
#- 刪除/usr/X11R6/bin/下的所有X服務程序
unlink $_ foreach glob_("$dir/X*");
#- 從安裝盤上拷貝對應的X服務程序
install_any::getAndSaveFile("HappyLinux/happyinst$dir/$prog", "$dir/$prog") or die "failed to get server $prog: $!";
chmod 0755, "$dir/$prog";
}
#- 根據/proc/fb文件的內容檢測內核是否啟動了Framebuffer方式。
if (/FB/) {
!$o->{vga16} && $o->{allowFB} or next;
$o->{allowFB} = &$launchX($prog) and goto OK;
} else {
$o->{vga16} = 1 if /VGA16/;
&$launchX($prog) and goto OK;
}
}
注: (我們在此專題中介紹的是HappyLinux 3.0的安裝程序,它的安裝程序源碼您可以在安裝盤的/HappyLinux/happyinst/usr/bin/perl-install目錄下找到。安裝程序的源碼是由Perl編制的,使用PerlGtk繪制圖形化用戶接口。)

熱詞搜索:

上一篇:構造Linux的圖形化安裝程序(1)
下一篇:構造Linux的圖形化安裝程序(3)

分享到: 收藏
国产一级一区二区_segui88久久综合9999_97久久夜色精品国产_欧美色网一区二区
国产精品hd| 欧美日韩在线一区二区| 先锋影音网一区二区| 欧美成人资源网| 黄色精品免费| 久久国产欧美精品| 欧美日韩天天操| 亚洲一区在线播放| 国产精品v欧美精品∨日韩| 亚洲精品美女免费| 欧美激情亚洲国产| 夜夜精品视频| 欧美体内谢she精2性欧美| 亚洲图片欧美日产| 国产麻豆精品久久一二三| 久久久久国产免费免费| 亚洲精品1区| 欧美屁股在线| 亚洲一区二区三区精品视频| 国模精品娜娜一二三区| 快射av在线播放一区| 一区二区冒白浆视频| 国产亚洲精品久| 欧美日韩一区二区精品| 性18欧美另类| 日韩一级免费观看| 极品尤物久久久av免费看| 欧美片第1页综合| 久久一日本道色综合久久| 亚洲成人自拍视频| 国产精品亚发布| 欧美四级在线| 欧美日韩不卡合集视频| 欧美va天堂va视频va在线| 久久久亚洲影院你懂的| 亚洲永久免费| 国产精品99久久久久久久久| 亚洲人www| 亚洲黄色性网站| 亚洲国产精品电影| 欧美激情一区二区久久久| 久久精品国产免费看久久精品| 一区二区三区视频观看| 亚洲精品日本| 亚洲免费大片| 亚洲一区国产一区| 性欧美大战久久久久久久久| 欧美一区二区三区成人| 欧美专区在线播放| 久久精品卡一| 欧美大片在线看| 亚洲欧美日韩综合| 欧美在线观看www| 久久综合国产精品台湾中文娱乐网| 久久免费国产精品| 欧美日韩 国产精品| 国产精品日韩久久久久| 国模套图日韩精品一区二区| 在线成人激情| 一区二区三区www| 亚洲一区二区欧美日韩| 久久全球大尺度高清视频| 国产精品男人爽免费视频1| 亚洲人体影院| 久久频这里精品99香蕉| 国产日韩欧美精品在线| 在线亚洲美日韩| 欧美日韩国产高清| 亚洲人成毛片在线播放女女| 欧美日韩一区在线观看| 日韩网站在线观看| 欧美成人免费小视频| 亚洲激情成人网| 欧美精品成人91久久久久久久| 亚洲国产精品久久| 欧美成人国产va精品日本一级| 国产一区二区三区日韩| 久久激情综合网| 国产主播一区二区三区| 久久久久久国产精品mv| 亚洲成人直播| 欧美日韩一区在线观看视频| 亚洲一区二区三区国产| 韩国精品在线观看| 欧美黑人多人双交| 亚洲男女自偷自拍| 经典三级久久| 欧美日本三区| 欧美一乱一性一交一视频| 在线观看av不卡| 国产精品美女久久久| 久久久久久久久一区二区| 日韩亚洲欧美精品| 国产午夜精品理论片a级探花| 欧美成人午夜激情视频| 亚洲综合国产| 亚洲国产欧美一区二区三区同亚洲| 欧美日韩性生活视频| 欧美一区二区三区播放老司机| 亚洲人成亚洲人成在线观看| 国产精品一区二区欧美| 欧美日韩一区二区高清| 久久人人爽人人爽| 午夜精品亚洲| 亚洲午夜一区二区| 日韩视频在线观看| 一区精品在线| 国产主播喷水一区二区| 国产美女精品免费电影| 欧美性大战久久久久久久| 美女精品在线| 噜噜噜在线观看免费视频日韩| 亚洲午夜久久久久久久久电影网| 亚洲大胆视频| 亚洲成在人线av| 亚洲成人在线视频网站| 国内精品久久久久伊人av| 国产精品入口尤物| 国产精品永久免费在线| 国产精品夜夜夜一区二区三区尤| 国产精品成人va在线观看| 国产精品久久久91| 国产欧美一区二区精品仙草咪| 国产精品男人爽免费视频1 | 欧美日韩精品一区二区天天拍小说| 老司机aⅴ在线精品导航| 美女精品在线观看| 欧美精品在线视频| 国产精品久久久久久久久久免费| 国产精品国产三级国产专区53| 国产精品毛片va一区二区三区| 国产欧美日韩一区二区三区| 国产一区视频网站| 亚洲精品综合久久中文字幕| 亚洲中字在线| 欧美大色视频| 国内精品久久久久久久影视麻豆| 亚洲人成艺术| 久久精品亚洲一区二区三区浴池| 欧美xxx在线观看| 国产精品网站在线观看| 亚洲国产精品第一区二区| 亚洲色图在线视频| 噜噜噜躁狠狠躁狠狠精品视频| 欧美午夜精品久久久久久超碰| 国产亚洲va综合人人澡精品| 亚洲日韩成人| 久久天天躁狠狠躁夜夜爽蜜月| 欧美激情第五页| 国产午夜精品麻豆| 一区二区三区色| 欧美激情在线免费观看| 国色天香一区二区| 99亚洲视频| 欧美精品日韩精品| 在线播放精品| 欧美不卡在线视频| 亚洲精品欧洲精品| 欧美一区二区日韩| 国产精品久久999| 亚洲日本视频| 欧美精品成人一区二区在线观看| 国内成+人亚洲| 久久综合激情| 娇妻被交换粗又大又硬视频欧美| 欧美在线视频在线播放完整版免费观看 | 久久久久久久久久久久久9999| 欧美成人伊人久久综合网| 韩日精品中文字幕| 久久综合婷婷| 亚洲欧洲一区二区三区在线观看| 麻豆av一区二区三区| 91久久精品国产91久久性色| 久热精品视频在线观看| 亚洲成色www久久网站| 欧美国产精品v| 亚洲在线日韩| 国模吧视频一区| 欧美日韩国产综合视频在线观看| 亚洲欧美999| 亚洲人成7777| 国产日韩精品在线播放| 欧美a级大片| 午夜精品久久久久久久男人的天堂| 国产精品日韩| 欧美电影免费观看大全| 亚洲综合99| 亚洲黄色片网站| 国产欧美日韩麻豆91| 欧美精品色一区二区三区| 午夜精品福利视频| 亚洲精品美女在线观看| 国产主播一区二区三区| 欧美视频一区二区| 免费成人av在线看| 久久成人国产精品| 亚洲女同在线| 中日韩在线视频| 亚洲高清资源综合久久精品| 国产精品婷婷午夜在线观看|