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; }
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; }
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 }
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; }
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 }