#ifndef _RAPI_H
#define _RAPI_H

/* Windows CE Remote API */

#include <windows.h>

#if __POCC__ >= 290
#pragma warn(push)
#pragma warn(disable:2198)  /* Nameless field is not standard */
#endif

#define FAF_ATTRIBUTES  ((DWORD)0x01)
#define FAF_CREATION_TIME  ((DWORD)0x02)
#define FAF_LASTACCESS_TIME  ((DWORD)0x04)
#define FAF_LASTWRITE_TIME  ((DWORD)0x08)
#define FAF_SIZE_HIGH  ((DWORD)0x10)
#define FAF_SIZE_LOW  ((DWORD)0x20)
#define FAF_OID  ((DWORD)0x40)
#define FAF_NAME  ((DWORD)0x80)
#define FAF_FLAG_COUNT  ((UINT)8)
#define FAF_ATTRIB_CHILDREN  ((DWORD)0x01000)
#define FAF_ATTRIB_NO_HIDDEN  ((DWORD)0x02000)
#define FAF_FOLDERS_ONLY  ((DWORD)0x04000)
#define FAF_NO_HIDDEN_SYS_ROMMODULES  ((DWORD)0x08000)
#define FAF_GETTARGET  ((DWORD)0x10000)

#define FAD_OID  ((WORD)0x01)
#define FAD_FLAGS  ((WORD)0x02)
#define FAD_NAME  ((WORD)0x04)
#define FAD_TYPE  ((WORD)0x08)
#define FAD_NUM_RECORDS  ((WORD)0x10)
#define FAD_NUM_SORT_ORDER  ((WORD)0x20)
#define FAD_SIZE  ((WORD)0x40)
#define FAD_LAST_MODIFIED  ((WORD)0x80)
#define FAD_SORT_SPECS  ((WORD)0x100)
#define FAD_FLAG_COUNT  ((UINT)9)

#ifndef FILE_ATTRIBUTE_INROM
#define FILE_ATTRIBUTE_INROM  0x00000040
#endif
#ifndef FILE_ATTRIBUTE_ROMSTATICREF
#define FILE_ATTRIBUTE_ROMSTATICREF  0x00001000
#endif
#ifndef FILE_ATTRIBUTE_ROMMODULE
#define FILE_ATTRIBUTE_ROMMODULE  0x00002000
#endif
#ifndef FILE_ATTRIBUTE_HAS_CHILDREN
#define FILE_ATTRIBUTE_HAS_CHILDREN  0x00010000
#endif
#ifndef FILE_ATTRIBUTE_SHORTCUT
#define FILE_ATTRIBUTE_SHORTCUT  0x00020000
#endif

typedef struct _CE_FIND_DATA {
    DWORD dwFileAttributes;
    FILETIME ftCreationTime;
    FILETIME ftLastAccessTime;
    FILETIME ftLastWriteTime;
    DWORD nFileSizeHigh;
    DWORD nFileSizeLow;
    DWORD dwOID;
    WCHAR cFileName[MAX_PATH];
} CE_FIND_DATA, *LPCE_FIND_DATA, **LPLPCE_FIND_DATA;

typedef enum tagRAPISTREAMFLAG {
    STREAM_TIMEOUT_READ
} RAPISTREAMFLAG;

#undef INTERFACE
#define INTERFACE IRAPIStream
DECLARE_INTERFACE_ (IRAPIStream,IStream)
{
    STDMETHOD(SetRapiStat)(THIS_ RAPISTREAMFLAG,DWORD) PURE;
    STDMETHOD(GetRapiStat)(THIS_ RAPISTREAMFLAG,DWORD*) PURE;
};

typedef HRESULT (STDAPICALLTYPE RAPIEXT)(DWORD,BYTE*,DWORD*,BYTE**,IRAPIStream*);

#ifndef _WINCE

#include <stddef.h>

typedef struct STORE_INFORMATION {
    DWORD dwStoreSize;
    DWORD dwFreeSize;
} STORE_INFORMATION, *LPSTORE_INFORMATION;

typedef DWORD CEPROPID;
typedef CEPROPID *PCEPROPID;

#define TypeFromPropID(propid)  LOWORD(propid)

#define CEDB_EXNOTIFICATION  0x00000001

