/*****************************************************************\
            Author: Дещеревский И.
              Date: 
              
              File: MiddleWare.h
   Version of file: 0.10
           Progect: AplNetTransportServTCP
Version of project: 3.0
              
             Notes: Этот файл описывает структуры, используемые при 
		передаче данных, коды описания функций классов AplBaseOperation и
		интерфейса AplTransport и коды ошибок, возвращаемых сервером 
              
\******************************************************************/
#ifndef APL_NET_H
#define APL_NET_H

#include "aplAggr.h"

#define MAX_STR_LEN 4096

//Коды ошибок,  
enum AplNetErrors{
	APL_NET_OK					=  0,
	APL_NET_SRV_MISSED_CONFIG	=100,	//
	APL_NET_SRV_MISSED_DATA		=101,	//
	APL_NET_SRV_UNKNOWN_USER	=102,	//
	APL_NET_SRV_NOT_CONNECT		=103,	//
	APL_NET_SRV_USER_ALREADY_CONNECTED =104,
	APL_NET_SRV_USER_IS_ACTIVE	=105,
	APL_NET_SRV_ERROR_PROCESSED	=106,	//
	APL_NET_SRV_MISSED_NAME_BASE	=107,	//
	APL_NET_SRV_CORRUPTED_BASE  =108,
	APL_NET_SRV_UNKNOWN_ERROR	=109,	//
	APL_NET_SRV_SMALL_BUF		=110,	//
	APL_NET_SRV_BLOB_BUSY		=111,	//
	APL_NET_SRV_BLOB_NOT_FOUND	=112,
	APL_NET_SRV_BLOB_NOT_DEFINE	=113,
	APL_NET_SRV_NOT_UNIQUE	    =114,
	APL_NET_SRV_ORACLE_ERROR    =115,
	APL_NET_SRV_LIMIT_CONNECT_EXESS =116,
	APL_NET_SRV_BREAK =117,
	
	APL_NET_SRV_MISSED_PROTECTED_CODE		=118,
	APL_NET_SRV_ORACLE_NAVAIL    =119,
	APL_NET_SRV_MISSED_BASE_VERSION    =120,
//	APL_NET_SRV_AGGR_TOO_MUCH_LONG	=121, - устарело много лет назад
	APL_NET_SRV_STRING_TOO_MUCH_LONG	=122,
	APL_NET_SRV_TEMPORARY_BUF_CORRUPTED	=123,
	APL_NET_SRV_MISSED_ATTR_VAL_TYPE	=124,
	APL_NET_SRV_ACCESS_DENY		=125,
	APL_NET_SRV_SET_ACCESS_ERROR		=126,
	APL_NET_SRV_MISSED_BUF_FORMAT		=127,
	APL_NET_SRV_QUERY_PARSE_ERROR		=128,
	APL_NET_SRV_ILLEGAL_ATTR_TYPE		=129,
	APL_NET_SRV_MISSED_OBJECT			=130,
	APL_NET_SRV_CORRUPTED_ACLST			=131,
	APL_NET_SRV_USER_DISABLED			=132,	//
	APL_NET_SRV_CLIENT_NOT_FOUND		=133,	//
	APL_NET_SRV_USER_READ_ONLY			=134,	//
	
	APL_NET_SRV_SINGLE_CONNECT_DB	    =  135,
	APL_NET_SRV_SINGLE_CONNECT_LITE_D	=  136,
	APL_NET_SRV_SINGLE_CONNECT_LITE_SRV	=  137,
	APL_NET_SRV_FUNCTION_ONLY_DB	=  138,
	APL_NET_SRV_LOAD_DONT_EXECUTABLE	=  139,
	APL_NET_SRV_EXPIRE_SRC_LIC_D		=  140,
	

	//Коды ошибок параметра res
	APL_NET_BO_SRV_MISSED_DATA		=141,	//
	APL_NET_BO_SRV_NOT_CONNECT		=142,	//
	APL_NET_BO_SRV_ERROR_PROCESSED	=143,	//
	APL_NET_BO_SRV_SERVER_LOCKED	=144,	//
	APL_NET_BO_SRV_TOO_MANY_SERVER	=145,	//
	APL_NET_BO_ERROR_CREATE_BASE	=146,
	APL_NET_BO_BASE_LIST_EMPTY		=147,

	APL_NET_SRV_EXPIRE_SRC_LIC_SRV		=  148,
	APL_NET_SRV_EXPIRE_KEY_IN_SRV_LIC_EXCLUSIVE	=  149,

	APL_SOCK_MISSED_VERSION			=150,
	APL_SOCK_MISSED_COMMAND			=151,
	APL_SOCK_MISSED_FUNCTION		=152,
	APL_SOCK_MISSED_FUNCT_PARAM		=153,
	APL_SOCK_FUNCTION_OBSOLETTE		=154,

	APL_NET_SRV_EXPIRE_KEY_IN_SRV_LIC_BREAK	=  155,
	APL_NET_SRV_MISSED_LAST_ACTION	=  156,
	APL_NET_SRV_MISSED_CLIENTS_SQL	=  157,
	APL_NET_SRV_DICT_NOT_FOUND		=  158,
	APL_NET_SRV_DICT_NOT_INI		=  159,

	APL_SOCK_ERROR_PROCESSED		=160,
	APL_SOCK_CONNECT_FAULT			=161,
	APL_SOCK_OPERATION_IN_PROGRESS	=162,
	APL_NET_SRV_MISSED_VERSION_SRV_LIC	=  163,
	APL_NET_SRV_CORRUPTED_ORA_BD	=  164,
	APL_NET_SRV_USER_BD_DONT_ADMIN	=  165,
	APL_NET_SRV_IP_BLOCKED	=  166,
	
	APL_NET_SRV_APPROACH_EXPIRE_SRC_LIC_SRV		=  167,
	APL_NET_SRV_INCOMPATIBLE_ORA_CLIENT		=  168,

	APL_NET_SRV_OS_USER_NOT_ADMIN		=  169,
	APL_NET_SRV_MISSED_KEY_IN_SRV_LIC	=  170,
	APL_NET_SRV_INST_LOCKED		=  171,
	APL_NET_SRV_INCOMPATIBLE_ORA_SERVER	= 172,

