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); | JackArgParser parser(load_init); | ||||
if (parser.GetArgc() > 0) { | 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"); | 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 | int | ||||
jack_parse_internal_client_params(jack_driver_desc_t* desc, int argc, char* argv[], JSList** param_ptr) | 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; | return 0; | ||||
} | } | ||||
@@ -456,6 +456,7 @@ fail: | |||||
switch ( param->character ) | switch ( param->character ) | ||||
{ | { | ||||
case 'a' : | case 'a' : | ||||
jack_info ( "ip : %s", param->value.str ); | |||||
fMulticastIP = strdup ( param->value.str ); | fMulticastIP = strdup ( param->value.str ); | ||||
break; | break; | ||||
case 'p': | case 'p': | ||||
@@ -481,8 +482,9 @@ fail: | |||||
void* JackNetMasterManager::NetManagerThread ( void* arg ) | void* JackNetMasterManager::NetManagerThread ( void* arg ) | ||||
{ | { | ||||
jack_info ( "Starting Jack Network Manager." ); | |||||
JackNetMasterManager* master_manager = static_cast<JackNetMasterManager*> ( arg ); | 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(); | master_manager->Run(); | ||||
return NULL; | return NULL; | ||||
} | } | ||||
@@ -691,7 +693,7 @@ extern "C" | |||||
if ( parser.GetArgc() > 0) | 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" ); | jack_error ( "Internal client jack_parse_driver_params error" ); | ||||
} | } | ||||
@@ -204,79 +204,88 @@ namespace Jack { | |||||
new_name[i] = '\0'; | 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 empty string | ||||
if (strlen(arg)==0) { | |||||
if ( strlen(arg) == 0 ) { | |||||
fArgv = NULL; | fArgv = NULL; | ||||
return; | return; | ||||
} | } | ||||
//else parse the arg string | //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; | vector<string> args; | ||||
//we need a 'space terminated' string | //we need a 'space terminated' string | ||||
fArgString+=" "; | |||||
fArgString += " "; | |||||
//first fill a vector with args | //first fill a vector with args | ||||
do { | do { | ||||
//find the first non-space character from the actual position | //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 | //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 | //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 double quote | ||||
if (fArgString.at(pos)=='\"') { | |||||
if ( fArgString.at(pos) == '\"' ) { | |||||
//first character : copy the substring | //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 there is someting before the quote, first copy that | ||||
else { | else { | ||||
copy_start=start; | |||||
copy_length=pos-copy_start; | |||||
start=pos; | |||||
copy_start = start; | |||||
copy_length = pos - copy_start; | |||||
start = pos; | |||||
} | } | ||||
} | } | ||||
//if space | //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 | //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 | //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 '-') | //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++; | fArgc++; | ||||
} | } | ||||
JackArgParser::~JackArgParser() { | JackArgParser::~JackArgParser() { | ||||
for (int i=0; i<fNumArgv; i++) | |||||
for ( int i = 0; i < fNumArgv; i++ ) | |||||
delete[] fArgv[i]; | delete[] fArgv[i]; | ||||
delete[] fArgv; | delete[] fArgv; | ||||
} | } | ||||
@@ -296,5 +305,12 @@ namespace Jack { | |||||
const char** JackArgParser::GetArgv() { | const char** JackArgParser::GetArgv() { | ||||
return const_cast<const char**>(fArgv); | 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 <string> | ||||
#include <algorithm> | #include <algorithm> | ||||
#include <vector> | #include <vector> | ||||
#include "jslist.h" | |||||
#include "driver_interface.h" | |||||
#include "JackExports.h" | #include "JackExports.h" | ||||
@@ -63,6 +65,7 @@ class EXPORT JackArgParser | |||||
int fNumArgv; | int fNumArgv; | ||||
int fArgc; | int fArgc; | ||||
char** fArgv; | char** fArgv; | ||||
public: | public: | ||||
JackArgParser(const char* arg); | JackArgParser(const char* arg); | ||||
~JackArgParser(); | ~JackArgParser(); | ||||
@@ -70,6 +73,7 @@ class EXPORT JackArgParser | |||||
int GetNumArgv(); | int GetNumArgv(); | ||||
int GetArgc(); | int GetArgc(); | ||||
const char** GetArgv(); | const char** GetArgv(); | ||||
int ParseParams ( jack_driver_desc_t* desc, JSList** param_list ); | |||||
}; | }; | ||||
} | } | ||||