gui: project load/unload/save items in the world tree popup menu for rooms
[ladish.git] / ladish_control
blob1173ca3b3d2578e76b00b46b16f55c01d4f5f47c
1 #!/usr/bin/env python
3 # LADI Session Handler (ladish)
5 # Copyright (C) 2008, 2009, 2010 Nedko Arnaudov <nedko@arnaudov.name>
7 #*************************************************************************
8 # This file contains code of the commandline control app
9 #*************************************************************************
11 # LADI Session Handler is free software; you can redistribute it and/or modify
12 # it under the terms of the GNU General Public License as published by
13 # the Free Software Foundation; either version 2 of the License, or
14 # (at your option) any later version.
16 # LADI Session Handler is distributed in the hope that it will be useful,
17 # but WITHOUT ANY WARRANTY; without even the implied warranty of
18 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19 # GNU General Public License for more details.
21 # You should have received a copy of the GNU General Public License
22 # along with LADI Session Handler. If not, see <http://www.gnu.org/licenses/>
23 # or write to the Free Software Foundation, Inc.,
24 # 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
26 service_name = 'org.ladish'
28 control_object_path = "/org/ladish/Control"
29 studio_object_path = "/org/ladish/Studio"
31 control_interface_name = 'org.ladish.Control'
32 studio_interface_name = 'org.ladish.Studio'
33 app_supervisor_interface_name = 'org.ladish.AppSupervisor'
35 import sys
36 import os
37 import time
38 from traceback import print_exc
40 import dbus
42 def bool_convert(str_value):
43 if str_value.lower() == "false":
44 return False
46 if str_value.lower() == "off":
47 return False
49 if str_value.lower() == "no":
50 return False
52 if str_value == "0":
53 return False
55 if str_value.lower() == "(null)":
56 return False
58 return bool(str_value)
60 def dbus_type_to_python_type(dbus_value):
61 if type(dbus_value) == dbus.Boolean:
62 return bool(dbus_value)
63 if type(dbus_value) == dbus.Int32 or type(dbus_value) == dbus.UInt32:
64 return int(dbus_value)
65 return dbus_value
67 def dbus_type_to_type_string(dbus_value):
68 if type(dbus_value) == dbus.Boolean:
69 return "bool"
70 if type(dbus_value) == dbus.Int32:
71 return "sint"
72 if type(dbus_value) == dbus.UInt32:
73 return "uint"
74 if type(dbus_value) == dbus.Byte:
75 return "char"
76 if type(dbus_value) == dbus.String:
77 return "str"
79 return None # throw exception here?
81 def dbus_typesig_to_type_string(type_char):
82 type_char = str(type_char)
83 if type_char == 'i':
84 return "sint"
85 if type_char == 'u':
86 return "uint"
87 if type_char == 'y':
88 return "char"
89 if type_char == 's':
90 return "str"
91 if type_char == 'b':
92 return "bool"
94 print('unknown dbus typesig')
95 return None # throw exception here?
97 def parse_new_app_args(params_array):
98 #print params_array
99 cmdline = params_array[0]
100 index = 1
102 name = ''
103 level = 0
104 term = False
106 if index < len(params_array):
107 if params_array[index] == '-':
108 return index + 1, cmdline, name, level, term
109 name = params_array[index]
110 index += 1
112 if index < len(params_array):
113 if params_array[index] == '-':
114 return index + 1, cmdline, name, level, term
115 # direct conversion to dbus.Byte is wrong because ord() is used ("1" -> 0x31 instead of "1" -> 0x01)
116 level = int(params_array[index])
117 index += 1
119 if index < len(params_array):
120 if params_array[index] == '-':
121 return index + 1, cmdline, name, level, term
122 if params_array[index] == 'term':
123 term = True
124 index += 1
126 if index < len(params_array) and params_array[index] == '-':
127 index += 1
129 return index, cmdline, name, level, term
131 def add_app(obj, cmdline, name, level, term):
132 dbus.Interface(obj, app_supervisor_interface_name).RunCustom(term, cmdline, name, level)
134 def get_room_obj_by_name(bus, studio_iface, room_name):
135 for room in studio_iface.GetRoomList():
136 #print repr(room)
137 opath = room[0]
138 name = room[1]["name"]
139 if name == room_name:
140 return bus.get_object(service_name, opath)
142 def main():
143 if len(sys.argv) == 1:
144 argv0 = os.path.basename(sys.argv[0])
145 print("Usage: %s [command] [command] ..." % argv0)
146 print("Commands:")
147 print(" exit - exit ladish dbus service")
148 print(" slist - list studios")
149 print(" alist - list apps")
150 print(" sload <studioname> - load studio")
151 print(" sdel <studioname> - delete studio")
152 print(" snew [studioname] - new studio")
153 print(" sisloaded - is studio loaded?")
154 print(" sname - get studio name")
155 print(" ssave - save studio")
156 print(" sunload - unload studio")
157 print(" srename <studioname> - rename studio")
158 print(" sstart - start studio")
159 print(" sstop - stop studio")
160 print(" rtlist - list room templates")
161 print(" rtdel <roomtemplatename> - delete room template")
162 print(" rtnew <roomtemplatename> - create new room template")
163 print(" snewroom <rname> <rtname> - create new studio room")
164 print(" srlist - list studio rooms")
165 print(" sdelroom <rname> - delete studio room")
166 print(" snewapp <appargs> - add new app to studio (see below for more info)")
167 print(" rnewapp <rname> <appargs> - add new app to room (see below for more info)")
168 print("");
169 print("Add new app arguments:");
170 print(" <commandline> [<name> [<level>] [term]] [-]");
171 print("");
172 print(" <commandline> - the commandline to execut");
173 print(" <name> - app name");
174 print(" <level> - level, default is 0");
175 print(" term - if specified, app will be run in terminal");
176 print(" - - marks end of new app params, useful if there are other commands following");
177 print("");
178 print("Examples:");
179 print("");
180 print(" * Add to studio jack_mixer instance named \"mixer\", at level 1, without terminal");
181 print("");
182 print(" $ %s snewapp jack_mixer mixer 1" % argv0);
183 print("");
184 print(" * Add to room \"main\" fluidjack instance named \"fluid\", at level 0, with terminal");
185 print("");
186 print(" $ %s rnewapp main \"fluidjack FluidR3.SF2\" fluid 0 term" % argv0);
187 print("");
188 sys.exit(0)
190 bus = dbus.SessionBus()
191 control_obj = None
192 studio_obj = None
194 # check arguments
195 index = 1
196 while index < len(sys.argv):
197 arg = sys.argv[index]
198 index += 1
199 try:
200 if not control_obj:
201 control_obj = bus.get_object(service_name, control_object_path)
202 control_iface = dbus.Interface(control_obj, control_interface_name)
204 if arg == "exit":
205 print("--- exit")
206 control_iface.Exit()
207 time.sleep(1)
208 # we have deactivated the object and we need to get new connection if there are more commands
209 control_obj = None
210 control_iface = None
211 elif arg == 'slist':
212 print("--- studio list")
213 for studio in control_iface.GetStudioList():
214 name = studio[0]
215 mtime = studio[1]['Modification Time']
216 print('"%s" last modified on %s' % (name, time.ctime(mtime)))
217 elif arg == 'alist':
218 print("--- app list")
219 for app in control_iface.GetApplicationList():
220 print(app)
221 elif arg == 'sload':
222 print("--- studio load")
223 if index >= len(sys.argv):
224 print("load studio command requires studio name argument")
225 sys.exit()
227 arg = sys.argv[index]
228 index += 1
230 open_options = {}
231 #open_options["option1"] = "asd"
232 #open_options["option2"] = True
234 control_iface.LoadStudio(arg, open_options)
235 elif arg == 'sdel':
236 print("--- studio delete")
237 if index >= len(sys.argv):
238 print("delete studio command requires studio name argument")
239 sys.exit()
241 arg = sys.argv[index]
242 index += 1
244 control_iface.DeleteStudio(arg)
245 elif arg == 'snew':
246 print("--- studio new")
247 name = ""
248 if index < len(sys.argv):
249 name = sys.argv[index]
250 index += 1
252 control_iface.NewStudio(name)
253 elif arg == 'sisloaded':
254 print("--- studio is loaded")
255 if control_iface.IsStudioLoaded():
256 print("yes")
257 else:
258 print("no")
259 elif arg == 'rtlist':
260 print("--- list room templates")
261 for studio in control_iface.GetRoomTemplateList():
262 name = studio[0]
263 print('"%s"' % name)
264 elif arg == 'rtnew':
265 print("--- create new room template")
266 if index >= len(sys.argv):
267 print("create new room template command requires room template name argument")
268 sys.exit()
270 arg = sys.argv[index]
271 index += 1
273 control_iface.CreateRoomTemplate(arg)
274 elif arg == 'rtdel':
275 print("--- delete room template")
276 if index >= len(sys.argv):
277 print("delete room template command requires room template name argument")
278 sys.exit()
280 arg = sys.argv[index]
281 index += 1
283 control_iface.DeleteRoomTemplate(arg)
284 else:
285 if not studio_obj:
286 studio_obj = bus.get_object(service_name, studio_object_path)
287 studio_iface = dbus.Interface(studio_obj, studio_interface_name)
289 if arg == 'sname':
290 print("--- studio get name")
291 print("\"%s\"" % studio_iface.GetName())
292 elif arg == 'ssave':
293 print("--- studio save")
294 studio_iface.Save()
295 elif arg == 'sunload':
296 print("--- studio unload")
297 studio_iface.Unload()
298 studio_obj = None
299 studio_iface = None
300 elif arg == 'srename':
301 print("--- studio rename")
302 if index >= len(sys.argv):
303 print("rename studio command requires studio name argument")
304 sys.exit()
306 arg = sys.argv[index]
307 index += 1
309 studio_iface.Rename(arg)
310 elif arg == 'sstart':
311 print("--- studio start")
312 studio_iface.Start()
313 elif arg == 'sstop':
314 print("--- studio stop")
315 studio_iface.Stop()
316 elif arg == 'snewroom':
317 print("--- create new studio room")
318 if index + 1 >= len(sys.argv):
319 print("creation of studio room requires room name and room template name arguments")
320 sys.exit()
322 room_name = sys.argv[index]
323 index += 1
324 room_template_name = sys.argv[index]
325 index += 1
327 studio_iface.CreateRoom(room_name, room_template_name)
328 elif arg == 'srlist':
329 print("--- list studio rooms")
330 for room in studio_iface.GetRoomList():
331 #print repr(room)
332 opath = room[0]
333 name = room[1]["name"]
334 if room[1].has_key("template"):
335 template = str(room[1]["template"])
336 else:
337 template = None
339 if template:
340 print('"%s" from template "%s" (%s)' % (name, template, opath))
341 else:
342 print('"%s" (%s)' % (name, opath))
343 elif arg == 'sdelroom':
344 print("--- delete studio room")
345 if index >= len(sys.argv):
346 print("delete studio room command requires room name argument")
347 sys.exit()
349 arg = sys.argv[index]
350 index += 1
352 studio_iface.DeleteRoom(arg)
353 elif arg == 'snewapp':
354 print("--- new studio app")
355 count, cmdline, name, level, term = parse_new_app_args(sys.argv[index:])
356 index += count
357 add_app(studio_obj, cmdline, name, level, term)
358 elif arg == 'rnewapp':
359 print("--- new room app")
360 arg = sys.argv[index]
361 index += 1
363 count, cmdline, name, level, term = parse_new_app_args(sys.argv[index:])
364 index += count
366 add_app(get_room_obj_by_name(bus, studio_iface, arg), cmdline, name, level, term)
367 else:
368 print("Unknown command '%s'" % arg)
369 except dbus.DBusException, e:
370 print("DBus exception: %s" % str(e))
372 if __name__ == '__main__':
373 main()