	APL_NET_SRV_EMPTY_PWD_DENIED	=  173,
	APL_NET_SRV_AD_SERVER_NOT_DEFINED	=  174,
	APL_NET_SRV_UNKNOWN_AD_USER	=175,	//
	APL_NET_SRV_AD_USER_CREATE_ERROR	=176,	//
	APL_NET_SRV_MISSED_LOAD_QUERY = 177, // неверный запрос для LoadEx
	APL_NET_SRV_INCOMPATIBLE_PG_CLIENT = 178,
	APL_NET_SRV_INCOMPATIBLE_PG_SERVER = 179,
	APL_NET_SRV_POSTGRES_ERROR = 180, 
	APL_NET_SRV_POSTGRES_NAVAIL = 181, 
	APL_NET_SRV_CORRUPTED_PG_BD =  182,
	APL_NET_SRV_SAFETY_EVENT	=  183,
	APL_NET_SRV_ERROR_INTEGRITY_CONTROL	=  184,
	APL_NET_SRV_PARALLES_SESSION_EXCEEDED	=  185,
	APL_NET_SRV_SQL_DISABLES	=  186,
	APL_NET_SRV_ADMIN_MODE_DISABLES	=  187,
	APL_NET_SRV_KERBEROS_ERROR	=  188,
	APL_NET_SRV_UNKNOWN_KERBEROS_USER	=189,	//
	APL_NET_SRV_INTERNAL_AUTH_DENY	=  190,
	APL_NET_SRV_INTERNAL_AUTH_NET_DENY	=  191,
	APL_NET_SRV_EXTERNAL_AUTH_ERROR	=  192,
	APL_NET_SRV_NEED_TO_UPDATE_THE_CLIENT	=  193,
	APL_NET_SRV_HASH_METHOD_CHANGED			=194,	// используется в сервере Qt
	APL_NET_SRV_INTERNAL_ACCESS_MANAGEMENT_DENY	=  195,	// используется в сервере Qt
	APL_NET_SRV_EXTERNAL_ACCESS_MANAGEMENT_ERROR	=  196,	// используется в сервере Qt
	APL_NET_SRV_DICTIONARY_NEEDS_TO_BE_UPDATED = 197,
	APL_NET_SRV_SQL_TURNED_OFF	=  198,
	APL_NET_SRV_ADMIN_MODE_TURNED_OFF	=  199,
	// Номера с 200 по 250 зарезервированы. Старые клиенты получив такой код ошибки, могут показать некорректное сообщение

	APL_NET_SRV_FEATURE_IS_DISABLED = 251,

	////////////////////////////////////////////////////////
	// С номера 500 ошибки клиента
	//Коды ошибок, возвращаемых клиентом

	APL_NET_CLI_USER_APPLICATION_ERRORS	= 500,

	APL_NET_CLI_MISSED_DATA				= 501,
	APL_NET_CLI_MISSED_DATA_FROM_SERVER	= 502,
	APL_NET_CLI_NOT_CONNECT				= 503,
	APL_NET_CLI_ALREADY_CONNECT			= 504,
	APL_NET_CLI_ERROR_PROCESSED			= 505,
	APL_NET_CLI_FNF						= 506,
	APL_NET_CLI_FNCREATE				= 507,
	APL_NET_CLI_NET_ERROR				= 508,
	APL_NET_CLI_LIST_OF_BASE_EMPTY		= 509,
	APL_NET_CLI_MISSED_ATTR_TYPE		= 510,
	APL_NET_CLI_MISSED_CONNECTION_REC	= 511,
	APL_NET_CLI_QUERY_BUF_FULL			= 512,
	APL_NET_CLI_BREAK					= 513,
	APL_NET_CLI_ERROR_REESTR			= 514,
	APL_NET_CLI_FILE_BIG				= 515,
	APL_NET_CLI_LOCAL_SERV_NOT_FOUND	= 516,
	APL_NET_CLI_MISSED_CONNECT_PARAM_USERNAME	= 517,
	APL_NET_CLI_MISSED_CONNECT_PARAM_CONNECTION	= 518,
	APL_NET_CLI_MISSED_ENCODING			= 519,
	APL_NET_CLI_MISSED_DLG_IN_HIDE_MODE	= 520,
	APL_NET_CLI_EXTERNAL_AUTH_ERROR		= 521,
	APL_NET_CLI_KERBEROS_ERROR			= 522,
	APL_NET_CLI_ACCESS_DENY				= 523,
	APL_NET_CLI_SERVER_DN_SUPPORT_FUNCTION	= 524,
	APL_NET_CLI_DNS_ERROR				= 525,

	////////////////////////////////////////////////////////


	// ошибки CaplData - транслированные, чтобы клиент мог отличить от собственных
	//APLAPIERR_NOERROR 	 = 0
	//APLAPIERR_BADINPUTDATA 1
	APL_NET_SRV_APLAPIERR_NODATA 				=52,
	APL_NET_SRV_APLAPIERR_BADTYPE 				=53,
	APL_NET_SRV_APLAPIERR_FILE_IO 				=54,
	APL_NET_SRV_APLAPIERR_BADDICTIONARY 		=55,
	APL_NET_SRV_APLAPIERR_BADENT 				=56,
	APL_NET_SRV_APLAPIERR_BADATTR 				=57,
	APL_NET_SRV_APLAPIERR_BADDATA 				=58,
	APL_NET_SRV_APLAPIERR_ATTRNSET 				=59,
	APL_NET_SRV_APLAPIERR_BADFILENAME 			=60,
	APL_NET_SRV_APLAPIERR_BADINSTANCE 			=61,
	APL_NET_SRV_APLAPIERR_BADINSTANCETYPE 		=62,
	APL_NET_SRV_APLAPIERR_BADSCHEMANAME 		=63,
	APL_NET_SRV_APLAPIERR_NOACCESSRIGHT 		=64,
	APL_NET_SRV_APLAPIERR_BADDICTVERSION		=65,
	APL_NET_SRV_APLAPIERR_INVALIDDATAFORMAT		=66,
	APL_NET_SRV_APLAPIERR_INCOMPATIBLEDICT 		=67,
	APL_NET_SRV_APLAPIERR_FICTIVE_DATA 			=68,
	APL_NET_SRV_APLAPIERR_QUERY_ERROR 			=69,
	APL_NET_SRV_APLAPIERR_DICT_FILE_NOT_OPEN 	=70,
	APL_NET_SRV_APLAPIERR_BADDATA_INVALID_ENTINY_ID =71,
	APL_NET_SRV_APLAPIERR_BADDATA_INVALID_ATTR_ID 	=72,
	APL_NET_SRV_APLAPIERR_FILE_BD_NOT_FOUND		=73,
	APL_NET_SRV_APLAPIERR_FILE_BD_READ_ONLY		=74,
	APL_NET_SRV_APLAPIERR_MODE_READ_ONLY		=75,
	APL_NET_SRV_APLAPIERR_INCOMPATIBLDATAFORMAT	=76,
	APL_NET_SRV_APLAPIERR_OUT_OF_MEMORY			=77,
	APL_NET_SRV_APLAPIERR_UNKNOWN_EXEPTION		=78
	
};


