breakdeps/coesndpy.cpp
author William Roberts <williamr@symbian.org>
Mon, 25 Oct 2010 17:26:54 +0100
changeset 80 3ab0df073c86
parent 55 f1c1302a0b48
permissions -rw-r--r--
Add support for "slim", which is "stem" + removal of some exports and checking of import details For this to work, the static_dependencies.txt file needs to contain the augmented dependency information. To help with this, it can now consume a mixture of both rom_content.csv lines and static_dependencies.txt lines: the best way to update the information would be something like (edit rom_content.csv to add "slim" to XXX.dll) findstr /i "xxx.dll" rom_content.csv > slim.txt findstr /i "xxx.dll" static_dependencies.txt >> slim.txt perl ..\tools\static_dependencies.pl -u static_dependencies.txt slim.txt > new_dependencies.txt This will notice the "slim" marking for xxx.dll, and record the detailed import and export lists for xxx.dll and everything which links to it. The new information will look something like sys\bin\xxx.dll /epoc32/release/armv5/urel/stem_xxx.dll exports=1-98.100-102:euser[100039e5].dll sys\bin\yyy.dll /epoc32/release/armv5/urel/yyy.dll euser[100039e5].dll:xxx[102750c7].dll@2.4-5.77.104-106:scppnwdl.dll sys\bin\zzz.dll /epoc32/release/armv5/urel/zzz.dll euser[100039e5].dll:xxx[102750c7].dll@23.25.74-77:scppnwdl.dll Only executables for which there is a "slim" marking will have this level of detail. The filtering script now does the detailed cross-checking of imports to exports for "slim" executables. In this case, it will observe the stem_xxx.dll does not export ordinal 104, and so the filtering will include deleting sys\bin\yyy.dll (xxx.dll Missing ordinal 104) sys\bin\zzz.dll will be acceptable, because it only uses ordinals which are still present in stem_xxx.dll

// Copyright (c) 1997-2009 Nokia Corporation and/or its subsidiary(-ies).
// All rights reserved.
// This component and the accompanying materials are made available
// under the terms of "Eclipse Public License v1.0"
// which accompanies this distribution, and is available
// at the URL "http://www.eclipse.org/legal/epl-v10.html".
//
// Initial Contributors:
// Nokia Corporation - initial contribution.
//
// Contributors:
//
// Description:
//

//#include <mda/client/utility.h>
//#include <mdaaudiosampleplayer.h>
//#include <mdaaudiotoneplayer.h>
#include <bassnd.h>
#include <coesndpy.h>
#include <coemain.h>
#include "coepanic.h"
#include <coeutils.h>

#if 0
const TUid KLafSoundPlayerUid={0x10005F1A};

class CCoeSoundPlayer;

//
// class MCoeSoundPlayerObserver
//

class MCoeSoundPlayerObserver
	{
public:
	virtual void PlayEnded(const CCoeSoundPlayer& aPlayer)=0;
	};

//
// class CCoeSoundPlayer
//

class CCoeSoundPlayer : public CBase
	{
public:
	~CCoeSoundPlayer();
public:
	inline const TBaSystemSoundInfo& SoundInfo() const;
	inline TBool IsPlaying() const;
	virtual void StartPlay()=0;
protected:
	CCoeSoundPlayer(MCoeSoundPlayerObserver& aObserver,const TBaSystemSoundInfo& aInfo,
						TInt aPlayCount,TTimeIntervalMicroSeconds32 aGap);
	void BaseConstructL();
	static TInt PlayTimerCallBack(TAny* aSelf);
private:
	virtual void Play()=0;
protected:
	MCoeSoundPlayerObserver& iObserver;
	TBaSystemSoundInfo iSoundInfo;
	TInt iPlayCount;
	TTimeIntervalMicroSeconds32 iGap;
	CPeriodic* iTimer;
	TBool iPlaying;
	};

inline const TBaSystemSoundInfo& CCoeSoundPlayer::SoundInfo() const
	{return iSoundInfo;}
inline TBool CCoeSoundPlayer::IsPlaying() const
	{return iPlaying;}

CCoeSoundPlayer::~CCoeSoundPlayer()
	{
	delete iTimer;
	}

CCoeSoundPlayer::CCoeSoundPlayer(MCoeSoundPlayerObserver& aObserver,const TBaSystemSoundInfo& aInfo,
									TInt aPlayCount,TTimeIntervalMicroSeconds32 aGap)
	: iObserver(aObserver), iSoundInfo(aInfo), iPlayCount(aPlayCount), iGap(aGap), iPlaying(EFalse)
	{}

void CCoeSoundPlayer::BaseConstructL()
	{
	}

