static void tagTransceiveCb(nfc_error_e err, unsigned char* buffer, int buffer_size, void* data) {
ScopeLogger();
- std::unique_ptr<unsigned char> buffer_ptr(buffer);
- buffer = nullptr;
if (!data) {
// no callback id - unable to report success, neither error
picojson::value response = createEventSuccess(callback_id);
picojson::object& response_obj = response.get<picojson::object>();
tools::ReportSuccess(response_obj);
- response_obj[JSON_DATA] = picojson::value(NFCUtil::FromUCharArray(buffer_ptr.get(), buffer_size));
+ /* buffer contains response to the sent message
+ * According to the native API reference, it must not be freed
+ */
+ response_obj[JSON_DATA] = picojson::value(NFCUtil::FromUCharArray(buffer, buffer_size));
NFCAdapter::GetInstance()->RespondAsync(response.serialize().c_str());
}
const picojson::array& data_array =
FromJson<picojson::array>(args.get<picojson::object>(), JSON_DATA);
- unsigned char* buffer = NFCUtil::DoubleArrayToUCharArray(data_array);
+ // this buffer contains the message to be sent; it may be deleted just after nfc_tag_transceive
+ // call
+ std::unique_ptr<unsigned char[]> buffer(NFCUtil::DoubleArrayToUCharArray(data_array));
double* callback_id_pointer = new double(callback_id);
- int ret = nfc_tag_transceive(m_last_tag_handle, buffer, data_array.size(), tagTransceiveCb,
+ int ret = nfc_tag_transceive(m_last_tag_handle, buffer.get(), data_array.size(), tagTransceiveCb,
(void*)callback_id_pointer);
if (NFC_ERROR_NONE != ret) {
delete callback_id_pointer;
callback_id_pointer = nullptr;
- delete[] buffer;
- buffer = nullptr;
// for permission related error throw exception
if (NFC_ERROR_SECURITY_RESTRICTED == ret || NFC_ERROR_PERMISSION_DENIED == ret) {
picojson::value event = CreateEventError(callback_id, result);
NFCAdapter::GetInstance()->RespondAsync(event.serialize().c_str());
}
- delete callback_id_pointer;
- callback_id_pointer = nullptr;
- delete[] buffer;
- buffer = nullptr;
return PlatformResult(ErrorCode::NO_ERROR);
}