PRBool CMbxScanner::WriteMailItem( PRUint32 flags, PRUint32 offset, PRUint32 size, PRUint32 *pTotalMsgSize) { PRUint32 values[kNumMbxLongsToRead]; PRInt32 cnt = kNumMbxLongsToRead * sizeof( PRUint32); nsresult rv; PRBool failed = PR_FALSE; PRInt32 cntRead; PRInt8 * pChar = (PRInt8 *) values; rv = m_mbxFile->Seek( offset); m_mbxFile->Failed( &failed); if (NS_FAILED( rv) || failed) { IMPORT_LOG1( "Mbx seek error: 0x%lx\n", offset); return( PR_FALSE); } rv = m_mbxFile->Read( (char **) &pChar, cnt, &cntRead); if (NS_FAILED( rv) || (cntRead != cnt)) { IMPORT_LOG1( "Mbx read error at: 0x%lx\n", offset); return( PR_FALSE); } if (values[0] != 0x7F007F00) { IMPORT_LOG2( "Mbx tag field doesn't match: 0x%lx, at offset: 0x%lx\n", values[0], offset); return( PR_FALSE); } if (size && (values[2] != size)) { IMPORT_LOG3( "Mbx size doesn't match idx, mbx: %ld, idx: %ld, at offset: 0x%lx\n", values[2], size, offset); return( PR_FALSE); } if (pTotalMsgSize != nsnull) *pTotalMsgSize = values[2]; // everything looks kosher... // the actual message text follows and is values[3] bytes long... return( CopyMbxFileBytes(flags, values[3])); }
// adds the specified file as a mailboxdescriptor to the array nsresult nsAppleMailImportMail::AddMboxDir(nsILocalFile *aFolder, nsISupportsArray *aMailboxDescs, nsIImportService *aImportService) { nsAutoString folderName; aFolder->GetLeafName(folderName); // cut off the suffix, if any, or prefix if this is an account folder. if (StringEndsWith(folderName, NS_LITERAL_STRING(POP_MBOX_SUFFIX))) folderName.SetLength(folderName.Length()-5); else if (StringEndsWith(folderName, NS_LITERAL_STRING(IMAP_MBOX_SUFFIX))) folderName.SetLength(folderName.Length()-9); else if (StringBeginsWith(folderName, NS_LITERAL_STRING("POP-"))) folderName.Cut(4, folderName.Length()); else if (StringBeginsWith(folderName, NS_LITERAL_STRING("IMAP-"))) folderName.Cut(5, folderName.Length()); nsCOMPtr<nsIImportMailboxDescriptor> desc; nsresult rv = aImportService->CreateNewMailboxDescriptor(getter_AddRefs(desc)); if (NS_SUCCEEDED(rv)) { // find out number of messages in this .mbox PRUint32 numMessages = 0; { // move to the .mbox's Messages folder nsCOMPtr<nsIFile> messagesFolder; aFolder->Clone(getter_AddRefs(messagesFolder)); nsresult rv = messagesFolder->Append(NS_LITERAL_STRING("Messages")); NS_ENSURE_SUCCESS(rv, rv); // count the number of messages in this folder. it sucks that we have to iterate through the folder // but XPCOM doesn't give us any way to just get the file count, unfortunately. :-( nsCOMPtr<nsISimpleEnumerator> dirEnumerator; messagesFolder->GetDirectoryEntries(getter_AddRefs(dirEnumerator)); if (dirEnumerator) { bool hasMore = false; while (NS_SUCCEEDED(dirEnumerator->HasMoreElements(&hasMore)) && hasMore) { nsCOMPtr<nsISupports> rawSupports; dirEnumerator->GetNext(getter_AddRefs(rawSupports)); if (!rawSupports) continue; nsCOMPtr<nsILocalFile> file(do_QueryInterface(rawSupports)); if (file) { bool isFile = false; file->IsFile(&isFile); if (isFile) numMessages++; } } } } desc->SetSize(numMessages); desc->SetDisplayName(folderName.get()); desc->SetDepth(mCurDepth); IMPORT_LOG3("Will import %s with approx %d messages, depth is %d", NS_ConvertUTF16toUTF8(folderName).get(), numMessages, mCurDepth); // XXX: this is silly. there's no setter for the mailbox descriptor's file, so we need to get it, and then modify it. nsCOMPtr<nsILocalFile> mailboxDescFile; rv = desc->GetFile(getter_AddRefs(mailboxDescFile)); NS_ENSURE_SUCCESS(rv, rv); if (mailboxDescFile) mailboxDescFile->InitWithFile(aFolder); // add this mailbox descriptor to the list aMailboxDescs->AppendElement(desc); } return NS_OK; }
PRBool nsOEScanBoxes::FindMailBoxes( nsIFile* descFile) { Reset(); nsresult rv; PRBool isFile = PR_FALSE; rv = descFile->IsFile( &isFile); if (NS_FAILED( rv) || !isFile) return( PR_FALSE); nsCOMPtr <nsIInputStream> descInputStream; rv = NS_NewLocalFileInputStream(getter_AddRefs(descInputStream), descFile); if (NS_FAILED( rv)) return( PR_FALSE); IMPORT_LOG0( "Reading the folders.nch file\n"); PRUint32 curRec; if (!ReadLong( descInputStream, curRec, 20)) { return( PR_FALSE); } // Now for each record PRBool done = PR_FALSE; PRUint32 equal; PRUint32 size; PRUint32 previous; PRUint32 next; MailboxEntry * pEntry; PRBool failed; nsCString ext; nsCString mbxExt( ".mbx"); while (!done) { if (!ReadLong( descInputStream, equal, curRec)) return( PR_FALSE); if (curRec != equal) { IMPORT_LOG1( "Record start invalid: %ld\n", curRec); break; } if (!ReadLong( descInputStream, size, curRec + 4)) return( PR_FALSE); if (!ReadLong( descInputStream, previous, curRec + 8)) return( PR_FALSE); if (!ReadLong( descInputStream, next, curRec + 12)) return( PR_FALSE); failed = PR_FALSE; pEntry = new MailboxEntry; if (!ReadLong( descInputStream, pEntry->index, curRec + 16)) failed = PR_TRUE; if (!ReadString( descInputStream, pEntry->mailName, curRec + 20)) failed = PR_TRUE; if (!ReadString( descInputStream, pEntry->fileName, curRec + 279)) failed = PR_TRUE; if (!ReadLong( descInputStream, pEntry->parent, curRec + 539)) failed = PR_TRUE; if (!ReadLong( descInputStream, pEntry->child, curRec + 543)) failed = PR_TRUE; if (!ReadLong( descInputStream, pEntry->sibling, curRec + 547)) failed = PR_TRUE; if (!ReadLong( descInputStream, pEntry->type, curRec + 551)) failed = PR_TRUE; if (failed) { delete pEntry; return( PR_FALSE); } #ifdef _TRACE_MAILBOX_ENTRIES IMPORT_LOG0( "------------\n"); IMPORT_LOG2( " Offset: %lx, index: %ld\n", curRec, pEntry->index); IMPORT_LOG2( " previous: %lx, next: %lx\n", previous, next); IMPORT_LOG2( " Name: %S, File: %s\n", (PRUnichar *) pEntry->mailName, (const char *) pEntry->fileName); IMPORT_LOG3( " Parent: %ld, Child: %ld, Sibling: %ld\n", pEntry->parent, pEntry->child, pEntry->sibling); #endif pEntry->fileName.Right( ext, 4); if (!ext.Equals(mbxExt)) pEntry->fileName.Append( ".mbx"); m_entryArray.AppendElement( pEntry); curRec = next; if (!next) done = PR_TRUE; } MailboxEntry *pZero = GetIndexEntry( 0); if (pZero) m_pFirst = GetIndexEntry( pZero->child); IMPORT_LOG1( "Read the folders.nch file, found %ld mailboxes\n", (long) m_entryArray.Count()); return( PR_TRUE); }