userlibandfileserver/fileserver/smassstorage/drivemanager.cpp
author hgs
Mon, 11 Oct 2010 17:54:41 +0100
changeset 286 48e57fb1237e
parent 0 a41df078684a
permissions -rw-r--r--
201039_11
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
0
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
     1
// Copyright (c) 2004-2009 Nokia Corporation and/or its subsidiary(-ies).
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
     2
// All rights reserved.
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
     3
// This component and the accompanying materials are made available
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
     4
// under the terms of the License "Eclipse Public License v1.0"
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
     5
// which accompanies this distribution, and is available
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
     6
// at the URL "http://www.eclipse.org/legal/epl-v10.html".
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
     7
//
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
     8
// Initial Contributors:
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
     9
// Nokia Corporation - initial contribution.
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
    10
//
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
    11
// Contributors:
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
    12
//
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
    13
// Description:
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
    14
// Class implementation of CDriveManager and CMassStorageDrive.
286
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
    15
//
0
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
    16
//
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
    17
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
    18
/**
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
    19
 @file
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
    20
 @internalTechnology
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
    21
*/
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
    22
286
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
    23
#include <e32std.h>
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
    24
#include <e32base.h>            // C Class Definitions, Cleanup Stack
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
    25
#include <e32def.h>             // T Type  Definitions
0
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
    26
#include <f32fsys.h>
286
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
    27
#include <e32property.h>
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
    28
#include "usbmsshared.h"        // KUsbMsMaxDrives
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
    29
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
    30
0
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
    31
#include "drivemanager.h"
286
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
    32
#include "smassstorage.h"
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
    33
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
    34
#include "OstTraceDefinitions.h"
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
    35
#ifdef OST_TRACE_COMPILER_IN_USE
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
    36
#include "drivemanagerTraces.h"
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
    37
#endif
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
    38
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
    39
0
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
    40
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
    41
///////////////////////////////////////////////////////////////////////////////
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
    42
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
    43
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
    44
/**
286
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
    45
A private structure that, when Connected, holds references to
0
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
    46
the CProxyDrive and the corresponding TBusLocalDrive's Media Changed flag.
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
    47
*/
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
    48
struct CMassStorageDrive::CLocalDriveRef : public CBase
286
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
    49
    {
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
    50
    CLocalDriveRef(CProxyDrive& aProxyDrive, TBool& aMediaChanged)
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
    51
        : iProxyDrive(aProxyDrive), iMediaChanged(aMediaChanged), iDriveState(EIdle)
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
    52
        {
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
    53
        }
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
    54
    CProxyDrive& iProxyDrive;
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
    55
    TBool& iMediaChanged;
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
    56
    /**
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
    57
    The Drive Media state machine
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
    58
    */
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
    59
    TDriveState iDriveState;
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
    60
    };
0
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
    61
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
    62
/**
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
    63
@param aCritSec A Critical Section object shared by all drives.
286
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
    64
@param aDrives Reference to the list of CMassStorageDrive objects.
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
    65
@param aDriveMap Reference to array mapping lun to drive number for supported
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
    66
       mass storage drives.
0
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
    67
@post Object is fully constructed
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
    68
 */
286
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
    69
CMassStorageDrive::CMassStorageDrive(RCriticalSection& aCritSec,
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
    70
                                     RDriveStateChangedPublisher& aDriveStateChangedPublisher)
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
    71
    :
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
    72
    iCritSec(aCritSec),
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
    73
    iMountState(EDisconnected),
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
    74
    iDriveStateChangedPublisher(aDriveStateChangedPublisher)
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
    75
    {
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
    76
    }
0
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
    77
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
    78
CMassStorageDrive::~CMassStorageDrive()
286
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
    79
    {
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
    80
    delete iLocalDrive;
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
    81
    }
0
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
    82
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
    83
/**
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
    84
Read from the target drive unit.
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
    85
@return KErrNone on success, otherwise system wide error code
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
    86
*/
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
    87
