#ifndef _WSBGEN_H
#define _WSBGEN_H

/*++

Copyright (c) 1996  Microsoft Corporation
© 1998 Seagate Software, Inc.  All rights reserved.

Module Name:

    wsbgen.h

Abstract:

    This module defines very basic WSB functions and defines that are general to WSB

Author:

    Michael Lotz    [lotz]      12-Apr-1997

Revision History:

--*/

// These macros define the module assignments for the error facilities.
// See also Facility Names, below.
#define WSB_FACILITY_PLATFORM           0x100
#define WSB_FACILITY_RMS                0x101
#define WSB_FACILITY_HSMENG             0x103
#define WSB_FACILITY_JOB                0x104
#define WSB_FACILITY_HSMTSKMGR          0x105
#define WSB_FACILITY_FSA                0x106
#define WSB_FACILITY_GUI                0x10a
#define WSB_FACILITY_MOVER              0x10b
#define WSB_FACILITY_LAUNCH             0x10c
#define WSB_FACILITY_TEST               0x10d
#define WSB_FACILITY_USERLINK           0x10e
#define WSB_FACILITY_CLI                0x10f

// Facility Names
#define WSB_FACILITY_PLATFORM_NAME      OLESTR("RsCommon.dll")
#define WSB_FACILITY_RMS_NAME           OLESTR("RsSub.dll")
#define WSB_FACILITY_HSMENG_NAME        OLESTR("RsEng.dll")
#define WSB_FACILITY_JOB_NAME           OLESTR("RsJob.dll")
#define WSB_FACILITY_HSMTSKMGR_NAME     OLESTR("RsTask.dll")
#define WSB_FACILITY_FSA_NAME           OLESTR("RsFsa.dll")
#define WSB_FACILITY_GUI_NAME           OLESTR("RsAdmin.dll")
#define WSB_FACILITY_MOVER_NAME         OLESTR("RsMover.dll")
#define WSB_FACILITY_LAUNCH_NAME        OLESTR("RsLaunch.exe")
#define WSB_FACILITY_TEST_NAME          OLESTR("RsTools.dll")
#define WSB_FACILITY_USERLINK_NAME      OLESTR("RsLnk.exe")
#define WSB_FACILITY_CLI_NAME           OLESTR("RsCli.dll")
#define WSB_FACILITY_NTDLL_NAME         OLESTR("ntdll.dll")

// COM Interface & Library Defintions
#define WSB_COLLECTION_MIN_INDEX        0
#define WSB_COLLECTION_MAX_INDEX        0xfffffffe

#define WSB_MAX_SERVICE_NAME            255

// Guids used to store User and Password for scheduled tasks
// Username {DC2D7CF0-6298-11d1-9F17-00A02488FCDE}
static const GUID GUID_Username = 
{ 0xdc2d7cf0, 0x6298, 0x11d1, { 0x9f, 0x17, 0x0, 0xa0, 0x24, 0x88, 0xfc, 0xde } };
// Password {DC2D7CF1-6298-11d1-9F17-00A02488FCDE}
static const GUID GUID_Password = 
{ 0xdc2d7cf1, 0x6298, 0x11d1, { 0x9f, 0x17, 0x0, 0xa0, 0x24, 0x88, 0xfc, 0xde } };

// Strings used to register event log categories
#define WSB_SVC_BASE         OLESTR("SYSTEM\\CurrentControlSet\\Services")
#define WSB_LOG_BASE         OLESTR("SYSTEM\\CurrentControlSet\\Services\\EventLog")
#define WSB_LOG_APP          OLESTR("Application")
#define WSB_LOG_SYS          OLESTR("System")
#define WSB_LOG_CAT_COUNT    OLESTR("CategoryCount")
#define WSB_LOG_CAT_FILE     OLESTR("CategoryMessageFile")
#define WSB_LOG_MESSAGE_FILE OLESTR("EventMessageFile")
#define WSB_LOG_TYPES        OLESTR("TypesSupported")

#define WSB_LOG_SOURCE_NAME  OLESTR("Remote Storage")
#define WSB_LOG_FILTER_NAME  OLESTR("RsFilter")

#define WSB_LOG_SVC_CATCOUNT 11
#define WSB_LOG_SVC_CATFILE  OLESTR("%SystemRoot%\\System32\\RsCommon.Dll")
#define WSB_LOG_SVC_MSGFILES OLESTR("%SystemRoot%\\System32\\RsCommon.Dll")

//
// Common Functions

// File/Directory
extern WSB_EXPORT HRESULT WsbCreateAllDirectories(OLECHAR* path);
extern WSB_EXPORT HRESULT WsbCreateAllDirectoriesForFile(OLECHAR* path);
extern WSB_EXPORT HRESULT WsbGetWin32PathAsBstr(OLECHAR* path, BSTR* pWin32Path);
extern WSB_EXPORT HRESULT WsbGetPathFromWin32AsBstr(OLECHAR* win32Path, BSTR* pPath);

