Yao Lu / BasicWeb

Dependents:   uVGAII_WebBrowser

Committer:
yaolu23
Date:
Wed Mar 06 16:13:02 2013 +0000
Revision:
0:7fac52628f4e
Child:
1:41f0491dcc4c
Project 3: Basic Web Browser

Who changed what in which revision?

UserRevisionLine numberNew contents of line
yaolu23 0:7fac52628f4e 1 #include "BasicWeb.h"
yaolu23 0:7fac52628f4e 2
yaolu23 0:7fac52628f4e 3 // table used to convert keyboard scan codes to ASCII
yaolu23 0:7fac52628f4e 4 const unsigned char BasicWeb::table[] = {
yaolu23 0:7fac52628f4e 5 // 0 1 2 3 4 5 6 7 8 9 A B C D E F
yaolu23 0:7fac52628f4e 6 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,'~', 0, // 0
yaolu23 0:7fac52628f4e 7 0, 0, 0, 0, 0,'q','1', 0, 0, 0,'z','s','a','w','2', 0, // 1
yaolu23 0:7fac52628f4e 8 0,'c','x','d','e','4','3', 0, 0,' ','v','f','t','r','5', 0, // 2
yaolu23 0:7fac52628f4e 9 0,'n','b','h','g','y','6', 0, 0, 0,'m','j','u','7','8', 0, // 3
yaolu23 0:7fac52628f4e 10 0, 0,'k','i','o','0','9', 0, 0,'.','/','l',':','p', 0, 0, // 4
yaolu23 0:7fac52628f4e 11 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 5
yaolu23 0:7fac52628f4e 12 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 6
yaolu23 0:7fac52628f4e 13 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 7
yaolu23 0:7fac52628f4e 14 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 8
yaolu23 0:7fac52628f4e 15 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; // 9
yaolu23 0:7fac52628f4e 16
yaolu23 0:7fac52628f4e 17 BasicWeb::BasicWeb(PinName tx, PinName rx, PinName reset)
yaolu23 0:7fac52628f4e 18 :vga(tx, rx, reset),
yaolu23 0:7fac52628f4e 19 urlStr("http://www.batw.net/htmllessons/example_page.html"),
yaolu23 0:7fac52628f4e 20 urlIndex(63), str(NULL), bold(false), font(0), color(0x000000), index(0), title(false) {
yaolu23 0:7fac52628f4e 21
yaolu23 0:7fac52628f4e 22 // initialize uVGA
yaolu23 0:7fac52628f4e 23 vga.baudrate(115200);
yaolu23 0:7fac52628f4e 24 vga.display_control(0x0c, 0x01); // Set display to VGA 640x480
yaolu23 0:7fac52628f4e 25 }
yaolu23 0:7fac52628f4e 26
yaolu23 0:7fac52628f4e 27 void BasicWeb::browser(){
yaolu23 0:7fac52628f4e 28 led = 1;
yaolu23 0:7fac52628f4e 29 // draw browser
yaolu23 0:7fac52628f4e 30 vga.background_color(WHITE);
yaolu23 0:7fac52628f4e 31 vga.rectangle(0, 0, 640, 38, 0xBBBBBB);
yaolu23 0:7fac52628f4e 32 vga.rectangle(30, 20, 636, 34, WHITE);
yaolu23 0:7fac52628f4e 33 displayUrl();
yaolu23 0:7fac52628f4e 34
yaolu23 0:7fac52628f4e 35 // connect to internet and display IP
yaolu23 0:7fac52628f4e 36 eth.init();
yaolu23 0:7fac52628f4e 37 eth.connect();
yaolu23 0:7fac52628f4e 38 vga.text_string("IP address is:", 50, 1, 1, 0x000000);
yaolu23 0:7fac52628f4e 39 vga.text_string(eth.getIPAddress(), 65, 1, 1, 0x000000);
yaolu23 0:7fac52628f4e 40 led2 = 1;
yaolu23 0:7fac52628f4e 41 }
yaolu23 0:7fac52628f4e 42
yaolu23 0:7fac52628f4e 43 void BasicWeb::displayUrl(){
yaolu23 0:7fac52628f4e 44 vga.rectangle(30, 20, 636, 34, WHITE); // clear url
yaolu23 0:7fac52628f4e 45 vga.text_string(urlStr, 4, 3, 1, 0x000000);
yaolu23 0:7fac52628f4e 46 }
yaolu23 0:7fac52628f4e 47
yaolu23 0:7fac52628f4e 48 // process new key
yaolu23 0:7fac52628f4e 49 void BasicWeb::newKey(char scancode){
yaolu23 0:7fac52628f4e 50 char c = table[scancode];
yaolu23 0:7fac52628f4e 51 if(c != 0){ // if a alpha numeric
yaolu23 0:7fac52628f4e 52 urlStr[urlIndex] = c;
yaolu23 0:7fac52628f4e 53 char s[] = {c, 0};
yaolu23 0:7fac52628f4e 54 vga.text_string(s, 4 + urlIndex, 3, 1, 0x000000);
yaolu23 0:7fac52628f4e 55 urlIndex += 1;
yaolu23 0:7fac52628f4e 56 urlStr[urlIndex] = '\0';
yaolu23 0:7fac52628f4e 57 }else{
yaolu23 0:7fac52628f4e 58 if(scancode == 0x66){ // backspace
yaolu23 0:7fac52628f4e 59 if(urlIndex != 0){
yaolu23 0:7fac52628f4e 60 urlIndex -= 1;
yaolu23 0:7fac52628f4e 61 urlStr[urlIndex] = '\0';
yaolu23 0:7fac52628f4e 62 vga.rectangle(31 + urlIndex*8, 20, 39 + urlIndex*8, 34, WHITE);
yaolu23 0:7fac52628f4e 63 }
yaolu23 0:7fac52628f4e 64 }else if(scancode == 0x5A){ // enter
yaolu23 0:7fac52628f4e 65 int ret = http.get(urlStr, text, 10240);
yaolu23 0:7fac52628f4e 66 if(!ret){
yaolu23 0:7fac52628f4e 67 removeRL(text, 10240);
yaolu23 0:7fac52628f4e 68 index = 0;
yaolu23 0:7fac52628f4e 69 lineIndex = 40;
yaolu23 0:7fac52628f4e 70 vga.rectangle(0, 0, 640, 19, 0xBBBBBB); // clear title
yaolu23 0:7fac52628f4e 71 vga.rectangle(0, 39, 640, 480, 0xFFFFFF); // clear page
yaolu23 0:7fac52628f4e 72 displayPage();
yaolu23 0:7fac52628f4e 73 }else{
yaolu23 0:7fac52628f4e 74 vga.graphic_string("Could not fetch page", 21, 0, 1, color, 1, 1);
yaolu23 0:7fac52628f4e 75 }
yaolu23 0:7fac52628f4e 76 }
yaolu23 0:7fac52628f4e 77 }
yaolu23 0:7fac52628f4e 78 }
yaolu23 0:7fac52628f4e 79
yaolu23 0:7fac52628f4e 80 void BasicWeb::modKey(char scancode1, char scancode2){
yaolu23 0:7fac52628f4e 81 if(scancode1 == 0xE0){
yaolu23 0:7fac52628f4e 82 if(scancode2 == 0x72 || scancode2 == 0x74){ // up and right arrow
yaolu23 0:7fac52628f4e 83 led3 = 1;
yaolu23 0:7fac52628f4e 84 vga.rectangle(0, 39, 640, 480, 0xFFFFFF); // clear page
yaolu23 0:7fac52628f4e 85 lineIndex = 40;
yaolu23 0:7fac52628f4e 86 displayPage();
yaolu23 0:7fac52628f4e 87 }
yaolu23 0:7fac52628f4e 88 }
yaolu23 0:7fac52628f4e 89 }
yaolu23 0:7fac52628f4e 90
yaolu23 0:7fac52628f4e 91 void BasicWeb::displayPage(){
yaolu23 0:7fac52628f4e 92 parseStr();
yaolu23 0:7fac52628f4e 93 while(printText(str)){
yaolu23 0:7fac52628f4e 94 parseStr();
yaolu23 0:7fac52628f4e 95 if(title){
yaolu23 0:7fac52628f4e 96 title = false;
yaolu23 0:7fac52628f4e 97 vga.rectangle(0, 0, 640, 19, 0xBBBBBB);
yaolu23 0:7fac52628f4e 98 vga.text_string(titleStr, 1, 1, 1, 0x000000);
yaolu23 0:7fac52628f4e 99 }
yaolu23 0:7fac52628f4e 100 }
yaolu23 0:7fac52628f4e 101 }
yaolu23 0:7fac52628f4e 102
yaolu23 0:7fac52628f4e 103 /* processes tags up until a string to display is found */
yaolu23 0:7fac52628f4e 104 void BasicWeb::parseStr(){
yaolu23 0:7fac52628f4e 105 bool cont = true;
yaolu23 0:7fac52628f4e 106 while(cont){
yaolu23 0:7fac52628f4e 107 while(text[index] == ' ') index++; // skip white space
yaolu23 0:7fac52628f4e 108 if(text[index] == '\0'){
yaolu23 0:7fac52628f4e 109 str = NULL;
yaolu23 0:7fac52628f4e 110 return;
yaolu23 0:7fac52628f4e 111 }
yaolu23 0:7fac52628f4e 112 if(text[index] == '<'){
yaolu23 0:7fac52628f4e 113 cont = applyTag();
yaolu23 0:7fac52628f4e 114 }else{
yaolu23 0:7fac52628f4e 115 cont = extractStr();
yaolu23 0:7fac52628f4e 116 }
yaolu23 0:7fac52628f4e 117 }
yaolu23 0:7fac52628f4e 118 }
yaolu23 0:7fac52628f4e 119
yaolu23 0:7fac52628f4e 120 /* processes the tag and increment index past it */
yaolu23 0:7fac52628f4e 121 bool BasicWeb::applyTag(){
yaolu23 0:7fac52628f4e 122 index++;
yaolu23 0:7fac52628f4e 123
yaolu23 0:7fac52628f4e 124 // skip comments
yaolu23 0:7fac52628f4e 125 bool comment = true;
yaolu23 0:7fac52628f4e 126 if(text[index] == '!'){
yaolu23 0:7fac52628f4e 127 if(text[index+1] == '-' && text[index+2] == '-'){
yaolu23 0:7fac52628f4e 128 index += 3;
yaolu23 0:7fac52628f4e 129 while(comment){ // while still in comment body
yaolu23 0:7fac52628f4e 130
yaolu23 0:7fac52628f4e 131 // check for ending sequence
yaolu23 0:7fac52628f4e 132 if(text[index] == '-'){
yaolu23 0:7fac52628f4e 133 index += 1;
yaolu23 0:7fac52628f4e 134 if(text[index] == '-'){
yaolu23 0:7fac52628f4e 135 index += 1;
yaolu23 0:7fac52628f4e 136 if(text[index] == '>'){
yaolu23 0:7fac52628f4e 137 comment = false; // break out of comment
yaolu23 0:7fac52628f4e 138 }
yaolu23 0:7fac52628f4e 139 }
yaolu23 0:7fac52628f4e 140 }else{
yaolu23 0:7fac52628f4e 141 index++;
yaolu23 0:7fac52628f4e 142 }
yaolu23 0:7fac52628f4e 143 }
yaolu23 0:7fac52628f4e 144 comment = true; // reset comment flag
yaolu23 0:7fac52628f4e 145 }
yaolu23 0:7fac52628f4e 146 while(text[index] != '>') index++;
yaolu23 0:7fac52628f4e 147 index++;
yaolu23 0:7fac52628f4e 148 return true;
yaolu23 0:7fac52628f4e 149 }
yaolu23 0:7fac52628f4e 150
yaolu23 0:7fac52628f4e 151 // process tag
yaolu23 0:7fac52628f4e 152 int i = 0;
yaolu23 0:7fac52628f4e 153 if(compareTag(text + index, "title")){
yaolu23 0:7fac52628f4e 154 index += 6;
yaolu23 0:7fac52628f4e 155 title = true;
yaolu23 0:7fac52628f4e 156 while(text[index+i] != '<' && text[index+i] != '\0'){
yaolu23 0:7fac52628f4e 157 i++;
yaolu23 0:7fac52628f4e 158 }
yaolu23 0:7fac52628f4e 159 if(i < 30){
yaolu23 0:7fac52628f4e 160 copyStr(text + index, titleStr, i);
yaolu23 0:7fac52628f4e 161 }else{
yaolu23 0:7fac52628f4e 162 copyStr(text + index, titleStr, 30);
yaolu23 0:7fac52628f4e 163 }
yaolu23 0:7fac52628f4e 164 index += i;
yaolu23 0:7fac52628f4e 165 }else if(compareTag(text + index, "script")){ // skip script
yaolu23 0:7fac52628f4e 166 index += 7;
yaolu23 0:7fac52628f4e 167 while(text[index] != '\0'){
yaolu23 0:7fac52628f4e 168 if(text[index] == '<'){
yaolu23 0:7fac52628f4e 169 index++;
yaolu23 0:7fac52628f4e 170 if(compareTag(text + index, "/script")){
yaolu23 0:7fac52628f4e 171 index += 8;
yaolu23 0:7fac52628f4e 172 break;
yaolu23 0:7fac52628f4e 173 }
yaolu23 0:7fac52628f4e 174 }
yaolu23 0:7fac52628f4e 175 index++;
yaolu23 0:7fac52628f4e 176 }
yaolu23 0:7fac52628f4e 177 }else if(compareTag(text + index, "style")){ // skip style
yaolu23 0:7fac52628f4e 178 index += 6;
yaolu23 0:7fac52628f4e 179 while(text[index] != '\0'){
yaolu23 0:7fac52628f4e 180 if(text[index] == '<'){
yaolu23 0:7fac52628f4e 181 index++;
yaolu23 0:7fac52628f4e 182 if(compareTag(text + index, "/style")){
yaolu23 0:7fac52628f4e 183 index += 7;
yaolu23 0:7fac52628f4e 184 break;
yaolu23 0:7fac52628f4e 185 }
yaolu23 0:7fac52628f4e 186 }
yaolu23 0:7fac52628f4e 187 index++;
yaolu23 0:7fac52628f4e 188 }
yaolu23 0:7fac52628f4e 189 }else if(compareTag(text + index, "br")){
yaolu23 0:7fac52628f4e 190 index += 3;
yaolu23 0:7fac52628f4e 191 lineIndex += 10;
yaolu23 0:7fac52628f4e 192 }else if(compareTag(text + index, "/br")){
yaolu23 0:7fac52628f4e 193 index += 3;
yaolu23 0:7fac52628f4e 194 lineIndex += 10;
yaolu23 0:7fac52628f4e 195 }else if(compareTag(text + index, "b")){
yaolu23 0:7fac52628f4e 196 index += 2;
yaolu23 0:7fac52628f4e 197 font += 1;
yaolu23 0:7fac52628f4e 198 }else if(compareTag(text + index, "/b")){
yaolu23 0:7fac52628f4e 199 index += 3;
yaolu23 0:7fac52628f4e 200 font -= 1;
yaolu23 0:7fac52628f4e 201 }else if(compareTag(text + index, "h1")){
yaolu23 0:7fac52628f4e 202 index += 3;
yaolu23 0:7fac52628f4e 203 font = 3;
yaolu23 0:7fac52628f4e 204 }else if(compareTag(text + index, "/h1")){
yaolu23 0:7fac52628f4e 205 index += 4;
yaolu23 0:7fac52628f4e 206 font = 0;
yaolu23 0:7fac52628f4e 207 }else if(compareTag(text + index, "h2")){
yaolu23 0:7fac52628f4e 208 index += 3;
yaolu23 0:7fac52628f4e 209 font = 2;
yaolu23 0:7fac52628f4e 210 }else if(compareTag(text + index, "/h2")){
yaolu23 0:7fac52628f4e 211 index += 4;
yaolu23 0:7fac52628f4e 212 font = 0;
yaolu23 0:7fac52628f4e 213 }else if(compareTag(text + index, "h3")){
yaolu23 0:7fac52628f4e 214 index += 3;
yaolu23 0:7fac52628f4e 215 font = 1;
yaolu23 0:7fac52628f4e 216 }else if(compareTag(text + index, "/h3")){
yaolu23 0:7fac52628f4e 217 index += 4;
yaolu23 0:7fac52628f4e 218 font = 0;
yaolu23 0:7fac52628f4e 219 }else{
yaolu23 0:7fac52628f4e 220 while(text[index+i] != '>') i++;
yaolu23 0:7fac52628f4e 221 index += i + 1;
yaolu23 0:7fac52628f4e 222 }
yaolu23 0:7fac52628f4e 223
yaolu23 0:7fac52628f4e 224 return true;
yaolu23 0:7fac52628f4e 225 }
yaolu23 0:7fac52628f4e 226
yaolu23 0:7fac52628f4e 227 /* checks string against given tag */
yaolu23 0:7fac52628f4e 228 bool BasicWeb::compareTag(char* s, char* tag){
yaolu23 0:7fac52628f4e 229 int i = 0;
yaolu23 0:7fac52628f4e 230 while(s[i] != '>' && s[i] != '\0'){
yaolu23 0:7fac52628f4e 231 if(s[i] != tag[i]) return false;
yaolu23 0:7fac52628f4e 232 i++;
yaolu23 0:7fac52628f4e 233 }
yaolu23 0:7fac52628f4e 234 if(tag[i] != '\0'){
yaolu23 0:7fac52628f4e 235 return false;
yaolu23 0:7fac52628f4e 236 }else{
yaolu23 0:7fac52628f4e 237 return true;
yaolu23 0:7fac52628f4e 238 }
yaolu23 0:7fac52628f4e 239 }
yaolu23 0:7fac52628f4e 240
yaolu23 0:7fac52628f4e 241 /* stores string up to the start of the next tag into str variable */
yaolu23 0:7fac52628f4e 242 bool BasicWeb::extractStr(){
yaolu23 0:7fac52628f4e 243 int i = 0;
yaolu23 0:7fac52628f4e 244 while(text[index+i] != '<' && text[index+i] != '\0'){
yaolu23 0:7fac52628f4e 245 i++;
yaolu23 0:7fac52628f4e 246 }
yaolu23 0:7fac52628f4e 247 delete[] str;
yaolu23 0:7fac52628f4e 248 str = new char[i + 1];
yaolu23 0:7fac52628f4e 249 copyStr(text + index, str, i);
yaolu23 0:7fac52628f4e 250 index += i;
yaolu23 0:7fac52628f4e 251 strSize = i;
yaolu23 0:7fac52628f4e 252 return false;
yaolu23 0:7fac52628f4e 253 }
yaolu23 0:7fac52628f4e 254
yaolu23 0:7fac52628f4e 255 /* copies s1 into s2 upto given size */
yaolu23 0:7fac52628f4e 256 void BasicWeb::copyStr(char* s1, char* s2, int size){
yaolu23 0:7fac52628f4e 257 int i;
yaolu23 0:7fac52628f4e 258 for(i = 0; i < size; i++){
yaolu23 0:7fac52628f4e 259 s2[i] = s1[i];
yaolu23 0:7fac52628f4e 260 if(s1[i] == '\0') return;
yaolu23 0:7fac52628f4e 261 }
yaolu23 0:7fac52628f4e 262 s2[i] = '\0';
yaolu23 0:7fac52628f4e 263 }
yaolu23 0:7fac52628f4e 264
yaolu23 0:7fac52628f4e 265 /* removes CR and LR because they causes problems for vga print function */
yaolu23 0:7fac52628f4e 266 void BasicWeb::removeRL(char* s, int size){
yaolu23 0:7fac52628f4e 267 for(int i = 0; i < size; i++){
yaolu23 0:7fac52628f4e 268 if(s[i] == '\r' || s[i] == '\n') s[i] = ' ';
yaolu23 0:7fac52628f4e 269 }
yaolu23 0:7fac52628f4e 270 }
yaolu23 0:7fac52628f4e 271
yaolu23 0:7fac52628f4e 272 /* prints text one line at a time, returning false if at end of screen */
yaolu23 0:7fac52628f4e 273 bool BasicWeb::printText(char* s){
yaolu23 0:7fac52628f4e 274
yaolu23 0:7fac52628f4e 275 if(s == NULL){
yaolu23 0:7fac52628f4e 276 index = 0;
yaolu23 0:7fac52628f4e 277 return false;
yaolu23 0:7fac52628f4e 278 }
yaolu23 0:7fac52628f4e 279
yaolu23 0:7fac52628f4e 280 int maxChar;
yaolu23 0:7fac52628f4e 281 font = 3;
yaolu23 0:7fac52628f4e 282 switch(font){
yaolu23 0:7fac52628f4e 283 case 0:
yaolu23 0:7fac52628f4e 284 maxChar = 105;
yaolu23 0:7fac52628f4e 285 break;
yaolu23 0:7fac52628f4e 286 case 1:
yaolu23 0:7fac52628f4e 287 maxChar = 70;
yaolu23 0:7fac52628f4e 288 break;
yaolu23 0:7fac52628f4e 289 case 2:
yaolu23 0:7fac52628f4e 290 maxChar = 65;
yaolu23 0:7fac52628f4e 291 break;
yaolu23 0:7fac52628f4e 292 case 3:
yaolu23 0:7fac52628f4e 293 maxChar = 50;
yaolu23 0:7fac52628f4e 294 break;
yaolu23 0:7fac52628f4e 295 default:
yaolu23 0:7fac52628f4e 296 maxChar = 100;
yaolu23 0:7fac52628f4e 297 }
yaolu23 0:7fac52628f4e 298
yaolu23 0:7fac52628f4e 299 char* temp;
yaolu23 0:7fac52628f4e 300 int i = strSize;
yaolu23 0:7fac52628f4e 301 int lineNum = 0;
yaolu23 0:7fac52628f4e 302
yaolu23 0:7fac52628f4e 303 if(i < maxChar){
yaolu23 0:7fac52628f4e 304 vga.graphic_string(s, 0, lineIndex, font, color, 1, 1);
yaolu23 0:7fac52628f4e 305 if(font == 3){
yaolu23 0:7fac52628f4e 306 lineIndex += 20;
yaolu23 0:7fac52628f4e 307 }else{
yaolu23 0:7fac52628f4e 308 lineIndex += 10;
yaolu23 0:7fac52628f4e 309 }
yaolu23 0:7fac52628f4e 310 if(lineIndex < 480){
yaolu23 0:7fac52628f4e 311 return true;
yaolu23 0:7fac52628f4e 312 }else{
yaolu23 0:7fac52628f4e 313 return false;
yaolu23 0:7fac52628f4e 314 }
yaolu23 0:7fac52628f4e 315 }else{
yaolu23 0:7fac52628f4e 316 temp = new char[maxChar + 1];
yaolu23 0:7fac52628f4e 317 while(i > 0){
yaolu23 0:7fac52628f4e 318 if(i > maxChar){
yaolu23 0:7fac52628f4e 319 copyStr(s + lineNum * maxChar, temp, maxChar);
yaolu23 0:7fac52628f4e 320 i -= maxChar;
yaolu23 0:7fac52628f4e 321 }else{
yaolu23 0:7fac52628f4e 322 copyStr(s + lineNum * maxChar, temp, i);
yaolu23 0:7fac52628f4e 323 i = 0;
yaolu23 0:7fac52628f4e 324 }
yaolu23 0:7fac52628f4e 325 vga.graphic_string(temp, 0, lineIndex, font, color, 1, 1);
yaolu23 0:7fac52628f4e 326 lineNum++;
yaolu23 0:7fac52628f4e 327 if(font == 3){
yaolu23 0:7fac52628f4e 328 lineIndex += 20;
yaolu23 0:7fac52628f4e 329 }else{
yaolu23 0:7fac52628f4e 330 lineIndex += 10;
yaolu23 0:7fac52628f4e 331 }
yaolu23 0:7fac52628f4e 332 if(lineIndex >= 480){
yaolu23 0:7fac52628f4e 333 delete[] temp;
yaolu23 0:7fac52628f4e 334 return false;
yaolu23 0:7fac52628f4e 335 }
yaolu23 0:7fac52628f4e 336 }
yaolu23 0:7fac52628f4e 337 delete[] temp;
yaolu23 0:7fac52628f4e 338 }
yaolu23 0:7fac52628f4e 339 return true;
yaolu23 0:7fac52628f4e 340 }