git-svn-id: http://subversion.jackaudio.org/jack/jack2/trunk/jackmp@2685 0c269be4-1314-0410-8aa9-9f06e86f4224tags/1.90
@@ -157,7 +157,7 @@ using namespace Jack; | |||
JackArgParser parser(load_init); | |||
if (parser.GetArgc() > 0) { | |||
if (jack_parse_driver_params(desc, parser.GetArgc(), (char**)parser.GetArgv(), ¶ms) != 0) | |||
if (jack_parse_internal_client_params(desc, parser.GetNumArgv(), (char**)parser.GetArgv(), ¶ms) != 0) | |||
jack_error("Internal client jack_parse_driver_params error"); | |||
} | |||
@@ -373,6 +373,73 @@ jackctl_parse_driver_params (jackctl_driver *driver_ptr, int argc, char* argv[]) | |||
int | |||
jack_parse_internal_client_params(jack_driver_desc_t* desc, int argc, char* argv[], JSList** param_ptr) | |||
{ | |||
char* options_list; | |||
unsigned long i = 0; | |||
unsigned int param = 0; | |||
unsigned int param_id = 0; | |||
JSList* params = NULL; | |||
jack_driver_param_t* intclient_param; | |||
options_list = (char*) calloc ( desc->nparams + 1, sizeof ( char ) ); | |||
for ( i = 0; i < desc->nparams; i++ ) | |||
sprintf ( ( options_list + i ), "%c", desc->params[i].character ); | |||
for ( param = 0; param < argc; param++ ) | |||
{ | |||
if ( argv[param][0] == '-' ) | |||
{ | |||
//valid option | |||
if ( strchr ( options_list, argv[param][1] ) != NULL ) | |||
{ | |||
//associated parameter | |||
for ( param_id = 0; param_id < desc->nparams; param_id++ ) | |||
if ( argv[param][1] == options_list[param_id] ) | |||
break; | |||
//allocate parameter | |||
intclient_param = (jack_driver_param_t*) calloc ( 1, sizeof ( jack_driver_param_t ) ); | |||
intclient_param->character = desc->params[param_id].character; | |||
switch ( desc->params[param_id].type ) | |||
{ | |||
case JackDriverParamInt: | |||
intclient_param->value.i = atoi ( argv[param + 1] ); | |||
break; | |||
case JackDriverParamUInt: | |||
intclient_param->value.ui = strtoul ( argv[param + 1], NULL, 10 ); | |||
break; | |||
case JackDriverParamChar: | |||
intclient_param->value.c = argv[param + 1][0]; | |||
break; | |||
case JackDriverParamString: | |||
strncpy ( intclient_param->value.str, argv[param + 1], JACK_DRIVER_PARAM_STRING_MAX ); | |||
break; | |||
case JackDriverParamBool: | |||
if ( ( strcmp ( "false", argv[param + 1] ) == 0 ) || | |||
( strcmp ( "off", argv[param + 1] ) == 0 ) || | |||
( strcmp ( "no", argv[param + 1] ) == 0 ) || | |||
( strcmp ( "0", argv[param + 1] ) == 0 ) || | |||
( strcmp ( "(null)", argv[param + 1] ) == 0 ) ) | |||
intclient_param->value.i = false; | |||
else | |||
intclient_param->value.i = true; | |||
break; | |||
} | |||
//add to the list | |||
params = jack_slist_append ( params, intclient_param ); | |||
} | |||
//invalid option | |||
else | |||
fprintf ( stderr, "Invalid option '%c'\n", argv[param][1] ); | |||
} | |||
} | |||
free ( options_list ); | |||
if ( param_ptr ) | |||
*param_ptr = params; | |||
return 0; | |||
} | |||
@@ -456,6 +456,7 @@ fail: | |||
switch ( param->character ) | |||
{ | |||
case 'a' : | |||
jack_info ( "ip : %s", param->value.str ); | |||
fMulticastIP = strdup ( param->value.str ); | |||
break; | |||
case 'p': | |||
@@ -481,8 +482,9 @@ fail: | |||
void* JackNetMasterManager::NetManagerThread ( void* arg ) | |||
{ | |||
jack_info ( "Starting Jack Network Manager." ); | |||
JackNetMasterManager* master_manager = static_cast<JackNetMasterManager*> ( arg ); | |||
jack_info ( "Starting Jack Network Manager." ); | |||
jack_info ( "Listening on '%s:%d'", master_manager->fMulticastIP, master_manager->fSocket.GetPort() ); | |||
master_manager->Run(); | |||
return NULL; | |||
} | |||
@@ -691,7 +693,7 @@ extern "C" | |||
if ( parser.GetArgc() > 0) | |||
{ | |||
if ( jack_parse_internal_client_params ( desc, parser.GetArgc(), (char**)parser.GetArgv(), ¶ms) != 0 ) | |||
if ( jack_parse_internal_client_params ( desc, parser.GetNumArgv(), (char**)parser.GetArgv(), ¶ms) != 0 ) | |||
jack_error ( "Internal client jack_parse_driver_params error" ); | |||
} | |||
@@ -204,79 +204,88 @@ namespace Jack { | |||
new_name[i] = '\0'; | |||
} | |||
JackArgParser::JackArgParser(const char* arg) { | |||
jack_log ( "JackArgParser::JackArgParser, arg : '%s'", arg ); | |||
JackArgParser::JackArgParser ( const char* arg ) { | |||
jack_log ( "JackArgParser::JackArgParser, arg_string : '%s'", arg ); | |||
fArgc=0; | |||
fNumArgv=0; | |||
fArgString=string(arg); | |||
fArgc = 0; | |||
fNumArgv = 0; | |||
fArgString = string(arg); | |||
//if empty string | |||
if (strlen(arg)==0) { | |||
if ( strlen(arg) == 0 ) { | |||
fArgv = NULL; | |||
return; | |||
} | |||
//else parse the arg string | |||
const size_t arg_len=fArgString.length(); | |||
int i=0; | |||
size_t pos=0; | |||
size_t start=0; | |||
size_t copy_start=0; | |||
size_t copy_length=0; | |||
const size_t arg_len = fArgString.length(); | |||
int i = 0; | |||
size_t pos = 0; | |||
size_t start = 0; | |||
size_t copy_start = 0; | |||
size_t copy_length = 0; | |||
vector<string> args; | |||
//we need a 'space terminated' string | |||
fArgString+=" "; | |||
fArgString += " "; | |||
//first fill a vector with args | |||
do { | |||
//find the first non-space character from the actual position | |||
start=fArgString.find_first_not_of(' ',start); | |||
start = fArgString.find_first_not_of ( ' ', start ); | |||
//get the next quote or space position | |||
pos=fArgString.find_first_of(" \"",start); | |||
pos = fArgString.find_first_of ( " \"" , start ); | |||
//no more quotes or spaces, consider the end of the string | |||
if (pos==string::npos) | |||
pos=arg_len; | |||
if ( pos == string::npos ) | |||
pos = arg_len; | |||
//if double quote | |||
if (fArgString.at(pos)=='\"') { | |||
if ( fArgString.at(pos) == '\"' ) { | |||
//first character : copy the substring | |||
if (pos==start) { | |||
copy_start=start+1; | |||
pos=fArgString.find('\"',++pos); | |||
copy_length=pos-copy_start; | |||
start=pos+1; | |||
if ( pos == start ) { | |||
copy_start = start + 1; | |||
pos = fArgString.find ( '\"', ++pos ); | |||
copy_length = pos - copy_start; | |||
start = pos + 1; | |||
} | |||
//else there is someting before the quote, first copy that | |||
else { | |||
copy_start=start; | |||
copy_length=pos-copy_start; | |||
start=pos; | |||
copy_start = start; | |||
copy_length = pos - copy_start; | |||
start = pos; | |||
} | |||
} | |||
//if space | |||
if (fArgString.at(pos)==' ') { | |||
copy_start=start; | |||
copy_length=pos-copy_start; | |||
start=pos+1; | |||
if ( fArgString.at(pos) == ' ' ) { | |||
//short option descriptor | |||
if ( ( fArgString.at(start) == '-' ) && ( fArgString.at(start + 1) != '-' ) ) { | |||
copy_start = start; | |||
copy_length = 2; | |||
start += copy_length; | |||
} | |||
else { | |||
copy_start = start; | |||
copy_length = pos - copy_start; | |||
start = pos + 1; | |||
} | |||
} | |||
//then push the substring to the args vector | |||
args.push_back(fArgString.substr(copy_start,copy_length)); | |||
} while(start<arg_len); | |||
args.push_back ( fArgString.substr ( copy_start,copy_length ) ); | |||
} while ( start < arg_len ); | |||
//and then duplicate args into the argv array | |||
fNumArgv=args.size(); | |||
fArgv=new char* [fNumArgv]; | |||
for (i=0; i<fNumArgv; i++) { | |||
fArgv[i]=new char[args[i].length()]; | |||
fill_n(fArgv[i],args[i].length()+1,0); | |||
args[i].copy(fArgv[i],args[i].length()); | |||
fNumArgv = args.size(); | |||
fArgv = new char* [fNumArgv]; | |||
for ( i = 0; i < fNumArgv; i++ ) { | |||
fArgv[i] = new char[args[i].length()]; | |||
fill_n ( fArgv[i],args[i].length() + 1, 0 ); | |||
args[i].copy ( fArgv[i], args[i].length() ); | |||
jack_log ( "JackArgParser::JackArgParser, adding : '%s'", fArgv[i] ); | |||
} | |||
//finally count the 'real' options (the ones starting with a '-') | |||
for (i=0; i<fNumArgv; i++) | |||
if (fArgv[i][0]=='-') | |||
for ( i = 0; i < fNumArgv; i++ ) | |||
if ( fArgv[i][0] == '-' ) | |||
fArgc++; | |||
} | |||
JackArgParser::~JackArgParser() { | |||
for (int i=0; i<fNumArgv; i++) | |||
for ( int i = 0; i < fNumArgv; i++ ) | |||
delete[] fArgv[i]; | |||
delete[] fArgv; | |||
} | |||
@@ -296,5 +305,12 @@ namespace Jack { | |||
const char** JackArgParser::GetArgv() { | |||
return const_cast<const char**>(fArgv); | |||
} | |||
int JackArgParser::ParseParams ( jack_driver_desc_t* desc, JSList** param_list ) | |||
{ | |||
//TODO : fill the param_list | |||
return 0; | |||
} | |||
} | |||
@@ -35,6 +35,8 @@ | |||
#include <string> | |||
#include <algorithm> | |||
#include <vector> | |||
#include "jslist.h" | |||
#include "driver_interface.h" | |||
#include "JackExports.h" | |||
@@ -63,6 +65,7 @@ class EXPORT JackArgParser | |||
int fNumArgv; | |||
int fArgc; | |||
char** fArgv; | |||
public: | |||
JackArgParser(const char* arg); | |||
~JackArgParser(); | |||
@@ -70,6 +73,7 @@ class EXPORT JackArgParser | |||
int GetNumArgv(); | |||
int GetArgc(); | |||
const char** GetArgv(); | |||
int ParseParams ( jack_driver_desc_t* desc, JSList** param_list ); | |||
}; | |||
} | |||