//----------------------------------------------------------------------------- int KMFolder::open(void) { int rc = 0; mOpenCount++; if (mOpenCount > 1) return 0; // already open assert(name() != ""); mFilesLocked = FALSE; mStream = fopen(location(), "r+"); // messages file if (!mStream) { debug("Cannot open folder `%s': %s", (const char*)location(), strerror(errno)); mOpenCount = 0; return errno; } if (!path().isEmpty()) { if (isIndexOutdated()) // test if contents file has changed { QString str; mIndexStream = NULL; str.sprintf(i18n("Folder `%s' changed. Recreating index."), (const char*)name()); emit statusMsg(str); } else mIndexStream = fopen(indexLocation(), "r+"); // index file if (!mIndexStream) rc = createIndexFromContents(); else readIndex(); } else { //debug("No path specified for folder `" + name() + // "' -- Turning autoCreateIndex off"); mAutoCreateIndex = FALSE; rc = createIndexFromContents(); } if (!rc) lock(); mQuiet = 0; return rc; }
bool KMFolderIndex::recreateIndex() { QApplication::setOverrideCursor( QCursor( Qt::ArrowCursor ) ); KMessageBox::error(0, i18n("The mail index for '%1' is corrupted and will be regenerated now, " "but some information, including status flags, will be lost.", label())); QApplication::restoreOverrideCursor(); if ( createIndexFromContents() != 0 ) return false; return readIndex(); }
//----------------------------------------------------------------------------- bool KMFolder::readIndexHeader(void) { int indexVersion; assert(mIndexStream != NULL); fscanf(mIndexStream, "# KMail-Index V%d\n", &indexVersion); if (indexVersion < INDEX_VERSION) { debug("Index file %s is out of date. Re-creating it.", (const char*)indexLocation()); createIndexFromContents(); return FALSE; } return TRUE; }
bool KMFolderIndex::readIndexHeader(int *gv) { int indexVersion; assert(mIndexStream != 0); mIndexSwapByteOrder = false; mIndexSizeOfLong = sizeof(long); int ret = fscanf(mIndexStream, "# KMail-Index V%d\n", &indexVersion); if ( ret == EOF || ret == 0 ) return false; // index file has invalid header if(gv) *gv = indexVersion; if (indexVersion < 1505 ) { if(indexVersion == 1503) { kDebug() << "Converting old index file" << indexLocation() << "to utf-8"; mConvertToUtf8 = true; } return true; } else if (indexVersion == 1505) { } else if (indexVersion < INDEX_VERSION) { kDebug() << "Index file" << indexLocation() << "is out of date. Re-creating it."; createIndexFromContents(); return false; } else if(indexVersion > INDEX_VERSION) { QApplication::setOverrideCursor( QCursor( Qt::ArrowCursor ) ); int r = KMessageBox::questionYesNo(0, i18n( "The mail index for '%1' is from an unknown version of KMail (%2).\n" "This index can be regenerated from your mail folder, but some " "information, including status flags, may be lost. Do you wish " "to downgrade your index file?" , objectName() , indexVersion), QString(), KGuiItem(i18n("Downgrade")), KGuiItem(i18n("Do Not Downgrade")) ); QApplication::restoreOverrideCursor(); if (r == KMessageBox::Yes) createIndexFromContents(); return false; } else { // Header quint32 byteOrder = 0; quint32 sizeOfLong = sizeof(long); // default quint32 header_length = 0; KDE_fseek(mIndexStream, sizeof(char), SEEK_CUR ); fread(&header_length, sizeof(header_length), 1, mIndexStream); if (header_length > 0xFFFF) header_length = kmail_swap_32(header_length); off_t endOfHeader = KDE_ftell(mIndexStream) + header_length; bool needs_update = true; // Process available header parts if (header_length >= sizeof(byteOrder)) { fread(&byteOrder, sizeof(byteOrder), 1, mIndexStream); mIndexSwapByteOrder = (byteOrder == 0x78563412); header_length -= sizeof(byteOrder); if (header_length >= sizeof(sizeOfLong)) { fread(&sizeOfLong, sizeof(sizeOfLong), 1, mIndexStream); if (mIndexSwapByteOrder) sizeOfLong = kmail_swap_32(sizeOfLong); mIndexSizeOfLong = sizeOfLong; header_length -= sizeof(sizeOfLong); needs_update = false; } } if (needs_update || mIndexSwapByteOrder || (mIndexSizeOfLong != sizeof(long))) setDirty( true ); // Seek to end of header KDE_fseek(mIndexStream, endOfHeader, SEEK_SET ); if ( mIndexSwapByteOrder ) { kDebug() << "Index File has byte order swapped!"; } if ( mIndexSizeOfLong != sizeof( long ) ) { kDebug() << "Index File sizeOfLong is" << mIndexSizeOfLong << "while sizeof(long) is" << sizeof(long) << "!"; } } return true; }