/****************************************************************************/
/* Устарело. Оставлено для обратной совместимости.
/* Константы, определяющие номера лицензий
/****************************************************************************/
#define apl_LT_DEF_TYPE		0 /**<Тип лицензии "PSS". Используется по умолчанию)*/
#define apl_LT_TYPE_1		1 /**<Тип лицензии "ILS"*/
#define apl_LT_TYPE_X		12 /**Специальный тип лицензии. Используется только для специальных утилит)*/


/****************************************************************************/
/* Входные данные запроса LoadQuery для функции Load
/****************************************************************************/
//Элемент запроса
struct apl_NET_LoadQuery
{
	apl_NET_LoadQuery(UINT32 _id = 0, char _type = 0, UINT32 _inst_or_id = 0, UINT32 _ent_id = 0, UINT32 _attr_id = 0, bool _in_result=true, bool _load_all_attr = false)
	{
		id=_id; type=_type; inst_or_id=_inst_or_id; ent_id=_ent_id; attr_id=_attr_id; in_result=_in_result; load_all_attr=_load_all_attr;
	};
	void Set(apl_NET_LoadQuery* src)
	{
		if(src== 0){return;} 
		id=src->id; type=src->type; inst_or_id=src->inst_or_id; ent_id=src->ent_id; attr_id=src->attr_id; in_result=src->in_result; load_all_attr=src->load_all_attr;
	};
	void Set(apl_NET_LoadQuery& src)
	{
		id=src.id; type=src.type; inst_or_id=src.inst_or_id; ent_id=src.ent_id; attr_id=src.attr_id; in_result=src.in_result; load_all_attr=src.load_all_attr;
	};
	
	UINT32 id;   		// идентификатор записи
	char type; 			// тип записи 
	
// Тип:
// "a" - добавить инстанс в массив результатов
// "e" - запрос экстента по ентити
// "i" - прямой запрос аттрибута у инстансы
// "b" - обратный запрос (FindInstanceUser)
// "d" - прямой запрос по предыдущему запросу. 
// "r" - обратный запрос по предыдущему запросу. 

	UINT32 inst_or_id;	// идентификатор instance или записи;
	UINT32 ent_id;		// идентификатор entity (обратные ссылки)
	UINT32 attr_id; 	// идентификатор attribute;
	bool in_result;// флаг включения данных в результат
	bool load_all_attr;// флаг чтения всех возможных атрибутов
};

/****************************************************************************/
/* Коды функций классов AplBaseOperation и AplTransport
/* А так же символы, определяющие параметры
/****************************************************************************/
enum FuctionCodes
{
	CAplBaseOperations__LoadListBase= 11,   //(/*[in,out]*/ long *aplError,/*[in,out]*/ long *CountOfBuf, /*[out, size_is(*CountOfBuf)]*/ BYTE *Buf);
	CAplBaseOperations__QueryListBase= 12,   //(/*[in,out]*/ long *aplError,/*[out]*/ long *CountOfBuf);
	CAplBaseOperations__GetLicenseStatus= 13,   //(/*[in,out]*/ long *aplError,/*[in,out]*/ long *ResultSize, /*[out, size_is(*ResultSize)]*/ BYTE *Result,/*[out]*/long *ServerCode);
//	CAplBaseOperations__GetNumConnectedUsers= 14,   //(/*[in,out]*/ long *aplError,/*[in,out]*/ long *aplNum);
	CAplBaseOperations__LockServ= 15,   //(/*[in,out]*/ long *aplError);


	// Удаление итератора вместе с файлом
	CAplTransport__DeleteIterator= 20,  // (/*[in,out]*/ long *aplError);
	// Отсоединение итератора от блоба
	CAplTransport__CloseIterator= 21,   //(/*[in,out]*/ long *aplError);
	// Чтение из блоба, присоединенного к итератору
	CAplTransport__ReadFromIterator= 22,  // (/*[in,out]*/ long *aplError,/*[in]*/ long *SizeDose, /*[out,size_is(SizeDose)]*/ BYTE *Dose,/*[out]*/ long *LastDose);
	// Запись в блоб, присоединенный к итератору
	CAplTransport__WriteToIterator= 23,   //(/*[in,out]*/ long *aplError,/*[in]*/ long SizeDose,/*[in,size_is(SizeDose= ,   //]*/ BYTE *Dose,/*[in]*/ long LastDose);
	// Присоединение к итератору существующего БЛОБа или вновь созданного
	CAplTransport__CreateIterator= 24,   //(/*[in,out]*/ long *aplError,/*[in]*/ long *SizeNameBLOB,/*[in,out,size_is(*SizeNameBLOB)]*/ BYTE *NameBLOB,/*[in]*/ long SizeNameFile,/*[in,out,size_is(SizeNameFile)]*/ BYTE *NameFile,/*[in]*/ long *SizeDose);
	// Отрабатывает попытку соединения клиента с некоторой базой
	CAplTransport__Connect= 25,   //(/*[in,out]*/ long *aplError,/*[in]*/ long *size,/*[in,size_is(size)]*/ BYTE *LoginData);
	// Генерит по запросу буфер и запоминает указатель на него в m_TempStor, а размер в m_TempSize
	CAplTransport__Load= 26,   //(/*[in,out]*/ long *aplError,/*[in]*/ long Count, /*[in, size_is(Count)]*/ BYTE *Queries,/*[in,out]*/ long *ResultSize);
	// Генерит буфер, содержащий удаленные инстансы
	CAplTransport__QuerDelInst= 27,   //(long *aplError, long *ResultSize);

