// Copyright 2007-2009 Google Inc.
// Copyright 2013 Alexander Sedov <support@schat.me>
//
// 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.
// ========================================================================

#include <QCoreApplication>
#include <QFile>
#include <QFileInfo>
#include <QStringList>
#include <QTextStream>

#include "ApplyTag.h"

using namespace omaha;

int main(int argc, char *argv[])
{
  QCoreApplication app(argc, argv);
  QTextStream out(stdout);
  const QStringList args = app.arguments();

  if (args.size() != 4) {
    out << "Incorrect number of arguments!" << endl;
    out << "Usage: " << QFileInfo(app.applicationFilePath()).fileName() << " <signed file> <output file> <tag file>" << endl;
    return -1;
  }

  QFile tagFile(args.at(3));
  if (!tagFile.exists() || !tagFile.open(QFile::ReadOnly)) {
    out << "File \"" << tagFile.fileName() << "\" not readable!" << endl;
    return ApplyTag::TagFileUnreadable;
  }

  if (tagFile.size() > 65536) {
    out << "File \"" << tagFile.fileName() << "\" too big! Maximum allowed size 65536 bytes." << endl;
    return ApplyTag::TagTooBig;
  }


  ApplyTag tag;
  int result = tag.init(args.at(1), args.at(2), tagFile.readAll());
  if (result) {
    if (result == ApplyTag::BadTagFormat)
      out << "Tag contains invalid data!" << endl;
    else if (result == ApplyTag::SignedExeFileNotExists)
      out << "Signed file \"" << args.at(1) << "\" not exists!" << endl;
    else if (result == ApplyTag::TaggedFileUnwritable)
      out << "Tagged file \"" << args.at(2) << "\" not writable!" << endl;

    return result;
  }

  result = tag.embedTagString();
  if (result == ApplyTag::WriteError)
    out << "Write error, may input file is not signed." << endl;

  return result;
}
