2007-02-24 17:25:28 -05:00
|
|
|
/*
|
|
|
|
* ezstream - source client for Icecast with external en-/decoder support
|
|
|
|
* Copyright (C) 2003, 2004, 2005, 2006 Ed Zaleski <oddsock@oddsock.org>
|
|
|
|
* Copyright (C) 2007 Moritz Grimm <gtgbr@gmx.net>
|
|
|
|
*
|
|
|
|
* This program is free software; you can redistribute it and/or modify
|
|
|
|
* it under the terms of the GNU General Public License as published by
|
|
|
|
* the Free Software Foundation; either version 2 of the License, or
|
|
|
|
* (at your option) any later version.
|
|
|
|
*
|
|
|
|
* This program 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 General Public License for more details.
|
|
|
|
*
|
|
|
|
* You should have received a copy of the GNU General Public License
|
|
|
|
* along with this program; if not, write to the Free Software
|
|
|
|
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
|
|
|
*/
|
|
|
|
|
|
|
|
#ifdef HAVE_CONFIG_H
|
|
|
|
# include "config.h"
|
|
|
|
#endif
|
|
|
|
|
|
|
|
#include <ctype.h>
|
|
|
|
#include <limits.h>
|
|
|
|
#include <stdio.h>
|
2004-01-30 12:19:45 -05:00
|
|
|
#include <string.h>
|
2007-02-24 17:25:28 -05:00
|
|
|
|
2004-01-30 12:19:45 -05:00
|
|
|
#include "configfile.h"
|
2007-02-24 17:25:28 -05:00
|
|
|
#include "util.h"
|
|
|
|
|
|
|
|
#ifndef PATH_MAX
|
|
|
|
# define PATH_MAX 256
|
|
|
|
#endif
|
2004-01-30 12:19:45 -05:00
|
|
|
|
Various cleanups and auto-fu tweaks.
* Make Makefile.am files look alike as much as possible.
* Remove debug: target and don't mess with the users DEBUG environment
variable: Autoconf checks for -g and automatically adds it to CFLAGS, which
is overridden by the user's $DEBUG. If the user didn't specify one, "make
install" will strip the resulting binaries and leave the debugging symbols
intact otherwise.
* Remove profile: target, as it is quite pointless in Ezstream. Also, the user
can add profiling flags via the $DEBUG variable as well.
* Remove -ffast-math and -fsigned-char from gcc, and enable two additional
warnings instead.
* Unconfuse Solaris compiler flags (unfortunately, the configure script still
fails in the libshout check with some obscure linker error): Do not force
-x04 and -fast optimizations, let the user decide (it doesn't matter for
Ezstream anyways.) Remove -xgc92, which is deprecated and actually makes
the resulting binary run slower on SPARC. Also remove -fsimple, which does
not help and has the potential of causing trouble, and don't enable verbose
warnings just to disable them afterwards with -w. Leave only -v for verbose
warnings.
* Const'ify getFormat*() functions and blankString, and squelch a few const-
related warnings.
* Squelch a signedness warning and fix two ;; syntax errors.
* Add a snapshot target to Makefile.am that creates a tarball of the form
ezstream-snapshot-YYYYMMDD.tar.gz.
git-svn-id: https://svn.xiph.org/trunk/ezstream@12562 0101bb08-14d6-0310-b084-bc0e0c8e3800
2007-02-25 09:00:15 -05:00
|
|
|
static EZCONFIG ezConfig;
|
|
|
|
static const char *blankString = "";
|
2004-01-30 12:19:45 -05:00
|
|
|
|
2007-02-24 18:05:51 -05:00
|
|
|
void freeConfig(EZCONFIG *);
|
|
|
|
|
2007-02-24 17:25:28 -05:00
|
|
|
EZCONFIG *
|
|
|
|
getEZConfig(void)
|
|
|
|
{
|
|
|
|
return (&ezConfig);
|
2004-01-30 12:19:45 -05:00
|
|
|
}
|
|
|
|
|
Various cleanups and auto-fu tweaks.
* Make Makefile.am files look alike as much as possible.
* Remove debug: target and don't mess with the users DEBUG environment
variable: Autoconf checks for -g and automatically adds it to CFLAGS, which
is overridden by the user's $DEBUG. If the user didn't specify one, "make
install" will strip the resulting binaries and leave the debugging symbols
intact otherwise.
* Remove profile: target, as it is quite pointless in Ezstream. Also, the user
can add profiling flags via the $DEBUG variable as well.
* Remove -ffast-math and -fsigned-char from gcc, and enable two additional
warnings instead.
* Unconfuse Solaris compiler flags (unfortunately, the configure script still
fails in the libshout check with some obscure linker error): Do not force
-x04 and -fast optimizations, let the user decide (it doesn't matter for
Ezstream anyways.) Remove -xgc92, which is deprecated and actually makes
the resulting binary run slower on SPARC. Also remove -fsimple, which does
not help and has the potential of causing trouble, and don't enable verbose
warnings just to disable them afterwards with -w. Leave only -v for verbose
warnings.
* Const'ify getFormat*() functions and blankString, and squelch a few const-
related warnings.
* Squelch a signedness warning and fix two ;; syntax errors.
* Add a snapshot target to Makefile.am that creates a tarball of the form
ezstream-snapshot-YYYYMMDD.tar.gz.
git-svn-id: https://svn.xiph.org/trunk/ezstream@12562 0101bb08-14d6-0310-b084-bc0e0c8e3800
2007-02-25 09:00:15 -05:00
|
|
|
const char *
|
2007-02-24 17:56:18 -05:00
|
|
|
getFormatEncoder(const char *format)
|
2004-07-18 23:12:31 -04:00
|
|
|
{
|
2007-02-24 17:56:18 -05:00
|
|
|
int i;
|
|
|
|
|
|
|
|
for (i = 0; i < ezConfig.numEncoderDecoders; i++) {
|
|
|
|
if (ezConfig.encoderDecoders[i] != NULL &&
|
|
|
|
ezConfig.encoderDecoders[i]->format != NULL &&
|
|
|
|
strcmp(ezConfig.encoderDecoders[i]->format, format) == 0) {
|
|
|
|
if (ezConfig.encoderDecoders[i]->encoder != NULL)
|
|
|
|
return (ezConfig.encoderDecoders[i]->encoder);
|
|
|
|
else
|
|
|
|
return (blankString);
|
2004-07-18 23:12:31 -04:00
|
|
|
}
|
|
|
|
}
|
2007-02-24 17:56:18 -05:00
|
|
|
|
|
|
|
return (blankString);
|
2004-07-18 23:12:31 -04:00
|
|
|
}
|
|
|
|
|
Various cleanups and auto-fu tweaks.
* Make Makefile.am files look alike as much as possible.
* Remove debug: target and don't mess with the users DEBUG environment
variable: Autoconf checks for -g and automatically adds it to CFLAGS, which
is overridden by the user's $DEBUG. If the user didn't specify one, "make
install" will strip the resulting binaries and leave the debugging symbols
intact otherwise.
* Remove profile: target, as it is quite pointless in Ezstream. Also, the user
can add profiling flags via the $DEBUG variable as well.
* Remove -ffast-math and -fsigned-char from gcc, and enable two additional
warnings instead.
* Unconfuse Solaris compiler flags (unfortunately, the configure script still
fails in the libshout check with some obscure linker error): Do not force
-x04 and -fast optimizations, let the user decide (it doesn't matter for
Ezstream anyways.) Remove -xgc92, which is deprecated and actually makes
the resulting binary run slower on SPARC. Also remove -fsimple, which does
not help and has the potential of causing trouble, and don't enable verbose
warnings just to disable them afterwards with -w. Leave only -v for verbose
warnings.
* Const'ify getFormat*() functions and blankString, and squelch a few const-
related warnings.
* Squelch a signedness warning and fix two ;; syntax errors.
* Add a snapshot target to Makefile.am that creates a tarball of the form
ezstream-snapshot-YYYYMMDD.tar.gz.
git-svn-id: https://svn.xiph.org/trunk/ezstream@12562 0101bb08-14d6-0310-b084-bc0e0c8e3800
2007-02-25 09:00:15 -05:00
|
|
|
const char *
|
2007-02-24 17:56:18 -05:00
|
|
|
getFormatDecoder(const char *match)
|
2004-07-18 23:12:31 -04:00
|
|
|
{
|
2007-02-24 17:56:18 -05:00
|
|
|
int i;
|
|
|
|
|
|
|
|
for (i = 0; i < ezConfig.numEncoderDecoders; i++) {
|
|
|
|
if (ezConfig.encoderDecoders[i] != NULL &&
|
|
|
|
ezConfig.encoderDecoders[i]->match != NULL &&
|
|
|
|
strcmp(ezConfig.encoderDecoders[i]->match, match) == 0) {
|
|
|
|
if (ezConfig.encoderDecoders[i]->decoder != NULL)
|
|
|
|
return (ezConfig.encoderDecoders[i]->decoder);
|
|
|
|
else
|
|
|
|
return (blankString);
|
2004-07-18 23:12:31 -04:00
|
|
|
}
|
|
|
|
}
|
2007-02-24 17:56:18 -05:00
|
|
|
|
|
|
|
return (blankString);
|
2004-07-18 23:12:31 -04:00
|
|
|
}
|
2004-01-30 12:19:45 -05:00
|
|
|
|
2007-02-24 18:05:51 -05:00
|
|
|
void
|
|
|
|
freeConfig(EZCONFIG *cfg)
|
|
|
|
{
|
|
|
|
unsigned int i;
|
|
|
|
|
|
|
|
if (cfg == NULL)
|
|
|
|
return;
|
|
|
|
|
|
|
|
if (cfg->URL != NULL)
|
|
|
|
xfree(cfg->URL);
|
|
|
|
if (cfg->password != NULL)
|
|
|
|
xfree(cfg->password);
|
|
|
|
if (cfg->format != NULL)
|
|
|
|
xfree(cfg->format);
|
|
|
|
if (cfg->fileName != NULL)
|
|
|
|
xfree(cfg->fileName);
|
|
|
|
if (cfg->serverName != NULL)
|
|
|
|
xfree(cfg->serverName);
|
|
|
|
if (cfg->serverURL != NULL)
|
|
|
|
xfree(cfg->serverURL);
|
|
|
|
if (cfg->serverGenre != NULL)
|
|
|
|
xfree(cfg->serverGenre);
|
|
|
|
if (cfg->serverDescription != NULL)
|
|
|
|
xfree(cfg->serverDescription);
|
|
|
|
if (cfg->serverBitrate != NULL)
|
|
|
|
xfree(cfg->serverBitrate);
|
|
|
|
if (cfg->serverChannels != NULL)
|
|
|
|
xfree(cfg->serverChannels);
|
|
|
|
if (cfg->serverSamplerate != NULL)
|
|
|
|
xfree(cfg->serverSamplerate);
|
|
|
|
if (cfg->serverQuality != NULL)
|
|
|
|
xfree(cfg->serverQuality);
|
|
|
|
if (cfg->encoderDecoders != NULL) {
|
|
|
|
for (i = 0; i < MAX_FORMAT_ENCDEC; i++) {
|
|
|
|
if (cfg->encoderDecoders[i] != NULL) {
|
|
|
|
if (cfg->encoderDecoders[i]->format != NULL)
|
|
|
|
xfree(cfg->encoderDecoders[i]->format);
|
|
|
|
if (cfg->encoderDecoders[i]->match != NULL)
|
|
|
|
xfree(cfg->encoderDecoders[i]->match);
|
|
|
|
if (cfg->encoderDecoders[i]->encoder != NULL)
|
|
|
|
xfree(cfg->encoderDecoders[i]->encoder);
|
|
|
|
if (cfg->encoderDecoders[i]->decoder != NULL)
|
|
|
|
xfree(cfg->encoderDecoders[i]->decoder);
|
|
|
|
xfree(cfg->encoderDecoders[i]);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
memset(cfg, 0, sizeof(EZCONFIG));
|
|
|
|
}
|
|
|
|
|
2007-02-24 18:26:16 -05:00
|
|
|
int
|
|
|
|
parseConfig(const char *fileName)
|
2004-01-30 12:19:45 -05:00
|
|
|
{
|
2007-02-24 18:26:16 -05:00
|
|
|
xmlDocPtr doc;
|
|
|
|
xmlNodePtr cur;
|
|
|
|
char *ls_xmlContentPtr;
|
|
|
|
int shuffle_set, svrinfopublic_set;
|
|
|
|
|
|
|
|
xmlLineNumbersDefault(1);
|
|
|
|
if ((doc = xmlParseFile(fileName)) == NULL) {
|
|
|
|
printf("%s: Parse error (not well-formed XML.)\n", fileName);
|
|
|
|
return (0);
|
2004-01-30 12:19:45 -05:00
|
|
|
}
|
|
|
|
|
|
|
|
cur = xmlDocGetRootElement(doc);
|
|
|
|
|
|
|
|
if (cur == NULL) {
|
2007-02-24 18:26:16 -05:00
|
|
|
printf("%s: Parse error (empty XML document.)\n", fileName);
|
2004-01-30 12:19:45 -05:00
|
|
|
xmlFreeDoc(doc);
|
2007-02-24 18:26:16 -05:00
|
|
|
return (0);
|
2004-01-30 12:19:45 -05:00
|
|
|
}
|
|
|
|
|
|
|
|
memset(&ezConfig, '\000', sizeof(ezConfig));
|
|
|
|
|
2007-02-24 18:26:16 -05:00
|
|
|
shuffle_set = 0;
|
|
|
|
svrinfopublic_set = 0;
|
2004-01-30 12:19:45 -05:00
|
|
|
cur = cur->xmlChildrenNode;
|
|
|
|
while (cur != NULL) {
|
2007-02-24 18:26:16 -05:00
|
|
|
if (!xmlStrcmp(cur->name, BAD_CAST "url")) {
|
|
|
|
if (ezConfig.URL != NULL) {
|
|
|
|
printf("%s[%ld]: Error: Cannot have multiple <url> elements.\n",
|
|
|
|
fileName, xmlGetLineNo(cur));
|
|
|
|
goto config_error;
|
|
|
|
}
|
2004-01-30 12:19:45 -05:00
|
|
|
if (cur->xmlChildrenNode != NULL) {
|
2007-02-24 18:26:16 -05:00
|
|
|
ls_xmlContentPtr = (char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1);
|
|
|
|
ezConfig.URL = xstrdup(ls_xmlContentPtr);
|
2004-01-30 12:19:45 -05:00
|
|
|
xmlFree(ls_xmlContentPtr);
|
|
|
|
}
|
|
|
|
}
|
2007-02-24 18:26:16 -05:00
|
|
|
if (!xmlStrcmp(cur->name, BAD_CAST "sourcepassword")) {
|
|
|
|
if (ezConfig.password != NULL) {
|
|
|
|
printf("%s[%ld]: Error: Cannot have multiple <sourcepassword> elements.\n",
|
|
|
|
fileName, xmlGetLineNo(cur));
|
|
|
|
goto config_error;
|
|
|
|
}
|
2004-01-30 12:19:45 -05:00
|
|
|
if (cur->xmlChildrenNode != NULL) {
|
2007-02-24 18:26:16 -05:00
|
|
|
ls_xmlContentPtr = (char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1);
|
|
|
|
ezConfig.password = xstrdup(ls_xmlContentPtr);
|
2004-01-30 12:19:45 -05:00
|
|
|
xmlFree(ls_xmlContentPtr);
|
|
|
|
}
|
|
|
|
}
|
2007-02-24 18:26:16 -05:00
|
|
|
if (!xmlStrcmp(cur->name, BAD_CAST "format")) {
|
|
|
|
if (ezConfig.format != NULL) {
|
|
|
|
printf("%s[%ld]: Error: Cannot have multiple <format> elements.\n",
|
|
|
|
fileName, xmlGetLineNo(cur));
|
|
|
|
goto config_error;
|
|
|
|
}
|
2004-01-30 12:19:45 -05:00
|
|
|
if (cur->xmlChildrenNode != NULL) {
|
2007-02-24 18:26:16 -05:00
|
|
|
char *p;
|
|
|
|
|
|
|
|
ls_xmlContentPtr = (char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1);
|
|
|
|
ezConfig.format = xstrdup(ls_xmlContentPtr);
|
2004-01-30 12:19:45 -05:00
|
|
|
xmlFree(ls_xmlContentPtr);
|
2007-02-24 18:26:16 -05:00
|
|
|
for (p = ezConfig.format; *p != '\0'; p++)
|
|
|
|
*p = toupper((int)*p);
|
2004-01-30 12:19:45 -05:00
|
|
|
}
|
|
|
|
}
|
2007-02-24 18:26:16 -05:00
|
|
|
if (!xmlStrcmp(cur->name, BAD_CAST "filename")) {
|
|
|
|
if (ezConfig.fileName != NULL) {
|
|
|
|
printf("%s[%ld]: Error: Cannot have multiple <filename> elements.\n",
|
|
|
|
fileName, xmlGetLineNo(cur));
|
|
|
|
goto config_error;
|
|
|
|
}
|
2004-01-30 12:19:45 -05:00
|
|
|
if (cur->xmlChildrenNode != NULL) {
|
2007-02-24 18:26:16 -05:00
|
|
|
ls_xmlContentPtr = (char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1);
|
|
|
|
if (strlen(ls_xmlContentPtr) > PATH_MAX - 1) {
|
|
|
|
printf("%s[%ld]: Error: Path or filename in <filename> is too long.\n",
|
|
|
|
fileName, xmlGetLineNo(cur));
|
|
|
|
goto config_error;
|
2004-01-30 12:19:45 -05:00
|
|
|
}
|
2007-02-24 18:26:16 -05:00
|
|
|
ezConfig.fileName = xstrdup(ls_xmlContentPtr);
|
2004-01-30 12:19:45 -05:00
|
|
|
xmlFree(ls_xmlContentPtr);
|
|
|
|
}
|
|
|
|
}
|
2007-02-24 18:26:16 -05:00
|
|
|
if (!xmlStrcmp(cur->name, BAD_CAST "shuffle")) {
|
|
|
|
if (shuffle_set) {
|
|
|
|
printf("%s[%ld]: Error: Cannot have multiple <shuffle> elements.\n",
|
|
|
|
fileName, xmlGetLineNo(cur));
|
|
|
|
goto config_error;
|
|
|
|
}
|
2004-01-30 12:19:45 -05:00
|
|
|
if (cur->xmlChildrenNode != NULL) {
|
2007-02-24 18:26:16 -05:00
|
|
|
int tmp;
|
|
|
|
|
|
|
|
ls_xmlContentPtr = (char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1);
|
|
|
|
tmp = atoi(ls_xmlContentPtr);
|
|
|
|
ezConfig.shuffle = (tmp == 0) ? 0 : 1;
|
2004-01-30 12:19:45 -05:00
|
|
|
xmlFree(ls_xmlContentPtr);
|
2007-02-24 18:26:16 -05:00
|
|
|
shuffle_set = 1;
|
2004-01-30 12:19:45 -05:00
|
|
|
}
|
|
|
|
}
|
2007-02-24 18:26:16 -05:00
|
|
|
if (!xmlStrcmp(cur->name, BAD_CAST "svrinfoname")) {
|
|
|
|
if (ezConfig.serverName != NULL) {
|
|
|
|
printf("%s[%ld]: Error: Cannot have multiple <svrinfoname> elements.\n",
|
|
|
|
fileName, xmlGetLineNo(cur));
|
|
|
|
goto config_error;
|
|
|
|
}
|
2004-01-30 12:19:45 -05:00
|
|
|
if (cur->xmlChildrenNode != NULL) {
|
2007-02-24 18:26:16 -05:00
|
|
|
ls_xmlContentPtr = (char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1);
|
|
|
|
ezConfig.serverName = xstrdup(ls_xmlContentPtr);
|
2004-01-30 12:19:45 -05:00
|
|
|
xmlFree(ls_xmlContentPtr);
|
|
|
|
}
|
|
|
|
}
|
2007-02-24 18:26:16 -05:00
|
|
|
if (!xmlStrcmp(cur->name, BAD_CAST "svrinfourl")) {
|
|
|
|
if (ezConfig.serverURL != NULL) {
|
|
|
|
printf("%s[%ld]: Error: Cannot have multiple <svrinfourl> elements.\n",
|
|
|
|
fileName, xmlGetLineNo(cur));
|
|
|
|
goto config_error;
|
|
|
|
}
|
2004-01-30 12:19:45 -05:00
|
|
|
if (cur->xmlChildrenNode != NULL) {
|
2007-02-24 18:26:16 -05:00
|
|
|
ls_xmlContentPtr = (char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1);
|
|
|
|
ezConfig.serverURL = xstrdup(ls_xmlContentPtr);
|
2004-01-30 12:19:45 -05:00
|
|
|
xmlFree(ls_xmlContentPtr);
|
|
|
|
}
|
|
|
|
}
|
2007-02-24 18:26:16 -05:00
|
|
|
if (!xmlStrcmp(cur->name, BAD_CAST "svrinfogenre")) {
|
|
|
|
if (ezConfig.serverGenre != NULL) {
|
|
|
|
printf("%s[%ld]: Error: Cannot have multiple <svrinfogenre> elements.\n",
|
|
|
|
fileName, xmlGetLineNo(cur));
|
|
|
|
goto config_error;
|
|
|
|
}
|
2004-01-30 12:19:45 -05:00
|
|
|
if (cur->xmlChildrenNode != NULL) {
|
2007-02-24 18:26:16 -05:00
|
|
|
ls_xmlContentPtr = (char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1);
|
|
|
|
ezConfig.serverGenre = xstrdup(ls_xmlContentPtr);
|
2004-01-30 12:19:45 -05:00
|
|
|
xmlFree(ls_xmlContentPtr);
|
|
|
|
}
|
|
|
|
}
|
2007-02-24 18:26:16 -05:00
|
|
|
if (!xmlStrcmp(cur->name, BAD_CAST "svrinfodescription")) {
|
|
|
|
if (ezConfig.serverDescription != NULL) {
|
|
|
|
printf("%s[%ld]: Error: Cannot have multiple <svrinfodescription> elements.\n",
|
|
|
|
fileName, xmlGetLineNo(cur));
|
|
|
|
goto config_error;
|
|
|
|
}
|
2004-01-30 12:19:45 -05:00
|
|
|
if (cur->xmlChildrenNode != NULL) {
|
2007-02-24 18:26:16 -05:00
|
|
|
ls_xmlContentPtr = (char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1);
|
|
|
|
ezConfig.serverDescription = xstrdup(ls_xmlContentPtr);
|
|
|
|
xmlFree(ls_xmlContentPtr);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if (!xmlStrcmp(cur->name, BAD_CAST "svrinfobitrate")) {
|
|
|
|
if (ezConfig.serverBitrate != NULL) {
|
|
|
|
printf("%s[%ld]: Error: Cannot have multiple <svrinfobitrate> elements.\n",
|
|
|
|
fileName, xmlGetLineNo(cur));
|
|
|
|
goto config_error;
|
|
|
|
}
|
|
|
|
if (cur->xmlChildrenNode != NULL) {
|
|
|
|
ls_xmlContentPtr = (char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1);
|
|
|
|
ezConfig.serverBitrate = xstrdup(ls_xmlContentPtr);
|
2004-01-30 12:19:45 -05:00
|
|
|
xmlFree(ls_xmlContentPtr);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2007-02-24 18:26:16 -05:00
|
|
|
if (!xmlStrcmp(cur->name, BAD_CAST "svrinfochannels")) {
|
|
|
|
if (ezConfig.serverChannels != NULL) {
|
|
|
|
printf("%s[%ld]: Error: Cannot have multiple <svrinfochannels> elements.\n",
|
|
|
|
fileName, xmlGetLineNo(cur));
|
|
|
|
goto config_error;
|
|
|
|
}
|
2004-01-30 12:19:45 -05:00
|
|
|
if (cur->xmlChildrenNode != NULL) {
|
2007-02-24 18:26:16 -05:00
|
|
|
ls_xmlContentPtr = (char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1);
|
|
|
|
ezConfig.serverChannels = xstrdup(ls_xmlContentPtr);
|
2004-01-30 12:19:45 -05:00
|
|
|
xmlFree(ls_xmlContentPtr);
|
|
|
|
}
|
|
|
|
}
|
2007-02-24 18:26:16 -05:00
|
|
|
if (!xmlStrcmp(cur->name, BAD_CAST "svrinfosamplerate")) {
|
|
|
|
if (ezConfig.serverSamplerate != NULL) {
|
|
|
|
printf("%s[%ld]: Error: Cannot have multiple <svrinfosamplerate> elements.\n",
|
|
|
|
fileName, xmlGetLineNo(cur));
|
|
|
|
goto config_error;
|
|
|
|
}
|
2004-01-30 12:19:45 -05:00
|
|
|
if (cur->xmlChildrenNode != NULL) {
|
2007-02-24 18:26:16 -05:00
|
|
|
ls_xmlContentPtr = (char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1);
|
|
|
|
ezConfig.serverSamplerate = xstrdup(ls_xmlContentPtr);
|
2004-01-30 12:19:45 -05:00
|
|
|
xmlFree(ls_xmlContentPtr);
|
|
|
|
}
|
|
|
|
}
|
2007-02-24 18:26:16 -05:00
|
|
|
if (!xmlStrcmp(cur->name, BAD_CAST "svrinfoquality")) {
|
|
|
|
if (ezConfig.serverQuality != NULL) {
|
|
|
|
printf("%s[%ld]: Error: Cannot have multiple <svrinfoquality> elements.\n",
|
|
|
|
fileName, xmlGetLineNo(cur));
|
|
|
|
goto config_error;
|
|
|
|
}
|
2004-01-30 12:19:45 -05:00
|
|
|
if (cur->xmlChildrenNode != NULL) {
|
2007-02-24 18:26:16 -05:00
|
|
|
ls_xmlContentPtr = (char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1);
|
|
|
|
ezConfig.serverQuality = xstrdup(ls_xmlContentPtr);
|
2004-01-30 12:19:45 -05:00
|
|
|
xmlFree(ls_xmlContentPtr);
|
|
|
|
}
|
|
|
|
}
|
2007-02-24 18:26:16 -05:00
|
|
|
if (!xmlStrcmp(cur->name, BAD_CAST "svrinfopublic")) {
|
|
|
|
if (svrinfopublic_set) {
|
|
|
|
printf("%s[%ld]: Error: Cannot have multiple <svrinfopublic> elements.\n",
|
|
|
|
fileName, xmlGetLineNo(cur));
|
|
|
|
goto config_error;
|
|
|
|
}
|
2004-01-30 12:19:45 -05:00
|
|
|
if (cur->xmlChildrenNode != NULL) {
|
2007-02-24 18:26:16 -05:00
|
|
|
int tmp;
|
|
|
|
|
|
|
|
ls_xmlContentPtr = (char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1);
|
|
|
|
tmp = atoi(ls_xmlContentPtr);
|
|
|
|
ezConfig.serverPublic = (tmp == 0) ? 0 : 1;
|
2004-01-30 12:19:45 -05:00
|
|
|
xmlFree(ls_xmlContentPtr);
|
2007-02-24 18:26:16 -05:00
|
|
|
svrinfopublic_set = 1;
|
2004-01-30 12:19:45 -05:00
|
|
|
}
|
|
|
|
}
|
2007-02-24 18:26:16 -05:00
|
|
|
if (!xmlStrcmp(cur->name, BAD_CAST "reencode")) {
|
|
|
|
xmlNodePtr cur2;
|
|
|
|
int enable_set;
|
|
|
|
|
|
|
|
enable_set = 0;
|
2004-07-18 23:12:31 -04:00
|
|
|
cur2 = cur->xmlChildrenNode;
|
|
|
|
while (cur2 != NULL) {
|
2007-02-24 18:26:16 -05:00
|
|
|
if (!xmlStrcmp(cur2->name, BAD_CAST "enable")) {
|
|
|
|
if (enable_set) {
|
|
|
|
printf("%s[%ld]: Error: Cannot have multiple <enable> elements.\n",
|
|
|
|
fileName, xmlGetLineNo(cur));
|
|
|
|
goto config_error;
|
|
|
|
}
|
2004-07-18 23:12:31 -04:00
|
|
|
if (cur2->xmlChildrenNode != NULL) {
|
2007-02-24 18:26:16 -05:00
|
|
|
int tmp;
|
|
|
|
|
|
|
|
ls_xmlContentPtr = (char *)xmlNodeListGetString(doc, cur2->xmlChildrenNode, 1);
|
|
|
|
tmp = atoi(ls_xmlContentPtr);
|
|
|
|
ezConfig.reencode = (tmp == 0) ? 0 : 1;
|
2004-07-18 23:12:31 -04:00
|
|
|
xmlFree(ls_xmlContentPtr);
|
2007-02-24 18:26:16 -05:00
|
|
|
enable_set = 1;
|
2004-07-18 23:12:31 -04:00
|
|
|
}
|
|
|
|
}
|
2007-02-24 18:26:16 -05:00
|
|
|
if (!xmlStrcmp(cur2->name, BAD_CAST "encdec")) {
|
|
|
|
xmlNodePtr cur3;
|
|
|
|
FORMAT_ENCDEC *pformatEncDec;
|
|
|
|
char *p;
|
|
|
|
|
|
|
|
pformatEncDec = xcalloc(1, sizeof(FORMAT_ENCDEC));
|
|
|
|
|
2004-07-18 23:12:31 -04:00
|
|
|
cur3 = cur2->xmlChildrenNode;
|
|
|
|
while (cur3 != NULL) {
|
2007-02-24 18:26:16 -05:00
|
|
|
if (!xmlStrcmp(cur3->name, BAD_CAST "format")) {
|
|
|
|
if (pformatEncDec->format != NULL) {
|
|
|
|
printf("%s[%ld]: Error: Cannot have multiple <format> elements.\n",
|
|
|
|
fileName, xmlGetLineNo(cur3));
|
|
|
|
goto config_error;
|
|
|
|
}
|
2004-07-18 23:12:31 -04:00
|
|
|
if (cur3->xmlChildrenNode != NULL) {
|
2007-02-24 18:26:16 -05:00
|
|
|
char *p;
|
|
|
|
|
|
|
|
ls_xmlContentPtr = (char *)xmlNodeListGetString(doc, cur3->xmlChildrenNode, 1);
|
|
|
|
pformatEncDec->format = xstrdup(ls_xmlContentPtr);
|
2004-07-18 23:12:31 -04:00
|
|
|
xmlFree(ls_xmlContentPtr);
|
2007-02-24 18:26:16 -05:00
|
|
|
for (p = pformatEncDec->format; *p != '\0'; p++)
|
|
|
|
*p = toupper((int)*p);
|
2004-07-18 23:12:31 -04:00
|
|
|
}
|
|
|
|
}
|
2007-02-24 18:26:16 -05:00
|
|
|
if (!xmlStrcmp(cur3->name, BAD_CAST "match")) {
|
|
|
|
if (pformatEncDec->match != NULL) {
|
|
|
|
printf("%s[%ld]: Error: Cannot have multiple <match> elements.\n",
|
|
|
|
fileName, xmlGetLineNo(cur3));
|
|
|
|
goto config_error;
|
|
|
|
}
|
2004-07-18 23:12:31 -04:00
|
|
|
if (cur3->xmlChildrenNode != NULL) {
|
2007-02-24 18:26:16 -05:00
|
|
|
char *p;
|
|
|
|
|
|
|
|
ls_xmlContentPtr = (char *)xmlNodeListGetString(doc, cur3->xmlChildrenNode, 1);
|
|
|
|
pformatEncDec->match = xstrdup(ls_xmlContentPtr);
|
2004-07-18 23:12:31 -04:00
|
|
|
xmlFree(ls_xmlContentPtr);
|
2007-02-24 18:26:16 -05:00
|
|
|
for (p = pformatEncDec->match; *p != '\0'; p++)
|
|
|
|
*p = tolower((int)*p);
|
2004-07-18 23:12:31 -04:00
|
|
|
}
|
|
|
|
}
|
2007-02-24 18:26:16 -05:00
|
|
|
if (!xmlStrcmp(cur3->name, BAD_CAST "decode")) {
|
|
|
|
if (pformatEncDec->decoder != NULL) {
|
|
|
|
printf("%s[%ld]: Error: Cannot have multiple <decode> elements.\n",
|
|
|
|
fileName, xmlGetLineNo(cur3));
|
|
|
|
goto config_error;
|
|
|
|
}
|
2004-07-18 23:12:31 -04:00
|
|
|
if (cur3->xmlChildrenNode != NULL) {
|
2007-02-24 18:26:16 -05:00
|
|
|
ls_xmlContentPtr = (char *)xmlNodeListGetString(doc, cur3->xmlChildrenNode, 1);
|
|
|
|
pformatEncDec->decoder = xstrdup(ls_xmlContentPtr);
|
2004-07-18 23:12:31 -04:00
|
|
|
xmlFree(ls_xmlContentPtr);
|
2007-02-24 18:26:16 -05:00
|
|
|
if ((p = strstr(pformatEncDec->decoder, TRACK_PLACEHOLDER)) != NULL) {
|
|
|
|
p += strlen(TRACK_PLACEHOLDER);
|
|
|
|
if ((p = strstr(p, TRACK_PLACEHOLDER)) != NULL) {
|
|
|
|
printf("%s[%ld]: Error: Multiple `%s' placeholders in decoder command\n",
|
|
|
|
fileName, xmlGetLineNo(cur3), TRACK_PLACEHOLDER);
|
|
|
|
goto config_error;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if ((p = strstr(pformatEncDec->decoder, METADATA_PLACEHOLDER)) != NULL) {
|
|
|
|
p += strlen(METADATA_PLACEHOLDER);
|
|
|
|
if ((p = strstr(p, METADATA_PLACEHOLDER)) != NULL) {
|
|
|
|
printf("%s[%ld]: Error: Multiple `%s' placeholders in decoder command\n",
|
|
|
|
fileName, xmlGetLineNo(cur3), METADATA_PLACEHOLDER);
|
|
|
|
goto config_error;
|
|
|
|
}
|
|
|
|
}
|
2004-07-18 23:12:31 -04:00
|
|
|
}
|
|
|
|
}
|
2007-02-24 18:26:16 -05:00
|
|
|
if (!xmlStrcmp(cur3->name, BAD_CAST "encode")) {
|
|
|
|
if (pformatEncDec->encoder != NULL) {
|
|
|
|
printf("%s[%ld]: Error: Cannot have multiple <encode> elements.\n",
|
|
|
|
fileName, xmlGetLineNo(cur3));
|
|
|
|
goto config_error;
|
|
|
|
}
|
2004-07-18 23:12:31 -04:00
|
|
|
if (cur3->xmlChildrenNode != NULL) {
|
2007-02-24 18:26:16 -05:00
|
|
|
ls_xmlContentPtr = (char *)xmlNodeListGetString(doc, cur3->xmlChildrenNode, 1);
|
|
|
|
pformatEncDec->encoder = xstrdup(ls_xmlContentPtr);
|
2004-07-18 23:12:31 -04:00
|
|
|
xmlFree(ls_xmlContentPtr);
|
2007-02-24 18:26:16 -05:00
|
|
|
if ((p = strstr(pformatEncDec->encoder, TRACK_PLACEHOLDER)) != NULL) {
|
|
|
|
printf("%s[%ld]: Error: `%s' placeholder not allowed in encoder command\n",
|
|
|
|
fileName, xmlGetLineNo(cur3), TRACK_PLACEHOLDER);
|
|
|
|
goto config_error;
|
|
|
|
}
|
|
|
|
if ((p = strstr(pformatEncDec->encoder, METADATA_PLACEHOLDER)) != NULL) {
|
|
|
|
p += strlen(METADATA_PLACEHOLDER);
|
|
|
|
if ((p = strstr(p, METADATA_PLACEHOLDER)) != NULL) {
|
|
|
|
printf("%s[%ld]: Error: Multiple `%s' placeholders in encoder command\n",
|
|
|
|
fileName, xmlGetLineNo(cur3), METADATA_PLACEHOLDER);
|
|
|
|
goto config_error;
|
|
|
|
}
|
|
|
|
}
|
2004-07-18 23:12:31 -04:00
|
|
|
}
|
|
|
|
}
|
|
|
|
cur3 = cur3->next;
|
|
|
|
}
|
|
|
|
ezConfig.encoderDecoders[ezConfig.numEncoderDecoders] = pformatEncDec;
|
|
|
|
ezConfig.numEncoderDecoders++;
|
|
|
|
}
|
|
|
|
cur2 = cur2->next;
|
|
|
|
}
|
|
|
|
}
|
2004-01-30 12:19:45 -05:00
|
|
|
cur = cur->next;
|
|
|
|
}
|
2007-02-24 18:26:16 -05:00
|
|
|
|
|
|
|
xmlFreeDoc(doc);
|
2004-01-30 12:19:45 -05:00
|
|
|
return(1);
|
2007-02-24 18:26:16 -05:00
|
|
|
|
|
|
|
config_error:
|
|
|
|
|
|
|
|
xmlFreeDoc(doc);
|
|
|
|
freeConfig(&ezConfig);
|
|
|
|
return (0);
|
2004-01-30 12:19:45 -05:00
|
|
|
}
|