Example #1
0
bool QNXNFCEventFilter::nativeEventFilter(const QByteArray &eventType, void *message, long *result)
{
    Q_UNUSED(eventType);
    Q_UNUSED(result);
    bps_event_t *event = static_cast<bps_event_t *>(message);

    int code = bps_event_get_code(event);

    if (code == NAVIGATOR_INVOKE_TARGET) {
        // extract bps request from event
        const navigator_invoke_invocation_t *invoke = navigator_invoke_event_get_invocation(event);
        const char *uri = navigator_invoke_invocation_get_uri(invoke);
        const char *type = navigator_invoke_invocation_get_type(invoke);
        int dataLength = navigator_invoke_invocation_get_data_length(invoke);
        const char *raw_data = (const char*)navigator_invoke_invocation_get_data(invoke);
        QByteArray data(raw_data, dataLength);

        //message.fromByteArray(data);

        //const char* metadata = navigator_invoke_invocation_get_metadata(invoke);

        nfc_ndef_message_t *ndefMessage;
        nfc_create_ndef_message_from_bytes(reinterpret_cast<const uchar_t *>(data.data()),
                                                  data.length(), &ndefMessage);

        QNdefMessage message = QNXNFCManager::instance()->decodeMessage(ndefMessage);

        unsigned int ndefRecordCount;
        nfc_get_ndef_record_count(ndefMessage, &ndefRecordCount);

        qQNXNFCDebug() << "Got Invoke event" << uri << "Type" << type;

        emit ndefEvent(message);
    }

    return false;
}
/*
 * navigator events are generated when we're launched by the Invoke Framework (IF)
 * due to a tag we're interested in (as declared in the  bar-descriptor.xml file)
 * is presented to the device. There are other situations that generate navigator
 * events but in this specific case, we look to acquire the tag data which
 * the IF has and process it.
 *
 */
void NfcWorker::handleNavigatorNdefEvent(bps_event_t *event) {
	uint16_t code = bps_event_get_code(event);

	if (NAVIGATOR_INVOKE_TARGET == code) {

		emit message("Navigator invoke target received");

		const navigator_invoke_invocation_t *invocation = navigator_invoke_event_get_invocation(event);
		if (!invocation) {
			qDebug() << "XXXX No invocation for invoke NDEF event";
		}

		const char *invokeAction = navigator_invoke_invocation_get_action(invocation);
		if (!invokeAction) {
			qDebug() << "XXXX No action for invoke NDEF event";
		}

		const QString actionToPerform(invokeAction);
		if (actionToPerform == "bb.action.OPEN") {

			emit message("Navigator bb.action.OPEN received");

			qDebug() << "XXXX Time(ms) : " << getSysTimeMs() << ": navigator_invoke_invocation_get_type() - entering";
			const char *mimeType = navigator_invoke_invocation_get_type(invocation);
			qDebug() << "XXXX Time(ms) : " << getSysTimeMs() << ": navigator_invoke_invocation_get_type() - exited";
			if (!mimeType) {
				qDebug() << "XXXX No Mime Type with invoke request";
			}

			const QString mimeTypeRequested(mimeType);

			qDebug() << "XXXX Time(ms) : " << getSysTimeMs() << ": navigator_invoke_invocation_get_data_length() - entering";
			int invokeDataLength = navigator_invoke_invocation_get_data_length(invocation);
			qDebug() << "XXXX Time(ms) : " << getSysTimeMs() << ": navigator_invoke_invocation_get_data_length() - exited";

			if (invokeDataLength == -1) {
				qDebug() << "XXXX Invalid invoke data length";
			}

			qDebug() << "XXXX Time(ms) : " << getSysTimeMs() << ": navigator_invoke_invocation_get_data() - entering";
			const void *invokeData = navigator_invoke_invocation_get_data(invocation);
			qDebug() << "XXXX Time(ms) : " << getSysTimeMs() << ": navigator_invoke_invocation_get_data() - exited";

			if (!invokeData) {
				qDebug() << "XXXX Invalid invoke data";
			}

			nfc_ndef_message_t *ndefMessage;

			qDebug() << "XXXX Time(ms) : " << getSysTimeMs() << ": nfc_create_ndef_message_from_bytes() - entering";
			CHECK( nfc_create_ndef_message_from_bytes(reinterpret_cast<const uchar_t *>(invokeData), invokeDataLength, &ndefMessage));
			qDebug() << "XXXX Time(ms) : " << getSysTimeMs() << ": nfc_create_ndef_message_from_bytes() - exited";

			// cause event log to be displayed now

			StateManager* state_mgr = StateManager::getInstance();
			qDebug() << "XXXX NfcWorker::readTag() isEventLogShowing()=" << state_mgr->isEventLogShowing();
			emit clearMessages();
			if (!state_mgr->isEventLogShowing()) {
				qDebug() << "XXXXX NfcWorker emiting read_selected";
				emit read_selected();
			}

			parseNdefMessage(ndefMessage);

			qDebug() << "XXXX Time(ms) : " << getSysTimeMs() << ": nfc_delete_ndef_message() - entering";
			CHECK(nfc_delete_ndef_message(ndefMessage, true));
			qDebug() << "XXXX Time(ms) : " << getSysTimeMs() << ": nfc_delete_ndef_message() - exited";
		}
	} else if (NAVIGATOR_INVOKE_QUERY_RESULT == code) {

		emit message("Navigator invoke query received");

		// just log and ignore query requests for the moment

		const char *id = navigator_event_get_id(event);
		const char *err = navigator_event_get_err(event);

		qDebug() << QString("XXXX Invoke Query Result, Id: '%1' Error: '%2'").arg(id).arg(err);

	} else {
		qDebug() << "XXXX Received Navigation event we don't handle: " << getNavigatorEventName(code);
	}
}