not sure why it crashes

This commit is contained in:
Fufu Fang 2019-10-27 11:08:23 +00:00
parent ef53cb83f6
commit 83f88dbe38
No known key found for this signature in database
GPG Key ID: 0F6BB5EF6F8BB729
4 changed files with 69 additions and 30 deletions

View File

@ -1,6 +1,6 @@
VERSION=1.2.0
CFLAGS += -O2 -Wall -Wextra -Wshadow -rdynamic -D_GNU_SOURCE\
CFLAGS += -g -O2 -Wall -Wextra -Wshadow -rdynamic -D_GNU_SOURCE\
-D_FILE_OFFSET_BITS=64 -DVERSION=\"$(VERSION)\"\
`pkg-config --cflags-only-I gumbo libcurl fuse uuid expat`
LIBS = -pthread -lgumbo -lcurl -lfuse -lcrypto -luuid -lexpat

View File

@ -609,7 +609,7 @@ LinkTable *path_to_Link_LinkTable_new(const char *path)
if (!CONFIG.sonic_id3) {
next_table = sonic_LinkTable_new_index_mode(link->sonic_id);
} else {
next_table = sonic_LinkTable_new_index_mode(link->sonic_id_str);
next_table = sonic_LinkTable_new_id3_mode(link->sonic_id_str);
}
}
}
@ -629,6 +629,7 @@ static Link *path_to_Link_recursive(char *path, LinkTable *linktbl)
*slash = '\0';
}
puts(path);
slash = strchr(path, '/');
if ( slash == NULL ) {
/* We cannot find another '/', we have reached the last level */

View File

@ -244,24 +244,38 @@ static void XMLCALL XML_parser_id3_mode(void *data, const char *elem,
/**
* \brief parse a XML string in order to fill in the LinkTable
*/
static void sonic_XML_to_LinkTable(DataStruct ds, LinkTable *linktbl)
static LinkTable *sonic_url_to_LinkTable(const char *url,
XML_StartElementHandler handler)
{
LinkTable *linktbl = LinkTable_alloc(url);
/* start downloading the base URL */
DataStruct xml = Link_to_DataStruct(linktbl->links[0]);
if (xml.size == 0) {
LinkTable_free(linktbl);
return NULL;
}
XML_Parser parser = XML_ParserCreate(NULL);
XML_SetUserData(parser, linktbl);
if (!CONFIG.sonic_id3) {
XML_SetStartElementHandler(parser, XML_parser_index_mode);
} else {
XML_SetStartElementHandler(parser, XML_parser_id3_mode);
}
XML_SetStartElementHandler(parser, handler);
if (XML_Parse(parser, ds.data, ds.size, 1) == XML_STATUS_ERROR) {
if (XML_Parse(parser, xml.data, xml.size, 1) == XML_STATUS_ERROR) {
fprintf(stderr,
"sonic_XML_to_LinkTable(): Parse error at line %lu: %s\n",
XML_GetCurrentLineNumber(parser),
XML_ErrorString(XML_GetErrorCode(parser)));
}
XML_ParserFree(parser);
free(xml.data);
LinkTable_print(linktbl);
return linktbl;
}
LinkTable *sonic_LinkTable_new_index_mode(const int id)
@ -272,29 +286,47 @@ LinkTable *sonic_LinkTable_new_index_mode(const int id)
} else {
url = sonic_gen_url_first_part("getIndexes");
}
printf("%s\n", url);
LinkTable *linktbl = LinkTable_alloc(url);
/* start downloading the base URL */
DataStruct xml = Link_to_DataStruct(linktbl->links[0]);
if (xml.size == 0) {
LinkTable_free(linktbl);
return NULL;
}
sonic_XML_to_LinkTable(xml, linktbl);
LinkTable_print(linktbl);
free(xml.data);
LinkTable *linktbl = sonic_url_to_LinkTable(url, XML_parser_index_mode);
free(url);
return linktbl;
}
LinkTable *sonic_LinkTable_new_id3_mode(const char *sonic_id_str)
LinkTable *sonic_LinkTable_new_id3_root()
{
char *url = sonic_gen_url_first_part("getArtists");
LinkTable *linktbl = sonic_url_to_LinkTable(url, XML_parser_index_mode);
free(url);
return linktbl;
}
LinkTable *sonic_LinkTable_new_id3_mode(char *sonic_id_str)
{
/* Count the number of '/' */
int n = 0;
for (char *c = sonic_id_str; *c; c++) {
if (*c == '/') {
n++;
}
}
char *url;
switch (n) {
/* Root level */
case 1:
break;
/* Index level */
case 2:
break;
/* Artist level */
case 3:
break;
/* Album level*/
case 4:
break;
/* Invalid */
default:
break;
}
return NULL;
}

View File

@ -14,13 +14,19 @@ void sonic_config_init(const char *server, const char *username,
const char *password);
/**
* \brief Create a new Sonic LinkTable in index mode)
* \brief Create a new Sonic LinkTable in index mode
*/
LinkTable *sonic_LinkTable_new_index_mode(const int id);
/**
* \brief Create a new Sonic LinkTable in ID3 mode)
* \brief Create a new Sonic LinkTable in ID3 mode
* \details In this mode, the filesystem effectively has 4 levels of
* directories, which are:
* 1. Root
* 2. Index
* 3. Artists
* 4. Album
*/
LinkTable *sonic_LinkTable_new_id3_mode(const char *sonic_id_str);
LinkTable *sonic_LinkTable_new_id3_mode(char *sonic_id_str);
#endif