Home | History | Annotate | Download | only in storage
      1 /*
      2  * Copyright (C) 2008 Apple Inc. All Rights Reserved.
      3  *
      4  * Redistribution and use in source and binary forms, with or without
      5  * modification, are permitted provided that the following conditions
      6  * are met:
      7  * 1. Redistributions of source code must retain the above copyright
      8  *    notice, this list of conditions and the following disclaimer.
      9  * 2. Redistributions in binary form must reproduce the above copyright
     10  *    notice, this list of conditions and the following disclaimer in the
     11  *    documentation and/or other materials provided with the distribution.
     12  *
     13  * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
     14  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
     15  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
     16  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
     17  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
     18  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
     19  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
     20  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
     21  * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
     22  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
     23  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
     24  */
     25 
     26 #include "config.h"
     27 #include "StorageSyncManager.h"
     28 
     29 #if ENABLE(DOM_STORAGE)
     30 
     31 #include "EventNames.h"
     32 #include "FileSystem.h"
     33 #include "Frame.h"
     34 #include "FrameTree.h"
     35 #include "LocalStorageTask.h"
     36 #include "LocalStorageThread.h"
     37 #include "Page.h"
     38 #include "PageGroup.h"
     39 #include "StorageAreaSync.h"
     40 #include <wtf/text/CString.h>
     41 #include <wtf/StdLibExtras.h>
     42 
     43 namespace WebCore {
     44 
     45 PassRefPtr<StorageSyncManager> StorageSyncManager::create(const String& path)
     46 {
     47     return adoptRef(new StorageSyncManager(path));
     48 }
     49 
     50 StorageSyncManager::StorageSyncManager(const String& path)
     51     : m_thread(LocalStorageThread::create())
     52     , m_path(path.crossThreadString())
     53 {
     54     ASSERT(isMainThread());
     55     ASSERT(!m_path.isEmpty());
     56     m_thread->start();
     57 }
     58 
     59 StorageSyncManager::~StorageSyncManager()
     60 {
     61     ASSERT(isMainThread());
     62     ASSERT(!m_thread);
     63 }
     64 
     65 // Called on a background thread.
     66 String StorageSyncManager::fullDatabaseFilename(const String& databaseIdentifier)
     67 {
     68     if (!makeAllDirectories(m_path)) {
     69         LOG_ERROR("Unabled to create LocalStorage database path %s", m_path.utf8().data());
     70         return String();
     71     }
     72 
     73     return pathByAppendingComponent(m_path, databaseIdentifier + ".localstorage");
     74 }
     75 
     76 void StorageSyncManager::close()
     77 {
     78     ASSERT(isMainThread());
     79 
     80     if (m_thread) {
     81         m_thread->terminate();
     82         m_thread = 0;
     83     }
     84 }
     85 
     86 bool StorageSyncManager::scheduleImport(PassRefPtr<StorageAreaSync> area)
     87 {
     88     ASSERT(isMainThread());
     89     ASSERT(m_thread);
     90     if (m_thread)
     91         m_thread->scheduleTask(LocalStorageTask::createImport(area.get()));
     92     return m_thread;
     93 }
     94 
     95 void StorageSyncManager::scheduleSync(PassRefPtr<StorageAreaSync> area)
     96 {
     97     ASSERT(isMainThread());
     98     ASSERT(m_thread);
     99     if (m_thread)
    100         m_thread->scheduleTask(LocalStorageTask::createSync(area.get()));
    101 }
    102 
    103 void StorageSyncManager::scheduleDeleteEmptyDatabase(PassRefPtr<StorageAreaSync> area)
    104 {
    105     ASSERT(isMainThread());
    106     ASSERT(m_thread);
    107     if (m_thread)
    108         m_thread->scheduleTask(LocalStorageTask::createDeleteEmptyDatabase(area.get()));
    109 }
    110 } // namespace WebCore
    111 
    112 #endif // ENABLE(DOM_STORAGE)
    113