Browse Source

save uuid, reservations code, and --renames option

tags/0.120.1
Torben Hohn 16 years ago
parent
commit
2d65cb5384
3 changed files with 65 additions and 14 deletions
  1. +29
    -9
      python/libjack.py
  2. +17
    -5
      python/sessionmanager.py
  3. +19
    -0
      python/state.py

+ 29
- 9
python/libjack.py View File

@@ -53,6 +53,10 @@ rename_client = libjack.jack_rename_client
rename_client.argtypes = [ client_p, c_char_p, c_char_p ]
rename_client.restype = c_int

reserve_client_name = libjack.jack_reserve_client_name
reserve_client_name.argtypes = [ client_p, c_char_p, c_char_p ]
reserve_client_name.restype = c_int

class jack_session_command_t( Structure ):
_fields_ = [ ("uuid", 16*c_char ), ("clientname", 33*c_char), ("command", 256*c_char ) ]

@@ -163,6 +167,7 @@ class Client( object ):
self.ports = []
self.commandline = None
self.isinfra = False
self.uuid = None

def get_commandline( self ):
if self.commandline:
@@ -173,6 +178,12 @@ class Client( object ):
def set_commandline( self, cmdline ):
self.commandline = cmdline

def get_uuid( self ):
return self.uuid

def set_uuid( self, uuid ):
self.uuid = uuid

def add_port( self, portname ):
self.ports.append( Port( self.client, portname ) )

@@ -199,6 +210,7 @@ class JackGraph( object ):
def __init__( self, client, ports, uuids=[] ):
self.client = client
self.clients = {}
self.reserved_names = []

i=0
while(ports[i]):
@@ -226,23 +238,23 @@ class JackGraph( object ):
return

oldname = client.name
cname_split = client.name.split('-')
newname = self.get_free_name( client.name )

client.rename( newname )
del self.clients[oldname]
self.clients[newname] = client

def get_free_name( self, oldname, other_names=[] ):
cname_split = oldname.split('-')
if len(cname_split) == 1:
cname_prefix = cname_split[0]
else:
cname_prefix = string.join( cname_split[:-1], '-' )

num = 1
while ("%s-%d"%(cname_prefix,num)) in (self.clients.keys()+self.reserved_names):
while ("%s-%d"%(cname_prefix,num)) in (self.clients.keys()+self.reserved_names+other_names):
num+=1

# XXX: this might still fail due to race.
# also needs to lock
newname = "%s-%d"%(cname_prefix,num )

client.rename( newname )
del self.clients[oldname]
self.clients[newname] = client


def remove_client( self, name ):
@@ -261,6 +273,14 @@ class JackGraph( object ):
for c in self.clients.values():
self.check_client_name( c )

def get_taken_names( self ):
return self.clients.keys() + self.reserved_names

def reserve_name( self, uuid, name ):
if reserve_client_name( self.client, name, uuid ):
raise Exception( "reservation failure" )
self.reserved_names.append( name )


class NotifyReply(object):
def __init__( self, uuid, clientname, commandline ):


+ 17
- 5
python/sessionmanager.py View File

@@ -59,12 +59,21 @@ class SessionManager( object ):

print sd.get_client_names()

g.ensure_clientnames( sd.get_reg_client_names() )
if opt.renames:
g.ensure_clientnames( sd.get_reg_client_names() )
# get graph again... renaming isnt prefect yet.
g=self.cl.get_graph()

# get graph again... renaming isnt prefect yet.
g=self.cl.get_graph()
# build up list of port connections
# fixup names, doing this unconditionally, because
# a client rename might have failed.
sd.fixup_client_names( g )

# now we have mangled all the names, lets reserve them.
for (uuid, clientname) in sd.get_uuid_client_pairs():
print "reserving name %s"%clientname
g.reserve_name( uuid, clientname )

# build up list of port connections
conns = []
for p in sd.get_port_names():
for c in sd.get_connections_for_port( p ):
@@ -113,7 +122,7 @@ class SessionManager( object ):

def save_session( self, name ):
if os.path.exists( self.sessiondir+name ):
print "session %s already exists"
print "session %s already exists"%name
return -1
os.mkdir( self.sessiondir+name )
g=self.cl.get_graph()
@@ -122,6 +131,7 @@ class SessionManager( object ):
for n in notify:
c = g.get_client( n.clientname )
c.set_commandline( n.commandline )
c.set_uuid( n.uuid )

sd = state.SessionDom()

@@ -196,6 +206,8 @@ oparser.add_option( "--quitdaemon", action="store_true", dest="quitdaemon", defa
# help="SaveAs And Quit" )
oparser.add_option( "--load", action="store", dest="load", type="string",
help="Load Session with <name>" )
oparser.add_option( "--renames", action="store_true", dest="renames", default=False,
help="Allow renaming offending clients" )

(opt,args) = oparser.parse_args()



+ 19
- 0
python/state.py View File

@@ -14,6 +14,8 @@ class SessionDom( object ):
cl_elem = Element( "jackclient" )
cl_elem.setAttribute( "cmdline", client.get_commandline() )
cl_elem.setAttribute( "jackname", client.name )
if client.get_uuid():
cl_elem.setAttribute( "uuid", client.get_uuid() )
if client.isinfra:
cl_elem.setAttribute( "infra", "True" )
else:
@@ -84,6 +86,23 @@ class SessionDom( object ):
if c.getAttribute( "jackname" ) == name:
return c.getAttribute( "cmdline" )

def get_uuid_client_pairs( self ):
retval = []
doc = self.dom.documentElement
for c in doc.getElementsByTagName( "jackclient" ):
if c.getAttribute( "infra" ) != "True":
retval.append( (c.getAttribute( "uuid" ), c.getAttribute( "jackname" )) )

return retval

def fixup_client_names( self, graph ):
doc = self.dom.documentElement
for c in doc.getElementsByTagName( "jackclient" ):
cname = c.getAttribute( "jackname" )
if cname in graph.get_taken_names():
c.setAttribute( "jackname", graph.get_free_name( cname, self.get_reg_client_names() ) )




Loading…
Cancel
Save