Ejemplo n.º 1
0
	void ThreadMessages::_replyLast(void *val)
	{
		LOGDN("ThreadMessages::_replyLast");	
		if (!_last._replied)
		{
			LOGDN("ThreadMessages::_replyLast not replied yet");	
			_last._replied = true;
			_last._result = val;

			if (_last.cb)			
				_last.cb(_last);

			LOGDN("ThreadMessages::_replyLast pre _waitReplyID = %d, _last._id = %d, _last.msgid=%d", _waitReplyID, _last._id, _last.msgid);

			if (_waitReplyID && _last._id == _waitReplyID)
			{
				LOGDN("ThreadMessages::_replyLast pthread_cond_signal _waitReplyID = %d, _last._id = %d, _last.msgid=%d", _waitReplyID, _last._id, _last.msgid);
				pthread_cond_signal(&_cond);
			}
			else
			{
				LOGDN("ThreadMessages::_replyLast else _waitReplyID = %d, _last._id = %d, _last.msgid=%d", _waitReplyID, _last._id, _last.msgid);
			}
		}
	}
    void ThreadDispatcher::_pushMessageWaitReply(message& msg)
    {
        msg._id = ++_id;
        msg.need_reply = true;
        LOGDN("_pushMessageWaitReply id=%d msgid=%d", msg._id, msg.msgid);


        _events.push_back(msg);
        _waitReply(msg._id);
        LOGDN("waiting reply  %d - done", msg._id);
    }
    bool ThreadDispatcher::peek(peekMessage& ev, bool del)
    {
        if (!ev.num)
            return false;


        bool ret = false;
        {
#ifndef OX_NO_MT
            MutexPthreadLock lock(_mutex);
#endif
            if (ev.num == -1)
                ev.num = (int)_events.size();

            LOGDN("peeking message");

            _replyLast(0);

            if (!_events.empty() && ev.num > 0)
            {
                if (del)
                    _popMessage(ev);
                ev.num--;
                ret = true;
            }
        }

        _runCallbacks();

        return ret;
    }
Ejemplo n.º 4
0
uint16_t IsoDepTag::onReadAccess(uint16_t offset, uint8_t el,
		uint8_t* resBuff) {
		    if(fid == FID_CC){
                    memcpy(resBuff,IsoDepTag::CAP_CONTAINER_FILE,0xF - 4);
                    uint16_t mxSize = defaultImpl != NULL? defaultImpl->getMaxFileSize() : ovrImpl->getMaxFileSize();
                    uint16_t mode = defaultImpl != NULL? defaultImpl->getAccessMode() : ovrImpl->getAccessMode();
                    resBuff[0xF - 4] = mxSize >> 8;
                    resBuff[0xF - 3] = mxSize & 0xFF;
                    resBuff[0xF - 2] = GET_RMODE(mode) == MODE_READ_PUBLIC? 0 : 1;
                    resBuff[0xF - 1] = GET_WMODE(mode) == MODE_WRITE_PUBLIC? 0 : 1;
#if DBG
                    LOGDN("READ Mode : ",GET_RMODE(mode));
                    LOGDN("READ Public : ",MODE_READ_PUBLIC);
                    PRINT_ARRAY("CC File : ",resBuff,0xF);
#endif
                    return NFC_SUCCESS | 0xF;
		    }else{
    void ThreadDispatcher::_popMessage(message& res)
    {
        _last = _events.front();
        _events.erase(_events.begin());

        LOGDN("_gotMessage id=%d, msgid=%d", _last._id, _last.msgid);
        res = _last;
    }
Ejemplo n.º 6
0
	void ThreadMessages::get(message &ev)
	{		
		MutexPthreadLock lock(_mutex);
		LOGDN("ThreadMessages::get");

		_replyLast(0);

		while (_events.empty())
		{
			LOGDN("ThreadMessages::get pthread_cond_wait");
			mywait(&_cond, &_mutex);
		}

		ev = _events.front();
		_events.erase(_events.begin());
		_last = ev;
		LOGDN("ThreadMessages::get received msgid=%d id=%d", _last.msgid, _last._id);
	}
    void ThreadDispatcher::_runCallbacks()
    {
        if (_last.cb)
        {
            LOGDN("running callback for id=%d", _last._id);
            _last.cb(_last);
            _last.cb = 0;
        }

#ifndef __S3E__
        if (_last.cbFunction)
        {
            LOGDN("running callback function for id=%d", _last._id);
            _last.cbFunction();
            _last.cbFunction = std::function< void() >();
        }
#endif
    }
Ejemplo n.º 8
0
bool IsoDepTag::onFileSelected(const IsoApdu* apdu) {
	if (apdu->isNdefAppSelect()) {
		return true;
	}
	if (apdu->getApduDataSize() == 2) {
            uint8_t* data = apdu->getApduData();
            fid = data[0] << 8 | data[1];
			#if DBG
            LOGDN("FID : ",fid);
			#endif
            return true;
	}
	return false;
}
Ejemplo n.º 9
0
	void *ThreadMessages::send(int msgid, void *arg1, void *arg2)
	{
		message ev;
		ev.msgid = msgid;
		ev.arg1 = arg1;
		ev.arg2 = arg2;		


		MutexPthreadLock lock(_mutex);
		ev._id = ++_id;

		_waitReplyID = ev._id;
		_events.push_back(ev);

		LOGDN("ThreadMessages::send msgid=%d pthread_cond_signal.. _waitReplyID=%d", msgid, _waitReplyID);	
		pthread_cond_signal(&_cond);

		
		if (_last._replied)
		{
			LOGDN("ThreadMessages::send msgid=%d already replied", msgid);	
		}
				
		while (!_last._replied)		
		{
			LOGDN("ThreadMessages::send msgid=%d waiting reply...", msgid);	
			mywait(&_cond, &_mutex);
		}

		LOGDN("ThreadMessages::send msgid=%d done", msgid);	

		_waitReplyID = 0;
		_last._replied = false;

		return _last._result;
	}
    void ThreadDispatcher::_replyLast(void* val)
    {
        _replyingTo = _last._id;
        _result = val;

        while (_last.need_reply)
        {
            LOGDN("replying to id=%d", _last._id);

#ifndef OX_NO_MT
            //pthread_cond_signal(&_cond);
            pthread_cond_broadcast(&_cond);
#endif
            mywait(&_cond, &_mutex);
        }
    }
    void ThreadDispatcher::get(message& ev)
    {
        {
#ifndef OX_NO_MT
            MutexPthreadLock lock(_mutex);
            LOGDN("get");

#endif
            _waitMessage();

            _last = _events.front();
            _events.erase(_events.begin());
            ev = _last;
        }
        _runCallbacks();
    }
    void ThreadDispatcher::_waitReply(int id)
    {
        do
        {
            LOGDN("ThreadMessages::waiting reply... _replyingTo=%d  myid=%d", _replyingTo, id);
#ifndef OX_NO_MT
            pthread_cond_signal(&_cond);
#endif
            mywait(&_cond, &_mutex);
        }
        while (_replyingTo != id);

        _last.need_reply = false;
#ifndef OX_NO_MT
        pthread_cond_signal(&_cond);
#endif
    }