/*
 * Copyright(C) 2007 Проект ИОК
 *
 * Этот файл содержит информацию, являющуюся
 * собственностью компании Крипто Про.
 *
 * Любая часть этого файла не может быть скопирована,
 * исправлена, переведена на другие языки,
 * локализована или модифицирована любым способом,
 * откомпилирована, передана по сети с или на
 * любую компьютерную систему без предварительного
 * заключения соглашения с компанией Крипто Про.
 */

 /*!
  * \file $RCSfile$
  * \version $Revision: 216098 $
  * \date $Date:: 2020-07-31 09:45:10 +0300#$
  * \author $Author: frolov $
  * \brief Функция получения полного имени считывателя.
  */

#include "fat12prj.h"
#define N_ELEM(arr) sizeof((arr))/sizeof((arr)[0])

DWORD fat12_info_name(
    TSupSysContext *context, TSupSysInfo *info)
{
    TSupSysInfoText *inf = (TSupSysInfoText*)info;
    TFat12Context *ctx = (TFat12Context*)context;
    SUPSYS_PRE_INFO(info, TSupSysInfoText);
    SUPSYS_PRE_CCONTEXT(context, TFat12Context);
    SUPSYS_PRE(ctx->connect);

    if (inf->length)
	SUPSYS_PRE_WRITE_PTRS(inf->text, (inf->length + 1) * sizeof(TCHAR));

    TCHAR temp_buf[MAX_PATH + 1]; //статический буфер с запасом. MAX_PATH взят просто так. 
    size_t resource_len = N_ELEM(temp_buf) - 1; //Длина на 1 меньше, чем размер буфера.

    DWORD code = support_resource_string(FAT12_RESOURCE, IDS_FAT12_NAME, temp_buf, &resource_len);
    if (ERROR_SUCCESS != code)
	return code;

    size_t full_name_len = resource_len + 1 + _tcslen(ctx->connect);
    if (full_name_len > N_ELEM(temp_buf) - 1) { // проверяем, что все поместится в промежуточный статический буфер temp_buf
	return (DWORD)NTE_FAIL; //если почему-то длина имени из ресурса + имени коннекта слишком большие, уходим с ошибкой. Такого быть не должно.
    }
    if (NULL == inf->text) {
	inf->length = full_name_len;
	return ERROR_SUCCESS;
    }

    if (inf->length < full_name_len) {
	inf->length = full_name_len;
	return (DWORD)ERROR_MORE_DATA;
    }

    //формируем полное имя из имени в ресурсах + имени коннекта
    temp_buf[resource_len] = _TEXT('\0'); //Здесь лежит имя из ресурса. На всякий случай явно терминируем строку
    _tcscat(temp_buf, _TEXT(" "));
    _tcscat(temp_buf, ctx->connect);

    _tcscpy(inf->text, temp_buf);
    inf->length = full_name_len;
    return ERROR_SUCCESS;
}