TInt CMassStorageDrive::Read(const TInt64& aPos, TInt aLength, TDes8& aBuf, TBool aWholeMedia)
286
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
    88
    {
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
    89
    TInt err = KErrUnknown; // never return this
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
    90
    iCritSec.Wait();
0
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
    91
286
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
    92
    if(iMountState != EConnected)
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
    93
        {
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
    94
        err = KErrDisconnected;
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
    95
        }
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
    96
    else
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
    97
        {
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
    98
        if(aWholeMedia)
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
    99
            {
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   100
            err = SafeProxyDrive().Read(aPos, aLength, &aBuf, KLocalMessageHandle, 0, RLocalDrive::ELocDrvWholeMedia);
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   101
            }
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   102
        else
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   103
            {
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   104
            err = SafeProxyDrive().Read(aPos, aLength, aBuf);
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   105
            }
0
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   106
286
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   107
        if(err == KErrNone)
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   108
            {
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   109
#ifndef USB_TRANSFER_PUBLISHER
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   110
            iBytesRead += aBuf.Length();
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   111
            OstTrace1(TRACE_SMASSSTORAGE_DRIVESTATE, DRIVERMANAGER_100,
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   112
                      "iBytesRead=%d", iBytesRead);
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   113
#endif
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   114
            }
0
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   115
286
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   116
        else if(err == KErrLocked)
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   117
            {
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   118
            SetDriveState(ELocked);
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   119
            }
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   120
        }
0
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   121
286
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   122
    iCritSec.Signal();
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   123
    return err;
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   124
    }
0
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   125
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   126
/**
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   127
Write to the target drive unit.
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   128
@return KErrNone on success, otherwise system wide error code
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   129
*/
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   130
TInt CMassStorageDrive::Write(const TInt64& aPos, TDesC8& aBuf, TBool aWholeMedia)
286
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   131
    {
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   132
    TInt err = KErrNone;
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   133
    iCritSec.Wait();
0
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   134
286
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   135
    if (iMountState != EConnected)
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   136
        {
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   137
        err = KErrDisconnected;
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   138
        }
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   139
    else
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   140
        {
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   141
        __ASSERT_DEBUG(iLocalDrive, User::Panic(KUsbMsSvrPncCat, EMsCMassStorageDriveWrite));
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   142
        TDriveState oldState = iLocalDrive->iDriveState;
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   143
        if(oldState != EActive)
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   144
            {
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   145
            // SCSI hasn't called SetCritical
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   146
            SetDriveState(EActive);
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   147
            }
0
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   148
286
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   149
        if (aWholeMedia)
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   150
            {
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   151
            err = SafeProxyDrive().Write(aPos, aBuf.Length(), &aBuf, KLocalMessageHandle, 0, RLocalDrive::ELocDrvWholeMedia);
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   152
            }
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   153
        else
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   154
            {
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   155
            err = SafeProxyDrive().Write(aPos,aBuf);
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   156
            }
0
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   157
286
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   158
        if (err == KErrNone)
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   159
            {
0
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   160
#ifndef USB_TRANSFER_PUBLISHER
286
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   161
            iBytesWritten += aBuf.Length();
0
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   162
#endif
286
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   163
            }
0
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   164
286
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   165
        if (err == KErrLocked)
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   166
            {
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   167
            SetDriveState(ELocked);
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   168
            }
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   169
        else if (oldState != EActive)
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   170
            {
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   171
            SetDriveState(oldState);
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   172
            }
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   173
        }
0
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   174
286
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   175
    iCritSec.Signal();
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   176
    return err;
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   177
    }
0
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   178
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   179
/**
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   180
Get the capabilities of the target drive unit.
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   181
@return KErrNone on success, otherwise system wide error code
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   182
*/
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   183
TInt CMassStorageDrive::Caps(TLocalDriveCapsV4& aInfo)
286
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   184
    {
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   185
    TInt err = KErrNone;
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   186
    iCritSec.Wait();
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   187
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   188
    if(iMountState != EConnected)
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   189
        {
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   190
        err = KErrDisconnected;
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   191
        }
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   192
    else
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   193
        {
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   194
        // Initialise in case Caps() fails
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   195
        aInfo.iType = ::EMediaUnknown;
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   196
        err = DoCaps(aInfo);
0
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   197
286
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   198
        OstTrace1(TRACE_SMASSSTORAGE_DRIVESTATE, DRIVERMANAGER_110,
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   199
                  "err=%d", err);
0
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   200
286
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   201
        if(err == KErrNotReady || (err==KErrNone && aInfo.iType == ::EMediaNotPresent))
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   202
            {
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   203
            OstTrace0(TRACE_SMASSSTORAGE_DRIVESTATE, DRIVERMANAGER_111,
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   204
                      "detected MediaNotPresent");
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   205
            SetDriveState(CMassStorageDrive::EMediaNotPresent);
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   206
            }
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   207
        }
0
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   208
286
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   209
    iCritSec.Signal();
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   210
    return err;
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   211
    }
