#include "common/converter.h"
#include "common/logger.h"
#include "common/platform_exception.h"
+#include "common/scope_exit.h"
#include "nfc/nfc_util.h"
using namespace common;
nfc_record_tnf_e record_tnf;
int result = nfc_ndef_record_get_tnf(handle, &record_tnf);
if (NFC_ERROR_NONE != result) {
- LoggerE("Can't get record's tnf: %d, %s", result, NFCUtil::getNFCErrorMessage(result).c_str());
- // once record handle must be released - from inherited classes constructors
- // once record handle cannot be released - from base class constructor
- if (NULL == message_handle) {
- removeRecordHandle(handle);
- } else {
- NFCMessageUtils::RemoveMessageHandle(message_handle);
- }
+ LoggerE("Can't get record's tnf: %d, %s", result,
+ NFCUtil::getNFCErrorMessage(result).c_str());
return NFCUtil::CodeToResult(result, "Can't get record's tnf");
}
result = nfc_ndef_record_get_type(handle, &type_name, &type_size);
if (NFC_ERROR_NONE != result) {
- LoggerE("Can't get record's type: %d, %s", result, NFCUtil::getNFCErrorMessage(result).c_str());
- // once record handle must be released - from inherited classes constructors
- // once record handle cannot be released - from base class constructor
- if (NULL == message_handle) {
- removeRecordHandle(handle);
- } else {
- NFCMessageUtils::RemoveMessageHandle(message_handle);
- }
+ LoggerE("Can't get record's type: %d, %s", result,
+ NFCUtil::getNFCErrorMessage(result).c_str());
return NFCUtil::CodeToResult(result, "Can't get record's type");
}
*type = NFCUtil::ToVector(type_name, type_size);
result = nfc_ndef_record_get_id(handle, &tmp_id, &id_size);
if (NFC_ERROR_NONE != result) {
- LoggerE("Can't get record's id: %d, %s", result, NFCUtil::getNFCErrorMessage(result).c_str());
- // once record handle must be released - from inherited classes constructors
- // once record handle cannot be released - from base class constructor
- if (NULL == message_handle) {
- removeRecordHandle(handle);
- } else {
- NFCMessageUtils::RemoveMessageHandle(message_handle);
- }
+ LoggerE("Can't get record's id: %d, %s", result,
+ NFCUtil::getNFCErrorMessage(result).c_str());
return NFCUtil::CodeToResult(result, "Can't get record's id");
}
if (NFC_ERROR_NONE != result) {
LoggerE("Can't get record's payload: %d, %s", result,
NFCUtil::getNFCErrorMessage(result).c_str());
- // once record handle must be released - from inherited classes constructors
- // once record handle cannot be released - from base class constructor
- if (NULL == message_handle) {
- removeRecordHandle(handle);
- } else {
- NFCMessageUtils::RemoveMessageHandle(message_handle);
- }
return NFCUtil::CodeToResult(result, "Can't get record's payload");
}
if (NFC_ERROR_NONE != result) {
LoggerE("Can't get record count: %d, %s", result,
NFCUtil::getNFCErrorMessage(result).c_str());
- RemoveMessageHandle(message);
return NFCUtil::CodeToResult(result, "Can't get record count");
}
for (int i = 0; i < count; ++i) {
array.push_back(picojson::value(picojson::object()));
picojson::object& record_obj = array.back().get<picojson::object>();
- nfc_ndef_record_h record_handle = NULL;
+ nfc_ndef_record_h record_handle = nullptr;
+ // record_handle is managed by framework, does not need to release it
int result = nfc_ndef_message_get_record(message, i, &record_handle);
if (NFC_ERROR_NONE != result) {
LoggerE("Can't get Ndef Record: %d, %s", result,
NFCUtil::getNFCErrorMessage(result).c_str());
- RemoveMessageHandle(message);
return NFCUtil::CodeToResult(result, "Can't get Ndef Record");
}
short tnf;
picojson::object& out) {
ScopeLogger();
nfc_ndef_message_h message = NULL;
+ SCOPE_EXIT { RemoveMessageHandle(message); };
int result = nfc_ndef_message_create_from_rawdata(&message, data, size);
if (NFC_ERROR_NONE != result) {
if (ret.IsError()) {
LoggerE("Error: %s", ret.message().c_str());
- RemoveMessageHandle(message);
return ret;
}
out.insert(std::make_pair("records", picojson::value(records_array)));
- RemoveMessageHandle(message);
-
return PlatformResult(ErrorCode::NO_ERROR);
}
&ndef_record_handle, tnf, type.get(), type_size > BYTE_ARRAY_MAX ? BYTE_ARRAY_MAX : type_size,
id.get(), id_size > BYTE_ARRAY_MAX ? BYTE_ARRAY_MAX : id_size, payload.get(), payload_size);
if (NFC_ERROR_NONE != result) {
- removeRecordHandle(ndef_record_handle);
LoggerE("Can't create Ndef Record: %d, %s", result,
NFCUtil::getNFCErrorMessage(result).c_str());
return NFCUtil::CodeToResult(result, "Can't create Ndef Record");
return PlatformResult(ErrorCode::NO_ERROR);
}
- nfc_ndef_message_h ndef_message;
+ nfc_ndef_message_h ndef_message = nullptr;
int result = nfc_ndef_message_create(&ndef_message);
-
if (NFC_ERROR_NONE != result) {
- RemoveMessageHandle(ndef_message);
LoggerE("Can't create Ndef Message: %d, %s", result,
NFCUtil::getNFCErrorMessage(result).c_str());
return NFCUtil::CodeToResult(result, "Can't create Ndef Message");
}
+ std::unique_ptr<std::remove_pointer<nfc_ndef_message_h>::type,
+ void (*)(nfc_ndef_message_h)>
+ ndef_message_ptr(ndef_message, &RemoveMessageHandle);
for (picojson::value record : records_array) {
- nfc_ndef_record_h record_handle;
+ nfc_ndef_record_h record_handle = nullptr;
PlatformResult ret = NdefRecordGetHandle(record, &record_handle);
if (ret.IsError()) {
LoggerE("Error: %s", ret.message().c_str());
- RemoveMessageHandle(ndef_message);
return ret;
}
result = nfc_ndef_message_append_record(ndef_message, record_handle);
+ // in case of success record_handle is handled by framework and does not need to be released
if (NFC_ERROR_NONE != result) {
LoggerE("record can't be inserted: %d, %s", result,
NFCUtil::getNFCErrorMessage(result).c_str());
removeRecordHandle(record_handle);
- RemoveMessageHandle(ndef_message);
return NFCUtil::CodeToResult(result, "Invalid NDEF Message");
}
}
+ // release ownership before returning a pointer
+ ndef_message_ptr.release();
*message = ndef_message;
return PlatformResult(ErrorCode::NO_ERROR);
}
picojson::object& out) {
ScopeLogger();
nfc_ndef_record_h record_handle = NULL;
- int result = nfc_ndef_message_get_record(message_handle, index, &record_handle);
+ // record_handle will be managed by framework, does not need to be released
+ int result =
+ nfc_ndef_message_get_record(message_handle, index, &record_handle);
if (NFC_ERROR_NONE != result) {
- LoggerE("Can't get NdefRecord: %d, %s", result, NFCUtil::getNFCErrorMessage(result).c_str());
- RemoveMessageHandle(message_handle);
+ LoggerE("Can't get NdefRecord: %d, %s", result,
+ NFCUtil::getNFCErrorMessage(result).c_str());
return NFCUtil::CodeToResult(result, "Can't get NdefRecord");
}
for (ssize_t i = 0; i < size; i++) {
data[i] = (int)raw_data[i].get<double>();
}
- nfc_ndef_message_h message_handle = NULL;
+ nfc_ndef_message_h message_handle = nullptr;
+ SCOPE_EXIT { RemoveMessageHandle(message_handle); };
int result = nfc_ndef_message_create_from_rawdata(&message_handle, data.get(), size);
if (NFC_ERROR_NONE != result) {
int count;
result = nfc_ndef_message_get_record_count(message_handle, &count);
if (NFC_ERROR_NONE != result) {
- LoggerE("Can't get record count: %d, %s", result, NFCUtil::getNFCErrorMessage(result).c_str());
- RemoveMessageHandle(message_handle);
+ LoggerE("Can't get record count: %d, %s", result,
+ NFCUtil::getNFCErrorMessage(result).c_str());
return NFCUtil::CodeToResult(result, "Can't get record count");
}
PlatformResult ret = ReportNdefRecordFromMessage(message_handle, 0, out);
- RemoveMessageHandle(message_handle);
-
if (ret.IsError()) {
LoggerE("Error: %s", ret.message().c_str());
return ret;
char* tmp_text = NULL;
int result = nfc_ndef_record_get_text(handle, &tmp_text);
if (NFC_ERROR_NONE != result) {
- LoggerE("Can't get record's text: %d, %s", result, NFCUtil::getNFCErrorMessage(result).c_str());
- NFCMessageUtils::RemoveMessageHandle(message_handle);
+ LoggerE("Can't get record's text: %d, %s", result,
+ NFCUtil::getNFCErrorMessage(result).c_str());
return NFCUtil::CodeToResult(result, "Can't get record's text");
}
if (NFC_ERROR_NONE != result) {
LoggerE("Can't get record's languageCode: %d, %s", result,
NFCUtil::getNFCErrorMessage(result).c_str());
- NFCMessageUtils::RemoveMessageHandle(message_handle);
return NFCUtil::CodeToResult(result, "Can't get record's languageCode");
}
if (NFC_ERROR_NONE != result) {
LoggerE("Can't get record's encoding: %d, %s", result,
NFCUtil::getNFCErrorMessage(result).c_str());
- NFCMessageUtils::RemoveMessageHandle(message_handle);
return NFCUtil::CodeToResult(result, "Can't get record's encoding");
}
ScopeLogger();
nfc_encode_type_e encoding = convertToNfcEncodeUTF(encoding_str);
nfc_ndef_record_h handle = NULL;
+ SCOPE_EXIT { removeRecordHandle(handle); };
int result = nfc_ndef_record_create_text(&handle, text.c_str(), language_code.c_str(), encoding);
if (NFC_ERROR_NONE != result) {
// constructing json
ConstructRecordJson(_tnf, _type_name, _id, _payload, out);
- removeRecordHandle(handle);
return PlatformResult(ErrorCode::NO_ERROR);
}
picojson::object& out) {
ScopeLogger();
nfc_ndef_record_h record_handle = NULL;
- // This function just return the pointer of record.
+ // This function just return the pointer of record. do not release
+ // record_handle
int result = nfc_ndef_message_get_record(message_handle, index, &record_handle);
if (NFC_ERROR_NONE != result) {
- LoggerE("Can't get Ndef Record: %d, %s", result, NFCUtil::getNFCErrorMessage(result).c_str());
- RemoveMessageHandle(message_handle);
+ LoggerE("Can't get Ndef Record: %d, %s", result,
+ NFCUtil::getNFCErrorMessage(result).c_str());
return NFCUtil::CodeToResult(result, "Can't get Ndef Record");
}
char* uri = NULL;
int result = nfc_ndef_record_get_uri(handle, &uri);
if (NFC_ERROR_NONE != result || !uri) {
- LoggerE("Can't get record's uri: %d, %s", result, NFCUtil::getNFCErrorMessage(result).c_str());
- NFCMessageUtils::RemoveMessageHandle(message_handle);
+ LoggerE("Can't get record's uri: %d, %s", result,
+ NFCUtil::getNFCErrorMessage(result).c_str());
return NFCUtil::CodeToResult(result, "Can't get record's uri");
}
static PlatformResult ReportNDEFRecordURIFromURI(const std::string& uri, picojson::object& out) {
ScopeLogger();
nfc_ndef_record_h handle = NULL;
+ SCOPE_EXIT { removeRecordHandle(handle); };
int result = nfc_ndef_record_create_uri(&handle, uri.c_str());
if (NFC_ERROR_NONE != result) {
// constructing json
ConstructRecordJson(_tnf, _type_name, _id, _payload, out);
- removeRecordHandle(handle);
return PlatformResult(ErrorCode::NO_ERROR);
}
picojson::object& out) {
ScopeLogger();
nfc_ndef_record_h record_handle = NULL;
- // This function just return the pointer of record.
+ // This function just return the pointer of record. do not remove
+ // record_handle
int result = nfc_ndef_message_get_record(message_handle, index, &record_handle);
if (NFC_ERROR_NONE != result) {
- LoggerE("Can't get Ndef Record: %d, %s", result, NFCUtil::getNFCErrorMessage(result).c_str());
- RemoveMessageHandle(message_handle);
+ LoggerE("Can't get Ndef Record: %d, %s", result,
+ NFCUtil::getNFCErrorMessage(result).c_str());
return NFCUtil::CodeToResult(result, "Can't get Ndef Record");
}
if (NFC_ERROR_NONE != result) {
LoggerE("Can't get record's mime_type: %d, %s", result,
NFCUtil::getNFCErrorMessage(result).c_str());
- NFCMessageUtils::RemoveMessageHandle(message_handle);
return NFCUtil::CodeToResult(result, "Can't get record's mime_type");
}
picojson::object& out) {
ScopeLogger();
nfc_ndef_record_h record_handle = NULL;
- // This function just return the pointer of record.
+ // This function just return the pointer of record. do not remove
+ // record_handle
int result = nfc_ndef_message_get_record(message_handle, index, &record_handle);
if (NFC_ERROR_NONE != result) {
- LoggerE("Can't get Ndef Record: %d, %s", result, NFCUtil::getNFCErrorMessage(result).c_str());
- RemoveMessageHandle(message_handle);
+ LoggerE("Can't get Ndef Record: %d, %s", result,
+ NFCUtil::getNFCErrorMessage(result).c_str());
return NFCUtil::CodeToResult(result, "Can't get Ndef Record");
}
}
nfc_ndef_record_h handle = NULL;
+ SCOPE_EXIT { removeRecordHandle(handle); };
short _tnf = NFC_RECORD_TNF_UNKNOWN;
UCharVector _type_name;
// constructing json
ConstructRecordJson(_tnf, _type_name, _id, _payload, out);
- removeRecordHandle(handle);
return PlatformResult(ErrorCode::NO_ERROR);
}