// EIKSNDSL.CPP
//
// Copyright (c) 1997-1999 Symbian Ltd.  All rights reserved.
//

#include <eiksndsl.h>
#include <eikchlst.hrh>
#include <bamatch.h>
#include <barsread.h>
#include <badesca.h>
#include <basndut.h>
#include <eikenv.h>
#include <d32snd.h>

#include <eikon.rsg>

EXPORT_C CEikSoundSelector::CEikSoundSelector()
	//
	// c'tor
	//
	{
	}

EXPORT_C CEikSoundSelector::~CEikSoundSelector()
	//
	// d'tor
	//
	{
	}

EXPORT_C void CEikSoundSelector::ConstructFromResourceL(TResourceReader& /*aReader*/)
	//
	// resource specific construction
	//
    {
	ConstructL();
    }

EXPORT_C void CEikSoundSelector::ConstructL()
	//
	// construction common to both resource and non-resource sound selectors
	//
	{
	// ConstructTabButtonL();
	iArray=new(ELeave) CDesCArrayFlat(4);
	RFs& fsSession=iEikonEnv->FsSession();
	RDevSound devSound;
	TInt err=devSound.Open();
	if (!err)
		{
		err=SoundUtilities::PopulateSoundNameList(fsSession, devSound, *((CDesCArray*)iArray));
		devSound.Close();
		}
	switch (err)
		{
	case KErrNone:
	case KErrNoMemory:
		break;	// doesn't matter since "silent" will always be present
	case KErrInUse:
		iEikonEnv->InfoMsg(R_EIK_TBUF_ONLY_SILENT_ALARMS);
		break;
	default:
		User::Leave(err);
		break;
		}
	TBuf<20> silent;
	iEikonEnv->ReadResource(silent, R_EIK_TBUF_SILENT);
	((CDesCArray*)iArray)->AppendL(silent);
	iMatchBuf=new(ELeave)RIncrMatcherBuf<KEikMaxMatchingBufLength>;
	}

EXPORT_C void CEikSoundSelector::SetSound(const TDesC& aSound)
	{
	TInt currentIndex=0;
	TInt count=iArray->MdcaCount();
	TBool found=EFalse;
	for (TInt i=0; i<count; i++)
		{
		if (iArray->MdcaPoint(i)==aSound)
			{
			currentIndex=i;
			found=ETrue;
			break;
			}
		}
	if (!(aSound.Length())) 	
		{
		currentIndex=count-1; // silent
		found=ETrue;
		}
	if (!found)
		currentIndex=Max(0, FindAlgorithmicSound());
	SetCurrentItem(currentIndex);
	}

EXPORT_C void CEikSoundSelector::GetSound(TDes& aSound) const
	{
	TInt currentIndex=CurrentItem();
	if (currentIndex==iArray->MdcaCount()-1) // silent
		aSound.Zero();
	else
		aSound.Copy(iArray->MdcaPoint(currentIndex));
	}

TInt CEikSoundSelector::FindAlgorithmicSound() const
	//
	// Find the first algorithmic sound 
	//
	{
	RDevSound devSound;
	TInt err=devSound.Open();
	if (err==KErrNone)
		{
		TName name;
		err=devSound.AlarmSoundName(0, name); // 1st algorithmic sound)
		if (err==KErrNone)
			{
			for (TInt i=0; i<iArray->MdcaCount(); i++)
				{
				if (iArray->MdcaPoint(i)==name)
					{
					err=i;
					break;
					}
				}
			}
		devSound.Close();
		}
	return err;
	}