	CAplTransport__QuerSysTime= 28,   //(/*[in,out]*/ long *aplError,/*[out, size_is(8)]*/ BYTE *Result);
	CAplTransport__QuerActiveUserList= 29,   //(/*[in,out]*/ long *aplError,/*[in,out]*/ long *ResultSize);
	
	// Возвращает буфер, сгенеренный предыдущей функцией
	CAplTransport__LoadBuf= 30,   //(/*[in,out]*/ long *aplError,/*[in,out]*/ long *ResultSize, /*[out, size_is(*ResultSize)]*/ BYTE *Result);
	// Вносит изменения от клиента в рабочую базу
	CAplTransport__SaveChanges= 31,   //(/*[in,out]*/ long *aplError,/*[in,out]*/ long *DataSize, /*[in, out, size_is(*DataSize)]*/ BYTE *Data);
	// Запрос на языке запросов
	CAplTransport__Query= 32,   //(/*[in,out]*/ long *aplError,/*[in]*/ long *QuerySize, /*[in, size_is(*QuerySize)]*/ BYTE *Query);
	//Установить список доступа
	CAplTransport__SetUsersAccess= 33,   //(/*[in,out]*/ long *aplError,/*[in,out]*/ long *BufSize,/* [in,out, size_is(*BufSize)]*/ BYTE *Buf);
	//Получить список доступа
	CAplTransport__GetUsersAccess= 34,   //(/*[in,out]*/ long *aplError,/*[in,out]*/ long *BufSize,/* [in,out, size_is(*BufSize)]*/ BYTE *Buf);
	//Получить имя схемы и путь к файлу схемы
	CAplTransport__GetDictName= 35,   //(/*[in,out]*/ long *aplError,/*[in,out]*/ long *BufNameSize, /*[in,out, size_is(*BufNameSize)]*/ BYTE *BufName,/*[in,out]*/ long *BufFilePathSize,/*[in,out, size_is(*BufFilePathSize)]*/ BYTE *BufFilePath);
	//Проверяет, есть ли инстансы с данными условиями
	CAplTransport__TestUniqueAttrValues= 36,
	//Генерит список инстансов с данными условиями
	CAplTransport__FindInstancesWithAttrValuesQuery= 37,
	//Создает и удаляет индексы
	CAplTransport__OperateIndexes = 38,
	//Типа тест
	CAplTransport__Test = 39,
	//Вернуть для списка инстансов кто и когда их создал/последний раз изменил
	CAplTransport__LoadInstUserDataTimeInfo = 40,
	//Клиент корректно завершает работу
	CAplTransport__Disconnect = 41,
	//Клиент запрашивает историю коннекта пользователей
	CAplTransport__QueryUsersLog = 42,
	// Генерит по запросу буфер и запоминает указатель на него в m_TempStor, а размер в m_TempSize
	CAplTransport__LoadEx= 43,
	// Записывает клиентское сообщение в лог и (если ORACLE) в таблицу
	CAplTransport__WriteToLog= 44,
	// Возвращает список строк - атрибутов БД
	CAplTransport__LoadBDInfo= 45,
	// Выполняет SQL-запрос и если есть результат - возвращает клиенту (только для ORACLE или Postgres)
	CAplTransport__ExecuteSQL= 46,
	// Выполняет SQL-запрос и если есть результат - возвращает клиенту (только для ORACLE или Postgres) 
	// (с передачей места в исходном коде, откуда вызвана функция)
	CAplTransport__ExecuteSQLS= 47,
	// Отрабатывает попытку соединения клиента с некоторой БД - расширенный вариант
	CAplTransport__ConnectEx= 48,   
	// Сохраняет БЛОБ на диск минуя клиента
	CAplTransport__SaveBlob2Disk= 49,  
	// Создаем блоб из файла по абсолютному пути минуя клиента
	CAplTransport__ReadBlobFromSrv= 50,   
	// Запрос на языке запросов - новая версия
	CAplTransport__QueryEx=51,
	//Клиент чистит историю коннекта пользователей
	CAplTransport__ClearUsersLog = 52,
	// переход в режим администратора
	CAplTransport__StartAdminMode = 53,   
	// выход из режима администратора
	CAplTransport__ExitAdminMode = 54,   
	// Начало долгой операции
	CAplTransport__BeginLongOperation = 55,   
	// Копирование доступа поинстансово с экстента на экстент
	CAplTransport__CopyAccessFromExt2Ext = 56,   
	// Копирование доступа поинстансово с инстанса на экстент
	CAplTransport__CopyAccessFromInst2Ext = 57,   
	// Выполняет SQL-запрос и если есть результат - возвращает клиенту (только для ORACLE или Postgres)(расширенная версия)
	CAplTransport__ExecuteSQLEx = 58,
	//Клиент запрашивает историю коннекта пользователей - с фильтром
	CAplTransport__QueryUsersLogEx = 59,
	//Служебные операции с шаблонами доступа
	CAplTransport__ServiceAccessPatterns = 60,
	//Проверка соответствия версий буферов сервера и клиента - один раз при логине
	CAplTransport__ServiceTestVersions = 61,
	// Присоединение к мульти-итератору для чтения нескольких БЛОБов
	CAplTransport__CreateMultiReadIterator= 62,   //(/*[in,out]*/ long *aplError,/*[in]*/ long *SizeNameBLOB,/*[in,out,size_is(*SizeNameBLOB)]*/ BYTE *NameBLOB,/*[in]*/ long SizeNameFile,/*[in,out,size_is(SizeNameFile)]*/ BYTE *NameFile,/*[in]*/ long *SizeDose);
	// Отсоединение мульти-итератора от блобов
	CAplTransport__CloseMultiReadIterator= 63,   //(/*[in,out]*/ long *aplError);
	// Чтение из блоба, присоединенного к мульти-итератору
	CAplTransport__ReadFromMultiReadIterator= 64,  // (/*[in,out]*/ long *aplError,/*[in]*/ long *SizeDose, /*[out,size_is(SizeDose)]*/ BYTE *Dose,/*[out]*/ long *LastDose);
	// Запись в блоб, присоединенного к мульти-итератору - вряд ли будет, но номерок зарезервируем
	//CAplTransport__Write2MultiReadIterator= 65,  // (/*[in,out]*/ long *aplError,/*[in]*/ long *SizeDose, /*[out,size_is(SizeDose)]*/ BYTE *Dose,/*[out]*/ long *LastDose);
	// Только oracle - загружает из БД таблицы, в которых хранятся данные для каждой entity
	CAplTransport__LoadEntityTables = 66,  // 
	// Только oracle - возвращает клиенту параметры алиаса оракла а так же имя и пароль учетьной записи
	CAplTransport__LoadOraAlias = 67,  // 
	// Возвращает клиенту список файлов в каталоге, предназначенном для автообновления. На входе - 2 строки 1) с именем программы 2) с маской имени файла
	CAplTransport__Autoupdate_LoadListNamesFiles = 68,  // 
	// Присоединение к мульти-итератору для чтения нескольких БЛОБов
	CAplTransport__Autoupdate_CreateMultiReadIterator= 69,
	// Отсоединение мульти-итератора от блобов
	CAplTransport__Autoupdate_CloseMultiReadIterator= 70,
	// Чтение из блоба, присоединенного к мульти-итератору
	CAplTransport__Autoupdate_ReadFromMultiReadIterator= 71,
	CAplTransport__QuerActiveUserListEx= 72,   //(/*[in,out]*/ long *aplError,/*[in,out]*/ long *ResultSize);
	//Получить список доступа с группировкой по инстансам
	CAplTransport__GetUsersAccessBI = 73,   //(/*[in,out]*/ long *aplError,/*[in,out]*/ long *BufSize,/* [in,out, size_is(*BufSize)]*/ BYTE *Buf);
	//Установить доступ с группировкой по инстансам
	CAplTransport__SetUsersAccessBI = 74,   //(/*[in,out]*/ long *aplError,/*[in,out]*/ long *BufSize,/* [in,out, size_is(*BufSize)]*/ BYTE *Buf);
	//Получить историю изменения атрибутов
	CAplTransport__GetAttrsHistory = 75,   //(/*[in,out]*/ long *aplError,/*[in,out]*/ long *BufSize,/* [in,out, size_is(*BufSize)]*/ BYTE *Buf);
	// Удаление итератора вместе с файлом - расширенный вариант
	CAplTransport__DeleteIteratorEx = 76,   //(/*[in,out]*/ long *aplError,/*[in]*/ long *SizeNameBLOB,/*[in,out,size_is(*SizeNameBLOB)]*/ BYTE *NameBLOB,/*[in]*/ long SizeNameFile,/*[in,out,size_is(SizeNameFile)]*/ BYTE *NameFile,/*[in]*/ long *SizeDose,int inst_id,int attr_id);
	// Принять с клиента новый словарь и запустить обновление словарей посредством запуска БДАдмина
	CAplTransport__RunUpdateDictionary = 77,   
	// Получить список атрибутов, в которых живут идентификтаоры БЛОБов
	CAplTransport__GetAttrs4Blobs = 78,
	// Запустить приложение на сервере
	CAplTransport__RunApp = 79,
	// Заблокировать на запись инстанс или пачку инстансов
	CAplTransport__LockInstance = 80,
	// Служебные операции сервера по запросу клиента
	CAplTransport__ServiceOp = 81,
	// Возвращает в строковом массиве все значения одного атрибута всех инстансов
	CAplTransport__GetAllAttrValues = 82,
	// Возвращает строку временного пароля для дублицирования сессии
	CAplTransport__GetString4DupSession = 83,
	// Возвращает клиенту список файлов в каталоге, предназначенном для автообновления. На входе - 2 строки 1) с именем программы 2) с маской имени файла
	// Отличия от CAplTransport__Autoupdate_LoadListNamesFiles:
	// есть заголовок версии буфера
	// маска разделена переводами строк а не пробелами
	// Если в маске указаны файлы "*.luf", то разбирает все имеющиеся luf и возвращает список для файлов, подлежащих обновлению
	CAplTransport__Autoupdate_LoadListNamesFilesEx = 84,  // 
	
