+#!/usr/bin/python
+
+# CGI wrapper to qchess
+
+import sys
+import os
+
+import cgi
+import subprocess
+import time
+import threading
+
+
+def open_fifo(name, mode, timeout=None):
+ if timeout == None:
+ return open(name, mode)
+
+
+ class Worker(threading.Thread):
+ def __init__(self):
+ threading.Thread.__init__(self)
+ self.result = None
+
+ def run(self):
+ self.result = open(name, mode)
+
+
+ w = Worker()
+ w.start()
+
+ start = time.time()
+ while time.time() - start < timeout:
+ if w.is_alive() == False:
+ w.join()
+ return w.result
+ time.sleep(0.1)
+
+
+ if w.is_alive():
+ #sys.stderr.write("FIFO_TIMEOUT!\n")
+ if mode == "r":
+ f = open(name, "w")
+ else:
+ f = open(name, "r")
+
+ #sys.stderr.write("Opened other end!\n")
+ while w.is_alive():
+ time.sleep(0.1)
+
+ w.join()
+ f.close()
+ w.result.close()
+ raise Exception("FIFO_TIMEOUT")
+ else:
+ w.join()
+ return w.result
+
+def quit():
+ try:
+ fifo_out = open_fifo("../cgi-data/"+client+".in", "w", 5)
+ except:
+ pass
+ else:
+ fifo_out.write("quit\n")
+ fifo_out.close()
+
+ try:
+ fifo_in = open_fifo("../cgi-data/"+client+".out", "w", 5)
+ except:
+ pass
+ else:
+ s = fifo_in.readline().strip(" \r\n")
+ while s != "":
+ #print s
+ s = fifo_in.readline().strip(" \r\n")
+ fifo_in.close()
+ time.sleep(0.5)
+
+
+
+
+def main(argv):
+ global client
+ #form = cgi.FieldStorage()
+ #client = cgi.escape(os.environ["REMOTE_ADDR"])
+
+ client = "127.0.0.1"
+
+
+ print "Content-Type: text/plain\r\n\r\n"
+
+
+ try:
+ request = argv[1]
+ except:
+ request = None
+
+
+ try:
+ x = int(argv[1])
+ y = int(argv[2])
+ except:
+ if request == "quit":
+ quit()
+ return 0
+
+ if os.path.exists("../cgi-bin/"+client+".in") and os.path.exists("../cgi-bin/"+client+".out"):
+ print "Error: Game in progress expects x and y"
+ return 1
+ else:
+ print "NEW GAME"
+ args = ["./qchess.py"]
+ if request == None:
+ args += ["@fifo:../cgi-data/"+client, "@internal:AgentBishop"]
+ elif request == "eigengame":
+ args += ["--server=progcomp.ucc.asn.au", "@fifo:../cgi-data/"+client]
+ subprocess.Popen(args)
+ time.sleep(1)
+
+ else:
+
+ fifo_out = open_fifo("../cgi-data/"+client+".in", "w")
+ fifo_out.write("%d %d\n" % (x, y))
+ fifo_out.close()
+
+
+
+ sys.stderr.write("\ncgi read from fifo here\n")
+ try:
+ fifo_in = open_fifo("../cgi-data/"+client+".out", "r")
+ except:
+ quit()
+ else:
+ sys.stderr.write("Opened fine\n")
+ s = fifo_in.readline().strip(" \r\n")
+
+ while s != "SELECT?" and s != "MOVE?" and s.split(" ")[0] not in ["white", "black"]:
+ if s != "":
+ print s
+ s = fifo_in.readline().strip(" \r\n")
+ print s
+ fifo_in.close()
+ if s.split(" ")[0] in ["white", "black"]:
+ quit()
+
+ sys.stderr.write("Done\n")
+ return 0
+
+
+if __name__ == "__main__":
+ try:
+ sys.exit(main(sys.argv))
+ except Exception, e:
+ print "Exception: ", e
+ sys.exit(1)