diff src/cdaudio/cddb.c @ 399:597c89a37d07 trunk

[svn] - add DYEAR and DGENRE support.
author yaz
date Thu, 28 Dec 2006 02:57:42 -0800
parents e6822648a3d5
children 9549fea94794
line wrap: on
line diff
--- a/src/cdaudio/cddb.c	Sun Dec 24 07:08:26 2006 -0800
+++ b/src/cdaudio/cddb.c	Thu Dec 28 02:57:42 2006 -0800
@@ -302,9 +302,11 @@
 {
     gint sock;
     gchar *readstr;
-    gchar buffer[256], buffer2[BUF2SIZE];
+    gchar buffer[256];	/* http line buffer */
+    gchar *discid = NULL, *dartist = NULL, *dtitle = NULL,
+	    *dyear = NULL, *dgenre = NULL, *ttitle = NULL;
     gchar *realstr, *temp;
-    gint len, command, bufs;
+    gint len, command;
     gint num, oldnum;
 
     if ((sock = cddb_http_open_connection(server, 80)) == 0)
@@ -331,10 +333,8 @@
     cddb_log("Read response: %s", buffer);
 
     command = 1;
-    bufs = 0;
     oldnum = -1;
     do {
-/*              fprintf(stderr,"%s\n",buffer); */
         realstr = strchr(buffer, '=');
         if (buffer[0] == '#' || !realstr)
             continue;
@@ -344,58 +344,55 @@
 
         switch (command) {
         case 1:
-            if (!strncmp(buffer, "DISCID", 6))
-                break;
+            if (!strncmp(buffer, "DISCID", 6)) {
+                discid = g_strdup(realstr);
+                break;			
+            }
             command++;
         case 2:
             if (!strncmp(buffer, "DTITLE", 6)) {
-                strncpy(buffer2 + bufs, realstr, BUF2SIZE - bufs);
-                bufs += len;
+                if((temp = strstr(buffer, " / ")) != NULL) {
+                    dtitle = g_strdup(temp+3);
+                    dartist = g_strndup(realstr, temp - realstr);
+                }
+                else {
+                    dtitle = g_strdup(realstr);
+                }
                 break;
             }
-            if (bufs > 0) {
-                buffer2[BUF2SIZE - 1] = '\0';
-                if ((temp = strstr(buffer2, " / ")) != NULL) {
-                    cdda_cdinfo_cd_set(cdinfo, g_strdup(temp + 3),
-                                       g_strndup(buffer2, temp - buffer2));
-                }
-                else
-                    cdda_cdinfo_cd_set(cdinfo, g_strdup(buffer2),
-                                       g_strdup(buffer2));
-                bufs = 0;
-            }
             command++;
         case 3:
             if (!strncmp(buffer, "DYEAR", 5)) {
+                dyear = g_strdup(realstr);
                 break;
             }
             command++;
         case 4:
             if (!strncmp(buffer, "DGENRE", 6)) {
+                dgenre = g_strdup(realstr);
                 break;
             }
+
+            // we have obtained all necessary data to set discinfo
+            cdda_cdinfo_cd_set(cdinfo, dtitle, dartist, discid, dgenre, dyear);
+            
             command++;
         case 5:
             if (!strncmp(buffer, "TTITLE", 6)) {
                 num = atoi(buffer + 6);
                 if (oldnum < 0 || num == oldnum) {
-                    strncpy(buffer2 + bufs, realstr, BUF2SIZE - bufs);
-                    bufs += len;
+                    ttitle = g_strdup(realstr);
                 }
                 else {
-                    buffer2[BUF2SIZE - 1] = '\0';
-                    cdda_cdinfo_track_set(cdinfo, oldnum + 1, NULL,
-                                          g_strdup(buffer2));
-                    strncpy(buffer2, realstr, BUF2SIZE);
-                    bufs = len;
+                    cdda_cdinfo_track_set(cdinfo, oldnum + 1, NULL, ttitle);
+                    ttitle = g_strdup(realstr);
                 }
                 oldnum = num;
                 break;
             }
             if (oldnum >= 0)
-                cdda_cdinfo_track_set(cdinfo, oldnum + 1, NULL,
-                                      g_strdup(buffer2));
-            bufs = 0;
+                cdda_cdinfo_track_set(cdinfo, oldnum + 1, NULL, ttitle);
+
             oldnum = -1;
             command++;
         case 6:
@@ -422,7 +419,7 @@
     } while (http_read_line(sock, buffer, 256) >= 0);
 
     if (oldnum >= 0)
-        cdda_cdinfo_track_set(cdinfo, oldnum + 1, NULL, g_strdup(buffer2));
+        cdda_cdinfo_track_set(cdinfo, oldnum + 1, NULL, ttitle);
 
     http_close_connection(sock);
     return TRUE;
@@ -553,16 +550,17 @@
                cdinfo_t * cdinfo)
 {
     FILE *fd;
-    gchar buffer[256], buffer2[BUF2SIZE];
+    gchar buffer[256];
     gchar *realstr, *temp;
-    gint len, command, bufs;
+    gchar *discid = NULL, *dartist = NULL, *dtitle = NULL,
+	    *dyear = NULL, *dgenre = NULL, *ttitle = NULL;
+    gint len, command;
     gint num, oldnum;
 
     if ((fd = fopen(file, "r")) == NULL)
         return 0;
 
     command = 1;
-    bufs = 0;
     oldnum = -1;
     while (fgets(buffer, 256, fd) != NULL) {
         realstr = strchr(buffer, '=');
@@ -576,58 +574,55 @@
 
         switch (command) {
         case 1:
-            if (!strncmp(buffer, "DISCID", 6))
+            if (!strncmp(buffer, "DISCID", 6)) {
+                discid = g_strdup(realstr);
                 break;
+            }
             command++;
         case 2:
             if (!strncmp(buffer, "DTITLE", 6)) {
-                strncpy(buffer2 + bufs, realstr, BUF2SIZE - bufs);
-                bufs += len;
+                if((temp = strstr(buffer, " / ")) != NULL) {
+                    dtitle = g_strdup(temp+3);
+                    dartist = g_strndup(realstr, temp - realstr);
+                }
+                else {
+                    dtitle = g_strdup(realstr);
+                }
                 break;
             }
-            if (bufs > 0) {
-                buffer2[BUF2SIZE - 1] = '\0';
-                if ((temp = strstr(buffer2, " / ")) != NULL) {
-                    cdda_cdinfo_cd_set(cdinfo, g_strdup(temp + 3),
-                                       g_strndup(buffer2, temp - buffer2));
-                }
-                else
-                    cdda_cdinfo_cd_set(cdinfo, g_strdup(buffer2),
-                                       g_strdup(buffer2));
-                bufs = 0;
-            }
             command++;
         case 3:
             if (!strncmp(buffer, "DYEAR", 5)) {
+                dyear = g_strdup(realstr);
                 break;
             }
             command++;
         case 4:
             if (!strncmp(buffer, "DGENRE", 6)) {
+                dgenre = g_strdup(realstr);
                 break;
             }
+
+            // we have obtained all necessary data to set discinfo
+            cdda_cdinfo_cd_set(cdinfo, dtitle, dartist, discid, dgenre, dyear);
+
             command++;
         case 5:
             if (!strncmp(buffer, "TTITLE", 6)) {
                 num = atoi(buffer + 6);
                 if (oldnum < 0 || num == oldnum) {
-                    strncpy(buffer2 + bufs, realstr, BUF2SIZE - bufs);
-                    bufs += len;
+                    ttitle = g_strdup(realstr);
                 }
                 else {
-                    buffer2[BUF2SIZE - 1] = '\0';
-                    cdda_cdinfo_track_set(cdinfo, oldnum + 1, NULL,
-                                          g_strdup(buffer2));
-                    strncpy(buffer2, realstr, BUF2SIZE);
-                    bufs = len;
+                    cdda_cdinfo_track_set(cdinfo, oldnum + 1, NULL, ttitle);
+                    ttitle = g_strdup(realstr);
                 }
                 oldnum = num;
                 break;
             }
             if (oldnum >= 0)
-                cdda_cdinfo_track_set(cdinfo, oldnum + 1, NULL,
-                                      g_strdup(buffer2));
-            bufs = 0;
+                cdda_cdinfo_track_set(cdinfo, oldnum + 1, NULL, ttitle);
+
             oldnum = -1;
             command++;
         case 6:
@@ -654,7 +649,7 @@
     }
 
     if (oldnum >= 0)
-        cdda_cdinfo_track_set(cdinfo, oldnum + 1, NULL, g_strdup(buffer2));
+        cdda_cdinfo_track_set(cdinfo, oldnum + 1, NULL, ttitle);
 
     fclose(fd);
     return (1);