شركة التطبيقات المتكاملة لتصميم النظم البرمجية الخاصة

Integrated Applications Programming Company

Skip Navigation Links

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

Nokia's Siemens EWSD support class of Next Generation Network'a (NGN's) business model.

   1:  using System;
   2:  using System.Collections.Generic;
   3:  using System.IO;
   4:  using System.Linq;
   5:  using System.Text.RegularExpressions;
   6:   
   7:  namespace Ia.Ngn.Cl.Model.Business.Nokia
   8:  {
   9:      ////////////////////////////////////////////////////////////////////////////
  10:   
  11:      /// <summary publish="true">
  12:      /// Nokia's Siemens EWSD support class of Next Generation Network'a (NGN's) business model.
  13:      /// </summary>
  14:      /// 
  15:      /// <remarks> 
  16:      /// Copyright © 2018-2019 Jasem Y. Al-Shamlan (info@ia.com.kw), Internet 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 SiemensEwsd
  29:      {
  30:          private static Queue<int> serviceQueue = new Queue<int>();
  31:   
  32:          /// <summary/>
  33:          public enum Opcode { Dispsub, Cansub }
  34:   
  35:          public static List<string> ServiceSymbolList { get; } = new List<string>();
  36:   
  37:          ////////////////////////////////////////////////////////////////////////////
  38:   
  39:          /// <summary>
  40:          ///
  41:          /// </summary>
  42:          public enum ResultCode
  43:          {
  44:              OperationIsSuccessful = 0,
  45:              OperationFailed = 1,
  46:              ObjectNotASubscriber = 2,
  47:              ObjectNotConnected = 3
  48:          }
  49:   
  50:          ////////////////////////////////////////////////////////////////////////////
  51:   
  52:          /// <summary>
  53:          ///
  54:          /// </summary>
  55:          public SiemensEwsd() { }
  56:   
  57:          ////////////////////////////////////////////////////////////////////////////
  58:   
  59:          /// <summary>
  60:          ///
  61:          /// </summary>
  62:          public static int ProperlySelectedSingleServiceQueueServiceNumber(List<string> pstnSiteNameList)
  63:          {
  64:              int service;
  65:              List<int> list;
  66:   
  67:              service = 0;
  68:   
  69:              if (serviceQueue.Count == 0)
  70:              {
  71:                  list = new List<int>();
  72:   
  73:                  foreach (string pstnSiteName in pstnSiteNameList)
  74:                  {
  75:                      list.AddRange(AllPossiblePstnServiceNumbersWithinPstnSite(pstnSiteName));
  76:                  }
  77:   
  78:                  serviceQueue = new Queue<int>(list.Shuffle()); //.OrderBy(o => o));
  79:              }
  80:   
  81:              if (serviceQueue.Count > 0) service = serviceQueue.Dequeue();
  82:   
  83:              return service;
  84:          }
  85:   
  86:          ////////////////////////////////////////////////////////////////////////////
  87:   
  88:          /// <summary>
  89:          ///
  90:          /// </summary>
  91:          public static List<int> AllPossiblePstnServiceNumbersWithinPstnSite(string pstnSiteName)
  92:          {
  93:              List<int> servicelist;
  94:              HashSet<int> hashSet;
  95:   
  96:              servicelist = Ia.Ngn.Cl.Model.Data.Service.AllPossiblePstnServiceNumbersWithinPstnSite(pstnSiteName);
  97:   
  98:              hashSet = new HashSet<int>(servicelist);
  99:   
 100:              return hashSet.OrderBy(u => u).ToList();
 101:          }
 102:   
 103:          ////////////////////////////////////////////////////////////////////////////
 104:   
 105:          /// <summary>
 106:          /// 
 107:          /// </summary>
 108:          public static Ia.Ngn.Cl.Model.Business.Service.ServiceSupplementaryService ServiceSupplementaryServiceStateFromServiceNetManagerOutputString(string outputContent)
 109:          {
 110:              string matchedText, line;
 111:              Match m;
 112:              Ia.Ngn.Cl.Model.Business.Service.ServiceSupplementaryService serviceSupplementaryService;
 113:   
 114:              serviceSupplementaryService = new Ia.Ngn.Cl.Model.Business.Service.ServiceSupplementaryService();
 115:   
 116:              /*
 117:  ******************************************************************************************************
 118:  Sample Subscriber Information:
 119:  
 120:  QRN/QRN/KUWCPK1V5140P047/106                          19-06-26  10:39:40
 121:  3324  NetM         ROMMEL07           2816/03800 
 122:  
 123:  DISPSUB:DN=25421113;                                          
 124:  
 125:                                                              MASKNO:03800 
 126:  LAC    = 01     DN     = 25421113     EQN    =   20- 2-12-14 
 127:     CAT      = MS                                            MASKNO:03774 
 128:     OPTRCL   = 2                                             MASKNO:03798 
 129:     SUBTRCL  = 2   
 130:     NUMCAL   = 1                                             MASKNO:08641 
 131:     ORIG1    = 5                                 
 132:     TRARSTR  = TRACLACT                                      MASKNO:03803 
 133:     LNATT    = PB                                            MASKNO:03787 
 134:     COS      = CLIP     FSK                                  MASKNO:03777 
 135:     ADDINF   = KEYWORD                                       MASKNO:03772 
 136:  
 137:  END JOB 3324
 138:  
 139:  
 140:  ******************************************************************************************************
 141:  
 142:              OPTRCL   = 2 ---> WITHOUT INTERNATIONAL CALL ENTERED BY OPERATOR
 143:  OPTRCL   = 0 ---> WITH INTERNATIONAL CALL ENTERED BY OPERATOR
 144:  
 145:  SUBTRCL  = 2 ---> WITHOUT INTERNATIONAL CALL MODIFIED BY SUBSCRIBER
 146:  SUBTRCL  = 0 ---> WITH INTERNATIONAL CALL MODIFIED BY SUBSCRIBER
 147:  
 148:  TRARSTR  = ACTTRACL TRACLACT ---> TRAFFIC RESTRATION FEATURES IS ACTIVATED (SUBSCRIBER CAN OPEN AND CLOSE INTERNATIONAL CALL)
 149:  
 150:  DIV      = DIVI     DIVIMOD  DDVIN  ---> DIVERSATION IMMIDIATE FEATURES IS ASSIGNED TO SUBSCRIBER
 151:  DIV      = ACTDIVI -9793XXXX  ---> SUBSCRIBER IMMEDIATELY DIVERTED TO GIVEN NUMBER
 152:  
 153:  COS      = ACTCW ---> CALL WAITING FEATURE ACTIVATED
 154:  COS      = CWACT ---> CALL WAITING ACTIVATION/DEACTIVATION VIA SUBSCRIBER CONTROL INPUT
 155:  COS      = CONF3 ---> 3 PARTY CALLFERENCING FEATURE ACTIVATED
 156:  COS      = PROP8 ---> ALARM CALL SERVICE FEATURE IS ACTIVATED
 157:  COS      = CLIP FSK ---> CALLER ID FEATURES IS ACTIVATED
 158:  
 159:  ADDINF   = KEYWORD ---> SUBSCRIBER HAS PIN
 160:    NOTE: TO CHECK THE SUBSCRIBER PIN (PASSWORD) THE COMMAND IS 
 161:           DISPKEYWORD:DN=25421113;
 162:             
 163:  BLK      = ACCSUSP  ---> SUBSCRIBER ACCOUNT SUSPENDED  NOT PAYING THE BILL
 164:  BLK      = ADMIN    ---> SUBSCRIBER ACCOUNT SUSPENDED  NOT PAYING THE BILL
 165:  BLK      = ADMIN1, ADMIN2, ADMIN3  ---> SUBSCRIBER ACCOUNT SUSPENDED OTHER REASON
 166:               */
 167:   
 168:   
 169:              /*
 170:  2019-07-25 08:52:54: ServiceSymbolList(): Service symbol list: CAT = MS, LTT = COSLAC2, OPTRCL = 2,NUMCAL = 1, ORIG1 = 5, LNATT = PB, COS = CLIP FSK, SUBTRCL = 2, DIV = DIVI DIVIMOD DDVIN, BLK = ACCSUSP, TRARSTR = ACTTRACL TRACLACT, COS = ACTCW CONF3 CWACT PROP8 CLIP, OPTRCL = 0, TRARSTR = TRACLACT, COS = CONF3 CWACT PROP8 CLIP FSK, ADDINF = KEYWORD, BLK = ACCSUSP ADMIN1, TRARSTR = REQSPORI REQSPTER, DIV = ACTDIVI -25435105, LTT = COSLAC1, DIV = ACTDIVI -97669578, BLK = ADMIN2, BLK = ADMIN1, DIV = ACTDIVI -23847000, COS = ACTCW CWACT, DIV = ACTDIVI -99199951, DIV = ACTDIVI -50229969, DIV = ACTDIVI -25430752, DIV = DIVI -1999, DIV = ACTDIVI -50867669, DIV = ACTDIVI -22255495, SUBTRCL = 5, DIV = ACTDIVI -94130075, DIV = ACTDIVI -22210169, DIV = ACTDIVI -96608155, DIV = ACTDIVI -96006498, DIV = ACTDIVI -98941899, BLK = ADMIN3, DIV = ACTDIVI -99000064, DIV = ACTDIVI -22255406, DIV = ACTDIVI-99235351, DIV = ACTDIVI -22255409, DIV = ACTDIVI -50674818, DIV = ACTDIVI -22210925, TRARSTR = ACTTRACL TRACLACT TRACLMOD, DIV = ACTDIVI -22255407, DIV = ACTDIVI -50495160, DIV = ACTDIVI -55157777,OPTRCL = 5, BLK = ACCSUSP ADMIN2, DIV = ACTDIVI -1885050, TRARSTR = ACTTRACL REQSPORI REQSPTER TRACL
 171:  ACT
 172:               */
 173:   
 174:              m = Regex.Match(outputContent, @"DISPSUB:DN=(\d{8});");
 175:   
 176:              if (m.Success)
 177:              {
 178:                  matchedText = m.Groups[1].Value;
 179:   
 180:                  if (int.TryParse(matchedText, out int dn))
 181:                  {
 182:                      serviceSupplementaryService.Service = dn;
 183:   
 184:                      using (StringReader reader = new StringReader(outputContent))
 185:                      {
 186:                          while ((line = reader.ReadLine()) != null)
 187:                          {
 188:                              // COS      = CLIP FSK ---> CALLER ID FEATURES IS ACTIVATED
 189:                              m = Regex.Match(line, @"COS.+CLIP.+FSK");
 190:                              if (m.Success) serviceSupplementaryService.SupplementaryServiceList.Add(Ia.Ngn.Cl.Model.Business.Service.SupplementaryService.CallerId);
 191:   
 192:                              // COS      = ACTCW ---> CALL WAITING FEATURE ACTIVATED
 193:                              m = Regex.Match(line, @"COS.+ACTCW");
 194:                              if (m.Success) serviceSupplementaryService.SupplementaryServiceList.Add(Ia.Ngn.Cl.Model.Business.Service.SupplementaryService.CallWaiting);
 195:   
 196:                              // COS      = CWACT ---> CALL WAITING ACTIVATION/DEACTIVATION VIA SUBSCRIBER CONTROL INPUT
 197:                              m = Regex.Match(line, @"COS.+CWACT");
 198:                              if (m.Success) serviceSupplementaryService.SupplementaryServiceList.Add(Ia.Ngn.Cl.Model.Business.Service.SupplementaryService.CallWaiting);
 199:   
 200:                              // COS      = CONF3 ---> 3 PARTY CALLFERENCING FEATURE ACTIVATED
 201:                              m = Regex.Match(line, @"COS.+CONF3");
 202:                              if (m.Success) serviceSupplementaryService.SupplementaryServiceList.Add(Ia.Ngn.Cl.Model.Business.Service.SupplementaryService.ConferenceCall);
 203:   
 204:                              // COS      = PROP8 ---> ALARM CALL SERVICE FEATURE IS ACTIVATED
 205:                              m = Regex.Match(line, @"COS.+PROP8");
 206:                              if (m.Success) serviceSupplementaryService.SupplementaryServiceList.Add(Ia.Ngn.Cl.Model.Business.Service.SupplementaryService.WakeupCall);
 207:   
 208:                              // DIV      = DIVI     DIVIMOD  DDVIN  ---> DIVERSATION IMMIDIATE FEATURES IS ASSIGNED TO SUBSCRIBER
 209:                              m = Regex.Match(line, @"DIV.+DIVI.+DIVIMOD.+DDVIN");
 210:                              if (m.Success) serviceSupplementaryService.SupplementaryServiceList.Add(Ia.Ngn.Cl.Model.Business.Service.SupplementaryService.CallForwarding);
 211:   
 212:                              // DIV      = ACTDIVI -9793XXXX  ---> SUBSCRIBER IMMEDIATELY DIVERTED TO GIVEN NUMBER
 213:                              m = Regex.Match(line, @"DIV\s+=.+ACTDIVI.+-(\d{8})");
 214:                              if (m.Success) serviceSupplementaryService.Pin = m.Value;
 215:   
 216:                              // OPTRCL   = 0 ---> WITH INTERNATIONAL CALL ENTERED BY OPERATOR
 217:                              // OPTRCL   = 2 ---> WITHOUT INTERNATIONAL CALL ENTERED BY OPERATOR
 218:                              m = Regex.Match(line, @"OPTRCL\s+=\s+0");
 219:                              if (m.Success) serviceSupplementaryService.SupplementaryServiceList.Add(Ia.Ngn.Cl.Model.Business.Service.SupplementaryService.InternationalCalling);
 220:   
 221:                              // TRARSTR  = ACTTRACL TRACLACT ---> TRAFFIC RESTRATION FEATURES IS ACTIVATED (SUBSCRIBER CAN OPEN AND CLOSE INTERNATIONAL CALL)
 222:                              m = Regex.Match(line, @"TRARSTR.+ACTTRACL.+TRACLACT");
 223:                              if (m.Success) serviceSupplementaryService.SupplementaryServiceList.Add(Ia.Ngn.Cl.Model.Business.Service.SupplementaryService.InternationalCallingUserControlled);
 224:   
 225:                              // SUBTRCL  = 0 ---> WITH INTERNATIONAL CALL MODIFIED BY SUBSCRIBER
 226:                              // SUBTRCL  = 2 ---> WITHOUT INTERNATIONAL CALL MODIFIED BY SUBSCRIBER
 227:                              m = Regex.Match(line, @"SUBTRCL\s+=\s+0");
 228:                              if (m.Success) serviceSupplementaryService.InternationalCallingUserControlledActivated = true;
 229:   
 230:                              // BLK      = ACCSUSP  ---> SUBSCRIBER ACCOUNT SUSPENDED  NOT PAYING THE BILL
 231:                              // BLK      = ADMIN    ---> SUBSCRIBER ACCOUNT SUSPENDED  NOT PAYING THE BILL
 232:                              // BLK      = ADMIN1, ADMIN2, ADMIN3  ---> SUBSCRIBER ACCOUNT SUSPENDED OTHER REASON
 233:                              m = Regex.Match(line, @"BLK\s+=.+[ACCSUSP|ADMIN]");
 234:                              if (m.Success)
 235:                              {
 236:                                  serviceSupplementaryService.ServiceAdministrativelySuspendedByBillingDepartment = true;
 237:                                  serviceSupplementaryService.SupplementaryServiceList.Add(Ia.Ngn.Cl.Model.Business.Service.SupplementaryService.ServiceSuspension);
 238:                              }
 239:                              m = Regex.Match(line, @"BLK\s+=.+[ADMIN1|ADMIN2|ADMIN3]");
 240:                              if (m.Success)
 241:                              {
 242:                                  serviceSupplementaryService.ServiceAdministrativelySuspendedForOtherReasons = true;
 243:                                  serviceSupplementaryService.SupplementaryServiceList.Add(Ia.Ngn.Cl.Model.Business.Service.SupplementaryService.ServiceSuspension);
 244:                              }
 245:   
 246:                              // ADDINF   = KEYWORD ---> SUBSCRIBER HAS PIN
 247:                              m = Regex.Match(line, @"ADDINF\s+=.+KEYWORD");
 248:                              if (m.Success) serviceSupplementaryService.SubscriberHasPin = true;
 249:                          }
 250:                      }
 251:   
 252:                      Ia.Ngn.Cl.Model.Business.Nokia.SiemensEwsd.ExtractAndUpdateUniqueEwsdServiceSymbolListFromOutputContent(outputContent);
 253:                  }
 254:                  else
 255:                  {
 256:                  }
 257:              }
 258:              else
 259:              {
 260:              }
 261:   
 262:              return serviceSupplementaryService;
 263:          }
 264:   
 265:          ////////////////////////////////////////////////////////////////////////////
 266:   
 267:          /// <summary>
 268:          /// Response of Siemens EWSD
 269:          /// </summary>
 270:          public class Response
 271:          {
 272:              public int Service { get; set; }
 273:              /// <summary/>
 274:              public bool IsSuccess { get { return ReturnCode == Ia.Ngn.Cl.Model.Business.Nokia.SiemensEwsd.ResultCode.OperationIsSuccessful; } }
 275:              /// <summary/>
 276:              public bool IsProvisioned { get; set; }
 277:              /// <summary/>
 278:              public Ia.Ngn.Cl.Model.Business.Nokia.SiemensEwsd.ResultCode ReturnCode { get; set; }
 279:              /// <summary/>
 280:              //public string Ctag { get; set; } // no need because the commad string is included in response body
 281:              /// <summary/>
 282:              public DateTime DateTime { get; set; }
 283:              /// <summary/>
 284:              public string CommandString { get; set; }
 285:   
 286:              public Ia.Ngn.Cl.Model.Business.Service.ServiceSupplementaryService ServiceSupplementaryService { get; set; }
 287:   
 288:              /// <summary/>
 289:              public Response() { }
 290:          }
 291:   
 292:          ////////////////////////////////////////////////////////////////////////////
 293:   
 294:          /// <summary>
 295:          ///
 296:          /// </summary>
 297:          public static string NetManagerCommand(Opcode opcode, int dn)
 298:          {
 299:              string command;
 300:   
 301:              if (opcode == Opcode.Dispsub) command = "DISPSUB:DN=" + dn + ";";
 302:              else if (opcode == Opcode.Cansub) command = "CANSUB:DN=" + dn + ";";
 303:              else
 304:              {
 305:                  throw new System.ArgumentOutOfRangeException("NetManagerCommand(): Opcode unrecognized. ");
 306:              }
 307:   
 308:              return command;
 309:          }
 310:   
 311:          ////////////////////////////////////////////////////////////////////////////
 312:   
 313:          /// <summary>
 314:          ///
 315:          /// </summary>
 316:          public static string NetManagerDisplayTimeCommand
 317:          {
 318:              get
 319:              {
 320:                  return "DISPTIME;";
 321:              }
 322:          }
 323:   
 324:          ////////////////////////////////////////////////////////////////////////////
 325:   
 326:          /// <summary>
 327:          /// Extract unique EWSD service symbols into array 
 328:          /// </summary>
 329:          public static void ExtractAndUpdateUniqueEwsdServiceSymbolListFromOutputContent(string outputContent)
 330:          {
 331:              string s;
 332:              MatchCollection matchCollection;
 333:   
 334:              matchCollection = Regex.Matches(outputContent, @"\r\n   [\w]{1,}\s+= .+[^\r\n]");
 335:   
 336:              if (matchCollection.Count > 0)
 337:              {
 338:                  foreach (Match match in matchCollection)
 339:                  {
 340:                      s = Regex.Replace(match.Value, @"MASKNO:\d+", "");
 341:                      s = Regex.Replace(s, @"\s+", " ");
 342:                      s = s.Trim();
 343:   
 344:                      if (!ServiceSymbolList.Contains(s))
 345:                      {
 346:                          ServiceSymbolList.Add(s);
 347:                      }
 348:                  }
 349:              }
 350:          }
 351:   
 352:          ////////////////////////////////////////////////////////////////////////////
 353:          ////////////////////////////////////////////////////////////////////////////
 354:   
 355:          /// <summary>
 356:          ///
 357:          /// </summary>
 358:          public static string SpecialHandlingAndModificationOfPstnSiteName(string pstnSiteName)
 359:          {
 360:              // change JPL to QRN because JBL is just an RSU following QRN
 361:              string modifiedPstnSiteName;
 362:   
 363:              if (pstnSiteName == "JBL") modifiedPstnSiteName = "QRN";
 364:              else modifiedPstnSiteName = pstnSiteName;
 365:   
 366:              return modifiedPstnSiteName;
 367:          }
 368:   
 369:          ////////////////////////////////////////////////////////////////////////////
 370:          ////////////////////////////////////////////////////////////////////////////    
 371:      }
 372:  }
 373: