diff --git a/common/JackAudioAdapter.cpp b/common/JackAudioAdapter.cpp index 732b745a..a39547f6 100644 --- a/common/JackAudioAdapter.cpp +++ b/common/JackAudioAdapter.cpp @@ -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"); } diff --git a/common/JackDriverLoader.cpp b/common/JackDriverLoader.cpp index d47bacc8..48e175c1 100644 --- a/common/JackDriverLoader.cpp +++ b/common/JackDriverLoader.cpp @@ -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; } diff --git a/common/JackNetManager.cpp b/common/JackNetManager.cpp index 6dfbb0b1..8a3ca509 100644 --- a/common/JackNetManager.cpp +++ b/common/JackNetManager.cpp @@ -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 ( 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" ); } diff --git a/common/JackTools.cpp b/common/JackTools.cpp index 5006ebd6..285477ed 100644 --- a/common/JackTools.cpp +++ b/common/JackTools.cpp @@ -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 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(fArgv); } + + int JackArgParser::ParseParams ( jack_driver_desc_t* desc, JSList** param_list ) + { + //TODO : fill the param_list + return 0; + } + } diff --git a/common/JackTools.h b/common/JackTools.h index e90a515e..5f715d3c 100644 --- a/common/JackTools.h +++ b/common/JackTools.h @@ -35,6 +35,8 @@ #include #include #include +#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 ); }; }