function McDirectReceive($rootScope) {
    "use strict";

    var fromUIN    = -1;
    var _list      = {};
    var _totalSize = 0;
    var _totalCnt  = 0;
    var TERMINATOR = mcConst.terminator;
    var self       = this;
    var DisplayName= "";
    var downloadPath = "";
    var drVisualisation = null;
    var DOWNLOADDIRECT = 8;

    function parseList(list) {
        var files = list.split(TERMINATOR); // (idx + 1) + TERMINATOR + fileName + TERMINATOR + path + TERMINATOR + size + TERMINATOR + attr + TERMINATOR
        var cnt   = 0;

        _list = {};

        while (cnt++ < _totalCnt){
            var idx      = files.shift();
            var fileName = files.shift();
            var path     = files.shift();
            var size     = files.shift();
            var attr     = files.shift();

            _list[idx] = {
                fileName: fileName,
                path    : path,
                size    : size,
                attr    : attr
            };
        }
    }

    function getList() {
        return mcService.convertObjToArray(_list, "idx", true);
    }

    function clear() {
        fromUIN    = -1;
        _list      = {};
        _totalCnt  = 0;
        _totalSize = 0;
        downloadPath = "";
    }

    self.clear = clear;

    self.setFilesList = function (filesInfo, _path) {
        if (!mcService.isObjectEmpty(_list)){
            clear();
        }

        _totalSize = filesInfo.FilesSize;
        _totalCnt  = filesInfo.FilesCount;
        DisplayName= filesInfo.DisplayName;
        fromUIN    = filesInfo.UIN;
        downloadPath = _path;

        parseList(filesInfo.List);
    };

    self.getCurrentReceiveUIN = function () {
        return fromUIN;
    };

    self.getInfo = function () {
        return {
            FilesList   : getList(),
            DisplayName : DisplayName,
            UIN         : fromUIN,
            Size        : _totalSize,
            Count       : _totalCnt,
            DownloadPath: downloadPath
        };
    };

    self.reject = function (prepare) {
        $rootScope.$broadcast(window._messages_.chatWrapper.hideTool, [mcConst.dataModels.ReceiveFiles]);

        if (!prepare){
            $rootScope.SendCMDToServer([
                mcConst._CMD_.cs_files_transfer_deny,
                mcConst.SessionID,

                fromUIN
            ]);
        }

        clear();
    };

    self.accept = function (path) {
        if (!$rootScope.customUserOptions.getOption(fromUIN, "autoReceive")) {
            $rootScope.$broadcast(window._messages_.chatWrapper.hideTool, [mcConst.dataModels.ReceiveFiles]);
            $rootScope.$broadcast("selectDialog", ["UIN-" + fromUIN]);
        }

        $rootScope.$broadcast(window._messages_.clientData.sendCMDToElectron, [
            mcConst._CMD_.ce_file_direct_receive_start,
            fromUIN,
            path,

            function (info) {
                $rootScope.SendCMDToServer([
                    mcConst._CMD_.cs_files_transfer_accept,
                    mcConst.SessionID,

                    fromUIN        ,  // идентификатор отправителя файлов
                    info.port      ,  // TCP порт получателя, на который будут передаваться файлы
                    info.interfaces,  // список локальных сетевых интерфейсов получателя
                    ""             ,  // индексы файлов, которые получатель не хочет принимать. Может быть пустым. Индексы перечисляются в текстовой строке через запятую
                    512               // размер буфера для передачи файлов через сервер, если передача напрямую не удастся по техническим причинам
                ]);

                drVisualisation._showProgressInfo(DOWNLOADDIRECT);
            }
        ]);

        $rootScope.$broadcast(window._messages_.dialogsList.OpenPrivate, [fromUIN]);

        self.onAcceptReceive && self.onAcceptReceive(fromUIN);
    };

    self.addReceiveFile = function (info) {
        if (info.UIN === fromUIN){
            _list[info.FileIdx].received = true;
        }
    };

    self.setVisualisation = function (_visualisation) {
        drVisualisation = _visualisation;
    };

    self.onAcceptReceive = null;
}