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")); } }
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(); } }