⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 cddb.c

📁 xmms-1.2.10.tar.gz学习使用的就下吧
💻 C
📖 第 1 页 / 共 2 页
字号:
					num = atoi(buffer + 6);					if (oldnum < 0 || num == oldnum)					{						strncpy(buffer2 + bufs, realstr, BUF2SIZE - bufs);						bufs += len;					}					else					{							buffer2[BUF2SIZE - 1] = '\0';						cdda_cdinfo_track_set(cdinfo, oldnum + 1, NULL, g_strdup(buffer2));						strncpy(buffer2, realstr, BUF2SIZE);						bufs = len;					}					oldnum = num;					break;				}				if (oldnum >= 0)					cdda_cdinfo_track_set(cdinfo, oldnum + 1, NULL, g_strdup(buffer2));				bufs = 0;				oldnum = -1;				command++;			case 4:				if (!strncmp(buffer, "EXTD", 4))				{					break;				}				command++;			case 5:				if (!strncmp(buffer, "EXTT", 4))				{					break;				}				command++;			case 6:				if (!strncmp(buffer, "PLAYORDER", 9))				{					break;				}				command++;			default:				g_log(NULL, G_LOG_LEVEL_WARNING, "%s: illegal cddb-data: %s", PACKAGE, buffer);				break;		}			} while (http_read_line(sock, buffer, 256) >= 0);		if (oldnum >= 0)		cdda_cdinfo_track_set(cdinfo, oldnum + 1, NULL, g_strdup(buffer2));	http_close_connection(sock);	return TRUE;}static gint cddb_get_protocol_level(void){	if (cdda_cfg.cddb_protocol_level < 1)		cdda_cfg.cddb_protocol_level =			cddb_check_protocol_level(cdda_cfg.cddb_server);		return cdda_cfg.cddb_protocol_level;}static GList * cddb_get_server_list(gchar *server, gint protocol_level){	gint sock;	gchar *getstr;	gchar buffer[256];	gchar **message;	GList *list = NULL;		if((sock = cddb_http_open_connection(server, 80)) == 0)		return NULL;	cddb_log("Sending sites-command");	getstr = g_strdup_printf(		"GET /~cddb/cddb.cgi?cmd=sites%s&proto=%d HTTP/1.0\r\n\r\n",		cddb_generate_hello_string(), protocol_level);	write(sock, getstr, strlen(getstr));	g_free(getstr);	if (http_read_first_line(sock, buffer, 256) < 0)	{		http_close_connection(sock);		return NULL;	}	cddb_log("Sites response: %s", buffer);		switch (atoi(buffer))	{		case 210:			while ((http_read_line(sock, buffer, 256)) > 1)			{				message = g_strsplit(buffer, " ", 6);				if (message && message[0] && message[1] &&				    !strcasecmp(message[1], "http"))				{					list = g_list_prepend(list, message);				}				else				{					/* Ignore non-http servers */					g_strfreev(message);				}			}			list = g_list_reverse(list);			break;		case 401:			/* No site information available */			break;		default:			break;	}	http_close_connection(sock);	return list;}int search_for_discid(char *abs_filename,char **cddb_file,guint32 disc_id){    struct dirent *tmpdir;    DIR *dir;    char tmp_id[10];    if ((dir = opendir(abs_filename)) == NULL) {        return(0);    }    memset(tmp_id,0,10);    sprintf(tmp_id,"%08x",disc_id);    while ((tmpdir = readdir(dir)) != NULL) {        if (!strncmp(tmp_id,tmpdir->d_name,8)){            if ((cddb_file[0] = (char *) g_malloc(strlen(abs_filename)+strlen(tmpdir->d_name)+1)) == NULL) {                return(0);            }            strcpy(cddb_file[0],abs_filename);            if (cddb_file[0][strlen(cddb_file[0])-1] != '/'){                strcat(cddb_file[0],"/");            }            strcat(cddb_file[0],tmpdir->d_name);            closedir(dir);            return(1);        }    }    closedir(dir);    return(0);}int scan_cddb_dir(char *server,char **cddb_file,guint32 disc_id){    struct dirent *tmp;    DIR *dir;    char abs_filename[FILENAME_MAX];    struct stat st;    if ((dir = opendir(&server[7])) == NULL) {        return 0;    }    while (((tmp = readdir(dir)) != NULL)) {        strcpy(abs_filename,&server[7]);        if (abs_filename[strlen(abs_filename)-1] != '/'){            strcat(abs_filename,"/");        }        strcat(abs_filename,tmp->d_name);        if ((tmp->d_name[0] != '.') && (stat(abs_filename,&st)!= -1) && (S_ISDIR(st.st_mode)) && (search_for_discid(abs_filename,cddb_file,disc_id))){            break;        }    }    closedir(dir);    return(cddb_file[0]!=NULL);}int cddb_read_file(char *file, cddb_disc_header_t *cddb_info, cdinfo_t *cdinfo){    FILE *fd;    gchar buffer[256], buffer2[BUF2SIZE];    gchar *realstr, *temp;    gint len, command, bufs;    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, '=');        if (buffer[0] == '#' || !realstr)            continue;        realstr++;        len = strlen(realstr);	if (realstr[len-1] == '\n')	    realstr[--len] = '\0';	/* remove newline */        switch (command) {            case 1:                if (!strncmp(buffer, "DISCID", 6))                    break;                command++;            case 2:                if (!strncmp(buffer, "DTITLE", 6))                {                    strncpy(buffer2 + bufs, realstr, BUF2SIZE - bufs);                    bufs += len;                    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, "TTITLE", 6))                {                    num = atoi(buffer + 6);                    if (oldnum < 0 || num == oldnum)                    {                        strncpy(buffer2 + bufs, realstr, BUF2SIZE - bufs);                        bufs += len;                    }                    else                    {	                        buffer2[BUF2SIZE - 1] = '\0';                        cdda_cdinfo_track_set(cdinfo, oldnum + 1, NULL, g_strdup(buffer2));                        strncpy(buffer2, realstr, BUF2SIZE);                        bufs = len;                    }                    oldnum = num;                    break;                }                if (oldnum >= 0)                    cdda_cdinfo_track_set(cdinfo, oldnum + 1, NULL, g_strdup(buffer2));		bufs = 0;		oldnum = -1;                command++;            case 4:                if (!strncmp(buffer, "EXTD", 4))                {                    break;                }                command++;            case 5:                if (!strncmp(buffer, "EXTT", 4))                {                    break;                }                command++;            case 6:                if (!strncmp(buffer, "PLAYORDER", 9))                {                    break;                }                command++;            default:                g_log(NULL, G_LOG_LEVEL_WARNING, "%s: illegal cddb-data: %s", PACKAGE, buffer);                break;        }    }    if (oldnum >= 0)	cdda_cdinfo_track_set(cdinfo, oldnum + 1, NULL, g_strdup(buffer2));    fclose(fd);    return(1);}void cdda_cddb_get_info(cdda_disc_toc_t *toc, cdinfo_t *cdinfo){	guint32 disc_id;	cddb_disc_header_t cddb_disc_info;    char *cddb_file[1];	disc_id = cdda_cddb_compute_discid(toc);    cddb_file[0]=NULL;    if ((cached_id != disc_id) && (strncmp(cdda_cfg.cddb_server,"file://",7) != 0))	{		if (cddb_get_protocol_level() == 0)			return;		cached_id = disc_id;		if(!cddb_query(cdda_cfg.cddb_server, toc, &cddb_disc_info))			return;		if(!cddb_read(cdda_cfg.cddb_server, &cddb_disc_info, cdinfo))			return;		cdinfo->is_valid = TRUE;    } else  if ((cached_id != disc_id) && (strncmp(cdda_cfg.cddb_server,"file://",7) == 0)){        cached_id = disc_id;             if(!scan_cddb_dir(cdda_cfg.cddb_server,cddb_file,disc_id))            return;        if(!cddb_read_file(cddb_file[0],&cddb_disc_info, cdinfo)){            g_free(cddb_file[0]);            return;        }        cdinfo->is_valid = TRUE;	g_free(cddb_file[0]);	}}void cdda_cddb_set_server(gchar *new_server){	if (strcmp(cdda_cfg.cddb_server, new_server))	{		g_free(cdda_cfg.cddb_server);		cdda_cfg.cddb_server = g_strdup(new_server);		cdda_cfg.cddb_protocol_level = 0;		cached_id = 0;	}}static gchar* cddb_position_string(gchar * input){	gchar deg[4], min[3];	if (input == NULL || strlen(input) < 7)		return g_strdup("");	strncpy(deg, input + 1, 3);	deg[3] = '\0';	strncpy(min, input + 5, 2);	min[2] = '\0';	return g_strdup_printf("%2d

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -