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

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

def parse_args(args, inputs):
  i = 0
  options = [a for a in args if "options" in a]
  values = [a for a in args if "name" in a]
  # find options, like --port, or -f
  while i < len(args):
    arg = args[i].strip()
    if arg == "--":
      # after --, we only have positional arguments
      break
    if len(arg) and arg[0] == "-"
      for o in options:
        if arg in o["options"]:
          num_values = 1
          if "num_values" in o and o["num_values"] != "*":
            num_values = int(o["num_values"])
            if i == len(args) - num_values:
              print "Not enough values for " + arg
          vals = []
          while num_values > 0:
            i += 1
            vals.append(args[i])
            num_values -= 1
    i += 1

port = 7890

job_parser = ArgumentParser(description="Specify an export job")
job_parser.add_argument("input_swf", help="location of a .swf file to export")
job_parser.add_argument("-t", "--type", default=1, help="export type: 1=spritesheet, 3=skeletal", choices=[1,3])

desc = "Export .swf files, either from the command line or piped from stdin"
cmd_parser_base = ArgumentParser(description=desc)
cmd_parser_base.add_argument("-p", "--port", default=port, help="port to use for the wrapper server", type=int)

cmd_parser_single = ArgumentParser(description=desc, parents=[cmd_parser_base, job_parser], conflict_handler="resolve")
cmd_parser_stdin = ArgumentParser(description=desc, parents=[cmd_parser_base], conflict_handler="resolve")
cmd_parser_stdin.add_argument("use_stdin", choices=["-"], help="parse export jobs from stdin")

#args_single = cmd_parser_single.parse_args_safe()
args_stdin = cmd_parser_stdin.parse_args_safe()
#if args_single is None:
#  #if args_stdin is None:
#  #  cmd_parser_single.print_usage()
#  #  cmd_parser_stdin.print_usage()
#  #  sys.exit(2)
#  #else:
#  #  print "read from stdin"
#  cmd_parser_single.print_usage()
#  pass
#else:
#  print "do single command: " + str(args_single)

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()