/***********************************************************************
 * 
 *  Copyright (C) 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.
 * 
 *  Author: Juan Carlos Luciani <jluciani@novell.com>
 *
 ***********************************************************************/

#ifndef _INTERNAL_H_
#define _INTERNAL_H_

//===[ Include files ]=====================================================

#include "platform.h"
#include <expat.h>
#include <micasa_types.h>
#include <casa_status.h>
#include <casa_s_authtoken.h>
#include <casa_c_ipc.h>
#include "proto.h"
#include "list_entry.h"
#include "config_if.h"
#include "iden_token_provider_if.h"

//===[ Type definitions ]==================================================

//
// Authentication Token structure
//
typedef struct _AuthToken
{
   int   tokenLifetime;
   char  *pSignature;
   int   signatureLen;
   char  *pIdenTokenType;
   int   idenTokenTypeLen;
   char  *pIdenToken;
   int   idenTokenLen;

} AuthToken, *PAuthToken;


//===[ Inlines functions   ]===============================================

//===[ Function prototypes ]===============================================

//===[ Global variables ]==================================================

//===[ Global externals ]==================================================

extern int  DebugLevel;
extern char pathCharString[];
extern char moduleConfigFolderPath[];
extern char IpcClientLibraryPath[];

//===[ External prototypes ]===============================================

//
// Functions exported by config.c
//
extern
CasaStatus
GetConfigInterface(
   IN       const char  *pConfigFolder,
   IN       const char  *pConfigName,
   INOUT    ConfigIf    **ppConfigIf);

extern
CasaStatus
ConfigIfInit(void);

extern
void
ConfigIfUninit(void);

//
// Functions exported by identoken.c
// 
extern
CasaStatus
GetIdenTokenProviderInterface(
   IN       const char           *pIdenTokenTypeName,
   INOUT    IdenTokenProviderIf  **ppIdenTokenProviderIf);

extern
CasaStatus
IdenTokenInit(void);

extern
void
IdenTokenUninit(void);

//
// Functions exported by platform.c
// 
extern
HANDLE
PlatAllocMutex(void);

extern
void
PlatDestroyMutex(HANDLE hMutex);

extern
void
PlatAcquireMutex(HANDLE hMutex);

extern
void
PlatReleaseMutex(HANDLE hMutex);

extern
LIB_HANDLE
OpenLibrary(
   IN    char *pFileName);

extern
void
CloseLibrary(
   IN    LIB_HANDLE libHandle);

extern
void*
GetFunctionPtr(
   IN    LIB_HANDLE libHandle,
   IN    char *pFunctionName);

//
// Functions exported by principal.c
// 

extern
CasaStatus
GetPrincipalInterface(
   IN       IdenTokenIf  *pIdenTokenIf,
   INOUT    PrincipalIf  **ppPrincipalIf);

extern
CasaStatus
PrincipalIfInit(void);

extern
void
PrincipalIfUninit(void);

//
// Functions exported by validate.c
// 

extern
CasaStatus SSCS_CALL
ValidateAuthToken(
   IN       const char     *pServiceName,
   IN       const char     *pTokenBuf,
   IN       const size_t   tokenBufLen,
   INOUT    PrincipalIf    **ppPrincipalIf);

//
// Functions exported by authtoken.c
// 

extern
CasaStatus
CreateAuthToken(
   IN    char *pTokenBuf,
   IN    int tokenBufLen,
   INOUT AuthToken **ppAuthToken);

extern
void
RelAuthToken(
   IN    AuthToken *pAuthToken);

extern
CasaStatus
CheckAuthToken(
   IN    AuthToken *pAuthToken,
   IN    const char *pServiceName);

//
// Defined in utils.c
//

extern
CasaStatus
EncodeData(
   IN    const void *pData,
   IN    const uint32_t dataLen,
   INOUT char **ppEncodedData,
   INOUT uint32_t *pEncodedDataLen);

extern
CasaStatus
DecodeData(
   IN    const char *pEncodedData,
   IN    const uint32_t encodedDataLen, // Does not include NULL terminator
   INOUT void **ppData,
   INOUT uint32_t *pDataLen);

extern
int
dtoul(
   IN    const char *cp,
   IN    const int len);


//=========================================================================

#endif // _INTERNAL_H_