1
/* Copyright 2009-2011 Yorba Foundation
3
* This software is licensed under the GNU LGPL (version 2.1 or later).
4
* See the COPYING file in this distribution.
7
namespace AlienDb.FSpot {
9
public class FSpotDatabaseDriver : Object, AlienDatabaseDriver {
10
public static const string FSPOT_DRIVER_ID = "f-spot";
11
private static FSpotDatabaseDriver instance;
14
* Initialisation method that creates a singleton instance.
16
public static void init() {
17
// Check for null in case init() is called more than once.
19
instance = new FSpotDatabaseDriver();
22
public static FSpotDatabaseDriver get_instance() {
27
* Termination method that clears the singleton instance.
29
public static void terminate() {
33
private class FSpotBehaviorEntry {
34
private AlienDatabaseVersion version;
35
private FSpotTableBehavior behavior;
37
public FSpotBehaviorEntry(AlienDatabaseVersion version, FSpotTableBehavior behavior) {
38
this.version = version;
39
this.behavior = behavior;
42
public AlienDatabaseVersion get_version() {
46
public FSpotTableBehavior get_behavior() {
51
private Gee.Map<string, Gee.List<FSpotBehaviorEntry>> behavior_map;
53
public FSpotDatabaseDriver() {
54
behavior_map = new Gee.HashMap<string, Gee.List<FSpotBehaviorEntry>>();
56
Gee.List<FSpotBehaviorEntry> photos_list = new Gee.ArrayList<FSpotBehaviorEntry>();
58
photos_list.add(new FSpotBehaviorEntry(
59
new AlienDatabaseVersion({ 0 }),
60
FSpotPhotosV0Behavior.get_instance()
63
photos_list.add(new FSpotBehaviorEntry(
64
new AlienDatabaseVersion({ 5 }),
65
FSpotPhotosV5Behavior.get_instance()
68
photos_list.add(new FSpotBehaviorEntry(
69
new AlienDatabaseVersion({ 7 }),
70
FSpotPhotosV7Behavior.get_instance()
73
photos_list.add(new FSpotBehaviorEntry(
74
new AlienDatabaseVersion({ 11 }),
75
FSpotPhotosV11Behavior.get_instance()
78
photos_list.add(new FSpotBehaviorEntry(
79
new AlienDatabaseVersion({ 16 }),
80
FSpotPhotosV16Behavior.get_instance()
83
photos_list.add(new FSpotBehaviorEntry(
84
new AlienDatabaseVersion({ 17 }),
85
FSpotPhotosV17Behavior.get_instance()
88
photos_list.add(new FSpotBehaviorEntry(
89
new AlienDatabaseVersion({ 18 }),
90
FSpotPhotosV18Behavior.get_instance()
92
behavior_map.set(FSpotPhotosTable.TABLE_NAME, photos_list);
94
Gee.List<FSpotBehaviorEntry> tags_list = new Gee.ArrayList<FSpotBehaviorEntry>();
96
tags_list.add(new FSpotBehaviorEntry(
97
new AlienDatabaseVersion({ 0 }),
98
FSpotTagsV0Behavior.get_instance()
100
behavior_map.set(FSpotTagsTable.TABLE_NAME, tags_list);
102
Gee.List<FSpotBehaviorEntry> photo_tags_list = new Gee.ArrayList<FSpotBehaviorEntry>();
104
photo_tags_list.add(new FSpotBehaviorEntry(
105
new AlienDatabaseVersion({ 0 }),
106
FSpotPhotoTagsV0Behavior.get_instance()
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>();
112
photo_versions_list.add(new FSpotBehaviorEntry(
113
new AlienDatabaseVersion({ 0 }),
114
FSpotPhotoVersionsV0Behavior.get_instance()
117
photo_versions_list.add(new FSpotBehaviorEntry(
118
new AlienDatabaseVersion({ 9 }),
119
FSpotPhotoVersionsV9Behavior.get_instance()
122
photo_versions_list.add(new FSpotBehaviorEntry(
123
new AlienDatabaseVersion({ 16 }),
124
FSpotPhotoVersionsV16Behavior.get_instance()
127
photo_versions_list.add(new FSpotBehaviorEntry(
128
new AlienDatabaseVersion({ 17 }),
129
FSpotPhotoVersionsV17Behavior.get_instance()
132
photo_versions_list.add(new FSpotBehaviorEntry(
133
new AlienDatabaseVersion({ 18 }),
134
FSpotPhotoVersionsV18Behavior.get_instance()
136
behavior_map.set(FSpotPhotoVersionsTable.TABLE_NAME, photo_versions_list);
138
Gee.List<FSpotBehaviorEntry> rolls_list = new Gee.ArrayList<FSpotBehaviorEntry>();
140
rolls_list.add(new FSpotBehaviorEntry(
141
new AlienDatabaseVersion({ 0 }),
142
FSpotRollsV0Behavior.get_instance()
145
rolls_list.add(new FSpotBehaviorEntry(
146
new AlienDatabaseVersion({ 5 }),
147
FSpotRollsV5Behavior.get_instance()
149
behavior_map.set(FSpotRollsTable.TABLE_NAME, rolls_list);
152
~FSpotDatabaseDriver() {
155
public AlienDatabaseDriverID get_id() {
156
return new AlienDatabaseDriverID(FSPOT_DRIVER_ID);
159
public string get_display_name() {
163
public Gee.Collection<DiscoveredAlienDatabase> get_discovered_databases() {
164
Gee.ArrayList<DiscoveredAlienDatabase> discovered_databases =
165
new Gee.ArrayList<DiscoveredAlienDatabase>();
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")
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())
184
message("Discovered database: %s", db_file.get_path());
188
return discovered_databases;
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();
200
warning("Could not find behavior list for table %s", table_name);
204
public AlienDatabase open_database(AlienDatabaseID db_id) throws DatabaseError, AlienDatabaseError {
205
return new FSpotDatabase(this, db_id);
208
public AlienDatabase open_database_from_file(File db_file) throws DatabaseError, AlienDatabaseError {
209
return new FSpotDatabase.from_file(this, db_file);
212
public string get_menu_name() {
213
return "ImportFromFSpot";
216
public Gtk.ActionEntry get_action_entry() {
217
Gtk.ActionEntry result = {
218
"ImportFromFSpot", null, TRANSLATABLE, null, null, on_import_from_fspot
220
result.label = _("Import From _F-Spot...");
221
result.tooltip = _("Import the content of an external F-Spot database");
225
public static bool is_available() {
226
AlienDatabaseDriver? driver = AlienDatabaseHandler.get_instance().get_driver(
227
new AlienDatabaseDriverID(FSPOT_DRIVER_ID));
229
return (driver != null) ? driver.get_discovered_databases().size > 0 : false;
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));
238
AlienDatabaseImportDialogController dialog = new AlienDatabaseImportDialogController(
239
_("Import From F-Spot"),
240
driver, report_to_when_done);
244
private static void on_import_from_fspot() {