0
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   212
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   213
/**
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   214
Provides an interface to CProxyDrive::Caps that hides the
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   215
package buffer.
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   216
@return KErrNone on success, otherwise system wide error code
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   217
@param aInfo
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   218
*/
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   219
TInt CMassStorageDrive::DoCaps(TLocalDriveCapsV4& aInfo)
286
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   220
    {
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   221
    TLocalDriveCapsV4Buf buf;
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   222
    buf.FillZ();
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   223
    CProxyDrive& pd = SafeProxyDrive();
0
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   224
286
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   225
    TInt err = pd.Caps(buf);
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   226
    OstTrace1(TRACE_SMASSSTORAGE_DRIVESTATE, DRIVERMANAGER_121,
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   227
              "Caps returned %d", err);
0
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   228
286
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   229
    if(err==KErrNone)
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   230
        {
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   231
        // Invoke function call operator to cast to TLocalDriveCapsV4&
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   232
        aInfo = buf();
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   233
        }
0
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   234
286
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   235
    return err;
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   236
    }
0
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   237
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   238
/**
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   239
Publish media error, user should reinsert the memory card.
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   240
Similar to FAT32's TDriver::HandleCriticalError.
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   241
Note: User notification is not implemented, instead we abort and dismount.
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   242
*/
286
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   243
TInt CMassStorageDrive::HandleCriticalError()
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   244
    {
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   245
    iDriveMediaErrorPublisher.PublishError(ETrue);
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   246
    return KErrAbort;
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   247
    }
0
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   248
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   249
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   250
TInt CMassStorageDrive::ClearCriticalError()
286
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   251
    {
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   252
    iDriveMediaErrorPublisher.PublishError(EFalse);
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   253
    return KErrNone;
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   254
    }
0
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   255
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   256
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   257
/**
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   258
Checks the Media Changed flag, and optionally resets it.
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   259
@return The state of the Media Changed flag.
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   260
@param aReset If true, the Media Changed flag is reset to EFalse.
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   261
*/
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   262
TBool CMassStorageDrive::IsMediaChanged(TBool aReset)
286
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   263
    {
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   264
    iCritSec.Wait();
0
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   265
286
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   266
    TBool mediaChanged = EFalse;
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   267
    if(iLocalDrive)
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   268
        {
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   269
        mediaChanged = iLocalDrive->iMediaChanged;
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   270
        if(aReset)
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   271
            {
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   272
            iLocalDrive->iMediaChanged = EFalse;
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   273
            }
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   274
        }
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   275
    else
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   276
        {
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   277
        OstTrace0(TRACE_SMASSSTORAGE_DRIVESTATE, DRIVERMANAGER_130,
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   278
                  "No drive");
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   279
        }
0
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   280
286
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   281
    iCritSec.Signal();
0
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   282
286
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   283
    OstTrace1(TRACE_SMASSSTORAGE_DRIVESTATE, DRIVERMANAGER_131,
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   284
              "IsMediaChanged returning %d", mediaChanged);
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   285
    return mediaChanged;
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   286
    }
0
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   287
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   288
/**
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   289
Set the Drive State to Active or Idle.
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   290
@return KErrNone on success, KErrNotReady if media not present, KErrDisMounted if not mounted
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   291
@param aCritical ETrue for Active, EFalse for Idle
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   292
*/
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   293
TInt CMassStorageDrive::SetCritical(TBool aCritical)
286
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   294
    {
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   295
    TInt err = KErrDisMounted;
0
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   296
286
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   297
    iCritSec.Wait();
0
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   298
286
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   299
    if(iLocalDrive)
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   300
        {
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   301
        if(iLocalDrive->iDriveState == CMassStorageDrive::EMediaNotPresent)
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   302
            {
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   303
            err = KErrNotReady;
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   304
            }
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   305
        else
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   306
            {
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   307
            SetDriveState(
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   308
                aCritical
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   309
                ? CMassStorageDrive::EActive
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   310
                : CMassStorageDrive::EIdle );
0
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   311
286
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   312
            err = KErrNone;
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   313
            }
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   314
        }
0
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   315
286
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   316
    iCritSec.Signal();
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   317
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   318
    return err;
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   319
    }
