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