deleteDevice method
- int deviceId
Attempts to delete a device with device id deviceId
from the device bundles node
and then the device list node. This allows a device that was accidentally removed
to republish without any race conditions.
Note that this does not delete a possibly existent ratchet session.
On success, returns true. On failure, returns an OmemoError.
Implementation
Future<Result<OmemoError, bool>> deleteDevice(int deviceId) async {
final pm = getAttributes().getManagerById<PubSubManager>(pubsubManager)!;
final jid = getAttributes().getFullJID().toBare();
final bundleResult = await pm.retract(jid, omemoBundlesXmlns, '$deviceId');
if (bundleResult.isType<PubSubError>()) {
// TODO(Unknown): Be more specific
return Result(UnknownOmemoError());
}
final deviceListResult = await _retrieveDeviceListPayload(jid);
if (deviceListResult.isType<OmemoError>()) {
return Result(bundleResult.get<OmemoError>());
}
final payload = deviceListResult.get<XMLNode>();
final newPayload = XMLNode.xmlns(
tag: 'devices',
xmlns: omemoDevicesXmlns,
children: payload.children
.where((child) => child.attributes['id'] != '$deviceId')
.toList(),
);
final publishResult = await pm.publish(
jid,
omemoDevicesXmlns,
newPayload,
id: 'current',
options: const PubSubPublishOptions(
accessModel: 'open',
),
);
if (publishResult.isType<PubSubError>()) return Result(UnknownOmemoError());
return const Result(true);
}