Example #1
0
        /// <summary>
        /// Конструктор - основной (без параметров)
        /// </summary>
        public FormMain() : base(@"IconMainxmlLoader")
        {
            int indxRow = -1;

            //this.Icon = this.Icon = ((System.Drawing.Icon)(new System.ComponentModel.ComponentResourceManager(typeof(FormMain)).GetObject("IconMainxmlLoader")));

            InitializeComponent();
            // указать идентификаторы некорым элементам интерфейса
            m_cbxReadSessionStart.Tag = INDEX_CONTROL.CBX_READ_SESSION_START;
            m_cbxReadSessionStop.Tag  = INDEX_CONTROL.CBX_READ_SESSION_STOP;
            //// инициализировать строками статические представления - Сессия
            //indxRow = m_dgvStatistic.Rows.Add();
            //m_dgvStatistic.Rows[indxRow].HeaderCell.Value = @"Крайний пакет";
            //indxRow = m_dgvStatistic.Rows.Add();
            //m_dgvStatistic.Rows[indxRow].HeaderCell.Value = @"Длительность сессии";
            //indxRow = m_dgvStatistic.Rows.Add();
            //m_dgvStatistic.Rows[indxRow].HeaderCell.Value = @"Принятых пакетов";
            // инициализировать строками статические представления - Параметры источников для сохранения значений
            indxRow = m_dgvDestSetting.Rows.Add(); m_dgvDestSetting.Rows[indxRow].Tag = FileINI.INDEX_CONNECTION_SETTING.IP;
            m_dgvDestSetting.Rows[indxRow].HeaderCell.Value = @"Сервер";
            indxRow = m_dgvDestSetting.Rows.Add(); m_dgvDestSetting.Rows[indxRow].Tag = FileINI.INDEX_CONNECTION_SETTING.NPORT;
            m_dgvDestSetting.Rows[indxRow].HeaderCell.Value = @"№ порт";
            indxRow = m_dgvDestSetting.Rows.Add(); m_dgvDestSetting.Rows[indxRow].Tag = FileINI.INDEX_CONNECTION_SETTING.INSTANCE;
            m_dgvDestSetting.Rows[indxRow].HeaderCell.Value = @"Экземпляр";
            indxRow = m_dgvDestSetting.Rows.Add(); m_dgvDestSetting.Rows[indxRow].Tag = FileINI.INDEX_CONNECTION_SETTING.DB_NAME;
            m_dgvDestSetting.Rows[indxRow].HeaderCell.Value = @"Имя БД";
            indxRow = m_dgvDestSetting.Rows.Add(); m_dgvDestSetting.Rows[indxRow].Tag = FileINI.INDEX_CONNECTION_SETTING.UID;
            m_dgvDestSetting.Rows[indxRow].HeaderCell.Value = @"Пользователь";
            indxRow = m_dgvDestSetting.Rows.Add(); m_dgvDestSetting.Rows[indxRow].Tag = FileINI.INDEX_CONNECTION_SETTING.PSWD;
            m_dgvDestSetting.Rows[indxRow].HeaderCell.Value = @"Пароль";

            createHandlerQueue(typeof(HHandlerQueue));
            (m_handler as HHandlerQueue).EvtToFormMain += new DelegateObjectFunc(onHandlerMainQueue);

            m_udpListener = new UDPListener();
            m_udpListener.EvtDataAskedHost += new DelegateObjectFunc(udpListener_OnEvtDataAskedHost);
            evtUDPListenerDataAskedHost    += new DelegateObjectFunc(udpListener_OnEvtDataAskedHost);

            m_handlerPackage = new PackageHandlerQueue();
            m_handlerPackage.EvtToFormMain += onHandlerPackageQueue;

            m_handlerWriter = new WriterHandlerQueue();
            m_handlerWriter.EvtToFormMain += onHandlerWriterQueue;

            //??? почемы вызов не в базовом классе
            initFormMainSizing();

            m_timerUpdate = new System.Threading.Timer(timerUpdate_OnCallback, null, System.Threading.Timeout.Infinite, System.Threading.Timeout.Infinite);

            m_dgvPackageList.SelectionChanged += dgvPackageList_SelectionChanged;

            m_tabControlViewPackage.Selecting += tabControl_Selecting;
            m_tabControlViewPackage.Selected  += tabControlViewPackage_Selected;
            m_tpageViewPackageXml.Tag          = INDEX_TABPAGE_VIEW_PACKAGE.XML;
            m_tpageViewPackageTree.Tag         = INDEX_TABPAGE_VIEW_PACKAGE.TREE;
            m_tpageViewPackageTableValue.Tag   = INDEX_TABPAGE_VIEW_PACKAGE.TABLE_VALUE;
        }
            /// <summary>
            /// Конструктор основной с параметрами
            /// </summary>
            /// <param name="dtRecieved">Мктка даты/времени получения</param>
            /// <param name="xmlSource">XML-документ</param>
            public PACKAGE(DateTime dtRecieved, XmlDocument xmlSource)
            {
                m_dtRecieved = dtRecieved;
                m_dtSended   = DateTime.MinValue;

                m_state = STATE.NEW;

                m_xmlSource = UDPListener.CopyXmlDocument(xmlSource);

                m_tableParameters = new DataTable();
                m_tableParameters.Columns.AddRange(new DataColumn[] {
                    new DataColumn(@"GROUP", typeof(string))
                    , new DataColumn(@"PARAMETER", typeof(string))
                });
                m_tableValues = new DataTable();
                m_tableValues.Columns.AddRange(new DataColumn[] {
                    new DataColumn(@"GROUP", typeof(string))
                    , new DataColumn(@"PARAMETER", typeof(string))
                    , new DataColumn(@"VALUE", typeof(float))
                });

                m_listXmlTree = new FormMain.ListXmlTree();

                m_state = STATE.PARSING;

                for (int i = 0; i < m_xmlSource.ChildNodes.Count; i++)
                {
                    if (m_xmlSource.ChildNodes[i].NodeType == XmlNodeType.Element)
                    {
                        m_listXmlTree.Add(new FormMain.ListXmlTree());

                        m_listXmlTree.Tag = m_xmlSource.ChildNodes[i].Name;

                        parseNode(m_xmlSource.ChildNodes[i], m_listXmlTree[m_listXmlTree.Count - 1] as FormMain.ListXmlTree);
                    }
                    else
                    {
                        ;
                    }
                }

                m_state = STATE.PARSED; //ERROR
            }
        /// <summary>
        /// Подготовить объект для отправки адресату по его запросу
        /// </summary>
        /// <param name="s">Событие - идентификатор запрашиваемой информации/операции,действия</param>
        /// <param name="error">Признак выполнения операции/действия по запросу</param>
        /// <param name="outobj">Объект для отправления адресату как результат запроса</param>
        /// <returns>Признак выполнения метода (дополнительный)</returns>
        protected override int StateCheckResponse(int s, out bool error, out object outobj)
        {
            int           iRes  = -1;
            StatesMachine state = (StatesMachine)s;
            PACKAGE       package;
            XmlDocument   xmlDocNew;
            XmlNode       nodeRec;
            string        debugMsg = string.Empty;

            error  = true;
            outobj = null;

            ItemQueue itemQueue = null;

            try {
                switch (state)
                {
                case StatesMachine.NEW:     // новый пакет
                    iRes  = 0;
                    error = false;

                    itemQueue = Peek;

                    // удалить лишние пакеты
                    removePackages();

                    xmlDocNew = (XmlDocument)itemQueue.Pars[1];

                    if (m_xmlDocRecieved == null)
                    {
                        m_xmlDocRecieved = UDPListener.CopyXmlDocument(xmlDocNew);
                    }
                    else
                    {
                        ;
                    }

                    foreach (XmlNode nodeNew in xmlDocNew.ChildNodes[1])       //[0] - header, [1] - xml
                    {
                        debugMsg += string.Format(@"{0}, ", nodeNew.Name);

                        if (_dictBuildingParameterRecieved.ContainsKey(nodeNew.Name) == false)
                        {
                            _dictBuildingParameterRecieved.Add(nodeNew.Name, new GROUP_PARAMETER(DateTime.UtcNow));
                        }
                        else
                        {
                            _dictBuildingParameterRecieved[nodeNew.Name].Update(false);

                            if (_dictBuildingParameterRecieved[nodeNew.Name].IsUpdate == true)
                            {
                                nodeRec = m_xmlDocRecieved.ChildNodes[1].SelectSingleNode(nodeNew.Name);

                                if (nodeRec == null)
                                {
                                    nodeRec          = m_xmlDocRecieved.CreateNode(XmlNodeType.Element, nodeNew.Name, nodeNew.NamespaceURI);
                                    nodeRec.InnerXml = nodeNew.InnerXml;
                                    m_xmlDocRecieved.ChildNodes[1].AppendChild(nodeRec);
                                }
                                else
                                {
                                    //m_xmlDocRecieved.ChildNodes[1].ReplaceChild(xmlNode, node);
                                    nodeRec.InnerXml = nodeNew.InnerXml;
                                }
                            }
                            else
                            {
                                ;
                            }
                        }
                    }
                    //Console.WriteLine(string.Format(@"{0} получены: {1}", DateTime.UtcNow, debugMsg));

                    lock (this) {
                        if (_dictBuildingParameterRecieved.IsUpdate == true)
                        {
                            error = (iRes = addPackage((DateTime)itemQueue.Pars[0], m_xmlDocRecieved)) < 0 ? true : false;

                            _dictBuildingParameterRecieved.Update(true);
                        }
                        else
                        {
                            error = false;
                        }
                    }
                    break;

                case StatesMachine.LIST_PACKAGE:     // список пакетов
                    iRes  = 0;
                    error = false;

                    itemQueue = Peek;

                    outobj = listViewPackageItem;
                    break;

                case StatesMachine.PACKAGE_CONTENT:     // пакет
                    iRes  = 0;
                    error = false;

                    itemQueue = Peek;

                    Console.WriteLine(string.Format(@"{0} - Запрос {1}: за [{2}], индекс={3}, состояние={4}"                                                                                               //
                                                    , DateTime.UtcNow, state.ToString(), (DateTime)itemQueue.Pars[0], (int)itemQueue.Pars[2], ((DataGridViewElementStates)itemQueue.Pars[3]).ToString())); //

                    var selectPackages = from p in _listPackage where p.m_dtRecieved == (DateTime)itemQueue.Pars[0] select p;
                    if (selectPackages.Count() == 1)
                    {
                        package = selectPackages.ElementAt(0);

                        switch ((FormMain.INDEX_CONTROL)itemQueue.Pars[1])
                        {
                        case FormMain.INDEX_CONTROL.TABPAGE_VIEW_PACKAGE_XML:
                            outobj = package.m_xmlSource;
                            break;

                        case FormMain.INDEX_CONTROL.TABPAGE_VIEW_PACKAGE_TREE:
                            outobj = package.m_listXmlTree;
                            break;

                        case FormMain.INDEX_CONTROL.TABPAGE_VIEW_PACKAGE_TABLE_VALUE:
                            outobj = package.m_tableValues;
                            break;

                        case FormMain.INDEX_CONTROL.TABPAGE_VIEW_PACKAGE_TABLE_PARAMETER:
                            outobj = package.m_tableParameters;
                            break;

                        default:         //??? - ошибка неизвестный тип вкладки просмотра XML-документа
                            break;
                        }
                    }
                    else
                    {
                        ;     //??? - ошибка пакет не найден либо пакетов много
                    }
                    break;

                case StatesMachine.STATISTIC:     // статистика
                    iRes  = 0;
                    error = false;

                    itemQueue = Peek;

                    //outobj = ??? объект статический
                    break;

                case StatesMachine.OPTION:
                    iRes  = 0;
                    error = false;

                    itemQueue = Peek;

                    s_Option = (OPTION)itemQueue.Pars[0];
                    m_manualEventSetOption.Set();

                    //outobj = ??? только в одну сторону: форма -> handler
                    break;

                case StatesMachine.TIMER_TABLERES:     // срок отправлять очередной пакет
                    iRes  = 0;
                    error = false;

                    itemQueue = Peek;
                    // отправить строго крайний, при этом XML-пакет д.б. не отправленным
                    var orderPckages = from p in _listPackage /*where p.m_dtSended == DateTime.MinValue*/ orderby p.m_dtRecieved descending select p;
                    if (orderPckages.Count() > 0)
                    {
                        package = orderPckages.ElementAt(0);

                        if (package.m_dtSended == DateTime.MinValue)
                        {
                            package.m_dtSended = DateTime.UtcNow;
                            // объект со структурой DATA_SET
                            outobj = new object[] {
                                package.m_dtSended
                                , package.m_tableValues.Copy()
                                , package.m_tableParameters.Copy()
                            };
                        }
                        else
                        {
                            // не отправлять пакет на обработку
                            outobj = false;
                        }
                    }
                    else
                    {
                        //??? - ошибка пакет не найден либо пакетов много
                        //    iRes = -1;
                        //    error = true;
                        outobj = false;
                    }

                    _dictBuildingParameterRecieved.Update(false);
                    break;

                default:
                    break;
                }
            } catch (Exception e) {
                Logging.Logg().Exception(e, @"PackageHandlerQueue::StateCheckResponse (state=" + state.ToString() + @") - ...", Logging.INDEX_MESSAGE.NOT_SET);

                error = true;
                iRes  = -1 * (int)state;
            }

            return(iRes);
        }