inline char WsbSign( INT Val ) {
    return( Val > 0 ? (char)1 : ( ( Val < 0 ) ? (char)-1 : (char)0 ) );
}

// String & Buffer Copy
extern "C" {
    extern WSB_EXPORT HRESULT   WsbAllocAndCopyComString(OLECHAR** dest, OLECHAR* src, ULONG bufferSize);
    extern WSB_EXPORT HRESULT   WsbAllocAndCopyComString2(OLECHAR** dest, OLECHAR* src, ULONG bufferSize, BOOL inOrder);
    extern WSB_EXPORT HRESULT   WsbGetComBuffer(OLECHAR** dest, ULONG requestedSize, ULONG neededSize, BOOL* pWasAllocated);
    extern WSB_EXPORT HRESULT   WsbLoadComString(HINSTANCE hInstance, UINT uId, LPOLESTR* pszDest, ULONG ulBufferSize);
    extern WSB_EXPORT HRESULT   WsbMatchComString(OLECHAR* end, UINT uId, USHORT checks, UINT* idMatch);
}



// Filetime Manipulations

// NOTE: TICKS_PER_MONTH and TICKS_PER_YEAR are just approximations.
#define WSB_FT_TYPES_MAX            7
#define WSB_FT_TICKS_PER_SECOND     ((LONGLONG) 10000000)
#define WSB_FT_TICKS_PER_MINUTE     ((LONGLONG) ((LONGLONG) 60  * WSB_FT_TICKS_PER_SECOND))
#define WSB_FT_TICKS_PER_HOUR       ((LONGLONG) ((LONGLONG) 60  * WSB_FT_TICKS_PER_MINUTE))
#define WSB_FT_TICKS_PER_DAY        ((LONGLONG) ((LONGLONG) 24  * WSB_FT_TICKS_PER_HOUR))
#define WSB_FT_TICKS_PER_WEEK       ((LONGLONG) ((LONGLONG) 7   * WSB_FT_TICKS_PER_DAY))
#define WSB_FT_TICKS_PER_MONTH      ((LONGLONG) ((LONGLONG) 31  * WSB_FT_TICKS_PER_DAY))
#define WSB_FT_TICKS_PER_YEAR       ((LONGLONG) ((LONGLONG) 365 * WSB_FT_TICKS_PER_DAY))

extern "C" {
    extern WSB_EXPORT FILETIME  WsbFtSubFt(FILETIME ft1, FILETIME ft2);
    extern WSB_EXPORT SHORT     WsbCompareFileTimes(FILETIME ft1, FILETIME ft2, BOOL isRelative, BOOL isNewer);
}

// File name manipulations
extern WSB_EXPORT HRESULT SquashFilepath(WCHAR* pPath, UCHAR* pKey, ULONG keySize);

// Guid Manipulations

// Constant that can be used to determine necessary buffer size in doing
// GUID string operations. This includes the terminating L'\0'.

#define WSB_GUID_STRING_SIZE \
    (sizeof(L"{00000000-0000-0000-0000-000000000000}")/sizeof(wchar_t))

extern "C" {
    extern WSB_EXPORT int       WsbCompareGuid(REFGUID guid1, REFGUID guid2);
    extern WSB_EXPORT HRESULT   WsbStringFromGuid(REFGUID rguid, OLECHAR* sz);
    extern WSB_EXPORT HRESULT   WsbGuidFromString(const OLECHAR*, GUID * pguid);
}


// Type Conversion
#define WSB_FT_TO_WCS_ABS_STRLEN        20
#define WSB_VDATE_TO_WCS_ABS_STRLEN     20

extern "C" {
    extern WSB_EXPORT HRESULT   WsbWCStoFT(OLECHAR* wcs, BOOL* pIsRelative, FILETIME* pTime);
    extern WSB_EXPORT HRESULT   WsbWCStoLL(OLECHAR* wcs, LONGLONG* pvalue);
    extern WSB_EXPORT LONGLONG  WsbFTtoLL(FILETIME time);
    extern WSB_EXPORT FILETIME  WsbLLtoFT(LONGLONG value);
    extern WSB_EXPORT HRESULT   WsbFTtoWCS(BOOL isRelative, FILETIME time, OLECHAR** wcs, ULONG bufferSize);
    extern WSB_EXPORT HRESULT   WsbLLtoWCS(LONGLONG value, OLECHAR** wcs, ULONG ulBufferSize);
    extern WSB_EXPORT LONGLONG  WsbHLtoLL(LONG high, LONG low);
    extern WSB_EXPORT void      WsbLLtoHL(LONGLONG ll, LONG* pHigh, LONG* pLow);
    extern WSB_EXPORT HRESULT   WsbDatetoFT(DATE date, LONG ticks, FILETIME* pFt);
    extern WSB_EXPORT HRESULT   WsbFTtoDate(FILETIME ft, DATE* pDate, LONG* pTicks);
    extern WSB_EXPORT HRESULT   WsbLocalDateTicktoUTCFT(DATE date, LONG ticks, FILETIME* pFT);
    extern WSB_EXPORT HRESULT   WsbUTCFTtoLocalDateTick(FILETIME ft, DATE* pDate, LONG* pTicks);
    extern WSB_EXPORT HRESULT   WsbDateToString(DATE date, OLECHAR** string);
    extern WSB_EXPORT HRESULT   WsbStringToDate(OLECHAR* string, DATE* date);
}

