| @@ -74,6 +74,7 @@ static char *session_root; | |||||
| #define ERR_BAD_PROJECT -9 | #define ERR_BAD_PROJECT -9 | ||||
| #define ERR_CREATE_FAILED -10 | #define ERR_CREATE_FAILED -10 | ||||
| #define ERR_SESSION_LOCKED -11 | #define ERR_SESSION_LOCKED -11 | ||||
| #define ERR_OPERATION_PENDING -12 | |||||
| #define APP_TITLE "Non Session Manager" | #define APP_TITLE "Non Session Manager" | ||||
| @@ -83,9 +84,15 @@ enum { | |||||
| COMMAND_KILL, | COMMAND_KILL, | ||||
| COMMAND_SAVE, | COMMAND_SAVE, | ||||
| COMMAND_OPEN, | COMMAND_OPEN, | ||||
| COMMAND_START | |||||
| COMMAND_START, | |||||
| COMMAND_CLOSE, | |||||
| COMMAND_DUPLICATE, | |||||
| COMMAND_NEW | |||||
| }; | }; | ||||
| static int pending_operation = COMMAND_NONE; | |||||
| struct Client | struct Client | ||||
| { | { | ||||
| private: | private: | ||||
| @@ -1220,13 +1227,21 @@ load_session_file ( const char * path ) | |||||
| OSC_HANDLER( save ) | OSC_HANDLER( save ) | ||||
| { | { | ||||
| if ( pending_operation != COMMAND_NONE ) | |||||
| { | |||||
| osc_server->send( lo_message_get_source( msg ), "/error", path, | |||||
| ERR_OPERATION_PENDING, | |||||
| "An operation pending." ); | |||||
| return 0; | |||||
| } | |||||
| if ( ! session_path ) | if ( ! session_path ) | ||||
| { | { | ||||
| osc_server->send( lo_message_get_source( msg ), "/error", path, | osc_server->send( lo_message_get_source( msg ), "/error", path, | ||||
| ERR_NO_SESSION_OPEN, | ERR_NO_SESSION_OPEN, | ||||
| "No session to save."); | "No session to save."); | ||||
| return 0; | |||||
| goto done; | |||||
| } | } | ||||
| command_all_clients_to_save(); | command_all_clients_to_save(); | ||||
| @@ -1235,18 +1250,31 @@ OSC_HANDLER( save ) | |||||
| osc_server->send( lo_message_get_source( msg ), "/reply", path, "Saved." ); | osc_server->send( lo_message_get_source( msg ), "/reply", path, "Saved." ); | ||||
| done: | |||||
| pending_operation = COMMAND_NONE; | |||||
| return 0; | return 0; | ||||
| } | } | ||||
| OSC_HANDLER( duplicate ) | OSC_HANDLER( duplicate ) | ||||
| { | { | ||||
| if ( pending_operation != COMMAND_NONE ) | |||||
| { | |||||
| osc_server->send( lo_message_get_source( msg ), "/error", path, | |||||
| ERR_OPERATION_PENDING, | |||||
| "An operation pending." ); | |||||
| return 0; | |||||
| } | |||||
| pending_operation = COMMAND_DUPLICATE; | |||||
| if ( ! session_path ) | if ( ! session_path ) | ||||
| { | { | ||||
| osc_server->send( lo_message_get_source( msg ), "/error", path, | osc_server->send( lo_message_get_source( msg ), "/error", path, | ||||
| ERR_NO_SESSION_OPEN, | ERR_NO_SESSION_OPEN, | ||||
| "No session to duplicate."); | "No session to duplicate."); | ||||
| return 0; | |||||
| goto done; | |||||
| } | } | ||||
| if ( ! path_is_valid( &argv[0]->s ) ) | if ( ! path_is_valid( &argv[0]->s ) ) | ||||
| @@ -1255,7 +1283,7 @@ OSC_HANDLER( duplicate ) | |||||
| ERR_CREATE_FAILED, | ERR_CREATE_FAILED, | ||||
| "Invalid session name." ); | "Invalid session name." ); | ||||
| return 0; | |||||
| goto done; | |||||
| } | } | ||||
| command_all_clients_to_save(); | command_all_clients_to_save(); | ||||
| @@ -1266,7 +1294,7 @@ OSC_HANDLER( duplicate ) | |||||
| ERR_GENERAL_ERROR, | ERR_GENERAL_ERROR, | ||||
| "Some clients could not save" ); | "Some clients could not save" ); | ||||
| return 0; | |||||
| goto done; | |||||
| } | } | ||||
| // save_session_file(); | // save_session_file(); | ||||
| @@ -1307,20 +1335,35 @@ OSC_HANDLER( duplicate ) | |||||
| MESSAGE( "Done" ); | MESSAGE( "Done" ); | ||||
| osc_server->send( lo_message_get_source( msg ), "/reply", path, "Duplicated." ); | osc_server->send( lo_message_get_source( msg ), "/reply", path, "Duplicated." ); | ||||
| done: | |||||
| pending_operation = COMMAND_NONE; | |||||
| return 0; | return 0; | ||||
| } | } | ||||
| OSC_HANDLER( new ) | OSC_HANDLER( new ) | ||||
| { | { | ||||
| if ( pending_operation != COMMAND_NONE ) | |||||
| { | |||||
| osc_server->send( lo_message_get_source( msg ), "/error", path, | |||||
| ERR_OPERATION_PENDING, | |||||
| "An operation pending." ); | |||||
| return 0; | |||||
| } | |||||
| pending_operation = COMMAND_NEW; | |||||
| if ( ! path_is_valid( &argv[0]->s ) ) | if ( ! path_is_valid( &argv[0]->s ) ) | ||||
| { | { | ||||
| osc_server->send( lo_message_get_source( msg ), "/error", path, | osc_server->send( lo_message_get_source( msg ), "/error", path, | ||||
| ERR_CREATE_FAILED, | ERR_CREATE_FAILED, | ||||
| "Invalid session name." ); | "Invalid session name." ); | ||||
| pending_operation = COMMAND_NONE; | |||||
| return 0; | return 0; | ||||
| } | } | ||||
| @@ -1333,7 +1376,6 @@ OSC_HANDLER( new ) | |||||
| MESSAGE( "Creating new session" ); | MESSAGE( "Creating new session" ); | ||||
| char *spath; | char *spath; | ||||
| asprintf( &spath, "%s/%s", session_root, &argv[0]->s ); | asprintf( &spath, "%s/%s", session_root, &argv[0]->s ); | ||||
| @@ -1345,6 +1387,8 @@ OSC_HANDLER( new ) | |||||
| free(spath); | free(spath); | ||||
| pending_operation = COMMAND_NONE; | |||||
| return 0; | return 0; | ||||
| } | } | ||||
| @@ -1366,6 +1410,8 @@ OSC_HANDLER( new ) | |||||
| osc_server->send( lo_message_get_source( msg ), "/reply", path, | osc_server->send( lo_message_get_source( msg ), "/reply", path, | ||||
| "Session created" ); | "Session created" ); | ||||
| pending_operation = COMMAND_NONE; | |||||
| return 0; | return 0; | ||||
| } | } | ||||
| @@ -1419,8 +1465,20 @@ OSC_HANDLER( open ) | |||||
| { | { | ||||
| DMESSAGE( "Got open" ); | DMESSAGE( "Got open" ); | ||||
| if ( pending_operation != COMMAND_NONE ) | |||||
| { | |||||
| osc_server->send( lo_message_get_source( msg ), "/error", path, | |||||
| ERR_OPERATION_PENDING, | |||||
| "An operation pending." ); | |||||
| return 0; | |||||
| } | |||||
| pending_operation = COMMAND_OPEN; | |||||
| if ( session_path ) | if ( session_path ) | ||||
| { | { | ||||
| command_all_clients_to_save(); | command_all_clients_to_save(); | ||||
| if ( clients_have_errors() ) | if ( clients_have_errors() ) | ||||
| @@ -1428,12 +1486,15 @@ OSC_HANDLER( open ) | |||||
| osc_server->send( lo_message_get_source( msg ), "/error", path, | osc_server->send( lo_message_get_source( msg ), "/error", path, | ||||
| ERR_GENERAL_ERROR, | ERR_GENERAL_ERROR, | ||||
| "Some clients could not save" ); | "Some clients could not save" ); | ||||
| pending_operation = COMMAND_NONE; | |||||
| return 0; | return 0; | ||||
| } | } | ||||
| // save_session_file(); | // save_session_file(); | ||||
| } | } | ||||
| char *spath; | char *spath; | ||||
| asprintf( &spath, "%s/%s", session_root, &argv[0]->s ); | asprintf( &spath, "%s/%s", session_root, &argv[0]->s ); | ||||
| @@ -1476,6 +1537,8 @@ OSC_HANDLER( open ) | |||||
| MESSAGE( "Done" ); | MESSAGE( "Done" ); | ||||
| pending_operation = COMMAND_NONE; | |||||
| return 0; | return 0; | ||||
| } | } | ||||
| @@ -1491,13 +1554,24 @@ OSC_HANDLER( quit ) | |||||
| OSC_HANDLER( abort ) | OSC_HANDLER( abort ) | ||||
| { | { | ||||
| if ( pending_operation != COMMAND_NONE ) | |||||
| { | |||||
| osc_server->send( lo_message_get_source( msg ), "/error", path, | |||||
| ERR_OPERATION_PENDING, | |||||
| "An operation pending." ); | |||||
| return 0; | |||||
| } | |||||
| pending_operation = COMMAND_CLOSE; | |||||
| if ( ! session_path ) | if ( ! session_path ) | ||||
| { | { | ||||
| osc_server->send( lo_message_get_source( msg ), "/error", path, | osc_server->send( lo_message_get_source( msg ), "/error", path, | ||||
| ERR_NO_SESSION_OPEN, | ERR_NO_SESSION_OPEN, | ||||
| "No session to abort." ); | "No session to abort." ); | ||||
| return 0; | |||||
| goto done; | |||||
| } | } | ||||
| MESSAGE( "Commanding attached clients to quit." ); | MESSAGE( "Commanding attached clients to quit." ); | ||||
| @@ -1508,19 +1582,32 @@ OSC_HANDLER( abort ) | |||||
| "Aborted." ); | "Aborted." ); | ||||
| MESSAGE( "Done" ); | MESSAGE( "Done" ); | ||||
| done: | |||||
| pending_operation = COMMAND_NONE; | |||||
| return 0; | return 0; | ||||
| } | } | ||||
| OSC_HANDLER( close ) | OSC_HANDLER( close ) | ||||
| { | { | ||||
| if ( pending_operation != COMMAND_NONE ) | |||||
| { | |||||
| osc_server->send( lo_message_get_source( msg ), "/error", path, | |||||
| ERR_OPERATION_PENDING, | |||||
| "An operation pending." ); | |||||
| return 0; | |||||
| } | |||||
| pending_operation = COMMAND_CLOSE; | |||||
| if ( ! session_path ) | if ( ! session_path ) | ||||
| { | { | ||||
| osc_server->send( lo_message_get_source( msg ), "/error", path, | osc_server->send( lo_message_get_source( msg ), "/error", path, | ||||
| ERR_NO_SESSION_OPEN, | ERR_NO_SESSION_OPEN, | ||||
| "No session to close." ); | "No session to close." ); | ||||
| return 0; | |||||
| goto done; | |||||
| } | } | ||||
| command_all_clients_to_save(); | command_all_clients_to_save(); | ||||
| @@ -1534,6 +1621,10 @@ OSC_HANDLER( close ) | |||||
| MESSAGE( "Done" ); | MESSAGE( "Done" ); | ||||
| done: | |||||
| pending_operation = COMMAND_NONE; | |||||
| return 0; | return 0; | ||||
| } | } | ||||