11cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger 21cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger/* 31cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * Copyright 2011 Google Inc. 41cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * 51cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * Use of this source code is governed by a BSD-style license that can be 61cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * found in the LICENSE file. 71cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger */ 80910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#include "SkOSFile.h" 90910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 100910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#ifdef SK_BUILD_FOR_WIN 110910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 120910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectstatic uint16_t* concat_to_16(const char src[], const char suffix[]) 130910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project{ 140910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project size_t i, len = strlen(src); 150910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project size_t len2 = 3 + (suffix ? strlen(suffix) : 0); 160910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project uint16_t* dst = (uint16_t*)sk_malloc_throw((len + len2) * sizeof(uint16_t)); 170910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 180910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project for (i = 0; i < len; i++) 190910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project dst[i] = src[i]; 200910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 210910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project if (i > 0 && dst[i-1] != '/') 220910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project dst[i++] = '/'; 230910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project dst[i++] = '*'; 240910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 250910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project if (suffix) 260910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project { 270910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project while (*suffix) 280910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project dst[i++] = *suffix++; 290910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project } 300910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project dst[i] = 0; 310910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SkASSERT(i + 1 <= len + len2); 320910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 330910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project return dst; 340910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project} 350910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 360910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source ProjectSkUTF16_Str::SkUTF16_Str(const char src[]) 370910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project{ 380910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project size_t len = strlen(src); 390910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 400910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project fStr = (uint16_t*)sk_malloc_throw((len + 1) * sizeof(uint16_t)); 4187b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger size_t i; 4287b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger for (i = 0; i < len; i++) 430910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project fStr[i] = src[i]; 440910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project fStr[i] = 0; 450910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project} 460910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 470910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project//////////////////////////////////////////////////////////////////////////// 480910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 4987b8e645865f9633f410c02252a0fd3feb18f09bDerek SollenbergerSkOSFile::Iter::Iter() : fHandle(0), fPath16(NULL) 500910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project{ 510910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project} 520910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 5387b8e645865f9633f410c02252a0fd3feb18f09bDerek SollenbergerSkOSFile::Iter::Iter(const char path[], const char suffix[]) : fHandle(0), fPath16(NULL) 540910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project{ 550910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project this->reset(path, suffix); 560910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project} 570910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 580910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source ProjectSkOSFile::Iter::~Iter() 590910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project{ 600910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project sk_free(fPath16); 610910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project if (fHandle) 620910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project ::FindClose(fHandle); 630910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project} 640910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 650910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectvoid SkOSFile::Iter::reset(const char path[], const char suffix[]) 660910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project{ 670910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project if (fHandle) 680910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project { 690910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project ::FindClose(fHandle); 700910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project fHandle = 0; 710910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project } 7287b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger if (NULL == path) 730910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project path = ""; 740910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 750910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project sk_free(fPath16); 760910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project fPath16 = concat_to_16(path, suffix); 770910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project} 780910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 790910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectstatic bool is_magic_dir(const uint16_t dir[]) 800910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project{ 810910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project // return true for "." and ".." 820910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project return dir[0] == '.' && (dir[1] == 0 || dir[1] == '.' && dir[2] == 0); 830910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project} 840910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 850910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectstatic bool get_the_file(HANDLE handle, SkString* name, WIN32_FIND_DATAW* dataPtr, bool getDir) 860910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project{ 870910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project WIN32_FIND_DATAW data; 880910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 8987b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger if (NULL == dataPtr) 900910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project { 910910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project if (::FindNextFileW(handle, &data)) 920910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project dataPtr = &data; 930910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project else 940910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project return false; 950910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project } 960910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 970910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project for (;;) 980910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project { 990910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project if (getDir) 1000910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project { 10187b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger if ((dataPtr->dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) && !is_magic_dir((uint16_t*)dataPtr->cFileName)) 1020910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project break; 1030910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project } 1040910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project else 1050910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project { 1060910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project if (!(dataPtr->dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)) 1070910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project break; 1080910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project } 1090910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project if (!::FindNextFileW(handle, dataPtr)) 1100910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project return false; 1110910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project } 1120910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project // if we get here, we've found a file/dir 1130910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project if (name) 11487b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger name->setUTF16((uint16_t*)dataPtr->cFileName); 1150910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project return true; 1160910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project} 1170910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 1180910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectbool SkOSFile::Iter::next(SkString* name, bool getDir) 1190910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project{ 1200910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project WIN32_FIND_DATAW data; 12187b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger WIN32_FIND_DATAW* dataPtr = NULL; 1220910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 1230910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project if (fHandle == 0) // our first time 1240910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project { 12587b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger if (fPath16 == NULL || *fPath16 == 0) // check for no path 1260910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project return false; 1270910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 12887b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger fHandle = ::FindFirstFileW((LPCWSTR)fPath16, &data); 1290910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project if (fHandle != 0 && fHandle != (HANDLE)~0) 1300910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project dataPtr = &data; 1310910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project } 1320910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project return fHandle != (HANDLE)~0 && get_the_file(fHandle, name, dataPtr, getDir); 1330910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project} 1340910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 1351cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger#elif defined(SK_BUILD_FOR_MAC) || defined(SK_BUILD_FOR_UNIX) || defined(SK_BUILD_FOR_ANDROID) 1360910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 1370910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#if 0 1380910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source ProjectOSStatus FSPathMakeRef ( 1390910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project const UInt8 * path, 1400910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project FSRef * ref, 1410910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project Boolean * isDirectory 1420910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project); 1430910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#endif 1440910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 1450910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source ProjectSkOSFile::Iter::Iter() : fDIR(0) 1460910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project{ 1470910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project} 1480910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 1490910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source ProjectSkOSFile::Iter::Iter(const char path[], const char suffix[]) : fDIR(0) 1500910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project{ 1510910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project this->reset(path, suffix); 1520910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project} 1530910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 1540910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source ProjectSkOSFile::Iter::~Iter() 1550910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project{ 1560910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project if (fDIR) 1570910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project ::closedir(fDIR); 1580910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project} 1590910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 1600910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectvoid SkOSFile::Iter::reset(const char path[], const char suffix[]) 1610910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project{ 1620910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project if (fDIR) 1630910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project { 1640910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project ::closedir(fDIR); 1650910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project fDIR = 0; 1660910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project } 1670910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 1680910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project fPath.set(path); 1690910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project if (path) 1700910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project { 1710910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project fDIR = ::opendir(path); 1720910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project fSuffix.set(suffix); 1730910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project } 1740910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project else 1750910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project fSuffix.reset(); 1760910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project} 1770910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 1780910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project// returns true if suffix is empty, or if str ends with suffix 1790910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectstatic bool issuffixfor(const SkString& suffix, const char str[]) 1800910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project{ 1810910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project size_t suffixLen = suffix.size(); 1820910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project size_t strLen = strlen(str); 18340528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger 1840910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project return strLen >= suffixLen && 1850910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project memcmp(suffix.c_str(), str + strLen - suffixLen, suffixLen) == 0; 1860910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project} 1870910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 1880910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#include <sys/stat.h> 1890910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 1900910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectbool SkOSFile::Iter::next(SkString* name, bool getDir) 1910910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project{ 1920910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project if (fDIR) 1930910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project { 1940910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project dirent* entry; 1950910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 1960910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project while ((entry = ::readdir(fDIR)) != NULL) 1970910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project { 1980910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project struct stat s; 1990910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SkString str(fPath); 2000910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 2010910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project if (!str.endsWith("/") && !str.endsWith("\\")) 2020910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project str.append("/"); 2030910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project str.append(entry->d_name); 2040910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 2050910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project if (0 == stat(str.c_str(), &s)) 2060910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project { 2070910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project if (getDir) 2080910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project { 2090910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project if (s.st_mode & S_IFDIR) 2100910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project break; 2110910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project } 2120910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project else 2130910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project { 2140910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project if (!(s.st_mode & S_IFDIR) && issuffixfor(fSuffix, entry->d_name)) 2150910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project break; 2160910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project } 2170910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project } 2180910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project } 2190910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project if (entry) // we broke out with a file 2200910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project { 2210910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project if (name) 2220910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project name->set(entry->d_name); 2230910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project return true; 2240910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project } 2250910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project } 2260910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project return false; 2270910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project} 2280910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 2290910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#endif 2300910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 231