0
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   320
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   321
/**
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   322
Set the mount state
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   323
*/
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   324
TInt CMassStorageDrive::SetMountConnected(CProxyDrive& aProxyDrive, TBool& aMediaChanged)
286
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   325
    {
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   326
    CLocalDriveRef* localDrive = NULL;
0
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   327
286
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   328
    OstTrace0(TRACE_SMASSSTORAGE_DRIVESTATE, DRIVERMANAGER_140,
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   329
              "SetMountConnected entering critical section");
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   330
    iCritSec.Wait(); // note: signalled in SetMountState
0
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   331
286
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   332
    if (iLocalDrive == NULL)
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   333
        {
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   334
        localDrive = new CLocalDriveRef(aProxyDrive, aMediaChanged);
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   335
        if (localDrive==NULL)
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   336
            {
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   337
            iCritSec.Signal();
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   338
            return KErrNoMemory;
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   339
            }
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   340
        }
0
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   341
286
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   342
    return SetMountState(EConnected, localDrive);
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   343
    }
0
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   344
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   345
/**
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   346
@return KErrNone
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   347
@param aNewState
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   348
@param aLocalDrive Only provide this if aNewState is EConnected.
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   349
*/
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   350
TInt CMassStorageDrive::SetMountState(TMountState aNewState, CLocalDriveRef* aLocalDrive/*=NULL*/)
286
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   351
    {
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   352
    if(iMountState == aNewState)
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   353
        {
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   354
        OstTrace0(TRACE_SMASSSTORAGE_DRIVESTATE, DRIVERMANAGER_150,
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   355
                  "SetMountState: No change");
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   356
        }
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   357
    else
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   358
        {
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   359
        // If called from SetMountConnected, already in critical section,
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   360
        // otherwise, must enter it here.
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   361
        if(EConnected!=aNewState)
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   362
            {
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   363
            OstTrace0(TRACE_SMASSSTORAGE_DRIVESTATE, DRIVERMANAGER_151,
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   364
                      "SetMountState entering critical section");
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   365
            iCritSec.Wait();
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   366
            }
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   367
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   368
        switch(aNewState)
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   369
            {
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   370
            case EConnected:
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   371
                if(aLocalDrive)
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   372
                    {
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   373
                    __ASSERT_DEBUG(iLocalDrive, User::Panic(KUsbMsSvrPncCat, EMsCMassStorageDriveSetMountState_iLocalDrive));
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   374
                    iLocalDrive = aLocalDrive;
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   375
                    }
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   376
                __ASSERT_DEBUG(iLocalDrive, User::Panic(KUsbMsSvrPncCat, EMsCMassStorageDriveSetMountState_aLocalDrive));
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   377
                break;
0
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   378
286
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   379
            case EDisconnected:
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   380
                delete iLocalDrive;
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   381
                iLocalDrive = NULL;
0
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   382
#ifndef USB_TRANSFER_PUBLISHER
286
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   383
                iBytesWritten = iBytesRead = 0;
0
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   384
#endif
286
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   385
                break;
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   386
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   387
            case EDisconnecting:
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   388
            case EConnecting:
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   389
                // Do not change iLocalDrive for these state changes
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   390
                break;
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   391
            }
0
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   392
286
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   393
        iMountState = aNewState;
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   394
        OstTrace1(TRACE_SMASSSTORAGE_DRIVESTATE, DRIVERMANAGER_152,
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   395
                  "SetMountState: state=%d", iMountState);
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   396
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   397
        iDriveStateChangedPublisher.DriveStateChanged();
0
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   398
286
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   399
        iCritSec.Signal();
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   400
        OstTrace0(TRACE_SMASSSTORAGE_DRIVESTATE, DRIVERMANAGER_153,
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   401
                  "SetMountState has left the critical section");
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   402
        }
0
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   403
286
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   404
    return KErrNone;
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   405
    }
