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