	// Записывает в специальную таблицу информацию о доступе к документу и проверяет, насколько часто этот пользователь читает разные документы
	CAplTransport__ControlAccessDoc = 85,
	// Запрос на языке запросов - новая версия c передачей информации об источнике запросов
	CAplTransport__QueryExS=86,
	// Выполняет SQL-запрос и если есть результат - возвращает клиенту (только для ORACLE или Postgres)(расширенная версия)
	// (с передачей места в исходном коде, откуда вызвана функция)
	CAplTransport__ExecuteSQLExS = 87,
	// Присоединение к итератору существующего БЛОБа или вновь созданного - с 64битным размером БЛОБа 
	CAplTransport__CreateIterator64 = 88,   //(/*[in,out]*/ long *aplError,/*[in]*/ long *SizeNameBLOB,/*[in,out,size_is(*SizeNameBLOB)]*/ BYTE *NameBLOB,/*[in]*/ long SizeNameFile,/*[in,out,size_is(SizeNameFile)]*/ BYTE *NameFile,/*[in]*/ __int64 *SizeDose);
	// Присоединение к мульти-итератору для чтения нескольких БЛОБов - с 64битным размером БЛОБа 
	CAplTransport__CreateMultiReadIterator64= 89,   //(/*[in,out]*/ long *aplError,/*[in]*/ long *SizeNameBLOB,/*[in,out,size_is(*SizeNameBLOB)]*/ BYTE *NameBLOB,/*[in]*/ long SizeNameFile,/*[in,out,size_is(SizeNameFile)]*/ BYTE *NameFile,/*[in]*/ long *SizeDose);
	// Создаем блоб из файла по абсолютному пути минуя клиента (возвращает 64битный размер БЛОБа)
	CAplTransport__ReadBlobFromSrv64= 90,   
	// Возвращает максимально возможный размер БЛОБа (для оракла он ограничен размером файла данных БД)
	CAplTransport__GetMaxBlobSize64= 91,   
	// Присоединение к итератору существующего БЛОБа или вновь созданного - с доп параметрами
	CAplTransport__CreateIteratorEx = 92,   //(/*[in,out]*/ long *aplError,/*[in]*/ long *SizeNameBLOB,/*[in,out,size_is(*SizeNameBLOB)]*/ BYTE *NameBLOB,/*[in]*/ long SizeNameFile,/*[in,out,size_is(SizeNameFile)]*/ BYTE *NameFile,/*[in]*/ long *SizeDose,/*[in]*/ long SizeParams,/*[in,out,size_is(SizeNameFile)]*/ BYTE *Params);
	CAplTransport__CreateIteratorEx64 = 93,   //(/*[in,out]*/ long *aplError,/*[in]*/ long *SizeNameBLOB,/*[in,out,size_is(*SizeNameBLOB)]*/ BYTE *NameBLOB,/*[in]*/ long SizeNameFile,/*[in,out,size_is(SizeNameFile)]*/ BYTE *NameFile,/*[in]*/ __int64 *SizeDose,/*[in]*/ long SizeParams,/*[in,out,size_is(SizeNameFile)]*/ BYTE *Params);
	// Только PG - возвращает клиенту параметры доступа к PG
	CAplTransport__LoadPGAlias = 94,  // 