0
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   406
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   407
/**
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   408
@return Current drive media state
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   409
*/
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   410
CMassStorageDrive::TDriveState CMassStorageDrive::DriveState() const
286
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   411
    {
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   412
    return iLocalDrive ? iLocalDrive->iDriveState : EErrDisMounted;
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   413
    }
0
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   414
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   415
/**
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   416
Check for media not present, and return the drive state.
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   417
@return Current drive media state
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   418
*/
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   419
CMassStorageDrive::TDriveState CMassStorageDrive::CheckDriveState()
286
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   420
    {
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   421
    CMassStorageDrive::TDriveState state = EErrDisMounted;
0
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   422
286
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   423
    iCritSec.Wait();
0
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   424
286
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   425
    if (iLocalDrive)
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   426
        {
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   427
        TInt err = KErrGeneral;
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   428
        TLocalDriveCapsV4 caps;
0
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   429
286
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   430
        FOREVER
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   431
            {
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   432
            // Initialise in case Caps() fails
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   433
            caps.iType = ::EMediaNotPresent;
0
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   434
286
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   435
            err = DoCaps(caps);
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   436
            OstTrace1(TRACE_SMASSSTORAGE_DRIVESTATE, DRIVERMANAGER_160,
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   437
                      "DoCaps err=%d", err);
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   438
            if (err == KErrNotReady || (err == KErrNone && caps.iType == ::EMediaNotPresent))
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   439
                {
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   440
                OstTrace0(TRACE_SMASSSTORAGE_DRIVESTATE, DRIVERMANAGER_161,
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   441
                          "Detected MediaNotPresent");
0
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   442
286
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   443
                SetDriveState(CMassStorageDrive::EMediaNotPresent);
0
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   444
286
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   445
                if (HandleCriticalError() == KErrAbort)
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   446
                    break;
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   447
                }
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   448
            else
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   449
                {
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   450
                ClearCriticalError();
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   451
                break;
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   452
                }
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   453
            }
0
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   454
286
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   455
        if (err == KErrNone && caps.iType != ::EMediaNotPresent)
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   456
            {
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   457
            if (iLocalDrive->iDriveState == CMassStorageDrive::EMediaNotPresent)
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   458
                {
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   459
                OstTrace0(TRACE_SMASSSTORAGE_DRIVESTATE, DRIVERMANAGER_162,
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   460
                          "Detected media inserted");
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   461
                SetDriveState(CMassStorageDrive::EIdle);
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   462
                }
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   463
            else if (iLocalDrive->iDriveState == CMassStorageDrive::ELocked &&
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   464
                     !(caps.iMediaAtt & KMediaAttLocked))
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   465
                {
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   466
                OstTrace0(TRACE_SMASSSTORAGE_DRIVESTATE, DRIVERMANAGER_163,
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   467
                          "Detected media unlocked");
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   468
                SetDriveState(CMassStorageDrive::EIdle);
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   469
                }
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   470
            else if (caps.iMediaAtt & KMediaAttLocked)
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   471
                {
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   472
                OstTrace0(TRACE_SMASSSTORAGE_DRIVESTATE, DRIVERMANAGER_164,
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   473
                          "Detected media locked");
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   474
                SetDriveState(CMassStorageDrive::ELocked);
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   475
                }
0
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   476
286
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   477
            iWholeMediaAccess = !(caps.iDriveAtt & KDriveAttLogicallyRemovable);
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   478
            }
0
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   479
286
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   480
        // Get the current state
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   481
        state = iLocalDrive->iDriveState;
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   482
        }
0
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   483
286
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   484
    iCritSec.Signal();
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   485
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   486
    return state;
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   487
    }
0
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   488
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   489
static TBool IsActive(CMassStorageDrive::TDriveState aDriveState)
286
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   490
    {
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   491
    return aDriveState==CMassStorageDrive::EActive;
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   492
    }
