From 622d18a9370842dfd375e58d6f37dc2c192fffb8 Mon Sep 17 00:00:00 2001 From: Kalle Olavi Niemitalo Date: Sat, 20 Oct 2007 18:42:04 +0300 Subject: [PATCH] Simplify prepareCommand:withData:. Also make sure that the result won't exceed 0xFFFF bytes. --- TFUSBController.h | 2 +- TFUSBController.m | 45 +++++++++++++++++++-------------------------- 2 files changed, 20 insertions(+), 27 deletions(-) diff --git a/TFUSBController.h b/TFUSBController.h index f414bee..849b44b 100644 --- a/TFUSBController.h +++ b/TFUSBController.h @@ -143,7 +143,7 @@ void hexDump(UInt8 *buf, int len); - (USBDeviceContext*) initializeUSB; - (id) getFileListForPath:(NSString*) path; - (UInt16) findCRC:(const UInt8*)p length:(size_t) n; -- (NSData*) prepareCommand:(unsigned int)cmd withData:(NSData*) inData ; +- (NSData*) prepareCommand:(UInt32)cmd withData:(NSData*) inData ; - (int) getFile:(NSDictionary*)fileInfo forPath:(NSString*)currentPath toSaveTo:(NSString*)savePath beginAtOffset:(unsigned long long) offset withLooping:(BOOL)looping existingTime:(NSTimeInterval)existingTime; - (NSData*) sendCommand:(NSData*) fullyPackagedCommand toDevice:(USBDeviceContext*)device expectResponse:(BOOL) getResponse careForReturn:(BOOL) careFactor; - (NSMutableData*) swap: (NSData*) inData; diff --git a/TFUSBController.m b/TFUSBController.m index 55e1f4a..0942e68 100644 --- a/TFUSBController.m +++ b/TFUSBController.m @@ -501,32 +501,25 @@ int initDevice(USBDeviceContext *device){ return ret; } -- (NSData*) prepareCommand:(unsigned int)cmd withData:(NSData*) inData { - // work out length - unsigned short int length = 0; - if (inData == nil) - length = 8; - else { - unsigned short int l = [inData length]; - length = l + 8; - } - const UInt16 length_bigendian = EndianU16_NtoB(length); - NSMutableData* toSend = [NSMutableData dataWithBytes:&length_bigendian length:2]; - const UInt32 cmd_bigendian = EndianU32_NtoB(cmd); - NSMutableData* build = [NSMutableData dataWithBytes:&cmd_bigendian length:4]; - if (inData != nil) - [build appendData:inData]; - // work out crc - UInt8 test[length]; - memset(test, 0, length); - [build getBytes:test length:[build length]]; - unsigned short int crc = [self findCRC:test length:[build length]]; - const UInt16 crc_bigendian = EndianU16_NtoB(crc); - [toSend appendData:[NSMutableData dataWithBytes:&crc_bigendian length:2]]; - [toSend appendData:build]; - // reverse and send - toSend = [self swap:toSend]; - return toSend; +- (NSData*) prepareCommand:(UInt32)cmd withData:(NSData*) inData { + NSMutableData* block = [NSMutableData dataWithLength:8]; + if (inData != nil) + [block appendData:inData]; + size_t blockLength = [block length]; + if (blockLength > 0xFFFF) + return nil; // wouldn't fit in UInt16 + + UInt32 cmd_bigendian = EndianU32_NtoB(cmd); + [block replaceBytesInRange:(NSRange){4,4} withBytes:&cmd_bigendian]; + + UInt16 crc = [self findCRC:(const UInt8*)[block bytes]+4 length:blockLength-4]; + UInt16 crc_bigendian = EndianU16_NtoB(crc); + [block replaceBytesInRange:(NSRange){2,2} withBytes:&crc_bigendian]; + + UInt16 blockLength_bigendian = EndianU16_NtoB(blockLength); + [block replaceBytesInRange:(NSRange){0,2} withBytes:&blockLength_bigendian]; + + return [self swap:block]; } // Check the size and CRC of a received communication block. -- 2.11.4.GIT