#define CEDB_SORT_DESCENDING  0x00000001
#define CEDB_SORT_CASEINSENSITIVE  0x00000002
#define CEDB_SORT_UNKNOWNFIRST  0x00000004
#define CEDB_SORT_GENERICORDER  0x00000008

#define CEDB_MAXDBASENAMELEN  32
#define CEDB_MAXSORTORDER  4

#define CEDB_VALIDNAME  0x0001
#define CEDB_VALIDTYPE  0x0002
#define CEDB_VALIDSORTSPEC  0x0004
#define CEDB_VALIDMODTIME  0x0008
#define CEDB_VALIDDBFLAGS  0x0010
#define CEDB_VALIDCREATE  (CEDB_VALIDNAME|CEDB_VALIDTYPE|CEDB_VALIDSORTSPEC|CEDB_VALIDDBFLAGS)

#define CEDB_NOCOMPRESS  0x00010000

#define OBJTYPE_INVALID  0
#define OBJTYPE_FILE  1
#define OBJTYPE_DIRECTORY  2
#define OBJTYPE_DATABASE  3
#define OBJTYPE_RECORD  4

#define CEDB_AUTOINCREMENT  0x00000001

#define CEDB_SEEK_CEOID  0x00000001
#define CEDB_SEEK_BEGINNING  0x00000002
#define CEDB_SEEK_END  0x00000004
#define CEDB_SEEK_CURRENT  0x00000008
#define CEDB_SEEK_VALUESMALLER  0x00000010
#define CEDB_SEEK_VALUEFIRSTEQUAL  0x00000020
#define CEDB_SEEK_VALUEGREATER  0x00000040
#define CEDB_SEEK_VALUENEXTEQUAL  0x00000080

#define CEVT_I2  2
#define CEVT_UI2  18
#define CEVT_I4  3
#define CEVT_UI4  19
#define CEVT_FILETIME  64
#define CEVT_LPWSTR  31
#define CEVT_BLOB  65
#define CEVT_BOOL  11
#define CEVT_R8  5

#define CEDB_PROPNOTFOUND  0x0100
#define CEDB_PROPDELETE  0x0200

#define CEDB_MAXDATABLOCKSIZE  4092
#define CEDB_MAXPROPDATASIZE  (CEDB_MAXDATABLOCKSIZE*16)
#define CEDB_MAXRECORDSIZE  (128*1024)

#define CEDB_ALLOWREALLOC  0x00000001

#define CREATE_SYSTEMGUID(pguid)  (memset((pguid),0,sizeof(CEGUID)))
#define CREATE_INVALIDGUID(pguid)  (memset((pguid),-1,sizeof(CEGUID)))

#define CHECK_SYSTEMGUID(pguid)  !((pguid)->Data1|(pguid)->Data2|(pguid)->Data3|(pguid)->Data4)
#define CHECK_INVALIDGUID(pguid)  !~((pguid)->Data1&(pguid)->Data2&(pguid)->Data3&(pguid)->Data4)

#define SYSMEM_CHANGED  0
#define SYSMEM_MUSTREBOOT  1
#define SYSMEM_REBOOTPENDING  2
#define SYSMEM_FAILED  3

#define AC_LINE_OFFLINE  0x00
#define AC_LINE_ONLINE  0x01
#define AC_LINE_BACKUP_POWER  0x02
#define AC_LINE_UNKNOWN  0xFF

#define BATTERY_FLAG_HIGH  0x01
#define BATTERY_FLAG_LOW  0x02
#define BATTERY_FLAG_CRITICAL  0x04
#define BATTERY_FLAG_CHARGING  0x08
#define BATTERY_FLAG_NO_BATTERY  0x80
#define BATTERY_FLAG_UNKNOWN  0xFF

#define BATTERY_PERCENTAGE_UNKNOWN  0xFF

#define BATTERY_LIFE_UNKNOWN  0xFFFFFFFF

#define CERAPI_E_ALREADYINITIALIZED  0x80041001

typedef DWORD CEOID;
typedef CEOID *PCEOID;

typedef struct  _CEGUID {
    DWORD Data1;
    DWORD Data2;
    DWORD Data3;
    DWORD Data4;
} CEGUID, *PCEGUID;

