kerneltest/f32test/shostmassstorage/testclient/usbtestmsclient/drivemanager.cpp
author hgs
Tue, 02 Nov 2010 15:29:23 +0000
changeset 300 1d28c8722707
parent 0 a41df078684a
permissions -rw-r--r--
201043_09
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
300
1d28c8722707 201043_09
hgs
parents: 0
diff changeset
     1
// Copyright (c) 2009-2010 Nokia Corporation and/or its subsidiary(-ies).
0
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.
300
1d28c8722707 201043_09
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
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
    20
/**
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
    21
 @file
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
    22
 @internalTechnology
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
    23
*/
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
    24
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
    25
#include <f32fsys.h>
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
    26
#include <e32property.h>
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
    27
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
    28
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
    29
#include "usbmsshared.h"
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
    30
#include "msctypes.h"
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
    31
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
    32
#include "drivepublisher.h"
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
    33
#include "drivemanager.h"
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
    34
#include "debug.h"
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
    35
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
    36
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
    37
void TMediaParams::Init(TLocalDriveCapsV4& aCaps)
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
    38
    {
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
    39
    iSize = aCaps.MediaSizeInBytes();
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
    40
    TInt64 driveBlocks =  iSize / MAKE_TINT64(0, KDefaultBlockSize);
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
    41
    iNumBlocks = I64LOW(driveBlocks);
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
    42
    iMediaAtt = aCaps.iMediaAtt;
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
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
    45
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
    46
void TLocalDriveRef::SetDriveState(TDriveState aState)
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
    if (iDriveState != aState)
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
    49
        {
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
    50
        CMountCB* mount = iProxyDrive.Mount();
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
    51
        __ASSERT_DEBUG(mount != NULL, User::Invariant());
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
    52
        if (mount)
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
    53
            {
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
    54
            if (!IsActive(iDriveState) && IsActive(aState))
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
    55
                {
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
    56
                mount->IncLock();
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
    57
                }
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
    58
            else if (IsActive(iDriveState) && !IsActive(aState))
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
    59
                {
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
    60
                mount->DecLock();
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
            __PRINT1(_L("SetDriveState: LockStatus=%d\n"), mount->LockStatus());
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
    63
            }
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
    64
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
    65
        iDriveState = aState;
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
    66
        iDriveStateChangedPublisher.DriveStateChanged();
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
    67
        }
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
    68
    }
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
    69
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
    70
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
    71
TInt TLocalDriveRef::Read(const TInt64& aPos, TInt aLength, TDes8& aBuf, TBool aWholeMedia)
300
1d28c8722707 201043_09
hgs
parents: 0
diff changeset
    72
    {
1d28c8722707 201043_09
hgs
parents: 0
diff changeset
    73
    TInt err = KErrUnknown; // never return this
0
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
    74
300
1d28c8722707 201043_09
hgs
parents: 0
diff changeset
    75
    if(aWholeMedia)
1d28c8722707 201043_09
hgs
parents: 0
diff changeset
    76
        {
1d28c8722707 201043_09
hgs
parents: 0
diff changeset
    77
        err = iProxyDrive.Read(aPos, aLength, &aBuf, KLocalMessageHandle, 0, RLocalDrive::ELocDrvWholeMedia);
1d28c8722707 201043_09
hgs
parents: 0
diff changeset
    78
        }
1d28c8722707 201043_09
hgs
parents: 0
diff changeset
    79
    else
1d28c8722707 201043_09
hgs
parents: 0
diff changeset
    80
        {
1d28c8722707 201043_09
hgs
parents: 0
diff changeset
    81
        err = iProxyDrive.Read(aPos, aLength, aBuf);
1d28c8722707 201043_09
hgs
parents: 0
diff changeset
    82
        }
0
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
    83
300
1d28c8722707 201043_09
hgs
parents: 0
diff changeset
    84
    if (err == KErrLocked)
1d28c8722707 201043_09
hgs
parents: 0
diff changeset
    85
        {
1d28c8722707 201043_09
hgs
parents: 0
diff changeset
    86
        SetDriveState(TLocalDriveRef::ELocked);
1d28c8722707 201043_09
hgs
parents: 0
diff changeset
    87
        }
0
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
    88
300
1d28c8722707 201043_09
hgs
parents: 0
diff changeset
    89
    return err;
1d28c8722707 201043_09
hgs
parents: 0
diff changeset
    90
    }
0
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
    91
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
    92
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
    93
TInt TLocalDriveRef::Write(const TInt64& aPos, TDesC8& aBuf, TBool aWholeMedia)
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
    94
    {
300
1d28c8722707 201043_09
hgs
parents: 0
diff changeset
    95
    TInt err = KErrNone;
0
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
    96
300
1d28c8722707 201043_09
hgs
parents: 0
diff changeset
    97
    TDriveState oldState = iDriveState;
1d28c8722707 201043_09
hgs
parents: 0
diff changeset
    98
    if (oldState != EActive)
0
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
    99
        {
300
1d28c8722707 201043_09
hgs
parents: 0
diff changeset
   100
        // SCSI hasn't called SetCritical
1d28c8722707 201043_09
hgs
parents: 0
diff changeset
   101
        SetDriveState(EActive);
1d28c8722707 201043_09
hgs
parents: 0
diff changeset
   102
        }
0
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   103
300
1d28c8722707 201043_09
hgs
parents: 0
diff changeset
   104
    if (aWholeMedia)
1d28c8722707 201043_09
hgs
parents: 0
diff changeset
   105
        {
1d28c8722707 201043_09
hgs
parents: 0
diff changeset
   106
        err = iProxyDrive.Write(aPos, aBuf.Length(), &aBuf, KLocalMessageHandle, 0, RLocalDrive::ELocDrvWholeMedia);
1d28c8722707 201043_09
hgs
parents: 0
diff changeset
   107
        }
1d28c8722707 201043_09
hgs
parents: 0
diff changeset
   108
    else
1d28c8722707 201043_09
hgs
parents: 0
diff changeset
   109
        {
1d28c8722707 201043_09
hgs
parents: 0
diff changeset
   110
        err = iProxyDrive.Write(aPos,aBuf);
1d28c8722707 201043_09
hgs
parents: 0
diff changeset
   111
        }
0
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   112
300
1d28c8722707 201043_09
hgs
parents: 0
diff changeset
   113
    if (err == KErrLocked)
1d28c8722707 201043_09
hgs
parents: 0
diff changeset
   114
        {
1d28c8722707 201043_09
hgs
parents: 0
diff changeset
   115
        SetDriveState(ELocked);
1d28c8722707 201043_09
hgs
parents: 0
diff changeset
   116
        }
1d28c8722707 201043_09
hgs
parents: 0
diff changeset
   117
    else if (oldState != EActive)
1d28c8722707 201043_09
hgs
parents: 0
diff changeset
   118
        {
1d28c8722707 201043_09
hgs
parents: 0
diff changeset
   119
        SetDriveState(oldState);
1d28c8722707 201043_09
hgs
parents: 0
diff changeset
   120
        }
0
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   121
    return err;
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   122
    }
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   123
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   124
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
Checks the Media Changed flag, and optionally resets it.
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   127
@return The state of the Media Changed flag.
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   128
@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
   129
*/
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   130
TBool TLocalDriveRef::IsMediaChanged(TBool aReset)
300
1d28c8722707 201043_09
hgs
parents: 0
diff changeset
   131
    {
1d28c8722707 201043_09
hgs
parents: 0
diff changeset
   132
    TBool mediaChanged = iMediaChanged;
1d28c8722707 201043_09
hgs
parents: 0
diff changeset
   133
    if (aReset)
0
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   134
        {
300
1d28c8722707 201043_09
hgs
parents: 0
diff changeset
   135
        iMediaChanged = EFalse;
1d28c8722707 201043_09
hgs
parents: 0
diff changeset
   136
        }
1d28c8722707 201043_09
hgs
parents: 0
diff changeset
   137
    return mediaChanged;
1d28c8722707 201043_09
hgs
parents: 0
diff changeset
   138
    }
0
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   139
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   140
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   141
/**
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   142
Set the Drive State to Active or Idle.
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   143
@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
   144
@param aCritical ETrue for Active, EFalse for Idle
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   145
*/
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   146
TInt TLocalDriveRef::SetCritical(TBool aCritical)
300
1d28c8722707 201043_09
hgs
parents: 0
diff changeset
   147
    {
1d28c8722707 201043_09
hgs
parents: 0
diff changeset
   148
    TInt err = KErrNone;
0
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   149
    if (iDriveState == EMediaNotPresent)
300
1d28c8722707 201043_09
hgs
parents: 0
diff changeset
   150
        {
1d28c8722707 201043_09
hgs
parents: 0
diff changeset
   151
        err = KErrNotReady;
1d28c8722707 201043_09
hgs
parents: 0
diff changeset
   152
        }
1d28c8722707 201043_09
hgs
parents: 0
diff changeset
   153
    else
1d28c8722707 201043_09
hgs
parents: 0
diff changeset
   154
        {
0
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   155
        SetDriveState(aCritical ? EActive : EIdle);
300
1d28c8722707 201043_09
hgs
parents: 0
diff changeset
   156
        }
1d28c8722707 201043_09
hgs
parents: 0
diff changeset
   157
    return err;
1d28c8722707 201043_09
hgs
parents: 0
diff changeset
   158
    }
0
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   159
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   160
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   161
/**
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   162
Provides an interface to CProxyDrive::Caps that hides the
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   163
package buffer.
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   164
@return KErrNone on success, otherwise system wide error code
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   165
@param aInfo
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   166
*/
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   167
TInt TLocalDriveRef::Caps(TLocalDriveCapsV4& aInfo)
300
1d28c8722707 201043_09
hgs
parents: 0
diff changeset
   168
    {
1d28c8722707 201043_09
hgs
parents: 0
diff changeset
   169
    TLocalDriveCapsV4Buf buf;
1d28c8722707 201043_09
hgs
parents: 0
diff changeset
   170
    buf.FillZ();
0
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   171
300
1d28c8722707 201043_09
hgs
parents: 0
diff changeset
   172
    __PRINT(_L("CMassStorageDrive::DoCaps calling Caps\n"));
1d28c8722707 201043_09
hgs
parents: 0
diff changeset
   173
    TInt err = iProxyDrive.Caps(buf);
1d28c8722707 201043_09
hgs
parents: 0
diff changeset
   174
    __PRINT1(_L("CMassStorageDrive::DoCaps: Caps returned %d\n"), err);
0
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   175
300
1d28c8722707 201043_09
hgs
parents: 0
diff changeset
   176
    if (err == KErrNone)
1d28c8722707 201043_09
hgs
parents: 0
diff changeset
   177
        {
1d28c8722707 201043_09
hgs
parents: 0
diff changeset
   178
        // Invoke function call operator to cast to TLocalDriveCapsV4&
1d28c8722707 201043_09
hgs
parents: 0
diff changeset
   179
        aInfo = buf();
1d28c8722707 201043_09
hgs
parents: 0
diff changeset
   180
        }
0
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   181
300
1d28c8722707 201043_09
hgs
parents: 0
diff changeset
   182
    return err;
1d28c8722707 201043_09
hgs
parents: 0
diff changeset
   183
    }
0
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   184
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   185
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   186
///////////////////////////////////////////////////////////////////////////////
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   187
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   188
/**
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   189
@param aCritSec A Critical Section object shared by all drives.
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   190
@param aDrives Reference to the list of CMassStorageDrive objects.
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   191
@param aDriveMap Reference to array mapping lun to drive number for supported
300
1d28c8722707 201043_09
hgs
parents: 0
diff changeset
   192
       mass storage drives.
0
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   193
@post Object is fully constructed
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   194
 */
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   195
CMassStorageDrive* CMassStorageDrive::NewL(RCriticalSection& aCritSec,
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   196
                                           RDriveStateChangedPublisher& aDriveStateChangedPublisher)
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   197
    {
300
1d28c8722707 201043_09
hgs
parents: 0
diff changeset
   198
    CMassStorageDrive* self = new (ELeave) CMassStorageDrive(aCritSec, aDriveStateChangedPublisher);
1d28c8722707 201043_09
hgs
parents: 0
diff changeset
   199
    CleanupStack::PushL(self);
1d28c8722707 201043_09
hgs
parents: 0
diff changeset
   200
    self->ConstructL();
1d28c8722707 201043_09
hgs
parents: 0
diff changeset
   201
    CleanupStack::Pop();
1d28c8722707 201043_09
hgs
parents: 0
diff changeset
   202
    return self;
0
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   203
    }
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   204
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   205
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   206
CMassStorageDrive::CMassStorageDrive(RCriticalSection& aCritSec,
300
1d28c8722707 201043_09
hgs
parents: 0
diff changeset
   207
                                     RDriveStateChangedPublisher& aDriveStateChangedPublisher)
0
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   208
:   iCritSec(aCritSec),
300
1d28c8722707 201043_09
hgs
parents: 0
diff changeset
   209
    iMountState(EDisconnected),
1d28c8722707 201043_09
hgs
parents: 0
diff changeset
   210
    iDriveStateChangedPublisher(aDriveStateChangedPublisher)
1d28c8722707 201043_09
hgs
parents: 0
diff changeset
   211
    {
1d28c8722707 201043_09
hgs
parents: 0
diff changeset
   212
    }
0
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
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   215
void CMassStorageDrive::ConstructL()
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   216
    {
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   217
    iDriveMediaErrorPublisher = new (ELeave) RDriveMediaErrorPublisher();
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
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   220
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   221
CMassStorageDrive::~CMassStorageDrive()
300
1d28c8722707 201043_09
hgs
parents: 0
diff changeset
   222
    {
0
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   223
    delete iDriveMediaErrorPublisher;
300
1d28c8722707 201043_09
hgs
parents: 0
diff changeset
   224
    delete iLocalDrive;
1d28c8722707 201043_09
hgs
parents: 0
diff changeset
   225
    }
0
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   226
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   227
/**
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   228
Read from the target drive unit.
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   229
@return KErrNone on success, otherwise system wide error code
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   230
*/
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   231
TInt CMassStorageDrive::Read(const TInt64& aPos, TInt aLength, TDes8& aBuf, TBool aWholeMedia)
300
1d28c8722707 201043_09
hgs
parents: 0
diff changeset
   232
    {
0
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   233
300
1d28c8722707 201043_09
hgs
parents: 0
diff changeset
   234
    TInt err = KErrUnknown; // never return this
1d28c8722707 201043_09
hgs
parents: 0
diff changeset
   235
    iCritSec.Wait();
0
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   236
300
1d28c8722707 201043_09
hgs
parents: 0
diff changeset
   237
    if(iMountState != EConnected)
1d28c8722707 201043_09
hgs
parents: 0
diff changeset
   238
        {
1d28c8722707 201043_09
hgs
parents: 0
diff changeset
   239
        err = KErrDisconnected;
1d28c8722707 201043_09
hgs
parents: 0
diff changeset
   240
        }
1d28c8722707 201043_09
hgs
parents: 0
diff changeset
   241
    else
1d28c8722707 201043_09
hgs
parents: 0
diff changeset
   242
        {
0
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   243
        err = iLocalDrive->Read(aPos, aLength, aBuf, aWholeMedia);
300
1d28c8722707 201043_09
hgs
parents: 0
diff changeset
   244
        }
0
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   245
300
1d28c8722707 201043_09
hgs
parents: 0
diff changeset
   246
    iCritSec.Signal();
1d28c8722707 201043_09
hgs
parents: 0
diff changeset
   247
    return err;
1d28c8722707 201043_09
hgs
parents: 0
diff changeset
   248
    }
0
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
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   251
/**
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   252
Write to the target drive unit.
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   253
@return KErrNone on success, otherwise system wide error code
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   254
*/
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   255
TInt CMassStorageDrive::Write(const TInt64& aPos, TDesC8& aBuf, TBool aWholeMedia)
300
1d28c8722707 201043_09
hgs
parents: 0
diff changeset
   256
    {
1d28c8722707 201043_09
hgs
parents: 0
diff changeset
   257
    TInt err = KErrNone;
1d28c8722707 201043_09
hgs
parents: 0
diff changeset
   258
    iCritSec.Wait();
0
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   259
300
1d28c8722707 201043_09
hgs
parents: 0
diff changeset
   260
    if (iMountState != EConnected)
1d28c8722707 201043_09
hgs
parents: 0
diff changeset
   261
        {
1d28c8722707 201043_09
hgs
parents: 0
diff changeset
   262
        err = KErrDisconnected;
1d28c8722707 201043_09
hgs
parents: 0
diff changeset
   263
        }
1d28c8722707 201043_09
hgs
parents: 0
diff changeset
   264
    else
1d28c8722707 201043_09
hgs
parents: 0
diff changeset
   265
        {
1d28c8722707 201043_09
hgs
parents: 0
diff changeset
   266
        __ASSERT_DEBUG(iLocalDrive, User::Invariant());
0
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   267
        err = iLocalDrive->Write(aPos, aBuf, aWholeMedia);
300
1d28c8722707 201043_09
hgs
parents: 0
diff changeset
   268
        }
0
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   269
300
1d28c8722707 201043_09
hgs
parents: 0
diff changeset
   270
    iCritSec.Signal();
1d28c8722707 201043_09
hgs
parents: 0
diff changeset
   271
    return err;
1d28c8722707 201043_09
hgs
parents: 0
diff changeset
   272
    }
0
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   273
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   274
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   275
/**
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   276
Provides an interface to CProxyDrive::Caps that hides the
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   277
package buffer.
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   278
@return KErrNone on success, otherwise system wide error code
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   279
@param aInfo
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   280
*/
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   281
TInt CMassStorageDrive::DoCaps(TLocalDriveCapsV4& aInfo)
300
1d28c8722707 201043_09
hgs
parents: 0
diff changeset
   282
    {
0
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   283
    TInt err = KErrDisMounted;
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   284
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   285
    if (iLocalDrive)
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   286
        {
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   287
        err = iLocalDrive->Caps(aInfo);
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   288
        }
300
1d28c8722707 201043_09
hgs
parents: 0
diff changeset
   289
    return err;
1d28c8722707 201043_09
hgs
parents: 0
diff changeset
   290
    }
0
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   291
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
/**
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   294
Publish media error, user should reinsert the memory card.
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   295
Similar to FAT32's TDriver::HandleCriticalError.
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   296
Note: User notification is not implemented, instead we abort and dismount.
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   297
*/
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   298
TInt CMassStorageDrive::HandleCriticalError()
300
1d28c8722707 201043_09
hgs
parents: 0
diff changeset
   299
    {
1d28c8722707 201043_09
hgs
parents: 0
diff changeset
   300
    TRAPD(err, iDriveMediaErrorPublisher->PublishErrorL(ETrue));
0
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   301
    // ignore leave
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   302
    err = err;
300
1d28c8722707 201043_09
hgs
parents: 0
diff changeset
   303
    return KErrAbort;
1d28c8722707 201043_09
hgs
parents: 0
diff changeset
   304
    }
0
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   305
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   306
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   307
TInt CMassStorageDrive::ClearCriticalError()
300
1d28c8722707 201043_09
hgs
parents: 0
diff changeset
   308
    {
1d28c8722707 201043_09
hgs
parents: 0
diff changeset
   309
    TRAPD(err, iDriveMediaErrorPublisher->PublishErrorL(EFalse));
0
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   310
    // ignore leave
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   311
    err = err;
300
1d28c8722707 201043_09
hgs
parents: 0
diff changeset
   312
    return KErrNone;
1d28c8722707 201043_09
hgs
parents: 0
diff changeset
   313
    }
0
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   314
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   315
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   316
/**
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   317
Checks the Media Changed flag, and optionally resets it.
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   318
@return The state of the Media Changed flag.
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   319
@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
   320
*/
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   321
TBool CMassStorageDrive::IsMediaChanged(TBool aReset)
300
1d28c8722707 201043_09
hgs
parents: 0
diff changeset
   322
    {
1d28c8722707 201043_09
hgs
parents: 0
diff changeset
   323
    iCritSec.Wait();
0
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   324
300
1d28c8722707 201043_09
hgs
parents: 0
diff changeset
   325
    TBool mediaChanged = EFalse;
1d28c8722707 201043_09
hgs
parents: 0
diff changeset
   326
    if (iLocalDrive)
1d28c8722707 201043_09
hgs
parents: 0
diff changeset
   327
        {
1d28c8722707 201043_09
hgs
parents: 0
diff changeset
   328
        mediaChanged = iLocalDrive->IsMediaChanged(aReset);
0
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   329
        }
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   330
300
1d28c8722707 201043_09
hgs
parents: 0
diff changeset
   331
    iCritSec.Signal();
0
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   332
300
1d28c8722707 201043_09
hgs
parents: 0
diff changeset
   333
    __PRINT1(_L("CMassStorageDrive::IsMediaChanged: returning %d\n"), mediaChanged);
1d28c8722707 201043_09
hgs
parents: 0
diff changeset
   334
    return mediaChanged;
1d28c8722707 201043_09
hgs
parents: 0
diff changeset
   335
    }
0
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   336
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   337
/**
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   338
Set the Drive State to Active or Idle.
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   339
@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
   340
@param aCritical ETrue for Active, EFalse for Idle
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   341
*/
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   342
TInt CMassStorageDrive::SetCritical(TBool aCritical)
300
1d28c8722707 201043_09
hgs
parents: 0
diff changeset
   343
    {
1d28c8722707 201043_09
hgs
parents: 0
diff changeset
   344
    TInt err = KErrDisMounted;
1d28c8722707 201043_09
hgs
parents: 0
diff changeset
   345
    iCritSec.Wait();
1d28c8722707 201043_09
hgs
parents: 0
diff changeset
   346
    if (iLocalDrive)
1d28c8722707 201043_09
hgs
parents: 0
diff changeset
   347
        {
1d28c8722707 201043_09
hgs
parents: 0
diff changeset
   348
        err = iLocalDrive->SetCritical(aCritical);
1d28c8722707 201043_09
hgs
parents: 0
diff changeset
   349
        }
0
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   350
300
1d28c8722707 201043_09
hgs
parents: 0
diff changeset
   351
    iCritSec.Signal();
1d28c8722707 201043_09
hgs
parents: 0
diff changeset
   352
    return err;
1d28c8722707 201043_09
hgs
parents: 0
diff changeset
   353
    }
0
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   354
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   355
/**
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   356
Set the mount state
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   357
*/
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   358
void CMassStorageDrive::SetMountConnectedL(CProxyDrive& aProxyDrive,
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   359
                                           TBool& aMediaChanged,
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   360
                                           RDriveStateChangedPublisher& aDriveStateChangedPublisher)
300
1d28c8722707 201043_09
hgs
parents: 0
diff changeset
   361
    {
1d28c8722707 201043_09
hgs
parents: 0
diff changeset
   362
    TLocalDriveRef* localDrive = NULL;
0
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   363
300
1d28c8722707 201043_09
hgs
parents: 0
diff changeset
   364
    __PRINT(_L("SetMountConnectedL entering critical section\n"));
1d28c8722707 201043_09
hgs
parents: 0
diff changeset
   365
    iCritSec.Wait(); // note: signalled in SetMountState
0
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   366
300
1d28c8722707 201043_09
hgs
parents: 0
diff changeset
   367
    TRAPD(err, localDrive = new (ELeave) TLocalDriveRef(aProxyDrive,
0
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   368
                                                        aMediaChanged,
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   369
                                                        aDriveStateChangedPublisher));
300
1d28c8722707 201043_09
hgs
parents: 0
diff changeset
   370
    if (err)
1d28c8722707 201043_09
hgs
parents: 0
diff changeset
   371
        {
1d28c8722707 201043_09
hgs
parents: 0
diff changeset
   372
        iCritSec.Signal();
1d28c8722707 201043_09
hgs
parents: 0
diff changeset
   373
        User::Leave(err);
1d28c8722707 201043_09
hgs
parents: 0
diff changeset
   374
        }
1d28c8722707 201043_09
hgs
parents: 0
diff changeset
   375
    iLocalDrive = localDrive;
1d28c8722707 201043_09
hgs
parents: 0
diff changeset
   376
    SetMountState(EConnected, ETrue);
1d28c8722707 201043_09
hgs
parents: 0
diff changeset
   377
    }
0
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   378
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   379
/**
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   380
@return KErrNone
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   381
@param aNewState
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   382
@param aLocalDrive Only provide this if aNewState is EConnected.
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   383
*/
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   384
void CMassStorageDrive::SetMountState(TMountState aNewState, TBool aCriticalSection/*=EFalse*/)
300
1d28c8722707 201043_09
hgs
parents: 0
diff changeset
   385
    {
1d28c8722707 201043_09
hgs
parents: 0
diff changeset
   386
    if(iMountState == aNewState)
1d28c8722707 201043_09
hgs
parents: 0
diff changeset
   387
        {
1d28c8722707 201043_09
hgs
parents: 0
diff changeset
   388
        __PRINT(_L("SetMountState: No change\n"));
1d28c8722707 201043_09
hgs
parents: 0
diff changeset
   389
        }
1d28c8722707 201043_09
hgs
parents: 0
diff changeset
   390
    else
1d28c8722707 201043_09
hgs
parents: 0
diff changeset
   391
        {
1d28c8722707 201043_09
hgs
parents: 0
diff changeset
   392
        // If called from SetMountConnected, already in critical section,
0
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   393
        // otherwise, must enter it here.
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   394
        if (!aCriticalSection)
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   395
            {
300
1d28c8722707 201043_09
hgs
parents: 0
diff changeset
   396
            iCritSec.Wait();
0
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   397
            }
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   398
300
1d28c8722707 201043_09
hgs
parents: 0
diff changeset
   399
        switch(aNewState)
1d28c8722707 201043_09
hgs
parents: 0
diff changeset
   400
            {
1d28c8722707 201043_09
hgs
parents: 0
diff changeset
   401
            case EDisconnected:
1d28c8722707 201043_09
hgs
parents: 0
diff changeset
   402
                delete iLocalDrive;
1d28c8722707 201043_09
hgs
parents: 0
diff changeset
   403
                iLocalDrive = NULL;
1d28c8722707 201043_09
hgs
parents: 0
diff changeset
   404
                break;
0
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   405
300
1d28c8722707 201043_09
hgs
parents: 0
diff changeset
   406
            case EConnected:
1d28c8722707 201043_09
hgs
parents: 0
diff changeset
   407
            case EDisconnecting:
1d28c8722707 201043_09
hgs
parents: 0
diff changeset
   408
            case EConnecting:
1d28c8722707 201043_09
hgs
parents: 0
diff changeset
   409
                // Do not change iLocalDrive for these state changes
1d28c8722707 201043_09
hgs
parents: 0
diff changeset
   410
                break;
1d28c8722707 201043_09
hgs
parents: 0
diff changeset
   411
            }
0
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   412
300
1d28c8722707 201043_09
hgs
parents: 0
diff changeset
   413
        iMountState = aNewState;
1d28c8722707 201043_09
hgs
parents: 0
diff changeset
   414
        __PRINT1(_L("SetMountState: state=%d\n"), iMountState);
0
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   415
300
1d28c8722707 201043_09
hgs
parents: 0
diff changeset
   416
        iDriveStateChangedPublisher.DriveStateChanged();
1d28c8722707 201043_09
hgs
parents: 0
diff changeset
   417
        iCritSec.Signal();
1d28c8722707 201043_09
hgs
parents: 0
diff changeset
   418
        __PRINT(_L("SetMountState has left the critical section\n"));
1d28c8722707 201043_09
hgs
parents: 0
diff changeset
   419
        }
1d28c8722707 201043_09
hgs
parents: 0
diff changeset
   420
    }
0
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   421
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   422
/**
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   423
@return Current drive media state
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   424
*/
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   425
TLocalDriveRef::TDriveState CMassStorageDrive::DriveState() const
300
1d28c8722707 201043_09
hgs
parents: 0
diff changeset
   426
    {
1d28c8722707 201043_09
hgs
parents: 0
diff changeset
   427
    return iLocalDrive ? iLocalDrive->DriveState() : TLocalDriveRef::EErrDisMounted;
1d28c8722707 201043_09
hgs
parents: 0
diff changeset
   428
    }
0
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   429
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   430
/**
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   431
Check for media not present, and return the drive state.
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   432
@return Current drive media state
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   433
*/
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   434
TLocalDriveRef::TDriveState CMassStorageDrive::CheckDriveState()
300
1d28c8722707 201043_09
hgs
parents: 0
diff changeset
   435
    {
1d28c8722707 201043_09
hgs
parents: 0
diff changeset
   436
    TLocalDriveRef::TDriveState state = TLocalDriveRef::EErrDisMounted;
1d28c8722707 201043_09
hgs
parents: 0
diff changeset
   437
    iCritSec.Wait();
0
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   438
300
1d28c8722707 201043_09
hgs
parents: 0
diff changeset
   439
    if (iLocalDrive)
1d28c8722707 201043_09
hgs
parents: 0
diff changeset
   440
        {
1d28c8722707 201043_09
hgs
parents: 0
diff changeset
   441
        TInt err = KErrGeneral;
0
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   442
        TLocalDriveCapsV4 caps;
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   443
300
1d28c8722707 201043_09
hgs
parents: 0
diff changeset
   444
        FOREVER
1d28c8722707 201043_09
hgs
parents: 0
diff changeset
   445
            {
1d28c8722707 201043_09
hgs
parents: 0
diff changeset
   446
            // Initialise in case Caps() fails
1d28c8722707 201043_09
hgs
parents: 0
diff changeset
   447
            caps.iType = ::EMediaNotPresent;
1d28c8722707 201043_09
hgs
parents: 0
diff changeset
   448
            err = DoCaps(caps);
0
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   449
300
1d28c8722707 201043_09
hgs
parents: 0
diff changeset
   450
            __PRINTERR(_L("CheckDriveState: DoCaps err=%d\n"), err);
1d28c8722707 201043_09
hgs
parents: 0
diff changeset
   451
            if (err == KErrNotReady || (err == KErrNone && caps.iType == ::EMediaNotPresent))
1d28c8722707 201043_09
hgs
parents: 0
diff changeset
   452
                {
1d28c8722707 201043_09
hgs
parents: 0
diff changeset
   453
                __PRINT(_L("CheckDriveState: detected MediaNotPresent\n"));
0
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   454
300
1d28c8722707 201043_09
hgs
parents: 0
diff changeset
   455
                SetDriveState(TLocalDriveRef::EMediaNotPresent);
0
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   456
300
1d28c8722707 201043_09
hgs
parents: 0
diff changeset
   457
                if (HandleCriticalError() == KErrAbort)
1d28c8722707 201043_09
hgs
parents: 0
diff changeset
   458
                    break;
1d28c8722707 201043_09
hgs
parents: 0
diff changeset
   459
                }
1d28c8722707 201043_09
hgs
parents: 0
diff changeset
   460
            else
1d28c8722707 201043_09
hgs
parents: 0
diff changeset
   461
                {
1d28c8722707 201043_09
hgs
parents: 0
diff changeset
   462
                ClearCriticalError();
1d28c8722707 201043_09
hgs
parents: 0
diff changeset
   463
                break;
1d28c8722707 201043_09
hgs
parents: 0
diff changeset
   464
                }
1d28c8722707 201043_09
hgs
parents: 0
diff changeset
   465
            }
0
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   466
300
1d28c8722707 201043_09
hgs
parents: 0
diff changeset
   467
        if (err == KErrNone && caps.iType != ::EMediaNotPresent)
1d28c8722707 201043_09
hgs
parents: 0
diff changeset
   468
            {
0
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   469
            iMediaParams.Init(caps);
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   470
            TLocalDriveRef::TDriveState driveState = TLocalDriveRef::EIdle;
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   471
300
1d28c8722707 201043_09
hgs
parents: 0
diff changeset
   472
            if (iLocalDrive->DriveState() == TLocalDriveRef::EMediaNotPresent)
1d28c8722707 201043_09
hgs
parents: 0
diff changeset
   473
                {
1d28c8722707 201043_09
hgs
parents: 0
diff changeset
   474
                __PRINT(_L("CheckDriveState: detected media inserted\n"));
1d28c8722707 201043_09
hgs
parents: 0
diff changeset
   475
                }
1d28c8722707 201043_09
hgs
parents: 0
diff changeset
   476
            else if (iLocalDrive->DriveState() == TLocalDriveRef::ELocked &&
1d28c8722707 201043_09
hgs
parents: 0
diff changeset
   477
                     !(caps.iMediaAtt & KMediaAttLocked))
1d28c8722707 201043_09
hgs
parents: 0
diff changeset
   478
                {
1d28c8722707 201043_09
hgs
parents: 0
diff changeset
   479
                __PRINT(_L("CheckDriveState: detected media unlocked\n"));
1d28c8722707 201043_09
hgs
parents: 0
diff changeset
   480
                }
1d28c8722707 201043_09
hgs
parents: 0
diff changeset
   481
            else if (caps.iMediaAtt & KMediaAttLocked)
1d28c8722707 201043_09
hgs
parents: 0
diff changeset
   482
                {
1d28c8722707 201043_09
hgs
parents: 0
diff changeset
   483
                __PRINT(_L("CheckDriveState: detected media locked\n"));
1d28c8722707 201043_09
hgs
parents: 0
diff changeset
   484
                driveState = TLocalDriveRef::ELocked;
1d28c8722707 201043_09
hgs
parents: 0
diff changeset
   485
                }
0
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   486
            SetDriveState(driveState);
300
1d28c8722707 201043_09
hgs
parents: 0
diff changeset
   487
            }
0
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   488
300
1d28c8722707 201043_09
hgs
parents: 0
diff changeset
   489
        // Get the current state
1d28c8722707 201043_09
hgs
parents: 0
diff changeset
   490
        state = iLocalDrive->DriveState();
1d28c8722707 201043_09
hgs
parents: 0
diff changeset
   491
        }
0
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   492
300
1d28c8722707 201043_09
hgs
parents: 0
diff changeset
   493
    iCritSec.Signal();
0
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   494
300
1d28c8722707 201043_09
hgs
parents: 0
diff changeset
   495
    return state;
1d28c8722707 201043_09
hgs
parents: 0
diff changeset
   496
    }
0
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   497
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   498
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   499
/**
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   500
@param aNewState
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   501
*/
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   502
void CMassStorageDrive::SetDriveState(TLocalDriveRef::TDriveState aNewState)
300
1d28c8722707 201043_09
hgs
parents: 0
diff changeset
   503
    {
1d28c8722707 201043_09
hgs
parents: 0
diff changeset
   504
    __ASSERT_DEBUG(aNewState == TLocalDriveRef::EIdle ||
0
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   505
                   (iMountState == EConnected && NULL != iLocalDrive) ||
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   506
                   (iMountState == EDisconnecting && NULL != iLocalDrive),
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   507
        User::Invariant());
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   508
300
1d28c8722707 201043_09
hgs
parents: 0
diff changeset
   509
    if (!iLocalDrive)
1d28c8722707 201043_09
hgs
parents: 0
diff changeset
   510
        {
1d28c8722707 201043_09
hgs
parents: 0
diff changeset
   511
        __PRINT(_L("SetDriveState: Drive not mounted.\n"));
1d28c8722707 201043_09
hgs
parents: 0
diff changeset
   512
        }
1d28c8722707 201043_09
hgs
parents: 0
diff changeset
   513
    else
1d28c8722707 201043_09
hgs
parents: 0
diff changeset
   514
        {
0
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   515
        iLocalDrive->SetDriveState(aNewState);
300
1d28c8722707 201043_09
hgs
parents: 0
diff changeset
   516
        __PRINT2(_L("SetDriveState: %d->%d\n"), iLocalDrive->iDriveState, aNewState);
1d28c8722707 201043_09
hgs
parents: 0
diff changeset
   517
        }
1d28c8722707 201043_09
hgs
parents: 0
diff changeset
   518
    }
0
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   519
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   520
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   521
/////////////////////////////////////////////////////////////////
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   522
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   523
/**
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   524
Construct a CDriveManager object.
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   525
@param aDriveMap Reference to array mapping lun to drive number for supported
300
1d28c8722707 201043_09
hgs
parents: 0
diff changeset
   526
       mass storage drives.
0
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   527
*/
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   528
CDriveManager* CDriveManager::NewL(const TLunToDriveMap& aDriveMap)
300
1d28c8722707 201043_09
hgs
parents: 0
diff changeset
   529
    {
1d28c8722707 201043_09
hgs
parents: 0
diff changeset
   530
    __PRINT1(_L("CDriveManager::NewL - %d drives\n"), aDriveMap.Count());
0
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   531
300
1d28c8722707 201043_09
hgs
parents: 0
diff changeset
   532
    CDriveManager* self = new (ELeave) CDriveManager(aDriveMap.Count() -1);
1d28c8722707 201043_09
hgs
parents: 0
diff changeset
   533
    CleanupStack::PushL(self);
1d28c8722707 201043_09
hgs
parents: 0
diff changeset
   534
    self->ConstructL(aDriveMap);
1d28c8722707 201043_09
hgs
parents: 0
diff changeset
   535
    CleanupStack::Pop();
1d28c8722707 201043_09
hgs
parents: 0
diff changeset
   536
    return self;
1d28c8722707 201043_09
hgs
parents: 0
diff changeset
   537
    }
0
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   538
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   539
CDriveManager::CDriveManager(TLun aMaxLun)
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   540
:   iMaxLun(aMaxLun)
300
1d28c8722707 201043_09
hgs
parents: 0
diff changeset
   541
    {
0
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
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   544
/**
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   545
Construct a CDriveManager object.
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   546
*/
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   547
void CDriveManager::ConstructL(const TLunToDriveMap& aDriveMap)
300
1d28c8722707 201043_09
hgs
parents: 0
diff changeset
   548
    {
1d28c8722707 201043_09
hgs
parents: 0
diff changeset
   549
    User::LeaveIfError(iDriveCritSec.CreateLocal());
0
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
    iDriveStateChangedPublisher = new (ELeave) RDriveStateChangedPublisher(iDrives, aDriveMap);
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   552
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   553
    iDrives.Reserve(iMaxLun + 1);
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   554
300
1d28c8722707 201043_09
hgs
parents: 0
diff changeset
   555
    for (TLun lun = 0; lun < iMaxLun + 1; lun++)
1d28c8722707 201043_09
hgs
parents: 0
diff changeset
   556
        {
1d28c8722707 201043_09
hgs
parents: 0
diff changeset
   557
        iDrives.Append(CMassStorageDrive::NewL(iDriveCritSec,
0
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   558
                                               *iDriveStateChangedPublisher));
300
1d28c8722707 201043_09
hgs
parents: 0
diff changeset
   559
        }
0
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   560
300
1d28c8722707 201043_09
hgs
parents: 0
diff changeset
   561
    // Publish initial drive state
1d28c8722707 201043_09
hgs
parents: 0
diff changeset
   562
    if (iDrives.Count() > 0)
1d28c8722707 201043_09
hgs
parents: 0
diff changeset
   563
        {
1d28c8722707 201043_09
hgs
parents: 0
diff changeset
   564
        iDriveStateChangedPublisher->DriveStateChanged();
1d28c8722707 201043_09
hgs
parents: 0
diff changeset
   565
        }
1d28c8722707 201043_09
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
/**
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   569
Destructor
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   570
*/
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   571
CDriveManager::~CDriveManager()
300
1d28c8722707 201043_09
hgs
parents: 0
diff changeset
   572
    {
1d28c8722707 201043_09
hgs
parents: 0
diff changeset
   573
    iDrives.ResetAndDestroy();
1d28c8722707 201043_09
hgs
parents: 0
diff changeset
   574
    delete iDriveStateChangedPublisher;
1d28c8722707 201043_09
hgs
parents: 0
diff changeset
   575
    iDriveCritSec.Close();
1d28c8722707 201043_09
hgs
parents: 0
diff changeset
   576
    }
0
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   577
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   578
/**
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   579
Set the mount state to Connected and specify the Proxy Drive.
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   580
@return KErrNone on success, otherwise system wide error code
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   581
@param aDrive The mounted Proxy Drive
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   582
@param aLun The Logical Drive Unit identifier (0..numDrives-1)
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   583
@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
   584
     same as it was the last time this function was called.
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   585
@post The Mount State will be Connected.
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   586
*/
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   587
void CDriveManager::RegisterDriveL(CProxyDrive& aProxyDrive, TBool& aMediaChanged, TLun aLun)
300
1d28c8722707 201043_09
hgs
parents: 0
diff changeset
   588
    {
1d28c8722707 201043_09
hgs
parents: 0
diff changeset
   589
    __PRINT1(_L("Lun=%d \n"),aLun);
1d28c8722707 201043_09
hgs
parents: 0
diff changeset
   590
    CMassStorageDrive* drive = Drive(aLun);
1d28c8722707 201043_09
hgs
parents: 0
diff changeset
   591
    drive->SetMountConnectedL(aProxyDrive, aMediaChanged, *iDriveStateChangedPublisher);
1d28c8722707 201043_09
hgs
parents: 0
diff changeset
   592
    }
0
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
/**
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   595
Set the mount state to Disconnected.
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   596
@return KErrNone on success, otherwise system wide error code
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   597
@param aLun The Logical Drive Unit identifier (0..numDrives-1)
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   598
@post The Mount State will be Disconnected.
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   599
*/
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   600
void CDriveManager::DeregisterDrive(TLun aLun)
300
1d28c8722707 201043_09
hgs
parents: 0
diff changeset
   601
    {
0
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   602
    CMassStorageDrive* drive = Drive(aLun);
300
1d28c8722707 201043_09
hgs
parents: 0
diff changeset
   603
    drive->SetMountDisconnected();
1d28c8722707 201043_09
hgs
parents: 0
diff changeset
   604
    }
0
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   605
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   606
/**
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   607
Return a pointer to the drive specified aLun, or NULL if aLun is invalid.
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   608
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   609
@return Pointer to the specified drive, or NULL.
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   610
@param aLun The Logical Drive Unit identifier (0..numDrives-1)
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   611
@param aError KErrNone on success, KErrArgument if NULL is returned.
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   612
*/
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   613
CMassStorageDrive* CDriveManager::Drive(TLun aLun) const
300
1d28c8722707 201043_09
hgs
parents: 0
diff changeset
   614
    {
1d28c8722707 201043_09
hgs
parents: 0
diff changeset
   615
    __ASSERT_DEBUG(aLun < iDrives.Count(), User::Invariant());
0
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   616
    return iDrives[aLun];
300
1d28c8722707 201043_09
hgs
parents: 0
diff changeset
   617
    }
0
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   618
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   619
/**
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   620
Checks the Media Changed flag, and optionally resets it.
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   621
@return The state of the Media Changed flag.
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   622
@param aLun The Logical Drive Unit identifier (0..numDrives-1)
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   623
@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
   624
*/
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   625
TBool CDriveManager::IsMediaChanged(TLun aLun, TBool aReset)
300
1d28c8722707 201043_09
hgs
parents: 0
diff changeset
   626
    {
1d28c8722707 201043_09
hgs
parents: 0
diff changeset
   627
    CMassStorageDrive* drive = Drive(aLun);
1d28c8722707 201043_09
hgs
parents: 0
diff changeset
   628
    return drive->IsMediaChanged(aReset);
1d28c8722707 201043_09
hgs
parents: 0
diff changeset
   629
    }
0
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   630
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
Set the Drive State to Active or Idle.
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   633
Ref: 3.6.3.2 - PREVENT_MEDIUM_REMOVAL
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   634
@return KErrNone on success, otherwise system wide error code
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   635
@param aLun The Logical Drive Unit identifier (0..numDrives-1)
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   636
@param aCritical ETrue for Active, EFalse for Idle
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   637
*/
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   638
TInt CDriveManager::SetCritical(TLun aLun, TBool aCritical)
300
1d28c8722707 201043_09
hgs
parents: 0
diff changeset
   639
    {
1d28c8722707 201043_09
hgs
parents: 0
diff changeset
   640
    TInt err = KErrUnknown; // never return this
0
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   641
300
1d28c8722707 201043_09
hgs
parents: 0
diff changeset
   642
    TLun i = aLun;
1d28c8722707 201043_09
hgs
parents: 0
diff changeset
   643
    TLun cnt = aLun + 1;
0
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   644
300
1d28c8722707 201043_09
hgs
parents: 0
diff changeset
   645
    if (aLun == KAllLuns)
1d28c8722707 201043_09
hgs
parents: 0
diff changeset
   646
        {
1d28c8722707 201043_09
hgs
parents: 0
diff changeset
   647
        i = 0;
1d28c8722707 201043_09
hgs
parents: 0
diff changeset
   648
        cnt = iMaxLun + 1;
1d28c8722707 201043_09
hgs
parents: 0
diff changeset
   649
        }
0
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   650
300
1d28c8722707 201043_09
hgs
parents: 0
diff changeset
   651
    for(; i < cnt; i++)
1d28c8722707 201043_09
hgs
parents: 0
diff changeset
   652
        {
1d28c8722707 201043_09
hgs
parents: 0
diff changeset
   653
        CMassStorageDrive* drive = Drive(i);
1d28c8722707 201043_09
hgs
parents: 0
diff changeset
   654
        err = drive->SetCritical(aCritical);
1d28c8722707 201043_09
hgs
parents: 0
diff changeset
   655
        }
1d28c8722707 201043_09
hgs
parents: 0
diff changeset
   656
    return err;
1d28c8722707 201043_09
hgs
parents: 0
diff changeset
   657
    }
0
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   658
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   659
void CDriveManager::Connect()
300
1d28c8722707 201043_09
hgs
parents: 0
diff changeset
   660
    {
0
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   661
    TLun lun = iMaxLun;
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   662
    do
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   663
        {
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   664
        Connect(lun);
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   665
        }
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   666
    while(--lun >= 0);
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   667
    }
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   668
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
Inititiate transition to Connected.
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   671
@return KErrNone on success, otherwise system wide error code
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   672
@param aLun The Logical Drive Unit identifier (0..numDrives-1)
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   673
@post The Mount State will be Connected or Connecting.
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   674
*/
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   675
void CDriveManager::Connect(TLun aLun)
300
1d28c8722707 201043_09
hgs
parents: 0
diff changeset
   676
    {
1d28c8722707 201043_09
hgs
parents: 0
diff changeset
   677
    CMassStorageDrive* drive = Drive(aLun);
0
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   678
300
1d28c8722707 201043_09
hgs
parents: 0
diff changeset
   679
    __PRINT2(_L("CDriveManager::Connect lun=%d, mountState=%d\n"), aLun, drive->MountState());
0
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   680
300
1d28c8722707 201043_09
hgs
parents: 0
diff changeset
   681
    switch(drive->MountState())
1d28c8722707 201043_09
hgs
parents: 0
diff changeset
   682
        {
1d28c8722707 201043_09
hgs
parents: 0
diff changeset
   683
    case CMassStorageDrive::EDisconnected:
1d28c8722707 201043_09
hgs
parents: 0
diff changeset
   684
        drive->SetMountConnecting();
1d28c8722707 201043_09
hgs
parents: 0
diff changeset
   685
        break;
1d28c8722707 201043_09
hgs
parents: 0
diff changeset
   686
    case CMassStorageDrive::EDisconnecting:
1d28c8722707 201043_09
hgs
parents: 0
diff changeset
   687
        drive->SetMountConnected();
1d28c8722707 201043_09
hgs
parents: 0
diff changeset
   688
        break;
1d28c8722707 201043_09
hgs
parents: 0
diff changeset
   689
    case CMassStorageDrive::EConnected:
1d28c8722707 201043_09
hgs
parents: 0
diff changeset
   690
    case CMassStorageDrive::EConnecting:
0
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   691
    default:
300
1d28c8722707 201043_09
hgs
parents: 0
diff changeset
   692
        // do nothing
1d28c8722707 201043_09
hgs
parents: 0
diff changeset
   693
        break;
1d28c8722707 201043_09
hgs
parents: 0
diff changeset
   694
        }
1d28c8722707 201043_09
hgs
parents: 0
diff changeset
   695
    }
0
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   696
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   697
void CDriveManager::Disconnect()
300
1d28c8722707 201043_09
hgs
parents: 0
diff changeset
   698
    {
0
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   699
    TLun lun = iMaxLun;
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   700
    do
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   701
        {
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   702
        Disconnect(lun);
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   703
        }
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   704
    while(--lun >= 0);
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   705
    }
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   706
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   707
/**
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   708
Inititiate transition to Disconnected.
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   709
@return KErrNone on success, otherwise system wide error code
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   710
@param aLun The Logical Drive Unit identifier (0..numDrives-1)
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   711
@post The Mount State will be Disconnected or Disconnecting.
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   712
*/
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   713
void CDriveManager::Disconnect(TLun aLun)
300
1d28c8722707 201043_09
hgs
parents: 0
diff changeset
   714
    {
1d28c8722707 201043_09
hgs
parents: 0
diff changeset
   715
    CMassStorageDrive* drive = Drive(aLun);
1d28c8722707 201043_09
hgs
parents: 0
diff changeset
   716
    switch (drive->MountState())
1d28c8722707 201043_09
hgs
parents: 0
diff changeset
   717
        {
1d28c8722707 201043_09
hgs
parents: 0
diff changeset
   718
    case CMassStorageDrive::EConnected:
1d28c8722707 201043_09
hgs
parents: 0
diff changeset
   719
        drive->SetMountDisconnecting();
1d28c8722707 201043_09
hgs
parents: 0
diff changeset
   720
        break;
1d28c8722707 201043_09
hgs
parents: 0
diff changeset
   721
    case CMassStorageDrive::EConnecting:
1d28c8722707 201043_09
hgs
parents: 0
diff changeset
   722
        drive->SetMountDisconnected();
1d28c8722707 201043_09
hgs
parents: 0
diff changeset
   723
        break;
1d28c8722707 201043_09
hgs
parents: 0
diff changeset
   724
    case CMassStorageDrive::EDisconnected:
1d28c8722707 201043_09
hgs
parents: 0
diff changeset
   725
    case CMassStorageDrive::EDisconnecting:
1d28c8722707 201043_09
hgs
parents: 0
diff changeset
   726
        // do nothing
1d28c8722707 201043_09
hgs
parents: 0
diff changeset
   727
        break;
1d28c8722707 201043_09
hgs
parents: 0
diff changeset
   728
        }
1d28c8722707 201043_09
hgs
parents: 0
diff changeset
   729
    }