	// Только Qt - Запрос параметра аутентификации - один раз перед логином
	CAplTransport__ServiceGetAuthParam = 95,
	// Только Qt - Вернуть информацию о доменном пользователе по имени пользователя или (в будущем) по части ФИО
	CAplTransport__LoadDomainUserInfo = 96,
	// Только Qt - Вернуть информацию о доменных настройках
	CAplTransport__LoadDomainInfo = 97,
	// Только Qt - Записать информацию в журнал событий безопасности
	CAplTransport__Write2SafetyLog = 98,
	// Только Qt - Проверить строки на корректность, при ошибке записать информацию в журнал событий безопасности и вернуть номер сбойной строки
	CAplTransport__ValidateStrings = 99,
	// Только Qt - послать на сервер табличку с хешами модулей и проверить их корректность
	CAplTransport__ValidateFilesHashes = 100,
	// Отрабатывает попытку аутентификации через керберос и прочие службы
	// Авторизация для конкретной БД должна выполняться последующим вызовом CAplTransport__ConnectEx!
	CAplTransport__AuthKerberos = 102,
	// Вернуть список доменных пользователей, входящих в указанную группу
	CAplTransport__LoadDomainUsersFromGroupe = 103,
	//Клиент запрашивает записи журнала информационной безопасности
	CAplTransport__QuerySafetyLog = 104,
	//Клиент чистит журнал информационной безопасности
	CAplTransport__ClearSafetyLog = 105,
	//Клиент запрашивает инстансы, к которым имеет доступ пользователь (сервер Qt)
	CAplTransport__LoadAccess4User = 106,
	// Служебные операции с именованными частями сессий
	CAplTransport__SessionPartsOperate = 107,
	// Получить версию и тип сервера приложений
	CAplTransport__QueryServerVersion = 108 ,
	// Операции с дополнительными лицензиями
	CAplTransport__LicOperate = 109,
	// Строчка с дополнительными параметрами клиента. (для совместимости с Qt)
	CAplTransport__ClientParameters = 110,

	CAplTransport__BlobRandomCreate = 111,   // Произвольный доступ к BLOB: создание/открытие итератора
	CAplTransport__BlobRandomRead = 112,     // Произвольный доступ к BLOB: чтение по смещению
	CAplTransport__BlobRandomWrite = 113,    // Произвольный доступ к BLOB: запись по смещению
	CAplTransport__BlobRandomResize = 114,   // Произвольный доступ к BLOB: изменение размера


	AplCommand = 0,

	AplCommandTestLive = 101,		// заставляет сервер послать клиенту запрос адекватности
	
};

typedef enum{
	RPCError	=	1
} RPCCommands;

#define DEFAILT_ID_ADMIN_GROUP 3901
#define DEFAILT_ID_ADMIN_USER 3902

#define BEGIN_MAX_INST_NUM 4000

#define VERSION_OF_RPC_BUFFER 0x00000001
#define VERSION_OF_RPC_BUFFER_2 0x00000002
#define VERSION_OF_RPC_BUFFER_3 0x00000003
#define VERSION_OF_RPC_BUFFER_4 0x00000004


class CaplInstance;

/** Вспомогательная структура для загрузки с сервера информации об истории подключений пользователей к БД*/
struct SUserLogInfo
{
	SUserLogInfo()
	{
		AUSId = 0;
		user = 0; user_id = 0; user_name.Empty(); ip_srv.Empty(); ver_srv.Empty(); ip_cli.Empty(); ip_cli_num = 0; ver_cli.Empty();
		date_login = 0; date_logout = 0; exit_status=-1; exe_name.Empty(); user_base4admin = 0; user_id_base4admin = 0; count_load = 0;
	}
	SUserLogInfo(SUserLogInfo* base)
	{
		AUSId=base->AUSId;
		user=base->user; user_id=base->user_id; user_name=base->user_name; ip_srv=base->ip_srv; ver_srv=base->ver_srv;
		ip_cli=base->ip_cli; ip_cli_num=base->ip_cli_num; ver_cli=base->ver_cli;
		date_login=base->date_login; date_logout=base->date_logout; exit_status=base->exit_status;
		exe_name=base->exe_name; user_base4admin=base->user_base4admin; user_id_base4admin=base->user_id_base4admin; count_load=base->count_load;
	}
	UINT32 AUSId;
	CaplInstance* user;
	UINT32 user_id;
	CString user_name;
	CString ip_srv;
	CString ver_srv;
	CString ip_cli;
	UINT32 ip_cli_num;
	CString ver_cli;
	DATE date_login;
	DATE date_logout;
	int exit_status;
	CString exe_name;
	CaplInstance* user_base4admin;
	UINT32 user_id_base4admin;
	__int64 count_load;
};

/** Вспомогательная структура для загрузки с сервера информации о дате создания/изменения и пользователе, 
создавшем/изменившем указанные <B>instance</B>*/

struct SInstInfo
{
	SInstInfo(){inst = 0; create_user = 0; create_date = 0; update_user = 0; update_date = 0;}
	SInstInfo(CaplInstance* inst_def){inst=inst_def; create_user = 0; create_date = 0; update_user = 0; update_date = 0;}
	CaplInstance* inst;
	CaplInstance* create_user;
	DATE create_date;
	CaplInstance* update_user;
	DATE update_date;
};

// структура фильтра, используемого для запроса истории атрибутов
struct SQAH_Filter
{
	SQAH_Filter()
	{
		AUSId = 0;
		user_id = 0;
		ent_id = 0;
		date_beg_1 = _T("");
		date_end_1 = _T("");
	}

	int AUSId;
	UINT32 user_id;
	UINT32 ent_id;
	CString date_beg_1;
	CString date_end_1;
};