TInt CCoeSoundPlayer::PlayTimerCallBack(TAny* aSelf)
	{ // static
	CCoeSoundPlayer* player=REINTERPRET_CAST(CCoeSoundPlayer*,aSelf);
	player->iTimer->Cancel();
	player->Play();
	return 0;
	}

//
// class CCoeTonePlayer
//

class CCoeTonePlayer : public CCoeSoundPlayer, public MMdaAudioToneObserver
	{
public:
	static CCoeTonePlayer* NewLC(MCoeSoundPlayerObserver& aObserver,const TBaSystemSoundInfo& aInfo,
									CMdaServer& aMdaServer,TInt aPlayCount,TTimeIntervalMicroSeconds32 aGap);
	~CCoeTonePlayer();
private:
	CCoeTonePlayer(MCoeSoundPlayerObserver& aObserver,const TBaSystemSoundInfo& aInfo,
						TInt aPlayCount,TTimeIntervalMicroSeconds32 aGap);
	void ConstructL(CMdaServer& aMdaServer);
private: // from CCoeSoundPlayer
	void StartPlay();
	void Play();
private: // from MMdaAudioToneObserver
	void MatoPrepareComplete(TInt aError);
	void MatoPlayComplete(TInt aError);
private:
	CMdaAudioToneUtility* iPlayUtility;
	};

CCoeTonePlayer* CCoeTonePlayer::NewLC(MCoeSoundPlayerObserver& aObserver,const TBaSystemSoundInfo& aInfo,
								CMdaServer& aMdaServer,TInt aPlayCount,TTimeIntervalMicroSeconds32 aGap)
	{ // static
	CCoeTonePlayer* self=new(ELeave) CCoeTonePlayer(aObserver,aInfo,aPlayCount,aGap);
	CleanupStack::PushL(self);
	self->ConstructL(aMdaServer);
	return self;
	}

CCoeTonePlayer::~CCoeTonePlayer()
	{
	delete iPlayUtility;
	}

CCoeTonePlayer::CCoeTonePlayer(MCoeSoundPlayerObserver& aObserver,const TBaSystemSoundInfo& aInfo,
					TInt aPlayCount,TTimeIntervalMicroSeconds32 aGap)
	: CCoeSoundPlayer(aObserver,aInfo,aPlayCount,aGap)
	{}

void CCoeTonePlayer::ConstructL(CMdaServer& aMdaServer)
	{
	iPlayUtility=CMdaAudioToneUtility::NewL(*this,&aMdaServer);
	BaseConstructL();
	}

void CCoeTonePlayer::StartPlay()
	{
	TBaSystemSoundInfo::TSoundCategory soundCat=iSoundInfo.SoundCategory();
	if (soundCat==TBaSystemSoundInfo::ESequence)
		iPlayUtility->PrepareToPlayFixedSequence(iSoundInfo.FixedSequenceNumber());
	else if (soundCat==TBaSystemSoundInfo::ETone)
		{
		TBaSystemSoundInfo::TTone tone=iSoundInfo.Tone();
		TInt64 time(tone.iDuration.Int());
		TTimeIntervalMicroSeconds duration(time);
		iPlayUtility->PrepareToPlayTone(tone.iFrequency,duration);
		}
	else
		iObserver.PlayEnded(*this);
	}

void CCoeTonePlayer::Play()
	{
    iPlayUtility->SetVolume(iSoundInfo.iVolume);
	iPlayUtility->Play();
	}

void CCoeTonePlayer::MatoPrepareComplete(TInt aError)
	{
	if (aError == KErrNone)
		{
		iPlayUtility->SetVolume(iSoundInfo.iVolume);
		iPlayUtility->SetPriority(iSoundInfo.iPriority,EMdaPriorityPreferenceNone);
		iPlaying=ETrue;
		if (--iPlayCount>0)
			{
			TInt64 val(iGap.Int());
			TTimeIntervalMicroSeconds gap(val);
			iPlayUtility->SetRepeats(iPlayCount,gap);
			}
		iPlayUtility->Play();
		}
	else
		iObserver.PlayEnded(*this);
	}

void CCoeTonePlayer::MatoPlayComplete(TInt /*aError*/)
	{
	iObserver.PlayEnded(*this);
	}

//
// class CCoeFilePlayer
//

