diff options
author | hjk <hjk@theqtcompany.com> | 2016-06-01 09:48:53 +0200 |
---|---|---|
committer | hjk <hjk@theqtcompany.com> | 2016-06-01 08:47:51 +0000 |
commit | 7dce6bb4f2f71dbae984c81ac3a1d9ef6254f079 (patch) | |
tree | 2dafd1d9cb505da0c993fa35d9fbd49f0cc12ec8 /src/plugins/bineditor | |
parent | 58f25a3260c43ee32636704e41367c29a775e123 (diff) | |
download | qt-creator-7dce6bb4f2f71dbae984c81ac3a1d9ef6254f079.tar.gz |
BinEditor: Raise size limit to 32 GB
The determining limit is now the Qt api with int values for line numbers
and scrollbar positions, giving us <= 2^31 lines with 16 bytes each.
Change-Id: I266e5bdf358b377c6e27bc2be300a0f6a60e6f68
Reviewed-by: David Schulz <david.schulz@theqtcompany.com>
Diffstat (limited to 'src/plugins/bineditor')
-rw-r--r-- | src/plugins/bineditor/bineditor.cpp | 86 | ||||
-rw-r--r-- | src/plugins/bineditor/bineditor.h | 46 | ||||
-rw-r--r-- | src/plugins/bineditor/bineditorplugin.cpp | 5 |
3 files changed, 68 insertions, 69 deletions
diff --git a/src/plugins/bineditor/bineditor.cpp b/src/plugins/bineditor/bineditor.cpp index ef3f2b31c4..f20af207fb 100644 --- a/src/plugins/bineditor/bineditor.cpp +++ b/src/plugins/bineditor/bineditor.cpp @@ -119,9 +119,8 @@ void BinEditorWidget::init() m_numLines = m_size / m_bytesPerLine + 1; m_numVisibleLines = viewport()->height() / m_lineHeight; m_textWidth = m_bytesPerLine * m_charWidth + m_charWidth; - int m_numberWidth = fm.width(QChar(QLatin1Char('9'))); - m_labelWidth = - 2*m_addressBytes * m_numberWidth + (m_addressBytes - 1)/2 * m_charWidth; + int numberWidth = fm.width(QChar(QLatin1Char('9'))); + m_labelWidth = 2*m_addressBytes * numberWidth + (m_addressBytes - 1)/2 * m_charWidth; int expectedCharWidth = m_columnWidth / 3; const char *hex = "0123456789abcdef"; @@ -161,16 +160,16 @@ void BinEditorWidget::addData(quint64 block, const QByteArray &data) if (addr >= m_baseAddr && addr <= m_baseAddr + m_size - 1) { if (m_data.size() * m_blockSize >= 64 * 1024 * 1024) m_data.clear(); - const int translatedBlock = (addr - m_baseAddr) / m_blockSize; + const qint64 translatedBlock = (addr - m_baseAddr) / m_blockSize; m_data.insert(translatedBlock, data); m_requests.remove(translatedBlock); viewport()->update(); } } -bool BinEditorWidget::requestDataAt(int pos) const +bool BinEditorWidget::requestDataAt(qint64 pos) const { - int block = pos / m_blockSize; + qint64 block = pos / m_blockSize; BlockMap::const_iterator it = m_modifiedData.find(block); if (it != m_modifiedData.constEnd()) return true; @@ -186,30 +185,32 @@ bool BinEditorWidget::requestDataAt(int pos) const return false; } -bool BinEditorWidget::requestOldDataAt(int pos) const +bool BinEditorWidget::requestOldDataAt(qint64 pos) const { - int block = pos / m_blockSize; + qint64 block = pos / m_blockSize; BlockMap::const_iterator it = m_oldData.find(block); return it != m_oldData.end(); } -char BinEditorWidget::dataAt(int pos, bool old) const +char BinEditorWidget::dataAt(qint64 pos, bool old) const { - int block = pos / m_blockSize; - return blockData(block, old).at(pos - block*m_blockSize); + qint64 block = pos / m_blockSize; + int offset = static_cast<int>(pos - block * m_blockSize); + return blockData(block, old).at(offset); } -void BinEditorWidget::changeDataAt(int pos, char c) +void BinEditorWidget::changeDataAt(qint64 pos, char c) { - int block = pos / m_blockSize; + qint64 block = pos / m_blockSize; BlockMap::iterator it = m_modifiedData.find(block); + int offset = static_cast<int>(pos - block * m_blockSize); if (it != m_modifiedData.end()) { - it.value()[pos - (block*m_blockSize)] = c; + it.value()[offset] = c; } else { it = m_data.find(block); if (it != m_data.end()) { QByteArray data = it.value(); - data[pos - (block*m_blockSize)] = c; + data[offset] = c; m_modifiedData.insert(block, data); } } @@ -217,10 +218,10 @@ void BinEditorWidget::changeDataAt(int pos, char c) emit dataChanged(m_baseAddr + pos, QByteArray(1, c)); } -QByteArray BinEditorWidget::dataMid(int from, int length, bool old) const +QByteArray BinEditorWidget::dataMid(qint64 from, int length, bool old) const { - int end = from + length; - int block = from / m_blockSize; + qint64 end = from + length; + qint64 block = from / m_blockSize; QByteArray data; data.reserve(length); @@ -231,7 +232,7 @@ QByteArray BinEditorWidget::dataMid(int from, int length, bool old) const return data.mid(from - ((from / m_blockSize) * m_blockSize), length); } -QByteArray BinEditorWidget::blockData(int block, bool old) const +QByteArray BinEditorWidget::blockData(qint64 block, bool old) const { if (old) { BlockMap::const_iterator it = m_modifiedData.find(block); @@ -373,7 +374,7 @@ bool BinEditorWidget::save(QString *errorString, const QString &oldFileName, con return true; } -void BinEditorWidget::setSizes(quint64 startAddr, int range, int blockSize) +void BinEditorWidget::setSizes(quint64 startAddr, qint64 range, int blockSize) { int newBlockSize = blockSize; QTC_ASSERT(blockSize, return); @@ -385,7 +386,7 @@ void BinEditorWidget::setSizes(quint64 startAddr, int range, int blockSize) newBaseAddr = (newBaseAddr / blockSize) * blockSize; const quint64 maxRange = Q_UINT64_C(0xffffffffffffffff) - newBaseAddr + 1; - int newSize = newBaseAddr != 0 && quint64(range) >= maxRange + qint64 newSize = newBaseAddr != 0 && quint64(range) >= maxRange ? maxRange : range; int newAddressBytes = (newBaseAddr + newSize < quint64(1) << 32 && newBaseAddr + newSize >= newBaseAddr) ? 4 : 8; @@ -457,8 +458,6 @@ void BinEditorWidget::wheelEvent(QWheelEvent *e) QAbstractScrollArea::wheelEvent(e); } - - QRect BinEditorWidget::cursorRect() const { int topLine = verticalScrollBar()->value(); @@ -479,8 +478,8 @@ int BinEditorWidget::posAt(const QPoint &pos) const int xoffset = horizontalScrollBar()->value(); int x = xoffset + pos.x() - m_margin - m_labelWidth; int column = qMin(15, qMax(0,x) / m_columnWidth); - int topLine = verticalScrollBar()->value(); - int line = pos.y() / m_lineHeight; + qint64 topLine = verticalScrollBar()->value(); + qint64 line = pos.y() / m_lineHeight; if (x > m_bytesPerLine * m_columnWidth + m_charWidth/2) { @@ -524,7 +523,7 @@ void BinEditorWidget::updateLines(int fromPosition, int toPosition) viewport()->update(0, y, viewport()->width(), h); } -int BinEditorWidget::dataIndexOf(const QByteArray &pattern, int from, bool caseSensitive) const +int BinEditorWidget::dataIndexOf(const QByteArray &pattern, qint64 from, bool caseSensitive) const { int trailing = pattern.size(); if (trailing > m_blockSize) @@ -535,9 +534,8 @@ int BinEditorWidget::dataIndexOf(const QByteArray &pattern, int from, bool caseS char *b = buffer.data(); QByteArrayMatcher matcher(pattern); - int block = from / m_blockSize; - const int end = - qMin<qint64>(static_cast<qint64>(from) + SearchStride, m_size); + qint64 block = from / m_blockSize; + const int end = qMin<qint64>(from + SearchStride, m_size); while (from < end) { if (!requestDataAt(block * m_blockSize)) return -1; @@ -557,7 +555,7 @@ int BinEditorWidget::dataIndexOf(const QByteArray &pattern, int from, bool caseS return end == m_size ? -1 : -2; } -int BinEditorWidget::dataLastIndexOf(const QByteArray &pattern, int from, bool caseSensitive) const +int BinEditorWidget::dataLastIndexOf(const QByteArray &pattern, qint64 from, bool caseSensitive) const { int trailing = pattern.size(); if (trailing > m_blockSize) @@ -570,7 +568,7 @@ int BinEditorWidget::dataLastIndexOf(const QByteArray &pattern, int from, bool c if (from == -1) from = m_size; int block = from / m_blockSize; - const int lowerBound = qMax(0, from - SearchStride); + const int lowerBound = qMax(qint64(0), from - SearchStride); while (from > lowerBound) { if (!requestDataAt(block * m_blockSize)) return -1; @@ -591,7 +589,7 @@ int BinEditorWidget::dataLastIndexOf(const QByteArray &pattern, int from, bool c } -int BinEditorWidget::find(const QByteArray &pattern_arg, int from, +int BinEditorWidget::find(const QByteArray &pattern_arg, qint64 from, QTextDocument::FindFlags findFlags) { if (pattern_arg.isEmpty()) @@ -615,7 +613,7 @@ int BinEditorWidget::find(const QByteArray &pattern_arg, int from, : dataIndexOf(hexPattern, from); } - int pos = foundHex == -1 || (found >= 0 && (foundHex == -2 || found < foundHex)) + qint64 pos = foundHex == -1 || (found >= 0 && (foundHex == -2 || found < foundHex)) ? found : foundHex; if (pos >= m_size) @@ -751,11 +749,11 @@ void BinEditorWidget::paintEvent(QPaintEvent *e) painter.setPen(palette().text().color()); const QFontMetrics &fm = painter.fontMetrics(); for (int i = 0; i <= m_numVisibleLines; ++i) { - int line = topLine + i; + qint64 line = topLine + i; if (line >= m_numLines) break; - const quint64 lineAddress = m_baseAddr + uint(line) * m_bytesPerLine; + const quint64 lineAddress = m_baseAddr + line * m_bytesPerLine; int y = i * m_lineHeight + m_ascent; if (y - m_ascent > e->rect().bottom()) break; @@ -778,7 +776,7 @@ void BinEditorWidget::paintEvent(QPaintEvent *e) if (hasData || hasOldData) { for (int c = 0; c < m_bytesPerLine; ++c) { - int pos = line * m_bytesPerLine + c; + qint64 pos = line * m_bytesPerLine + c; if (pos >= m_size) break; QChar qc(QLatin1Char(dataAt(pos, isOld))); @@ -798,7 +796,7 @@ void BinEditorWidget::paintEvent(QPaintEvent *e) if (hasData || hasOldData) { for (int c = 0; c < m_bytesPerLine; ++c) { - int pos = line * m_bytesPerLine + c; + qint64 pos = line * m_bytesPerLine + c; if (pos >= m_size) { while (c < m_bytesPerLine) { itemStringData[c*3] = itemStringData[c*3+1] = QLatin1Char(' '); @@ -934,9 +932,9 @@ int BinEditorWidget::cursorPosition() const return m_cursorPosition; } -void BinEditorWidget::setCursorPosition(int pos, MoveMode moveMode) +void BinEditorWidget::setCursorPosition(qint64 pos, MoveMode moveMode) { - pos = qMin(m_size-1, qMax(0, pos)); + pos = qMin(m_size - 1, qMax(qint64(0), pos)); int oldCursorPosition = m_cursorPosition; m_lowNibble = false; @@ -1291,7 +1289,7 @@ void BinEditorWidget::keyPressEvent(QKeyEvent *e) break; case Qt::Key_PageUp: case Qt::Key_PageDown: { - int line = qMax(0, m_cursorPosition / m_bytesPerLine - verticalScrollBar()->value()); + int line = qMax(qint64(0), m_cursorPosition / m_bytesPerLine - verticalScrollBar()->value()); verticalScrollBar()->triggerAction(e->key() == Qt::Key_PageUp ? QScrollBar::SliderPageStepSub : QScrollBar::SliderPageStepAdd); if (!ctrlPressed) @@ -1574,14 +1572,14 @@ void BinEditorWidget::updateContents() viewport()->update(); } -QPoint BinEditorWidget::offsetToPos(int offset) const +QPoint BinEditorWidget::offsetToPos(qint64 offset) const { const int x = m_labelWidth + (offset % m_bytesPerLine) * m_columnWidth; const int y = (offset / m_bytesPerLine - verticalScrollBar()->value()) * m_lineHeight; return QPoint(x, y); } -void BinEditorWidget::asFloat(int offset, float &value, bool old) const +void BinEditorWidget::asFloat(qint64 offset, float &value, bool old) const { value = 0; const QByteArray data = dataMid(offset, sizeof(float), old); @@ -1590,7 +1588,7 @@ void BinEditorWidget::asFloat(int offset, float &value, bool old) const value = *f; } -void BinEditorWidget::asDouble(int offset, double &value, bool old) const +void BinEditorWidget::asDouble(qint64 offset, double &value, bool old) const { value = 0; const QByteArray data = dataMid(offset, sizeof(double), old); @@ -1599,7 +1597,7 @@ void BinEditorWidget::asDouble(int offset, double &value, bool old) const value = *f; } -void BinEditorWidget::asIntegers(int offset, int count, quint64 &bigEndianValue, +void BinEditorWidget::asIntegers(qint64 offset, int count, quint64 &bigEndianValue, quint64 &littleEndianValue, bool old) const { bigEndianValue = littleEndianValue = 0; diff --git a/src/plugins/bineditor/bineditor.h b/src/plugins/bineditor/bineditor.h index a742e9e07d..007de40871 100644 --- a/src/plugins/bineditor/bineditor.h +++ b/src/plugins/bineditor/bineditor.h @@ -60,7 +60,7 @@ public: quint64 baseAddress() const { return m_baseAddr; } - Q_INVOKABLE void setSizes(quint64 startAddr, int range, int blockSize = 4096); + Q_INVOKABLE void setSizes(quint64 startAddr, qint64 range, int blockSize = 4096); int dataBlockSize() const { return m_blockSize; } QByteArray contents() const { return dataMid(0, m_size); } @@ -80,7 +80,7 @@ public: }; int cursorPosition() const; - Q_INVOKABLE void setCursorPosition(int pos, MoveMode moveMode = MoveAnchor); + Q_INVOKABLE void setCursorPosition(qint64 pos, MoveMode moveMode = MoveAnchor); void jumpToAddress(quint64 address); void setModified(bool); @@ -89,7 +89,7 @@ public: void setReadOnly(bool); bool isReadOnly() const; - int find(const QByteArray &pattern, int from = 0, + int find(const QByteArray &pattern, qint64 from = 0, QTextDocument::FindFlags findFlags = 0); void selectAll(); @@ -151,32 +151,32 @@ protected: void contextMenuEvent(QContextMenuEvent *event); private: - typedef QMap<int, QByteArray> BlockMap; + typedef QMap<qint64, QByteArray> BlockMap; BlockMap m_data; BlockMap m_oldData; int m_blockSize; BlockMap m_modifiedData; - mutable QSet<int> m_requests; + mutable QSet<qint64> m_requests; QByteArray m_emptyBlock; QByteArray m_lowerBlock; - int m_size; + qint64 m_size; - int dataIndexOf(const QByteArray &pattern, int from, bool caseSensitive = true) const; - int dataLastIndexOf(const QByteArray &pattern, int from, bool caseSensitive = true) const; + int dataIndexOf(const QByteArray &pattern, qint64 from, bool caseSensitive = true) const; + int dataLastIndexOf(const QByteArray &pattern, qint64 from, bool caseSensitive = true) const; - bool requestDataAt(int pos) const; - bool requestOldDataAt(int pos) const; - char dataAt(int pos, bool old = false) const; - char oldDataAt(int pos) const; - void changeDataAt(int pos, char c); - QByteArray dataMid(int from, int length, bool old = false) const; - QByteArray blockData(int block, bool old = false) const; + bool requestDataAt(qint64 pos) const; + bool requestOldDataAt(qint64 pos) const; + char dataAt(qint64 pos, bool old = false) const; + char oldDataAt(qint64 pos) const; + void changeDataAt(qint64 pos, char c); + QByteArray dataMid(qint64 from, int length, bool old = false) const; + QByteArray blockData(qint64 block, bool old = false) const; - QPoint offsetToPos(int offset) const; - void asIntegers(int offset, int count, quint64 &bigEndianValue, quint64 &littleEndianValue, + QPoint offsetToPos(qint64 offset) const; + void asIntegers(qint64 offset, int count, quint64 &bigEndianValue, quint64 &littleEndianValue, bool old = false) const; - void asFloat(int offset, float &value, bool old) const; - void asDouble(int offset, double &value, bool old) const; + void asFloat(qint64 offset, float &value, bool old) const; + void asDouble(qint64 offset, double &value, bool old) const; QString toolTip(const QHelpEvent *helpEvent) const; int m_bytesPerLine; @@ -190,14 +190,14 @@ private: int m_labelWidth; int m_textWidth; int m_columnWidth; - int m_numLines; - int m_numVisibleLines; + qint64 m_numLines; + qint64 m_numVisibleLines; quint64 m_baseAddr; bool m_cursorVisible; - int m_cursorPosition; - int m_anchorPosition; + qint64 m_cursorPosition; + qint64 m_anchorPosition; bool m_hexCursor; bool m_lowNibble; bool m_isMonospacedFont; diff --git a/src/plugins/bineditor/bineditorplugin.cpp b/src/plugins/bineditor/bineditorplugin.cpp index cce44ebebe..9d27db2dde 100644 --- a/src/plugins/bineditor/bineditorplugin.cpp +++ b/src/plugins/bineditor/bineditorplugin.cpp @@ -289,8 +289,9 @@ public: QMessageBox::critical(ICore::mainWindow(), tr("File Error"), msg); return OpenResult::CannotHandle; } - if (size > INT_MAX) { - QString msg = tr("The file is too big for the Binary Editor (max. 2GB)."); + if (size / 16 >= qint64(1) << 31) { + // The limit is 2^31 lines (due to QText* interfaces) * 16 bytes per line. + QString msg = tr("The file is too big for the Binary Editor (max. 32GB)."); if (errorString) *errorString = msg; else |