1# coding: utf-8
2
3import sys,getopt
4from base64 import *
5
6def usage():
7    print "usage:"
8    print " CsdrUpdater.py [OPTION] BinaryFileName"
9    print " [OPTION]"
10    print "  -i --intermediate= : Input editable .csdr file name, otherwise use DefaultShader.csdr."
11    print "  -o --output=       : Input output file name."
12    print "  -h --help          : Print help message."
13    print ""
14
15def main():
16    try:
17        options, arguments = getopt.getopt(sys.argv[1:], "i:o:s:h:", ["intermediate=", "output=", "shader=", "help="])
18    except getopt.GetoptError:
19        sys.exit()
20
21    binaryFileName = None
22    intermediateFileName = None
23    shaderName = None
24
25    for option, argument in options:
26        if option in ("-i", "--intermediate"):
27            intermediateFileName = argument
28        if option in ("-o", "--output"):
29            shaderName = argument
30        if option in ("-h", "--help"):
31            usage()
32            sys.exit()
33
34    if arguments:
35        binaryFileName = arguments[0]
36    else:
37        print "Please input binary file name."
38        sys.exit()
39
40    if intermediateFileName == None:
41        intermediateFileName = "DefaultShader.csdr"
42
43    try:
44        intermediateInput = open(intermediateFileName, 'rb')
45        binaryInput = open(binaryFileName, 'rb')
46    except IOError as error:
47        print(error)
48        sys.exit()
49
50    binary = binaryInput.read()
51    base64Binary = b64encode(binary)
52
53    binaryFileNameSplit = binaryFileName.split('.')
54    if shaderName == None:
55        shaderName = binaryFileNameSplit[0]
56
57    intermediate = intermediateInput.read()
58
59    if intermediate.find("<BinaryData>") < 0:
60        print("Intermediate file has no <BinaryData> Tag.")
61        sys.exit()
62    elif intermediate.find("</BinaryData>") < 0:
63        print("Intermediate file has no </BinaryData> Tag.")
64        sys.exit()
65
66    frontIntermediate = intermediate.split("<BinaryData>")[0]
67    backIntermediate = intermediate.split("</BinaryData>")[1]
68
69
70    csdrString = frontIntermediate + "<BinaryData>" + base64Binary + "</BinaryData>" + backIntermediate
71
72    if not shaderName.endswith(".csdr") and not shaderName.endswith(".cmdl"):
73        shaderName += ".csdr"
74
75    try:
76        output = open(shaderName, 'wb')
77        output.write(csdrString)
78    except:
79        print("Cannot write shader file.")
80
81if __name__ == "__main__":
82    if len(sys.argv) == 1:
83        exit(1)
84    else:
85        main()
86