/* Copyright (C) 2024 Martin.JM This file is part of Gadgetbridge. Gadgetbridge is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Gadgetbridge is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more details. You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ package nodomain.freeyourgadget.gadgetbridge.service.devices.huawei.requests; import java.util.List; import nodomain.freeyourgadget.gadgetbridge.devices.huawei.HuaweiPacket; import nodomain.freeyourgadget.gadgetbridge.devices.huawei.packets.FileDownloadService0A; import nodomain.freeyourgadget.gadgetbridge.devices.huawei.packets.FileDownloadService2C; import nodomain.freeyourgadget.gadgetbridge.service.devices.huawei.HuaweiFileDownloadManager; import nodomain.freeyourgadget.gadgetbridge.service.devices.huawei.HuaweiSupportProvider; public class GetFileDownloadInitRequest extends Request { final HuaweiFileDownloadManager.FileRequest request; public boolean newSync; // Old sync public String[] filenames; // New sync public String filename; public HuaweiFileDownloadManager.FileType fileType; public byte fileId; public int fileSize; public GetFileDownloadInitRequest(HuaweiSupportProvider support, HuaweiFileDownloadManager.FileRequest request) { super(support); if (request.isNewSync()) { this.serviceId = FileDownloadService2C.id; this.commandId = FileDownloadService2C.FileDownloadInit.id; } else { this.serviceId = FileDownloadService0A.id; this.commandId = FileDownloadService0A.FileDownloadInit.id; } this.request = request; } private FileDownloadService2C.FileType convertFileTypeTo2C(HuaweiFileDownloadManager.FileType type) { switch (type) { case SLEEP_STATE: return FileDownloadService2C.FileType.SLEEP_STATE; case SLEEP_DATA: return FileDownloadService2C.FileType.SLEEP_DATA; case GPS: return FileDownloadService2C.FileType.GPS; default: return FileDownloadService2C.FileType.UNKNOWN; } } private HuaweiFileDownloadManager.FileType convertFileTypeFrom2C(FileDownloadService2C.FileType type) { switch (type) { case SLEEP_STATE: return HuaweiFileDownloadManager.FileType.SLEEP_STATE; case SLEEP_DATA: return HuaweiFileDownloadManager.FileType.SLEEP_DATA; case GPS: return HuaweiFileDownloadManager.FileType.GPS; default: return HuaweiFileDownloadManager.FileType.UNKNOWN; } } @Override protected List createRequest() throws RequestCreationException { try { if (this.request.isNewSync()) { FileDownloadService2C.FileType type = convertFileTypeTo2C(request.getFileType()); if (type == FileDownloadService2C.FileType.UNKNOWN) throw new RequestCreationException("Cannot convert type " + request.getFileType()); return new FileDownloadService2C.FileDownloadInit.Request(paramsProvider, request.getFilename(), type, request.getStartTime(), request.getEndTime()).serialize(); } else { if (this.request.getFileType() == HuaweiFileDownloadManager.FileType.DEBUG) return new FileDownloadService0A.FileDownloadInit.DebugFilesRequest(paramsProvider).serialize(); else if (this.request.getFileType() == HuaweiFileDownloadManager.FileType.SLEEP_STATE) return new FileDownloadService0A.FileDownloadInit.SleepFilesRequest(paramsProvider, request.getStartTime(), request.getEndTime()).serialize(); else if (this.request.getFileType() == HuaweiFileDownloadManager.FileType.GPS) return new FileDownloadService0A.FileDownloadInit.GpsFileRequest(paramsProvider, request.getWorkoutId()).serialize(); else throw new RequestCreationException("Unknown file type"); } } catch (HuaweiPacket.CryptoException e) { throw new RequestCreationException(e); } } @Override protected void processResponse() throws ResponseParseException { // In case of multiple downloads, the response here does not need to match the original request // So we cannot use the request at all! if (this.receivedPacket instanceof FileDownloadService0A.FileDownloadInit.Response) { this.newSync = false; this.filenames = ((FileDownloadService0A.FileDownloadInit.Response) this.receivedPacket).fileNames; } else if (this.receivedPacket instanceof FileDownloadService2C.FileDownloadInit.Response) { this.newSync = true; FileDownloadService2C.FileDownloadInit.Response packet = (FileDownloadService2C.FileDownloadInit.Response) this.receivedPacket; this.filename = packet.fileName; this.fileType = convertFileTypeFrom2C(packet.fileType); this.fileId = packet.fileId; this.fileSize = packet.fileSize; } else { throw new ResponseTypeMismatchException(receivedPacket, FileDownloadService2C.FileDownloadInit.Response.class); } } }