/** Вспомогательная структура для загрузки с сервера информации об истории изменения атрибутов*/
struct SQAH_Info
{
	SQAH_Info()
	{
		AUSId = 0; inst_id = 0; user_id = 0; attr_id = 0; update_date = 0;
		int_val_new = 0; int_val_old = 0; str_val_new.Empty(); str_val_old.Empty(); rea_val_new = 0; rea_val_old = 0;
		single_val = true;
	}
	SQAH_Info(SQAH_Info* base)
	{
		AUSId=base->AUSId; inst_id=base->inst_id; user_id=base->user_id; attr_id=base->attr_id; update_date=base->update_date;
		single_val=base->single_val;
		if(single_val)
		{
			val_new=base->val_new; val_old=base->val_old;
		}
		else
		{
			int_val_new=base->int_val_new; int_val_old=base->int_val_old;
			str_val_new=base->str_val_new; str_val_old=base->str_val_old;
			rea_val_new=base->rea_val_new; rea_val_old=base->rea_val_old;
		}
	}
	int AUSId;
	UINT32 inst_id;
	UINT32 user_id;
	UINT32 attr_id;
	DATE update_date;
	// устаревшие переменные для совместимости со старыми клиентами
	int int_val_new;
	int int_val_old;
	CString str_val_new;
	CString str_val_old;
	double rea_val_new;
	double rea_val_old;
	// новые переменные (для поддержки aplNOTYPE / null)
	CaplValue val_new;
	CaplValue val_old;
	bool single_val;
};

// константы- идентификаторы полей в буфере параметров аутентификации
enum AuthExtendetBufCodes
{
	CEB_username = 1,		// Клиент->сервер: имя пользователя
	CEB_pwd = 2,			// Клиент->сервер: пароль
	CEB_name_base = 3,		// Клиент->сервер: имя БД
	CEB_client_ip = 4,		// Клиент->сервер: Ip-адрес определенный на стороне клиента
	CEB_client_id = 5,		// Клиент->сервер: идентификатор процесса клиента
							// Сервер->клиент: идентификатор сеанса в контексте сервера приложений
	CEB_user_id = 6,		// Сервер->клиент: идентификатор пользователя (instance_id интснас типа apl_user)
	CEB_type_license = 7,	// Устарело!! Использовать CEB_type_license_str!! Клиент->сервер: тип лицензии классического дистрибутива (число, обозначающее тип)
	CEB_ver_srv = 8,		// Сервер->клиент: версия сервера
	CEB_type_srv = 9,		// Сервер->клиент: тип сервера (СХД, Oracle, PostgreSQL)
	CEB_ver_cli = 10,		// Клиент->сервер: версия прораммы клиента
	CEB_exe_cli = 11,		// Клиент->сервер: имя программы клиента (с путем)
	CEB_can_find_in_blob = 12, 		// Сервер->клиент: разрешен ли поиск по телам БЛОБов
	CEB_sec_code_1 = 13,	// Клиент->сервер: зарезервировано
	CEB_sec_code_2 = 14,	// Клиент->сервер: зарезервировано
	CEB_about = 15,			// Клиент->сервер: место в исходниках, откуда был вызван переход в режим администратора
	CEB_server_ses_id = 16,		// Сервер->клиент: Id клиентского сеанса в контексте СУБД
	CEB_domain = 17,		// Клиент->сервер: имя домена
	CEB_comp_name = 18,		// Клиент->сервер: имя компьютера клиента
	CEB_os_domain = 19,		// Клиент->сервер: аутентификация под текущим пользователем домена
	CEB_os_user = 20,		// Клиент->сервер: имя текущего пользователя операционной системы (с доменом, если пользователь доменный)
	CEB_name_con = 21,		// Клиент->сервер: имя подключения
	CEB_type_license_str = 22,	// Клиент->сервер: тип лицензии (сервер Qt)(строка с названием типа лицензии)
	CEB_class_srv = 23,		// Сервер->клиент: класс сервера (MSVC32, Qt)
	CEB_client_id_s1 = 24,		// Клиент->сервер: идентификатор процесса клиента дополнительный
	CEB_client_id_s2 = 25,		// Клиент->сервер: идентификатор процесса клиента дополнительный
	CEB_id_base_sess = 26,	// Клиент->сервер: имя основной сессии для сессии плагина
	CEB_build_srv = 27		// Сервер->клиент: дата сборки в формате apl ГГГГММДДччммсс
};

// константы параметров аутентификации. Для работы с сервером Qt
enum AuthParamCodes
{
	APC_GetSPN = 1,
	APC_GetExtAuthName = 2,
	APC_GetHashMethod = 3,
	APC_GetAccessDll = 4,
};


//Стандартный заголовок буфера данных
// Заголовки буферов идут в однобайтной кодировке!!!!!!
#define std_databuf_header "apl_step_data V 0.2\0x0"
// стандартный формат c юникодовыми строками
// пишется в буфер в однобайтовом виде!
#define std_databuf_header_u "apl_step_data Vu0.2\0x0"

#define apl_step_format_mask "apl_step_data V"

#define std_databuf_ret_header "apl_step_data V 0.101\0x0"

#define std_access_list_header "apl_accesslist V 0.102\0x0"
#define std_access_list_header101 "apl_accesslist V 0.101\0x0"

#define std_test_find_header "apl_TestFindBuf V 0.104\0x0"
#define std_test_find_header2 "apl_TestFindBuf V 0.102\0x0"
#define std_test_find_header3 "apl_TestFindBuf V 0.103\0x0"

#define std_LoadInstUserDataTimeInfoQuery_header "apl_LoadInstUserDataTimeInfoQuery V 0.100\0x0"

#define std_LoadInstUserDataTimeInfoData_header "apl_LoadInstUserDataTimeInfoData V 0.101\0x0"

#define std_LoadBDParam_header "apl_LoadBDParam_header V 0.101\0x0"

#define std_ClientSQLQuery_header "apl_ClientSQLQuery_header V 0.102\0x0"
#define std_ClientSQLQuery_header_01 "apl_ClientSQLQuery_header V 0.101\0x0"

#define std_ClientSQLQueryEx_header "apl_ClientSQLQuery_headerEx V 0.103\0x0"
#define std_ClientSQLQueryEx_header_02 "apl_ClientSQLQuery_headerEx V 0.102\0x0"
#define std_ClientSQLQueryEx_header_01 "apl_ClientSQLQuery_headerEx V 0.101\0x0"

