Home | History | Annotate | Download | only in storage
      1 /*
      2  * Copyright (C) 2008, 2009, 2010 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 #ifndef StorageAreaSync_h
     27 #define StorageAreaSync_h
     28 
     29 #if ENABLE(DOM_STORAGE)
     30 
     31 #include "SQLiteDatabase.h"
     32 #include "Timer.h"
     33 #include <wtf/HashMap.h>
     34 #include <wtf/text/StringHash.h>
     35 
     36 namespace WebCore {
     37 
     38     class Frame;
     39     class StorageAreaImpl;
     40     class StorageSyncManager;
     41 
     42     class StorageAreaSync : public RefCounted<StorageAreaSync> {
     43     public:
     44         static PassRefPtr<StorageAreaSync> create(PassRefPtr<StorageSyncManager>, PassRefPtr<StorageAreaImpl>, const String& databaseIdentifier);
     45         ~StorageAreaSync();
     46 
     47         void scheduleFinalSync();
     48         void blockUntilImportComplete();
     49 
     50         void scheduleItemForSync(const String& key, const String& value);
     51         void scheduleClear();
     52         void scheduleCloseDatabase();
     53 
     54         void scheduleSync();
     55 
     56     private:
     57         StorageAreaSync(PassRefPtr<StorageSyncManager>, PassRefPtr<StorageAreaImpl>, const String& databaseIdentifier);
     58 
     59         void dispatchStorageEvent(const String& key, const String& oldValue, const String& newValue, Frame* sourceFrame);
     60 
     61         Timer<StorageAreaSync> m_syncTimer;
     62         HashMap<String, String> m_changedItems;
     63         bool m_itemsCleared;
     64 
     65         bool m_finalSyncScheduled;
     66 
     67         RefPtr<StorageAreaImpl> m_storageArea;
     68         RefPtr<StorageSyncManager> m_syncManager;
     69 
     70         // The database handle will only ever be opened and used on the background thread.
     71         SQLiteDatabase m_database;
     72 
     73     // The following members are subject to thread synchronization issues.
     74     public:
     75         // Called from the background thread
     76         void performImport();
     77         void performSync();
     78         void deleteEmptyDatabase();
     79 
     80     private:
     81         enum OpenDatabaseParamType {
     82           CreateIfNonExistent,
     83           SkipIfNonExistent
     84         };
     85 
     86         void syncTimerFired(Timer<StorageAreaSync>*);
     87         void openDatabase(OpenDatabaseParamType openingStrategy);
     88         void sync(bool clearItems, const HashMap<String, String>& items);
     89 
     90         const String m_databaseIdentifier;
     91 
     92         Mutex m_syncLock;
     93         HashMap<String, String> m_itemsPendingSync;
     94         bool m_clearItemsWhileSyncing;
     95         bool m_syncScheduled;
     96         bool m_syncInProgress;
     97         bool m_databaseOpenFailed;
     98 
     99         bool m_syncCloseDatabase;
    100 
    101         mutable Mutex m_importLock;
    102         mutable ThreadCondition m_importCondition;
    103         mutable bool m_importComplete;
    104         void markImported();
    105     };
    106 
    107 } // namespace WebCore
    108 
    109 #endif // ENABLE(DOM_STORAGE)
    110 
    111 #endif // StorageAreaSync_h
    112