/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*-
 *
 * The contents of this file are subject to the Netscape Public License
 * Version 1.0 (the "NPL"); you may not use this file except in
 * compliance with the NPL.  You may obtain a copy of the NPL at
 * http://www.mozilla.org/NPL/
 *
 * Software distributed under the NPL is distributed on an "AS IS" basis,
 * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL
 * for the specific language governing rights and limitations under the
 * NPL.
 *
 * The Initial Developer of this code under the NPL is Netscape
 * Communications Corporation.  Portions created by Netscape are
 * Copyright (C) 1998 Netscape Communications Corporation.  All Rights
 * Reserved.
 */
#ifndef __nsINetFile_h
#define __nsINetFile_h
#include "nsISupports.h"
#include "nsString.h"
#include "prio.h"

// These defines are for temporary use until we get a real dir manager.
#define USER_DIR_TOK "%USER%"
#define CACHE_DIR_TOK "%CACHE_D%"
#define DEF_DIR_TOK "%DEF_D%"

#define COOKIE_FILE_TOK "%COOKIE_F%"
#ifdef XP_PC
#define COOKIE_FILE "cookies.txt"
#else
#define COOKIE_FILE "cookies"
#endif

#ifdef CookieManagement
#define COOKIE_PERMISSION_FILE_TOK "%COOKIE_PERMISSION_F%"
#ifdef XP_PC
#define COOKIE_PERMISSION_FILE "cookperm.txt"
#else
#define COOKIE_PERMISSION_FILE "cookperm"
#endif
#endif

#ifdef SingleSignon
#define SIGNON_FILE_TOK "%SIGNON_F%"
#ifdef XP_PC
#define SIGNON_FILE "signons.txt"
#else
#define SIGNON_FILE "signons"
#endif
#endif

#define CACHE_DB_F_TOK "%CACHE_DB_F%"
#define CACHE_DB_FILE "fat.db"

// {9E04ADC2-2B1D-11d2-B6EB-00805F8A2676}
#define NS_INETFILE_IID   \
{ 0x9e04adc2, 0x2b1d, 0x11d2, \
    {0xb6, 0xeb, 0x00, 0x80, 0x5f, 0x8a, 0x26, 0x76} }

// Represents a file for use with nsINetFile routines.
typedef struct _nsFile {
    PRFileDesc *fd;
} nsFile;

// Represents a directory for use with nsINetFile routines.
typedef struct _nsDir {
    PRDir *dir;
} nsDir;

// Open flags. Used with nsINetFile::OpenFile.
typedef enum {
    nsRead = 1,
    nsWrite = 2,
    nsReadWrite = 3,
    nsReadBinary = 5,
    nsWriteBinary = 6,
    nsReadWriteBinary = 7,
    nsOverWrite = 8
} nsFileMode;

class nsINetFile: public nsISupports {
public:
    /*
     * File methods
     */

    // Convert a generic file names into a platform file path
    // Currently generic file location information is prepended to the 
    // begining of aName. For example, if I wanted to open the cookie file,
    // I'd pass in "%USER%\cookies.txt . aName is platform specific.
    NS_IMETHOD GetFilePath(const char *aName, char **aRes) = 0;
    NS_IMETHOD GetTemporaryFilePath(const char *aName, char **aRes) = 0;
    NS_IMETHOD GetUniqueFilePath(const char *aName, char **aRes) = 0;
    NS_IMETHOD GetCacheFileName(char *aDirTok, char **aRes) = 0;

    // Open a file
    NS_IMETHOD OpenFile(const char *aPath, nsFileMode aMode,
                        nsFile** aRes) = 0;
    
    // Close a file
    NS_IMETHOD CloseFile(nsFile* aFile) = 0;

    // Read a file
    NS_IMETHOD FileRead(nsFile *aFile, char **aBuf, 
                        PRInt32 *aBuflen,
                        PRInt32 *aBytesRead) = 0;

    NS_IMETHOD FileReadLine(nsFile *aFile, char **aBuf,
                        PRInt32 *aBuflen,
                        PRInt32 *aBytesRead) = 0;

    // Write a file
    NS_IMETHOD FileWrite(nsFile *aFile, const char *aBuf, 
                         PRInt32 *aLen,
                         PRInt32 *aBytesWritten) = 0;

    // Sync a file with disk
    NS_IMETHOD FileSync(nsFile *aFile) = 0;

    // Remove a file
    NS_IMETHOD FileRemove(const char *aPath) = 0;

    // Rename a file
    NS_IMETHOD FileRename(const char *aPathOld, const char *aPathNew) = 0;

    /*
     * Directory Methods
     */

    // Open a directory
    NS_IMETHOD OpenDir(const char *aPath, nsDir** aRes) = 0;

    // Close a directory
    NS_IMETHOD CloseDir(nsDir *aDir) = 0;

    // Create a directory
    NS_IMETHOD CreateDir(const char *aPath, PRBool aRecurse) = 0;

    // Assocaite a token with a directory.
    NS_IMETHOD SetDirectory(const char *aToken, const char *aDir) = 0;

    // Associate a filename with a token, and optionally a dir token.
    NS_IMETHOD SetFileAssoc(const char *aToken, const char *aFile, const char *aDirToken) = 0;

};

/**
 * Create an instance of the INetFile
 *
 */
extern "C" NS_NET nsresult NS_NewINetFile(nsINetFile** aInstancePtrResult,
                                             nsISupports* aOuter);


extern "C" NS_NET nsresult NS_InitINetFile(void);

extern "C" NS_NET nsresult NS_ShutdownINetFile();

#endif //__nsINetFile_h
