#!/usr/bin/python2.4
#
# Copyright 2008-2009 Google Inc.
#
# 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.
# ========================================================================

"""
mage.exe does not provide a way to add the trustURLParameters attribute to an
application manifest. This script fills that gap. It also adds in the
localized display name, to get around issues with the Python commands
module.
"""

import sys
import os
import getopt
import commands


def _AddTrustURLParametersAndName(manifest_file, output_file, display_name):
  f_in = open(manifest_file, 'r')
  manifest_contents = f_in.read()
  f_in.close()

  manifest_contents = manifest_contents.replace('<deployment ', \
      '<deployment trustURLParameters="true" ')
  manifest_contents = manifest_contents.replace('\"xxxXXXxxx', \
      '\"%s' % display_name)

  f_out = open(output_file, 'w')
  # Works without needing to write the codecs.BOM_UTF8 at the beginning of the
  # file. May need to write this at some point though.
  f_out.write(manifest_contents)
  f_out.close()


def _Usage():
  """Prints out script usage information."""
  print """
add_trusturlparams.py: Modify the given manifest file by adding in a
trustURLParameters=true to the deployment section. Also substitutes
the dummy name xxxXXXxxx with the localized display name.

Usage:
  add_trusturlparams.py [--help
                         | --manifest_file filename
                         | --output_file filename
                           --display_name {i18n display name}]

Options:
  --help                    Show this information.
  --manifest_file filename     Path/name of input/output manifest file.
  --output_file filename       Path/name of an optional output manifest file.
  --display_name  name         i18n display name.
"""


def _Main():
  # use getopt to parse the option and argument list; this may raise, but
  # don't catch it
  _ARGUMENT_LIST = ["help", "manifest_file=", "output_file=", "display_name="]
  (opts, args) = getopt.getopt(sys.argv[1:], "", _ARGUMENT_LIST)
  if not opts or ("--help", "") in opts:
    _Usage()
    sys.exit()

  manifest_file = ""
  output_file = ""
  display_name = ""

  for (o, v) in opts:
    if o == "--manifest_file":
      manifest_file = v
    if o == "--output_file":
      output_file = v
    if o == "--display_name":
      display_name = v

  # make sure we have work to do
  if not manifest_file:
    raise SystemExit("no manifest_filename specified")
  if not display_name:
    raise SystemExit("no display_name specified")

  # overwrite existing file if no separate output specified
  if not output_file:
    output_file = manifest_file

  _AddTrustURLParametersAndName(manifest_file, output_file, display_name)
  sys.exit()


if __name__ == "__main__":
  _Main()

