~ubuntu-branches/ubuntu/precise/shotwell/precise-updates

« back to all changes in this revision

Viewing changes to src/alien_db/f_spot/FSpotDatabaseDriver.vala

  • Committer: Package Import Robot
  • Author(s): Robert Ancell
  • Date: 2012-02-21 13:52:58 UTC
  • mfrom: (1.2.8)
  • Revision ID: package-import@ubuntu.com-20120221135258-uffg1nm9ifpy2yoh
Tags: 0.11.92-0ubuntu1
New upstream release

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
/* Copyright 2009-2011 Yorba Foundation
2
 
 *
3
 
 * This software is licensed under the GNU LGPL (version 2.1 or later).
4
 
 * See the COPYING file in this distribution. 
5
 
 */
6
 
 
7
 
namespace AlienDb.FSpot {
8
 
 
9
 
public class FSpotDatabaseDriver : Object, AlienDatabaseDriver {
10
 
    public static const string FSPOT_DRIVER_ID = "f-spot";
11
 
    private static FSpotDatabaseDriver instance;
12
 
    
13
 
    /**
14
 
     * Initialisation method that creates a singleton instance.
15
 
     */
16
 
    public static void init() {
17
 
        // Check for null in case init() is called more than once.
18
 
        if(instance == null)
19
 
            instance = new FSpotDatabaseDriver();
20
 
    }
21
 
    
22
 
    public static FSpotDatabaseDriver get_instance() {
23
 
        return instance;
24
 
    }
25
 
    
26
 
    /**
27
 
     * Termination method that clears the singleton instance.
28
 
     */
29
 
    public static void terminate() {
30
 
        instance = null;
31
 
    }
32
 
    
33
 
    private class FSpotBehaviorEntry {
34
 
        private AlienDatabaseVersion version;
35
 
        private FSpotTableBehavior behavior;
36
 
        
37
 
        public FSpotBehaviorEntry(AlienDatabaseVersion version, FSpotTableBehavior behavior) {
38
 
            this.version = version;
39
 
            this.behavior = behavior;
40
 
        }
41
 
        
42
 
        public AlienDatabaseVersion get_version() {
43
 
            return version;
44
 
        }
45
 
        
46
 
        public FSpotTableBehavior get_behavior() {
47
 
            return behavior;
48
 
        }
49
 
    }
50
 
    
51
 
    private Gee.Map<string, Gee.List<FSpotBehaviorEntry>> behavior_map;
52
 
    
53
 
