/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* ***** BEGIN LICENSE BLOCK *****
 * Version: NPL 1.1/GPL 2.0/LGPL 2.1
 *
 * The contents of this file are subject to the Netscape Public License
 * Version 1.1 (the "License"); you may not use this file except in
 * compliance with the License. You may obtain a copy of the License at
 * http://www.mozilla.org/NPL/
 *
 * Software distributed under the License is distributed on an "AS IS" basis,
 * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
 * for the specific language governing rights and limitations under the
 * License.
 *
 * The Original Code is mozilla.org code.
 *
 * The Initial Developer of the Original Code is 
 * Netscape Communications Corporation.
 * Portions created by the Initial Developer are Copyright (C) 1998
 * the Initial Developer. All Rights Reserved.
 *
 * Contributor(s):
 *  Seth Spitzer <sspitzer@netscape.com>
 *
 * Alternatively, the contents of this file may be used under the terms of
 * either the GNU General Public License Version 2 or later (the "GPL"), or 
 * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
 * in which case the provisions of the GPL or the LGPL are applicable instead
 * of those above. If you wish to allow use of your version of this file only
 * under the terms of either the GPL or the LGPL, and not to allow others to
 * use your version of this file under the terms of the NPL, indicate your
 * decision by deleting the provisions above and replace them with the notice
 * and other provisions required by the GPL or the LGPL. If you do not delete
 * the provisions above, a recipient may use your version of this file under
 * the terms of any one of the NPL, the GPL or the LGPL.
 *
 * ***** END LICENSE BLOCK ***** */

/* nsFileSpec is declared in nsIAbDirectory.idl */
#include "nsIAddrDBAnnouncer.idl"
#include "nsIAbCard.idl"
#include "nsIAbDirectory.idl"

interface nsIMdbTableRowCursor;
interface nsIMdbEnv;
interface nsIMdbRow;

%{C++
// this is the prefix we for attributes that are specific
// to the mozilla addressbook, and weren't in 4.x and aren't specified in
// RFC 2789.  used when exporting and import LDIF
// see nsTextAddress.cpp, nsAddressBook.cpp
#define MOZ_AB_LDIF_PREFIX "mozilla"

// note, GeneratedName is not a real column
// if you change any of this, make sure to change 
// Get / Set CardValue in nsAbCardProperty.cpp
#define kFirstNameColumn          "FirstName"
#define kLastNameColumn           "LastName"
#define kPhoneticFirstNameColumn  "PhoneticFirstName"
#define kPhoneticLastNameColumn   "PhoneticLastName"
#define kPhoneticNameColumn       "_PhoneticName"
#define kDisplayNameColumn        "DisplayName"
#define kNicknameColumn           "NickName"
#define kPriEmailColumn           "PrimaryEmail"
#define k2ndEmailColumn           "SecondEmail"
#define kDefaultEmailColumn       "DefaultEmail"
#define kCardTypeColumn           "CardType"
#define kPreferMailFormatColumn   "PreferMailFormat"
#define kWorkPhoneColumn          "WorkPhone"
#define kHomePhoneColumn          "HomePhone"
#define kFaxColumn                "FaxNumber"
#define kPagerColumn              "PagerNumber"
#define kCellularColumn           "CellularNumber"
#define kWorkPhoneTypeColumn      "WorkPhoneType"
#define kHomePhoneTypeColumn      "HomePhoneType"
#define kFaxTypeColumn            "FaxNumberType"
#define kPagerTypeColumn          "PagerNumberType"
#define kCellularTypeColumn       "CellularNumberType"
#define kHomeAddressColumn        "HomeAddress"
#define kHomeAddress2Column       "HomeAddress2"
#define kHomeCityColumn           "HomeCity"
#define kHomeStateColumn          "HomeState"
#define kHomeZipCodeColumn        "HomeZipCode"
#define kHomeCountryColumn        "HomeCountry"
#define kWorkAddressColumn        "WorkAddress"
#define kWorkAddress2Column       "WorkAddress2"
#define kWorkCityColumn           "WorkCity"
#define kWorkStateColumn          "WorkState"
#define kWorkZipCodeColumn        "WorkZipCode"
#define kWorkCountryColumn        "WorkCountry"
#define kJobTitleColumn           "JobTitle"
#define kDepartmentColumn         "Department"
#define kCompanyColumn            "Company"
#define kAimScreenNameColumn      "_AimScreenName"
#define kAnniversaryYearColumn    "AnniversaryYear"
#define kAnniversaryMonthColumn   "AnniversaryMonth"
#define kAnniversaryDayColumn     "AnniversaryDay"
#define kSpouseNameColumn         "SpouseName"
#define kFamilyNameColumn         "FamilyName"
#define kDefaultAddressColumn     "DefaultAddress"
#define kCategoryColumn           "Category"
// webPage1 is work web page
#define kWebPage1Column           "WebPage1"
// webPage2 is home web page
#define kWebPage2Column           "WebPage2"
#define kBirthYearColumn          "BirthYear"
#define kBirthMonthColumn         "BirthMonth"
#define kBirthDayColumn           "BirthDay"
#define kCustom1Column            "Custom1"
#define kCustom2Column            "Custom2"
#define kCustom3Column            "Custom3"
#define kCustom4Column            "Custom4"
#define kNotesColumn              "Notes"
#define kLastModifiedDateColumn   "LastModifiedDate"
#define kAddressCharSetColumn     "AddrCharSet"
#define kMailListName             "ListName"
#define kMailListNickName         "ListNickName"
#define kMailListDescription      "ListDescription"
#define kMailListTotalAddresses   "ListTotalAddresses"
// not shown in the UI
#define kLowerPriEmailColumn      "LowercasePrimaryEmail"
%}

