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