#define std_ClientSQLResult_header "apl_ClientSQLResult_header V 0.101\0x0"

// !!! Внимание, этот заголовок пишется в буфер без заключительного нуля!
#define std_ExtendedBuf_header "apl_ExtendedBufHeader v0.1\0x0"

#define std_AuthExBuf_header "apl_AuthExBufHeader v0.1\0x0"

#define std_DCServisAccessPatterns_header "apl_DCServisAccessPatterns v0.001\0x0"

#define std_DCAttrsHistory_header_0001 "apl_DCAttrsHistory_header v0.001\0x0"
// версия 0.002 поддерживает возврат значений null
#define std_DCAttrsHistory_header "apl_DCAttrsHistory_header v0.002\0x0"

#define std_DCAttrs4Blob_header "apl_DCAttrs4Blob_header v0.001\0x0"

#define std_DCRunUpdateDictionary_header "apl_DCRunUpdateDictionary_header v0.001\0x0"

#define std_DCLockInstance_header "apl_DCLockInstance_header v0.001\0x0"

#define std_DCServiceOp_header "apl_DCServiceOp_header v0.001\0x0"

#define std_License_header "apl_License_header v0.002\0x0"
#define std_License_header_001 "apl_License_header v0.001\0x0"

#define std_GetAllAttrValues_in_header "std_GetAllAttrValues_in_header v0.01\0x0"

#define std_GetAllAttrValues_out_header "std_GetAllAttrValues_out_header v0.01\0x0"

// запрос истории подключений - заголовок буфера фильтра, результат возвращается в виде std_LoadUserLogInfo_header
#define std_QueryUsersLogFilter_001_h "apl_QueryUsersLogFilter v0.001\0x0"
#define std_QueryUsersLogFilter_002_h "apl_QueryUsersLogFilter v0.002\0x0"
#define std_QueryUsersLogFilter_004_h "apl_QueryUsersLogFilter v0.004\0x0"

// возврат истории подключений - заголовок буфера со списком подключений
// запрос удаления записей из истории подключений 
#define std_LoadUserLogInfo_header104 "apl_UserLogInfoData V 0.104\0x0"
#define std_LoadUserLogInfo_header103 "apl_UserLogInfoData V 0.103\0x0"
#define std_LoadUserLogInfo_header102 "apl_UserLogInfoData V 0.102\0x0"
#define std_LoadUserLogInfo_header101 "apl_UserLogInfoData V 0.101\0x0"

// запрос списка активных подключений, результат возвращается в буфере с таким же заголовком
#define ACTIVE_LIST_header_01	 "ACTIVE_LIST_header v0.1\0x0"
#define ACTIVE_LIST_header_02	 "ACTIVE_LIST_header v0.2\0x0"
#define ACTIVE_LIST_header_04	 "ACTIVE_LIST_header v0.4\0x0"
#define ACTIVE_LIST_header_05	 "ACTIVE_LIST_header v0.5\0x0"


// Строка идентифицирующая буфер доступа
#define ACCESS_BUF_SET_header "Access bufer set v0.4"
//#define ACCESS_BUF_SET_header "Access bufer set v0.3"
#define ACCESS_BUF_SET_header_03 "Access bufer set v0.3"
#define ACCESS_BUF_SET_header_base "Access bufer set v"

#define ACCESS_BUF_GET_header "Access bufer get v0.2"
#define ACCESS_BUF_GET_header_01 "Access bufer get v0.1"
#define ACCESS_BUF_GET_header_base "Access bufer get v"

#define ACCESS_BUF_BI_header "Access bufer BI v0.1"
#define ACCESS_BUF_BI_header_base "Access bufer BI v"


#define LOAD_QUERY_BUF_header	  "Load query bufer v0.1\0x0"
#define LOAD_QUERY_BUF_header_2 "Load query bufer v0.2\0x0"
#define LOAD_QUERY_BUF_header_3 "Load query bufer v0.3\0x0"
#define CLIENT2SERVER_LOG_BUF_header "Client2Server log bufer v0.1\0x0"
#define CLIENT2SERVER_DOC_CONTR_header "Client2Server doc conytrol bufer v0.1\0x0"
// Строка идентифиципующая буфер запроса на поиск EX
//#define FIND_BUF_HEADER_SET "FindEX bufer set v0.1"

#define LoadListNamesFiles_header		  "LoadListNamesFiles_header v0.1\0x0"

#define std_SessionPartsOperate_header "std_SessionPartsOperate_header v0.01\0x0"

#define std_LicOperate_header "std_LicOperate_header v0.01\0x0"

enum LicOperate
{
	LO_TestTake = 1,
	LO_Remove = 2
};


// данные для сверки версий буферов на клиенте и не сервере
enum BuffersCodes{
std_databuf = 0,
std_databuf_ret = 1,
std_access_list = 2,
std_test_find = 3,
std_LoadInstUserDataTimeInfoQuery = 4,
std_LoadInstUserDataTimeInfoData = 5,
std_LoadUserLogInfo = 6,
std_LoadBDParam = 7,
std_ClientSQLQuery = 8,
std_ClientSQLQueryEx = 9,
std_ClientSQLResult = 10,
std_ExtendedBuf = 11,
std_QueryUsersLogFilter = 12,
std_DCServisAccessPatterns = 13,
ACCESS_BUF_SET = 14,
ACCESS_BUF_GET = 15,
LOAD_QUERY_BUF = 16,
CLIENT2SERVER_LOG_BUF = 17,
ACCESS_BUF_BI =18,
std_DCAttrsHistory = 19,
std_DCAttrs4Blob = 20,
std_LicOperate = 21

};


#define QUL_F_AUSId			0
#define QUL_F_user			1
#define QUL_F_admin_user	2
#define QUL_F_date_beg_1	3
#define QUL_F_date_beg_2	4
#define QUL_F_date_end_1	5
#define QUL_F_date_end_2	6
#define QUL_F_status		7
#define QUL_F_ip_cli		8
#define QUL_F_ip_srv		9
#define QUL_F_ver_cli		10
#define QUL_F_ver_srv		11
#define QUL_F_time_connect	12
#define QUL_F_module_name	13
#define QUL_F_ent			14


	
#endif




