1
0
mirror of https://github.com/Halofreak1990/XFXFramework synced 2024-12-26 13:49:34 +01:00
XFXFramework/src/libXFX/StorageContainer.cpp
Tom Lint 95bf1d7ebc Added missing TypeInfos to XFX::Input namespace
Updated function incorrect signatures in libXFX
2013-10-03 14:40:24 +02:00

180 lines
4.8 KiB
C++

// Copyright (C) XFX Team
// All rights reserved.
//
// Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions are met:
//
// * Redistributions of source code must retain the above copyright
// notice, this list of conditions and the following disclaimer.
// * Redistributions in binary form must reproduce the above copyright
// notice, this list of conditions and the following disclaimer in the
// documentation and/or other materials provided with the distribution.
// * Neither the name of the copyright holder nor the names of any
// contributors may be used to endorse or promote products derived from
// this software without specific prior written permission.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
// POSSIBILITY OF SUCH DAMAGE.
extern "C"
{
#include <xboxkrnl/xboxkrnl.h>
}
#include <xmem.h>
#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <Storage/StorageContainer.h>
#include <Storage/StorageDevice.h>
namespace XFX
{
namespace Storage
{
typedef struct
{
char cDriveLetter;
char* szDevice;
int iPartition;
}
stDriveMapping;
stDriveMapping driveMapping[] =
{
{ 'C', "Harddisk0\\Partition2", 2},
{ 'D', "Cdrom0", -1},
{ 'E', "Harddisk0\\Partition1", 1},
{ 'X', "Harddisk0\\Partition3", 3},
{ 'Y', "Harddisk0\\Partition4", 4},
{ 'Z', "Harddisk0\\Partition5", 5},
};
char extendPartitionMapping[] = { 'F','G','R','S','V','W','A','B' };
#define NUM_OF_DRIVES (sizeof(driveMapping) / sizeof(driveMapping[0]))
#define EXTEND_PARTITION_BEGIN 6
void GetDrive(const char* szPartition, char* cDriveLetter)
{
size_t part_str_len = strlen(szPartition);
int part_num;
if (part_str_len < 19)
{
*cDriveLetter = 0;
return;
}
part_num = atoi(szPartition + 19);
if (part_num >= EXTEND_PARTITION_BEGIN)
{
*cDriveLetter = extendPartitionMapping[part_num - EXTEND_PARTITION_BEGIN];
return;
}
for (unsigned int i = 0; i < NUM_OF_DRIVES; i++)
{
if (strnicmp(driveMapping[i].szDevice, szPartition, strlen(driveMapping[i].szDevice)) == 0)
{
*cDriveLetter = driveMapping[i].cDriveLetter;
return;
}
}
*cDriveLetter = 0;
}
StorageDevice* StorageContainer::getStorageDevice() const
{
return device;
}
bool StorageContainer::IsDisposed() const
{
return isDisposed;
}
StorageContainer::~StorageContainer()
{
Dispose(false);
}
void StorageContainer::Delete()
{
containerFolder.Delete(true);
}
void StorageContainer::Dispose()
{
Dispose(true);
}
void StorageContainer::Dispose(bool disposing)
{
if (!isDisposed)
{
isDisposed = true;
if (disposing)
{
Disposing(this, EventArgs::Empty);
}
}
}
const String StorageContainer::Path() const
{
// Calculate the path to this storage location
}
const String StorageContainer::TitleLocation()
{
// XBOX returns the XeImageFileName like \device\harddisk0\partition2\apps\default.xbe
// we need to map the partitions, and strip the \default.xbe from this string
// copy the XeImageFileName to tmp, and strip the \default.xbe
//char *tmp = strncpy(tmp, XeImageFileName->Buffer, XeImageFileName->Length - 12);
auto_ptr<char> szTemp(new char[256]);
char cDriveLetter = 0;
char* szDest;
strncpy(szTemp, XeImageFileName->Buffer + 12, XeImageFileName->Length - 12);
szTemp[20] = 0;
GetDrive(szTemp, &cDriveLetter);
strncpy(szTemp, XeImageFileName->Buffer + 29, XeImageFileName->Length - 29);
szTemp[XeImageFileName->Length - 29] = 0;
sprintf(szDest, "%c:\\%s", cDriveLetter, szTemp);
return szDest;
}
const String StorageContainer::TitleName() const
{
FILE* file = fopen(XeImageFileName->Buffer, "rb");
auto_ptr<char> titleName(new char[0x50]);
uint32_t CertAddr = 0;
fseek(file, 0x118, SEEK_SET);
fread(&CertAddr, 4, 1, file);
fseek(file, CertAddr - 0x10000, SEEK_SET);
fread(titleName, 0x50, 1, file);
fclose(file);
return titleName;
}
}
}