    public FSpotDatabaseDriver() {
54
 
        behavior_map = new Gee.HashMap<string, Gee.List<FSpotBehaviorEntry>>();
55
 
        // photos table
56
 
        Gee.List<FSpotBehaviorEntry> photos_list = new Gee.ArrayList<FSpotBehaviorEntry>();
57
 
        // v0-4
58
 
        photos_list.add(new FSpotBehaviorEntry(
59
 
            new AlienDatabaseVersion({ 0 }),
60
 
            FSpotPhotosV0Behavior.get_instance()
61
 
        ));
62
 
        // v5-6
63
 
        photos_list.add(new FSpotBehaviorEntry(
64
 
            new AlienDatabaseVersion({ 5 }),
65
 
            FSpotPhotosV5Behavior.get_instance()
66
 
        ));
67
 
        // v7-10
68
 
        photos_list.add(new FSpotBehaviorEntry(
69
 
            new AlienDatabaseVersion({ 7 }),
70
 
            FSpotPhotosV7Behavior.get_instance()
71
 
        ));
72
 
        // v11-15
73
 
        photos_list.add(new FSpotBehaviorEntry(
74
 
            new AlienDatabaseVersion({ 11 }),
75
 
            FSpotPhotosV11Behavior.get_instance()
76
 
        ));
77
 
        // v16
78
 
        photos_list.add(new FSpotBehaviorEntry(
79
 
            new AlienDatabaseVersion({ 16 }),
80
 
            FSpotPhotosV16Behavior.get_instance()
81
 
        ));
82
 
        // v17
83
 
        photos_list.add(new FSpotBehaviorEntry(
84
 
            new AlienDatabaseVersion({ 17 }),
85
 
            FSpotPhotosV17Behavior.get_instance()
86
 
        ));
87
 
        // v18+
88
 
        photos_list.add(new FSpotBehaviorEntry(
89
 
            new AlienDatabaseVersion({ 18 }),
90
 
            FSpotPhotosV18Behavior.get_instance()
91
 
        ));
92
 
        behavior_map.set(FSpotPhotosTable.TABLE_NAME, photos_list);
93
 
        // tags table
94
 
        Gee.List<FSpotBehaviorEntry> tags_list = new Gee.ArrayList<FSpotBehaviorEntry>();
95
 
        // v0+
96
 
        tags_list.add(new FSpotBehaviorEntry(
97
 
            new AlienDatabaseVersion({ 0 }),
98
 
            FSpotTagsV0Behavior.get_instance()
99
 
        ));
100
 
        behavior_map.set(FSpotTagsTable.TABLE_NAME, tags_list);
101
 
        // photo_tags table
102
 
        Gee.List<FSpotBehaviorEntry> photo_tags_list = new Gee.ArrayList<FSpotBehaviorEntry>();
103
 
        // v0+
104
 
        photo_tags_list.add(new FSpotBehaviorEntry(
105
 
            new AlienDatabaseVersion({ 0 }),
106
 
            FSpotPhotoTagsV0Behavior.get_instance()
107
 
        ));
108
 
        behavior_map.set(FSpotPhotoTagsTable.TABLE_NAME, photo_tags_list);
109
 
        // photo_versions table
110
 
        Gee.List<FSpotBehaviorEntry> photo_versions_list = new Gee.ArrayList<FSpotBehaviorEntry>();
111
 
        // v0-8
112
 
        photo_versions_list.add(new FSpotBehaviorEntry(
113
 
            new AlienDatabaseVersion({ 0 }),
114
 
            FSpotPhotoVersionsV0Behavior.get_instance()
115
 
        ));
116
 
        // v9-15
117
 
        photo_versions_list.add(new FSpotBehaviorEntry(
118
 
            new AlienDatabaseVersion({ 9 }),
119
 
            FSpotPhotoVersionsV9Behavior.get_instance()
120
 
        ));
121
 
        // v16
122
 
        photo_versions_list.add(new FSpotBehaviorEntry(
123
 
            new AlienDatabaseVersion({ 16 }),
124
 
            FSpotPhotoVersionsV16Behavior.get_instance()
125
 
        ));
126
 
        // v17
127
 
        photo_versions_list.add(new FSpotBehaviorEntry(
128
 
            new AlienDatabaseVersion({ 17 }),
129
 
            FSpotPhotoVersionsV17Behavior.get_instance()
130
 
        ));
131
 
        // v18+
132
 
        photo_versions_list.add(new FSpotBehaviorEntry(
133
 
            new AlienDatabaseVersion({ 18 }),
134
 
            FSpotPhotoVersionsV18Behavior.get_instance()
135
 
        ));
136
 
        behavior_map.set(FSpotPhotoVersionsTable.TABLE_NAME, photo_versions_list);
137
 
        // rolls table
138
 
        Gee.List<FSpotBehaviorEntry> rolls_list = new Gee.ArrayList<FSpotBehaviorEntry>();
139
 
        // v0-4
140
 
        rolls_list.add(new FSpotBehaviorEntry(
141
 
            new AlienDatabaseVersion({ 0 }),
142
 
            FSpotRollsV0Behavior.get_instance()
143
 
        ));
144
 
        // v5+
145
 
        rolls_list.add(new FSpotBehaviorEntry(
146
 
            new AlienDatabaseVersion({ 5 }),
147
 
            FSpotRollsV5Behavior.get_instance()
148
 
        ));
149
 
        behavior_map.set(FSpotRollsTable.TABLE_NAME, rolls_list);
150
 
    }
151
 
    
152
 
    ~FSpotDatabaseDriver() {
153
 
    }
154
 
    
155
 
    public AlienDatabaseDriverID get_id() {
156
 
        return new  AlienDatabaseDriverID(FSPOT_DRIVER_ID);
157
 
    }
158
 
    
159
 
    public string get_display_name() {
160
 
        return "F-Spot";
161
 
    }
162
 
    
163
 
