/**
 * FreeRDP: A Remote Desktop Protocol Implementation
 * .rdp file
 *
 * Copyright 2012 Marc-Andre Moreau <marcandre.moreau@gmail.com>
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

#ifndef FREERDP_CLIENT_RDP_FILE_H
#define FREERDP_CLIENT_RDP_FILE_H

#include <freerdp/api.h>
#include <freerdp/freerdp.h>

#define RDP_FILE_LINE_FLAG_FORMATTED		0x00000001
#define RDP_FILE_LINE_FLAG_STANDARD		0x00000002
#define RDP_FILE_LINE_FLAG_TYPE_STRING		0x00000010
#define RDP_FILE_LINE_FLAG_TYPE_INTEGER		0x00000020
#define RDP_FILE_LINE_FLAG_TYPE_BINARY		0x00000040

struct rdp_file_line
{
	int index;
	char* text;
	DWORD flags;
	char* name;
	LPSTR sValue;
	DWORD iValue;
	PBYTE bValue;
	int valueLength;
};
typedef struct rdp_file_line rdpFileLine;

struct rdp_file
{
	DWORD UseMultiMon; /* use multimon */
	DWORD ScreenModeId; /* screen mode id */
	DWORD SpanMonitors; /* span monitors */
	DWORD SmartSizing; /* smartsizing */
	DWORD EnableSuperSpan; /* enablesuperpan */
	DWORD SuperSpanAccelerationFactor; /* superpanaccelerationfactor */

	DWORD DesktopWidth; /* desktopwidth */
	DWORD DesktopHeight; /* desktopheight */
	DWORD DesktopSizeId; /* desktop size id */
	DWORD SessionBpp; /* session bpp */

	DWORD Compression; /* compression */
	DWORD KeyboardHook; /* keyboardhook */
	DWORD DisableCtrlAltDel; /* disable ctrl+alt+del */

	DWORD AudioMode; /* audiomode */
	DWORD AudioQualityMode; /* audioqualitymode */
	DWORD AudioCaptureMode; /* audiocapturemode */
	DWORD VideoPlaybackMode; /* videoplaybackmode */

	DWORD ConnectionType; /* connection type */

	DWORD NetworkAutoDetect; /* networkautodetect */
	DWORD BandwidthAutoDetect; /* bandwidthautodetect */

	DWORD PinConnectionBar; /* pinconnectionbar */
	DWORD DisplayConnectionBar; /* displayconnectionbar */

	DWORD WorkspaceId; /* workspaceid */
	DWORD EnableWorkspaceReconnect; /* enableworkspacereconnect */

	DWORD DisableWallpaper; /* disable wallpaper */
	DWORD AllowFontSmoothing; /* allow font smoothing */
	DWORD AllowDesktopComposition; /* allow desktop composition */
	DWORD DisableFullWindowDrag; /* disable full window drag */
	DWORD DisableMenuAnims; /* disable menu anims */
	DWORD DisableThemes; /* disable themes */
	DWORD DisableCursorSetting; /* disable cursor setting */

	DWORD BitmapCacheSize; /* bitmapcachesize */
	DWORD BitmapCachePersistEnable; /* bitmapcachepersistenable */

	LPSTR Username; /* username */
	LPSTR Domain; /* domain */
	LPSTR Password; /*password*/
	PBYTE Password51; /* password 51 */

	LPSTR FullAddress; /* full address */
	LPSTR AlternateFullAddress; /* alternate full address */
	DWORD ServerPort; /* server port */

	DWORD RedirectDrives; /* redirectdrives */
	DWORD RedirectPrinters; /* redirectprinters */
	DWORD RedirectComPorts; /* redirectcomports */
	DWORD RedirectSmartCards; /* redirectsmartcards */
	DWORD RedirectClipboard; /* redirectclipboard */
	DWORD RedirectPosDevices; /* redirectposdevices */
	DWORD RedirectDirectX; /* redirectdirectx */
	DWORD DisablePrinterRedirection; /* disableprinterredirection */
	DWORD DisableClipboardRedirection; /* disableclipboardredirection */
	LPSTR UsbDevicesToRedirect; /* usbdevicestoredirect */

	DWORD ConnectToConsole; /* connect to console */
	DWORD AdministrativeSession; /* administrative session */
	DWORD AutoReconnectionEnabled; /* autoreconnection enabled */
	DWORD AutoReconnectMaxRetries; /* autoreconnect max retries */

	DWORD PublicMode; /* public mode */
	DWORD AuthenticationLevel; /* authentication level */
	DWORD PromptCredentialOnce; /* promptcredentialonce */
	DWORD PromptForCredentials; /* prompt for credentials */
	DWORD PromptForCredentialsOnce; /* promptcredentialonce */
	DWORD NegotiateSecurityLayer; /* negotiate security layer */
	DWORD EnableCredSSPSupport; /* enablecredsspsupport */
	LPSTR LoadBalanceInfo; /* loadbalanceinfo */

	DWORD RemoteApplicationMode; /* remoteapplicationmode */
	LPSTR RemoteApplicationName; /* remoteapplicationname */
	LPSTR RemoteApplicationIcon; /* remoteapplicationicon */
	LPSTR RemoteApplicationProgram; /* remoteapplicationprogram */
	LPSTR RemoteApplicationFile; /* remoteapplicationfile */
	LPSTR RemoteApplicationGuid; /* remoteapplicationguid */
	LPSTR RemoteApplicationCmdLine; /* remoteapplicationcmdline */
	DWORD RemoteApplicationExpandCmdLine; /* remoteapplicationexpandcmdline */
	DWORD RemoteApplicationExpandWorkingDir; /* remoteapplicationexpandworkingdir */
	DWORD DisableConnectionSharing; /* disableconnectionsharing */
	DWORD DisableRemoteAppCapsCheck; /* disableremoteappcapscheck */

	LPSTR AlternateShell; /* alternate shell */
	LPSTR ShellWorkingDirectory; /* shell working directory */

	LPSTR GatewayHostname; /* gatewayhostname */
	DWORD GatewayUsageMethod; /* gatewayusagemethod */
	DWORD GatewayProfileUsageMethod; /* gatewayprofileusagemethod */
	DWORD GatewayCredentialsSource; /* gatewaycredentialssource */
	LPSTR GatewayAccessToken; /* gatewayaccesstoken */

	DWORD UseRedirectionServerName; /* use redirection server name */

	DWORD RdgIsKdcProxy; /* rdgiskdcproxy */
	LPSTR KdcProxyName; /* kdcproxyname */

	LPSTR DrivesToRedirect; /* drivestoredirect */
	LPSTR DevicesToRedirect; /* devicestoredirect */
	LPSTR WinPosStr; /* winposstr */

	LPSTR PreconnectionBlob; /* pcb */

	int lineCount;
	int lineSize;
	rdpFileLine* lines;

	int argc;
	char** argv;
	int argSize;
};