[scriptable, uuid(ca536e0e-1dd1-11b2-951a-e02b86e4f60e)]
interface nsAddrDBCommitType 
{
  const long kSmallCommit = 0;
  const long kLargeCommit = 1;
  const long kSessionCommit = 2;
  const long kCompressCommit = 3;
};

[scriptable, uuid(A4186D8B-1DD0-11d3-A303-001083003D0C)] 
interface nsIAddrDatabase : nsIAddrDBAnnouncer {

	[noscript] attribute nsFileSpec dbPath;
	[noscript] void open(in nsFileSpec folderName, in boolean create,
						out nsIAddrDatabase pCardDB, in boolean upgrading);
	void close(in boolean forceCommit);
	[noscript] void openMDB(in nsFileSpec dbName, in boolean create);
	void closeMDB(in boolean commit);

	void commit(in unsigned long commitType);
	void forceClosed();

	void createNewCardAndAddToDB(in nsIAbCard newCard, in boolean aNotify);
	void createNewCardAndAddToDBWithKey(in nsIAbCard newCard, in boolean aNotify, out unsigned long key);	
	void createNewListCardAndAddToDB(in nsIAbDirectory list, in unsigned long listRowID, in nsIAbCard newCard, in boolean aNotify);
	void createMailListAndAddToDB(in nsIAbDirectory newList, in boolean aNotify);
  void createMailListAndAddToDBWithKey(in nsIAbDirectory newList, in boolean aNotify, out PRUint32 key);
	nsIEnumerator enumerateCards(in nsIAbDirectory directory);
	nsIEnumerator enumerateListAddresses(in nsIAbDirectory directory);
	void getMailingListsFromDB(in nsIAbDirectory parentDir);
	void deleteCard(in nsIAbCard card, in boolean aNotify);
	void editCard(in nsIAbCard card, in boolean aNotify);
	boolean containsCard(in nsIAbCard card);
	void deleteMailList(in nsIAbDirectory mailList, in boolean aNotify);
	void editMailList(in nsIAbDirectory mailList, in nsIAbCard listCard, in boolean aNotify);
	boolean containsMailList(in nsIAbDirectory mailList);
	void deleteCardFromMailList(in nsIAbDirectory mailList, in nsIAbCard card, in boolean aNotify);
	readonly attribute wstring directoryName;

    /**
	 * aUTF8Value needs to be in UTF-8
	 */
	nsIAbCard getCardFromAttribute(in nsIAbDirectory directory, in string aName, in string aUTF8Value, in boolean caseInsensitive);

	PRBool findMailListbyUnicodeName(in wstring listName);

	void getCardCount(out PRUint32 count);

