DXR is a code search and navigation tool aimed at making sense of large projects. It supports full-text and regex searches as well as structural queries.

Mercurial (6415d54a26d0)

VCS Links

Line Code
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
/* This Source Code Form is subject to the terms of the Mozilla Public
 * License, v. 2.0. If a copy of the MPL was not distributed with this
 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */

/* This class encapsulates the global information about a folder stored in the
   summary file.
*/
#ifndef _nsDBFolderInfo_H
#define _nsDBFolderInfo_H

#include "mozilla/MemoryReporting.h"
#include "nsString.h"
#include "MailNewsTypes.h"
#include "mdb.h"
#include "nsTArray.h"
#include "nsIDBFolderInfo.h"
#include <time.h>

class nsMsgDatabase;

// again, this could inherit from nsISupports, but I don't see the need as of
// yet. I'm not sure it needs to be ref-counted (but I think it does).

// I think these getters and setters really need to go through mdb and not rely
// on the object caching the values. If this somehow turns out to be
// prohibitively expensive, we can invent some sort of dirty mechanism, but I
// think it turns out that these values will be cached by the MSG_FolderInfo's
// anyway.
class nsDBFolderInfo : public nsIDBFolderInfo {
 public:
  friend class nsMsgDatabase;

  explicit nsDBFolderInfo(nsMsgDatabase *mdb);

  NS_DECL_ISUPPORTS
  // interface methods.
  NS_DECL_NSIDBFOLDERINFO
  // create the appropriate table and row in a new db.
  nsresult AddToNewMDB();
  // accessor methods.

  bool TestFlag(int32_t flags);
  int16_t GetIMAPHierarchySeparator();
  void SetIMAPHierarchySeparator(int16_t hierarchyDelimiter);
  void ChangeImapTotalPendingMessages(int32_t delta);
  void ChangeImapUnreadPendingMessages(int32_t delta);

  nsresult InitFromExistingDB();
  // get and set arbitrary property, aka row cell value.
  nsresult SetPropertyWithToken(mdb_token aProperty,
                                const nsAString &propertyStr);
  nsresult SetUint32PropertyWithToken(mdb_token aProperty,
                                      uint32_t propertyValue);
  nsresult SetInt64PropertyWithToken(mdb_token aProperty,
                                     int64_t propertyValue);
  nsresult SetInt32PropertyWithToken(mdb_token aProperty,
                                     int32_t propertyValue);
  nsresult GetPropertyWithToken(mdb_token aProperty, nsAString &propertyValue);
  nsresult GetUint32PropertyWithToken(mdb_token aProperty,
                                      uint32_t &propertyValue,
                                      uint32_t defaultValue = 0);
  nsresult GetInt32PropertyWithToken(mdb_token aProperty,
                                     int32_t &propertyValue,
                                     int32_t defaultValue = 0);
  nsresult GetInt64PropertyWithToken(mdb_token aProperty,
                                     int64_t &propertyValue,
                                     int64_t defaultValue = 0);

  nsTArray<nsMsgKey> m_lateredKeys;  // list of latered messages

  virtual size_t SizeOfExcludingThis(
      mozilla::MallocSizeOf aMallocSizeOf) const {
    return m_lateredKeys.ShallowSizeOfExcludingThis(aMallocSizeOf);
  }
  virtual size_t SizeOfIncludingThis(
      mozilla::MallocSizeOf aMallocSizeOf) const {
    return aMallocSizeOf(this) + SizeOfExcludingThis(aMallocSizeOf);
  }

 protected:
  virtual ~nsDBFolderInfo();

  // initialize from appropriate table and row in existing db.
  nsresult InitMDBInfo();
  nsresult LoadMemberVariables();

  nsresult AdjustHighWater(nsMsgKey highWater, bool force);

  void
  ReleaseExternalReferences();  // let go of any references to other objects.

  int64_t m_folderSize;
  int64_t m_expungedBytes;  // sum of size of deleted messages in folder
  uint32_t m_folderDate;
  nsMsgKey m_highWaterMessageKey;  // largest news article number or imap uid
                                   // whose header we've seen

  //  m_numUnreadMessages and m_numMessages can never be negative. 0 means 'no
  //  msgs'.
  int32_t m_numUnreadMessages;
  int32_t m_numMessages;  // includes expunged and ignored messages

  int32_t m_flags;  // folder specific flags. This holds things like re-use
                    // thread pane,
  // configured for off-line use, use default retrieval, purge article/header
  // options

  uint16_t m_version;                // for upgrading...
  int16_t m_IMAPHierarchySeparator;  // imap path separator

  // mail only (for now)

  // IMAP only
  int32_t m_ImapUidValidity;
  int32_t m_totalPendingMessages;
  int32_t m_unreadPendingMessages;

  // news only (for now)
  nsMsgKey
      m_expiredMark;  // Highest invalid article number in group - for expiring
  // the db folder info will have to know what db and row it belongs to, since
  // it is really just a wrapper around the singleton folder info row in the
  // mdb.
  nsMsgDatabase *m_mdb;
  nsIMdbTable *m_mdbTable;  // singleton table in db
  nsIMdbRow *m_mdbRow;      // singleton row in table;

  nsCString m_charSet;
  bool m_charSetOverride;
  bool m_mdbTokensInitialized;

  mdb_token m_rowScopeToken;
  mdb_token m_tableKindToken;
  // tokens for the pre-set columns - we cache these for speed, which may be
  // silly
  mdb_token m_mailboxNameColumnToken;
  mdb_token m_numMessagesColumnToken;
  mdb_token m_numUnreadMessagesColumnToken;
  mdb_token m_flagsColumnToken;
  mdb_token m_folderSizeColumnToken;
  mdb_token m_expungedBytesColumnToken;
  mdb_token m_folderDateColumnToken;
  mdb_token m_highWaterMessageKeyColumnToken;

  mdb_token m_imapUidValidityColumnToken;
  mdb_token m_totalPendingMessagesColumnToken;
  mdb_token m_unreadPendingMessagesColumnToken;
  mdb_token m_expiredMarkColumnToken;
  mdb_token m_versionColumnToken;
};

#endif