From c541878faa69218acbfa1a2de06ddce58dc97a5f Mon Sep 17 00:00:00 2001
From: Nikias Bassen <nikias@gmx.li>
Date: Tue, 11 Aug 2009 05:40:07 +0200
Subject: [PATCH 07/14] Modified itdbprep stuff to work with an Itdb_iTunesDB directly.

---
 src/itdb_itunesdb.c        |    5 ++-
 src/itdbprep/libitdbprep.c |  124 ++++++++++++++++++++-----------------------
 src/itdbprep/libitdbprep.h |   12 ++++-
 3 files changed, 73 insertions(+), 68 deletions(-)

diff --git a/src/itdb_itunesdb.c b/src/itdb_itunesdb.c
index fa15c65..933b20c 100644
--- a/src/itdb_itunesdb.c
+++ b/src/itdb_itunesdb.c
@@ -6408,9 +6408,12 @@ gboolean itdb_write (Itdb_iTunesDB *itdb, GError **error)
     result = itdb_write_file (itdb, itunes_filename, error);
 
     if (result != FALSE) {
-	if (itdbprep_generate_itdbs(itunes_filename, uuid) != 0) {
+	gchar *itlpdir;
+	itlpdir = g_build_filename (itunes_path, "iTunes Library.itlp", NULL);
+	if (itdbprep_generate_itdbs(itdb, itlpdir, uuid) != 0) {
 	    fprintf(stderr, "ERROR: There was an error while generating the itdb sqlite database files.\n");
 	}
+	g_free (itlpdir);
     }
 
     g_free (itunes_filename);
diff --git a/src/itdbprep/libitdbprep.c b/src/itdbprep/libitdbprep.c
index 4166dde..6c8d7a8 100644
--- a/src/itdbprep/libitdbprep.c
+++ b/src/itdbprep/libitdbprep.c
@@ -35,8 +35,9 @@ static uint32_t timeconv(time_t tv)
 }
 
 
-static void mk_Dynamic(Itdb_iTunesDB *itdb, const char *outpath)
+static int mk_Dynamic(Itdb_iTunesDB *itdb, const char *outpath)
 {
+    int res = -1;
     gchar *dbf = NULL;
     sqlite3 *db = NULL;
     sqlite3_stmt *stmt = NULL;
@@ -143,6 +144,7 @@ static void mk_Dynamic(Itdb_iTunesDB *itdb, const char *outpath)
 	printf("[%s] - No tracks available, none written.\n", __func__);
     }
 
+    res = 0;
     printf("[%s] done.\n", __func__);
 leave:
     if (db) {
@@ -151,10 +153,12 @@ leave:
     if (dbf) {
 	g_free(dbf);
     }
+    return res;
 }
 
-static void mk_Extras(Itdb_iTunesDB *itdb, const char *outpath)
+static int mk_Extras(Itdb_iTunesDB *itdb, const char *outpath)
 {
+    int res = -1;
     int rebuild = 0;
     gchar *dbf = NULL;
     sqlite3 *db = NULL;
@@ -216,6 +220,7 @@ static void mk_Extras(Itdb_iTunesDB *itdb, const char *outpath)
 	goto leave;
     }*/
 
+    res = 0;
     printf("[%s] done.\n", __func__);
 leave:
     if (db) {
@@ -224,10 +229,12 @@ leave:
     if (dbf) {
 	g_free(dbf);
     }
+    return res;
 }
 
-static void mk_Genius(Itdb_iTunesDB *itdb, const char *outpath)
+static int mk_Genius(Itdb_iTunesDB *itdb, const char *outpath)
 {
+    int res = -1;
     int rebuild = 0;
     gchar *dbf = NULL;
     sqlite3 *db = NULL;
@@ -301,6 +308,7 @@ static void mk_Genius(Itdb_iTunesDB *itdb, const char *outpath)
 	goto leave;
     }*/
 
+    res = 0;
     printf("[%s] done.\n", __func__);
 leave:
     if (db) {
@@ -309,10 +317,12 @@ leave:
     if (dbf) {
 	g_free(dbf);
     }
+    return res;
 }
 
