/***********************************************************************
 * 
 *  Copyright (C) 2005-2006 Novell, Inc. All Rights Reserved.
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License as published by the Free Software Foundation; version 2.1
 *  of the License.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Library Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, Novell, Inc.
 * 
 *  To contact Novell about this file by physical or electronic mail, 
 *  you may find current contact information at www.novell.com.
 * 
 ***********************************************************************/

//
// copyright 2003 Don Kackman - mailto:dkackman_2000@yahoo.com
//
// no warranty expressed or implied
// use however you'd like
//
using System;
using System.IO;
using System.Collections;

namespace VersionVDProj
{
	/// <summary>
	/// Class that updates the version info of MSI projects
	/// </summary>
	public class MSIProjectVersioner : VDProjectVersioner
	{
		private readonly static Guid MSI_PROJECT_TYPE = new Guid( "{978C614F-708E-4E1A-B201-565925725DBA}" );

		private Guid productCode = Guid.Empty;
		private Guid packageCode = Guid.Empty;
		private Guid upgradeCode = Guid.Empty;
		/// <summary>
		/// createas a new instance of the class
		/// </summary>
		/// <param name="file">the project file</param>
		public MSIProjectVersioner( FileInfo file ) : base( file, MSI_PROJECT_TYPE )
		{

		}

		protected override void SetOptions( Hashtable options )
		{
			// get the package code - generate if not specified
			if ( options.Contains("packagecode") )
				packageCode = new Guid( options["packagecode"].ToString() );
			else
				packageCode = Guid.NewGuid();

			// get the product code - set to package code if not specified
			if ( options.Contains("productcode") )
				productCode = new Guid( options["productcode"].ToString() );
			else
				productCode = packageCode;

			// get the upgrade code - leave empty if not specified
			if ( options.Contains("upgradecode") )
				upgradeCode = new Guid( options["upgradecode"].ToString() );
		}

		protected override string TranslateLine( string line )
		{
			// look for the properties we are interested in changing
			// if we find them, replace the old value with the new and return the new line string
			// otherwise just return the line string
			if ( line.IndexOf( "\"ProductVersion\"" ) != -1 )
				line = ReplaceValue( line, "ProductVersion", version.ThreePartVersion );
			
			else if ( productCode != Guid.Empty && line.IndexOf( "\"ProductCode\"" ) != -1 )
				line = ReplaceValue( line, "ProductCode", "{" + productCode.ToString().ToUpper() + "}" );

			else if ( packageCode != Guid.Empty && line.IndexOf( "\"PackageCode\"" ) != -1 )
				line = ReplaceValue( line, "PackageCode", "{" + packageCode.ToString().ToUpper() + "}" );

			else if ( upgradeCode != Guid.Empty && line.IndexOf( "\"UpgradeCode\"" ) != -1 )
				line = ReplaceValue( line, "UpgradeCode", "{" + upgradeCode.ToString().ToUpper() + "}" );

			return line;
		}
	}
}
