diff options
Diffstat (limited to 'WebCore/platform/brew')
-rw-r--r-- | WebCore/platform/brew/DragDataBrew.cpp | 5 | ||||
-rw-r--r-- | WebCore/platform/brew/FileSystemBrew.cpp | 259 | ||||
-rw-r--r-- | WebCore/platform/brew/PopupMenuBrew.cpp | 74 |
3 files changed, 335 insertions, 3 deletions
diff --git a/WebCore/platform/brew/DragDataBrew.cpp b/WebCore/platform/brew/DragDataBrew.cpp index 20f93b8..eec8bc4 100644 --- a/WebCore/platform/brew/DragDataBrew.cpp +++ b/WebCore/platform/brew/DragDataBrew.cpp @@ -68,17 +68,16 @@ bool DragData::containsCompatibleContent() const return false; } -bool DragData::containsURL() const +bool DragData::containsURL(FilenameConversionPolicy filenamePolicy) const { return false; } -String DragData::asURL(String*) const +String DragData::asURL(FilenameConversionPolicy filenamePolicy, String*) const { return String(); } - PassRefPtr<DocumentFragment> DragData::asFragment(Document*) const { return 0; diff --git a/WebCore/platform/brew/FileSystemBrew.cpp b/WebCore/platform/brew/FileSystemBrew.cpp new file mode 100644 index 0000000..88aa05b --- /dev/null +++ b/WebCore/platform/brew/FileSystemBrew.cpp @@ -0,0 +1,259 @@ +/* + * Copyright (C) 2010 Company 100, Inc. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of Apple Computer, Inc. ("Apple") nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY + * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#include "config.h" +#include "FileSystem.h" + +#include "NotImplemented.h" +#include "PlatformString.h" +#include "StringBuilder.h" + +#include <AEEAppGen.h> +#include <AEEFile.h> +#include <AEEStdLib.h> + +#include <wtf/OwnPtr.h> +#include <wtf/PassOwnPtr.h> +#include <wtf/RandomNumber.h> +#include <wtf/brew/ShellBrew.h> +#include <wtf/text/CString.h> + +namespace WebCore { + +bool getFileSize(const String& path, long long& result) +{ + OwnPtr<IFileMgr> fileMgr = createInstance<IFileMgr>(AEECLSID_FILEMGR); + FileInfo info; + + if (IFILEMGR_GetInfo(fileMgr.get(), path.utf8().data(), &info) == SUCCESS) { + result = info.dwSize; + return true; + } + + return false; +} + +bool getFileModificationTime(const String& path, time_t& result) +{ + // There is no way to get file modification time in BREW. IFILEMGR_GetInfoEx() returns + // only file creation time. + return false; +} + +bool fileExists(const String& path) +{ + OwnPtr<IFileMgr> fileMgr = createInstance<IFileMgr>(AEECLSID_FILEMGR); + + return (IFILEMGR_Test(fileMgr.get(), path.utf8().data()) == SUCCESS); +} + +bool deleteFile(const String& path) +{ + OwnPtr<IFileMgr> fileMgr = createInstance<IFileMgr>(AEECLSID_FILEMGR); + + return (IFILEMGR_Remove(fileMgr.get(), path.utf8().data()) == SUCCESS); +} + +bool deleteEmptyDirectory(const String& path) +{ + OwnPtr<IFileMgr> fileMgr = createInstance<IFileMgr>(AEECLSID_FILEMGR); + + return (IFILEMGR_RmDir(fileMgr.get(), path.utf8().data()) == SUCCESS); +} + +String pathByAppendingComponent(const String& path, const String& component) +{ + if (component.isEmpty()) + return path; + + Vector<UChar, 1024> buffer; + + buffer.append(path.characters(), path.length()); + + if (buffer.last() != L'/' && component[0] != L'/') + buffer.append(L'/'); + + buffer.append(component.characters(), component.length()); + + return String(buffer.data(), buffer.size()); +} + +CString fileSystemRepresentation(const String& path) +{ + return path.utf8(); +} + +static String canonicalPath(const String& path) +{ + OwnPtr<IFileMgr> fileMgr = createInstance<IFileMgr>(AEECLSID_FILEMGR); + + // Get the buffer size required to resolve the path. + int canonPathLen; + IFILEMGR_ResolvePath(fileMgr.get(), path.utf8().data(), 0, &canonPathLen); + + // Resolve the path to the canonical path. + Vector<char> canonPathBuffer(canonPathLen); + IFILEMGR_ResolvePath(fileMgr.get(), path.utf8().data(), canonPathBuffer.data(), &canonPathLen); + + String canonPath(canonPathBuffer.data()); + + // Remove the trailing '/'. + int lastDivPos = canonPath.reverseFind('/'); + int endPos = canonPath.length(); + if (lastDivPos == endPos - 1) + canonPath = canonPath.substring(0, canonPath.length() - 1); + + return canonPath; +} + +static bool makeAllDirectories(PassOwnPtr<IFileMgr> fileMgr, const String& path) +{ + if (path == canonicalPath(AEEFS_HOME_DIR)) + return true; + + int lastDivPos = path.reverseFind('/'); + int endPos = path.length(); + if (lastDivPos == path.length() - 1) { + endPos -= 1; + lastDivPos = path.reverseFind('/', lastDivPos); + } + + if (lastDivPos > 0) { + if (!makeAllDirectories(fileMgr.release(), path.substring(0, lastDivPos))) + return false; + } + + String folder(path.substring(0, endPos)); + + // IFILEMGR_MkDir return SUCCESS when the file is successfully created or if file already exists. + // So we need to check fileinfo.attrib. + IFILEMGR_MkDir(fileMgr.get(), folder.utf8().data()); + + FileInfo fileInfo; + if (IFILEMGR_GetInfo(fileMgr.get(), folder.utf8().data(), &fileInfo) != SUCCESS) + return false; + + return fileInfo.attrib & _FA_DIR; +} + +bool makeAllDirectories(const String& path) +{ + OwnPtr<IFileMgr> fileMgr = createInstance<IFileMgr>(AEECLSID_FILEMGR); + + return makeAllDirectories(fileMgr.release(), canonicalPath(path)); +} + +String homeDirectoryPath() +{ + return String(AEEFS_HOME_DIR); +} + +String pathGetFileName(const String& path) +{ + return path.substring(path.reverseFind('/') + 1); +} + +String directoryName(const String& path) +{ + String fileName = pathGetFileName(path); + String dirName = String(path); + dirName.truncate(dirName.length() - pathGetFileName(path).length()); + return dirName; +} + +CString openTemporaryFile(const char* prefix, PlatformFileHandle& handle) +{ + // BREW does not have a system-wide temporary directory, + // use "fs:/~/tmp" as our temporary directory. + String tempPath("fs:/~/tmp"); + + OwnPtr<IFileMgr> fileMgr = createInstance<IFileMgr>(AEECLSID_FILEMGR); + + // Create the temporary directory if it does not exist. + IFILEMGR_MkDir(fileMgr.get(), tempPath.utf8().data()); + + // Loop until we find a temporary filename that does not exist. + int number = static_cast<int>(randomNumber() * 10000); + CString filename; + do { + StringBuilder builder; + builder.append(tempPath); + builder.append('/'); + builder.append(prefix); + builder.append(String::number(number)); + filename = builder.toString().utf8(); + number++; + } while (IFILEMGR_Test(fileMgr.get(), filename.data()) == SUCCESS); + + IFile* tempFile = IFILEMGR_OpenFile(fileMgr.get(), filename.data(), _OFM_CREATE); + if (tempFile) { + handle = tempFile; + return filename; + } + + return CString(); +} + +void closeFile(PlatformFileHandle& handle) +{ + if (isHandleValid(handle)) { + IFILE_Release(handle); + handle = invalidPlatformFileHandle; + } +} + +int writeToFile(PlatformFileHandle handle, const char* data, int length) +{ + if (!isHandleValid(handle)) + return -1; + + int bytesWritten = IFILE_Write(handle, data, length); + if (!bytesWritten) + return -1; + return bytesWritten; +} + +bool unloadModule(PlatformModule module) +{ + notImplemented(); + + return false; +} + +Vector<String> listDirectory(const String& path, const String& filter) +{ + Vector<String> entries; + + // OK to not implement listDirectory, because it's only used for plug-ins and + // Brew MP does not support the plug-in at the moment. + notImplemented(); + + return entries; +} + +} diff --git a/WebCore/platform/brew/PopupMenuBrew.cpp b/WebCore/platform/brew/PopupMenuBrew.cpp new file mode 100644 index 0000000..89f3fa1 --- /dev/null +++ b/WebCore/platform/brew/PopupMenuBrew.cpp @@ -0,0 +1,74 @@ +/* + * Copyright (C) 2006, 2008 Apple Inc. All rights reserved. + * Copyright (C) 2008 INdT - Instituto Nokia de Tecnologia + * Copyright (C) 2009-2010 ProFUSION embedded systems + * Copyright (C) 2009-2010 Samsung Electronics + * Copyright (C) 2010 Company 100, Inc. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public License + * along with this library; see the file COPYING.LIB. If not, write to + * the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + * + */ + +#include "config.h" +#include "PopupMenu.h" + +#include "Chrome.h" +#include "ChromeClientBrew.h" +#include "FrameView.h" +#include "NotImplemented.h" + +namespace WebCore { + +PopupMenu::PopupMenu(PopupMenuClient* menuList) + : m_popupClient(menuList) + , m_view(0) +{ +} + +PopupMenu::~PopupMenu() +{ +} + +void PopupMenu::show(const IntRect& rect, FrameView* view, int index) +{ + ASSERT(m_popupClient); + ChromeClientBrew* chromeClient = static_cast<ChromeClientBrew*>(view->frame()->page()->chrome()->client()); + ASSERT(chromeClient); + + m_view = view; + chromeClient->createSelectPopup(m_popupClient, index, rect); +} + +void PopupMenu::hide() +{ + ASSERT(m_view); + ChromeClientBrew* chromeClient = static_cast<ChromeClientBrew*>(m_view->frame()->page()->chrome()->client()); + ASSERT(chromeClient); + + chromeClient->destroySelectPopup(); +} + +void PopupMenu::updateFromElement() +{ + client()->setTextFromItem(client()->selectedIndex()); +} + +bool PopupMenu::itemWritingDirectionIsNatural() +{ + return true; +} + +} // namespace WebCore |