-static void mk_Library(Itdb_iTunesDB *itdb, const char *outpath)
+static int mk_Library(Itdb_iTunesDB *itdb, const char *outpath)
 {
+    int res = -1;
     gchar *dbf = NULL;
     sqlite3 *db = NULL;
     sqlite3_stmt *stmt = NULL;
@@ -986,6 +996,7 @@ static void mk_Library(Itdb_iTunesDB *itdb, const char *outpath)
 	}
 
     }
+    res = 0;
     printf("[%s] done.\n", __func__);
 leave:
     if (genre_map) {
@@ -997,10 +1008,12 @@ leave:
     if (dbf) {
 	g_free(dbf);
     }
+    return res;
 }
 
-static void mk_Locations(Itdb_iTunesDB *itdb, const char *outpath, const char *uuid)
+static int mk_Locations(Itdb_iTunesDB *itdb, const char *outpath, const char *uuid)
 {
+    int res = -1;
     int rebuild = 0;
     gchar *dbf = NULL;
     gchar *cbk = NULL;
@@ -1080,7 +1093,7 @@ static void mk_Locations(Itdb_iTunesDB *itdb, const char *outpath, const char *u
 		//  perhaps later libgpod will support more.
 		sqlite3_bind_int(stmt, ++idx, 0x46494C45);	
 		// location
-		char *ipod_path = strdup(track->ipod_path);
+		char *ipod_path = g_strdup(track->ipod_path);
 		int i = 0;
 		int cnt = 0;
 		int pos = 0;
@@ -1123,7 +1136,7 @@ static void mk_Locations(Itdb_iTunesDB *itdb, const char *outpath, const char *u
 		    fprintf(stderr, "[%s] 10 sqlite3_step returned %d\n", __func__, res); 
 		}
 		if (ipod_path) {
-		    free(ipod_path);
+		    g_free(ipod_path);
 		    ipod_path = NULL;
 		}
 	    }
@@ -1182,6 +1195,7 @@ static void mk_Locations(Itdb_iTunesDB *itdb, const char *outpath, const char *u
 	}
     }
 
+    res = 0;
     printf("[%s] done.\n", __func__);
 leave:
     if (db) {
@@ -1193,21 +1207,49 @@ leave:
     if (dbf) {
 	g_free(dbf);
     }
+    return res;
 }
 
-static void build_itdb_files(Itdb_iTunesDB *itdb, const char *outpath, const char *uuid)
+int itdbprep_generate_itdbs(Itdb_iTunesDB *itdb, const char *outpath, const char *uuid)
 {
-    mk_Dynamic(itdb, outpath);
-    mk_Extras(itdb, outpath);
-    mk_Genius(itdb, outpath);
-    mk_Library(itdb, outpath);
-    mk_Locations(itdb, outpath, uuid);
+    int err = 0;
+
+    assert(itdb);
+    assert(itdb->playlists);
+
+    album_lookup = itdb_album_id_tree_create(itdb);
+
+    tzoffset = itdb->tzoffset;
+
+    if (mk_Dynamic(itdb, outpath) != 0) {
+	err++;
+    }
+    if (mk_Extras(itdb, outpath) != 0) {
+	err++;
+    }
+    if (mk_Genius(itdb, outpath) != 0) {
+	err++;
+    }
+    if (mk_Library(itdb, outpath) != 0) {
+	err++;
+    }
+    if (mk_Locations(itdb, outpath, uuid) != 0) {
+	err++;
+    }
+
+    if (album_lookup) {
+	itdb_album_id_tree_destroy(album_lookup);
+    }
+
+    if (err > 0) {
+	return -1;
+    }
+    return 0;
 }
 
