Пример #1
0
void MultisigInputEntry::on_transactionId_textChanged(const QString &transactionId)
{
    ui->transactionOutput->clear();
    if(transactionId.isEmpty())
        return;

    // Make list of transaction outputs
    txHash.SetHex(transactionId.toStdString().c_str());
    CTransaction tx;
    uint256 blockHash = 0;
    if(!GetTransaction(txHash, tx, blockHash))
        return;
    for(int i = 0; i < tx.vout.size(); i++)
    {
        QString idStr;
        idStr.setNum(i);
        const CTxOut& txOut = tx.vout[i];
        int64 amount = txOut.nValue;
        QString amountStr;
        amountStr.sprintf("%.6f", (double) amount / COIN);
        CScript script = txOut.scriptPubKey;
        CTxDestination addr;
        if(ExtractDestination(script, addr))
        {
            CBitcoinAddress address(addr);
            QString addressStr(address.ToString().c_str());
            ui->transactionOutput->addItem(idStr + QString(" - ") + addressStr + QString(" - ") + amountStr + QString(" TRM"));
        }
        else
            ui->transactionOutput->addItem(idStr + QString(" - ") + amountStr + QString(" TRM"));
    }
}
Пример #2
0
void NmeaParser::parse(char letter) {
    bool commit = false; // flag to commit collected sentence
    bool clear = false; // flag to clear collected sentence

    // check for starting symbol
    bool isStart = false;
    if (letter == '$') {
        isStart = true;
        if (state != S_SOS) {
#ifdef GLOBPOS_PRINT_ERRORS
            fprintf(stderr, "Unexpected start of sentence at state %d\n", state);
#endif
            state = S_SOS;
            commit = true; // maybe there was something valid
        }
    }

    // check for ending symbol
    if (letter == END[currentEnd]) {
        currentEnd++;
    } else {
        currentEnd = 0;

        // can be only \n or any wrong char
        if (letter == END[1] || !isprint(letter)) {
            currentEnd = 2;
        }
    }
    bool isEnd = currentEnd > 0;

    bool isSentence = false; // is it a meaningful character of the sentence
    bool startData = false; // start new current data part

    switch (state) {
        case S_SOS:
            if (isStart) {
                state = S_ADDRESS;
                clear = true;
            } else {
#ifdef GLOBPOS_PRINT_ERRORS
                fprintf(stderr, "Wrong starting character %d\n", (int)letter);
#endif
            }
            break;
        case S_ADDRESS:
            if (letter == ',') {
                state = S_DATA;
                startData = true;
            } else {
                addressLength++;
            }
            isSentence = true;
            break;
        case S_DATA:
            if (letter == ',') {
                data.add(currentData);
                startData = true;
                isSentence = true;
            } else if (letter == '*') {
                data.add(currentData);
                state = S_CHECKSUM;
            } else if (isEnd) {
                data.add(currentData);
                state = S_END;
            } else {
                currentData.size++;
                isSentence = true;
            }
            break;
        case S_CHECKSUM:
            if (isEnd) {
                state = S_END;
            } else {
                checksum.add(letter);
            }
            if (checksum.length == CHECKSUM_LENGTH) {
                state = S_END;
            }
            break;
        case S_END:
            if (!isEnd) {
#ifdef GLOBPOS_PRINT_ERRORS
                fprintf(stderr, "Wrong ending character %d\n", (int)letter);
#endif
            }
            break;
        default:
            fprintf(stderr, "Unknown state %d\n", state);
            break;
    }

    if (isSentence) {
        if (sentence.length >= MAX_SENTENCE_LENGTH) {
            fprintf(stderr, "Length limit reached\n");
        }
        sentence.add(letter);
    }

    if (startData) {
        currentData.offset = sentence.length; // should be next character after comma
        currentData.size = 0;
    }

    if (isEnd) {
        if (state != S_END) {
#ifdef GLOBPOS_PRINT_ERRORS
            fprintf(stderr, "Unexpected end of sentence at state %d\n", state);
#endif
        }

        if (currentEnd == sizeof(END)) {
            currentEnd = 0;

            commit = true;
            state = S_SOS;
        }
    }

    if (commit) {
        if (addressLength > 0 && data.length > 0) {
            if (verifyChecksum) {
                if (verifyCurrentSentence()) {
                    commitCurrentSentence();
                } else {
                    std::string addressStr(sentence.content, addressLength);
                    std::string checksumStr(checksum.content, checksum.length);
                    fprintf(stderr, "Checksum %s verification failed for %s with %d fields\n",
                            checksumStr.c_str(), addressStr.c_str(), (int)data.length);
                }
            } else {
                commitCurrentSentence();
            }
        }
        clear = true;
    }

    if (clear) {
        clearCurrentSentence();
    }
}