localisation/apparchitecture/apparc/APAFLREC.CPP
branchSymbian2
changeset 1 8758140453c0
child 6 c108117318cb
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/localisation/apparchitecture/apparc/APAFLREC.CPP	Thu Jan 21 12:53:44 2010 +0000
@@ -0,0 +1,340 @@
+// 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 the License "Symbian Foundation License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+//
+
+#include <f32file.h>
+#include <apaflrec.h>
+#include <apaid.h>
+#include <apacmdln.h>
+#include "APASTD.H"
+#include "APGCLI.H"
+
+#ifdef USING_ECOM_RECOGS
+#include <ecom/ecom.h>
+#endif
+
+//
+//CFileRecognizerExtension Class
+//
+//stores the destructor key to track the instance of ecom implementation class
+class CFileRecognizerExtension : public CBase
+ 	{
+public:
+	static CFileRecognizerExtension* NewL(TUid aDtorKey);
+ 	~CFileRecognizerExtension();
+	//returns the destructor key
+ 	TUid DestructorUid()const;
+private:
+	CFileRecognizerExtension(TUid aDtorKey);
+private:
+ 	//destructor key to track the instance of ecom implementation class
+	TUid iDtorKey;
+	};
+
+//
+// Class CApaFileRecognizer
+//
+
+EXPORT_C CApaFileRecognizer::CApaFileRecognizer(RFs& aFs)
+	:iFs(aFs)
+	{}
+
+
+EXPORT_C CApaFileRecognizer::~CApaFileRecognizer()
+	{
+	DestroyRecognizerList();
+	delete iAppLocator;
+	//lint -esym(1740,CApaFileRecognizer::iFileRecognizerList) not directly freed - see DestroyRecognizerList()
+	}
+
+	
+EXPORT_C void CApaFileRecognizer::DestroyRecognizerList()
+// this method exists to allow subclassers to destroy the list earlier if they wish
+	{
+	CApaFileRecognizerType* rec=iFileRecognizerList;
+	//delete one element after the other in the list
+	while (rec!=NULL )
+		{
+		CApaFileRecognizerType* prev=NULL;
+		prev = rec;
+		rec=rec->iNext;
+		delete prev;
+		}
+	iFileRecognizerList=NULL;
+	}
+
+
+EXPORT_C void CApaFileRecognizer::SetAppLocator(CApaAppLocator* aAppLocator)
+// takes ownership of the locator
+	{
+	iAppLocator = aAppLocator;
+	}
+
+static TUidType UidTypeL(const TDesC& aFullFileName, const RFs& aFs)
+	{	
+	_LIT(KSysBin, "\\sys\\bin\\");
+	if (TParsePtrC(aFullFileName).Path().CompareF(KSysBin)==0)
+		{
+		RLoader loader;
+		User::LeaveIfError(loader.Connect());
+		CleanupClosePushL(loader);
+		TPckgBuf<RLibrary::TInfo> dllInfo;
+		User::LeaveIfError(loader.GetInfo(aFullFileName, dllInfo));
+		CleanupStack::PopAndDestroy(&loader);
+		return dllInfo().iUids;
+		}
+	TEntry entry;
+	User::LeaveIfError(aFs.Entry(aFullFileName,entry));
+	return entry.iType;
+	}
+
+EXPORT_C CApaFileRecognizerType* CApaFileRecognizer::RecognizeFileL(const TDesC& aFullFileName,const TUidType* aUidType)
+// Returns the specific recognizer if the file is recogized as a runnable file. or NULL if not.
+// TUidType is optional, if not supplied it will be read from the file.
+// Leaves, if any files required cannot be found or if OOM.
+// Leaves with KErrNotSupported, if file cannot be recognized.
+	{
+	const TUidType uidType((aUidType!=NULL)? *aUidType: UidTypeL(aFullFileName, iFs));
+	CApaFileRecognizerType* rec=iFileRecognizerList;
+	CApaFileRecognizerType::TRecognizedType type;
+	while (rec!=NULL)
+		{
+		type=rec->RecognizeFileL(iFs,aFullFileName,uidType);
+		if (type==CApaFileRecognizerType::EOtherFile)	
+			{
+			rec=NULL;						// Recognised but not runnable so stop search now
+			break;
+			}
+		if (type!=CApaFileRecognizerType::ENotRecognized)
+			{
+ 			break;
+			}
+		rec=rec->iNext;
+		}
+	if (rec==NULL)
+		{
+		User::Leave(KErrNotSupported);
+		}
+	return rec;
+	}
+
+EXPORT_C void CApaFileRecognizer::AddFileRecognizerType(CApaFileRecognizerType* aFileRecognizerType)
+// Add given RecognizerType to the end of the recognizer list.
+// Set's it's iFileRecognizer pointer to "this" - recognizers may call AppDataByUid
+	{
+	aFileRecognizerType->iNext=NULL;
+	aFileRecognizerType->iFileRecognizer=this;
+	CApaFileRecognizerType* rec=iFileRecognizerList;
+	if (rec==NULL)
+		iFileRecognizerList=aFileRecognizerType;
+	else
+		{
+		while (rec->iNext!=NULL)
+			rec=rec->iNext;
+		rec->iNext=aFileRecognizerType;
+		}
+	}
+
+
+EXPORT_C TInt CApaFileRecognizer::RemoveFileRecognizerType(const CApaFileRecognizerType* aFileRecognizerType)
+// remove the given recognizer from the list if it is not locked
+// return an error code if removal failed
+	{
+	CApaFileRecognizerType* rec=iFileRecognizerList;
+	CApaFileRecognizerType* prev=NULL;
+	// find the recognizer in the list
+	while (rec!=NULL && rec!=aFileRecognizerType)
+		{
+		prev = rec;
+		rec=rec->iNext;
+		}
+	// did we find a match
+	if (!rec)
+		return KErrNotFound;
+	// is the matching recognizer locked
+	if (rec->Locked())
+		return KErrLocked;
+	// remove the recognizer from the list, then delete it
+	if (prev)
+		prev->iNext = rec->iNext;
+	else
+		iFileRecognizerList = rec->iNext;
+	rec->iNext = NULL;
+	delete rec;
+	return KErrNone;
+	}
+
+
+EXPORT_C CApaAppLocator* CApaFileRecognizer::AppLocator() const
+	{
+	__ASSERT_ALWAYS(iAppLocator,Panic(EPanicNoAppLocator));
+	//
+	return iAppLocator;
+	}
+
+
+//
+// Class CApaFileRecognizerType
+//
+
+EXPORT_C CApaFileRecognizerType::CApaFileRecognizerType():iFileRecognizerExtn(NULL)
+	{
+	}
+
+
+EXPORT_C CApaFileRecognizerType::~CApaFileRecognizerType()
+	{
+#ifdef USING_ECOM_RECOGS
+	//if ecom plugin is used destroy its implementation
+	if(iFileRecognizerExtn!=NULL)
+		{
+		REComSession::DestroyedImplementation(iFileRecognizerExtn->DestructorUid());
+		delete iFileRecognizerExtn;
+		}
+#else
+	iFileRecognizerExtn = NULL;
+#endif
+	delete iCapabilityBuf;
+	delete iFullFileName;
+	iFileRecognizer = NULL;
+	iAppStarter = NULL;
+	iNext = NULL;
+	}
+
+EXPORT_C TThreadId CApaFileRecognizerType::AppRunL(const CApaCommandLine& aCommandLine) const
+	{
+	__ASSERT_ALWAYS(iAppStarter,Panic(EPanicNoAppStarter));
+	//
+	return iAppStarter->StartAppL(aCommandLine);
+	}
+
+CApaFileRecognizerType::TRecognizedType CApaFileRecognizerType::RecognizeFileL(RFs& aFs,const TDesC& aFullFileName,TUidType aUidType)
+	{
+	// set the UID's and name
+	iFileType = aUidType[1];
+	iAppUid = aUidType[2];
+	delete iFullFileName;
+	iFullFileName = NULL;
+	iFullFileName = aFullFileName.AllocL();
+	//
+	// see if we recognize it
+	iRecognizedType = ENotRecognized;
+	TRecognizedType type=DoRecognizeFileL(aFs,aUidType);
+	if (type==ENotRecognized)
+		{
+		delete iFullFileName;
+		iFullFileName=NULL;
+		}
+	else
+		{
+		if(!iCapabilityBuf)
+			{
+			// Actually, iCapabilityBuf is not needed anymore, but in order not to break BC,
+			// we must still support it (in case someone calls CApaFileRecognizerType::Capability).
+			iCapabilityBuf = new(ELeave) TApaAppCapabilityBuf;
+			iCapabilityBuf->FillZ(iCapabilityBuf->MaxLength());
+			}
+		}
+	return type;
+	}
+
+
+EXPORT_C void CApaFileRecognizerType::Capability(TDes8& aCapabilityBuf)const
+	{
+	__ASSERT_ALWAYS(iCapabilityBuf,Panic(EPanicCapabilityNotSet)); // capability has been called when no file has been recognized
+	//
+	TApaAppCapability::CopyCapability(aCapabilityBuf,*iCapabilityBuf);
+	}
+
+
+EXPORT_C void CApaFileRecognizerType::Lock()
+	{
+	iLock++;
+	}
+
+
+EXPORT_C void CApaFileRecognizerType::Unlock()
+	{
+	if (iLock>0)
+		iLock--;
+	}
+
+
+TBool CApaFileRecognizerType::Locked()const
+	{
+	return (iLock>0);
+	}
+
+EXPORT_C void CApaFileRecognizerType::Reserved_1()
+	{}
+
+#ifdef USING_ECOM_RECOGS
+// instantiate the ecom implementation class 
+EXPORT_C CApaFileRecognizerType* CApaFileRecognizerType::CreateFileRecognizerL(TUid aImplUid)
+	{
+	CApaFileRecognizerType* fileRecType = NULL;
+	TUid tempDtorKey = KNullUid;
+	fileRecType = static_cast<CApaFileRecognizerType*>(REComSession::CreateImplementationL(aImplUid, tempDtorKey));
+	CleanupStack::PushL(fileRecType);
+	fileRecType->iFileRecognizerExtn=CFileRecognizerExtension::NewL(tempDtorKey);
+	CleanupStack::Pop(fileRecType);
+	return fileRecType;
+	}
+#else
+EXPORT_C CApaFileRecognizerType* CApaFileRecognizerType::CreateFileRecognizerL(TUid)
+	{
+	return NULL;
+	}
+#endif
+
+CFileRecognizerExtension::CFileRecognizerExtension(TUid aDtorKey)
+ 	:iDtorKey(aDtorKey)
+ 	{
+	}
+
+CFileRecognizerExtension* CFileRecognizerExtension::NewL(TUid aDtorKey)
+	{
+	//instantiate CFileRecognizerExtension with the destructor key of the ecom implentation instance
+	CFileRecognizerExtension* self=new(ELeave) CFileRecognizerExtension(aDtorKey);
+	return self;
+	}
+
+CFileRecognizerExtension::~CFileRecognizerExtension()
+ 	{
+ 	}
+
+//returns the destructor key of the ecom implentation instance
+TUid CFileRecognizerExtension::DestructorUid()const
+ 	{
+ 	return iDtorKey;
+ 	}
+
+//
+// MApaAppStarter
+//
+
+/** Constructor for MApaAppStarter. */
+EXPORT_C MApaAppStarter::MApaAppStarter()
+	{
+	}
+
+/** Reserved for future use */
+EXPORT_C void MApaAppStarter::MApaAppStarter_Reserved1()
+	{
+	}
+	
+/** Reserved for future use */
+EXPORT_C void MApaAppStarter::MApaAppStarter_Reserved2()
+	{
+	}