summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--ChangeLog10
-rw-r--r--src/db-artwork-writer.c18
2 files changed, 26 insertions, 2 deletions
diff --git a/ChangeLog b/ChangeLog
index f7d79f1..f991933 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,13 @@
+2007-10-29 Christophe Fergeau <teuf@gnome.org>
+
+ * src/db-artwork-writer.c: reread the pointer for memory mapped
+ buffers when it may have changed
+
+ Artwork writing works by mapping structs to memory and by directly
+ accessing/modifying it. This works until we need to move the
+ mmap base address. This patch makes sure we reset the struct
+ mapping every time the mmap base pointer may have changed
+
2007-10-27 Jorg Schuler <jcsjcs at users.sourceforge.net>
* src/itdb_device.c (ipod_classic_1_artwork_info)
diff --git a/src/db-artwork-writer.c b/src/db-artwork-writer.c
index a6b3029..45f2625 100644
--- a/src/db-artwork-writer.c
+++ b/src/db-artwork-writer.c
@@ -330,6 +330,7 @@ write_mhod_type_1 (gchar *string, iPodBuffer *buffer)
if (ipod_buffer_maybe_grow (buffer, total_bytes + len + padding ) != 0) {
return -1;
}
+ mhod = ipod_buffer_get_pointer (buffer);
memcpy (mhod->string, string, len);
total_bytes += len + padding;
mhod->total_len = get_gint32 (total_bytes, buffer->byte_order);
@@ -385,14 +386,14 @@ write_mhod_type_3 (gchar *string, iPodBuffer *buffer)
if (padding == 4)
padding = 0;
mhod->padding = padding;
- total_bytes += g2l*len + padding;
+ total_bytes += g2l*len + padding;
/* Make sure we have enough free space to write the string */
if (ipod_buffer_maybe_grow (buffer, total_bytes) != 0) {
g_free (utf16);
return -1;
}
-
+ mhod = ipod_buffer_get_pointer (buffer);
strp = (gunichar2 *)mhod->string;
for (i = 0; i < len; i++) {
strp[i] = get_gint16 (utf16[i], buffer->byte_order);
@@ -413,6 +414,7 @@ write_mhod_type_3 (gchar *string, iPodBuffer *buffer)
if (ipod_buffer_maybe_grow (buffer, total_bytes + 2*len+padding) != 0) {
return -1;
}
+ mhod = ipod_buffer_get_pointer (buffer);
memcpy (mhod->string, string, len);
total_bytes += (len+padding);
}
@@ -470,6 +472,7 @@ write_mhni (Itdb_DB *db, Itdb_Thumb *thumb, int correlation_id, iPodBuffer *buff
return -1;
}
total_bytes += bytes_written;
+ mhni = ipod_buffer_get_pointer (buffer);
mhni->total_len = get_gint32 (total_bytes, buffer->byte_order);
/* Only update number of children when all went well to try to get
* something somewhat consistent when there are errors
@@ -512,6 +515,7 @@ write_mhod (Itdb_DB *db, Itdb_Thumb *thumb, int correlation_id, iPodBuffer *buff
return -1;
}
total_bytes += bytes_written;
+ mhod = ipod_buffer_get_pointer (buffer);
mhod->total_len = get_gint32 (total_bytes, buffer->byte_order);
dump_mhod (mhod);
@@ -590,6 +594,7 @@ write_mhii (Itdb_DB *db, void *data, iPodBuffer *buffer)
return -1;
}
total_bytes += bytes_written;
+ mhii = ipod_buffer_get_pointer (buffer);
num_children++;
it = it->next;
}
@@ -651,6 +656,7 @@ write_mhli (Itdb_DB *db, iPodBuffer *buffer )
}
it = it->next;
}
+ mhli = ipod_buffer_get_pointer (buffer);
mhli->num_children = get_gint32 (num_thumbs, buffer->byte_order);
dump_mhl ((MhlHeader *)mhli, "mhli");
@@ -725,6 +731,7 @@ write_mhba (Itdb_PhotoAlbum *album, iPodBuffer *buffer)
return -1;
}
total_bytes += bytes_written;
+ mhba = ipod_buffer_get_pointer (buffer);
for (it = album->members; it != NULL; it = it->next) {
Itdb_Artwork *photo = it->data;
@@ -741,6 +748,7 @@ write_mhba (Itdb_PhotoAlbum *album, iPodBuffer *buffer)
}
total_bytes += bytes_written;
}
+ mhba = ipod_buffer_get_pointer (buffer);
mhba->total_len = get_gint32( total_bytes, buffer->byte_order );
dump_mhba ( mhba );
return total_bytes;
@@ -775,6 +783,7 @@ write_mhla (Itdb_DB *db, iPodBuffer *buffer)
return -1;
}
total_bytes += bytes_written;
+ mhla = ipod_buffer_get_pointer (buffer);
num_children++;
mhla->num_children = get_gint32 (num_children,
buffer->byte_order);
@@ -872,6 +881,8 @@ write_mhlf (Itdb_DB *db, iPodBuffer *buffer)
return -1;
}
total_bytes += bytes_written;
+ mhlf = ipod_buffer_get_pointer (buffer);
+
num_children++;
/* Only update number of children when all went well to try
* to get something somewhat consistent when there are errors
@@ -924,6 +935,7 @@ write_mhsd (Itdb_DB *db, iPodBuffer *buffer, enum MhsdType type)
return -1;
} else {
total_bytes += bytes_written;
+ mhsd = ipod_buffer_get_pointer (buffer);
mhsd->total_len = get_gint32 (total_bytes, buffer->byte_order);
}
@@ -940,6 +952,7 @@ write_mhfd (Itdb_DB *db, iPodBuffer *buffer, int id_max)
int bytes_written;
int i;
+
mhfd = (MhfdHeader *)init_header (buffer, "mhfd", sizeof (MhfdHeader));
if (mhfd == NULL) {
return -1;
@@ -969,6 +982,7 @@ write_mhfd (Itdb_DB *db, iPodBuffer *buffer, int id_max)
return -1;
}
total_bytes += bytes_written;
+ mhfd = ipod_buffer_get_pointer (buffer);
mhfd->total_len = get_gint32 (total_bytes, buffer->byte_order);
mhfd->num_children = get_gint32 (i, buffer->byte_order);
}