// Copyright (c) 2011 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include "base/file_version_info_mac.h"

#import <Foundation/Foundation.h>

#include "base/file_path.h"
#include "base/logging.h"
#include "base/mac/foundation_util.h"
#include "base/sys_string_conversions.h"

FileVersionInfoMac::FileVersionInfoMac(NSBundle *bundle)
    : bundle_([bundle retain]) {
}

FileVersionInfoMac::~FileVersionInfoMac() {}

// static
FileVersionInfo* FileVersionInfo::CreateFileVersionInfoForCurrentModule() {
  return CreateFileVersionInfo(base::mac::MainAppBundlePath());
}

// static
FileVersionInfo* FileVersionInfo::CreateFileVersionInfo(
    const FilePath& file_path) {
  NSString* path = base::SysUTF8ToNSString(file_path.value());
  NSBundle* bundle = [NSBundle bundleWithPath:path];
  return new FileVersionInfoMac(bundle);
}

string16 FileVersionInfoMac::company_name() {
  return string16();
}

string16 FileVersionInfoMac::company_short_name() {
  return string16();
}

string16 FileVersionInfoMac::internal_name() {
  return string16();
}

string16 FileVersionInfoMac::product_name() {
  return GetString16Value(kCFBundleNameKey);
}

string16 FileVersionInfoMac::product_short_name() {
  return GetString16Value(kCFBundleNameKey);
}

string16 FileVersionInfoMac::comments() {
  return string16();
}

string16 FileVersionInfoMac::legal_copyright() {
  return GetString16Value(CFSTR("CFBundleGetInfoString"));
}

string16 FileVersionInfoMac::product_version() {
  return GetString16Value(CFSTR("CFBundleShortVersionString"));
}

string16 FileVersionInfoMac::file_description() {
  return string16();
}

string16 FileVersionInfoMac::legal_trademarks() {
  return string16();
}

string16 FileVersionInfoMac::private_build() {
  return string16();
}

string16 FileVersionInfoMac::file_version() {
  return product_version();
}

string16 FileVersionInfoMac::original_filename() {
  return GetString16Value(kCFBundleNameKey);
}

string16 FileVersionInfoMac::special_build() {
  return string16();
}

string16 FileVersionInfoMac::last_change() {
  return GetString16Value(CFSTR("SVNRevision"));
}

bool FileVersionInfoMac::is_official_build() {
#if defined (GOOGLE_CHROME_BUILD)
  return true;
#else
  return false;
#endif
}

string16 FileVersionInfoMac::GetString16Value(CFStringRef name) {
  if (bundle_) {
    NSString *ns_name = base::mac::CFToNSCast(name);
    NSString* value = [bundle_ objectForInfoDictionaryKey:ns_name];
    if (value) {
      return base::SysNSStringToUTF16(value);
    }
  }
  return string16();
}