typedef struct rdp_file rdpFile;

#ifdef __cplusplus
extern "C" {
#endif

FREERDP_API BOOL freerdp_client_parse_rdp_file(rdpFile* file, const char* name);
FREERDP_API BOOL freerdp_client_parse_rdp_file_buffer(rdpFile* file, const BYTE* buffer, size_t size);
FREERDP_API BOOL freerdp_client_populate_settings_from_rdp_file(rdpFile* file, rdpSettings* settings);

FREERDP_API BOOL freerdp_client_populate_rdp_file_from_settings(rdpFile* file, const rdpSettings* settings);
FREERDP_API BOOL freerdp_client_write_rdp_file(const rdpFile* file, const char* name, BOOL unicode);
FREERDP_API size_t freerdp_client_write_rdp_file_buffer(const rdpFile* file, char* buffer, size_t size);

FREERDP_API int freerdp_client_rdp_file_set_string_option(rdpFile* file, const char* name, const char* value);
FREERDP_API const char* freerdp_client_rdp_file_get_string_option(rdpFile* file, const char* name);

FREERDP_API int freerdp_client_rdp_file_set_integer_option(rdpFile* file, const char* name, int value);
FREERDP_API int freerdp_client_rdp_file_get_integer_option(rdpFile* file, const char* name);

FREERDP_API rdpFile* freerdp_client_rdp_file_new(void);
FREERDP_API void freerdp_client_rdp_file_free(rdpFile* file);

#ifdef __cplusplus
}
#endif

#endif /* FREERDP_CLIENT_RDP_FILE_H */
