--- a/remotestoragefw/mountmanager/src/rsfwbootmounter.cpp Mon Jan 18 21:00:57 2010 +0200
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,307 +0,0 @@
-/*
-* Copyright (c) 2006 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: Mounts during boot remote drives configured in CenRep
- *
-*/
-
-
-#include <f32file.h> // link against efsrv.lib
-#include <centralrepository.h> // link against centralrepository.lib
-#include <f32fsys.h>
-
-// for the file server client side API
-_LIT(KRemoteFSName, "RemoteFS");
-_LIT(KRemoteFs, "eremotefs");
-
-
-// for the central repository API
-enum TMountEntryItemIndex
- {
- EMountEntryItemIndex,
- EMountEntryItemName,
- EMountEntryItemDrive,
- EMountEntryItemUri,
- EMountEntryItemUserName,
- EMountEntryItemPassword,
- EMountEntryItemIap,
- EMountEntryItemInactivityTimeout,
- EMountEntryItemReserved,
- EMountEntryItemCount
- };
-const TUid KCRUidRsfwCtrl = { 0x101F9775 }; // RSFW cenrep table id
-const TUint KColumnName = EMountEntryItemName;
-const TUint KColumnMask = 0x000000ff;
-const TUint KRowMask = 0xffffff00;
-const TInt KMaxFileSystemName = 256;
-const TInt KMaxDriveLetterLength = 5;
-const TInt KMaxFriendlyNameLength = 20;
-
-
-// isRsfwFileSystem
-//
-// Checks whether certain drive has rsfw file system mounted on it
-//
-//
-LOCAL_C TBool isRsfwFileSystemL(TInt aDrive,
- TDriveList aDriveList,
- RFs aFsSession)
- {
- TBool rsfwFileSystem = EFalse;
- // check first KDriveAttRemote bit as if that is missing it is a quick way
- // to conclude that this is not a rsfw mount
- if (aDriveList[aDrive] & KDriveAttRemote)
- {
- TInt err;
- HBufC* filesystemName = HBufC::NewL(KMaxFileSystemName);
- TPtr itemPtr = filesystemName->Des();
- err = aFsSession.FileSystemName(itemPtr, aDrive);
- if (!err && (itemPtr.Compare(KRemoteFSName) == 0))
- {
- rsfwFileSystem = ETrue;
- }
- delete filesystemName;
- }
- return rsfwFileSystem;
- }
-
-
-
-// DoMountL
-//
-// Do either simple mount or replace (our) existing mount
-// by doing dismount and mount
-//
-//
-LOCAL_C TInt DoMount(TInt aDrive, RFs aFsSession, TBool aReplaceExisting)
-
- {
- TInt err;
- if (aReplaceExisting)
- {
- // ignore dismount error code
- aFsSession.DismountFileSystem(KRemoteFSName, aDrive);
- err = aFsSession.MountFileSystem(KRemoteFSName, aDrive);
- }
- else
- {
- err = aFsSession.MountFileSystem(KRemoteFSName, aDrive);
- }
- return err;
- }
-
-
-// ExecuteFileServerMountL
-//
-// Attempts to mount our file system to the file server
-//
-//
-LOCAL_C TInt ExecuteFileServerMountL(TInt aDrive,
- TDriveList aDriveList,
- RFs aFsSession)
- {
- TInt err;
- if (aDriveList[aDrive])
- {
- if (isRsfwFileSystemL(aDrive, aDriveList, aFsSession))
- {
- err = DoMount(aDrive, aFsSession, ETrue);
- }
- else
- {
- // the drive we attempt to mount contains some other file system
- return KErrInUse;
- }
- }
- else
- {
- // the drive we attempt to mount does not contain an existing mount
- err = DoMount(aDrive, aFsSession, EFalse);
- }
- return err;
- }
-
-
-// SetFriendlyNameL
-//
-// Sets the friendly name of the remote drive to
-// mounted fs drivename and volumename fields
-// (to the volume name field first 11 chars)
-//
-// This function assumes that we are allowed to manipulate
-// drive aDrive, in practise that ExecuteFileServerMount()
-// has been called succesfully
-//
-LOCAL_C TInt SetFriendlyName(TInt aDrive,
- TDesC& aFriendlyName,
- RFs aFsSession)
- {
- TInt err;
- err = aFsSession.SetDriveName(aDrive, aFriendlyName);
- if (!err)
- {
- TPtrC volumeNamePtr = aFriendlyName.Left(KMaxVolumeNameLength);
- err = aFsSession.SetVolumeLabel(volumeNamePtr, aDrive);
- }
- return err;
- }
-
-// ----------------------------------------------------------------------------
-// SyncConfiguredRemoteDrivesL
-// adds RSFW File Server plug-in
-// and synchronizes Central Repository's view of configured remote drives
-// with File Server's view (mounts the remote drives configured in CR and
-// unmounts those remote drives that are not anymore configured)
-// ----------------------------------------------------------------------------
-//
-LOCAL_C void SyncConfiguredRemoteDrivesL()
- {
- TInt err = 0;
- TInt row = 0;
- TInt driveNumber = 0;
- RFs fs;
- TChar paramLetter(90);
- TBool paramSet = EFalse;
-
- User::LeaveIfError(fs.Connect());
- CleanupClosePushL(fs);
-
- // it is possible to manipulate only one drive letter, and give that as an argument
- TInt clinelength = User::CommandLineLength();
- if (clinelength > 0)
- {
- HBufC* cl = HBufC::NewL(clinelength);
- TPtr linePtr = cl->Des();
- User::CommandLine(linePtr);
- TLex lex(linePtr);
- paramLetter = lex.Get();
- paramSet = ETrue;
- delete cl;
- }
-
- // add our file system plugin to the file server
- err = fs.AddFileSystem(KRemoteFs);
- if ((err != KErrNone) && (err != KErrAlreadyExists))
- {
- User::Leave(err);
- }
-
- // Get a list of drives in the File Server
- TDriveList drives;
- User::LeaveIfError(fs.DriveList(drives, KDriveAttAll));
- // (drives[i] & KDriveAttRemote) now tells whether i:th drive is remote
-
- // Get a list of remote drives in the central repository table
-
- // connect
- CRepository* cenrep;
- cenrep = CRepository::NewL(KCRUidRsfwCtrl);
- CleanupStack::PushL(cenrep);
-
- // find all entries by name
- RArray<TUint32> nameIds;
- CleanupClosePushL(nameIds);
- err = cenrep->FindL(KColumnName, KColumnMask, nameIds);
- if (!err)
- {
- // for each remote drive entry, represented by a record in central repository, do the following:
- // 1) get drive letter from central repository
- // 2) based on drive letter acquire corresponding drive number from the File Server
- // 3) check whether in the File Server there is already mounted a drive with given number
- // 3.1) if there is NOT, then mount the drive
- // 3.2) if there is and it appears to be remote, then do re-mounting
- // 3.3) if there is and it appears NOT to be remote, then this means error
- // 4) still for the same record from central repository, get the name of the drive
- // 5) use this name as the volume label in the File Server
- for (row = 0; row < nameIds.Count(); row++)
- {
- TUint rowId = (nameIds[row] & KRowMask);
- // don't touch zero row as it DOES NOT contain info about mounted drives
- if (rowId > 0)
- {
- TInt i;
- // mount it to the file server
-
- // get drive number
- TBuf<KMaxDriveLetterLength> driveLetter;
- i = EMountEntryItemDrive;
- User::LeaveIfError(cenrep->Get(rowId | i, driveLetter));
-
- // driveNumber needed in any case, so that we can mark this as existing drive
- if (driveLetter.Length() > 0)
- {
- User::LeaveIfError(fs.CharToDrive((driveLetter)[0], driveNumber));
- }
- else
- {
- User::Leave(KErrBadName);
- }
-
- // proceed this drive if we didn't get any drive
- // letter as a parameter or we got this one
- if ((!paramSet) || (paramLetter == driveLetter[0]))
- {
- // get friendly name
- TBuf<KMaxFriendlyNameLength> friendlyName;
- i = EMountEntryItemName;
- User::LeaveIfError(cenrep->Get(rowId | i, friendlyName));
-
- if (friendlyName.Length() > 0)
- {
- User::LeaveIfError(ExecuteFileServerMountL(driveNumber, drives, fs));
- User::LeaveIfError(SetFriendlyName(driveNumber, friendlyName,fs));
- }
-
- else
- {
- User::Leave(KErrBadName);
- }
- }
-
- // do not unmount this drive as it is still in the CenRep table
- // after this loop non-zero drives are used to see
- // which remote drives should be unmounted
- drives[driveNumber] = 0;
- }
- } // loop
- }
-
- // If drives now contain some remote drives, this means that they are not
- // anymore configured in CenRep and should be unmounted.
- for (int i = 0; i < EDriveZ; i++)
- {
- if (isRsfwFileSystemL(i, drives, fs))
- {
- fs.DismountFileSystem(KRemoteFSName, i);
- }
- }
-
- CleanupStack::PopAndDestroy(3, &fs); // fs, cenrep, nameIds
-
- }
-
-// ----------------------------------------------------------------------------
-// E32Main
-//
-// ----------------------------------------------------------------------------
-//
-GLDEF_C TInt E32Main()
- {
- CTrapCleanup* cleanupStack = CTrapCleanup::New();
- TRAPD(err, SyncConfiguredRemoteDrivesL());
- delete cleanupStack;
- return err;
- }
-
-
-// End of file