Browse Source

Fix client status bug that lead to code never executed and a GUI attached later to a headless nsmd never receiving client information and session name

tags/v1.4.0
Nils 4 years ago
parent
commit
ec40e6d67b
1 changed files with 42 additions and 20 deletions
  1. +42
    -20
      src/nsmd.cpp

+ 42
- 20
src/nsmd.cpp View File

@@ -252,8 +252,8 @@ public:
executable_path = 0;
pre_existing = false;
launch_error = 0;
dirty = NULL;
status = NULL;
dirty = 0;
status = 0;
name_with_id = 0;

}
@@ -271,7 +271,6 @@ public:
if (name_with_id)
free(name_with_id);


name = executable_path = client_id = capabilities = name_with_id = NULL;
}
};
@@ -353,17 +352,20 @@ handle_client_process_death ( int pid )
//Decide if the client terminated or if removed from the session
if ( c->pending_command() == COMMAND_QUIT )
{

c->status = "removed";
if ( gui_is_active )
osc_server->send( gui_addr, "/nsm/gui/client/status", c->client_id, c->status = "removed" );
osc_server->send( gui_addr, "/nsm/gui/client/status", c->client_id, c->status );

client.remove(c); //This will not remove the clients save data
delete c;
}
else
{
c->status = "stopped";
if ( gui_is_active )
{
osc_server->send( gui_addr, "/nsm/gui/client/status", c->client_id, c->status = "stopped" );
osc_server->send( gui_addr, "/nsm/gui/client/status", c->client_id, c->status );
if ( c->launch_error )
{
/* NSM API treats the stopped status as switch. You can only remove stopped.
@@ -732,13 +734,14 @@ launch ( const char *executable, const char *client_id )

MESSAGE( "Process %s has pid: %i", executable, pid ); //We do not have a name yet, use executable

c->status = "launch";
if ( gui_is_active )
{
//At this point we do not know if launched program will start or fail
//And we do not know if it has nsm-support or not. This will be decided if it announces.
osc_server->send( gui_addr, "/nsm/gui/client/new", c->client_id, c->name );
osc_server->send( gui_addr, "/nsm/gui/client/label", c->client_id, "" ); //clear label from potential previous-and-fixed launch error
osc_server->send( gui_addr, "/nsm/gui/client/status", c->client_id, c->status = "launch" );
osc_server->send( gui_addr, "/nsm/gui/client/status", c->client_id, c->status );
}

return true;
@@ -754,14 +757,16 @@ command_client_to_save ( Client *c )

c->pending_command( COMMAND_SAVE );

c->status = "save";
if ( gui_is_active )
osc_server->send( gui_addr, "/nsm/gui/client/status", c->client_id, c->status = "save" );
osc_server->send( gui_addr, "/nsm/gui/client/status", c->client_id, c->status );
}
else if ( c->is_dumb_client() && c->pid )
{
// this is a dumb client...
c->status = "noop";
if ( gui_is_active )
osc_server->send( gui_addr, "/nsm/gui/client/status", c->client_id, c->status = "noop" );
osc_server->send( gui_addr, "/nsm/gui/client/status", c->client_id, c->status );
}
}

@@ -785,9 +790,10 @@ void command_client_to_switch ( Client *c, const char *new_client_id )

c->pending_command( COMMAND_OPEN );

c->status = "switch";
if ( gui_is_active )
{
osc_server->send( gui_addr, "/nsm/gui/client/status", c->client_id, c->status = "switch" );
osc_server->send( gui_addr, "/nsm/gui/client/status", c->client_id, c->status );
osc_server->send( gui_addr, "/nsm/gui/client/switch", old_client_id, c->client_id );
}

@@ -803,8 +809,9 @@ purge_inactive_clients ( )
{
if ( ! (*i)->active )
{
(*i)->status = "removed";
if ( gui_is_active )
osc_server->send( gui_addr, "/nsm/gui/client/status", (*i)->client_id, (*i)->status = "removed" );
osc_server->send( gui_addr, "/nsm/gui/client/status", (*i)->client_id, (*i)->status );

delete *i;

@@ -968,10 +975,11 @@ OSC_HANDLER( announce )
APP_TITLE,
":server-control:broadcast:optional-gui:" );

c->status = "open";
if ( gui_is_active )
{
osc_server->send( gui_addr, "/nsm/gui/client/new", c->client_id, c->name );
osc_server->send( gui_addr, "/nsm/gui/client/status", c->client_id, c->status = "open" );
osc_server->send( gui_addr, "/nsm/gui/client/status", c->client_id, c->status );

if ( c->is_capable_of( ":optional-gui:" ) )
osc_server->send( gui_addr, "/nsm/gui/client/has_optional_gui", c->client_id );
@@ -1169,8 +1177,9 @@ command_client_to_stop ( Client *c )

kill( c->pid, SIGTERM );

c->status = "stopped";
if ( gui_is_active )
osc_server->send( gui_addr, "/nsm/gui/client/status", c->client_id, c->status = "stopped" );
osc_server->send( gui_addr, "/nsm/gui/client/status", c->client_id, c->status );
}
}

@@ -1185,15 +1194,17 @@ command_client_to_quit ( Client *c )

kill( c->pid, SIGTERM );

c->status = "quit";
if ( gui_is_active )
osc_server->send( gui_addr, "/nsm/gui/client/status", c->client_id, c->status = "quit" );
osc_server->send( gui_addr, "/nsm/gui/client/status", c->client_id, c->status );
}
else if ( c->is_dumb_client() )
{
if ( c->pid > 0 )
{
c->status = "quit";
if ( gui_is_active )
osc_server->send( gui_addr, "/nsm/gui/client/status", c->client_id, c->status = "quit" );
osc_server->send( gui_addr, "/nsm/gui/client/status", c->client_id, c->status );

/* should be kill? */
c->pending_command( COMMAND_QUIT );
@@ -1203,8 +1214,9 @@ command_client_to_quit ( Client *c )
}
else
{
c->status = "removed";
if ( gui_is_active )
osc_server->send( gui_addr, "/nsm/gui/client/status", c->client_id, c->status = "removed" );
osc_server->send( gui_addr, "/nsm/gui/client/status", c->client_id, c->status );
}
}
}
@@ -1432,7 +1444,8 @@ load_session_file ( const char * path )
new_clients.clear();

