userlibandfileserver/fileserver/shostmassstorage/msproxy/tmbr.cpp
changeset 300 1d28c8722707
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/userlibandfileserver/fileserver/shostmassstorage/msproxy/tmbr.cpp	Tue Nov 02 15:29:23 2010 +0000
@@ -0,0 +1,104 @@
+// Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of the License "Eclipse Public License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.eclipse.org/legal/epl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+//
+//
+
+/** @file
+@internalTechnology
+*/
+
+#include <e32cmn.h>
+#include <e32des8.h>
+#include <partitions.h>
+
+#include "mscutils.h"
+#include "tmbr.h"
+
+#include "OstTraceDefinitions.h"
+#ifdef OST_TRACE_COMPILER_IN_USE
+#include "tmbrTraces.h"
+#endif
+
+
+TInt TMbr::GetPartition(TDes8& aMbrData, TMBRPartitionEntry& aPartitionEntry)
+    {
+    TUint8* buffer = const_cast<TUint8*>(aMbrData.Ptr());
+
+    // check first sector for a Master Boot Record
+    if (LittleEndian::Get16(&buffer[KMBRSignatureOffset]) != KMBRSignature)
+        {
+        OstTrace0(TRACE_SHOSTMASSSTORAGE_MBR, TMBR_11,
+                  "MBR not present");
+        return KErrNotFound;
+        }
+
+    memcpy(&buffer[0],&buffer[KMBRFirstPartitionOffset],(sizeof(TMBRPartitionEntry)<<2));
+    TMBRPartitionEntry* pe = reinterpret_cast<TMBRPartitionEntry*>(&buffer[0]);
+
+    TInt firstValidPartitionCount = -1;
+    TInt defaultPartitionNumber = -1;
+    TInt partitionCount = 0;
+    for (TInt i = 0; i < KMBRMaxPrimaryPartitions; i++, pe++)
+        {
+        if (pe->IsValidDosPartition() || pe->IsValidFAT32Partition() || pe->IsValidExFATPartition())
+            {
+            OstTrace1(TRACE_SHOSTMASSSTORAGE_MBR, TMBR_12,
+                      "Partition %d is recognized", i);
+            partitionCount++;
+
+            if (firstValidPartitionCount < 0)
+                firstValidPartitionCount = i;
+
+            if (pe->iX86BootIndicator == KBootIndicatorBootable)
+                {
+                OstTrace1(TRACE_SHOSTMASSSTORAGE_MBR, TMBR_13,
+                          "Partition %d is bootable", i);
+                defaultPartitionNumber = i;
+                break;
+                }
+            }
+        else
+            {
+            OstTrace1(TRACE_SHOSTMASSSTORAGE_MBR, TMBR_14,
+                      "Partition %d is invalid", i);
+            }
+        }
+
+    if (partitionCount > 0)
+        {
+        pe = reinterpret_cast<TMBRPartitionEntry*>(&buffer[0]);
+        TInt partitionIndex = firstValidPartitionCount;
+        if (defaultPartitionNumber > 0)
+            {
+            partitionIndex = defaultPartitionNumber;
+            }
+
+        OstTrace1(TRACE_SHOSTMASSSTORAGE_MBR, TMBR_15,
+                  "Using Partition %d", partitionIndex);
+
+        TMBRPartitionEntry& partitionEntry = pe[partitionIndex];
+        aPartitionEntry = partitionEntry;
+
+        OstTraceExt2(TRACE_SHOSTMASSSTORAGE_MBR, TMBR_16,
+                     "partitioncount = %d defaultpartition = %d",
+                     partitionCount, partitionIndex);
+        OstTraceExt2(TRACE_SHOSTMASSSTORAGE_MBR, TMBR_17,
+                     "iFirstSector = x%x iNumSectors = x%x",
+                     partitionEntry.iFirstSector,
+                     partitionEntry.iNumSectors);
+        }
+
+    return partitionCount;
+    }
+