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

Reply via email to