1
0
mirror of https://codeberg.org/Freeyourgadget/Gadgetbridge synced 2024-11-15 14:39:26 +01:00

Garmin protocol: fix crash when stopping find phone

This commit is contained in:
José Rebelo 2024-04-13 14:35:19 +01:00 committed by Daniele Gobbetti
parent e6365638d4
commit 4c734e4717
4 changed files with 40 additions and 20 deletions

View File

@ -24,8 +24,6 @@ public class GarminByteBufferReader {
} }
public int readByte() { public int readByte() {
if (!byteBuffer.hasRemaining()) throw new IllegalStateException();
return Byte.toUnsignedInt(byteBuffer.get()); return Byte.toUnsignedInt(byteBuffer.get());
} }
@ -34,32 +32,22 @@ public class GarminByteBufferReader {
} }
public int readShort() { public int readShort() {
if (byteBuffer.remaining() < 2) throw new IllegalStateException();
return Short.toUnsignedInt(byteBuffer.getShort()); return Short.toUnsignedInt(byteBuffer.getShort());
} }
public int readInt() { public int readInt() {
if (byteBuffer.remaining() < 4) throw new IllegalStateException();
return byteBuffer.getInt(); return byteBuffer.getInt();
} }
public long readLong() { public long readLong() {
if (byteBuffer.remaining() < 8) throw new IllegalStateException();
return byteBuffer.getLong(); return byteBuffer.getLong();
} }
public float readFloat32() { public float readFloat32() {
if (byteBuffer.remaining() < 4) throw new IllegalStateException();
return byteBuffer.getFloat(); return byteBuffer.getFloat();
} }
public double readFloat64() { public double readFloat64() {
if (byteBuffer.remaining() < 8) throw new IllegalStateException();
return byteBuffer.getDouble(); return byteBuffer.getDouble();
} }
@ -79,5 +67,4 @@ public class GarminByteBufferReader {
return bytes; return bytes;
} }
} }

View File

@ -0,0 +1,29 @@
package nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.messages;
import nodomain.freeyourgadget.gadgetbridge.deviceevents.GBDeviceEvent;
import nodomain.freeyourgadget.gadgetbridge.deviceevents.GBDeviceEventFindPhone;
public class FindMyPhoneCancelMessage extends GFDIMessage {
public FindMyPhoneCancelMessage(GarminMessage garminMessage) {
this.garminMessage = garminMessage;
this.statusMessage = getStatusMessage();
}
public static FindMyPhoneCancelMessage parseIncoming(MessageReader reader, GarminMessage garminMessage) {
return new FindMyPhoneCancelMessage(garminMessage);
}
@Override
public GBDeviceEvent getGBDeviceEvent() {
final GBDeviceEventFindPhone findPhoneEvent = new GBDeviceEventFindPhone();
findPhoneEvent.event = GBDeviceEventFindPhone.Event.STOP;
return findPhoneEvent;
}
@Override
protected boolean generateOutgoing() {
return false;
}
}

View File

@ -23,7 +23,7 @@ public class FindMyPhoneRequestMessage extends GFDIMessage {
@Override @Override
public GBDeviceEvent getGBDeviceEvent() { public GBDeviceEvent getGBDeviceEvent() {
final GBDeviceEventFindPhone findPhoneEvent = new GBDeviceEventFindPhone(); final GBDeviceEventFindPhone findPhoneEvent = new GBDeviceEventFindPhone();
findPhoneEvent.event = garminMessage == GarminMessage.FIND_MY_PHONE ? GBDeviceEventFindPhone.Event.START : GBDeviceEventFindPhone.Event.STOP; findPhoneEvent.event = GBDeviceEventFindPhone.Event.START;
return findPhoneEvent; return findPhoneEvent;
} }

View File

@ -46,11 +46,15 @@ public abstract class GFDIMessage {
final int messageType = messageReader.readShort(); final int messageType = messageReader.readShort();
try { try {
GarminMessage garminMessage = GarminMessage.fromId(messageType); final GarminMessage garminMessage = GarminMessage.fromId(messageType);
Method m = garminMessage.objectClass.getMethod("parseIncoming", MessageReader.class, GarminMessage.class); if (garminMessage == null) {
LOG.warn("Unknown message type {}, message {}", messageType, message);
return new UnhandledMessage(messageType);
}
final Method m = garminMessage.objectClass.getMethod("parseIncoming", MessageReader.class, GarminMessage.class);
return garminMessage.objectClass.cast(m.invoke(null, messageReader, garminMessage)); return garminMessage.objectClass.cast(m.invoke(null, messageReader, garminMessage));
} catch (Exception e) { } catch (final Exception e) {
LOG.error("UNHANDLED GFDI MESSAGE TYPE {}, MESSAGE {}", messageType, message); LOG.error("UNHANDLED GFDI MESSAGE TYPE {}, MESSAGE {}", messageType, message, e);
return new UnhandledMessage(messageType); return new UnhandledMessage(messageType);
} finally { } finally {
messageReader.warnIfLeftover(messageType); messageReader.warnIfLeftover(messageType);
@ -110,8 +114,8 @@ public abstract class GFDIMessage {
NOTIFICATION_CONTROL(5034, NotificationControlMessage.class), NOTIFICATION_CONTROL(5034, NotificationControlMessage.class),
NOTIFICATION_DATA(5035, NotificationDataMessage.class), NOTIFICATION_DATA(5035, NotificationDataMessage.class),
NOTIFICATION_SUBSCRIPTION(5036, NotificationSubscriptionMessage.class), NOTIFICATION_SUBSCRIPTION(5036, NotificationSubscriptionMessage.class),
FIND_MY_PHONE(5039, FindMyPhoneRequestMessage.class), FIND_MY_PHONE_REQUEST(5039, FindMyPhoneRequestMessage.class),
CANCEL_FIND_MY_PHONE(5040, FindMyPhoneRequestMessage.class), FIND_MY_PHONE_CANCEL(5040, FindMyPhoneCancelMessage.class),
MUSIC_CONTROL(5041, MusicControlMessage.class), MUSIC_CONTROL(5041, MusicControlMessage.class),
MUSIC_CONTROL_CAPABILITIES(5042, MusicControlCapabilitiesMessage.class), MUSIC_CONTROL_CAPABILITIES(5042, MusicControlCapabilitiesMessage.class),
PROTOBUF_REQUEST(5043, ProtobufMessage.class), PROTOBUF_REQUEST(5043, ProtobufMessage.class),