)>}]
شركة التطبيقات المتكاملة لتصميم وبرمجة البرمجيات الخاصة ش.ش.و.
Integrated Applications Programming Company
Home » Code Library » Sps (Ia.Ftn.Cl.Model.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.PowerTCP.Telnet;
    2: using System;
    3: using System.Collections.Generic;
    4: using System.Diagnostics;
    5:  
    6: namespace Ia.Ftn.Cl.Model.Client.Huawei
    7: {
    8:     ////////////////////////////////////////////////////////////////////////////
    9:  
   10:     /// <summary publish="true">
   11:     /// Signaling Service Processing System (SPS) support class for Huawei's Fixed Telecommunications Network (FTN) SPS client model.
   12:     /// </summary>
   13:     /// 
   14:     /// <remarks> 
   15:     /// Copyright © 2018-2019 Jasem Y. Al-Shamlan (info@ia.com.kw), Integrated Applications - Kuwait. All Rights Reserved.
   16:     ///
   17:     /// 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
   18:     /// the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
   19:     ///
   20:     /// This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
   21:     /// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
   22:     /// 
   23:     /// You should have received a copy of the GNU General Public License along with this library. If not, see http://www.gnu.org/licenses.
   24:     /// 
   25:     /// Copyright notice: This notice may not be removed or altered from any source distribution.
   26:     /// </remarks> 
   27:     public class Sps
   28:     {
   29:         private byte[] buffer = new byte[1024];
   30:         internal Telnet telnet;
   31:  
   32:         /// <summary/>
   33:         public static int WaitAfterSendInMillisecond { get { return 4000; } }
   34:  
   35:         /// <summary/>
   36:         public static int WaitAfterSendForCfgCommandInMillisecond { get { return 10000; } }
   37:  
   38:         /// <summary/>
   39:         public string LastSentCommand { get; private set; }
   40:  
   41:         /// <summary/>
   42:         public Queue<string> ReceiveQueue { get; set; }
   43:  
   44:         /// <summary/>
   45:         public Queue<string> SendQueue { get; set; }
   46:  
   47:         ////////////////////////////////////////////////////////////////////////////
   48:  
   49:         /// <summary>
   50:         ///
   51:         /// </summary>
   52:         public enum ResultCode
   53:         {
   54:             /*
   55:              * 9 Collection of Error Codes
   56:              * 9.1 Collection of NP Service Related Error Codes
   57:              * Error Code  Description
   58:              */
   59:  
   60:             OperationIsSuccessful = 0,
   61:             InvalidCommand = 1001,
   62:             InvalidParameterValue__Xxx__For__Yyy__ = 1004,
   63:             ParameterMissing__Yyy__ = 1009,
   64:             DatabaseOperationFailed = 5000,
   65:             LackingOfCompulsoryParameters = 5004,
   66:             SpecifiedRecordNotFound = 5005,
   67:             UserNumberRepeated = 5526,
   68:             TheMnpRouteNumberBeingUsedByMnpUserCanNotBeRemoved = 5579,
   69:             RoutingNumberTypeDoesNotMatchTheMnpUser = 5591,
   70:             HlrNumberTypeDoesNotMatchTheMnpUser = 5592,
   71:             InvalidRnIndex = 5593,
   72:             AtLeastOneOfTheServicesMustBeRegistered = 5594,
   73:             HlrAddressReferencedByAMnpUserCanNotBeDeleted = 5600,
   74:             InvalidHlrIndex = 5602,
   75:             UserImsiNumberCannotBeSameWithExist = 5855,
   76:             TheNpRoutingIndexGivenDoesNotMatch = 5878,
   77:             SystemError = 6000,
   78:             WhenRouteIndexTypeIsSetToRouteNumberIndex_HlrNumberIndexMustBeSetTo65535 = 6015,
   79:             RnNumberIndexMustBe65535WhenRoutingIndexTypeIsHlrAddressIndex = 6018,
   80:             TheNumberOfTheCurrentSubscribersImsisReachesTheLimit = 6300,
   81:             TheCurrentSubscriberUsesMultipleImsis_IfYouWantToChangeAnImsi_RunRmvSeruattrToDeleteThisImsiAndThenRunAddSeruattrToAddAnImsi = 6301,
   82:             WhenNumberTypeIsSetTo_GsmNumberPortedToCdma_Or_CdmaNumberPortedToGsm__RoutingIndexTypeMustBeSetToAll = 7001,
   83:             WhenNumberTypeIsSetTo_LocalFixedNetwork__RoutingIndexTypeMustBeSetTo_RouteNumberIndex = 7300,
   84:             InvalidRoutingNumber = 7369,
   85:             TheInputParameterNameCanContainOnlyDigits_0_9__LowerCaseLetters_A_z__UpperCaseLetters_A_z__Dot_Hyphens____Underscore____AndSpace___ItCannotBeSetToNull = 40003,
   86:             TheIndexAlreadyExists = 40004,
   87:             AnNpSoftwareParameterDataRecordDoesNotExist_RunSetSesoftcfgToSetNpSoftwareParameters = 40011,
   88:             TheRangeSpecifiedByBeginMsisdnAndEndMsisdnOverlapsWithAnExistingRange = 40022,
   89:             TheEnteredValuesOfBeginMsisdnAndEndMsisdnHaveDifferentLengths = 40023,
   90:             TheEnteredValueOfBeginMsisdnIsNotLessThanThatOfEndMsisdn = 40024,
   91:             ThePossibleCauseMayBeOneOfTheFollowing_TheLinkBetweenTheUscdbAndTheSpsIsFaulty_TheNpRangeSwitchOnTheSpsIsClose = 40025,
   92:             ThePossibleCauseMayBeOneOfTheFollowing_ThePpid180PublicParameterOfTheSpsIsSetToASmallValue_ThePpid180PublicParameterOfTheSpsIsSetToTheMaximumValue = 40026,
   93:             TheNumberOfDataRecordsToBeQueriedExceedsTheLimit = 40027,
   94:             TheDataRecordToBeDeletedDoesNotExist_AsAResult_TheDeletionFails = 40028,
   95:             HlrAddressReferencedByAMnp_RangeCanNotBeDeleted = 40029,
   96:             TheMnpRouteNumberBeingUsedByAMnp_RangeCanNotBeRemoved = 40030,
   97:             TheHlrIndexCannotBeRemovedBecauseItIsUsedByAServiceSubscriberCommandAdapt = 40031,
   98:             TheMnpRouteNumberCannotBeRemovedBecauseItIsUsedByAServiceSubscriberCommandAdapt = 40032,
   99:             LackingOfCompulsoryParameters2 = 45004,
  100:             SpecifiedRecordNotFound2 = 45005,
  101:             DescriptionInformationRepeated = 45138,
  102:             RouteNumberAlreadyExists = 45558,
  103:             InvalidParameterDesc = 40001,
  104:             TheValueIsInvalid = 41007,
  105:             NoMatchingResultIsFound = 43257,
  106:             TheNumberOfNpUserExceedsTheLicensedNumber = 43435,
  107:             TheNumberOfFnrUserExceedsTheLicensedNumber = 43436,
  108:             TheLicenseForNpSubscriberDataStorageOnTheSpsHasExpired_ApplyForANewLicense = 43437,
  109:             TheLicenseForFnrSubscriberDataStorageOnTheSpsHasExpired_ApplyForANewLicense = 43438,
  110:             EnsureThatLinksBetweenTheUscdbAndTheSpsAreAvailable_TheP69SoftwareParameterForTheSpsIsCorrectlyConfigured_AndNpSubscriberDataStorageLicenseIsPurchased = 43439,
  111:             EnsureThatLinksBetweenTheUscdbAndTheSpsAreAvailable_TheP69SoftwareParameterForTheSpsIsCorrectlyConfigured_AndFnrSubscriberDataStorageLicenseIsPurchased = 43440,
  112:             EnsureThatTheNpSubscriberDataStorageLicenseIsPurchased = 43441,
  113:             EnsureThatTheFnrSubscriberDataStorageLicenseIsPurchased = 43442
  114:         }
  115:  
  116:         ////////////////////////////////////////////////////////////////////////////
  117:  
  118:         /// <summary>
  119:         ///
  120:         /// </summary>
  121:         public Sps()
  122:         {
  123:             telnet = new Dart.PowerTCP.Telnet.Telnet();
  124:  
  125:             telnet.ClientOptions.Add(new Dart.PowerTCP.Telnet.Option(Dart.PowerTCP.Telnet.OptionCode.SuppressGoAheads, null, Dart.PowerTCP.Telnet.OptionState.RequestOn));
  126:             //telnet.ClientOptions.Add(new Dart.PowerTCP.Telnet.Option(Dart.PowerTCP.Telnet.OptionCode.TerminalType, new System.Byte[] { ((System.Byte)(0)), ((System.Byte)(116)), ((System.Byte)(116)), ((System.Byte)(121)) }, Dart.PowerTCP.Telnet.OptionState.RequestOn)); // tty
  127:             telnet.ClientOptions.Add(new Dart.PowerTCP.Telnet.Option(Dart.PowerTCP.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.PowerTCP.Telnet.OptionState.RequestOn)); // xterm
  128:  
  129:             telnet.ServerOptions.Add(new Dart.PowerTCP.Telnet.Option(Dart.PowerTCP.Telnet.OptionCode.SuppressGoAheads, null, Dart.PowerTCP.Telnet.OptionState.RequestOn));
  130:             telnet.ServerOptions.Add(new Dart.PowerTCP.Telnet.Option(Dart.PowerTCP.Telnet.OptionCode.Echo, null, Dart.PowerTCP.Telnet.OptionState.RequestOn));
  131:             telnet.ServerOptions.Add(new Dart.PowerTCP.Telnet.Option(Dart.PowerTCP.Telnet.OptionCode.OutputPageSize, null, Dart.PowerTCP.Telnet.OptionState.RequestOn));
  132:  
  133:             //telnet.TerminalType = "tty";
  134:             telnet.TerminalType = "xterm";
  135:  
  136:             telnet.EndReceive += new Dart.PowerTCP.Telnet.SegmentEventHandler(this.Telnet_EndReceive);
  137:             telnet.ConnectedChangedEx += new Dart.PowerTCP.Telnet.EventHandlerEx(this.Telnet_ConnectedChangedEx);
  138:  
  139:             ReceiveQueue = new Queue<string>(100);
  140:             SendQueue = new Queue<string>(100);
  141:  
  142:             IsLoggedIn = false;
  143:         }
  144:  
  145:         ////////////////////////////////////////////////////////////////////////////
  146:  
  147:         /// <summary>
  148:         ///
  149:         /// </summary>
  150:         ~Sps()
  151:         {
  152:             Dispose();
  153:         }
  154:  
  155:         ////////////////////////////////////////////////////////////////////////////
  156:  
  157:         /// <summary>
  158:         ///
  159:         /// </summary>
  160:         public void Connect(out Ia.Cl.Models.Result result)
  161:         {
  162:             result = new Ia.Cl.Models.Result();
  163:  
  164:             try
  165:             {
  166:                 telnet.Connect(Ia.Ftn.Cl.Model.Business.Huawei.Sps.Host, Ia.Ftn.Cl.Model.Business.Huawei.Sps.Port.ToString());
  167:  
  168:                 // receive using asynchronous technique
  169:                 telnet.ReceiveTimeout = 0;
  170:                 telnet.BeginReceive(buffer);
  171:  
  172:                 result.AddSuccess("Connected. ");
  173:             }
  174:             catch (Exception ex)
  175:             {
  176:                 result.AddError("Exception: " + ex.Message);
  177:  
  178:                 telnet.Close();
  179:             }
  180:         }
  181:  
  182:         ////////////////////////////////////////////////////////////////////////////
  183:  
  184:         /// <summary>
  185:         ///
  186:         /// </summary>
  187:         public void Disconnect(out Ia.Cl.Models.Result result)
  188:         {
  189:             result = new Ia.Cl.Models.Result();
  190:  
  191:             try
  192:             {
  193:                 telnet.Close();
  194:  
  195:                 result.AddSuccess("Disconnected. ");
  196:             }
  197:             catch (Exception ex)
  198:             {
  199:                 result.AddError(ex.Message);
  200:             }
  201:         }
  202:  
  203:         ////////////////////////////////////////////////////////////////////////////
  204:  
  205:         /// <summary>
  206:         ///
  207:         /// </summary>
  208:         public bool IsConnected
  209:         {
  210:             get
  211:             {
  212:                 return telnet != null && telnet.Connected;
  213:             }
  214:         }
  215:  
  216:         ////////////////////////////////////////////////////////////////////////////
  217:  
  218:         /// <summary>
  219:         ///
  220:         /// </summary>
  221:         public bool IsLoggedIn { get; set; }
  222:  
  223:         ////////////////////////////////////////////////////////////////////////////
  224:  
  225:         /// <summary>
  226:         ///
  227:         /// </summary>
  228:         public void Dispose()
  229:         {
  230:             telnet.Dispose();
  231:         }
  232:  
  233:         ////////////////////////////////////////////////////////////////////////////
  234:  
  235:         /// <summary>
  236:         ///
  237:         /// </summary>
  238:         public void Login()
  239:         {
  240:             SendQueue.Enqueue(Ia.Ftn.Cl.Model.Business.Huawei.Sps.LoginUser);
  241:         }
  242:  
  243:         ////////////////////////////////////////////////////////////////////////////
  244:  
  245:         /// <summary>
  246:         ///
  247:         /// </summary>
  248:         public void Logout()
  249:         {
  250:             SendQueue.Enqueue(Ia.Ftn.Cl.Model.Business.Huawei.Sps.LogoutUser);
  251:         }
  252:  
  253:         ////////////////////////////////////////////////////////////////////////////
  254:  
  255:         /// <summary>
  256:         ///
  257:         /// </summary>
  258:         public void Send(string text, out Ia.Cl.Models.Result result)
  259:         {
  260:             result = new Ia.Cl.Models.Result();
  261:  
  262:             try
  263:             {
  264:                 if (telnet.Connected)
  265:                 {
  266:                     if (text != null)
  267:                     {
  268:                         LastSentCommand = text;
  269:  
  270:                         // below: I have to put ';' before send or it will not run. I do not know why I have to do this
  271:                         text = Ia.Ftn.Cl.Model.Business.Huawei.Sps.SemiColon + text;
  272:  
  273:                         telnet.Send(text);
  274:  
  275:                         Debug.WriteLine("Send() sent text: [" + text + "]");
  276:  
  277:                         result.AddSuccess("Sent: [" + text + "]");
  278:                     }
  279:                     else
  280:                     {
  281:                         result.AddError("No text to send. ");
  282:                     }
  283:                 }
  284:                 else
  285:                 {
  286:                     result.AddError("No established telnet connection. ");
  287:                     //if(processRunning) waitToConnectionCounter = waitToConnectionCounterSeconds;
  288:                 }
  289:             }
  290:             catch (Exception ex)
  291:             {
  292:                 result.AddError(ex.Message);
  293:             }
  294:         }
  295:  
  296:         ////////////////////////////////////////////////////////////////////////////
  297:  
  298:         /// <summary>
  299:         ///
  300:         /// </summary>
  301:         private void Telnet_EndReceive(object sender, Dart.PowerTCP.Telnet.SegmentEventArgs e)
  302:         {
  303:             string receiveString;
  304:  
  305:             Debug.WriteLine(" ");
  306:             Debug.WriteLine("============================================");
  307:  
  308:             if (e.Exception == null)
  309:             {
  310:                 Debug.WriteLine("Telnet_EndReceive(): e.Segment: [" + e.Segment.ToString() + "]");
  311:  
  312:                 receiveString = e.Segment.ToString();
  313:  
  314:                 if (!string.IsNullOrEmpty(receiveString) && !string.IsNullOrWhiteSpace(receiveString))
  315:                 {
  316:                     ReceiveQueue.Enqueue(receiveString);
  317:                 }
  318:                 else
  319:                 {
  320:  
  321:                 }
  322:  
  323:                 if (telnet.Connected) telnet.BeginReceive(buffer);
  324:             }
  325:             else
  326:             {
  327:                 Debug.WriteLine("Telnet_EndReceive(): Exception: " + e.Exception.Message);
  328:  
  329:                 // I will not throw or handle the exception from the event handler
  330:                 // https://stackoverflow.com/questions/3114543/should-event-handlers-in-c-sharp-ever-raise-exceptions
  331:                 //throw new Exception("Telnet_EndReceive(): " + e.Exception.Message);
  332:             }
  333:  
  334:             Debug.WriteLine("============================================");
  335:             Debug.WriteLine(" ");
  336:         }
  337:  
  338:         ////////////////////////////////////////////////////////////////////////////
  339:  
  340:         /// <summary>
  341:         ///
  342:         /// </summary>
  343:         private void Telnet_ConnectedChangedEx(object sender, System.EventArgs e)
  344:         {
  345:  
  346:         }
  347:  
  348:         ////////////////////////////////////////////////////////////////////////////
  349:  
  350:         /// <summary>
  351:         ///
  352:         /// </summary>
  353:         public void Update(string rowData, ref Ia.Ftn.Cl.Model.Client.Huawei.Sps sps, out Ia.Cl.Models.Result result)
  354:         {
  355:             Ia.Ftn.Cl.Model.Data.Huawei.Sps.UpdateDatabaseWithSpsCommandOutput(rowData, ref sps, out result);
  356:         }
  357:  
  358:         ////////////////////////////////////////////////////////////////////////////
  359:         ////////////////////////////////////////////////////////////////////////////
  360:     }
  361:  
  362:     ////////////////////////////////////////////////////////////////////////////
  363:     ////////////////////////////////////////////////////////////////////////////
  364: }