typedef struct _CENOTIFICATION {
    DWORD dwSize;
    DWORD dwParam;
    UINT uType;
    CEGUID guid;
    CEOID oid;
    CEOID oidParent;
} CENOTIFICATION;

typedef struct _CENOTIFYREQUEST {
    DWORD dwSize;
    HWND hwnd;
    DWORD dwFlags;
    HANDLE hHeap;
    DWORD dwParam;
} CENOTIFYREQUEST, *PCENOTIFYREQUEST;

typedef struct _CEFILEINFO {
    DWORD dwAttributes;
    CEOID oidParent;
    WCHAR szFileName[MAX_PATH];
    FILETIME ftLastChanged;
    DWORD dwLength;
} CEFILEINFO;

typedef struct _CEDIRINFO {
    DWORD dwAttributes;
    CEOID oidParent;
    WCHAR szDirName[MAX_PATH];
} CEDIRINFO;

typedef struct _CERECORDINFO {
    CEOID oidParent;
} CERECORDINFO;

typedef struct _SORTORDERSPEC {
    CEPROPID propid;
    DWORD dwFlags;
} SORTORDERSPEC;

typedef struct _CEDBASEINFO {
    DWORD dwFlags;
    WCHAR szDbaseName[CEDB_MAXDBASENAMELEN];
    DWORD dwDbaseType;
    WORD wNumRecords;
    WORD wNumSortOrder;
    DWORD dwSize;
    FILETIME ftLastModified;
    SORTORDERSPEC rgSortSpecs[CEDB_MAXSORTORDER];
} CEDBASEINFO;

typedef struct _CEDB_FIND_DATA {
    CEOID OidDb;
    CEDBASEINFO DbInfo;
} CEDB_FIND_DATA, *LPCEDB_FIND_DATA, **LPLPCEDB_FIND_DATA;

typedef struct _CEOIDINFO {
    WORD wObjType;
    WORD wPad;
    union {
        CEFILEINFO infFile;
        CEDIRINFO infDirectory;
        CEDBASEINFO infDatabase;
        CERECORDINFO infRecord;
    };
} CEOIDINFO;

typedef struct _CEBLOB {
    DWORD dwCount;
    LPBYTE lpb;
} CEBLOB;

typedef union _CEVALUNION {
    short iVal;
    USHORT uiVal;
    long lVal;
    ULONG ulVal;
    FILETIME filetime;
    LPWSTR lpwstr;
    CEBLOB blob;
    BOOL boolVal;
    double  dblVal;
} CEVALUNION;

typedef struct _CEPROPVAL {
    CEPROPID propid;
    WORD wLenData;
    WORD wFlags;
    CEVALUNION val;
} CEPROPVAL, *PCEPROPVAL;

typedef struct _CEOSVERSIONINFO{
    DWORD dwOSVersionInfoSize;
    DWORD dwMajorVersion;
    DWORD dwMinorVersion;
    DWORD dwBuildNumber;
    DWORD dwPlatformId;
    WCHAR szCSDVersion[128];
} CEOSVERSIONINFO, *LPCEOSVERSIONINFO;

typedef struct _SYSTEM_POWER_STATUS_EX {
    BYTE ACLineStatus;
    BYTE BatteryFlag;
    BYTE BatteryLifePercent;
    BYTE Reserved1;
    DWORD BatteryLifeTime;
    DWORD BatteryFullLifeTime;
    BYTE Reserved2;
    BYTE BackupBatteryFlag;
    BYTE BackupBatteryLifePercent;
    BYTE Reserved3;
    DWORD BackupBatteryLifeTime;
    DWORD BackupBatteryFullLifeTime;
}   SYSTEM_POWER_STATUS_EX, *PSYSTEM_POWER_STATUS_EX, *LPSYSTEM_POWER_STATUS_EX;

typedef struct _RAPIINIT {
    DWORD cbSize;
    HANDLE heRapiInit;
    HRESULT hrRapiInit;
} RAPIINIT;

