Exemplo n.º 1
0
size_t RDRingBuffer::read(char *dest,size_t cnt)
{
  size_t free_cnt;
  size_t cnt2;
  size_t to_read;
  size_t n1, n2;

  if ((free_cnt = readSpace()) == 0) {
    return 0;
  }

  to_read = cnt > free_cnt ? free_cnt : cnt;

  cnt2 = rb->read_ptr + to_read;

  if (cnt2 > rb->size) {
    n1 = rb->size - rb->read_ptr;
    n2 = cnt2 & rb->size_mask;
  } else {
    n1 = to_read;
    n2 = 0;
  }

  memcpy (dest, &(rb->buf[rb->read_ptr]), n1);
  rb->read_ptr += n1;
  rb->read_ptr &= rb->size_mask;

  if (n2) {
    memcpy (dest + n1, &(rb->buf[rb->read_ptr]), n2);
    rb->read_ptr += n2;
    rb->read_ptr &= rb->size_mask;
  }

  return to_read;
}
Exemplo n.º 2
0
void BaseHTMLParser::readUntilEndTag(const std::string& tag_name)
{
        // [42] ETag ::= '</' Name S? '>'
        bool found = false;
	std::string tmp;
	std::string lower_tagname = tag_name;
	to_lower(lower_tagname);

        while (not found ) {
            readUntilDelimiterMark("</");
	    tmp = std::string(text.current, tag_name.size());
	    if (to_lower(tmp) != lower_tagname) {
		    // This is not the tag we are looking for...
		    // Keep looking...
		    continue;
	    }
	    text += tag_name.size();
	    readSpace();
            if (*text != '>'){
		std::string msg = "While looking for the EndTag for " +\
                                      tag_name;
                throw ParserEOFError(msg);
	    }
            consumeToken(std::string(">"));
            // Yeah! The EndTag was found. We are done
            found = true;
	}
}
inline size_t SingleRWRingBuffer :: peek(char * dst, size_t sz) {
	size_t space = readSpace();
	sz = sz > space ? space : sz;
	if (sz == 0) return 0;

	size_t r = mRead;
	size_t end = r + sz;

	if (end < mSize) {
		memcpy(dst, mData+r, sz);
	} else {
		size_t split = mSize-r;
		end &= mWrap;
		memcpy(dst, mData+r, split);
		memcpy(dst+split, mData, end);
	}
	return sz;
}
Exemplo n.º 4
0
void* CDVRPTRV3Controller::Entry()
{
	wxLogMessage(wxT("Starting DV-RPTR3 Modem Controller thread"));

	// Clock every 5ms-ish
	CTimer pollTimer(200U, 0U, 250U);
	pollTimer.start();

	unsigned int space = 0U;

	while (!m_stopped) {
		// Poll the modem status every 250ms
		if (pollTimer.hasExpired()) {
			bool ret = readSpace();
			if (!ret) {
				ret = findModem();
				if (!ret) {
					wxLogMessage(wxT("Stopping DV-RPTR3 Modem Controller thread"));
					return NULL;
				}
			}

			pollTimer.start();
		}

		unsigned int length;
		RESP_TYPE_V3 type = getResponse(m_buffer, length);

		switch (type) {
			case RT3_TIMEOUT:
				break;

			case RT3_ERROR: {
					bool ret = findModem();
					if (!ret) {
						wxLogMessage(wxT("Stopping DV-RPTR3 Modem Controller thread"));
						return NULL;
					}
				}
				break;

			case RT3_HEADER: {
					// CUtils::dump(wxT("RT3_HEADER"), m_buffer, length);
					wxMutexLocker locker(m_mutex);

					unsigned char data[2U];
					data[0U] = DSMTT_HEADER;
					data[1U] = RADIO_HEADER_LENGTH_BYTES;
					m_rxData.addData(data, 2U);

					m_rxData.addData(m_buffer + 9U, RADIO_HEADER_LENGTH_BYTES - 2U);

					// Dummy checksum
					data[0U] = 0xFFU;
					data[1U] = 0xFFU;
					m_rxData.addData(data, 2U);

					data[0U] = DSMTT_DATA;
					data[1U] = DV_FRAME_LENGTH_BYTES;
					m_rxData.addData(data, 2U);

					m_rxData.addData(m_buffer + 51U, DV_FRAME_LENGTH_BYTES);

					m_rx = true;
				}
				break;

			case RT3_DATA: {
					// CUtils::dump(wxT("RT3_DATA"), m_buffer, length);
					wxMutexLocker locker(m_mutex);

					unsigned char data[2U];
					data[0U] = DSMTT_DATA;
					data[1U] = DV_FRAME_LENGTH_BYTES;
					m_rxData.addData(data, 2U);

					m_rxData.addData(m_buffer + 5U, DV_FRAME_LENGTH_BYTES);

					m_rx = true;

					// End of transmission?
					bool end = (m_buffer[19U] & 0x40U) == 0x40U;
					if (end) {
						data[0U] = DSMTT_EOT;
						data[1U] = 0U;
						m_rxData.addData(data, 2U);

						m_rx = false;
					}
				}
				break;

			case RT3_SPACE:
				space = m_buffer[9U];
				// CUtils::dump(wxT("RT3_SPACE"), m_buffer, length);
				break;

			// These should not be received in this loop, but don't complain if we do
			case RT3_QUERY:
			case RT3_CONFIG:
				break;

			default:
				wxLogMessage(wxT("Unknown DV-RPTR3 message, type"));
				CUtils::dump(wxT("Buffer dump"), m_buffer, length);
				break;
		}

		if (space > 0U) {
			if (m_txData.hasData()) {
				unsigned char len = 0U;
				unsigned char data[200U];

				{
					wxMutexLocker locker(m_mutex);

					m_txData.getData(&len, 1U);
					m_txData.getData(data, len);
				}

				// CUtils::dump(wxT("Write"), data, len);

				bool ret = writeModem(data, len);
				if (!ret) {
					bool ret = findModem();
					if (!ret) {
						wxLogMessage(wxT("Stopping DV-RPTR3 Modem Controller thread"));
						return NULL;
					}
				} else {
					space--;
				}
			}
		}

		Sleep(5UL);

		pollTimer.clock();
	}

	wxLogMessage(wxT("Stopping DV-RPTR3 Modem Controller thread"));

	closeModem();

	return NULL;
}