/*****************************************************************************/
// Copyright 2015-2019 Adobe Systems Incorporated
// All Rights Reserved.
//
// NOTICE:	Adobe permits you to use, modify, and distribute this file in
// accordance with the terms of the Adobe license agreement accompanying it.
/*****************************************************************************/

#include "dng_local_string.h"

/*****************************************************************************/

dng_local_string::dng_local_string ()

	:	fDefaultText ()
	,	fDictionary	 ()

	{

	}

/*****************************************************************************/

dng_local_string::dng_local_string (const dng_string &s)

	:	fDefaultText (s)
	,	fDictionary	 ()

	{

	}

/*****************************************************************************/

dng_local_string::~dng_local_string ()
	{

	}

/*****************************************************************************/

void dng_local_string::Clear ()
	{

	fDefaultText.Clear ();

	fDictionary.clear ();

	}

/*****************************************************************************/

void dng_local_string::SetDefaultText (const dng_string &s)
	{

	fDefaultText = s;

	}

/*****************************************************************************/

void dng_local_string::AddTranslation (const dng_string &language,
									   const dng_string &translation)
	{
	
	dng_string safeLanguage (language);
	
	safeLanguage.Truncate (255);

	fDictionary.push_back (dictionary_entry (safeLanguage,
											 translation));

	}

/*****************************************************************************/

void dng_local_string::Set (const char *s)
	{
	
	dng_string defaultText;
	
	defaultText.Set (s);
	
	*this = dng_local_string (defaultText);
	
	}

/*****************************************************************************/

const dng_string & dng_local_string::LocalText (const dng_string &locale) const
	{

	// Pass 1 - try for a match starting with the entire locale string.

	if (locale.Length () >= 5)
		{

		for (uint32 index = 0; index < TranslationCount (); index++)
			{

			if (Language (index).StartsWith (locale.Get (), false))
				{

				return Translation (index);

				}

			}

		}

	// Pass 2 - try for a language only match.

	if (locale.Length () >= 2)
		{

		dng_string languageOnly (locale);

		languageOnly.Truncate (2);

		for (uint32 index = 0; index < TranslationCount (); index++)
			{

			if (Language (index).StartsWith (languageOnly.Get (), false))
				{

				return Translation (index);

				}

			}

		}

	// Otherwise use default text.

	return DefaultText ();

	}

/*****************************************************************************/

bool dng_local_string::operator== (const dng_local_string &s) const
	{

	if (DefaultText () != s.DefaultText ())
		{
		return false;
		}

	if (TranslationCount () != s.TranslationCount ())
		{
		return false;
		}

	for (uint32 index = 0; index < TranslationCount (); index++)
		{

		if (Language (index) != s.Language (index))
			{
			return false;
			}

		if (Translation (index) != s.Translation (index))
			{
			return false;
			}

		}

	return true;

	}
			
/*****************************************************************************/

void dng_local_string::Truncate (uint32 maxBytes)
	{
	
	fDefaultText.Truncate (maxBytes);
	
	for (uint32 index = 0; index < TranslationCount (); index++)
		{
		
		fDictionary [index] . fTranslation . Truncate (maxBytes);

		}
	
	}
			
/*****************************************************************************/