    public Gee.Collection<DiscoveredAlienDatabase> get_discovered_databases() {
164
 
        Gee.ArrayList<DiscoveredAlienDatabase> discovered_databases =
165
 
            new Gee.ArrayList<DiscoveredAlienDatabase>();
166
 
        
167
 
        File[] db_files = {
168
 
            // where the DB is in Ubuntu Lucid
169
 
            File.new_for_path(Environment.get_user_config_dir()).
170
 
                get_child("f-spot").get_child("photos.db"),
171
 
            // where it seems to be in Ubuntu Jaunty
172
 
            File.new_for_path(Environment.get_home_dir()).get_child(".gnome2").
173
 
                get_child("f-spot").get_child("photos.db"),
174
 
            // where it should really be if it followed the XDG spec
175
 
            File.new_for_path(Environment.get_user_data_dir()).
176
 
                get_child("f-spot").get_child("photos.db")
177
 
        };
178
 
        
179
 
        foreach (File db_file in db_files) {
180
 
            if (db_file.query_exists(null)) {
181
 
                discovered_databases.add(new DiscoveredAlienDatabase(
182
 
                    new AlienDatabaseID(get_id(), db_file.get_path())
183
 
                ));
184
 
                message("Discovered database: %s", db_file.get_path());
185
 
            }
186
 
        }
187
 
        
188
 
        return discovered_databases;
189
 
    }
190
 
    
191
 
    public FSpotTableBehavior? find_behavior(string table_name, AlienDatabaseVersion version) {
192
 
        FSpotTableBehavior behavior = null;
193
 
        Gee.List<FSpotBehaviorEntry> behavior_list = behavior_map.get(table_name);
194
 
        if (behavior_list != null)
195
 
            foreach (FSpotBehaviorEntry entry in behavior_list) {
196
 
                if (version.compare_to(entry.get_version()) >= 0)
197
 
                    behavior = entry.get_behavior();
198
 
            }
199
 
        else
200
 
            warning("Could not find behavior list for table %s", table_name);
201
 
        return behavior;
202
 
    }
203
 
 
204
 
    public AlienDatabase open_database(AlienDatabaseID db_id) throws DatabaseError, AlienDatabaseError {
205
 
        return new FSpotDatabase(this, db_id);
206
 
    }
207
 
    
208
 
    public AlienDatabase open_database_from_file(File db_file) throws DatabaseError, AlienDatabaseError {
209
 
        return new FSpotDatabase.from_file(this, db_file);
210
 
    }
211
 
    
212
 
    public string get_menu_name() {
213
 
        return "ImportFromFSpot";
214
 
    }
215
 
    
216
 
    public Gtk.ActionEntry get_action_entry() {
217
 
        Gtk.ActionEntry result = {
218
 
            "ImportFromFSpot", null, TRANSLATABLE, null, null, on_import_from_fspot
219
 
        };
220
 
        result.label = _("Import From _F-Spot...");
221
 
        result.tooltip = _("Import the content of an external F-Spot database");
222
 
        return result;
223
 
    }
224
 
    
225
 
    public static bool is_available() {
226
 
        AlienDatabaseDriver? driver = AlienDatabaseHandler.get_instance().get_driver(
227
 
            new AlienDatabaseDriverID(FSPOT_DRIVER_ID));
228
 
        
229
 
        return (driver != null) ? driver.get_discovered_databases().size > 0 : false;
230
 
    }
231
 
    
232
 
    public static void do_import(BatchImport.ImportReporter? report_to_when_done = null) {
233
 
        AlienDatabaseDriver? driver = AlienDatabaseHandler.get_instance().get_driver(
234
 
            new AlienDatabaseDriverID(FSPOT_DRIVER_ID));
235
 
        if (driver == null)
236
 
            return;
237
 
        
238
 
        AlienDatabaseImportDialogController dialog = new AlienDatabaseImportDialogController(
239
 
            _("Import From F-Spot"),
240
 
            driver, report_to_when_done);
241
 
        dialog.execute();
242
 
    }
243
 
    
244
 
    private static void on_import_from_fspot() {
245
 
        do_import();
246
 
    }
247
 
}
248
 
 
249
 
}
250