Newer
Older
exporter / exporter.py
#! /usr/bin/python

import socket
import subprocess
import errno
import sys
import os
import json
import traceback
import shlex

class ArgParser:
  def __init__(self):
    self.i = 0
    self.args = []

  def parse_type(self, make_type):
    opt = self.args[self.i]
    self.i += 1
    if self.i >= len(self.args):
      return ("Not enough params to " + opt, None)
    val = None
    try:
      val = self.args[self.i] if make_type is None else make_type(self.args[self.i])
    except Exception, e:
      pass
    if val is None:
      return ("Bad argument to " + opt + ": " + self.args[self.i], None)
    return (None, val)

  def possible(self, opts, make_type):
    return lambda v: make_type(v) if v in opts else None

  def condition(self, make_type, condition):
    return lambda v: make_type(v) if condition(make_type(v)) else None

  def parse_args(self, args):
    self.args = args
    self.i = 0
    ret = {"input":[]}
    allow_opts = True

    while self.i < len(self.args):
      arg = self.args[self.i].strip()
      if arg == "--":
        allow_opts = False
        continue

      if arg == "--port" or arg == "-p":
        (msg, p) = self.parse_type(int)
        if msg is not None:
          return (msg, None)
        ret["port"] = p
      elif arg == "--type" or arg == "-t":
        (msg, t) = self.parse_type(self.possible(["1", "3"], int))
        if msg is not None:
          return (msg, None)
        ret["type"] = t
      elif arg == "--scale" or arg == "-s":
        (msg, s) = self.parse_type(self.condition(int, lambda s: s > 0.00001))
        if msg is not None:
          return (msg, None)
        ret["scale"] = s
      else:
        ret["input"].append(arg)
      self.i += 1
    return (None, ret)
      
port = 7890

(err, args) = ArgParser().parse_args(sys.argv[1:])
if err is not None:
  print err
  sys.exit(2)

print args

sys.exit(0)

s = socket.socket()
s.bind(("localhost", port))

args = [os.getcwd() + "/GraphicExport.exe"]
# args = [os.getcwd() + "/GraphicExport.app/GraphicExport.exe", str(port)]
g = subprocess.Popen(args, stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE)

s.settimeout(0.5)
s.listen(0)

conn = None
while conn is None and g.returncode is None:
  try:
    (conn, _) = s.accept()
  except socket.timeout, e:
      pass
  except e:
    print e
    s.close()
    g.wait()
    sys.exit(1)
  g.poll()

if conn:
  conn.setblocking(False)

  conn.send("EXPORT|" + "|".join(sys.argv[1:]) + "\0")

while g.returncode is None:
  try:
    d = conn.recv(4096)
    if len(d):
      sys.stdout.write(d)
      sys.stdout.flush()
  except socket.error, e:
    if e.args[0] == errno.EWOULDBLOCK or e.args[0] == errno.EAGAIN:
      pass
    else:
      print e
      conn.close()
      s.close()
      g.wait()
      sys.exit(1)
  g.poll()

if (conn):
  conn.close()
s.close()