@nitra/zebra 8.0.1 → 8.0.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
|
@@ -31,6 +31,9 @@ public class Zebra {
|
|
|
31
31
|
/** Стандартний UUID для профілю послідовного порту (SPP) */
|
|
32
32
|
private static final UUID SPP_UUID = UUID.fromString("00001101-0000-1000-8000-00805F9B34FB");
|
|
33
33
|
|
|
34
|
+
/** Розмір чанка для запису в сокет (обхід обмеження буфера ~8KB на деяких пристроях) */
|
|
35
|
+
private static final int WRITE_CHUNK_SIZE = 512;
|
|
36
|
+
|
|
34
37
|
private static final String PREFS_NAME = "ZebraPrinter";
|
|
35
38
|
private static final String KEY_ADDRESS = "printer_address";
|
|
36
39
|
|
|
@@ -122,7 +125,11 @@ public class Zebra {
|
|
|
122
125
|
|
|
123
126
|
out = socket.getOutputStream();
|
|
124
127
|
byte[] data = zpl.getBytes(StandardCharsets.UTF_8);
|
|
125
|
-
|
|
128
|
+
// Запис чанками по 512 байт — обхід обмеження буфера (~8KB) на Bluetooth SPP
|
|
129
|
+
for (int offset = 0; offset < data.length; offset += WRITE_CHUNK_SIZE) {
|
|
130
|
+
int len = Math.min(WRITE_CHUNK_SIZE, data.length - offset);
|
|
131
|
+
out.write(data, offset, len);
|
|
132
|
+
}
|
|
126
133
|
out.flush();
|
|
127
134
|
|
|
128
135
|
Logger.info("Zebra", "ZPL успішно відправлено: " + data.length + " байт");
|
|
@@ -53,7 +53,8 @@ import ExternalAccessory
|
|
|
53
53
|
public enum ZebraError: LocalizedError {
|
|
54
54
|
case addressMissing // Адреса принтера не вказана
|
|
55
55
|
case zplEmpty // ZPL команда порожня
|
|
56
|
-
|
|
56
|
+
/// Пристрій не знайдено: запитувана адреса та список підключених аксесуарів (назва + адреса), щоб показувати їх у помилці
|
|
57
|
+
case accessoryNotFound(requestedAddress: String, availableAccessories: [DeviceInfo])
|
|
57
58
|
case protocolMissing(String) // Не знайдено підтримуваних протоколів для пристрою
|
|
58
59
|
case sessionFailed(String) // Не вдалося відкрити сесію з принтером
|
|
59
60
|
case writeFailed(String) // Помилка запису даних у потік
|
|
@@ -64,8 +65,13 @@ import ExternalAccessory
|
|
|
64
65
|
return "Printer address is not specified. Pass address to print()."
|
|
65
66
|
case .zplEmpty:
|
|
66
67
|
return "ZPL command is empty."
|
|
67
|
-
case .accessoryNotFound(let
|
|
68
|
-
|
|
68
|
+
case .accessoryNotFound(let requestedAddress, let availableAccessories):
|
|
69
|
+
if availableAccessories.isEmpty {
|
|
70
|
+
return "Device not found or not connected: \(requestedAddress). No accessories connected."
|
|
71
|
+
}
|
|
72
|
+
// Формуємо список доступних пристроїв у вигляді "назва (адреса)" для тексту помилки
|
|
73
|
+
let list = availableAccessories.map { "\($0.name) (\($0.address))" }.joined(separator: ", ")
|
|
74
|
+
return "Device not found or not connected: \(requestedAddress). Available: \(list)"
|
|
69
75
|
case .protocolMissing(let address):
|
|
70
76
|
return "No supported protocol found for device: \(address)"
|
|
71
77
|
case .sessionFailed(let reason):
|
|
@@ -287,9 +293,11 @@ import ExternalAccessory
|
|
|
287
293
|
self.log("EA connectedAccessories count=", accessories.count)
|
|
288
294
|
|
|
289
295
|
// Шукаємо аксесуар, що відповідає адресі (serialNumber або name)
|
|
296
|
+
let availableList = self.getConnectedAccessories()
|
|
290
297
|
guard let accessory = accessories.first(where: { self.accessoryMatches($0, address: trimmedAddress) }) else {
|
|
291
298
|
self.log("No accessory matched address:", trimmedAddress)
|
|
292
|
-
|
|
299
|
+
// У failure передаємо не лише адресу, а й список доступних аксесуарів (назви та адреси) для показу в помилці
|
|
300
|
+
completion(.failure(.accessoryNotFound(requestedAddress: trimmedAddress, availableAccessories: availableList)))
|
|
293
301
|
return
|
|
294
302
|
}
|
|
295
303
|
|
|
@@ -86,8 +86,17 @@ public class ZebraPlugin: CAPPlugin, CAPBridgedPlugin {
|
|
|
86
86
|
code = "ADDRESS_MISSING"
|
|
87
87
|
case .zplEmpty:
|
|
88
88
|
code = "ZPL_EMPTY"
|
|
89
|
-
case .accessoryNotFound:
|
|
89
|
+
case .accessoryNotFound(let requestedAddress, let availableAccessories):
|
|
90
90
|
code = "ACCESSORY_NOT_FOUND"
|
|
91
|
+
// Передаємо в JS запитувану адресу та список доступних пристроїв (name, address), щоб показувати їх у UI
|
|
92
|
+
let accessoriesPayload = availableAccessories.map { ["name": $0.name, "address": $0.address] }
|
|
93
|
+
call.reject(
|
|
94
|
+
error.localizedDescription,
|
|
95
|
+
code,
|
|
96
|
+
error,
|
|
97
|
+
["requestedAddress": requestedAddress, "availableAccessories": accessoriesPayload]
|
|
98
|
+
)
|
|
99
|
+
return
|
|
91
100
|
case .sessionFailed:
|
|
92
101
|
code = "SESSION_FAILED"
|
|
93
102
|
case .writeFailed:
|
|
@@ -103,3 +112,4 @@ public class ZebraPlugin: CAPPlugin, CAPBridgedPlugin {
|
|
|
103
112
|
})
|
|
104
113
|
}
|
|
105
114
|
}
|
|
115
|
+
|