class CCoeFilePlayer : public CCoeSoundPlayer, public MMdaAudioPlayerCallback
	{
public:
	static CCoeFilePlayer* NewLC(MCoeSoundPlayerObserver& aObserver,const TBaSystemSoundInfo& aInfo,
									TInt aPlayCount,TTimeIntervalMicroSeconds32 aGap);
	~CCoeFilePlayer();
private:
	CCoeFilePlayer(MCoeSoundPlayerObserver& aObserver,const TBaSystemSoundInfo& aInfo,
						TInt aPlayCount,TTimeIntervalMicroSeconds32 aGap);
	void ConstructL();
private: // from CCoeSoundPlayer
	void StartPlay();
	void Play();
private: // from MMdaAudioPlayerCallback
	void MapcInitComplete(TInt aStatus, const TTimeIntervalMicroSeconds& aDuration);
	void MapcPlayComplete(TInt aErr);
private:
	CMdaAudioPlayerUtility* iPlayUtility;
	TBool iReadyToPlay;
	};

CCoeFilePlayer* CCoeFilePlayer::NewLC(MCoeSoundPlayerObserver& aObserver,const TBaSystemSoundInfo& aInfo,
								TInt aPlayCount,TTimeIntervalMicroSeconds32 aGap)
	{ // static
	CCoeFilePlayer* self=new(ELeave) CCoeFilePlayer(aObserver,aInfo,aPlayCount,aGap);
	CleanupStack::PushL(self);
	self->ConstructL();
	return self;
	}

CCoeFilePlayer::~CCoeFilePlayer()
	{
	delete iPlayUtility;
	}

CCoeFilePlayer::CCoeFilePlayer(MCoeSoundPlayerObserver& aObserver,const TBaSystemSoundInfo& aInfo,
					TInt aPlayCount,TTimeIntervalMicroSeconds32 aGap)
	: CCoeSoundPlayer(aObserver,aInfo,aPlayCount,aGap)
	{}

void CCoeFilePlayer::ConstructL()
	{
	BaseConstructL();
	TFileName name=iSoundInfo.FileName();
	iPlayUtility=CMdaAudioPlayerUtility::NewFilePlayerL(name,*this,iSoundInfo.iPriority);
	}

void CCoeFilePlayer::StartPlay()
	{
	if (iReadyToPlay)
		Play();
	else
		iReadyToPlay=ETrue;
	}

void CCoeFilePlayer::Play()
	{
	if(iSoundInfo.iVolume > iPlayUtility->MaxVolume() )
		{
		iSoundInfo.iVolume = iPlayUtility->MaxVolume();
		}
	iPlayUtility->SetVolume(iSoundInfo.iVolume); 
	iPlaying=ETrue;
	iPlayUtility->Play();
	}

void CCoeFilePlayer::MapcInitComplete(TInt aStatus,const TTimeIntervalMicroSeconds& /*aDuration*/)
	{
	if (aStatus!=KErrNone)
		iObserver.PlayEnded(*this);
	else
		{
		iPlayUtility->SetVolume(iSoundInfo.iVolume);
		if (--iPlayCount>0)
			{
			TInt64 val(iGap.Int());
			TTimeIntervalMicroSeconds gap(val);
			iPlayUtility->SetRepeats(iPlayCount,gap);
			}
 		if (iReadyToPlay)
			{
			Play();
			}
 		else
			{
			iReadyToPlay=ETrue;
			}
   		}

	}

void CCoeFilePlayer::MapcPlayComplete(TInt /*aErr*/)
	{
	iObserver.PlayEnded(*this);
	}

//
// class CCoeSoundPlayerManager
//

class CCoeSoundPlayerManager : public CCoeStatic, public MCoeSoundPlayerObserver
	{
public:
	static CCoeSoundPlayerManager* NewL();
	void PlaySoundL(const TBaSystemSoundType& aType,TInt aPlayCount,const TTimeIntervalMicroSeconds32& aGap,TBool aInterrupt);
	void CancelSound(const TBaSystemSoundType& aType);
private: // from MCoeSoundPlayerObserver
	void PlayEnded(const CCoeSoundPlayer& aPlayer);
private:
	CCoeSoundPlayerManager();
	~CCoeSoundPlayerManager();
	void ConstructL();
private:
	CArrayPtrFlat<CCoeSoundPlayer> iPlayers;
	CMdaServer* iMdaServer;
	};

CCoeSoundPlayerManager* CCoeSoundPlayerManager::NewL()
	{ // static
	CCoeSoundPlayerManager* self=new(ELeave) CCoeSoundPlayerManager();
	CleanupStack::PushL(self);
	self->ConstructL();
	CleanupStack::Pop(); // self
	return self;
	}

/*
 * Initialize the sound matching aType.  Interrupt any lower priority sound but, if a higher or 
 * equal priority sound is already playing, then wait for it to finish
 *
 */
