Windows2003-3790/termsrv/newclient/clshell/rdpfstore.h
2020-09-30 16:53:55 +02:00

182 lines
4.7 KiB
C++

//
// rdpfstore.h
//
// Definition of CRdpFileStore, implements ISettingsStore
//
// CRdpFileStore implements a persistent settings store for
// ts client settings.
//
// Copyright(C) Microsoft Corporation 2000
// Author: Nadim Abdo (nadima)
//
#ifndef _rdpfstore_h_
#define _rdpfstore_h_
#include "setstore.h"
#include "fstream.h"
//
// rdpfile record
//
typedef UINT RDPF_RECTYPE;
#define RDPF_RECTYPE_UINT 0
#define RDPF_RECTYPE_SZ 1
#define RDPF_RECTYPE_BINARY 2
#define RDPF_RECTYPE_UNPARSED 3
#define RDPF_NAME_LEN 32
#define IS_VALID_RDPF_TYPECODE(x) \
(x == RDPF_RECTYPE_UINT || \
x == RDPF_RECTYPE_SZ || \
x == RDPF_RECTYPE_BINARY || \
x == RDPF_RECTYPE_UNPARSED)
typedef struct tagRDPF_RECORD
{
tagRDPF_RECORD* pNext;
tagRDPF_RECORD* pPrev;
TCHAR szName[RDPF_NAME_LEN];
//
// works like a variant
//
RDPF_RECTYPE recType;
union {
UINT iVal; // RDPF_RECTYPE_UINT
LPTSTR szVal; // RDPF_RECTYPE_SZ
PBYTE pBinVal; // RDPF_RECTYPE_BINARY
LPTSTR szUnparsed; // RDPF_RECTYPE_UNPARSED
} u;
//length of RDPF_RECTYPE_BINARY
DWORD dwBinValLen;
DWORD flags;
} RDPF_RECORD, *PRDPF_RECORD;
class CRdpFileStore : public ISettingsStore
{
public:
CRdpFileStore();
virtual ~CRdpFileStore();
//
// IUnknown methods
//
STDMETHOD(QueryInterface)
( THIS_
IN REFIID,
OUT PVOID *
);
STDMETHOD_(ULONG,AddRef)
( THIS
);
STDMETHOD_(ULONG,Release)
( THIS
);
//
// ISettingsStore methods
//
//
// Open a store..Moniker is store specific info that points to the store
//
virtual BOOL OpenStore(LPCTSTR szStoreMoniker, BOOL bReadOnly=FALSE);
//
// Commit the current in-memory contents of the store
//
virtual BOOL CommitStore();
//
// Close the store
//
virtual BOOL CloseStore();
//
// State access functions
//
virtual BOOL IsOpenForRead();
virtual BOOL IsOpenForWrite();
virtual BOOL IsDirty();
virtual BOOL SetDirtyFlag(BOOL bIsDirty);
//
// Typed read and write functions, writes are not commited until a ComitStore()
// Values equal to the default are not persisted out
// On read error (e.g if Name key is not found, the specified default value is returned)
//
virtual BOOL ReadString(LPCTSTR szName, LPTSTR szDefault, LPTSTR szOutBuf, UINT strLen);
virtual BOOL WriteString(LPCTSTR szName, LPTSTR szDefault, LPTSTR szValue,
BOOL fIgnoreDefault=FALSE);
virtual BOOL ReadBinary(LPCTSTR szName, PBYTE pOutuf, UINT cbBufLen);
virtual BOOL WriteBinary(LPCTSTR szName,PBYTE pBuf, UINT cbBufLen);
virtual BOOL ReadInt(LPCTSTR szName, UINT defaultVal, PUINT pval);
virtual BOOL WriteInt(LPCTSTR szName, UINT defaultVal, UINT val,
BOOL fIgnoreDefault=FALSE);
virtual BOOL ReadBool(LPCTSTR szName, UINT defaultVal, PBOOL pbVal);
virtual BOOL WriteBool(LPCTSTR szName, UINT defaultVal, BOOL bVal,
BOOL fIgnoreDefault=FALSE);
virtual BOOL DeleteValueIfPresent(LPCTSTR szName);
virtual BOOL IsValuePresent(LPTSTR szName);
//
// Initiliaze to an empty store that can be read from
//
virtual BOOL SetToNullStore();
virtual DWORD GetDataLength(LPCTSTR szName);
protected:
//
// Protected member functions
//
BOOL ParseFile();
BOOL DeleteRecords();
BOOL InsertRecordFromLine(LPTSTR szLine);
BOOL ParseLine(LPTSTR szLine, PUINT pTypeCode, LPTSTR szNameField, LPTSTR szValueField);
inline BOOL SetNodeValue(PRDPF_RECORD pNode, RDPF_RECTYPE TypeCode, LPCTSTR szValue);
BOOL RecordToString(PRDPF_RECORD pNode, LPTSTR szBuf, UINT strLen);
//
// Record list fns
//
BOOL InsertRecord(LPCTSTR szName, UINT TypeCode, LPCTSTR szValue);
BOOL InsertIntRecord(LPCTSTR szName, UINT value);
BOOL InsertBinaryRecord(LPCTSTR szName, PBYTE pBuf, DWORD dwLen);
inline PRDPF_RECORD FindRecord(LPCTSTR szName);
inline PRDPF_RECORD NewRecord(LPCTSTR szName, UINT TypeCode);
inline BOOL AppendRecord(PRDPF_RECORD node);
inline BOOL DeleteRecord(PRDPF_RECORD node);
private:
//
// Private data members
//
LONG _cRef;
BOOL _fReadOnly;
BOOL _fOpenForRead;
BOOL _fOpenForWrite;
BOOL _fIsDirty;
PRDPF_RECORD _pRecordListHead;
PRDPF_RECORD _pRecordListTail;
TCHAR _szFileName[MAX_PATH];
//file stream
CTscFileStream _fs;
};
#endif //_rdpfstore_h_