示例#1
0
文件: sysopf.cpp 项目: bhaggerty/wwiv
void mailr() {
  mailrec m, m1;
  filestatusrec fsr;

  WFile *pFileEmail = OpenEmailFile(false);
  WWIV_ASSERT(pFileEmail);
  if (pFileEmail->IsOpen()) {
    int nRecordNumber = pFileEmail->GetLength() / sizeof(mailrec) - 1;
    char c = ' ';
    while (nRecordNumber >= 0 && c != 'Q' && !hangup) {
      pFileEmail->Seek(nRecordNumber * sizeof(mailrec), WFile::seekBegin);
      pFileEmail->Read(&m, sizeof(mailrec));
      if (m.touser != 0) {
        pFileEmail->Close();
        do {
          WUser user;
          GetApplication()->GetUserManager()->ReadUser(&user, m.touser);
          GetSession()->bout << "|#1  To|#7: |#" << GetSession()->GetMessageColor() << user.GetUserNameAndNumber(
                               m.touser) << wwiv::endl;
          int tp = 80;
          int nn = 0;
          if (m.status & status_source_verified) {
            tp -= 2;
          }
          if (m.status & status_new_net) {
            tp -= 1;
            if (wwiv::strings::GetStringLength(m.title) <= tp) {
              nn = m.title[tp + 1];
            } else {
              nn = 0;
            }
          } else {
            nn = 0;
          }
          set_net_num(nn);
          GetSession()->bout << "|#1Subj|#7: |#" << GetSession()->GetMessageColor() << m.title << wwiv::endl;
          if (m.status & status_file) {
            WFile attachDat(syscfg.datadir, ATTACH_DAT);
            if (attachDat.Open(WFile::modeReadOnly | WFile::modeBinary, WFile::shareUnknown, WFile::permReadWrite)) {
              bool found = false;
              long lAttachFileSize = attachDat.Read(&fsr, sizeof(fsr));
              while (lAttachFileSize > 0 && !found) {
                if (m.daten == static_cast<unsigned long>(fsr.id)) {
                  GetSession()->bout << "|#1Filename|#0.... |#2" << fsr.filename << " (" << fsr.numbytes << " bytes)|#0\r\n";
                  found = true;
                }
                if (!found) {
                  lAttachFileSize = attachDat.Read(&fsr, sizeof(fsr));
                }
              }
              if (!found) {
                GetSession()->bout << "|#1Filename|#0.... |#2File : Unknown or Missing|#0\r\n";
              }
              attachDat.Close();
            } else {
              GetSession()->bout << "|#1Filename|#0.... |#2|#2File : Unknown or Missing|#0\r\n";
            }
          }
          bool next;
          read_message1(&(m.msg), (char)(m.anony & 0x0f), true, &next, "email", m.fromsys, m.fromuser);
          GetSession()->bout << "|#2R,D,Q,<space>  : ";
          if (next) {
            c = ' ';
          } else {
            c = onek("QRD ");
          }
          if (c == 'D') {
            pFileEmail = OpenEmailFile(true);
            pFileEmail->Seek(nRecordNumber * sizeof(mailrec), WFile::seekBegin);
            pFileEmail->Read(&m1, sizeof(mailrec));
            if (memcmp(&m, &m1, sizeof(mailrec)) == 0) {
              delmail(pFileEmail, nRecordNumber);
              bool found = false;
              if (m.status & status_file) {
                WFile attachFile(syscfg.datadir, ATTACH_DAT);
                if (attachFile.Open(WFile::modeReadWrite | WFile::modeBinary)) {
                  long lAttachFileSize = attachFile.Read(&fsr, sizeof(fsr));
                  while (lAttachFileSize > 0 && !found) {
                    if (m.daten == static_cast<unsigned long>(fsr.id)) {
                      found = true;
                      fsr.id = 0;
                      attachFile.Seek(static_cast<long>(sizeof(filestatusrec)) * -1L, WFile::seekCurrent);
                      attachFile.Write(&fsr, sizeof(filestatusrec));
                      WFile::Remove(GetApplication()->GetAttachmentDirectory().c_str(), fsr.filename);
                    } else {
                      attachFile.Read(&fsr, sizeof(filestatusrec));
                    }
                  }
                  attachFile.Close();
                }
              }
            } else {
              GetSession()->bout << "Mail file changed; try again.\r\n";
            }
            pFileEmail->Close();
            if (!GetSession()->IsUserOnline() && m.touser == 1 && m.tosys == 0) {
              GetSession()->GetCurrentUser()->SetNumMailWaiting(GetSession()->GetCurrentUser()->GetNumMailWaiting() - 1);
            }
          }
          GetSession()->bout.NewLine(2);
        } while ((c == 'R') && (!hangup));

        pFileEmail = OpenEmailFile(false);
        WWIV_ASSERT(pFileEmail);
        if (!pFileEmail->IsOpen()) {
          break;
        }
      }
      nRecordNumber -= 1;
    }
    pFileEmail->Close();
  }
  delete pFileEmail;
}