Author: jwilcox
Date: 2006-06-15 18:05:25 -0400 (Thu, 15 Jun 2006)
New Revision: 61780
Modified:
trunk/ipod-sharp/ChangeLog
trunk/ipod-sharp/src/Device.cs
trunk/ipod-sharp/src/PhotoDatabase.cs
trunk/ipod-sharp/src/TrackDatabase.cs
trunk/ipod-sharp/src/Utility.cs
Log:
2006-06-15 James Willcox <[EMAIL PROTECTED]>
* Add beginnings of write support for the photo database. Can
read back its own database, but the iPod doesn't like it yet.
Modified: trunk/ipod-sharp/ChangeLog
===================================================================
--- trunk/ipod-sharp/ChangeLog 2006-06-15 22:01:57 UTC (rev 61779)
+++ trunk/ipod-sharp/ChangeLog 2006-06-15 22:05:25 UTC (rev 61780)
@@ -1,3 +1,8 @@
+2006-06-15 James Willcox <[EMAIL PROTECTED]>
+
+ * Add beginnings of write support for the photo database. Can read
+ back its own database, but the iPod doesn't like it yet.
+
2006-06-14 James Willcox <[EMAIL PROTECTED]>
* Add initial photo support. Currently read-only, and still a bit raw.
Modified: trunk/ipod-sharp/src/Device.cs
===================================================================
--- trunk/ipod-sharp/src/Device.cs 2006-06-15 22:01:57 UTC (rev 61779)
+++ trunk/ipod-sharp/src/Device.cs 2006-06-15 22:05:25 UTC (rev 61780)
@@ -64,9 +64,6 @@
private static unsafe extern uint ipod_device_eject (IntPtr raw, out
IntPtr error);
[DllImport ("ipoddevice")]
- private static unsafe extern uint ipod_device_reboot (IntPtr raw, out
IntPtr error);
-
- [DllImport ("ipoddevice")]
private static unsafe extern bool ipod_device_save (IntPtr raw, out
IntPtr error);
[DllImport ("ipoddevice")]
Modified: trunk/ipod-sharp/src/PhotoDatabase.cs
===================================================================
--- trunk/ipod-sharp/src/PhotoDatabase.cs 2006-06-15 22:01:57 UTC (rev
61779)
+++ trunk/ipod-sharp/src/PhotoDatabase.cs 2006-06-15 22:05:25 UTC (rev
61780)
@@ -19,15 +19,25 @@
public abstract void Save (BinaryWriter writer);
protected void SaveChild (PhotoDbRecord record, out byte[] data, out
int length) {
+ List<PhotoDbRecord> list = new List<PhotoDbRecord> ();
+ list.Add (record);
+
+ SaveChildren (list, out data, out length);
+ }
+
+ protected void SaveChildren (ICollection records, out byte[] data, out
int length) {
MemoryStream stream = new MemoryStream ();
BinaryWriter writer = new EndianBinaryWriter (stream, IsBE);
- record.Save (writer);
+
+ foreach (PhotoDbRecord record in records) {
+ record.Save (writer);
+ }
+
writer.Flush ();
length = (int) stream.Length;
data = stream.GetBuffer ();
writer.Close ();
}
-
}
internal class DataFileRecord : PhotoDbRecord {
@@ -90,15 +100,28 @@
}
public override void Save (BinaryWriter writer) {
- /*
+ byte[] childBytes;
+ int childLen;
+
+ SaveChildren (children, out childBytes, out childLen);
+
WriteName (writer);
- writer.Write (this.HeaderOne);
- writer.Write (this.HeaderTwo);
+ writer.Write (68 + PadLength);
+ writer.Write (68 + PadLength + childLen);
writer.Write (unknownOne);
writer.Write (unknownTwo);
- writer.Write (numChildren);
- writer.Write (
- */
+ writer.Write (children.Count);
+ writer.Write (unknownThree);
+ writer.Write (NextId);
+ writer.Write (unknownFive);
+ writer.Write (unknownSix);
+ writer.Write (unknownSeven);
+ writer.Write (unknownEight);
+ writer.Write (unknownNine);
+ writer.Write (unknownTen);
+ writer.Write (unknownEleven);
+ WritePadding (writer);
+ writer.Write (childBytes, 0, childLen);
}
}
@@ -143,7 +166,16 @@
}
public override void Save (BinaryWriter writer) {
+ byte[] childBytes;
+ int childLen;
+ SaveChild (Data, out childBytes, out childLen);
+ WriteName (writer);
+ writer.Write (16 + PadLength);
+ writer.Write (16 + PadLength + childLen);
+ writer.Write ((int) Index);
+ WritePadding (writer);
+ writer.Write (childBytes, 0, childLen);
}
}
@@ -187,7 +219,15 @@
}
public override void Save (BinaryWriter writer) {
+ byte[] childBytes;
+ int childLen;
+ SaveChildren (albums, out childBytes, out childLen);
+ WriteName (writer);
+ writer.Write (12 + PadLength);
+ writer.Write (albums.Count);
+ WritePadding (writer);
+ writer.Write (childBytes, 0, childLen);
}
}
@@ -278,7 +318,40 @@
}
public override void Save (BinaryWriter writer) {
+ byte[] detailBytes;
+ int detailLen;
+ SaveChild (nameRecord, out detailBytes, out detailLen);
+
+ byte[] childBytes;
+ int childLen;
+
+ SaveChildren (items, out childBytes, out childLen);
+
+ WriteName (writer);
+ writer.Write (64 + PadLength);
+ writer.Write (64 + PadLength + detailLen + childLen);
+ writer.Write (1);
+ writer.Write (items.Count);
+ writer.Write (PlaylistId);
+ writer.Write (unknownOne);
+ writer.Write (unknownTwo);
+ writer.Write (IsMaster ? (byte) 1 : (byte) 0);
+ writer.Write (PlayMusic ? (byte) 1 : (byte) 0);
+ writer.Write (Repeat ? (byte) 1 : (byte) 0);
+ writer.Write (Random ? (byte) 1 : (byte) 0);
+ writer.Write (ShowTitles ? (byte) 1 : (byte) 0);
+ writer.Write (TransitionDirection);
+ writer.Write (SlideDuration);
+ writer.Write (TransitionDuration);
+ writer.Write (unknownThree);
+ writer.Write (unknownFour);
+ writer.Write (TrackId);
+ writer.Write (PreviousPlaylistId);
+ WritePadding (writer);
+ writer.Write (detailBytes, 0, detailLen);
+ writer.Write (childBytes, 0, childLen);
+
}
}
@@ -302,7 +375,12 @@
}
public override void Save (BinaryWriter writer) {
-
+ WriteName (writer);
+ writer.Write (20 + PadLength);
+ writer.Write (20 + PadLength);
+ writer.Write (unknownOne);
+ writer.Write (ImageId);
+ WritePadding (writer);
}
}
@@ -332,7 +410,7 @@
public override void Read (BinaryReader reader) {
base.Read (reader);
- byte[] body = reader.ReadBytes (this.HeaderOne - 12);
+ reader.ReadBytes (this.HeaderOne - 12);
for (int i = 0; i < this.HeaderTwo; i++) {
ImageItemRecord item = new ImageItemRecord (IsBE);
@@ -343,7 +421,16 @@
}
public override void Save (BinaryWriter writer) {
+ byte[] childBytes;
+ int childLen;
+ SaveChildren (items, out childBytes, out childLen);
+
+ WriteName (writer);
+ writer.Write (12 + PadLength);
+ writer.Write (items.Count);
+ WritePadding (writer);
+ writer.Write (childBytes, 0, childLen);
}
}
@@ -365,6 +452,11 @@
this.Name = "mhod";
}
+ public PhotoDetailRecord (bool isbe, ImageNameRecord name) : this
(isbe) {
+ Type = PhotoDetailType.ThumbnailContainer;
+ ImageName = name;
+ }
+
public override void Read (BinaryReader reader) {
base.Read (reader);
@@ -376,9 +468,16 @@
ImageName = new ImageNameRecord (IsBE);
ImageName.Read (reader);
break;
+ case PhotoDetailType.ImageContainer:
+ throw new ApplicationException ("Not implemented yet");
+ case PhotoDetailType.FileName:
+ ReadString (reader, true);
+ break;
+ case PhotoDetailType.String:
+ ReadString (reader, false);
+ break;
default:
- ReadString (reader, Type == PhotoDetailType.FileName);
- break;
+ throw new DatabaseReadException ("Unknown detail type: " +
Type);
}
}
@@ -399,8 +498,69 @@
}
}
+ private void WriteString (BinaryWriter writer, byte[] bytes, int
padding, bool utf16) {
+ writer.Write (bytes.Length);
+ writer.Write (utf16 ? 2 : 0);
+ writer.Write (0);
+ writer.Write (bytes);
+ writer.Write (new byte[padding]);
+ }
+
public override void Save (BinaryWriter writer) {
+ byte[] childBytes;
+ int childLen;
+ int childPadding;
+ switch (Type) {
+ case PhotoDetailType.ThumbnailContainer:
+ SaveChild (ImageName, out childBytes, out childLen);
+ break;
+ case PhotoDetailType.ImageContainer:
+ throw new ApplicationException ("not implemented yet");
+ case PhotoDetailType.FileName:
+ childBytes = Encoding.Unicode.GetBytes (Value);
+ childLen = 12 + childBytes.Length;
+ break;
+ case PhotoDetailType.String:
+ childBytes = Encoding.UTF8.GetBytes (Value);
+ childLen = 12 + childBytes.Length;
+ break;
+ default:
+ throw new DatabaseWriteException ("Unknown detail type: " +
Type);
+ }
+
+ childPadding = 0;
+
+ if (Type == PhotoDetailType.FileName || Type ==
PhotoDetailType.String) {
+ int totalLength = 16 + PadLength + childLen;
+ while (totalLength%4 != 0) {
+ totalLength++;
+ childPadding++;
+ }
+ }
+
+ WriteName (writer);
+ writer.Write (16 + PadLength);
+ writer.Write (16 + PadLength + childLen + childPadding);
+ writer.Write ((short) Type);
+ writer.Write ((short) 2);
+ WritePadding (writer);
+
+ switch (Type) {
+ case PhotoDetailType.ThumbnailContainer:
+ writer.Write (childBytes, 0, childLen);
+ break;
+ case PhotoDetailType.ImageContainer:
+ throw new ApplicationException ("not implemented yet");
+ case PhotoDetailType.FileName:
+ WriteString (writer, childBytes, childPadding, true);
+ break;
+ case PhotoDetailType.String:
+ WriteString (writer, childBytes, childPadding, false);
+ break;
+ default:
+ throw new DatabaseWriteException ("Unknown detail type: " +
Type);
+ }
}
}
@@ -416,8 +576,6 @@
public short ImageHeight;
public short ImageWidth;
- public ThumbnailFormat Format;
-
public string FileName {
get { return fileDetail.Value; }
set { fileDetail.Value = value; }
@@ -451,34 +609,27 @@
fileDetail = detail;
}
}
-
- SetFormat ();
}
- private void SetFormat () {
- switch (CorrelationID) {
- case 1009:
- case 1015:
- case 1013:
- case 1036:
- Format = ThumbnailFormat.Rgb565;
- break;
- case 1019:
- Format = ThumbnailFormat.IYUV;
- break;
- case 1020:
- Format = ThumbnailFormat.Rgb565BE;
- break;
- case 1024:
- Format = ThumbnailFormat.Rgb565BE90;
- break;
- default:
- throw new ApplicationException ("Unknown correltion id: " +
CorrelationID);
- }
- }
-
public override void Save (BinaryWriter writer) {
+ byte[] childBytes;
+ int childLen;
+ SaveChild (fileDetail, out childBytes, out childLen);
+
+ WriteName (writer);
+ writer.Write (36 + PadLength);
+ writer.Write (36 + PadLength + childLen);
+ writer.Write (1);
+ writer.Write (CorrelationID);
+ writer.Write (ThumbnailOffset);
+ writer.Write (ImageSize);
+ writer.Write (VerticalPadding);
+ writer.Write (HorizontalPadding);
+ writer.Write (ImageHeight);
+ writer.Write (ImageWidth);
+ WritePadding (writer);
+ writer.Write (childBytes, 0, childLen);
}
}
@@ -538,11 +689,41 @@
public override void Save (BinaryWriter writer) {
+ byte[] childBytes;
+ int childLen;
+
+ List<PhotoDetailRecord> details = new List<PhotoDetailRecord> ();
+ foreach (ImageNameRecord name in names) {
+ details.Add (new PhotoDetailRecord (IsBE, name));
+ }
+
+ SaveChildren (details, out childBytes, out childLen);
+
+ WriteName (writer);
+ writer.Write (52 + PadLength);
+ writer.Write (52 + PadLength + childLen);
+ writer.Write (names.Count);
+ writer.Write (Id);
+ writer.Write (TrackId);
+ writer.Write (unknownOne);
+ writer.Write (Rating);
+ writer.Write (unknownTwo);
+ writer.Write (Utility.DateToMacTime (OriginalDate));
+ writer.Write (Utility.DateToMacTime (DigitizedDate));
+ writer.Write (sourceImageSize);
+ WritePadding (writer);
+ writer.Write (childBytes, 0, childLen);
}
}
internal class FileListRecord : PhotoDbRecord {
+ private List<FileRecord> files = new List<FileRecord> ();
+
+ public ReadOnlyCollection<FileRecord> Files {
+ get { return new ReadOnlyCollection<FileRecord> (files); }
+ }
+
public FileListRecord (bool isbe) : base (isbe) {
this.Name = "mhlf";
}
@@ -558,11 +739,21 @@
for (int i = 0; i < numChildren; i++) {
FileRecord record = new FileRecord (IsBE);
record.Read (reader);
+ files.Add (record);
}
}
public override void Save (BinaryWriter writer) {
+ byte[] childBytes;
+ int childLen;
+ SaveChildren (files, out childBytes, out childLen);
+
+ WriteName (writer);
+ writer.Write (12 + PadLength);
+ writer.Write (files.Count);
+ WritePadding (writer);
+ writer.Write (childBytes, 0, childLen);
}
}
@@ -588,7 +779,13 @@
}
public override void Save (BinaryWriter writer) {
-
+ WriteName (writer);
+ writer.Write (24 + PadLength);
+ writer.Write (24 + PadLength);
+ writer.Write (unknownOne);
+ writer.Write (CorrelationId);
+ writer.Write (ImageSize);
+ WritePadding (writer);
}
}
@@ -662,6 +859,12 @@
}
}
+ public void Save () {
+ using (BinaryWriter writer = new BinaryWriter (File.Open
(PhotoDbPath, FileMode.Create))) {
+ dfr.Save (writer);
+ }
+ }
+
internal Image LookupImageById (int id) {
return images[id];
}
Modified: trunk/ipod-sharp/src/TrackDatabase.cs
===================================================================
--- trunk/ipod-sharp/src/TrackDatabase.cs 2006-06-15 22:01:57 UTC (rev
61779)
+++ trunk/ipod-sharp/src/TrackDatabase.cs 2006-06-15 22:05:25 UTC (rev
61780)
@@ -27,6 +27,10 @@
writer.Write (nameBytes);
}
+ protected void WritePadding (BinaryWriter writer) {
+ writer.Write (new byte[PadLength]);
+ }
+
public long ToInt64 (byte[] buf, int offset) {
return MaybeSwap (BitConverter.ToInt64 (buf, offset));
}
Modified: trunk/ipod-sharp/src/Utility.cs
===================================================================
--- trunk/ipod-sharp/src/Utility.cs 2006-06-15 22:01:57 UTC (rev 61779)
+++ trunk/ipod-sharp/src/Utility.cs 2006-06-15 22:05:25 UTC (rev 61780)
@@ -1,4 +1,5 @@
using System;
+using System.Collections.Generic;
namespace IPod {
@@ -84,6 +85,5 @@
return val;
}
}
-
}
}
_______________________________________________
Mono-patches maillist - [email protected]
http://lists.ximian.com/mailman/listinfo/mono-patches