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 ); | |||||
| }; | }; | ||||
| } | } | ||||