/* Copyright (C) 2020-2024 Daniel Dakhno 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.qhybrid.requests.fossil.device_info; import java.nio.ByteBuffer; import java.nio.ByteOrder; import java.util.ArrayList; import nodomain.freeyourgadget.gadgetbridge.service.devices.qhybrid.adapter.fossil.FossilWatchAdapter; import nodomain.freeyourgadget.gadgetbridge.service.devices.qhybrid.file.FileHandle; import nodomain.freeyourgadget.gadgetbridge.service.devices.qhybrid.requests.fossil.file.FileGetRequest; public class GetDeviceInfoRequest extends FileGetRequest { enum INFO_CLASS{ SUPPORTED_FILE_VERSIONS((short) 0x0a, SupportedFileVersionsInfo.class), DEVICE_SECURITY_VERSION((short) 0x0e, DeviceSecurityVersionInfo.class), ; private short identifier; private Class itemClass; private INFO_CLASS(short identifier, Class itemClass){ this.identifier = identifier; this.itemClass = itemClass; } static INFO_CLASS getByIdentifier(short identifier){ for(INFO_CLASS infoClass : values()){ if(infoClass.getIdentifier() == identifier) return infoClass; } return null; } public short getIdentifier() { return identifier; } public Class getItemClass() { return itemClass; } } public GetDeviceInfoRequest(FossilWatchAdapter adapter) { super(FileHandle.DEVICE_INFO, adapter); } @Override public void handleFileData(byte[] fileData) { ByteBuffer buffer = ByteBuffer.wrap(fileData); buffer.order(ByteOrder.LITTLE_ENDIAN); ArrayList deviceInfos = new ArrayList<>(); while(buffer.remaining() > 0){ short type = buffer.getShort(); int length = buffer.get(); byte[] payload = new byte[length]; buffer.get(payload); INFO_CLASS infoClass = INFO_CLASS.getByIdentifier(type); if(infoClass == null) continue; Class infoC = infoClass.getItemClass(); try { DeviceInfo info = infoC.newInstance(); info.parsePayload(payload); deviceInfos.add(info); } catch (IllegalAccessException e) { e.printStackTrace(); } catch (InstantiationException e) { e.printStackTrace(); } } handleDeviceInfos(deviceInfos.toArray(new DeviceInfo[0])); } public void handleDeviceInfos(DeviceInfo[] deviceInfos){ log("got infos"); }; }