Пример #1
0
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]));
}
Пример #2
0
// 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;
}
Пример #3
0
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);
}