// Account Helper functions
extern "C" {

extern WSB_EXPORT 
HRESULT
WsbGetAccountDomainName(
    OLECHAR * szDomainName,
    DWORD     cSize
    );

extern WSB_EXPORT
HRESULT
WsbGetServiceInfo(
    IN  GUID            guidApp,
    OUT OLECHAR **      pszServiceName, OPTIONAL
    OUT OLECHAR **      pszAccountName  OPTIONAL
    );

extern WSB_EXPORT
HRESULT
WsbGetServiceTraceDefaults(
    IN  OLECHAR* serviceName,
    IN  OLECHAR* traceName,
    IN  IUnknown* pUnk
    );

extern WSB_EXPORT
HRESULT
WsbGetMetaDataPath(
    OUT CWsbStringPtr & Path
    );


extern WSB_EXPORT
HRESULT
WsbGetComputerName(
    OUT CWsbStringPtr & String
    );

extern WSB_EXPORT
HRESULT
WsbGetLocalSystemName(
    OUT CWsbStringPtr & String
    );

}


// WsbSvc.h

extern WSB_EXPORT
HRESULT
WsbCheckService(
    IN  const OLECHAR * computer,
    IN  GUID            guidApp
    );

extern WSB_EXPORT
HRESULT
WsbGetServiceName(
    IN  const OLECHAR   *computer,
    IN  GUID            guidApp,
    IN  DWORD           cSize,
    OUT OLECHAR         *serviceName
    );

extern WSB_EXPORT
HRESULT
WsbGetServiceStatus(
    IN  const OLECHAR   *computer,
    IN  GUID            guidApp,
    OUT DWORD           *serviceStatus
    );


extern WSB_EXPORT HRESULT
WsbRegisterEventLogSource(
    IN  const WCHAR * LogName,
    IN  const WCHAR * SourceName,
    IN  DWORD         CategoryCount,
    IN  const WCHAR * CategoryMsgFile OPTIONAL,
    IN  const WCHAR * MsgFiles
    );

extern WSB_EXPORT HRESULT
WsbUnregisterEventLogSource(
    IN  const WCHAR * LogName,
    IN  const WCHAR * SourceName
    );

extern WSB_EXPORT HRESULT
WsbUnregisterRsFilter (
    BOOL bDisplay
    );

extern WSB_EXPORT HRESULT
WsbRegisterRsFilter (
    BOOL bDisplay
    );


extern WSB_EXPORT
HRESULT 
WsbGetServiceId(
    OLECHAR* serviceName, 
    GUID* pGuid 
    );

extern WSB_EXPORT
HRESULT 
WsbCreateServiceId(
    OLECHAR* serviceName, 
    GUID* pGuid 
    );

extern WSB_EXPORT
HRESULT 
WsbConfirmServiceId(
    OLECHAR* serviceName, 
    GUID guidConfirm 
    );

extern WSB_EXPORT
HRESULT 
WsbSetServiceId(
    OLECHAR* serviceName, 
    GUID guid 
    );

extern WSB_EXPORT
HRESULT
WsbCheckAccess(
    WSB_ACCESS_TYPE AccessType
    );

extern WSB_EXPORT
HRESULT
WsbCheckUsnJournalForChanges(
    OLECHAR*        volName,
    LONGLONG        FileId,
    LONGLONG        StartUsn,
    LONGLONG        StopUsn,
    BOOL*           pChanged
    );  


extern WSB_EXPORT
HRESULT 
WsbMarkUsnSource(
    HANDLE          changeHandle,
    OLECHAR*        volName
    );

extern WSB_EXPORT
HRESULT 
WsbGetUsnFromFileHandle(
    HANDLE          hFile,
    BOOL            ForceClose,
    LONGLONG*       pFileUsn
    );

extern WSB_EXPORT
HRESULT
WsbCreateUsnJournal(
    OLECHAR*        volName,
    ULONGLONG       usnSize
    );  

extern WSB_EXPORT
HRESULT
WsbGetResourceString(
    ULONG           id,
    WCHAR           **ppString
    );

extern WSB_EXPORT
HRESULT
WsbGetUsnJournalId(
    OLECHAR*        volName,
    ULONGLONG*      usnId
    );

class WSB_EXPORT CWsbSecurityDescriptor : public CSecurityDescriptor
{
public:
    HRESULT AllowRid( DWORD Rid, DWORD dwAccessMask );
};


#endif // _WSBGEN_H