if ( gui_is_active )
{
{ //This is not the case when --load-session was used. GUI announce will come later.

//Send two parameters to signal that the session was loaded. First is the direct session name,
//second is the full filepath.
//See function announce_gui for a full description where /nsm/gui/session/name is also send from
@@ -2081,8 +2094,9 @@ OSC_HANDLER( error )
MESSAGE( "Client \"%s\" replied with error: %s (%i) in %fms", c->name_with_id, message, err_code, c->milliseconds_since_last_command() );
c->pending_command( COMMAND_NONE );

c->status = "error";
if ( gui_is_active )
osc_server->send( gui_addr, "/nsm/gui/client/status", c->client_id, c->status = "error" );
osc_server->send( gui_addr, "/nsm/gui/client/status", c->client_id, c->status );

return 0;
}
@@ -2103,8 +2117,9 @@ OSC_HANDLER( reply )

c->pending_command( COMMAND_NONE );

c->status = "ready";
if ( gui_is_active )
osc_server->send( gui_addr, "/nsm/gui/client/status", c->client_id, c->status = "ready" );
osc_server->send( gui_addr, "/nsm/gui/client/status", c->client_id, c->status );
}
else
MESSAGE( "Reply from unknown client" );
@@ -2149,7 +2164,10 @@ OSC_HANDLER( remove )
if ( c->pid == 0 &&
! c->active )
{
osc_server->send( gui_addr, "/nsm/gui/client/status", c->client_id, c->status = "removed" );

c->status = "removed";
if ( gui_is_active )
osc_server->send( gui_addr, "/nsm/gui/client/status", c->client_id, c->status );

client.remove( c );

@@ -2245,6 +2263,8 @@ announce_gui( const char *url, bool is_reply )
// If a GUI connects to an existing server with a running session this will trigger a list of
// clients send to the new GUI.

MESSAGE ( "A GUI announced to us from the URL %s", url );

gui_addr = lo_address_new_from_url( url );
gui_is_active = true; //global state

@@ -2258,6 +2278,7 @@ announce_gui( const char *url, bool is_reply )
osc_server->send( gui_addr, "/nsm/gui/session/root", session_root );

// Send a list of clients to the newly registered GUI in case there was already a session open
DMESSAGE ( "Informing GUI about %li already running clients", client.size() );
for ( std::list<Client*>::iterator i = client.begin();
i != client.end();
++i )
@@ -2272,9 +2293,10 @@ announce_gui( const char *url, bool is_reply )
//The second parameter is the full file path.
//If both are empty it signals that no session is currently open, which is the default state if
//a GUI started nsmd.
DMESSAGE( "Informing GUI about potentially running session name: %s", session_name );
osc_server->send( gui_addr, "/nsm/gui/session/name", session_name ? session_name : "", session_path ? session_path : "" );

DMESSAGE( "Registered with GUI" );
DMESSAGE( "Registration with GUI complete" );
}




Loading…
Cancel
Save