STDAPI CeRapiInitEx(RAPIINIT*);
STDAPI CeRapiInit(void);
STDAPI CeRapiUninit(void);
STDAPI CeRapiGetError(void);
STDAPI CeRapiFreeBuffer(LPVOID);
STDAPI_(HRESULT) CeRapiInvoke(LPCWSTR,LPCWSTR,DWORD,BYTE*,DWORD*,BYTE**,IRAPIStream**,DWORD);
STDAPI_(CEOID) CeCreateDatabase(LPWSTR,DWORD,WORD,SORTORDERSPEC*);
STDAPI_(BOOL) CeDeleteDatabase(CEOID);
STDAPI_(BOOL) CeDeleteRecord(HANDLE,CEOID);
STDAPI_(HANDLE) CeFindFirstDatabase(DWORD);
STDAPI_(CEOID) CeFindNextDatabase(HANDLE);
STDAPI_(BOOL) CeOidGetInfo(CEOID,CEOIDINFO*);
STDAPI_(HANDLE) CeOpenDatabase(PCEOID,LPWSTR,CEPROPID,DWORD,HWND);
STDAPI_(CEOID) CeReadRecordProps(HANDLE,DWORD,LPWORD,CEPROPID*,LPBYTE*,LPDWORD);
STDAPI_(CEOID) CeSeekDatabase(HANDLE,DWORD,DWORD,LPDWORD);
STDAPI_(BOOL) CeSetDatabaseInfo(CEOID,CEDBASEINFO*);
STDAPI_(CEOID) CeWriteRecordProps(HANDLE,CEOID,WORD,CEPROPVAL*);
STDAPI_(HANDLE) CeFindFirstFile(LPCWSTR,LPCE_FIND_DATA);
STDAPI_(BOOL) CeFindNextFile(HANDLE,LPCE_FIND_DATA);
STDAPI_(BOOL) CeFindClose(HANDLE);
STDAPI_(DWORD) CeGetFileAttributes(LPCWSTR);
STDAPI_(BOOL) CeSetFileAttributes(LPCWSTR,DWORD);
STDAPI_(HANDLE) CeCreateFile(LPCWSTR,DWORD,DWORD,LPSECURITY_ATTRIBUTES,DWORD,DWORD,HANDLE);
STDAPI_(BOOL) CeReadFile(HANDLE,LPVOID,DWORD,LPDWORD,LPOVERLAPPED);
STDAPI_(BOOL) CeWriteFile(HANDLE,LPCVOID,DWORD,LPDWORD,LPOVERLAPPED);
STDAPI_(BOOL) CeCloseHandle(HANDLE);
STDAPI_(BOOL) CeFindAllFiles(LPCWSTR,DWORD,LPDWORD,LPLPCE_FIND_DATA);
STDAPI_(BOOL) CeFindAllDatabases(DWORD,WORD,LPWORD,LPLPCEDB_FIND_DATA);
STDAPI_(DWORD) CeGetLastError(void);
STDAPI_(DWORD) CeSetFilePointer(HANDLE,LONG,PLONG,DWORD);
STDAPI_(BOOL) CeSetEndOfFile(HANDLE);
STDAPI_(BOOL) CeCreateDirectory(LPCWSTR,LPSECURITY_ATTRIBUTES);
STDAPI_(BOOL) CeRemoveDirectory(LPCWSTR);
STDAPI_(BOOL) CeCreateProcess(LPCWSTR,LPCWSTR,LPSECURITY_ATTRIBUTES,LPSECURITY_ATTRIBUTES,BOOL,DWORD,LPVOID,LPWSTR,LPSTARTUPINFO,LPPROCESS_INFORMATION);
STDAPI_(BOOL) CeMoveFile(LPCWSTR,LPCWSTR);
STDAPI_(BOOL) CeCopyFile(LPCWSTR,LPCWSTR,BOOL);
STDAPI_(BOOL) CeDeleteFile(LPCWSTR);
STDAPI_(DWORD) CeGetFileSize(HANDLE,LPDWORD);
STDAPI_(LONG) CeRegOpenKeyEx(HKEY,LPCWSTR,DWORD,REGSAM,PHKEY);
STDAPI_(LONG) CeRegEnumKeyEx(HKEY,DWORD,LPWSTR,LPDWORD,LPDWORD,LPWSTR,LPDWORD,PFILETIME);
STDAPI_(LONG) CeRegCreateKeyEx(HKEY,LPCWSTR,DWORD,LPWSTR,DWORD,REGSAM,LPSECURITY_ATTRIBUTES,PHKEY,LPDWORD);
STDAPI_(LONG) CeRegCloseKey(HKEY);
STDAPI_(LONG) CeRegDeleteKey(HKEY,LPCWSTR);
STDAPI_(LONG) CeRegEnumValue(HKEY,DWORD,LPWSTR,LPDWORD,LPDWORD,LPDWORD,LPBYTE,LPDWORD);
STDAPI_(LONG) CeRegDeleteValue(HKEY,LPCWSTR);
STDAPI_(LONG) CeRegQueryInfoKey(HKEY,LPWSTR,LPDWORD,LPDWORD,LPDWORD,LPDWORD,LPDWORD,LPDWORD,LPDWORD,LPDWORD,LPDWORD,PFILETIME);
STDAPI_(LONG) CeRegQueryValueEx(HKEY,LPCWSTR,LPDWORD,LPDWORD,LPBYTE,LPDWORD);
STDAPI_(LONG) CeRegSetValueEx(HKEY,LPCWSTR,DWORD,DWORD,LPBYTE,DWORD);
STDAPI_(BOOL) CeGetStoreInformation(LPSTORE_INFORMATION);
STDAPI_(INT) CeGetSystemMetrics(INT);
STDAPI_(INT) CeGetDesktopDeviceCaps(INT);
STDAPI_(VOID) CeGetSystemInfo(LPSYSTEM_INFO);
STDAPI_(DWORD) CeSHCreateShortcut(LPWSTR,LPWSTR);
STDAPI_(BOOL) CeSHGetShortcutTarget(LPWSTR,LPWSTR,INT);
STDAPI_(BOOL) CeCheckPassword(LPWSTR);
STDAPI_(BOOL) CeGetFileTime(HANDLE,LPFILETIME,LPFILETIME,LPFILETIME);
STDAPI_(BOOL) CeSetFileTime(HANDLE,LPFILETIME,LPFILETIME,LPFILETIME);
STDAPI_(BOOL) CeGetVersionEx(LPCEOSVERSIONINFO);
STDAPI_(HWND) CeGetWindow(HWND,UINT);
STDAPI_(LONG) CeGetWindowLong(HWND,int);
STDAPI_(int) CeGetWindowText(HWND,LPWSTR,int);
STDAPI_(int) CeGetClassName(HWND,LPWSTR,int);
STDAPI_(VOID) CeGlobalMemoryStatus(LPMEMORYSTATUS);
STDAPI_(BOOL) CeGetSystemPowerStatusEx(PSYSTEM_POWER_STATUS_EX,BOOL);
STDAPI_(DWORD) CeGetTempPath(DWORD,LPWSTR);
STDAPI_(DWORD) CeGetSpecialFolderPath(int,DWORD,LPWSTR);
STDAPI_(HANDLE) CeFindFirstDatabaseEx(PCEGUID,DWORD);
STDAPI_(CEOID) CeFindNextDatabaseEx(HANDLE,PCEGUID);
STDAPI_(CEOID) CeCreateDatabaseEx(PCEGUID,CEDBASEINFO*);
STDAPI_(BOOL) CeSetDatabaseInfoEx(PCEGUID,CEOID,CEDBASEINFO*);
STDAPI_(HANDLE) CeOpenDatabaseEx(PCEGUID,PCEOID,LPWSTR,CEPROPID,DWORD,CENOTIFYREQUEST*);
STDAPI_(BOOL) CeDeleteDatabaseEx(PCEGUID,CEOID);
STDAPI_(CEOID) CeReadRecordPropsEx(HANDLE,DWORD,LPWORD,CEPROPID*,LPBYTE*,LPDWORD,HANDLE);
STDAPI_(CEOID) CeWriteRecordProps(HANDLE,CEOID,WORD,CEPROPVAL*);
STDAPI_(BOOL) CeMountDBVol(PCEGUID,LPWSTR,DWORD);
STDAPI_(BOOL) CeUnmountDBVol(PCEGUID);
STDAPI_(BOOL) CeFlushDBVol(PCEGUID);
STDAPI_(BOOL) CeEnumDBVolumes(PCEGUID,LPWSTR,DWORD);
STDAPI_(BOOL) CeOidGetInfoEx(PCEGUID,CEOID,CEOIDINFO*);

#endif /* _WINCE */

#if __POCC__ >= 290
#pragma warn(pop)
#endif

#endif /* _RAPI_H */