	[noscript] readonly attribute nsIMdbRow newRow;
	[noscript] readonly attribute nsIMdbRow newListRow;
	[noscript] void addCardRowToDB(in nsIMdbRow newRow);
	[noscript] void addLdifListMember(in nsIMdbRow row, in string value);
	[noscript] void addFirstName(in nsIMdbRow row, in string value);
	[noscript] void addLastName(in nsIMdbRow row, in string value);
	[noscript] void addPhoneticFirstName(in nsIMdbRow row, in string value);
	[noscript] void addPhoneticLastName(in nsIMdbRow row, in string value);
	[noscript] void addDisplayName(in nsIMdbRow row, in string value);
	[noscript] void addNickName(in nsIMdbRow row, in string value);
	[noscript] void addPrimaryEmail(in nsIMdbRow row, in string value);
	[noscript] void add2ndEmail(in nsIMdbRow row, in string value);
  [noscript] void addDefaultEmail(in nsIMdbRow row, in string value);
  [noscript] void addCardType(in nsIMdbRow row, in string value);
	[noscript] void addWorkPhone(in nsIMdbRow row, in string value);
	[noscript] void addHomePhone(in nsIMdbRow row, in string value);
	[noscript] void addFaxNumber(in nsIMdbRow row, in string value);
	[noscript] void addPagerNumber(in nsIMdbRow row, in string value);
	[noscript] void addCellularNumber(in nsIMdbRow row, in string value);
  [noscript] void addWorkPhoneType(in nsIMdbRow row, in string value);
  [noscript] void addHomePhoneType(in nsIMdbRow row, in string value);
  [noscript] void addFaxNumberType(in nsIMdbRow row, in string value);
  [noscript] void addPagerNumberType(in nsIMdbRow row, in string value);
  [noscript] void addCellularNumberType(in nsIMdbRow row, in string value);
	[noscript] void addHomeAddress(in nsIMdbRow row, in string value);
	[noscript] void addHomeAddress2(in nsIMdbRow row, in string value);
	[noscript] void addHomeCity(in nsIMdbRow row, in string value);
	[noscript] void addHomeState(in nsIMdbRow row, in string value);
	[noscript] void addHomeZipCode(in nsIMdbRow row, in string value);
	[noscript] void addHomeCountry(in nsIMdbRow row, in string value);
	[noscript] void addWorkAddress(in nsIMdbRow row, in string value);
	[noscript] void addWorkAddress2(in nsIMdbRow row, in string value);
	[noscript] void addWorkCity(in nsIMdbRow row, in string value);
	[noscript] void addWorkState(in nsIMdbRow row, in string value);
	[noscript] void addWorkZipCode(in nsIMdbRow row, in string value);
	[noscript] void addWorkCountry(in nsIMdbRow row, in string value);
	[noscript] void addJobTitle(in nsIMdbRow row, in string value);
	[noscript] void addDepartment(in nsIMdbRow row, in string value);
	[noscript] void addCompany(in nsIMdbRow row, in string value);
  [noscript] void addAimScreenName(in nsIMdbRow row, in string value);
  [noscript] void addAnniversaryYear(in nsIMdbRow row, in string value);
  [noscript] void addAnniversaryMonth(in nsIMdbRow row, in string value);
  [noscript] void addAnniversaryDay(in nsIMdbRow row, in string value);
  [noscript] void addSpouseName(in nsIMdbRow row, in string value);
  [noscript] void addFamilyName(in nsIMdbRow row, in string value);
  [noscript] void addDefaultAddress(in nsIMdbRow row, in string value);
  [noscript] void addCategory(in nsIMdbRow row, in string value);
	[noscript] void addWebPage1(in nsIMdbRow row, in string value);
	[noscript] void addWebPage2(in nsIMdbRow row, in string value);
	[noscript] void addBirthYear(in nsIMdbRow row, in string value);
	[noscript] void addBirthMonth(in nsIMdbRow row, in string value);
	[noscript] void addBirthDay(in nsIMdbRow row, in string value);
	[noscript] void addCustom1(in nsIMdbRow row, in string value);
	[noscript] void addCustom2(in nsIMdbRow row, in string value);
	[noscript] void addCustom3(in nsIMdbRow row, in string value);
	[noscript] void addCustom4(in nsIMdbRow row, in string value);
	[noscript] void addNotes(in nsIMdbRow row, in string value);
	[noscript] void addPreferMailFormat(in nsIMdbRow row, in unsigned long value);

	[noscript] void addListName(in nsIMdbRow row, in string value);
	[noscript] void addListNickName(in nsIMdbRow row, in string value);
	[noscript] void addListDescription(in nsIMdbRow row, in string value);
	[noscript] void addListDirNode(in nsIMdbRow listRow);

    /**
     * use for getting and setting generic string attributes
     * like _AimScreenName
     */
    void setCardValue(in nsIAbCard card, in string name, in wstring value, in boolean notify);
    wstring getCardValue(in nsIAbCard card, in string name);

    void getDeletedCardList(out unsigned long aCount, out nsISupportsArray aDeletedList); 
    void getDeletedCardCount(out unsigned long count); 

    /**
     * used for adding a string attributes to a row.
     * used during LDIF and addressbook import.
     *
     * @param aRow
     *        The row we're adding the column to
     * @param aLDIFAttributeName
     *        The column name  (examples: mozillaCategory, 
     *                                    mozilla_AimScreenName)
     * @param aColValue
     *        The column value (example: jabroni316)
     */
    [noscript] void addRowValue(in nsIMdbRow aRow, in ACString aLDIFAttributeName, in AString aColValue);

    void AddListCardColumnsToRow(in nsIAbCard aPCard,
                                            in nsIMdbRow aPListRow,
                                            in unsigned long aPos,
                                            out nsIAbCard aPNewCard,
                                            in boolean aInMailingList);
    void InitCardFromRow(in nsIAbCard aNewCard,in nsIMdbRow aCardRow);
    void SetListAddressTotal(in nsIMdbRow aListRow, in PRUint32 aTotal);
    nsIMdbRow FindRowByCard(in nsIAbCard aCard);

};
