1 /* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
2 /* This Source Code Form is subject to the terms of the Mozilla Public
3  * License, v. 2.0. If a copy of the MPL was not distributed with this
4  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
5 
6 #ifndef _nsAddrDatabase_H_
7 #define _nsAddrDatabase_H_
8 
9 #include "nsIAbCard.h"
10 #include "nsIFile.h"
11 #include "mdb.h"
12 #include "nsString.h"
13 #include "nsCOMPtr.h"
14 
15 class nsAddrDatabase {
16   using PathString = mozilla::PathString;
17 
18  public:
19   nsresult SetDbPath(nsIFile* aDbPath);
20   nsresult Close(bool forceCommit);
21   nsresult OpenMDB(nsIFile* dbName, bool create);
22   nsresult CloseMDB(bool commit);
23   nsresult ForceClosed(void);
24   nsresult EnumerateCards(nsISimpleEnumerator** _retval);
25   nsresult EnumerateListAddresses(uint32_t listRowID,
26                                   nsISimpleEnumerator** _retval);
27 
28   nsAddrDatabase();
29   virtual ~nsAddrDatabase();
30 
31   nsresult GetMDBFactory(nsIMdbFactory** aMdbFactory);
GetEnv()32   nsIMdbEnv* GetEnv() { return m_mdbEnv; }
33   uint32_t GetCurVersion();
34   nsIMdbTableRowCursor* GetTableRowCursor();
GetPabTable()35   nsIMdbTable* GetPabTable() { return m_mdbPabTable; }
36 
37   nsresult CreateABCard(nsIMdbRow* cardRow, mdb_id listRowID,
38                         nsIAbCard** result);
39   nsresult CreateABListCard(nsIMdbRow* listRow, nsIAbCard** result);
40 
IsListRowScopeToken(mdb_scope scope)41   bool IsListRowScopeToken(mdb_scope scope) {
42     return (scope == m_ListRowScopeToken) ? true : false;
43   }
IsCardRowScopeToken(mdb_scope scope)44   bool IsCardRowScopeToken(mdb_scope scope) {
45     return (scope == m_CardRowScopeToken) ? true : false;
46   }
IsDataRowScopeToken(mdb_scope scope)47   bool IsDataRowScopeToken(mdb_scope scope) {
48     return (scope == m_DataRowScopeToken) ? true : false;
49   }
50   nsresult GetCardRowByRowID(mdb_id rowID, nsIMdbRow** dbRow);
51   nsresult GetListRowByRowID(mdb_id rowID, nsIMdbRow** dbRow);
52 
53   uint32_t GetListAddressTotal(nsIMdbRow* listRow);
54   nsresult GetAddressRowByPos(nsIMdbRow* listRow, uint16_t pos,
55                               nsIMdbRow** cardRow);
56 
57   nsresult InitCardFromRow(nsIAbCard* aNewCard, nsIMdbRow* aCardRow);
58 
59  protected:
60   void YarnToUInt32(struct mdbYarn* yarn, uint32_t* pResult);
61   nsresult GetStringColumn(nsIMdbRow* cardRow, mdb_token outToken,
62                            nsString& str);
63   nsresult GetIntColumn(nsIMdbRow* cardRow, mdb_token outToken,
64                         uint32_t* pValue, uint32_t defaultValue);
65   nsresult GetListCardFromDB(nsIAbCard* listCard, nsIMdbRow* listRow);
66   nsresult CreateCard(nsIMdbRow* cardRow, mdb_id listRowID, nsIAbCard** result);
67 
68   // mdb bookkeeping stuff
69   nsresult InitExistingDB();
70   nsresult InitMDBInfo();
71 
72   nsIMdbEnv* m_mdbEnv;  // to be used in all the db calls.
73   nsIMdbStore* m_mdbStore;
74   nsIMdbTable* m_mdbPabTable;
75   nsCOMPtr<nsIFile> m_dbName;
76   bool m_mdbTokensInitialized;
77 
78   mdb_kind m_PabTableKind;
79   mdb_kind m_DeletedCardsTableKind;
80 
81   mdb_scope m_CardRowScopeToken;
82   mdb_scope m_ListRowScopeToken;
83   mdb_scope m_DataRowScopeToken;
84 
85   mdb_token m_UIDColumnToken;
86   mdb_token m_FirstNameColumnToken;
87   mdb_token m_LastNameColumnToken;
88   mdb_token m_PhoneticFirstNameColumnToken;
89   mdb_token m_PhoneticLastNameColumnToken;
90   mdb_token m_DisplayNameColumnToken;
91   mdb_token m_NickNameColumnToken;
92   mdb_token m_PriEmailColumnToken;
93   mdb_token m_2ndEmailColumnToken;
94   mdb_token m_DefaultEmailColumnToken;
95   mdb_token m_CardTypeColumnToken;
96   mdb_token m_WorkPhoneColumnToken;
97   mdb_token m_HomePhoneColumnToken;
98   mdb_token m_FaxColumnToken;
99   mdb_token m_PagerColumnToken;
100   mdb_token m_CellularColumnToken;
101   mdb_token m_WorkPhoneTypeColumnToken;
102   mdb_token m_HomePhoneTypeColumnToken;
103   mdb_token m_FaxTypeColumnToken;
104   mdb_token m_PagerTypeColumnToken;
105   mdb_token m_CellularTypeColumnToken;
106   mdb_token m_HomeAddressColumnToken;
107   mdb_token m_HomeAddress2ColumnToken;
108   mdb_token m_HomeCityColumnToken;
109   mdb_token m_HomeStateColumnToken;
110   mdb_token m_HomeZipCodeColumnToken;
111   mdb_token m_HomeCountryColumnToken;
112   mdb_token m_WorkAddressColumnToken;
113   mdb_token m_WorkAddress2ColumnToken;
114   mdb_token m_WorkCityColumnToken;
115   mdb_token m_WorkStateColumnToken;
116   mdb_token m_WorkZipCodeColumnToken;
117   mdb_token m_WorkCountryColumnToken;
118   mdb_token m_JobTitleColumnToken;
119   mdb_token m_DepartmentColumnToken;
120   mdb_token m_CompanyColumnToken;
121   mdb_token m_AimScreenNameColumnToken;
122   mdb_token m_AnniversaryYearColumnToken;
123   mdb_token m_AnniversaryMonthColumnToken;
124   mdb_token m_AnniversaryDayColumnToken;
125   mdb_token m_SpouseNameColumnToken;
126   mdb_token m_FamilyNameColumnToken;
127   mdb_token m_DefaultAddressColumnToken;
128   mdb_token m_CategoryColumnToken;
129   mdb_token m_WebPage1ColumnToken;
130   mdb_token m_WebPage2ColumnToken;
131   mdb_token m_BirthYearColumnToken;
132   mdb_token m_BirthMonthColumnToken;
133   mdb_token m_BirthDayColumnToken;
134   mdb_token m_Custom1ColumnToken;
135   mdb_token m_Custom2ColumnToken;
136   mdb_token m_Custom3ColumnToken;
137   mdb_token m_Custom4ColumnToken;
138   mdb_token m_NotesColumnToken;
139   mdb_token m_LastModDateColumnToken;
140   mdb_token m_RecordKeyColumnToken;
141   mdb_token m_LowerPriEmailColumnToken;
142   mdb_token m_Lower2ndEmailColumnToken;
143 
144   mdb_token m_MailFormatColumnToken;
145   mdb_token m_PopularityIndexColumnToken;
146 
147   mdb_token m_AddressCharSetColumnToken;
148   mdb_token m_LastRecordKeyColumnToken;
149 
150   mdb_token m_ListNameColumnToken;
151   mdb_token m_ListNickNameColumnToken;
152   mdb_token m_ListDescriptionColumnToken;
153   mdb_token m_ListTotalColumnToken;
154   mdb_token m_LowerListNameColumnToken;
155 
156   nsCOMPtr<nsIMdbFactory> mMdbFactory;
157 };
158 
159 #endif
160