## ###
#  IP: GHIDRA
# 
#  Licensed under the Apache License, Version 2.0 (the "License");
#  you may not use this file except in compliance with the License.
#  You may obtain a copy of the License at
#  
#       http://www.apache.org/licenses/LICENSE-2.0
#  
#  Unless required by applicable law or agreed to in writing, software
#  distributed under the License is distributed on an "AS IS" BASIS,
#  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
#  See the License for the specific language governing permissions and
#  limitations under the License.
##
# An example of asking for user input.

# Note the ability to pre-populate values for some of these variables when AskScript.properties file exists.
# Also notice how the previous input is saved.

# DISCLAIMER: This is a recreation of a Java Ghidra script for example
# use only. Please run the Java version in a production environment.

#@category Examples.Python

from ghidra.framework.model import DomainFile
from ghidra.framework.model import DomainFolder
from ghidra.program.model.address import Address
from ghidra.program.model.lang import LanguageCompilerSpecPair
from ghidra.program.model.listing import Program
from ghidra.util import Msg

from java.lang import IllegalArgumentException

# The presence of the AskScript.properties file in the same location (as AskScript.java) 
# allows for the following behavior:
#		- GUI: if applicable, auto-populates the input field with the value in the 
#			.properties file (the first	time that input	field appears)
#   	- Headless: uses the value in the .properties file for the variable assigned to the
#			corresponding askXxx() method in the GhidraScript.
try:
    file1 = askFile("FILE", "Choose file:")
    print "file was: " + str(file1)

    directory1 = askDirectory("Directory", "Choose directory:")
    print "directory was: " + str(directory1)

    lang = askLanguage("Language Picker", "I want this one!")
    print "language was: " + lang.toString()

    domFolder = askProjectFolder("Please pick a domain folder!")
    print "domFolder was: " + domFolder.getName()

    int1 = askInt("integer 1", "enter integer 1")
    int2 = askInt("integer 2", "enter integer 2")
    print "int1 + int2 = " + str(int1 + int2)

    long1 = askLong("long 1", "enter long 1")
    long2 = askLong("long 2", "enter long 2")
    print "long1 + long2 = " + str(long1 + long2)

    address1 = askAddress("address 1", "enter address 1")
    address2 = askAddress("address 2", "enter address 2")
    print "address1 + address2 = " + address1.add(address2.getOffset()).toString()

    #bytes = askBytes("bytes", "enter byte pattern")
    #for b in bytes: 
    #   print "b = " + str(b & 0xff)
			
    prog = askProgram("Please choose a program to open.")
    print "Program picked: " + prog.getName()

    domFile = askDomainFile("Which domain file would you like?")
    print "Domain file: " + domFile.getName()

    d1 = askDouble("double 1", "enter double 1")
    d2 = askDouble("double 2", "enter double 2")
    print "d1 + d2 = " + str(d1 + d2)

    myStr = askString("String Specification", "Please type a string: ")
    myOtherStr = askString("Another String Specification", "Please type another string: ", "replace me!")
    print "You typed: " + myStr + " and " + myOtherStr

    choice = askChoice("Choice", "Please choose one", [ "grumpy", "dopey", "sleepy", "doc", "bashful" ], "bashful")
    print "Choice? " + choice

    choices1 = askChoices("Choices 1", "Please choose one or more numbers.", [ 1, 2, 3, 4, 5, 6 ])
    print "Choices 1: "
    for intChoice in choices1: 
        print str(intChoice) + " "
    print ""

    choices2 = askChoices("Choices 2", "Please choose one or more of the following.", 
        [ 1.1, 2.2, 3.3, 4.4, 5.5, 6.6 ], ["Part 1", "Part 2", "Part 3", "Part 4", "Part 5", "Part 6" ])
    print "Choices 2: "
    for intChoice in choices2:
        print str(intChoice) + " "	
    print ""

    yesOrNo = askYesNo("yes or no", "is this a yes/no question?")
    print "Yes or No? " + str(yesOrNo)

except IllegalArgumentException as error:
    Msg.warn(self, "Error during headless processing: " + error.toString())
	
