--- a/localisation/apparchitecture/apfile/APFREC.CPP Wed Jul 28 16:03:37 2010 +0100
+++ b/localisation/apparchitecture/apfile/APFREC.CPP Tue Aug 03 10:20:34 2010 +0100
@@ -1,7 +1,7 @@
// 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 "Eclipse Public License v1.0"
+// 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".
//
@@ -11,68 +11,15 @@
// Contributors:
//
// Description:
+// apfrec.cpp
//
#include <apfrec.h>
#include <e32uid.h>
#include <f32file.h>
#include <apadef.h>
-#include "APFSTD.H" // Panics etc.
-
-#ifdef USING_ECOM_RECOGS
#include <ecom/ecom.h>
-#endif
-
-//
-// class TRecognizer
-//
-
-CApaScanningFileRecognizer::TRecognizer::TRecognizer(HBufC* aName)
- : iName(aName)
- {
- }
-
-///////////////////////////////
-// CApaRecognizerDll
-///////////////////////////////
-
-class CApaRecognizerDll : public CBase
- {
-public:
- CApaRecognizerDll(HBufC* aName);
- ~CApaRecognizerDll(); // closes lib and deletes next
- enum TPresence { ENotPresent, EIsPresent, ESuperseded };
- inline TPresence Present() const { return iPresent; }
- inline void Present(TPresence aPresence) { iPresent = aPresence; }
-
- inline CApaFileRecognizerType* Recognizer() { return iRec; }
- inline void SetRecognizer(CApaFileRecognizerType& aRec) { iRec = &aRec; }
-public:
- //lint --e{1925} Suppress "public data member" - bad OO but handy
- CApaRecognizerDll* iNext;
- CApaScanningFileRecognizer::TRecognizer iId; // cached so that this data can be accessed from other threads (RLibrary cant be used in this case)
-private:
- RLibrary iLibrary;
- TPresence iPresent;
- CApaFileRecognizerType* iRec; // not ownership
- };
-
-
-CApaRecognizerDll::~CApaRecognizerDll()
- {
- delete iId.iName;
- iLibrary.Close();
- delete iNext;
- iRec = NULL;
- }
-
-CApaRecognizerDll::CApaRecognizerDll(HBufC* aName)
- : iId(aName)
- {
- }
-
-#ifdef USING_ECOM_RECOGS
// CleanupEComArray function is used for cleanup support
// of locally declared arrays.
void CleanUpEComInfoArray(TAny* aInfoArray)
@@ -81,339 +28,4 @@
infoArray->ResetAndDestroy();
infoArray->Close();
}
-#endif
-// class CApaBackupOperationObserver
-CApaScanningFileRecognizer::CApaBackupOperationObserver::CApaBackupOperationObserver(CApaScanningFileRecognizer& aRecognizer)
- : iRecognizer(aRecognizer)
- {
- TRAP_IGNORE(iSession = CBaBackupSessionWrapper::NewL());
- }
-
-CApaScanningFileRecognizer::CApaBackupOperationObserver::~CApaBackupOperationObserver()
- {
- if (iSession)
- {
- iSession->DeRegisterBackupOperationObserver(*this);
- delete iSession;
- }
- }
-
-void CApaScanningFileRecognizer::CApaBackupOperationObserver::RegisterObserverL()
- {
- if (iSession)
- {
- iSession->RegisterBackupOperationObserverL(*this);
- }
- }
-
-void CApaScanningFileRecognizer::CApaBackupOperationObserver::HandleBackupOperationEventL(const TBackupOperationAttributes& aBackupOperationAttributes)
- {
- if ((aBackupOperationAttributes.iFileFlag == MBackupObserver::EReleaseLockReadOnly ||
- aBackupOperationAttributes.iFileFlag == MBackupObserver::EReleaseLockNoAccess)
- && aBackupOperationAttributes.iOperation == EStart)
- {
- // release recognizers not in rom
- CApaRecognizerDll* rec=iRecognizer.iRecognizerLib;
- while (rec)
- {
- CApaRecognizerDll* next=rec->iNext;
- TDriveUnit drive(rec->iId.iDrive);
- const TChar driveName=drive.Name()[0];
- if(driveName != TChar('Z'))
- {
- iRecognizer.RemoveRecognizer(*rec);// ignore errors
- }
- rec = next;
- }
- }
-
- if (aBackupOperationAttributes.iFileFlag == MBackupObserver::ETakeLock &&
- (aBackupOperationAttributes.iOperation == EEnd ||
- aBackupOperationAttributes.iOperation == EAbort))
- {
- iRecognizer.ScanForRecognizersL();
- }
- }
-
-TInt CApaScanningFileRecognizer::CApaBackupOperationObserver::UpdateCounter() const
- {
- return iUpdateCounter;
- }
-
-void CApaScanningFileRecognizer::CApaBackupOperationObserver::SetUpdateCounter(TInt aValue)
- {
- iUpdateCounter = aValue;
- }
-
-
-///////////////////////////////
-// CApaScanningFileRecognizer
-///////////////////////////////
-
-
-EXPORT_C CApaScanningFileRecognizer* CApaScanningFileRecognizer::NewL(RFs& aFs,MApaAppStarter* aAppStarter)
- {
- CApaScanningFileRecognizer* self=new(ELeave) CApaScanningFileRecognizer(aFs,aAppStarter);
- CleanupStack::PushL(self);
- self->ConstructL();
- self->ScanForRecognizersL();
- CleanupStack::Pop(); // self
- return self;
- }
-
-
-EXPORT_C CApaScanningFileRecognizer::CApaScanningFileRecognizer(RFs& aFs,MApaAppStarter* aAppStarter)
- : CApaFileRecognizer(aFs), iAppStarter(aAppStarter)
- {}
-
-
-EXPORT_C void CApaScanningFileRecognizer::ConstructL()
- {
- iObserver = new (ELeave) CApaBackupOperationObserver(*this);
- iObserver->RegisterObserverL();
- }
-
-
-EXPORT_C CApaScanningFileRecognizer::~CApaScanningFileRecognizer()
- {
- DestroyRecognizerList();
- delete iRecognizerLib;
- delete iObserver;
- iAppStarter = NULL;
- }
-
-EXPORT_C void CApaScanningFileRecognizer::ScanForRecognizersL()
- {
- // set all recognizers to not present - pending rediscoivery
- CApaRecognizerDll* rec=iRecognizerLib;
- while (rec)
- {
- rec->Present(CApaRecognizerDll::ENotPresent);
- rec = rec->iNext;
- }
-
- ScanForEcomRecognizersL();
- //
- // remove any recognizers that are no longer present
- rec=iRecognizerLib;
- while (rec)
- {
- CApaRecognizerDll* next=rec->iNext;
- if (rec->Present()==CApaRecognizerDll::ENotPresent)
- RemoveRecognizer(*rec);
- rec = next;
- }
- }
-
-
-TInt CApaScanningFileRecognizer::RemoveRecognizer(CApaRecognizerDll& aDll)
- {
- // try to remove the recognizer from the list
- TInt ret=RemoveFileRecognizerType(aDll.Recognizer());
- if (ret!=KErrNone && ret!=KErrNotFound)
- return ret;
- //
- // get a handle to the previous entry in the list
- CApaRecognizerDll* prev=NULL;
- CApaRecognizerDll* dll=iRecognizerLib;
- while (dll && (dll != &aDll))
- {
- prev = dll;
- dll = dll->iNext;
- }
-
- if (!dll)
- {
- Panic(EPanicLibraryNotInList);
- }
- else
- {
- // remove the dll
- if (prev)
- prev->iNext = dll->iNext;
- else
- iRecognizerLib = dll->iNext;
- dll->iNext = NULL;
- delete dll;
- iObserver->SetUpdateCounter( iObserver->UpdateCounter()+ 1 );
- }
- return KErrNone;
- }
-
-EXPORT_C TInt CApaScanningFileRecognizer::RecognizerCount()
- {
- CApaRecognizerDll* lib=iRecognizerLib;
- TInt count=0;
- while (lib)
- {
- count++;
- lib = lib->iNext;
- }
- return count;
- }
-
-
-EXPORT_C CApaScanningFileRecognizer::CRecognizerArray* CApaScanningFileRecognizer::RecognizerListLC()const
- {
- CRecognizerArray* list=new(ELeave) CArrayFixFlat<TRecognizer>(1);
- CleanupStack::PushL(list);
- CApaRecognizerDll* dll=iRecognizerLib;
- while (dll)
- {
- list->AppendL(dll->iId);
- dll = dll->iNext;
- }
- return list;
- }
-
-EXPORT_C const CApaScanningFileRecognizer::TRecognizer& CApaScanningFileRecognizer::operator[](TInt aIndex)const
- {
- __ASSERT_ALWAYS(aIndex>=0,Panic(EPanicNegativeIndex));
- // scan to correct dll
- TInt num=0;
- CApaRecognizerDll* dll=iRecognizerLib;
- while (dll && num++<aIndex)
- dll = dll->iNext;
- __ASSERT_ALWAYS(dll,Panic(EPanicIndexOutOfRange));
- //
- // get info from dll
- return dll->iId; //lint !e613 Suppress possible use of null pointer - asserted above
- }
-
-EXPORT_C TInt CApaScanningFileRecognizer::UpdateCounter()const
- {
- return iObserver->UpdateCounter();
- }
-
-EXPORT_C void CApaScanningFileRecognizer::SetEcomRecognizersFromListL(const CRecognizerArray& aList)
- {
- //for ecom style
- for (TInt i=0 ; i<aList.Count() ; i++)
- {
- TDriveUnit drive(aList[i].iDrive);
- TRAPD(ret, LoadEcomRecognizerL(drive,aList[i].iUid));
- if (ret==KErrNoMemory)
- {
- User::Leave(ret);
- }
- }
- }
-
-EXPORT_C void CApaScanningFileRecognizer::SetEcomRecognizerL(const TRecognizer& aRecognizer)
- {
- //for ecom style
- TDriveUnit drive(aRecognizer.iDrive);
- LoadEcomRecognizerL(drive,aRecognizer.iUid);
- }
-
-//to find the name of ecom style file recognizer corresponding to aImplUID
-#ifdef USING_ECOM_RECOGS
-HBufC* RecognizerNameL(TUid aImplUID)
- {
- RImplInfoPtrArray implementationInfoArray;
- TCleanupItem cleanup(CleanUpEComInfoArray, &implementationInfoArray);
- CleanupStack::PushL(cleanup);
- REComSession::ListImplementationsL(KUidFileRecogInterfaceUid,implementationInfoArray);
- const TInt availCount = implementationInfoArray.Count();
- for (TInt ii=0;ii<availCount;++ii)
- {
- CImplementationInformation* info = implementationInfoArray[ii];
- TUid uid = info->ImplementationUid();
- if(uid.iUid == aImplUID.iUid )
- {
- HBufC* recogName = info->DisplayName().AllocL();
- CleanupStack::PopAndDestroy(&implementationInfoArray);
- return recogName;
- }
- }
- CleanupStack::PopAndDestroy(&implementationInfoArray);
- return KNullDesC().AllocL();
- }
-
-//load the ecom file recognizer
-void CApaScanningFileRecognizer::LoadEcomRecognizerL(TDriveUnit& aDrive,TUid aUid)
- {
- // check we haven't loaded this one already
- CApaRecognizerDll* lib=iRecognizerLib;
- CApaRecognizerDll* last=NULL; // the previous one in the list
- while (lib)
- {
- if (lib->iId.iUid==aUid)
- {// we may have to override one
- if (lib->Present()!=CApaRecognizerDll::ENotPresent)
- {
- return; // already found
- }
- else
- {
- lib->Present(CApaRecognizerDll::EIsPresent);
- return;
- }
- }
- last = lib;
- lib = lib->iNext;
- }
- // load the library
- HBufC* recogName=RecognizerNameL(aUid);
- CleanupStack::PushL(recogName);
- lib = new(ELeave) CApaRecognizerDll(recogName);
- CleanupStack::Pop(recogName);
- CleanupStack::PushL(lib);
- TRAPD(error,lib->SetRecognizer(*CApaFileRecognizerType::CreateFileRecognizerL(aUid)));
- if(!error && lib->Recognizer())
- {
- lib->Present(CApaRecognizerDll::EIsPresent);
- SetAppStarter(lib->Recognizer(),iAppStarter);
- AddFileRecognizerType(lib->Recognizer());
- lib->iId.iUid = aUid;
- lib->iId.iDrive = aDrive;
- iObserver->SetUpdateCounter( iObserver->UpdateCounter() + 1 );
- //
- // add lib to the library list
- if (last)
- {
- while (last->iNext)
- {
- last=last->iNext;
- }
- __ASSERT_ALWAYS(last->iNext==NULL,Panic(EPanicIndexOutOfRange));
- last->iNext = lib;
- }
- else
- {
- iRecognizerLib = lib;
- }
- CleanupStack::Pop(lib); // lib
- }
- else
- {
- CleanupStack::PopAndDestroy(lib); // lib
- }
- }
-#else
-void CApaScanningFileRecognizer::LoadEcomRecognizerL(TDriveUnit&,TUid)
- {
- } //lint !e1762 Suppress member function could be made const
-
-#endif
-
-void CApaScanningFileRecognizer::ScanForEcomRecognizersL()
- {
-#ifdef USING_ECOM_RECOGS
- //scan ecom plugin
- RImplInfoPtrArray implementationArray;
- TCleanupItem cleanup(CleanUpEComInfoArray, &implementationArray);
- CleanupStack::PushL(cleanup);
- REComSession::ListImplementationsL(KUidFileRecogInterfaceUid,implementationArray);
- const TInt availCount = implementationArray.Count();
- for (TInt count=0;count<availCount;++count)
- {
- const CImplementationInformation* info = implementationArray[count];
- TUid uid = info->ImplementationUid();
- TDriveUnit drive=info-> Drive();
- TRAP_IGNORE(LoadEcomRecognizerL(drive,uid));
- }
- CleanupStack::PopAndDestroy(&implementationArray);
-#endif
- } //lint !e1762 Suppress member function could be made const