Revision: 2284
          http://gtkpod.svn.sourceforge.net/gtkpod/?rev=2284&view=rev
Author:   teuf
Date:     2009-03-26 22:10:53 +0000 (Thu, 26 Mar 2009)

Log Message:
-----------
Add function to sync the PC time to the iPod

Thanks to the the Rockbox team for figuring it out :)

Modified Paths:
--------------
    libgpod/trunk/tools/Makefile.am

Added Paths:
-----------
    libgpod/trunk/tools/ipod-scsi.c

Removed Paths:
-------------
    libgpod/trunk/tools/ipod-scsi-inquiry.c

Modified: libgpod/trunk/tools/Makefile.am
===================================================================
--- libgpod/trunk/tools/Makefile.am     2009-03-22 13:29:11 UTC (rev 2283)
+++ libgpod/trunk/tools/Makefile.am     2009-03-26 22:10:53 UTC (rev 2284)
@@ -4,7 +4,7 @@
 
 ipod_read_sysinfo_extended_SOURCES =   \
        read-sysinfoextended-sgutils.c  \
-       ipod-scsi-inquiry.c
+       ipod-scsi.c
 ipod_read_sysinfo_extended_CFLAGS=$(LIBGPOD_CFLAGS) $(SGUTILS_CFLAGS) 
-I$(top_srcdir)/src
 ipod_read_sysinfo_extended_LDADD=$(LIBGPOD_LIBS) $(SGUTILS_LIBS) 
$(top_builddir)/src/libgpod.la
 
@@ -14,7 +14,7 @@
 
 libgpod_callout_SOURCES =              \
        hal-callout.c           \
-       ipod-scsi-inquiry.c
+       ipod-scsi.c
 libgpod_callout_CFLAGS=$(LIBGPOD_CFLAGS) $(SGUTILS_CFLAGS) -I$(top_srcdir)/src
 libgpod_callout_LDADD=$(LIBGPOD_LIBS) $(SGUTILS_LIBS) 
$(top_builddir)/src/libgpod.la
 

Deleted: libgpod/trunk/tools/ipod-scsi-inquiry.c
===================================================================
--- libgpod/trunk/tools/ipod-scsi-inquiry.c     2009-03-22 13:29:11 UTC (rev 
2283)
+++ libgpod/trunk/tools/ipod-scsi-inquiry.c     2009-03-26 22:10:53 UTC (rev 
2284)
@@ -1,109 +0,0 @@
-/* Copyright (c) 2007, Christophe Fergeau  <[email protected]>
- * Part of the libgpod project.
- * 
- * URL: http://www.gtkpod.org/
- * URL: http://gtkpod.sourceforge.net/
- *
- * The code contained in this file is free software; you can redistribute
- * it and/or modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either version
- * 2.1 of the License, or (at your option) any later version.
- *
- * This file is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this code; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- *
- * iTunes and iPod are trademarks of Apple
- *
- * This product is not supported/written/published by Apple!
- *
- */
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include <fcntl.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <stdint.h>
-#include <string.h>
-#include <unistd.h>
-#include <scsi/sg_cmds.h>
-#include <sys/stat.h>
-
-#include <glib.h>
-
-#include "itdb.h"
-
-
-extern char *read_sysinfo_extended (const char *device);
-/* do_sg_inquiry and read_sysinfo_extended were heavily
- * inspired from libipoddevice
- */
-static unsigned char
-do_sg_inquiry (int fd, int page, char *buf, char **start)
-{
-    const unsigned int IPOD_BUF_LENGTH = 252;
-
-    if (sg_ll_inquiry (fd, 0, 1, page, buf, IPOD_BUF_LENGTH, 1, 0) != 0) {
-       *start = NULL;
-       return 0;
-    } else {
-       *start = buf + 4;
-       return (unsigned char)buf[3];
-    }
-}
-
-G_GNUC_INTERNAL char *
-read_sysinfo_extended (const char *device)
-{
-    int fd;
-    const unsigned int IPOD_XML_PAGE = 0xc0;
-    unsigned char len;
-    char buf[512];
-    char *start;
-    char *offsets;
-    GString *xml_sysinfo;
-    unsigned int i;
-
-    fd = open (device, O_RDWR);
-    if (fd < 0) {
-       return NULL;
-    }
-
-    len = do_sg_inquiry (fd, IPOD_XML_PAGE, buf, &start);
-    if (start == NULL || len == 0) {
-       close(fd);
-       return NULL;
-    }
-
-    offsets = g_new (char, len+1);
-    memcpy(offsets, start, len);
-    offsets[len] = 0;
-
-    xml_sysinfo = g_string_new_len (NULL, 512);
-    if (xml_sysinfo == NULL) {
-       g_free (offsets);
-       close (fd);
-       return NULL;
-    }
-
-    for (i = 0; offsets[i]; i++) {
-       bzero(buf, 512);
-       len = do_sg_inquiry (fd, offsets[i], buf, &start);
-       start[len] = 0;
-       g_string_append (xml_sysinfo, start);
-    }
-    
-    g_free (offsets);
-    close (fd);
-
-    return g_string_free (xml_sysinfo, FALSE);
-}
-
-

