/// <summary> /// Creates a new YCompClient instance and connects to the local YComp server. /// If it is not available a SocketException is thrown /// </summary> public YCompClient(INamedGraph graph, String layoutModule, int connectionTimeout, int port, DumpInfo dumpInfo, ElementRealizers realizers) { this.graph = graph; this.dumpInfo = dumpInfo; int startTime = Environment.TickCount; do { try { ycompClient = new TcpClient("localhost", port); } catch(SocketException) { ycompClient = null; Thread.Sleep(1000); } } while(ycompClient == null && Environment.TickCount - startTime < connectionTimeout); if(ycompClient == null) throw new Exception("Connection timeout!"); ycompStream = new YCompStream(ycompClient); SetLayout(layoutModule); dumpInfo.OnNodeTypeAppearanceChanged += new NodeTypeAppearanceChangedHandler(OnNodeTypeAppearanceChanged); dumpInfo.OnEdgeTypeAppearanceChanged += new EdgeTypeAppearanceChangedHandler(OnEdgeTypeAppearanceChanged); dumpInfo.OnTypeInfotagsChanged += new TypeInfotagsChangedHandler(OnTypeInfotagsChanged); this.realizers = realizers; realizers.RegisterYComp(this); // TODO: Add group related events }
/// <summary> /// Initializes a new Debugger instance using the given layout and options. /// Any invalid options will be removed from layoutOptions. /// </summary> /// <param name="grShellImpl">An GrShellImpl instance.</param> /// <param name="debugLayout">The name of the layout to be used.</param> /// <param name="layoutOptions">An dictionary mapping layout option names to their values. /// It may be null, if no options are to be applied.</param> public Debugger(GrShellImpl grShellImpl, String debugLayout, Dictionary<String, String> layoutOptions) { this.grShellImpl = grShellImpl; this.shellProcEnv = grShellImpl.CurrentShellProcEnv; this.realizers = grShellImpl.realizers; this.context = new PrintSequenceContext(grShellImpl.Workaround); int ycompPort = GetFreeTCPPort(); if(ycompPort < 0) { throw new Exception("Didn't find a free TCP port in the range 4242-4251!"); } try { viewerProcess = Process.Start(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location) + Path.DirectorySeparatorChar + "ycomp", "--nomaximize -p " + ycompPort); } catch(Exception e) { throw new Exception("Unable to start yComp: " + e.ToString()); } try { ycompClient = new YCompClient(shellProcEnv.ProcEnv.NamedGraph, debugLayout, 20000, ycompPort, shellProcEnv.DumpInfo, realizers); } catch(Exception ex) { throw new Exception("Unable to connect to yComp at port " + ycompPort + ": " + ex.Message); } shellProcEnv.ProcEnv.NamedGraph.ReuseOptimization = false; NotifyOnConnectionLost = true; try { if(layoutOptions != null) { List<String> illegalOptions = null; foreach(KeyValuePair<String, String> option in layoutOptions) { if(!SetLayoutOption(option.Key, option.Value)) { if(illegalOptions == null) illegalOptions = new List<String>(); illegalOptions.Add(option.Key); } } if(illegalOptions != null) { foreach(String illegalOption in illegalOptions) layoutOptions.Remove(illegalOption); } } if(!ycompClient.dumpInfo.IsExcludedGraph()) UploadGraph(shellProcEnv.ProcEnv.NamedGraph); } catch(OperationCanceledException) { throw new Exception("Connection to yComp lost"); } NotifyOnConnectionLost = false; RegisterLibGrEvents(shellProcEnv.ProcEnv.NamedGraph); }