)>}]
شركة التطبيقات المتكاملة لتصميم وبرمجة البرمجيات الخاصة ش.ش.و.
Integrated Applications Programming Company
Home » Code Library » Sps (Ia.Ftn.Cl.Models.Client.Huawei)

Public general use code classes and xml files that we've compiled and used over the years:

Signaling Service Processing System (SPS) support class for Huawei's Fixed Telecommunications Network (FTN) SPS client model.

    1: using Dart.Telnet;
    2: using System;
    3: using System.Collections.Generic;
    4: using System.Diagnostics;
    5: using System.Security.Cryptography.X509Certificates;
    6:  
    7: namespace Ia.Ftn.Cl.Models.Client.Huawei
    8: {
    9:     ////////////////////////////////////////////////////////////////////////////
   10:  
   11:     /// <summary publish="true">
   12:     /// Signaling Service Processing System (SPS) support class for Huawei's Fixed Telecommunications Network (FTN) SPS client model.
   13:     /// </summary>
   14:     /// 
   15:     /// <remarks> 
   16:     /// Copyright © 2018-2019 Jasem Y. Al-Shamlan (info@ia.com.kw), Integrated Applications - Kuwait. All Rights Reserved.
   17:     ///
   18:     /// This library is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by
   19:     /// the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
   20:     ///
   21:     /// This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
   22:     /// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
   23:     /// 
   24:     /// You should have received a copy of the GNU General Public License along with this library. If not, see http://www.gnu.org/licenses.
   25:     /// 
   26:     /// Copyright notice: This notice may not be removed or altered from any source distribution.
   27:     /// </remarks> 
   28:     public class Sps
   29:     {
   30:         private byte[] buffer = new byte[1024];
   31:         private TelnetModel telnetModel;
   32:         private Dart.Telnet.Telnet telnet;
   33:         private X509CertificateCollection clientCertificates = new X509CertificateCollection();
   34:         private System.ComponentModel.IContainer components;
   35:  
   36:         /// <summary/>
   37:         public static int WaitAfterSendInMillisecond { get { return 4000; } }
   38:  
   39:         /// <summary/>
   40:         public static int WaitAfterSendForCfgCommandInMillisecond { get { return 10000; } }
   41:  
   42:         /// <summary/>
   43:         public string LastSentCommand { get; private set; }
   44:  
   45:         /// <summary/>
   46:         public Queue<string> ReceiveQueue { get; set; }
   47:  
   48:         /// <summary/>
   49:         public Queue<string> SendQueue { get; set; }
   50:  
   51:         /// <summary/>
   52:         public bool IsLoggedIn { get; set; }
   53:  
   54:         ////////////////////////////////////////////////////////////////////////////
   55:  
   56:         /// <summary>
   57:         ///
   58:         /// </summary>
   59:         public enum ResultCode
   60:         {
   61:             /*
   62:              * 9 Collection of Error Codes
   63:              * 9.1 Collection of NP Service Related Error Codes
   64:              * Error Code  Description
   65:              */
   66:  
   67:             /// <summary/>
   68:             OperationIsSuccessful = 0,
   69:  
   70:             /// <summary/>
   71:             InvalidCommand = 1001,
   72:  
   73:             /// <summary/>
   74:             InvalidParameterValue__Xxx__For__Yyy__ = 1004,
   75:  
   76:             /// <summary/>
   77:             ParameterMissing__Yyy__ = 1009,
   78:  
   79:             /// <summary/>
   80:             DatabaseOperationFailed = 5000,
   81:  
   82:             /// <summary/>
   83:             LackingOfCompulsoryParameters = 5004,
   84:  
   85:             /// <summary/>
   86:             SpecifiedRecordNotFound = 5005,
   87:  
   88:             /// <summary/>
   89:             UserNumberRepeated = 5526,
   90:  
   91:             /// <summary/>
   92:             TheMnpRouteNumberBeingUsedByMnpUserCanNotBeRemoved = 5579,
   93:  
   94:             /// <summary/>
   95:             RoutingNumberTypeDoesNotMatchTheMnpUser = 5591,
   96:  
   97:             /// <summary/>
   98:             HlrNumberTypeDoesNotMatchTheMnpUser = 5592,
   99:  
  100:             /// <summary/>
  101:             InvalidRnIndex = 5593,
  102:  
  103:             /// <summary/>
  104:             AtLeastOneOfTheServicesMustBeRegistered = 5594,
  105:  
  106:             /// <summary/>
  107:             HlrAddressReferencedByAMnpUserCanNotBeDeleted = 5600,
  108:  
  109:             /// <summary/>
  110:             InvalidHlrIndex = 5602,
  111:  
  112:             /// <summary/>
  113:             UserImsiNumberCannotBeSameWithExist = 5855,
  114:  
  115:             /// <summary/>
  116:             TheNpRoutingIndexGivenDoesNotMatch = 5878,
  117:  
  118:             /// <summary/>
  119:             SystemError = 6000,
  120:  
  121:             /// <summary/>
  122:             WhenRouteIndexTypeIsSetToRouteNumberIndex_HlrNumberIndexMustBeSetTo65535 = 6015,
  123:  
  124:             /// <summary/>
  125:             RnNumberIndexMustBe65535WhenRoutingIndexTypeIsHlrAddressIndex = 6018,
  126:  
  127:             /// <summary/>
  128:             TheNumberOfTheCurrentSubscribersImsisReachesTheLimit = 6300,
  129:  
  130:             /// <summary/>
  131:             TheCurrentSubscriberUsesMultipleImsis_IfYouWantToChangeAnImsi_RunRmvSeruattrToDeleteThisImsiAndThenRunAddSeruattrToAddAnImsi = 6301,
  132:  
  133:             /// <summary/>
  134:             WhenNumberTypeIsSetTo_GsmNumberPortedToCdma_Or_CdmaNumberPortedToGsm__RoutingIndexTypeMustBeSetToAll = 7001,
  135:  
  136:             /// <summary/>
  137:             WhenNumberTypeIsSetTo_LocalFixedNetwork__RoutingIndexTypeMustBeSetTo_RouteNumberIndex = 7300,
  138:  
  139:             /// <summary/>
  140:             InvalidRoutingNumber = 7369,
  141:  
  142:             /// <summary/>
  143:             TheInputParameterNameCanContainOnlyDigits_0_9__LowerCaseLetters_A_z__UpperCaseLetters_A_z__Dot_Hyphens____Underscore____AndSpace___ItCannotBeSetToNull = 40003,
  144:  
  145:             /// <summary/>
  146:             TheIndexAlreadyExists = 40004,
  147:  
  148:             /// <summary/>
  149:             AnNpSoftwareParameterDataRecordDoesNotExist_RunSetSesoftcfgToSetNpSoftwareParameters = 40011,
  150:  
  151:             /// <summary/>
  152:             TheRangeSpecifiedByBeginMsisdnAndEndMsisdnOverlapsWithAnExistingRange = 40022,
  153:  
  154:             /// <summary/>
  155:             TheEnteredValuesOfBeginMsisdnAndEndMsisdnHaveDifferentLengths = 40023,
  156:  
  157:             /// <summary/>
  158:             TheEnteredValueOfBeginMsisdnIsNotLessThanThatOfEndMsisdn = 40024,
  159:  
  160:             /// <summary/>
  161:             ThePossibleCauseMayBeOneOfTheFollowing_TheLinkBetweenTheUscdbAndTheSpsIsFaulty_TheNpRangeSwitchOnTheSpsIsClose = 40025,
  162:  
  163:             /// <summary/>
  164:             ThePossibleCauseMayBeOneOfTheFollowing_ThePpid180PublicParameterOfTheSpsIsSetToASmallValue_ThePpid180PublicParameterOfTheSpsIsSetToTheMaximumValue = 40026,
  165:  
  166:             /// <summary/>
  167:             TheNumberOfDataRecordsToBeQueriedExceedsTheLimit = 40027,
  168:  
  169:             /// <summary/>
  170:             TheDataRecordToBeDeletedDoesNotExist_AsAResult_TheDeletionFails = 40028,
  171:  
  172:             /// <summary/>
  173:             HlrAddressReferencedByAMnp_RangeCanNotBeDeleted = 40029,
  174:  
  175:             /// <summary/>
  176:             TheMnpRouteNumberBeingUsedByAMnp_RangeCanNotBeRemoved = 40030,
  177:  
  178:             /// <summary/>
  179:             TheHlrIndexCannotBeRemovedBecauseItIsUsedByAServiceSubscriberCommandAdapt = 40031,
  180:  
  181:             /// <summary/>
  182:  
  183:             /// <summary/>
  184:             TheMnpRouteNumberCannotBeRemovedBecauseItIsUsedByAServiceSubscriberCommandAdapt = 40032,
  185:  
  186:             /// <summary/>
  187:             LackingOfCompulsoryParameters2 = 45004,
  188:  
  189:             /// <summary/>
  190:             SpecifiedRecordNotFound2 = 45005,
  191:  
  192:             /// <summary/>
  193:             DescriptionInformationRepeated = 45138,
  194:  
  195:             /// <summary/>
  196:             RouteNumberAlreadyExists = 45558,
  197:  
  198:             /// <summary/>
  199:             InvalidParameterDesc = 40001,
  200:  
  201:             /// <summary/>
  202:             TheValueIsInvalid = 41007,
  203:  
  204:             /// <summary/>
  205:             NoMatchingResultIsFound = 43257,
  206:  
  207:             /// <summary/>
  208:             TheNumberOfNpUserExceedsTheLicensedNumber = 43435,
  209:  
  210:             /// <summary/>
  211:             TheNumberOfFnrUserExceedsTheLicensedNumber = 43436,
  212:  
  213:             /// <summary/>
  214:             TheLicenseForNpSubscriberDataStorageOnTheSpsHasExpired_ApplyForANewLicense = 43437,
  215:  
  216:             /// <summary/>
  217:             TheLicenseForFnrSubscriberDataStorageOnTheSpsHasExpired_ApplyForANewLicense = 43438,
  218:  
  219:             /// <summary/>
  220:             EnsureThatLinksBetweenTheUscdbAndTheSpsAreAvailable_TheP69SoftwareParameterForTheSpsIsCorrectlyConfigured_AndNpSubscriberDataStorageLicenseIsPurchased = 43439,
  221:  
  222:             /// <summary/>
  223:             EnsureThatLinksBetweenTheUscdbAndTheSpsAreAvailable_TheP69SoftwareParameterForTheSpsIsCorrectlyConfigured_AndFnrSubscriberDataStorageLicenseIsPurchased = 43440,
  224:  
  225:             /// <summary/>
  226:             EnsureThatTheNpSubscriberDataStorageLicenseIsPurchased = 43441,
  227:  
  228:             /// <summary/>
  229:             EnsureThatTheFnrSubscriberDataStorageLicenseIsPurchased = 43442
  230:         }
  231:  
  232:         ////////////////////////////////////////////////////////////////////////////
  233:  
  234:         /// <summary>
  235:         ///
  236:         /// </summary>
  237:         public Sps()
  238:         {
  239:             components = new System.ComponentModel.Container();
  240:  
  241:             Dart.Telnet.Option option1 = new Dart.Telnet.Option();
  242:             Dart.Telnet.Option option2 = new Dart.Telnet.Option();
  243:             Dart.Telnet.Option option3 = new Dart.Telnet.Option();
  244:             Dart.Telnet.Option option4 = new Dart.Telnet.Option();
  245:             Dart.Telnet.Option option5 = new Dart.Telnet.Option();
  246:  
  247:             telnet = new Dart.Telnet.Telnet(components);
  248:  
  249:             option1.Code = Dart.Telnet.OptionCode.SuppressGoAheads;
  250:             option2.Code = Dart.Telnet.OptionCode.WindowSize;
  251:             option2.SubOption = new byte[] { 0, 80, 0, 24 };
  252:             option3.Code = Dart.Telnet.OptionCode.TerminalType;
  253:             option3.SubOption = new byte[] { 0, 116, 116, 121 };
  254:             telnet.ClientOptions.AddRange(new Dart.Telnet.Option[] { option1, option2, option3 });
  255:  
  256:             option4.Code = Dart.Telnet.OptionCode.SuppressGoAheads;
  257:             option5.Code = Dart.Telnet.OptionCode.Echo;
  258:             telnet.ServerOptions.AddRange(new Dart.Telnet.Option[] { option4, option5 });
  259:  
  260:             telnet.SocketOption.ReceiveTimeout = 1000;
  261:             telnet.SynchronizingObject = null;
  262:             telnet.ClientOptionChanged += Telnet_ClientOptionChanged;
  263:             telnet.ServerOptionChanged += Telnet_ServerOptionChanged;
  264:             telnet.Data += Telnet_Data;
  265:             telnet.StateChanged += Telnet_StateChanged;
  266:             telnet.Log += Telnet_Log;
  267:             telnet.Error += Telnet_Error;
  268:  
  269:             telnetModel = new TelnetModel();
  270:  
  271:             // set non-serializable Telnet component
  272:             telnetModel.Telnet = telnet;
  273:             telnetModel.ReceiveLoopRequired = true;
  274:  
  275:             // subscribe to certificate events
  276:             telnetModel.CertificateRequested += new EventHandler<LocalCertificateEventArgs>(TelnetModel_CertificateRequested);
  277:             telnetModel.CertificatePresented += new EventHandler<RemoteCertificateEventArgs>(TelnetModel_CertificatePresented);
  278:  
  279:             /*
  280:             telnet = new Dart.Telnet.Telnet();
  281: 
  282:             telnet.ClientOptions.Add(new Dart.Telnet.Option(Dart.Telnet.OptionCode.SuppressGoAheads, null, Dart.Telnet.OptionState.RequestOn));
  283:             //telnet.ClientOptions.Add(new Dart.Telnet.Option(Dart.Telnet.OptionCode.TerminalType, new System.Byte[] { ((System.Byte)(0)), ((System.Byte)(116)), ((System.Byte)(116)), ((System.Byte)(121)) }, Dart.Telnet.OptionState.RequestOn)); // tty
  284:             telnet.ClientOptions.Add(new Dart.Telnet.Option(Dart.Telnet.OptionCode.TerminalType, new System.Byte[] { ((System.Byte)(0)), ((System.Byte)(120)), ((System.Byte)(116)), ((System.Byte)(101)), ((System.Byte)(114)), ((System.Byte)(109)) }, Dart.Telnet.OptionState.RequestOn)); // xterm
  285: 
  286:             telnet.ServerOptions.Add(new Dart.Telnet.Option(Dart.Telnet.OptionCode.SuppressGoAheads, null, Dart.Telnet.OptionState.RequestOn));
  287:             telnet.ServerOptions.Add(new Dart.Telnet.Option(Dart.Telnet.OptionCode.Echo, null, Dart.Telnet.OptionState.RequestOn));
  288:             telnet.ServerOptions.Add(new Dart.Telnet.Option(Dart.Telnet.OptionCode.OutputPageSize, null, Dart.Telnet.OptionState.RequestOn));
  289:             */
  290:  
  291:             //telnet.TerminalType = "tty";
  292:             //telnet.TerminalType = "xterm";
  293:  
  294:             ////telnet.EndReceive += new Dart.Telnet.SegmentEventHandler(this.Telnet_EndReceive);
  295:             ////telnet.ConnectedChangedEx += new Dart.Telnet.EventHandlerEx(this.Telnet_ConnectedChangedEx);
  296:  
  297:             ReceiveQueue = new Queue<string>(100);
  298:             SendQueue = new Queue<string>(100);
  299:  
  300:             IsLoggedIn = false;
  301:         }
  302:  
  303:         ////////////////////////////////////////////////////////////////////////////
  304:  
  305:         /// <summary>
  306:         ///
  307:         /// </summary>
  308:         ~Sps()
  309:         {
  310:             Dispose(true);
  311:         }
  312:  
  313:         ////////////////////////////////////////////////////////////////////////////
  314:  
  315:         /// <summary>
  316:         ///
  317:         /// </summary>
  318:         public Ia.Cl.Models.Result Connect()
  319:         {
  320:             var result = new Ia.Cl.Models.Result();
  321:  
  322:             // if a model with a matching server exists, remove it, then add it so that it is first in the list
  323:             telnetModel.Session.RemoteEndPoint = new IPEndPoint(Ia.Ftn.Cl.Models.Business.Huawei.Sps.Host, Ia.Ftn.Cl.Models.Business.Huawei.Sps.Port);
  324:             telnetModel.Credentials.Username = string.Empty; // txtUsername.Text;
  325:             telnetModel.Credentials.Password = string.Empty; // txtPassword.Text;
  326:             telnetModel.Credentials.CommandPrompt = string.Empty; // txtCommandPrompt.Text;
  327:             telnetModel.Credentials.UsernamePrompt = string.Empty; // txtLoginPrompt.Text;
  328:             telnetModel.Credentials.PasswordPrompt = string.Empty; // txtPasswordPrompt.Text;
  329:             telnetModel.SecurityType = SecurityType.None; // (SecurityType)cboSecurity.SelectedIndex;
  330:             telnetModel.SaveSession();
  331:  
  332:             if (telnetModel.Session.RemoteEndPoint.Port == 23)
  333:             {
  334:                 telnetModel.Telnet.ClientOptions.Add(new Option(OptionCode.SuppressGoAheads, null, OptionState.RequestOn));
  335:                 telnetModel.Telnet.ClientOptions.Add(new Option(OptionCode.WindowSize, new System.Byte[] { ((System.Byte)(0)), ((System.Byte)(80)), ((System.Byte)(0)), ((System.Byte)(24)) }, OptionState.RequestOn));
  336:                 telnetModel.Telnet.ClientOptions.Add(new Option(OptionCode.TerminalType, new System.Byte[] { ((System.Byte)(0)), ((System.Byte)(116)), ((System.Byte)(116)), ((System.Byte)(121)) }, OptionState.RequestOn));
  337:  
  338:                 telnetModel.Telnet.ServerOptions.Add(new Option(OptionCode.SuppressGoAheads, null, OptionState.RequestOn));
  339:                 telnetModel.Telnet.ServerOptions.Add(new Option(OptionCode.Echo, null, OptionState.RequestOn));
  340:                 telnetModel.Telnet.ServerOptions.Add(new Option(OptionCode.OutputPageSize, null, OptionState.RequestOn));
  341:             }
  342:             else
  343:             {
  344:                 telnetModel.Telnet.ClientOptions.Clear();
  345:                 telnetModel.Telnet.ServerOptions.Clear();
  346:             }
  347:  
  348:             // connect and receive data on a separate thread
  349:             telnet.Start(telnetModel.Connect, null);
  350:  
  351:             result.AddSuccess("Connected");
  352:  
  353:             return result;
  354:         }
  355:  
  356:         ////////////////////////////////////////////////////////////////////////////
  357:  
  358:         /// <summary>
  359:         ///
  360:         /// </summary>
  361:         public Ia.Cl.Models.Result Disconnect()
  362:         {
  363:             var result = new Ia.Cl.Models.Result();
  364:  
  365:             try
  366:             {
  367:                 telnetModel.Telnet.Close();
  368:  
  369:                 result.AddSuccess("Disconnected");
  370:             }
  371:             catch (Exception ex)
  372:             {
  373:                 result.AddError(ex.Message);
  374:             }
  375:  
  376:             return result;
  377:         }
  378:  
  379:         ////////////////////////////////////////////////////////////////////////////
  380:  
  381:         /// <summary>
  382:         ///
  383:         /// </summary>
  384:         public bool IsConnected
  385:         {
  386:             get
  387:             {
  388:                 return telnetModel.IsConnected;
  389:             }
  390:         }
  391:  
  392:         ////////////////////////////////////////////////////////////////////////////
  393:  
  394:         /// <summary>
  395:         ///
  396:         /// </summary>
  397:         protected /*override*/ void Dispose(bool disposing)
  398:         {
  399:             if (disposing)
  400:             {
  401:                 if (components != null)
  402:                 {
  403:                     components.Dispose();
  404:                 }
  405:             }
  406:  
  407:             //base.Dispose(disposing);
  408:         }
  409:  
  410:         ////////////////////////////////////////////////////////////////////////////
  411:  
  412:         /// <summary>
  413:         ///
  414:         /// </summary>
  415:         public void Login()
  416:         {
  417:             SendQueue.Enqueue(Ia.Ftn.Cl.Models.Business.Huawei.Sps.LoginUser);
  418:         }
  419:  
  420:         ////////////////////////////////////////////////////////////////////////////
  421:  
  422:         /// <summary>
  423:         ///
  424:         /// </summary>
  425:         public void Logout()
  426:         {
  427:             SendQueue.Enqueue(Ia.Ftn.Cl.Models.Business.Huawei.Sps.LogoutUser);
  428:         }
  429:  
  430:         ////////////////////////////////////////////////////////////////////////////
  431:  
  432:         /// <summary>
  433:         ///
  434:         /// </summary>
  435:         public Ia.Cl.Models.Result Send(string text)
  436:         {
  437:             var result = new Ia.Cl.Models.Result();
  438:  
  439:             try
  440:             {
  441:                 if (telnetModel.IsConnected)
  442:                 {
  443:                     if (!string.IsNullOrEmpty(text))
  444:                     {
  445:                         LastSentCommand = text;
  446:  
  447:                         // below: I have to put ';' before send or it will not run. I do not know why I have to do this
  448:                         //text = Ia.Ftn.Cl.Models.Business.Huawei.Sps.SemiColon + text;
  449:  
  450:                         telnetModel.WriteData(text + "\r\n"); // I added "\r\n", not sure if it will work with read server
  451:  
  452:                         Debug.WriteLine("Send() sent text: [" + text + "]");
  453:  
  454:                         result.AddSuccess("Sent: [" + text + "]");
  455:                     }
  456:                     else result.AddError("No text to send");
  457:                 }
  458:                 else
  459:                 {
  460:                     result.AddError("No established telnet connection");
  461:                     //if(processRunning) waitToConnectionCounter = waitToConnectionCounterSeconds;
  462:                 }
  463:             }
  464:             catch (Exception ex)
  465:             {
  466:                 result.AddError(ex.Message);
  467:             }
  468:  
  469:             return result;
  470:         }
  471:  
  472:         ////////////////////////////////////////////////////////////////////////////
  473:  
  474:         /// <summary>
  475:         ///
  476:         /// </summary>
  477:         private void Telnet_Data(object sender, DataEventArgs e)
  478:         {
  479:             string receiveString;
  480:  
  481:             Debug.WriteLine(" ");
  482:             Debug.WriteLine("============================================");
  483:  
  484:             Debug.WriteLine("Telnet_Data(): e.Segment: [" + e.Data.ToString() + "]");
  485:  
  486:             receiveString = e.Data.ToString();
  487:  
  488:             if (!string.IsNullOrEmpty(receiveString) && !string.IsNullOrWhiteSpace(receiveString))
  489:             {
  490:                 ReceiveQueue.Enqueue(receiveString);
  491:             }
  492:             else
  493:             {
  494:  
  495:             }
  496:  
  497:             ////if (telnet.Connected) telnet.BeginReceive(buffer);
  498:  
  499:             Debug.WriteLine("============================================");
  500:             Debug.WriteLine(" ");
  501:         }
  502:  
  503:         ////////////////////////////////////////////////////////////////////////////
  504:  
  505:         /// <summary>
  506:         ///
  507:         /// </summary>
  508:         private void Telnet_StateChanged(object sender, EventArgs e)
  509:         {
  510:             // always raised when connection is established or closed (state property changes)
  511:             switch (telnetModel.Telnet.State)
  512:             {
  513:                 case ConnectionState.Connected:
  514:                 case ConnectionState.ConnectedAndSecure: break;
  515:                 case ConnectionState.Closed: break;
  516:             }
  517:         }
  518:  
  519:         ////////////////////////////////////////////////////////////////////////////
  520:  
  521:         /// <summary>
  522:         ///
  523:         /// </summary>
  524:         private void Telnet_ClientOptionChanged(object sender, OptionEventArgs e)
  525:         {
  526:         }
  527:  
  528:         ////////////////////////////////////////////////////////////////////////////
  529:  
  530:         /// <summary>
  531:         ///
  532:         /// </summary>
  533:         private void Telnet_ServerOptionChanged(object sender, OptionEventArgs e)
  534:         {
  535:         }
  536:  
  537:         ////////////////////////////////////////////////////////////////////////////
  538:  
  539:         /// <summary>
  540:         ///
  541:         /// </summary>
  542:         private void Telnet_Error(object sender, Dart.Telnet.ErrorEventArgs e)
  543:         {
  544:         }
  545:  
  546:         ////////////////////////////////////////////////////////////////////////////
  547:  
  548:         /// <summary>
  549:         ///
  550:         /// </summary>
  551:         private void Telnet_Log(object sender, DataEventArgs e)
  552:         {
  553:             // e.Data;
  554:         }
  555:  
  556:         ////////////////////////////////////////////////////////////////////////////
  557:  
  558:         /// <summary>
  559:         ///
  560:         /// </summary>
  561:         void TelnetModel_CertificateRequested(object sender, LocalCertificateEventArgs e)
  562:         {
  563:         }
  564:  
  565:         ////////////////////////////////////////////////////////////////////////////
  566:  
  567:         /// <summary>
  568:         ///
  569:         /// </summary>
  570:         void TelnetModel_CertificatePresented(object sender, RemoteCertificateEventArgs e)
  571:         {
  572:         }
  573:  
  574:         ////////////////////////////////////////////////////////////////////////////
  575:  
  576:         /// <summary>
  577:         ///
  578:         /// </summary>
  579:         public void Update(string rowData, ref Ia.Ftn.Cl.Models.Client.Huawei.Sps sps, out Ia.Cl.Models.Result result)
  580:         {
  581:             Ia.Ftn.Cl.Models.Data.Huawei.Sps.UpdateDatabaseWithSpsCommandOutput(rowData, ref sps, out result);
  582:         }
  583:  
  584:         ////////////////////////////////////////////////////////////////////////////
  585:         ////////////////////////////////////////////////////////////////////////////
  586:     }
  587:  
  588:     ////////////////////////////////////////////////////////////////////////////
  589:     ////////////////////////////////////////////////////////////////////////////
  590: }