void CCoeSoundPlayerManager::PlaySoundL(const TBaSystemSoundType& aType,TInt aPlayCount,
												const TTimeIntervalMicroSeconds32& aGap,TBool aInterrupt)
	{
	TBaSystemSoundInfo info;
	User::LeaveIfError( BaSystemSound::GetSound(CCoeEnv::Static()->FsSession(),aType,info) );
	if (info.SoundCategory()==TBaSystemSoundInfo::EFile)
		{
		TBaSystemSoundName fileName=info.FileName();
		if (aType.iMinor!=KNullUid && !ConeUtils::FileExists(fileName))
			{
			TBaSystemSoundType defaultType(aType.iMajor,KNullUid);
		 	User::LeaveIfError( BaSystemSound::GetSound(CCoeEnv::Static()->FsSession(),defaultType,info) );
			}
		}
	if (info.iVolume == 0) //do not play the sound, if the volume is set to silent.
		return;
	info.iType=aType; // clients will try to cancel this sound using aType rather than whatever sound was actually found
	TInt count=iPlayers.Count();
	if (count)
		{
		CCoeSoundPlayer* player=iPlayers[0];
		if (aInterrupt || player->SoundInfo().iPriority<info.iPriority)
			{
			delete player;
			iPlayers.Delete(0);
			--count;
			}
		}
	CCoeSoundPlayer* player=NULL;
	if (info.SoundCategory()==TBaSystemSoundInfo::EFile)
		player=CCoeFilePlayer::NewLC(*this,info,aPlayCount,aGap);
	else
		player=CCoeTonePlayer::NewLC(*this,info,*iMdaServer,aPlayCount,aGap);
	TInt ii=0;
	for (;ii<count;ii++)
		{
		if (iPlayers[ii]->SoundInfo().iPriority<info.iPriority)
			{
			iPlayers.InsertL(ii,player);
			break;
			}
		}
	if (iPlayers.Count()==count) // we haven't managed to insert it anywhere
		iPlayers.AppendL(player);
	CleanupStack::Pop(); // player
	if (ii==0)
		iPlayers[0]->StartPlay();
	}

void CCoeSoundPlayerManager::CancelSound(const TBaSystemSoundType& aType)
	{
	TInt loop=0;
	while (loop<iPlayers.Count())
		{
		CCoeSoundPlayer* player=iPlayers[loop];
		if (player->SoundInfo().iType==aType)
			{
			delete player;
			iPlayers.Delete(loop);
			}
		else
			++loop;
		}
	if (iPlayers.Count()==0)
		delete this;
	}

void CCoeSoundPlayerManager::PlayEnded(const CCoeSoundPlayer& aPlayer)
// don't need to check the actaul player that's finished as it's always
// index 0.  Leave the code alone for now in case we change once apps
// start using it
	{
	TInt ii=-1;
	FOREVER
		{
		CCoeSoundPlayer* player=iPlayers[++ii];
		if (&aPlayer==player)
			{
			delete player;
			iPlayers.Delete(ii);
			break;
			}
		}
	if (iPlayers.Count())
		iPlayers[0]->StartPlay();
	else
		delete this; // no more sounds to play so allow media server to close
	}

CCoeSoundPlayerManager::CCoeSoundPlayerManager()
	: CCoeStatic(KLafSoundPlayerUid), iPlayers(1)
	{}

CCoeSoundPlayerManager::~CCoeSoundPlayerManager()
	{
	iPlayers.ResetAndDestroy();
	delete iMdaServer;
	}

void CCoeSoundPlayerManager::ConstructL()
	{
	iMdaServer=CMdaServer::NewL();
	}
#endif
//
// class CoeSoundPlayer
//

EXPORT_C void CoeSoundPlayer::PlaySound(const TBaSystemSoundType& aType,TInt aPlayCount,
											TTimeIntervalMicroSeconds32 aGap,TBool aInterrupt)
	{ // static
	//TRAP_IGNORE(ManagerL()->PlaySoundL(aType,aPlayCount,aGap,aInterrupt));
	}

EXPORT_C void CoeSoundPlayer::CancelSound(const TBaSystemSoundType& aType)
/** Stops playing the specified sound.

@param aType The sound to stop playing. */
	{ // static
	//TRAP_IGNORE(ManagerL()->CancelSound(aType));
	}

CCoeSoundPlayerManager* CoeSoundPlayer::ManagerL()
	{ // static
#if 0	
	CCoeEnv* env=CCoeEnv::Static();
	__ASSERT_ALWAYS(env,Panic(ECoePanicNullEnvironment));
	CCoeSoundPlayerManager* manager=
		STATIC_CAST(CCoeSoundPlayerManager*,env->FindStatic(KLafSoundPlayerUid));
	if (!manager)
		manager=CCoeSoundPlayerManager::NewL();
	return manager;
#endif
	return NULL;
	}