18e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project/* 28e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Copyright (C) 2007 Staikos Computing Services Inc. 38e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Copyright (C) 2007 Holger Hans Peter Freyther 48e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Copyright (C) 2008 Apple, Inc. All rights reserved. 58e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Copyright (C) 2008 Collabora, Ltd. All rights reserved. 6f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch * Copyright (C) 2010 Sencha, Inc. All rights reserved. 78e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 88e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Redistribution and use in source and binary forms, with or without 98e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * modification, are permitted provided that the following conditions 108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * are met: 118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 1. Redistributions of source code must retain the above copyright 13545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch * notice, this list of conditions and the following disclaimer. 148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 2. Redistributions in binary form must reproduce the above copyright 158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * notice, this list of conditions and the following disclaimer in the 16545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch * documentation and/or other materials provided with the distribution. 178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 3. Neither the name of Apple Computer, Inc. ("Apple") nor the names of 188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * its contributors may be used to endorse or promote products derived 19545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch * from this software without specific prior written permission. 208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY 228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY 258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND 288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project */ 328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "config.h" 348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "FileSystem.h" 358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "PlatformString.h" 378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include <QDateTime> 38545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch#include <QDir> 398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include <QFile> 408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include <QFileInfo> 41545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch#include <QTemporaryFile> 42545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch#include <wtf/text/CString.h> 438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectnamespace WebCore { 458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool fileExists(const String& path) 478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return QFile::exists(path); 498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool deleteFile(const String& path) 538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return QFile::remove(path); 558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool deleteEmptyDirectory(const String& path) 588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return QDir::root().rmdir(path); 608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool getFileSize(const String& path, long long& result) 638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project QFileInfo info(path); 658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project result = info.size(); 660bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch return info.exists(); 678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool getFileModificationTime(const String& path, time_t& result) 708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project QFileInfo info(path); 728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project result = info.lastModified().toTime_t(); 738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return info.exists(); 748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool makeAllDirectories(const String& path) 778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return QDir::root().mkpath(path); 798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectString pathByAppendingComponent(const String& path, const String& component) 828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 83231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block return QDir::toNativeSeparators(QDir(path).filePath(component)); 848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectString homeDirectoryPath() 878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return QDir::homePath(); 898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectString pathGetFileName(const String& path) 928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return QFileInfo(path).fileName(); 948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectString directoryName(const String& path) 978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 98f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch return QFileInfo(path).absolutePath(); 998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 1008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectVector<String> listDirectory(const String& path, const String& filter) 1028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 1038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project Vector<String> entries; 1048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project QStringList nameFilters; 1068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!filter.isEmpty()) 1078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project nameFilters.append(filter); 1088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project QFileInfoList fileInfoList = QDir(path).entryInfoList(nameFilters, QDir::AllEntries | QDir::NoDotAndDotDot); 1098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project foreach (const QFileInfo fileInfo, fileInfoList) { 1108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project String entry = String(fileInfo.canonicalFilePath()); 1118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project entries.append(entry); 1128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 1138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return entries; 1158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 1168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1172bde8e466a4451c7319e3a072d118917957d6554Steve BlockString openTemporaryFile(const String& prefix, PlatformFileHandle& handle) 1188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 1195af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke#ifndef QT_NO_TEMPORARYFILE 1202bde8e466a4451c7319e3a072d118917957d6554Steve Block QTemporaryFile* tempFile = new QTemporaryFile(QDir::tempPath() + QLatin1Char('/') + QString(prefix)); 121231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block tempFile->setAutoRemove(false); 122231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block QFile* temp = tempFile; 1238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (temp->open(QIODevice::ReadWrite)) { 1248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project handle = temp; 1252bde8e466a4451c7319e3a072d118917957d6554Steve Block return temp->fileName(); 1268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 1275af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke#endif 1288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project handle = invalidPlatformFileHandle; 1292bde8e466a4451c7319e3a072d118917957d6554Steve Block return String(); 1308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 1318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1325ddde30071f639962dd557c453f2ad01f8f0fd00Kristian MonsenPlatformFileHandle openFile(const String& path, FileOpenMode mode) 1335ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen{ 1345ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen QIODevice::OpenMode platformMode; 1355ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen 1365ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen if (mode == OpenForRead) 1375ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen platformMode = QIODevice::ReadOnly; 1385ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen else if (mode == OpenForWrite) 1395ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen platformMode = (QIODevice::WriteOnly | QIODevice::Truncate); 1405ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen else 1415ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen return invalidPlatformFileHandle; 1425ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen 1435ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen QFile* file = new QFile(path); 1445ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen if (file->open(platformMode)) 1455ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen return file; 1465ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen 1475ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen return invalidPlatformFileHandle; 1485ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen} 1495ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen 1505ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsenint readFromFile(PlatformFileHandle handle, char* data, int length) 1515ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen{ 1525ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen if (handle && handle->exists() && handle->isReadable()) 1535ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen return handle->read(data, length); 1545ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen return 0; 1555ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen} 1565ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen 1578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid closeFile(PlatformFileHandle& handle) 1588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 1598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (handle) { 1608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project handle->close(); 1618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project delete handle; 1628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 1638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 1648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 165f05b935882198ccf7d81675736e3aeb089c5113aBen Murdochlong long seekFile(PlatformFileHandle handle, long long offset, FileSeekOrigin origin) 166f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch{ 167f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch if (handle) { 168f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch long long current = 0; 169f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch 170f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch switch (origin) { 171f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch case SeekFromBeginning: 172f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch break; 173f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch case SeekFromCurrent: 174f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch current = handle->pos(); 175f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch break; 176f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch case SeekFromEnd: 177f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch current = handle->size(); 178f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch break; 179f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch } 180f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch 181f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch // Add the offset to the current position and seek to the new position 182f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch // Return our new position if the seek is successful 183f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch current += offset; 184f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch if (handle->seek(current)) 185f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch return current; 186f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch else 187f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch return -1; 188f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch } 189f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch 190f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch return -1; 191f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch} 192f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch 1938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectint writeToFile(PlatformFileHandle handle, const char* data, int length) 1948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 1958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (handle && handle->exists() && handle->isWritable()) 1968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return handle->write(data, length); 1978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return 0; 1998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 2008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool unloadModule(PlatformModule module) 2028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 2038f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian#if defined(Q_WS_MAC) 2048f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian CFRelease(module); 2058f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian return true; 2068f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 2078f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian#elif defined(Q_OS_WIN) 2088f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian return ::FreeLibrary(module); 2098f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 2108f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian#else 211dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#ifndef QT_NO_LIBRARY 2128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (module->unload()) { 2138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project delete module; 2148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return true; 2158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 216dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#endif 2178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return false; 2188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif 2198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 2208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 2228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// vim: ts=4 sw=4 et 224