0
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   493
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   494
/**
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   495
@param aNewState
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   496
*/
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   497
void CMassStorageDrive::SetDriveState(TDriveState aNewState)
286
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   498
    {
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   499
    __ASSERT_DEBUG(aNewState == EIdle ||
0
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   500
                   (iMountState == EConnected && NULL != iLocalDrive) ||
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   501
                   (iMountState == EDisconnecting && NULL != iLocalDrive),
286
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   502
                   User::Panic(KUsbMsSvrPncCat, EMsCMassStorageDriveSetDriveState_State));
0
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   503
286
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   504
    if(!iLocalDrive)
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   505
        {
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   506
        OstTrace0(TRACE_SMASSSTORAGE_DRIVESTATE, DRIVERMANAGER_170,
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   507
                  "Drive not mounted.");
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   508
        }
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   509
    else
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   510
        {
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   511
        OstTraceExt2(TRACE_SMASSSTORAGE_DRIVESTATE, DRIVERMANAGER_171,
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   512
                     "Drive state change %d->%d", iLocalDrive->iDriveState, aNewState);
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   513
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   514
        if(iLocalDrive->iDriveState != aNewState)
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   515
            {
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   516
            CMountCB* mount = SafeProxyDrive().Mount();
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   517
            __ASSERT_DEBUG(mount != NULL, User::Panic(KUsbMsSvrPncCat, EMsCMassStorageDriveSetDriveState_Mount));
0
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   518
286
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   519
            if(mount)
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   520
                {
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   521
                if(!IsActive(iLocalDrive->iDriveState) && IsActive(aNewState))
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   522
                    {
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   523
                    mount->IncLock();
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   524
                    }
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   525
                else if(IsActive(iLocalDrive->iDriveState) && !IsActive(aNewState))
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   526
                    {
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   527
                    mount->DecLock();
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   528
                    }
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   529
                OstTrace1(TRACE_SMASSSTORAGE_DRIVESTATE, DRIVERMANAGER_172,
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   530
                          "LockStatus=%d", mount->LockStatus());
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   531
                }
0
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   532
286
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   533
            iLocalDrive->iDriveState = aNewState;
0
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   534
286
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   535
            iDriveStateChangedPublisher.DriveStateChanged();
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   536
            }
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   537
        }
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   538
    }
0
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   539
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   540
/**
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   541
Accessor for iProxyDrive; asserts if NULL
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   542
*/
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   543
CProxyDrive& CMassStorageDrive::SafeProxyDrive() const
286
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   544
    {
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   545
    __ASSERT_ALWAYS(NULL!=iLocalDrive, User::Invariant());
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   546
    return iLocalDrive->iProxyDrive;
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   547
    }
0
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   548
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   549
/////////////////////////////////////////////////////////////////
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   550
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   551
/**
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   552
Construct a CDriveManager object.
286
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   553
@param aDriveMap Reference to array mapping lun to drive number for supported
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   554
       mass storage drives.
0
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   555
*/
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   556
CDriveManager* CDriveManager::NewL(TRefDriveMap aDriveMap)
286
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   557
    {
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   558
    OstTrace1(TRACE_SMASSSTORAGE_DRIVESTATE, DRIVERMANAGER_180,
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   559
              "%d drives available", aDriveMap.Count());
0
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   560
286
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   561
    CDriveManager* self = new (ELeave) CDriveManager(aDriveMap);
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   562
    CleanupStack::PushL(self);
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   563
    self->ConstructL();
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   564
    CleanupStack::Pop();
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   565
    return self;
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   566
    }
0
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   567
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   568
CDriveManager::CDriveManager(const RArray<TInt>& aDriveMap)
286
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   569
    : iDriveMap(aDriveMap)
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   570
    {}
0
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   571
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   572
/**
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   573
Construct a CDriveManager object.
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   574
*/
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   575
void CDriveManager::ConstructL()
286
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   576
    {
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   577
    User::LeaveIfError(iDriveCritSec.CreateLocal());
0
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   578
286
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   579
    iDriveStateChangedPublisher = new (ELeave) RDriveStateChangedPublisher(iDrives, iDriveMap);
0
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   580
286
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   581
    for(TInt i = 0; i < iDriveMap.Count(); i++)
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   582
        {
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   583
        iDrives[i] = new (ELeave) CMassStorageDrive(iDriveCritSec, *iDriveStateChangedPublisher);
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   584
        }
0
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   585
286
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   586
    // Publish initial drive state
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   587
    if (iDriveMap.Count() > 0)
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   588
        {
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   589
        iDriveStateChangedPublisher->DriveStateChanged();
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   590
        }
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   591
    }
