JSON-RPC WebSocket Event Handling
JSON-RPC WebSocket Event Handling
import base64
import decimal
import json
import Queue
import time
import sys
import traceback
from collections import defaultdict
from tempfile import NamedTemporaryFile
ioloop=None
class ExternalEvent([Link]):
def __init__(self,callable,*args):
super(ExternalEvent,self).__init__([Link])
[Link] = handleExceptionsInCallback(callable)
[Link] = args
def run(self):
[Link](*[Link])
class EventReceiver([Link]):
# Receive event from the tornado thread and execute them in the qt thread
def customEvent(self,evt):
if isinstance(evt,ExternalEvent):
[Link]()
class FNDispatchException(JSONRPCDispatchException):
def __init__(self,data=None):
super(FNDispatchException,self).__init__([Link],[Link],data)
class importException(FNDispatchException):
CODE = -32004
MESSAGE = "An error occurred while doing the import"
class OpenException(FNDispatchException):
CODE = -32003
MESSAGE = "An error occurred while opening a window"
class LoadException(FNDispatchException):
CODE = -32002
MESSAGE = "An error occurred while loading the pdd"
class ExitException(FNDispatchException):
CODE = -32000
MESSAGE = "Exit error"
class ObjectPathException(FNDispatchException):
CODE = -32001
MESSAGE = "Unknown object"
class RemoteErrorException(FNDispatchException):
CODE = -32005
def moveEvent(self,event):
return
# globalPoint = [Link]([Link]().center());
# [Link](globalPoint.x() - [Link]() / 2, globalPoint.y() -
[Link]() / 2);
output = {}
for key, value in [Link]():
if isinstance(key, Element):
key = [Link]([Link])
elif isinstance(key, [Link]):
key = [Link]().pathname([Link])
if isinstance(value, Element):
value = [Link]([Link])
elif isinstance(value, [Link]):
value = [Link]().pathname([Link])
output[key] = copy_dict(value)
return output
def fromPath(pathname):
"Retrieves an element, out of its pathname. "
path = [Link]('..')
rootItem = [Link].getitem_str(path[0][1:])
scan = rootItem
for z in path[1:]:
if z[0] == '(':
try:
scan = scan[[Link](z)]
except KeyError:
scan = scan[z]
else:
scan = scan[z]
return scan
def handleExceptionsInCallback(func):
def _intern(*args, **kwargs):
try:
func(*args, **kwargs)
return _intern
self.subscriber_info = {}
self.ALL_UPDATES = True
[Link] = [Link](self)
[Link] = False
[Link][[Link]()] = None
[Link] = True
self._to_delete = []
self._pause_output = False
self._reserved_names = defaultdict(set)
def handleClearProject(self):
notification = {
'jsonrpc': '2.0',
'method': 'clearProject',
'params': [],
}
def handleReloadProject(self):
notification = {
'jsonrpc': '2.0',
'method': 'reloadProject',
'params': [],
}
def pauseOutput(self):
self._pause_output = True
yield
self._pause_output = False
# Filter the updates to only include the items that were directly
updated, i.e.
# not anything that was unstabilized because it was watching something
which was
# modified.
def unpack_shadow(item):
origins = {item,}
if isinstance(item, [Link]):
origins |= unpack_shadow(item._objectOrigin)
return origins
def full_hierarchy(item):
parents = unpack_shadow(item)
while item._parent is not None:
item = item._parent
parents |= unpack_shadow(item)
return parents
def up_to_object(item):
items = unpack_shadow(item)
while isinstance(item, ([Link], [Link])):
item = item._parent
items |= unpack_shadow(item)
return items
params = {
'renames': renames,
'deletions': [],
'updates': [],
'creations': [],
'modified_routes': [],
'deleted_routes': [],
}
def is_route(item):
return [Link]() and [Link]().name() == 'outputEdges'
updates_to_send = set()
filtered_creations = []
for creation in creations:
# We don't want anything from floorplan results.
if [Link]().parent() and
[Link]().parent().kind == 'structureFloorplan':
continue
updates_to_send.add([Link]().parent().pathname([Link]))
filtered_creations.append(creation)
filtered_deletions = []
for deletion in deletions:
if deletion in self.skip_delete:
self.skip_delete.remove(deletion)
else:
filtered_deletions.append(deletion)
modified_routes = {
route for i in deletions | updates | creations
if is_route(i) for route in [Link]
}
# The edges don't always show up when you first add an observer to an
item.
observers = {i for i in updates | creations if [Link]() == 'observer'
and [Link]().name() == 'observation'}
for observer in observers:
if '@' not in [Link]():
continue
[Link]()['@']['observation']['digest'].stabilize()
route_objects = {route for i in getattr([Link]()
['@']['observation']['digest'], 'outputEdges', []) for route in [Link]}
updated_routes |= {[Link]['$'][[Link] +
'Route'][[Link]][[Link]].pathname() for route in route_objects}
updates_to_send.add([Link]().parent().pathname([Link]))
else:
updates_to_send.add([Link]().pathname([Link]))
params['modified_routes'] += list(updated_routes)
params['deleted_routes'] += list(deleted_routes)
notification = {
'jsonrpc': '2.0',
'method': 'notifyElement',
'params': params,
}
[Link]('Sending notification',[Link](notification,
sort_keys=True,indent=4, separators=(',', ': ')))
global ioloop
[Link]([Link],ExternalEvent([Link]
ocused))
ioloop.add_callback(self.write_message, [Link](notification))
def open(self):
[Link](self)
def on_close(self):
[Link](self)
def log(self,caption,message):
if [Link]("LaunchDevelopper"):
[Link](caption,message=message)
dispatcher["getProjectJson"] = [Link]
dispatcher["getProjectTree"] = [Link]
dispatcher["getIter"] = [Link]
dispatcher["getKeys"] = [Link]
dispatcher["childrenOfKind"] = [Link]
dispatcher["getValue"] = [Link]
dispatcher["getOrigin"] = [Link]
dispatcher["getProjectAncestor"] = [Link]
dispatcher["getChild"] = [Link]
dispatcher["getKind"] = [Link]
dispatcher["getParent"] = [Link]
dispatcher["getFileContents"] = [Link]
dispatcher["getName"] = [Link]
dispatcher["subscribeToChanges"] = [Link]
dispatcher["getSubscriptionUpdates"] = [Link]
dispatcher["getRouteBeforeAndAfter"] = [Link]
dispatcher["deleteItems"] = [Link]
dispatcher["pathExists"] = [Link]
dispatcher["createNewElement"] = [Link]
dispatcher["setValues"] = [Link]
dispatcher["addEntryToList"] = [Link]
dispatcher["bulkDeleteCreateAndUpdate"] =
[Link]
dispatcher["bulkDeleteCreateAndUpdateDebug"] =
[Link]
dispatcher["createAndPopulateOutline"] =
[Link]
dispatcher["showIn"] = [Link]
dispatcher["suggestName"] = [Link]
dispatcher["openCustomizer"] = [Link]
dispatcher["getPipeInfo"] = [Link]
dispatcher["acknowledgeUpdate"] = [Link]
dispatcher["blockChanges"] = [Link]
dispatcher["allowChanges"] = [Link]
# [Link]("Sending response",[Link]([Link],
sort_keys=True,indent=4, separators=(',', ': ')))
self.write_message([Link])
def acknowledgeUpdate(self):
[Link]([Link],
ExternalEvent([Link]))
def blockChanges(self):
def _blockChanges():
[Link].block_changes = True
[Link]([Link],ExternalEvent(_blockChanges))
def allowChanges(self):
def _allowChanges():
[Link].block_changes = False
[Link]([Link],ExternalEvent(_allowChanges))
def getPddName(self):
return [Link]()
if path == '/':
element = [Link]
else:
try:
element = [Link](path)
except KeyError:
raise JSONRPCInvalidParams(message='No item at path "%s"' %
path)
good_name = element._item.proposeChildName(name)
index = 0
while good_name in self._reserved_names[path]:
good_name = element._item.proposeChildName('%s_%d' % (name,
index))
index += 1
self._reserved_names[path].add(good_name)
return good_name
def _deferred_showIn():
elements = [[Link](path) for path in paths]
if not elements:
return
design_editor = [Link]('ViewOpen')
['DesignEditorActor'].trigger(Context([elements[0].projectAncestor()]))
[Link]()
topology_view = design_editor.forcePage(('Datapath Transport',
'Topology'), 'switchBasedArchitecture')
[Link]()
topology_view.doShowIn(Context(elements))
[Link]()
[Link]([Link],
ExternalEvent(_deferred_showIn))
return None
def _deferred_openCustomizer():
element = [Link](path)
design_editor =
[Link]('Customize').trigger(Context([element['$']]))
[Link]([Link],
ExternalEvent(_deferred_openCustomizer))
return None
if [Link]:
name = [Link] + '.forward'
if isinstance([Link], dict):
locked = True
ref = ''
state = [Link]['state']
modifiable = [Link]['autopipeModifiable']
else:
locked = False
ref = [Link]()
state = [Link]['state'].value()
modifiable =
[Link]['autopipeModifiable'].value()
[Link]((name, state, modifiable, locked, ref))
if [Link]:
name = [Link] + '.backward'
if isinstance([Link], dict):
locked = True
ref = ''
state = [Link]['state']
modifiable = [Link]['autopipeModifiable']
else:
locked = False
ref = [Link]()
state = [Link]['state'].value()
modifiable =
[Link]['autopipeModifiable'].value()
[Link]((name, state, modifiable, locked, ref))
return pipes
digest = element['@'][network]['digest']
if [Link]():
for neighbor, nodes in [Link]():
for node in reversed(nodes):
if not isinstance(node, PipeNode):
continue
pipe_info[network]['input']
[[Link]()] += parse_pipe(node)
new_pipes = parse_pipe(node)
if side == 'tx':
new_pipes = list(reversed(new_pipes))
pipe_info[network][side] += new_pipes
return pipe_info
try:
info[path] = self.pipe_info(element)
except Exception as error:
exc_type, exc_value, exc_traceback = sys.exc_info()
message = formatException(exc_type, exc_value,
exc_traceback)
exception = RemoteErrorException(message=message)
raise exception
return info
if name in self._reserved_names['/']:
self._reserved_names['/'].remove(name)
new_outline_item = [Link](parent_obj._item,
name, kind, origin_item)
new_outline = new_outline_item.getElement()
new_restriction_items = {}
with [Link]('Create restrictions.',
network_request=True):
for restriction_name, restriction_values in
[Link]():
new_restriction_items[restriction_name] =
[Link](new_outline_item, restriction_name, 'restriction')
for i, zone in
enumerate(restriction_values['zones']):
new_subregion_item = [Link](zones,
str(i))
[Link](new_subregion_item, 'x',
zone['x'])
[Link](new_subregion_item, 'y',
zone['y'])
[Link](new_subregion_item, 'w',
zone['w'])
[Link](new_subregion_item, 'h',
zone['h'])
new_references[restriction_name].append(new_subregion_item)
new_outline['$']['bounding'].stabilize()
new_outline['$']['background']['box']
['w'].assign(new_outline['$']['bounding']['w'].value())
new_outline['$']['background']['box']
['h'].assign(new_outline['$']['bounding']['h'].value())
new_outline.stabilize()
def _deferred_createAndPopulateOutline():
new_outline, new_references =
self._createAndPopulateOutline(name, origin, defaults, restrictions, image_data)
[Link]((new_outline.pathname([Link]), {k:
[[Link]().pathname([Link]) for i in v] for k, v in
new_references.items()}))
[Link]([Link],
ExternalEvent(_deferred_createAndPopulateOutline))
return [Link]() # send response when stabilization is
finished
if origin:
origin_item = fromPath(origin)
else:
origin_item = None
with
NamedTemporaryFile(suffix=default_values.pop('extension')) as open_file:
parent=parent_obj.getElement(),
name=name,
fileName=open_file.name,
)
else:
if isinstance(parent_obj,
[Link]):
new_item =
[Link](parent_obj, name, kind, origin_item)
else:
new_item =
[Link](parent_obj, name)
created_items[(parent, name)] = new_item
with [Link]('Assign
defaults for %s' % name, network_request=not trigger_return_updates):
for key, value in
self._decode_value_payload(default_values):
if isinstance(value, Element):
try:
abstraction =
[Link]([Link](parent))
except KeyError:
abstraction = None
if isinstance(key, Element):
key = key._item
elif isinstance(key, list):
key = [i._item if
isinstance(i, Element) else i for i in key]
[Link](new_item,
key, value)
new_item = [Link](
parent=parent_obj,
key=key,
)
if value is not None:
[Link](new_item, [],
value)
with [Link]('Assign
defaults for %s' % name, network_request=not trigger_return_updates):
for key, value in
self._decode_value_payload(default_values):
if isinstance(value, Element):
abstraction =
[Link]([Link](parent))
if abstraction is not None:
value = abstraction
if isinstance(key, list):
key = [i._item if
isinstance(i, Element) else i for i in key]
elif isinstance(key, Element):
key = key._item
[Link](new_item,
key, value)
[Link]()
else:
raise Exception('Unknown change type: %s' %
change_type)
def make_path(item):
"""
Make the full path of an item in a way that is compatible
with Element.
"""
output = ''
separator = '/'
for part in [Link]()[1:]:
# Once we hit the properties, everything is separated
by two dots.
if [Link]() == '$':
separator = '..'
output += separator + [Link]()
return output
[Link]([Link],
ExternalEvent(_deferred_bulkDeleteCreateAndUpdate))
# Returns a mapping of created names to full paths.
resp = [Link]() # send response when stabilization is
finished
if isinstance(resp, Exception):
raise resp
return resp
def _deferredDeleteItems():
ctx = Context([[Link](path) for path in paths])
self.skip_delete += [i for i in ctx]
[Link]('ProjectManagement').[Link]
(ctx)
[Link](('deleted', paths))
[Link]([Link],
ExternalEvent(_deferredDeleteItems))
action, elements = [Link]() # send response when
stabilization is finished
@staticmethod
def _decode_value_payload(obj):
if isinstance(obj, dict) and '__type__' in obj:
if obj['__type__'] == 'eHdrPenalty':
from [Link] import eHdrPenalty
return eHdrPenalty(obj['__value__'])
return val
if '__precision__' in obj:
dec =
[Link]([Link](obj['__precision__']))
return dec
else:
raise Exception('Unkown type to decode: "%s"' %
obj['__type__'])
# I think that json will actually turn all tuples into lists, so this
might never be called.
elif isinstance(obj, tuple):
obj = tuple([RootHandler._decode_value_payload(i) for i in obj])
return obj
default_values = self._decode_value_payload(default_values)
def _deferredCreateItemAndAddToRoutes():
with [Link]('Add new item.',
network_request=True):
with [Link]('Create %s %s.' % (kind,
name), network_request=True):
if parent == '':
parent_obj = [Link]
else:
parent_obj = [Link](parent)
if origin:
origin_item =
[Link](origin)._item
else:
origin_item = None
[Link](new_item.getElement().pathname([Link]))
[Link]([Link],
ExternalEvent(_deferredCreateItemAndAddToRoutes))
return [Link]() # send response when stabilization is
finished
def _deferred_addEntryToList():
array = [Link](path)
[Link]()
[Link]([Link],
ExternalEvent(_deferred_addEntryToList))
return [Link]() # send response when stabilization is
finished
def _deferredSetValues():
with [Link]('Set values.',
network_request=True):
for path, value in paths_and_values:
element = [Link](path)
if isinstance(value, Element):
abstraction =
[Link]([Link](parent))
if abstraction is not None:
value = abstraction
with [Link]('Set value %s to %s.'
% (path, value), network_request=True):
[Link](value)
[Link](None)
[Link]([Link],
ExternalEvent(_deferredSetValues))
return [Link]() # send response when stabilization is
finished
try:
obj = [Link](path)
except KeyError:
raise JSONRPCInvalidParams(message='No item at path "%s"' % path)
info = obj['@'][[Link]]['info']
all_routes = set()
route_preceeding = {}
route_successing = {}
for item, routes in [Link]():
for route in routes:
all_routes.add(route)
route_preceeding[route] = item
return updates
return None
return [Link]()
try:
obj = [Link](path)
except KeyError:
obj = None
return origin
def getProjectJson(self):
if '__children__' in container:
container['__children__'][[Link]()] = serialized
else:
container[[Link]()] = serialized
if isinstance(element, [Link]):
if 'value' in [Link]:
serialized['__value__'] =
copy_dict([Link]['value'])
serialized['__kind__'] = 'arterisCustom'
return
if hasattr(element, 'file'):
serialized['__file__'] =
base64.b64encode([Link]().read())
parameter_whitelist = set()
if [Link]() == '$':
kind = getattr([Link](), 'kind', '')
if kind == 'switchBasedArchitecture':
parameter_whitelist.add('datapathRoute')
parameter_whitelist.add('serviceRoute')
parameter_whitelist.add('observationRoute')
parameter_whitelist.add('dvmRoute')
if element._item:
custom_items = [i for i in element._item if isinstance(i,
[Link])]
for item in custom_items:
recursive_fill(item, serialized)
output = {}
for child in [Link]:
if getattr(child, 'kind', None) in ['scenario', 'scenarioResult',
'nocComposition', 'exportOption']:
continue
recursive_fill(child, output)
return output
def getProjectTree(self):
output = {}
def recursive_fill(node):
node_name = '/'.join([str(i) for i in [Link]() if i is
not None])
output[node_name] = {
'children': ['/'.join([str(i) for i in [Link]()
if i is not None]) for child in node],
}
recursive_fill([Link])
return output
try:
element = [Link](path)
except KeyError:
element = None
return output
element = [Link]()
elif [Link]:
try:
item = fromPath(path)
value = [Link]()
return copy_dict(value)
except KeyError:
pass
if not element._status:
[Link]()
return copy_dict([Link]())
return True
if path =='/':
child = [Link](path + childname)
else:
try:
parent = [Link](path)
except KeyError:
parent = None
if parent in [None, Ellipsis]:
parent_item = fromPath(path)
if isinstance(parent_item, [Link]) and
childname in parent_item:
return parent_item[childname].path()
parent = parent_item.getElement()
if not parent._status:
[Link]()
try:
child = parent[childname]
except KeyError:
child = None
if isinstance(child, [Link]):
return [Link]()
return [Link]([Link])
try:
item = fromPath(path)
if isinstance(item, [Link]):
return [[Link]() for i in item if isinstance(i,
[Link])]
except KeyError:
pass
try:
element = [Link](path)
if not element._status:
[Link]()
return [[Link]() for i in element] + [[Link]() for i in
element._item if isinstance(i, [Link])]
except:
pass
return []
try:
element = [Link](path)
except KeyError:
element = None
element = [Link]()
if not element._status:
[Link]()
return result
# Requests
def savePdd(self,XMLFile):
def save():
[Link]('SaveProjectAs').trigger(pddName=XMLFile,fromJsonServer=True)
[Link](('saved',None))
[Link]([Link],ExternalEvent(save))
action,_ = [Link]()
return {}
def getOpenPddFunc(self,message):
def openPdd(XMLFile):
def open():
error = [Link]('OpenProject').trigger(XMLFile)
if not error:
[Link]()
[Link](('opened',None))
else:
[Link](('error',None))
[Link]([Link],ExternalEvent(open))
action,_ = [Link]()
if action == 'error':
raise LoadException()
else:
# Create list of object status
def getChildObject(element):
childObjects = filter(lambda e : [Link], element)
return childObjects + reduce(list.__add__,
map(getChildObject,childObjects), [])
return {
"objectStatus" : objectStatus
}
return openPdd
def _getViewOpenKwargs(self,element,hiddenEntries):
hiddenPages = []
kwargs = {}
if element is not None and [Link] in [Link]():
kwargs['shownKind'] = [Link]
for name in hiddenEntries:
tab,pageName = [Link](':')
if tab in [Link] and [Link][tab] !=
[Link]: continue
[Link] ( [Link]('.') )
kwargs['hiddenPages'] = hiddenPages
return kwargs
def openEditor(self,actor,responseMessage):
def openViewEditor(objectPath=None,hiddenEntries=None):
if objectPath is not None:
try:
element = [Link](objectPath)
except Exception, e:
raise ObjectPathException()
else:
element = None
if hiddenEntries is None:
hiddenEntries = []
kwargs = self._getViewOpenKwargs(element,hiddenEntries)
def _openEditor():
if objectPath is not None:
element = [Link](objectPath)
[Link]()
context = Context((element,))
else:
context = Context(([Link](),))
r = [Link]('ViewOpen')[actor].trigger(context,**kwargs)
if r is None:
[Link](('error',None))
else:
[Link]((responseMessage,None))
[Link]([Link],ExternalEvent(_openEditor))
action,_ = [Link]()
if action == 'error':
raise OpenException()
return {}
return openViewEditor
def openDesignDiff(self):
def _openDesignDiff():
r = [Link]('DesignDiff').trigger()
if r is None:
[Link](('error',None))
else:
[Link](('openedDesignDiff',None))
[Link]([Link],ExternalEvent(_openDesignDiff))
action,_ = [Link]()
if action == 'error':
raise OpenException()
return {}
def pause(self,string):
def pause():
if [Link] is None:
mainWindow = [Link]('Gui').mainWindow
[Link] = PauseDialog(mainWindow,string)
#[Link].exec_()
[Link]([Link],ExternalEvent(pause))
# Wait until the dialog is instantiated before handling further
commands. Otherwise if we
# receive a resume command and handle it immediately the dialog box
does not exits yet and is not closed.
while not [Link]:
[Link](0.1)
return {}
def resume(self):
if [Link]:
[Link]([Link],[Link]())
[Link] = None
return {}
def stabilize(self,object):
def stabilize():
element = [Link](object)
[Link]()
[Link](('stabilized',element))
try:
element = [Link](object)
except Exception, e:
raise ObjectPathException()
[Link]([Link],ExternalEvent(stabilize))
action,element = [Link]() # send response when
stabilization is finished
def getIssuesList(element):
def getIssues(element):
childIssues = reduce(list.__add__, map(getIssues,
filter(lambda e:[Link], list(element))), [])
return list(element['!']) + childIssues
issueList = []
for issue in getIssues(element):
[Link]({
'pathname' : [Link]().pathname()
, 'code' : [Link]()
, 'shortMsg' : [Link]()
, 'longMsg' : [Link]()
, 'reason' : [Link]()
})
return issueList
result = {
"objectStatus": [Link]()
, "issueList": getIssuesList(element)
}
return result
def exit(self,force):
def exit():
error = False
error |= force == 1 and [Link]()
if not error:
[Link]('Quit').trigger(force)
[Link](('exited',None))
else:
[Link](('error',None))
[Link]([Link],ExternalEvent(exit))
action,path = [Link]()
if action == 'error':
raise ExitException()
return {}
def importPDD(self,file,folderName=None):
return
self._importWithFolderName(file,folderName,"ImportPdd",'importedPDD')
def importOcpRtlConf(self,file,folderName=None):
return
self._importWithFolderName(file,folderName,"ImportRtlConf",'importedOcpRtlConf')
def importAreaResults(self,file,folderName=None):
return
self._importWithFolderName(file,folderName,"ImportAreaResult",'importedAreaResults'
)
def importFloorplanResults(self,file,folderName=None):
return
self._importWithFolderName(file,folderName,"ImportFloorplanResult",'importedFloorpl
anResults')
def
_importWithFolderName(self,filename,folderName,actionName,responseMessage='imported
'):
if folderName is None:
folderName = 'import'
def import_():
importResult =
[Link](actionName).trigger(filename ,folderName=folderName)
[Link]((responseMessage,importResult))
[Link]([Link],ExternalEvent(import_))
message,importResult = [Link]()
if not importResult:
raise ImportException()
return {}
def importScript(self,file):
return self.import_(file,"ImportScript")
def importVCD(self,VCDFile):
return self.import_(VCDFile,"ImportVCD")
def import_(self,filename,actionName,responseMessage='imported'):
def import_():
importResult =
[Link](actionName).trigger(filename ,fromJsonServer=False)
[Link]((responseMessage,importResult))
[Link]([Link],ExternalEvent(import_))
message,(importResult,errorInfo) = [Link]()
result = errorInfo
return result
def importAttachment(self,file,folderName=None):
if folderName is None:
folderName = 'import'
folderName = [Link]('.','_')
def import_():
name = str([Link](file).replace('.','_').replace('
',''))
with [Link]( "Importing attachment
from \"%s\"." % file ):
try:
folderItem = [Link]('/%s'%folderName)._item
except KeyError:
folderItem =
[Link]([Link]._item,folderName,'folder')
elt=[Link](folderItem,name,
open(unicode(file)) , file , [Link]() , "------" )
[Link](('importedAttachment',None))
[Link]([Link],ExternalEvent(import_))
message,importResult = [Link]()
return {}
def getSaveState(self):
return {
"state": "modified" if [Link]() else
"unmodified"
}
def setStyle(self,style):
def _setStyle():
st = [Link](style)
[Link](st)
[Link](('styleSet',None))
[Link]([Link],ExternalEvent(_setStyle))
action,_ = [Link]()
return {}
# Notifications
def sendNotification(self,methodName,**params):
notification = {"jsonrpc": "2.0", "method": methodName}
if params: notification['params'] = params
# [Link]("Sending notification",[Link](notification,
sort_keys=True,indent=4, separators=(',', ': ')))
global ioloop
ioloop.add_callback(self.write_message,[Link](notification))
def projectSaved(self,filename):
[Link]("saved",XMLFile=filename)
def raise_(self):
[Link]('raise')
def projectModified(self,filename):
[Link]("modified", XMLFile=filename)
def stable(self):
f=lambda x: x.is_alive() and isinstance(x,StabilizingThread)
j=lambda x: [Link]()
[Link]()
while(self.ws_connection is not None):
[Link]()
[Link]("unstable")
map(j,filter(f,[Link]()))
[Link]()
[Link]("stable")
def userExit(self):
[Link]("userExit")
def userImportScript(self, result, infos):
[Link]("userImportScript", **infos)
def userImportVCD(self, result, infos):
[Link]("userImportVCD",**infos)
# class JsonReport(object):
# def __init__(self,activate=True):
# self._activate = activate
# self._installed = None
# self._logFileManager = LogFileManager("JSON-RPC")
# def __enter__(self):
# if self._activate :
# assert not self._installed
# filename = self._logFileManager.getNewLogFilename()
# if filename is None: return #The log dir could not be created
# f = open(filename,'w')
# utf8write(f,'**************************** FLEXNOC JSON-RCP log
***************************************\n')
# for s in nsVersion : utf8write(f,'%s\n'%s)
#
# l = [Link]()
# [Link](filename)
# self._installed = ErrorReportListener(l,f)
# def __exit__(self,excType,excValue,excTb):
# if self._installed :
# self._installed.__swig_destroy__(self._installed)
# self._installed = None
[Link]('SaveProjectAs').connect([Link]('SaveProjectAs'),done,[Link]
)
[Link] = [Link](
'Sending Updates',
[Link](),
0,
0,
None,
)
[Link](True)
[Link](False)
[Link]([Link].WA_DeleteOnClose, False)
@property
def block_changes(self):
return self._block_changes
@block_changes.setter
def block_changes(self, value):
self._block_changes = value
def showProgressIfFocused(self):
if app.window_active:
[Link]()
def closeProgressBar(self):
[Link]()
return False
def __dtor__(self):
[Link](self)
def notifyElement(self, deletions , updates, creations, renames,
changed_sb_items):
pass
def notifyStableRoot(self):
if not [Link]:
[Link]=True
[Link]()
def notifyCompletion(self):
if [Link]():
for handler in [Link]:
[Link]([Link]())
def raise_(self):
for handler in [Link]:
handler.raise_()
def notifyDeletedRoot(self):
[Link](self)
def saved(self,result):
if not result:
for handler in [Link]:
[Link]([Link]())
def userExit(self):
for handler in [Link]:
[Link]()
def scriptImported(self,result):
# The user canceled the import.
if result is False:
return
def vcdImported(self,result):
# The user canceled the import.
if result is False:
return
def run(self):
server = [Link]([
(r"/", RootHandler)
])
if [Link] == -1:
sockets = [Link].bind_sockets(0, '[Link]')
[Link] = sockets[0].getsockname()[:2][1]
http_server = [Link](server)
http_server.add_sockets(sockets)
else:
[Link]([Link])
if __options__.notifyAfterServerStart or [Link]:
print 'Websocket server has been started at port %d.' % [Link]
[Link]()
global ioloop
ioloop=[Link]()
[Link]()
def stop(self):
global ioloop
if [Link]:
[Link]()
def startServer(port):
import [Link] as app
[Link] = Server(port)