Copied: libgpod/trunk/tools/ipod-scsi.c (from rev 2281, 
libgpod/trunk/tools/ipod-scsi-inquiry.c)
===================================================================
--- libgpod/trunk/tools/ipod-scsi.c                             (rev 0)
+++ libgpod/trunk/tools/ipod-scsi.c     2009-03-26 22:10:53 UTC (rev 2284)
@@ -0,0 +1,152 @@
+/* Copyright (c) 2007, Christophe Fergeau  <[email protected]>
+ * Part of the libgpod project.
+ * 
+ * URL: http://www.gtkpod.org/
+ * URL: http://gtkpod.sourceforge.net/
+ *
+ * The code contained in this file is free software; you can redistribute
+ * it and/or modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either version
+ * 2.1 of the License, or (at your option) any later version.
+ *
+ * This file is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this code; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * iTunes and iPod are trademarks of Apple
+ *
+ * This product is not supported/written/published by Apple!
+ *
+ */
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <fcntl.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <stdint.h>
+#include <string.h>
+#include <unistd.h>
+#include <scsi/sg_cmds.h>
+#include <sys/stat.h>
+
+#include <glib.h>
+
+#include "itdb.h"
+
+
+extern void sync_time (const char *device, time_t current_time);
+extern char *read_sysinfo_extended (const char *device);
+/* do_sg_inquiry and read_sysinfo_extended were heavily
+ * inspired from libipoddevice
+ */
+static unsigned char
+do_sg_inquiry (int fd, int page, char *buf, char **start)
+{
+    const unsigned int IPOD_BUF_LENGTH = 252;
+
+    if (sg_ll_inquiry (fd, 0, 1, page, buf, IPOD_BUF_LENGTH, 1, 0) != 0) {
+       *start = NULL;
+       return 0;
+    } else {
+       *start = buf + 4;
+       return (unsigned char)buf[3];
+    }
+}
+
+G_GNUC_INTERNAL char *
+read_sysinfo_extended (const char *device)
+{
+    int fd;
+    const unsigned int IPOD_XML_PAGE = 0xc0;
+    unsigned char len;
+    char buf[512];
+    char *start;
+    char *offsets;
+    GString *xml_sysinfo;
+    unsigned int i;
+
+    fd = open (device, O_RDWR);
+    if (fd < 0) {
+       return NULL;
+    }
+
+    len = do_sg_inquiry (fd, IPOD_XML_PAGE, buf, &start);
+    if (start == NULL || len == 0) {
+       close(fd);
+       return NULL;
+    }
+
+    offsets = g_new (char, len+1);
+    memcpy(offsets, start, len);
+    offsets[len] = 0;
+
+    xml_sysinfo = g_string_new_len (NULL, 512);
+    if (xml_sysinfo == NULL) {
+       g_free (offsets);
+       close (fd);
+       return NULL;
+    }
+
+    for (i = 0; offsets[i]; i++) {
+       bzero(buf, 512);
+       len = do_sg_inquiry (fd, offsets[i], buf, &start);
+       start[len] = 0;
+       g_string_append (xml_sysinfo, start);
+    }
+    
+    g_free (offsets);
+    close (fd);
+
+    return g_string_free (xml_sysinfo, FALSE);
+}
+
+static void do_sg_write_buffer (const char *device, void *buffer, size_t len)
+{
+    int fd;
+
+    fd = open (device, O_RDWR);
+    if (fd < 0) {
+       g_warning ("Couldn't open device %s", device);
+       return;
+    }
+
+    if (sg_ll_write_buffer (fd, 1, 0, 0x0c0000, buffer, len, 1, 1) != 0) {
+       g_print ("Error sending data\n");
+    }
+    close(fd);
+}
+
+G_GNUC_INTERNAL void sync_time (const char *device, time_t current_time)
+{
+    struct iPodTime {
+       guint16 year;
+       guint16 days;
+       guchar timezone;
+       guchar hour;
+       guchar minute;
+       guchar second;
+       guchar padding[4];
+    } __attribute__((__packed__));
+    struct iPodTime ipod_time;
+    GDate *date;
+
+    date = g_date_new ();
+    g_date_set_time_t (date, current_time);
+    ipod_time.year = GUINT16_TO_BE (g_date_get_year (date));
+    ipod_time.days = GUINT16_TO_BE (g_date_get_day_of_year (date)-1);
+    ipod_time.timezone = 4; /* FIXME: figure out all the values */
+    ipod_time.hour = current_time/3600 % 24;
+    ipod_time.minute = current_time/60 % 60;
+    ipod_time.second = current_time % 60;
+    memset (ipod_time.padding, 0, sizeof (ipod_time.padding));
+    g_date_free (date);
+
+    do_sg_write_buffer (device, &ipod_time, sizeof (ipod_time));
+}


Property changes on: libgpod/trunk/tools/ipod-scsi.c
___________________________________________________________________
Added: svn:eol-style
   + native


This was sent by the SourceForge.net collaborative development platform, the 
world's largest Open Source development site.

------------------------------------------------------------------------------
_______________________________________________
gtkpod-cvs2 mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/gtkpod-cvs2

Reply via email to