0
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   592
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   593
/**
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   594
Destructor
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   595
*/
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   596
CDriveManager::~CDriveManager()
286
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   597
    {
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   598
    iDrives.DeleteAll();
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   599
    delete iDriveStateChangedPublisher;
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   600
    iDriveCritSec.Close();
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   601
    }
0
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   602
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   603
/**
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   604
Set the mount state to Connected and specify the Proxy Drive.
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   605
@return KErrNone on success, otherwise system wide error code
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   606
@param aDrive The mounted Proxy Drive
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   607
@param aLun The Logical Drive Unit identifier (0..numDrives-1)
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   608
@pre If the Mount State is Connected, then aDrive must be the
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   609
     same as it was the last time this function was called.
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   610
@post The Mount State will be Connected.
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   611
*/
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   612
TInt CDriveManager::RegisterDrive(CProxyDrive& aProxyDrive, TBool& aMediaChanged, TUint aLun)
286
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   613
    {
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   614
    OstTrace1(TRACE_SMASSSTORAGE_DRIVESTATE, DRIVERMANAGER_190, "Lun=%d", aLun);
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   615
    TInt err = KErrUnknown; // never return this
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   616
    CMassStorageDrive* drive = CDriveManager::Drive(aLun, err);
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   617
    if(drive)
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   618
        {
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   619
        drive->SetMountConnected(aProxyDrive, aMediaChanged);
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   620
        }
0
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   621
286
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   622
    OstTrace1(TRACE_SMASSSTORAGE_DRIVESTATE, DRIVERMANAGER_191, "err=%d", err);
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   623
    return err;
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   624
    }
0
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   625
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   626
/**
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   627
Set the mount state to Disconnected.
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   628
@return KErrNone on success, otherwise system wide error code
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   629
@param aLun The Logical Drive Unit identifier (0..numDrives-1)
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   630
@post The Mount State will be Disconnected.
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   631
*/
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   632
TInt CDriveManager::DeregisterDrive(TUint aLun)
286
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   633
    {
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   634
    TInt err = KErrUnknown; // never return this
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   635
    if(CMassStorageDrive* drive = Drive(aLun, err))
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   636
        {
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   637
        err = drive->SetMountDisconnected();
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   638
        }
0
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   639
286
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   640
    OstTrace1(TRACE_SMASSSTORAGE_DRIVESTATE, DRIVERMANAGER_200, "err=%d", err);
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   641
    return err;
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   642
    }
0
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   643
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   644
/**
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   645
Return a pointer to the drive specified aLun, or NULL if
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   646
aLun is invalid.
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   647
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   648
@return Pointer to the specified drive, or NULL.
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   649
@param aLun The Logical Drive Unit identifier (0..numDrives-1)
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   650
@param aError KErrNone on success, KErrArgument if NULL is returned.
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   651
*/
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   652
CMassStorageDrive* CDriveManager::Drive(TUint aLun, TInt& aError) const
286
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   653
    {
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   654
    aError = KErrNone;
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   655
    CMassStorageDrive* drive = NULL;
0
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   656
286
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   657
    // Check if aLun exceeds the specified number of drives
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   658
    // (This will panic if it exceeds KMaxLun).
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   659
    if(aLun>=KUsbMsMaxDrives || !iDrives[aLun])
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   660
        {
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   661
        aError = KErrArgument;
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   662
        }
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   663
    else
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   664
        {
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   665
        drive = iDrives[aLun];
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   666
        }
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   667
    return drive;
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   668
    }
0
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   669
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   670
/**
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   671
Checks the Media Changed flag, and optionally resets it.
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   672
@return The state of the Media Changed flag.
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   673
@param aLun The Logical Drive Unit identifier (0..numDrives-1)
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   674
@param aReset If true, the Media Changed flag is reset to EFalse.
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   675
*/
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   676
TBool CDriveManager::IsMediaChanged(TUint aLun, TBool aReset)
286
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   677
    {
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   678
    TInt err; // not used, but is a required parameter
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   679
    CMassStorageDrive* drive = Drive(aLun, err);
0
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   680
286
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   681
    if(!drive)
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   682
        {
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   683
        OstTrace1(TRACE_SMASSSTORAGE_DRIVESTATE, DRIVERMANAGER_210,
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   684
                  "LUN=%d not found, returning false", aLun);
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   685
        return ETrue;
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   686
        }
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   687
    else
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   688
        {
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   689
        return drive->IsMediaChanged(aReset);
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   690
        }
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   691
    }
