24 import java.lang.System;
35 static Thread FreeWRLThread;
48 PrintWriter EAIinThreadtoBrowser;
49 PipedWriter EAIinThreadtoBrowserPipe = null;
52 static BufferedReader BrowserfromEAI = null;
53 PipedReader BrowserfromEAIPipe = null;
63 static PrintWriter EAIout;
70 private String reply =
"";
74 static int queryno = 1;
78 private String descript =
"";
81 static Object FreeWRLToken =
new Object();
85 public int get_Browser_EVtype (
int event)
90 return BrowserGlobals.EVtype[event];
97 return BrowserGlobals.EVObserver[eventno];
100 public void Browser_RL_Async_send (String EVentreply,
int eventno)
103 for (EVcounter=0; EVcounter<BrowserGlobals.EVno; EVcounter++) {
109 RL_Async.send(EVentreply, EVcounter);
113 public Browser(Applet pApplet,
int portnum) {
121 while (EAISocket == null) {
123 EAISocket =
new Socket(
"localhost",portnum);
124 }
catch (IOException e) {
126 counter = counter + 1;
128 System.out.println (
"EAI: Java code timed out finding FreeWRL");
131 try {Thread.sleep (500);}
catch (InterruptedException f) { }
144 EAIinThreadtoBrowserPipe =
new PipedWriter();
145 BrowserfromEAIPipe =
new PipedReader(EAIinThreadtoBrowserPipe);
146 }
catch (IOException ie) {
147 System.out.println (
"EAI: caught error in new PipedReader: " + ie);
150 EAIinThreadtoBrowser =
new PrintWriter(EAIinThreadtoBrowserPipe);
151 BrowserfromEAI =
new BufferedReader (BrowserfromEAIPipe);
161 EAIinThreadtoBrowserPipe =
new PipedWriter();
162 BrowserfromEAIPipe =
new PipedReader(EAIinThreadtoBrowserPipe);
163 }
catch (IOException ie) {
164 System.out.println (
"EAI: caught error in new PipedReader: " + ie);
167 EAIinThreadtoBrowser =
new PrintWriter(EAIinThreadtoBrowserPipe);
168 BrowserfromEAI =
new BufferedReader (BrowserfromEAIPipe);
171 FreeWRLThread =
new Thread (
new EAIinThread(sock, pApplet,
172 EAIinThreadtoBrowser,
this));
173 FreeWRLThread.start();
186 EAIout =
new PrintWriter (sock.getOutputStream());
187 }
catch (IOException e) {
188 System.out.print (
"EAI: Problem in handshaking with Browser");
194 EAIoutSender.start();
204 public Browser(Applet pApplet) {
212 while (EAISocket == null) {
214 EAISocket =
new Socket(
"localhost",9877);
215 }
catch (IOException e) {
217 counter = counter + 1;
219 System.out.println (
"EAI: Java code timed out finding FreeWRL");
222 try {Thread.sleep (500);}
catch (InterruptedException f) { }
235 EAIinThreadtoBrowserPipe =
new PipedWriter();
236 BrowserfromEAIPipe =
new PipedReader(EAIinThreadtoBrowserPipe);
237 }
catch (IOException ie) {
238 System.out.println (
"EAI: caught error in new PipedReader: " + ie);
241 EAIinThreadtoBrowser =
new PrintWriter(EAIinThreadtoBrowserPipe);
242 BrowserfromEAI =
new BufferedReader (BrowserfromEAIPipe);
245 FreeWRLThread =
new Thread (
new EAIinThread(sock, pApplet,
246 EAIinThreadtoBrowser,
this));
247 FreeWRLThread.start();
260 EAIout =
new PrintWriter (sock.getOutputStream());
261 }
catch (IOException e) {
262 System.out.print (
"EAI: Problem in handshaking with Browser");
268 EAIoutSender.start();
279 public Browser(Applet pApplet, String frameName,
int index) {
280 System.out.println (
"Browser2 Not Implemented");
285 public String getName() {
287 synchronized (FreeWRLToken) {
288 EAIoutSender.send (
"" + queryno +
"K\n");
289 retval = getVRMLreply(queryno);
295 public String getVersion() {
297 synchronized (FreeWRLToken) {
298 EAIoutSender.send (
"" + queryno +
"L\n");
299 retval = getVRMLreply(queryno);
306 public int getEncoding() {
308 synchronized (FreeWRLToken) {
309 EAIoutSender.send (
"" + queryno +
"Y\n");
310 retval = getVRMLreply(queryno);
313 return Integer.valueOf(retval).intValue();
316 public float getCurrentSpeed() {
318 synchronized (FreeWRLToken) {
319 EAIoutSender.send (
"" + queryno +
"M\n");
320 retval = getVRMLreply(queryno);
323 return Float.valueOf(retval).floatValue();
327 public float getCurrentFrameRate() {
329 synchronized (FreeWRLToken) {
330 EAIoutSender.send (
"" + queryno +
"N\n");
331 retval = getVRMLreply(queryno);
334 return Float.valueOf(retval).floatValue();
339 public String getWorldURL() {
341 synchronized (FreeWRLToken) {
342 EAIoutSender.send (
"" + queryno +
"O\n");
343 retval = getVRMLreply(queryno);
350 public String getRenderingProperties() {
352 synchronized (FreeWRLToken) {
353 EAIoutSender.send (
"" + queryno +
"X\n");
354 retval = getVRMLreply(queryno);
361 public void replaceWorld(
Node[] nodes)
362 throws IllegalArgumentException {
364 String SysString =
"";
368 for (count=0; count<nodes.length; count++) {
369 SysString = SysString +
" " + nodes[count].nodeptr;
372 synchronized (FreeWRLToken) {
373 EAIoutSender.send (
"" + queryno +
"P" + SysString);
374 retval = getVRMLreply(queryno);
383 public void loadURL(String[] url, String[] parameter) {
384 String SysString =
"";
389 SysString =
"" + url.length +
" " + parameter.length;
391 for (count=0; count<url.length; count++) {
392 SysString = SysString +
" :loadURLStringBreak:" + url[count];
395 for (count=0; count<parameter.length; count++) {
396 SysString = SysString +
" :loadURLStringBreak:" + parameter[count];
399 synchronized (FreeWRLToken) {
400 EAIoutSender.send (
"" + queryno +
"Q" + SysString);
401 retval = getVRMLreply(queryno);
407 static void do_vp(String vp) {
410 synchronized (FreeWRLToken) {
411 EAIoutSender.send (
"" + queryno +
"R " + vp);
412 retval = getVRMLreply(queryno);
418 public void firstViewpoint() {do_vp(
"FIRST");}
419 public void lastViewpoint() {do_vp(
"LAST");}
420 public void nextViewpoint() {do_vp(
"NEXT");}
421 public void previousViewpoint() {do_vp(
"PREV");}
429 public void setDescription(String description) {
430 descript = description;
434 public String getDescription() {
441 public Node[] createX3DFromString(String vrmlSyntax)
445 StringTokenizer tokens;
450 synchronized (FreeWRLToken) {
451 EAIoutSender.send (
"" +queryno +
"o \n"+vrmlSyntax+
"\nEOT\n");
452 retval = getVRMLreply(queryno);
456 tokens =
new StringTokenizer (retval);
459 x =
new Node[tokens.countTokens()];
464 while (tokens.hasMoreTokens()) {
465 x[count] =
new Node();
466 x[count].nodeptr = Integer.parseInt(tokens.nextToken());
468 x[count].datasize = 4;
469 x[count].datatype =
"h";
478 System.out.println (
"EAI: createX3DFromString - warning, tied to 100 nodes");
487 public Node[] createVrmlFromString(String vrmlSyntax)
491 StringTokenizer tokens;
496 synchronized (FreeWRLToken) {
497 EAIoutSender.send (
"" +queryno +
"S #VRML V2.0 utf8\n"+vrmlSyntax+
"\nEOT\n");
498 retval = getVRMLreply(queryno);
502 tokens =
new StringTokenizer (retval);
505 x =
new Node[tokens.countTokens()];
510 while (tokens.hasMoreTokens()) {
511 x[count] =
new Node();
512 x[count].nodeptr = Integer.parseInt(tokens.nextToken());
514 x[count].datasize = 4;
515 x[count].datatype =
"h";
524 System.out.println (
"EAI: createVrmlFromString - warning, tied to 100 nodes");
534 public String createNode (String name) {
537 synchronized (FreeWRLToken) {
538 EAIoutSender.send (
"" + queryno +
"a" + name +
"\n");
539 retval = getVRMLreply(queryno);
546 public String createProto (String name) {
549 synchronized (FreeWRLToken) {
550 EAIoutSender.send (
"" + queryno +
"b" + name +
"\n");
551 retval = getVRMLreply(queryno);
557 public String updateNamedNode (String name,
Node node) {
560 synchronized (FreeWRLToken) {
561 EAIoutSender.send (
"" + queryno +
"c" + name +
" " + node.nodeptr +
"\n");
562 retval = getVRMLreply(queryno);
568 public String removeNamedNode (String name) {
571 synchronized (FreeWRLToken) {
572 EAIoutSender.send (
"" + queryno +
"d" + name +
"\n");
573 retval = getVRMLreply(queryno);
580 public String getProtoDeclaration (String name) {
583 synchronized (FreeWRLToken) {
584 EAIoutSender.send (
"" + queryno +
"e" + name +
"\n");
585 retval = getVRMLreply(queryno);
591 public String updateProtoDeclaration (String name, String newProtoDecl) {
594 synchronized (FreeWRLToken) {
595 EAIoutSender.send (
"" + queryno +
"f" + name +
" " + newProtoDecl +
"\n");
596 retval = getVRMLreply(queryno);
602 public String removeProtoDeclaration (String name) {
605 synchronized (FreeWRLToken) {
606 EAIoutSender.send (
"" + queryno +
"g" + name +
"\n");
607 retval = getVRMLreply(queryno);
613 public String getNodeFieldDefs (
Node myn) {
615 synchronized (FreeWRLToken) {
616 EAIoutSender.send (
"" + queryno +
"h" + myn.nodeptr +
"\n");
617 retval = getVRMLreply(queryno);
623 public String getNodeDEFName (
Node myn) {
626 synchronized (FreeWRLToken) {
627 EAIoutSender.send (
"" + queryno +
"i" + myn.nodeptr +
"\n");
628 retval = getVRMLreply(queryno);
634 public String getRoutes () {
637 synchronized (FreeWRLToken) {
638 EAIoutSender.send (
"" + queryno +
"j\n");
639 retval = getVRMLreply(queryno);
645 public String getNodeType (
Node myn) {
648 synchronized (FreeWRLToken) {
649 EAIoutSender.send (
"" + queryno +
"k " + myn.nodeptr +
"\n");
650 retval = getVRMLreply(queryno);
660 public void createVrmlFromURL(String[] url,
667 StringTokenizer tokens;
671 synchronized (FreeWRLToken) {
672 EAIoutSender.send (
"" + queryno +
"T " + url[0] +
"\n");
674 retval = getVRMLreply(queryno);
676 tokens =
new StringTokenizer (retval);
678 x =
new Node[tokens.countTokens()];
680 while (tokens.hasMoreTokens()) {
681 x[count] =
new Node();
682 x[count].nodeptr = Integer.parseInt(tokens.nextToken());
684 x[count].datasize = 4;
685 x[count].datatype =
"h";
703 public void addRoute(
Node fromNode, String fromEventOut,
704 Node toNode, String toEventIn)
throws
705 IllegalArgumentException {
708 synchronized (FreeWRLToken) {
709 EAIoutSender.send (
"" + queryno +
"H " + fromNode.nodeptr +
" " + fromEventOut +
710 " " + toNode.nodeptr +
" " + toEventIn +
"\n");
711 retval = getVRMLreply(queryno);
718 public void deleteRoute(
Node fromNode, String fromEventOut,
719 Node toNode, String toEventIn)
720 throws IllegalArgumentException {
723 synchronized (FreeWRLToken) {
724 EAIoutSender.send (
"" + queryno +
"J " + fromNode.nodeptr +
" " + fromEventOut +
725 " " + toNode.nodeptr +
" " + toEventIn +
"\n");
726 retval = getVRMLreply(queryno);
733 public void beginUpdate() {}
734 public void endUpdate() {}
737 public void initialize() {
738 System.out.println (
"EAI: Initialize Not Implemented");
744 public void shutdown() {
745 System.out.println (
"EAI: Shutdown Not Implemented");
751 static public Browser getBrowser(Applet pApplet) {
755 static public Browser getBrowser(Applet pApplet,
int portnum) {
756 return (
new Browser(pApplet, portnum));
761 static public Browser getBrowser(Applet pApplet, String frameName,
int index) {
763 Browser x = getBrowser(pApplet);
764 System.out.println (
"EAI: getBrowser possibly Not Implemented");
779 StringTokenizer tokens;
784 synchronized (FreeWRLToken) {
785 EAIoutSender.send (
"" + queryno +
"A " + getName +
"\n");
786 retval = getVRMLreply(queryno);
789 tokens =
new StringTokenizer (retval);
791 temp.nodeptr = Integer.parseInt(tokens.nextToken());
794 if (temp.nodeptr == 0)
807 public static void SendChildEvent (
int parent,
int offset, String FieldName,
int Child) {
813 synchronized (FreeWRLToken) {
814 EAIoutSender.send (
"" + queryno +
"C " + parent +
" " + offset +
" " +
815 FieldName +
" "+ Child +
"\n");
816 retval = getVRMLreply(queryno);
823 public static void newSendEvent (
EventIn node, String Value) {
824 synchronized (FreeWRLToken) {
825 EAIoutSender.send (
"" + queryno +
"D" + node.datatype +
" " +
826 node.nodeptr +
" " + node.offset +
" " +node.ScriptType +
" " + Value +
"\n");
833 protected static String SendNodeEAIType (
int nodeptr) {
839 synchronized (FreeWRLToken) {
840 EAIoutSender.send (
"" + queryno +
"B " + nodeptr +
"\n");
841 retval = getVRMLreply(queryno);
846 protected static String SendEventType (
int nodeptr, String FieldName, String direction) {
852 synchronized (FreeWRLToken) {
853 EAIoutSender.send (
"" + queryno +
"F " + nodeptr +
" " +
854 FieldName +
" " + direction +
"\n");
855 retval = getVRMLreply(queryno);
861 public static String SendEventOut (
int nodeptr,
int offset,
int datasize, String datatype,
868 synchronized (FreeWRLToken) {
869 EAIoutSender.send (
"" + queryno +
"E " + nodeptr +
" " + offset +
" " + datatype +
870 " " + datasize +
"\n");
872 retval = getVRMLreply(queryno);
880 int nodeptr,
int offset, String datatype,
int datasize,
int EventType)
882 synchronized (FreeWRLToken) {
887 EAIoutSender.send (
"" + queryno +
"G " + nodeptr +
" " + offset +
" " + datatype +
888 " " + datasize +
"\n");
890 BrowserGlobals.EVarray [BrowserGlobals.EVno] = queryno;
891 BrowserGlobals.EVtype [BrowserGlobals.EVno] = EventType;
892 BrowserGlobals.EVObject[BrowserGlobals.EVno] = userData;
893 BrowserGlobals.EVObserver[BrowserGlobals.EVno] = f;
895 BrowserGlobals.EVno += 1;
897 getVRMLreply(queryno);
903 int nodeptr,
int offset, String datatype,
int datasize,
int EventType)
905 synchronized (FreeWRLToken) {
910 EAIoutSender.send (
"" + queryno +
"W " + nodeptr +
" " + offset +
" " + datatype +
911 " " + datasize +
"\n");
920 getVRMLreply(queryno);
925 protected synchronized static String getVRMLreply (
int queryno)
936 while (queryno != Integer.parseInt(req)) {
938 req = BrowserfromEAI.readLine();
939 }
catch (IOException ie) {
940 System.out.println (
"EAI: caught " + ie);
944 if (queryno != Integer.parseInt(req)) {
945 System.out.println (
"EAI: getVRMLreply - REPLIES MIXED UP!!! Expecting "
951 rep = BrowserfromEAI.readLine();
952 }
catch (IOException ie) { System.out.println (
"EAI: getVRMLreply failed");
return null; }
959 public void close() {
960 System.out.println(
"EAI: closing socket");