os/kernelhwsrv/kerneltest/f32test/shostmassstorage/msman/src/rextfilesystem.cpp
author sl@SLION-WIN7.fritz.box
Fri, 15 Jun 2012 03:10:57 +0200
changeset 0 bde4ae8d615e
permissions -rw-r--r--
First public contribution.
sl@0
     1
// Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
sl@0
     2
// All rights reserved.
sl@0
     3
// This component and the accompanying materials are made available
sl@0
     4
// under the terms of the License "Eclipse Public License v1.0"
sl@0
     5
// which accompanies this distribution, and is available
sl@0
     6
// at the URL "http://www.eclipse.org/legal/epl-v10.html".
sl@0
     7
//
sl@0
     8
// Initial Contributors:
sl@0
     9
// Nokia Corporation - initial contribution.
sl@0
    10
//
sl@0
    11
// Contributors:
sl@0
    12
//
sl@0
    13
// Description:
sl@0
    14
//
sl@0
    15
sl@0
    16
#include <f32file.h>
sl@0
    17
sl@0
    18
#include "rusbhostmsdevice.h"
sl@0
    19
#include "rusbhostmslogicalunit.h"
sl@0
    20
#include "rextfilesystem.h"
sl@0
    21
#include "tmslog.h"
sl@0
    22
sl@0
    23
sl@0
    24
_LIT(KFsNm, "elocal");
sl@0
    25
sl@0
    26
RExtFileSystem::RExtFileSystem()
sl@0
    27
    {
sl@0
    28
    __MSFNLOG
sl@0
    29
    }
sl@0
    30
sl@0
    31
RExtFileSystem::~RExtFileSystem()
sl@0
    32
    {
sl@0
    33
    __MSFNLOG
sl@0
    34
    }
sl@0
    35
sl@0
    36
sl@0
    37
void RExtFileSystem::OpenL()
sl@0
    38
    {
sl@0
    39
    __MSFNLOG
sl@0
    40
    RFs fs;
sl@0
    41
    User::LeaveIfError(fs.Connect());
sl@0
    42
    CleanupClosePushL(fs);
sl@0
    43
sl@0
    44
    TInt err;
sl@0
    45
    err = fs.AddFileSystem(KFsNm);
sl@0
    46
    if (err != KErrAlreadyExists)
sl@0
    47
        User::LeaveIfError(err);
sl@0
    48
sl@0
    49
    err = fs.AddFileSystem(_L("ELOCAL"));
sl@0
    50
    if (!(KErrAlreadyExists == err || KErrCorrupt == err))
sl@0
    51
        User::LeaveIfError(err);
sl@0
    52
sl@0
    53
    err = fs.AddProxyDrive(_L("usbhostms.pxy"));
sl@0
    54
    if (!(KErrAlreadyExists == err || KErrCorrupt == err))
sl@0
    55
        User::LeaveIfError(err);
sl@0
    56
sl@0
    57
    CleanupStack::PopAndDestroy(&fs);
sl@0
    58
    }
sl@0
    59
sl@0
    60
sl@0
    61
void RExtFileSystem::CloseL()
sl@0
    62
    {
sl@0
    63
    __MSFNLOG
sl@0
    64
    RFs fs;
sl@0
    65
    User::LeaveIfError(fs.Connect());
sl@0
    66
    CleanupClosePushL(fs);
sl@0
    67
    TInt err = fs.RemoveProxyDrive(_L("usbhostms"));
sl@0
    68
    CleanupStack::PopAndDestroy(&fs);
sl@0
    69
    }
sl@0
    70
sl@0
    71
sl@0
    72
void RExtFileSystem::MountL(RUsbHostMsDevice& aDevice,
sl@0
    73
                            TDriveNumber aDriveNumber,
sl@0
    74
                            TToken aToken,
sl@0
    75
                            TLun aLun)
sl@0
    76
    {
sl@0
    77
    __MSFNLOG
sl@0
    78
sl@0
    79
    TTime start;
sl@0
    80
    TTime end;
sl@0
    81
sl@0
    82
    start.HomeTime();
sl@0
    83
sl@0
    84
    RFs fs;
sl@0
    85
    User::LeaveIfError(fs.Connect());
sl@0
    86
    CleanupClosePushL(fs);
sl@0
    87
sl@0
    88
    TInt err;
sl@0
    89
	err = aDevice.MountLun(aLun, aDriveNumber);
sl@0
    90
	if (!(KErrAlreadyExists == err || KErrNotReady == err))
sl@0
    91
		{
sl@0
    92
	    __PRINT1(_L("** Error: MountLun returned %d **"), err);
sl@0
    93
        RDebug::Print(_L("** Error: MountLun returned %d **"), err);
sl@0
    94
        User::LeaveIfError(err);
sl@0
    95
		}
sl@0
    96
sl@0
    97
    CleanupStack::PopAndDestroy(&fs);
sl@0
    98
sl@0
    99
    end.HomeTime();
sl@0
   100
sl@0
   101
    TTimeIntervalSeconds timeTaken;
sl@0
   102
    end.SecondsFrom(start, timeTaken);
sl@0
   103
    TUint totalTime = timeTaken.Int();
sl@0
   104
    RDebug::Print(_L("Mount has taken %dHrs:%dmins:%dsecs\n"),
sl@0
   105
                  totalTime/3600,
sl@0
   106
                  (totalTime/60)%60,
sl@0
   107
                  totalTime%60);
sl@0
   108
    }
sl@0
   109
sl@0
   110
sl@0
   111
void RExtFileSystem::DismountL(RUsbHostMsDevice& aDevice, TDriveNumber aDriveNumber)
sl@0
   112
    {
sl@0
   113
    __MSFNLOG
sl@0
   114
    RFs fs;
sl@0
   115
    User::LeaveIfError(fs.Connect());
sl@0
   116
    __PRINT(_L("DismountFileSystem"));
sl@0
   117
	//TInt err = aDevice.DismountLun(aDriveNumber);
sl@0
   118
    aDevice.DismountLun(aDriveNumber);
sl@0
   119
    fs.Close();
sl@0
   120
    }
sl@0
   121
sl@0
   122
sl@0
   123
TDriveNumber RExtFileSystem::GetDriveL()
sl@0
   124
    {
sl@0
   125
    RFs fs;
sl@0
   126
    User::LeaveIfError(fs.Connect());
sl@0
   127
    TDriveList driveList;
sl@0
   128
    fs.DriveList(driveList);
sl@0
   129
    fs.Close();
sl@0
   130
sl@0
   131
    TInt drive;
sl@0
   132
    for (drive = EDriveG; drive <= EDriveZ; drive++)
sl@0
   133
    	{
sl@0
   134
        // Skip K drive which is reserved for LFFS but shows as being free
sl@0
   135
        if (drive == EDriveK)
sl@0
   136
            {
sl@0
   137
            continue;
sl@0
   138
            }
sl@0
   139
        if (driveList[drive] == 0)
sl@0
   140
            {
sl@0
   141
            break;
sl@0
   142
            }
sl@0
   143
        }
sl@0
   144
sl@0
   145
    if (drive > EDriveZ)
sl@0
   146
        {
sl@0
   147
        RDebug::Print(_L("####### NOT Found free drive"));
sl@0
   148
        User::Leave(KErrInUse);
sl@0
   149
        }
sl@0
   150
sl@0
   151
    __PRINT1(_L("Found free drive @ %d"), drive);
sl@0
   152
    RDebug::Print(_L("####### Found free drive @ %d"), drive);
sl@0
   153
    return static_cast<TDriveNumber>(drive);
sl@0
   154
    }