bool MessageModel::removeRows(int row, int count, const QModelIndex & parent) { MessageTableEntry *rec = priv->index(row); if(count != 1 || !rec) // Can only remove one row at a time, and cannot remove rows not in model. // Also refuse to remove receiving addresses. return false; { LOCK(cs_smsgDB); SecMsgDB dbSmsg; if (!dbSmsg.Open("cr+")) //throw runtime_error("Could not open DB."); return false; dbSmsg.EraseSmesg(&rec->chKey[0]); } beginRemoveRows(parent, row, row); priv->cachedMessageTable.removeAt(row); endRemoveRows(); return true; }
bool markAsRead(const int& idx) { MessageTableEntry *rec = index(idx); if(!rec || rec->read) // Can only mark one row at a time, and cannot mark rows not in model. return false; { LOCK(cs_smsgDB); SecMsgDB dbSmsg; if (!dbSmsg.Open("cr+")) //throw runtime_error("Could not open DB."); return false; SecMsgStored smsgStored; dbSmsg.ReadSmesg(&rec->chKey[0], smsgStored); smsgStored.status &= ~SMSG_MASK_UNREAD; dbSmsg.WriteSmesg(&rec->chKey[0], smsgStored); rec->read = !(smsgStored.status & SMSG_MASK_UNREAD); } return true; };
void refreshMessageTable() { cachedMessageTable.clear(); if (parent->getWalletModel()->getEncryptionStatus() == WalletModel::Locked) { // -- messages are stored encrypted, can't load them without the private keys return; }; { LOCK(cs_smsgDB); SecMsgDB dbSmsg; if (!dbSmsg.Open("cr+")) //throw runtime_error("Could not open DB."); return; unsigned char chKey[18]; std::vector<unsigned char> vchKey; vchKey.resize(18); SecMsgStored smsgStored; MessageData msg; QString label; QDateTime sent_datetime; QDateTime received_datetime; std::string sPrefix("im"); leveldb::Iterator* it = dbSmsg.pdb->NewIterator(leveldb::ReadOptions()); while (dbSmsg.NextSmesg(it, sPrefix, chKey, smsgStored)) { uint32_t nPayload = smsgStored.vchMessage.size() - SMSG_HDR_LEN; if (SecureMsgDecrypt(false, smsgStored.sAddrTo, &smsgStored.vchMessage[0], &smsgStored.vchMessage[SMSG_HDR_LEN], nPayload, msg) == 0) { label = parent->getWalletModel()->getAddressTableModel()->labelForAddress(QString::fromStdString(msg.sFromAddress)); sent_datetime .setTime_t(msg.timestamp); received_datetime.setTime_t(smsgStored.timeReceived); memcpy(&vchKey[0], chKey, 18); addMessageEntry(MessageTableEntry(vchKey, MessageTableEntry::Received, label, QString::fromStdString(smsgStored.sAddrTo), QString::fromStdString(msg.sFromAddress), sent_datetime, received_datetime, (char*)&msg.vchMessage[0]), true); } }; delete it; sPrefix = "sm"; it = dbSmsg.pdb->NewIterator(leveldb::ReadOptions()); while (dbSmsg.NextSmesg(it, sPrefix, chKey, smsgStored)) { uint32_t nPayload = smsgStored.vchMessage.size() - SMSG_HDR_LEN; if (SecureMsgDecrypt(false, smsgStored.sAddrOutbox, &smsgStored.vchMessage[0], &smsgStored.vchMessage[SMSG_HDR_LEN], nPayload, msg) == 0) { label = parent->getWalletModel()->getAddressTableModel()->labelForAddress(QString::fromStdString(smsgStored.sAddrTo)); sent_datetime .setTime_t(msg.timestamp); received_datetime.setTime_t(smsgStored.timeReceived); memcpy(&vchKey[0], chKey, 18); addMessageEntry(MessageTableEntry(vchKey, MessageTableEntry::Sent, label, QString::fromStdString(smsgStored.sAddrTo), QString::fromStdString(msg.sFromAddress), sent_datetime, received_datetime, (char*)&msg.vchMessage[0]), true); } }; delete it; } }