webSocketManager+baseDownload.m 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117
  1. //
  2. // webSocketManager+baseDownload.m
  3. // 双子星云手机
  4. //
  5. // Created by xd h on 2024/6/20.
  6. //
  7. #import "webSocketManager+baseDownload.h"
  8. @implementation webSocketManager (baseDownload)
  9. // NSData转int
  10. - (int)data2Int:(NSData *)data{
  11. Byte *byte = (Byte *)[data bytes];
  12. // 有大小端模式问题?
  13. return (byte[0] << 24) + (byte[1] << 16) + (byte[2] << 8) + (byte[3]);
  14. }
  15. - (void)handleDownloadResponseFunBy:(id)message
  16. {
  17. NSData *curData = (NSData *)message;
  18. // if(curData.length < 20){
  19. // return;
  20. // }
  21. //head
  22. NSData *headData = [curData subdataWithRange:NSMakeRange(0, 1)];
  23. char head = 0;//104;
  24. [headData getBytes:&head length:sizeof(head)];
  25. //HLog(@"head: %d",head);
  26. //msgType 0x11(17)
  27. NSData *msgTypeData = [curData subdataWithRange:NSMakeRange(1, 1)];
  28. char msgType = 0;
  29. [msgTypeData getBytes:&msgType length:sizeof(msgType)];
  30. HLog(@"msgType: %d",msgType);
  31. //taskId 6位字符串
  32. NSData *taskIdData = [curData subdataWithRange:NSMakeRange(2, 6)];
  33. NSString* taskIdStr = [[NSString alloc] initWithData:taskIdData encoding:NSUTF8StringEncoding];;
  34. HLog(@"taskId: %@",taskIdStr);
  35. if(curData.length <= 15){
  36. HLog(@"消息长度不对不处理");
  37. return;
  38. }
  39. //datalen
  40. NSData *datalenData = [curData subdataWithRange:NSMakeRange(8, 4)];
  41. int datalen = [self data2Int:datalenData];
  42. //HLog(@"datalen: %d",datalen);
  43. //curNum
  44. NSData *curNumData = [curData subdataWithRange:NSMakeRange(12, 4)];
  45. int curNum = [self data2Int:curNumData];;
  46. //HLog(@"curNum: %d",curNum);
  47. //totalNum
  48. NSData *totalNumData = [curData subdataWithRange:NSMakeRange(16, 4)];
  49. int totalNum = [self data2Int:totalNumData];
  50. //HLog(@"totalNum: %d",totalNum);
  51. BOOL isDownloadDone = curNum == totalNum ? YES : NO;
  52. HLog(@"taskUid:%@ curNum:%d totalNum: %d datalen:%d isDownloadDone:%d",taskIdStr,curNum,totalNum,datalen -8,isDownloadDone);
  53. if(curData.length <= 23){
  54. //data 的位置 装 成功或者失败
  55. NSData *failTypeData = [curData subdataWithRange:NSMakeRange(20, 1)];
  56. //0xcc (204)失败 0xcd (205)文件不存在 0xdd (221)完成 0xbb 187 完成
  57. __block Byte failType;
  58. [failTypeData getBytes:&failType length:sizeof(failType)];
  59. if(taskIdStr && [taskIdStr isEqualToString:self.downloadFileTaskUid]){
  60. if(failType == 0xcc || failType == 0xcf){
  61. [[downloadManager shareInstance] DownloadFileFailOneFileFun];
  62. }
  63. else if(failType == 0xcd ){
  64. [[downloadManager shareInstance] suspendDownloadFileFun:YES withModel:nil];
  65. NSString *tipStr = NSLocalizedString(@"disk_not_find_tip",nil);
  66. mainBlock(^{
  67. [[iToast makeText:tipStr] show];
  68. });
  69. }
  70. else if(failType == 0xdd || failType == 0xbb){
  71. [self downloadFileFunServiceResponseFun:[NSData new] with:YES];
  72. }
  73. else{
  74. HLog(@"下载数据未知错误");
  75. [[downloadManager shareInstance] DownloadFileFailOneFileFun];
  76. }
  77. }
  78. return;
  79. }
  80. if(curData.length <= (20 + datalen - 8)){
  81. HLog(@"下载数据解析出错了");
  82. return;
  83. }
  84. NSData *fileData = [curData subdataWithRange:NSMakeRange(20, datalen-8)];
  85. if([taskIdStr isEqualToString:self.downloadFileTaskUid]){
  86. [self downloadFileFunServiceResponseFun:fileData with:NO];
  87. }
  88. else if ([taskIdStr isEqualToString:self.downloadThumbnailTaskUid]){
  89. [self downloadThumbnailFileFunServiceResponseFun:fileData with:YES];
  90. }
  91. }
  92. @end