Example #1
0
uint8_t MultidropMaster::checkForResponses(uint32_t time) {
    uint8_t b, i;

    if (dontTimeout) {
        timeoutTime = time + timeoutDuration;
    }
    dontTimeout = false;

    // Received all responses
    if (waitingOnNodes == 0) {
        finishMessage();
        return true;
    }

    // Get more responses
    while (serial->available()) {
        b = serial->read();
        responseBuff[responseIndex] = b;
        messageCRC = _crc16_update(messageCRC, b);

        responseIndex++;
        dontTimeout = true;

        // Have we received all the data for this node?
        if (responseIndex % dataLength == 0) {
            waitingOnNodes--;
        }
    }

    // Node timeout, send default response
    if (time > timeoutTime) {

        // It's possible the node sent a partial response, so send whatever is left
        for (i = responseIndex % dataLength; i < dataLength; i++) {
            sendByte(defaultResponseValues[i], true);
            responseBuff[responseIndex] = defaultResponseValues[i];
            responseIndex++;
        }

        dontTimeout = true;
        waitingOnNodes--;
    }

    if (waitingOnNodes == 0) {
        finishMessage();
        return true;
    }
    return false;
}
Example #2
0
void HttpClient::onRequest(Http::Client& client)
{
    try
    {
        Pt::Http::MessageProgress progress = client.endSend();
        if( ! progress.finished() )
        {
            client.beginSend(false);
            return;
        }

        while( ! advanceMessage() )
        {
            if(client.request().buffer().size() > 8192)
            {
                client.beginSend(false);
                return;
            }
        }
        
        finishMessage();

        client.beginReceive();
    }
    catch(const System::IOError&) // HttpError is also an IOError
    {
        // setError() makes finishResult() call onError() where we throw
        setError();
        finishResult();
    }
}
Example #3
0
void HttpClient::onCall()
{
    // prepare HTTP request
    _client.request().clear();
    _client.request().header().set("Content-Type", "text/xml");
    _client.request().setMethod("POST");
    std::ostream& os = _client.request().body();

    // format XML-RPC request
    beginMessage(os);
    
    while( ! advanceMessage() )
    {
        if(_client.request().buffer().size() > 8192)
        {
            _client.send(false);
        }
    }

    finishMessage();

    // send HTTP request and start receiving HTTP reply
    _client.send(true);
    std::istream& is = _client.receive();

    // parse XML-RPC reply
    Client::processResult(is);

    // discard remaining data
    std::streamsize all = std::numeric_limits<std::streamsize>::max();
    is.ignore(all);
}
Example #4
0
void PdBase::sendMessage(const std::string& dest, const std::string& msg, const List& list) {

    PdContext& context = PdContext::instance();

    if(context.bMsgInProgress) {
        cerr << "Pd: Can not send message, message in progress" << endl;
        return;
    }

    _LOCK();
    libpd_start_message(list.len());
    _UNLOCK();

    context.bMsgInProgress = true;

    // step through list
    for(int i = 0; i < list.len(); ++i) {
        if(list.isFloat(i))
            addFloat(list.getFloat(i));
        else if(list.isSymbol(i))
            addSymbol(list.getSymbol(i));
    }

    finishMessage(dest, msg);
}
Example #5
0
void HttpClient::onInvoke()
{
    // prepare HTTP request
    _client.request().clear();
    _client.request().header().set("Content-Type", "text/xml");
    _client.request().setMethod("POST");
    std::ostream& os = _client.request().body();

    // format XML-RPC request
    beginMessage(os);

    while( ! advanceMessage() )
    {
        if(_client.request().buffer().size() > 8192)
        {
            _client.beginSend(false);
            return;
        }
    }
        
    finishMessage();

    _client.beginReceive();
}
Example #6
0
PdBase& PdBase::operator<<(const FinishMessage& var) {
	finishMessage(var.dest, var.msg);
    return *this;
}
Example #7
0
Error QTar::extract()
{
	//ifstream ofstream to seekg()
	QArchive::extract();

	if(!exists()) return Archive::OpenError;
	char buff[Header::RecordSize];
	//QFile outFile;
	//FILE* f;
	size_t bytes_read;
	unsigned int filesize;

#if ARCREADER_QT4
	if(!open(QIODevice::ReadOnly)) {
		error();
#else
	if(open(IO_ReadOnly)) {
		qDebug("open error");
#endif //ARCREADER_QT4
		return Archive::OpenError;
	}
	Q_D(QArchive);
	for (;;) {
#if ARCREADER_QT4
		bytes_read = read(buff,Header::RecordSize);
#else
		bytes_read = readBlock(buff,Header::RecordSize);
#endif //ARCREADER_QT4
		//put them here
		emit byteProcessed(d->processedSize+=Header::RecordSize);
		d->current_fileName=QFileInfo(buff).fileName();

		if (bytes_read < Header::RecordSize) {
			fprintf(stderr,"Short read. expected 512, got %d\n", bytes_read);
			return Archive::ReadError;
		}
		if (isEndBuff(buff)) {
#if USE_SLOT
			emit byteProcessed(d->processedSize+=Header::RecordSize);  //header;
#else
			estimate();
			progressHandler->Progress(d->current_fileName, d->size, d->processedSize+=Header::RecordSize, d->totalSize, d->speed, d->elapsed, d->left);
#endif
			finishMessage();
			return End;
		}
		if (!verifyChecksum(buff)) {
			fprintf(stderr, "Checksum failure\n");
			return ChecksumError;
		}

		switch (buff[156]) {
		case Header::LinkFlag::kLink :			printf(" Ignoring hardlink %s\n", buff); break;
		case Header::LinkFlag::kSymbolicLink :	printf(" Ignoring symlink %s\n", buff); break; /////////////////////////
		case Header::LinkFlag::kCharacter:		printf(" Ignoring character device %s\n", buff); break;
		case Header::LinkFlag::kBlock:			printf(" Ignoring block device %s\n", buff); break;
		case Header::LinkFlag::kDirectory:
			createDir(QString::fromLocal8Bit(buff), parseOct(buff + 100, 8));
			filesize = 0;
			break;
		case Header::LinkFlag::kFIFO:			printf(" Ignoring FIFO %s\n", buff); break;
		default:
			createFile(QString::fromLocal8Bit(buff), parseOct(buff + 100, 8));
			break;
		}

		++d->numFiles;
		filesize = parseOct(buff + 124, 12);
		d->size = filesize;
#if USE_SLOT
		updateMessage();
#endif
		while (filesize > 0) {
			checkTryPause();
#if ARCREADER_QT4
			bytes_read = read(buff,Header::RecordSize);
#else
			bytes_read = readBlock(buff,Header::RecordSize);
#endif //ARCREADER_QT4
			if (bytes_read < Header::RecordSize) {
				fprintf(stderr,"Short read. Expected 512, got %d\n",bytes_read);
				return Archive::ReadError;
			}
			if (filesize < Header::RecordSize) bytes_read = filesize;
			if (d->outFile.isOpen()) {
#if CONFIG_QT4
				if(d->outFile.write(buff,bytes_read)!=bytes_read) {
					fprintf(stderr, "[%s] %s @%d: Failed to write %s\n",__FILE__,__PRETTY_FUNCTION__,__LINE__,qPrintable(d->outFile.fileName()));
#else
				if(d->outFile.writeBlock(buff,bytes_read)!=bytes_read) {
					fprintf(stderr, "[%s] %s @%d: Failed to write %s\n",__FILE__,__PRETTY_FUNCTION__,__LINE__,qPrintable(d->outFile.name()));
#endif
					d->outFile.close();
				}
				/*if (fwrite(buff, 1, bytes_read, f)!= bytes_read) {
					fprintf(stderr, "Failed write\n");
					fclose(f);
					f = NULL;
				}*/
			}
#if USE_SLOT
			forceShowMessage(1000);
			emit byteProcessed(d->processedSize+=Header::RecordSize);//bytes_read);
#else
			estimate();
			progressHandler->Progress(d->current_fileName, d->size, d->processedSize+=Header::RecordSize, d->totalSize, d->speed, d->elapsed, d->left);
#endif
			filesize -= bytes_read;
		}
		//emit byteProcessed(processedSize+=size);
		if(d->outFile.isOpen()) d->outFile.close();
	}
	close();
}

Archive::Error QTar::extract(const QString& archive,const QString& dir)
{
	setArchive(archive);
	setOutDir(dir);

	return extract();
}
Example #8
0
void MultidropMaster::resetAllNodes() {
    startMessage(CMD_RESET, BROADCAST_ADDRESS);
    finishMessage();
}
Example #9
0
MultidropMaster::adr_state_t MultidropMaster::checkForAddresses(uint32_t time) {
    uint8_t b;

    if (dontTimeout) {
        timeoutTime = time + addrTimeoutDuration;
    }
    dontTimeout = false;

    if (state != ADDRESSING) return ADR_DONE;

    // If master's prev daisy chain is HIGH, then the network has gone full circle
    if (isPrevDaisyEnabled() == 1) {
        finishMessage();
        return ADR_DONE;
    }

    // Receive next address
    if (serial->available()) {
        dontTimeout = true; // skip timing out next call
        while (serial->available()) {
            b = serial->read();
        }

        // Verify it's 1 larger than the last address and send confirmation
        if (b == lastAddressReceived + 1) {
            nodeNum++;
            lastAddressReceived = b;
            nodeAddressTries = 0;
            sendByte(b, true);
        }
        // Invalid address
        else {

            // Max tries, end in error
            nodeAddressTries++;
            if (nodeAddressTries > MD_MASTER_ADDR_MAX_TRIES) {
                return ADR_ERROR;
            }
            // Send last valid address again
            else {
                serial->enable_write();
                sendByte(0x00);
                sendByte(lastAddressReceived);
                serial->enable_read();
            }
        }
        return ADR_WAITING;
    }

    // Node timeout, finish
    if (time > timeoutTime) {
        finishMessage();
        if (nodeNum > 0) {
            return ADR_DONE;
        } else {
            return ADR_ERROR;
        }
    }

    // Max nodes
    if (lastAddressReceived == 255) {
        finishMessage();
        return ADR_DONE;
    }
    return ADR_WAITING;
}