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