From ee02a9c7c51d069de26f04d8d9464d573ed82d22 Mon Sep 17 00:00:00 2001 From: Benjamin Dobell Date: Wed, 28 Mar 2012 23:59:27 +1100 Subject: Made the last parameter of EndFileTransferPacket partitionType (obtained from the device's PIT) --- heimdall/source/main.cpp | 45 +++++++++++++++++++++++++++------------------ 1 file changed, 27 insertions(+), 18 deletions(-) (limited to 'heimdall/source/main.cpp') diff --git a/heimdall/source/main.cpp b/heimdall/source/main.cpp index 2d05e33..bd4403b 100644 --- a/heimdall/source/main.cpp +++ b/heimdall/source/main.cpp @@ -69,13 +69,15 @@ enum vector knownPartitionNames[kKnownPartitionCount]; -struct PartitionNameFilePair +struct PartitionInfo { + unsigned int partitionType; string partitionName; FILE *file; - PartitionNameFilePair(const char *partitionName, FILE *file) + PartitionInfo(unsigned int partitionType, const char *partitionName, FILE *file) { + this->partitionType = partitionType; this->partitionName = partitionName; this->file = file; } @@ -179,7 +181,7 @@ bool openFiles(const map& argumentMap, map& argu return (true); } -bool mapFilesToPartitions(const map& argumentFileMap, const PitData *pitData, map& partitionFileMap) +bool mapFilesToPartitions(const map& argumentFileMap, const PitData *pitData, map& partitionInfoMap) { map::const_iterator it = argumentFileMap.begin(); @@ -216,8 +218,9 @@ bool mapFilesToPartitions(const map& argumentFileMap, const PitD if (!pitEntry && knownPartition == kKnownPartitionPit) { - PartitionNameFilePair partitionNameFilePair(knownPartitionNames[kKnownPartitionPit][0], it->second); - partitionFileMap.insert(pair(static_cast(-1), partitionNameFilePair)); + // NOTE: We're assuming a PIT file always has partitionType zero. + PartitionInfo partitionInfo(0, knownPartitionNames[kKnownPartitionPit][0], it->second); + partitionInfoMap.insert(pair(0xFFFFFFFF, partitionInfo)); return (true); } @@ -229,8 +232,8 @@ bool mapFilesToPartitions(const map& argumentFileMap, const PitD return (false); } - PartitionNameFilePair partitionNameFilePair(pitEntry->GetPartitionName(), it->second); - partitionFileMap.insert(pair(pitEntry->GetPartitionIdentifier(), partitionNameFilePair)); + PartitionInfo partitionInfo(pitEntry->GetPartitionType(), pitEntry->GetPartitionName(), it->second); + partitionInfoMap.insert(pair(pitEntry->GetPartitionIdentifier(), partitionInfo)); } return (true); @@ -261,7 +264,7 @@ int downloadPitFile(BridgeManager *bridgeManager, unsigned char **pitBuffer) return (devicePitFileSize); } -bool flashFile(BridgeManager *bridgeManager, unsigned int partitionIndex, const char *partitionName, FILE *file) +bool flashFile(BridgeManager *bridgeManager, unsigned int partitionType, unsigned int partitionIndex, const char *partitionName, FILE *file) { // PIT files need to be handled differently, try determine if the partition we're flashing to is a PIT partition. bool isPit = false; @@ -310,7 +313,7 @@ bool flashFile(BridgeManager *bridgeManager, unsigned int partitionIndex, const //if (bridgeManager->SendFile(file, EndPhoneFileTransferPacket::kDestinationPhone, // <-- Kies method. WARNING: Doesn't work on Galaxy Tab! // EndPhoneFileTransferPacket::kFileModem)) - if (bridgeManager->SendFile(file, EndModemFileTransferPacket::kDestinationModem)) // <-- Odin method + if (bridgeManager->SendFile(file, EndModemFileTransferPacket::kDestinationModem, partitionType)) // <-- Odin method { Interface::Print("%s upload successful\n", partitionName); return (true); @@ -326,7 +329,7 @@ bool flashFile(BridgeManager *bridgeManager, unsigned int partitionIndex, const // We're uploading to a phone partition Interface::Print("Uploading %s\n", partitionName); - if (bridgeManager->SendFile(file, EndPhoneFileTransferPacket::kDestinationPhone, partitionIndex)) + if (bridgeManager->SendFile(file, EndPhoneFileTransferPacket::kDestinationPhone, partitionType, partitionIndex)) { Interface::Print("%s upload successful\n", partitionName); return (true); @@ -451,10 +454,10 @@ bool attemptFlash(BridgeManager *bridgeManager, map argumentFile } } - map partitionFileMap; + map partitionInfoMap; // Map the files being flashed to partitions stored in the PIT file. - if (!mapFilesToPartitions(argumentFileMap, pitData, partitionFileMap)) + if (!mapFilesToPartitions(argumentFileMap, pitData, partitionInfoMap)) { delete pitData; return (false); @@ -465,11 +468,13 @@ bool attemptFlash(BridgeManager *bridgeManager, map argumentFile // If we're repartitioning then we need to flash the PIT file first. if (repartition) { - for (map::iterator it = partitionFileMap.begin(); it != partitionFileMap.end(); it++) + for (map::iterator it = partitionInfoMap.begin(); it != partitionInfoMap.end(); it++) { if (it->second.file == localPitFile) { - if (!flashFile(bridgeManager, it->first, it->second.partitionName.c_str(), it->second.file)) + PartitionInfo *partitionInfo = &(it->second); + + if (!flashFile(bridgeManager, partitionInfo->partitionType, it->first, partitionInfo->partitionName.c_str(), partitionInfo->file)) return (false); break; @@ -478,21 +483,25 @@ bool attemptFlash(BridgeManager *bridgeManager, map argumentFile } // Flash partitions not involved in the boot process second. - for (map::iterator it = partitionFileMap.begin(); it != partitionFileMap.end(); it++) + for (map::iterator it = partitionInfoMap.begin(); it != partitionInfoMap.end(); it++) { if (!isKnownPartition(it->second.partitionName.c_str(), kKnownPartitionPit) && !isKnownBootPartition(it->second.partitionName.c_str())) { - if (!flashFile(bridgeManager, it->first, it->second.partitionName.c_str(), it->second.file)) + PartitionInfo *partitionInfo = &(it->second); + + if (!flashFile(bridgeManager, partitionInfo->partitionType, it->first, partitionInfo->partitionName.c_str(), partitionInfo->file)) return (false); } } // Flash boot partitions last. - for (map::iterator it = partitionFileMap.begin(); it != partitionFileMap.end(); it++) + for (map::iterator it = partitionInfoMap.begin(); it != partitionInfoMap.end(); it++) { if (isKnownBootPartition(it->second.partitionName.c_str())) { - if (!flashFile(bridgeManager, it->first, it->second.partitionName.c_str(), it->second.file)) + PartitionInfo *partitionInfo = &(it->second); + + if (!flashFile(bridgeManager, partitionInfo->partitionType, it->first, partitionInfo->partitionName.c_str(), partitionInfo->file)) return (false); } } -- cgit v1.1