/**
 * Copyright(c) 2011 Trusted Logic.   All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 *
 *  * Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer.
 *  * Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in
 *    the documentation and/or other materials provided with the
 *    distribution.
 *  * Neither the name Trusted Logic nor the names of its
 *    contributors may be used to endorse or promote products derived
 *    from this software without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */

#ifndef __SST_H__
#define __SST_H__

#ifdef __cplusplus
extern "C" {
#endif


#include "s_type.h"
#include "s_error.h"

#ifdef SST_EXPORTS
#define SST_EXPORT_API S_DLL_EXPORT
#else
#define SST_EXPORT_API S_DLL_IMPORT
#endif

/* -----------------------------------------------------------------------------
                          Service SST Types
----------------------------------------------------------------------------- */

#ifndef EXCLUDE_SERVICE_SST_TYPES

/** The SST_ERROR type */
typedef uint32_t  SST_ERROR;

/** The SST_HANDLE type */
typedef uint32_t  SST_HANDLE;

typedef struct SST_FILE_INFO
{
   char* pName;
   uint32_t nSize;
} SST_FILE_INFO;

#endif /* EXCLUDE_SERVICE_SST_TYPES */

typedef enum
{
   SST_SEEK_SET = 0,
   SST_SEEK_CUR,
   SST_SEEK_END
} SST_WHENCE;


/* -----------------------------------------------------------------------------
                          Constants
----------------------------------------------------------------------------- */

#ifndef EXCLUDE_SERVICE_SST_CONSTANTS

/** The Invalid SST_FILE_HANDLE */
#define SST_NULL_HANDLE     0

/* Legacy constant name */
#define SST_HANDLE_INVALID    SST_NULL_HANDLE

/** Max length for file names */
#define SST_MAX_FILENAME 0x40

/** Maximum pointer position in a file */
#define SST_MAX_FILE_POSITION    0xFFFFFFFF

/** File access modes */
#define SST_O_READ               0x00000001
#define SST_O_WRITE              0x00000002
#define SST_O_WRITE_META         0x00000004
#define SST_O_SHARE_READ         0x00000010
#define SST_O_SHARE_WRITE        0x00000020
#define SST_O_CREATE             0x00000200
#define SST_O_EXCLUSIVE          0x00000400


#endif /* EXCLUDE_SERVICE_SST_CONSTANTS */


/* -----------------------------------------------------------------------------
                        Functions
----------------------------------------------------------------------------- */

#ifndef EXCLUDE_SERVICE_SST_FUNCTIONS

SST_ERROR SST_EXPORT_API SSTInit(void);

SST_ERROR SST_EXPORT_API SSTTerminate(void);

SST_ERROR SST_EXPORT_API SSTOpen(const char*       pFilename,
                                 uint32_t    nFlags,
                                 uint32_t    nReserved,
                                 SST_HANDLE* phFile);

SST_ERROR SST_EXPORT_API SSTCloseHandle(SST_HANDLE  hFile);

SST_ERROR SST_EXPORT_API SSTWrite(SST_HANDLE hFile,
                                  const uint8_t*   pBuffer,
                                  uint32_t   nSize);

SST_ERROR SST_EXPORT_API SSTRead(SST_HANDLE  hFile,
                                 uint8_t*    pBuffer,
                                 uint32_t    nSize,
                                 uint32_t*   pnCount);

SST_ERROR SST_EXPORT_API SSTSeek(SST_HANDLE  hFile,
                                 int32_t     nOffset,
                                 SST_WHENCE  eWhence);

SST_ERROR SST_EXPORT_API SSTTell(SST_HANDLE  hFile,
                                 uint32_t*   pnPos);

SST_ERROR SST_EXPORT_API SSTGetSize(const char*        pFilename,
                                    uint32_t*    pnSize);

SST_ERROR SST_EXPORT_API SSTEof( SST_HANDLE   hFile,
                                 bool*        pbEof);

SST_ERROR SST_EXPORT_API SSTCloseAndDelete(SST_HANDLE hFile);

SST_ERROR SST_EXPORT_API SSTTruncate(  SST_HANDLE  hFile,
                                       uint32_t    nSize);

SST_ERROR SST_EXPORT_API SSTRename(SST_HANDLE hFile,
                                   const char* pNewFilename);

SST_ERROR SST_EXPORT_API SSTEnumerationStart(const char*     pFilenamePattern,
                                             uint32_t  nReserved1,
                                             uint32_t  nReserved2,
                                             SST_HANDLE* phFileEnumeration);

SST_ERROR SST_EXPORT_API SSTEnumerationCloseHandle(SST_HANDLE hFileEnumeration);

SST_ERROR SST_EXPORT_API SSTEnumerationGetNext(SST_HANDLE      hFileEnumeration,
                                               SST_FILE_INFO** ppFileInfo);

SST_ERROR SST_EXPORT_API SSTDestroyFileInfo(SST_FILE_INFO*   pFileInfo);

#endif /* EXCLUDE_SERVICE_SST_FUNCTIONS */

#ifdef __cplusplus
}
#endif

#endif /* __SST_H__ */
