/***********************************************************************
 *
 *  Copyright (C) 2005-2006 Novell, Inc. All Rights Reserved.
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License as published by the Free Software Foundation; version 2.1
 *  of the License.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Library Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, Novell, Inc.
 *
 *  To contact Novell about this file by physical or electronic mail,
 *  you may find current contact information at www.novell.com.
 *
 ***********************************************************************/


#ifndef __FPM_Firefox_Password_MANAGER_H__
#define __FPM_Firefox_Password_MANAGER_H__



#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdarg.h>
#include <time.h>

#ifdef WIN32
	#include <windows.h>
	#include <userenv.h>
	#pragma comment(lib,"userenv.lib")

	#define STRCMPI strcmpi	
	#define APIEXPORT __declspec(dllexport)

	#define NSS_LIBRARY_NAME   "nss3.dll"
	#define PLC_LIBRARY_NAME   "plc4.dll"
	#define NSPR_LIBRARY_NAME  "nspr4.dll"
	#define PLDS_LIBRARY_NAME  "plds4.dll"
	#define SOFTN_LIBRARY_NAME "softokn3.dll"

	#define LOADLIBRARY(x)  LoadLibrary(x)
	#define GETPROCADDRESS  GetProcAddress
	#define FREELIBRARY     FreeLibrary

#else
	#include <dlfcn.h>
	#define STRCMPI strcasecmp
	#define APIEXPORT 

	#define NSS_LIBRARY_NAME   "libnss3.so"
	#define PLC_LIBRARY_NAME   "libplc4.so"
	#define NSPR_LIBRARY_NAME  "libnspr4.so"
	#define PLDS_LIBRARY_NAME  "libplds4.so"
	#define SOFTN_LIBRARY_NAME "libsoftokn3.so"

	#define LOADLIBRARY(x)  dlopen(x, RTLD_LAZY)   // alternative : RTLD_NOW 
	#define GETPROCADDRESS  dlsym
	#define FREELIBRARY     dlclose

	#define HMODULE   void *

#endif



#define FPM_TRUE    1
#define FPM_FALSE   0

#define MESG_DEBUG      0
#define MESG_PRINT      1
#define MESG_ERROR      2

#define MAX_PROFILE_COUNT 5

//#define DEBUG  11

#define Unichar unsigned int

#define HEADER_VERSION  "#2c"
#define CRYPT_PREFIX    "~"

#define SIGNON_FILE_NAME "signons.txt"

// Internal structure declaration taken from firefox.....
typedef enum SECItemType
{
    siBuffer = 0,
    siClearDataBuffer = 1,
    siCipherDataBuffer = 2,
    siDERCertBuffer = 3,
    siEncodedCertBuffer = 4,
    siDERNameBuffer = 5,
    siEncodedNameBuffer = 6,
    siAsciiNameString = 7,
    siAsciiString = 8,
    siDEROID = 9,
    siUnsignedInteger = 10,
    siUTCTime = 11,
    siGeneralizedTime = 12
};

//typedef struct SECItemStr SECItem;

struct SECItem 
{
    SECItemType type;
    unsigned char *data;
    unsigned int len;
};


typedef enum SECStatus 
{
    SECWouldBlock = -2,
    SECFailure = -1,
    SECSuccess = 0
};

// For some PR type varialbes...just to remove gecko-sdk dependency
// following is added here.
#define PRBool   int
#define PRUint32 unsigned int
#define PR_TRUE  1
#define PR_FALSE 0



// End



typedef struct PK11SlotInfoStr PK11SlotInfo;

// NSS Library functions
//typedef char *(PR_CALLBACK *PK11PasswordFunc)(PK11SlotInfo *slot, PRBool retry, void *arg);
typedef SECStatus      (*NSS_Init) (const char *configdir);
typedef SECStatus      (*NSS_Shutdown) (void);
//typedef void           (*PK11_SetPasswordFunc) (PK11PasswordFunc func);
typedef PK11SlotInfo * (*PK11_GetInternalKeySlot) (void);
typedef void           (*PK11_FreeSlot) (PK11SlotInfo *slot);
typedef SECStatus      (*PK11_Authenticate) (PK11SlotInfo *slot, PRBool loadCerts, void *wincx);
typedef SECStatus      (*PK11_CheckUserPassword) (PK11SlotInfo *slot,char *pw);
typedef SECStatus      (*PK11SDR_Decrypt) (SECItem *data, SECItem *result, void *cx);
typedef SECStatus      (*PK11SDR_Encrypt) (SECItem *keyid, SECItem *data, SECItem *result, void *cx);

// PLC Library functions
typedef char *         (*PL_Base64Encode)( const char *src, PRUint32 srclen, char *dest);
typedef char *         (*PL_Base64Decode)( const char *src, PRUint32 srclen, char *dest);

void PrintMessage( int level, char *mesg , ...);
int IsDirectoryExists( char *path );
void StrLwr(char *str);



// Profile initiliazation functions
extern "C" APIEXPORT int FPM_IsStoreAvailable();
extern "C" APIEXPORT int FPM_GetProfileList(char **profileList[], int **profileFlag);
extern "C" APIEXPORT int FPM_FirefoxProfileInit(char *profileName);
extern "C" APIEXPORT int FPM_FirefoxProfileExit(char *profileName);

// Master password functions
extern "C" APIEXPORT int FPM_IsMasterPasswordSet(char *profileName);
extern "C" APIEXPORT int FPM_CheckMasterPassword(char *profileName, char *masterPassword);

// Signon data update functions
extern "C" APIEXPORT int FPM_GetSignonData(char *profileName,struct Host **host, int doRefresh);
extern "C" APIEXPORT int FPM_WriteSignonData(char *profileName);
extern "C" APIEXPORT int FPM_AddHost(char *profileName, struct Host *host, int doUpdate);
extern "C" APIEXPORT int FPM_ModifyHost(char *profileName, struct Host *host, int doUpdate);
extern "C" APIEXPORT int FPM_RemoveHost(char *profileName, char *hostname, int doUpdate);


#endif