-int itdbprep_generate_itdbs(const char *itunesdbfile, const char *uuid)
+int itdbprep_generate_itdbs_for_file(const char *itunesdbfile, const char *outpath, const char *uuid)
 {
     int res = 0;
-    gchar *itlpdir;
     struct stat fst;
     Itdb_iTunesDB *itdb = NULL;
     GError *error;
@@ -1228,39 +1270,6 @@ int itdbprep_generate_itdbs(const char *itunesdbfile, const char *uuid)
 	}
     }
 
-    gchar *fn_copy = g_strdup(itunesdbfile);
-
-    itlpdir = g_build_path(G_DIR_SEPARATOR_S, g_path_get_dirname(fn_copy), "iTunes Library.itlp", NULL);
-    g_free(fn_copy);
-
-    printf("itlp directory='%s'\n", itlpdir);
-
-
-    // check if directory exists
-    memset(&fst, 0, sizeof(struct stat));
-    if ((stat((char*)itlpdir, &fst)) != 0) {
-	if (errno == ENOENT) {
-	    // otherwise create it
-	    if (mkdir((char*)itlpdir, 0755) < 0) {
-		fprintf(stderr, "Could not create directory '%s': %s\n", itlpdir, strerror(errno));
-		res = -1;
-		goto leave;
-	    }
-	} else {
-	    fprintf(stderr, "stat: %s: %s\n", itlpdir, strerror(errno));
-	    res = -1;
-	    goto leave;
-	}
-    } else {
-	if (!S_ISDIR(fst.st_mode)) {
-	    fprintf(stderr, "'%s' is not a directory as it should be!\n", itlpdir);
-	    res = -1;
-	    goto leave;
-	}
-    }
-
-    printf("*.itdb files will be stored in '%s'\n", itlpdir);
-
     // try to open the iTunes(C)DB file
     error = NULL;
     printf("opening database '%s'\n", itunesdbfile);
@@ -1272,21 +1281,8 @@ int itdbprep_generate_itdbs(const char *itunesdbfile, const char *uuid)
 	goto leave;
     }
 
-    assert(itdb);
-    assert(itdb->playlists);
-
-    assert(itlpdir);
-
-    album_lookup = itdb_album_id_tree_create(itdb);
-
-    tzoffset = itdb->tzoffset;
-
     // generate itdb files
-    build_itdb_files(itdb, itlpdir, uuid);
-
-    if (album_lookup) {
-	itdb_album_id_tree_destroy(album_lookup);
-    }
+    res = itdbprep_generate_itdbs(itdb, outpath, uuid);
 
 leave:
     if (itdb) {
@@ -1294,10 +1290,6 @@ leave:
 	itdb = NULL;
     }
 
-    if (itlpdir) {
-	g_free(itlpdir);
-    }
-
     return res;
 }
 
diff --git a/src/itdbprep/libitdbprep.h b/src/itdbprep/libitdbprep.h
index c4f53ed..2d68cee 100644
--- a/src/itdbprep/libitdbprep.h
+++ b/src/itdbprep/libitdbprep.h
@@ -20,12 +20,22 @@ extern int array_from_hex_string(unsigned char *dest, const int array_size, cons
 extern unsigned char *make_cbk(const void *data, int *size, const unsigned char uuid[20], unsigned char *rnd);
 
 /**
+ * generate necessary *.itdb files from the given Itdb_iTunesDB object.
+ *
+ * @param itdb parsed iTunesDB
+ * @param outpath existing directory to write the files to
+ * @param uuid 40-digit hex string with the device uuid
+ */
+int itdbprep_generate_itdbs(Itdb_iTunesDB *itdb, const char *outpath, const char *uuid);
+
+/**
  * generate necessary *.itdb files from the given iTunesCDB file.
  *
  * @param itunesdbfile path to the iTunesCDB file
+ * @param outpath existing directory to write the files to
  * @param uuid 40-digit hex string with the device uuid
  */
-int itdbprep_generate_itdbs(const char *itunesdbfile, const char *uuid);
+int itdbprep_generate_itdbs_for_file(const char *itunesdbfile, const char *outpath, const char *uuid);
 
 #ifdef HAVE_LIBIPHONE
 /**
-- 
1.6.4.4