0
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   692
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   693
/**
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   694
Set the Drive State to Active or Idle.
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   695
Ref: 3.6.3.2 - PREVENT_MEDIUM_REMOVAL
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   696
@return KErrNone on success, otherwise system wide error code
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   697
@param aLun The Logical Drive Unit identifier (0..numDrives-1)
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   698
@param aCritical ETrue for Active, EFalse for Idle
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   699
*/
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   700
TInt CDriveManager::SetCritical(TUint aLun, TBool aCritical)
286
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   701
    {
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   702
    TInt err = KErrUnknown; // never return this
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   703
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   704
    TInt i=aLun;
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   705
    TInt cnt=aLun+1;
0
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   706
286
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   707
    if (aLun == KAllLuns)
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   708
        {
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   709
        i=0;
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   710
        cnt= iDriveMap.Count();
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   711
        }
0
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   712
286
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   713
    for(; i<cnt; i++)
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   714
        {
0
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   715
286
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   716
        CMassStorageDrive* drive = Drive(i, err);
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   717
        if(drive)
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   718
            {
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   719
            err = drive->SetCritical(aCritical);
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   720
            }
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   721
        }
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   722
    return err;
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   723
    }
0
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   724
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   725
/**
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   726
Inititiate transition to Connected.
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   727
@return KErrNone on success, otherwise system wide error code
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   728
@param aLun The Logical Drive Unit identifier (0..numDrives-1)
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   729
@post The Mount State will be Connected or Connecting.
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   730
*/
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   731
TInt CDriveManager::Connect(TUint aLun)
286
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   732
    {
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   733
    TInt err = KErrUnknown; // never return this
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   734
    CMassStorageDrive* drive = Drive(aLun, err);
0
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   735
286
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   736
    OstTraceExt3(TRACE_SMASSSTORAGE_DRIVESTATE, DRIVERMANAGER_230,
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   737
                 "lun=%d err=%d mountState=%d", aLun, err, drive->MountState());
0
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   738
286
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   739
    if(drive)
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   740
        {
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   741
        switch(drive->MountState())
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   742
            {
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   743
            case CMassStorageDrive::EDisconnected:
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   744
                err = drive->SetMountConnecting();
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   745
                break;
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   746
            case CMassStorageDrive::EDisconnecting:
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   747
                err = drive->SetMountConnected();
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   748
                break;
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   749
            case CMassStorageDrive::EConnected:
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   750
            case CMassStorageDrive::EConnecting:
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   751
                // do nothing
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   752
                break;
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   753
            }
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   754
        }
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   755
    return err;
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   756
    }
0
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   757
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   758
/**
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   759
Inititiate transition to Disconnected.
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   760
@return KErrNone on success, otherwise system wide error code
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   761
@param aLun The Logical Drive Unit identifier (0..numDrives-1)
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   762
@post The Mount State will be Disconnected or Disconnecting.
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   763
*/
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   764
TInt CDriveManager::Disconnect(TUint aLun)
286
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   765
    {
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   766
    TInt err = KErrUnknown; // never return this
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   767
    CMassStorageDrive* drive = Drive(aLun, err);
0
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   768
286
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   769
    if(drive)
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   770
        {
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   771
        switch(drive->MountState())
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   772
            {
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   773
            case CMassStorageDrive::EConnected:
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   774
                err = drive->SetMountDisconnecting();
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   775
                break;
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   776
            case CMassStorageDrive::EConnecting:
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   777
                err = drive->SetMountDisconnected();
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   778
                break;
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   779
            case CMassStorageDrive::EDisconnected:
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   780
            case CMassStorageDrive::EDisconnecting:
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   781
                // do nothing
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   782
                break;
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   783
            }
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   784
        }
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   785
    return err;
48e57fb1237e 201039_11
hgs
parents: 0
diff changeset
   786
    }
0
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   787
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   788