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

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

Nokia's Siemens EWSD support class of Fixed Telecommunications Network (FTN) 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.Ftn.Cl.Models.Business.Siemens
    8: {
    9:     ////////////////////////////////////////////////////////////////////////////
   10:  
   11:     /// <summary publish="true">
   12:     /// Nokia's Siemens EWSD support class of Fixed Telecommunications Network (FTN) business model.
   13:     /// </summary>
   14:     /// 
   15:     /// <remarks> 
   16:     /// Copyright © 2018-2021 Jasem Y. Al-Shamlan (info@ia.com.kw), Integrated Applications - Kuwait. All Rights Reserved.
   17:     /// </remarks> 
   18:     public class Ewsd
   19:     {
   20:         private static Queue<int> serviceQueue = new Queue<int>();
   21:         private static Queue<ProvisioningWorkflow> synchronizationCommandQueue = new Queue<ProvisioningWorkflow>();
   22:  
   23:         private static Queue<ProvisioningWorkflow> synchronizationProvisioningWorkflowQueue = new Queue<ProvisioningWorkflow>();
   24:         private static Queue<ProvisioningWorkflow> serviceSuspentionSynchronizationProvisioningWorkflowQueue = new Queue<ProvisioningWorkflow>();
   25:  
   26:         /// <summary/>
   27:         public enum Opcode {
   28:             /// <summary/>
   29:             Dispsub,
   30:  
   31:             /// <summary/>
   32:             Cansub,
   33:  
   34:             /// <summary/>
   35:             UpdateSubXxx,
   36:  
   37:             /// <summary/>
   38:             SuspendTemp,
   39:  
   40:             /// <summary/>
   41:             Dispkeyword
   42:         };//, Crcpt, Disptime }
   43:  
   44:         /// <summary/>
   45:         public class ProvisioningWorkflow
   46:         {
   47:             /// <summary/>
   48:             public string Service { get; set; }
   49:  
   50:             /// <summary/>
   51:             public Ia.Ftn.Cl.Models.Business.NetworkDesignDocument.Pstn Pstn { get; set; }
   52:  
   53:             /// <summary/>
   54:             public string ReadCommand { get; set; }
   55:  
   56:             /// <summary/>
   57:             public string ServiceSuspensionCommand { get; set; }
   58:  
   59:             /// <summary/>
   60:             public string DeleteCommand { get; set; }
   61:  
   62:             /// <summary/>
   63:             public ProvisioningWorkflow()
   64:             {
   65:  
   66:             }
   67:         }
   68:  
   69:         public static List<string> ServiceSymbolList { get; } = new List<string>();
   70:  
   71:         ////////////////////////////////////////////////////////////////////////////
   72:  
   73:         /// <summary>
   74:         /// Response of Siemens EWSD
   75:         /// </summary>
   76:         public class Response
   77:         {
   78:             public int Service { get; set; }
   79:  
   80:             /// <summary/>
   81:             public bool IsSuccess { get { return ReturnCode == Ia.Ftn.Cl.Models.Business.Siemens.Ewsd.ResultCode.Successful; } }
   82:  
   83:             /// <summary/>
   84:             public bool IsProvisioned { get; set; }
   85:  
   86:             /// <summary/>
   87:             public Ia.Ftn.Cl.Models.Business.Siemens.Ewsd.ResultCode ReturnCode { get; set; }
   88:  
   89:             /// <summary/>
   90:             //public string Ctag { get; set; } // no need because the commad string is included in response body
   91:  
   92:             /// <summary/>
   93:             public DateTime DateTime { get; set; }
   94:  
   95:             /// <summary/>
   96:             public string CommandString { get; set; }
   97:  
   98:  
   99:             /// <summary/>
  100:             public int Dn { get; set; }
  101:  
  102:             /// <summary/>
  103:             public string Lac { get; set; }
  104:  
  105:             /// <summary/>
  106:             public string Eqn { get; set; }
  107:  
  108:             /// <summary/>
  109:             public string Cat { get; set; }
  110:  
  111:             /// <summary/>
  112:             public string Ltt { get; set; }
  113:  
  114:             /// <summary/>
  115:             public string Optrcl { get; set; }
  116:  
  117:             /// <summary/>
  118:             public string Subtrcl { get; set; }
  119:  
  120:             /// <summary/>
  121:             public string Numcal { get; set; }
  122:  
  123:             /// <summary/>
  124:             public string Orig1 { get; set; }
  125:  
  126:             /// <summary/>
  127:             public string Trarstr { get; set; }
  128:  
  129:             /// <summary/>
  130:             public string Lnatt { get; set; }
  131:  
  132:             /// <summary/>
  133:             public string Div { get; set; }
  134:  
  135:             /// <summary/>
  136:             public string Cos { get; set; }
  137:  
  138:             /// <summary/>
  139:             public string Addinf { get; set; }
  140:  
  141:             /// <summary/>
  142:             public string Numbch { get; set; }
  143:  
  144:             /// <summary/>
  145:             public string Ctdivi { get; set; }
  146:  
  147:             /// <summary/>
  148:             public string Blk { get; set; }
  149:  
  150:             /// <summary/>
  151:             public string Content { get; set; }
  152:  
  153:             /// <summary/>
  154:             public Ia.Ftn.Cl.Models.Business.Service.ServiceSupplementaryService ServiceSupplementaryService { get; set; }
  155:  
  156:             ////////////////////////////////////////////////////////////////////////////
  157:  
  158:             /// <summary>
  159:             ///
  160:             /// </summary>
  161:             public Response(string content)
  162:             {
  163:                 int jobNumber, jobEndNumber;
  164:                 string service, fileHead, fileFoot;
  165:                 Match match;
  166:                 Ia.Ftn.Cl.Models.Business.Service.ServiceSupplementaryService serviceSupplementaryService;
  167:                 Ia.Ftn.Cl.Models.Business.Siemens.Ewsd.ResultCode returnCode;
  168:  
  169:                 fileHead = "\r\n-----------------------------------------------------------------------------";
  170:                 fileFoot = "-----------------------------------------------------------------------------\r\n";
  171:  
  172:                 if (content.StartsWith(fileHead) && content.EndsWith(fileFoot))
  173:                 {
  174:                     content = content.Replace(fileHead, "");
  175:                     content = content.Replace(fileFoot, "");
  176:  
  177:                     match = Regex.Match(content, @"^\s+(\d+)\s+(.+)\s+(\d+)\s+$", RegexOptions.Singleline);
  178:  
  179:                     if (match.Success)
  180:                     {
  181:                         jobNumber = int.Parse(match.Groups[1].Value);
  182:                         jobEndNumber = int.Parse(match.Groups[3].Value);
  183:  
  184:                         if (jobNumber == jobEndNumber)
  185:                         {
  186:                             content = match.Groups[2].Value;
  187:  
  188:                             if (content.Contains("OBJECT NOT CONNECTED"))
  189:                             {
  190:                                 /*
  191:             9241                                                        MASKNO:10001 
  192:             COMMAND ERROR MESSAGE FOR DISPSUB      :  1 ERROR(S) 
  193:                                                                         MASKNO:10990 
  194:             OBJECT NOT CONNECTED                                                    
  195: 
  196:             CNTXT PAR.NAME PARAMETER VALUE 
  197:             -----+--------+--------------------------------------------------------- 
  198:                   DN       =<25420976>                                               
  199: 
  200: 
  201:             END JOB 9241
  202:                                  */
  203:  
  204:                                 match = Regex.Match(content, @"DN\s+=<(\d{8})>");
  205:  
  206:                                 if (match.Success)
  207:                                 {
  208:                                     service = match.Groups[1].Value;
  209:  
  210:                                     this.CommandString = @"DISPSUB:DN=" + service + ";";
  211:  
  212:                                     this.Service = int.Parse(service);
  213:  
  214:                                     this.IsProvisioned = false;
  215:  
  216:                                     returnCode = Ia.Ftn.Cl.Models.Business.Siemens.Ewsd.ResultCode.Successful;
  217:  
  218:                                     this.Dn = int.Parse(service);
  219:                                     this.Content = content;
  220:                                     this.ReturnCode = returnCode;
  221:                                 }
  222:                                 else
  223:                                 {
  224:                                     returnCode = Ia.Ftn.Cl.Models.Business.Siemens.Ewsd.ResultCode.Failed;
  225:  
  226:                                     this.Content = content;
  227:                                     this.ReturnCode = returnCode;
  228:                                 }
  229:                             }
  230:                             else if (content.Contains("OBJECT NOT A SUBSCRIBER"))
  231:                             {
  232:                                 match = Regex.Match(content, @"DN\s+=<(\d{8})>");
  233:  
  234:                                 if (match.Success)
  235:                                 {
  236:                                     service = match.Groups[1].Value;
  237:  
  238:                                     this.CommandString = @"DISPSUB:DN=" + service + ";";
  239:  
  240:                                     this.Service = int.Parse(service);
  241:  
  242:                                     this.IsProvisioned = true;
  243:  
  244:                                     returnCode = Ia.Ftn.Cl.Models.Business.Siemens.Ewsd.ResultCode.Successful;
  245:  
  246:                                     this.Dn = int.Parse(service);
  247:                                     this.Content = content;
  248:                                     this.ReturnCode = returnCode;
  249:  
  250:                                     serviceSupplementaryService = new Ia.Ftn.Cl.Models.Business.Service.ServiceSupplementaryService();
  251:                                     serviceSupplementaryService.IsPbx = true;
  252:  
  253:                                     this.ServiceSupplementaryService = serviceSupplementaryService;
  254:                                 }
  255:                                 else
  256:                                 {
  257:                                     returnCode = Ia.Ftn.Cl.Models.Business.Siemens.Ewsd.ResultCode.Failed;
  258:  
  259:                                     this.Content = content;
  260:                                     this.ReturnCode = returnCode;
  261:                                 }
  262:                             }
  263:                             else if (content.Contains("DISPSUB") && content.Contains("END JOB"))
  264:                             {
  265:  
  266:                                 /*
  267:             DISPSUB:DN=23833902;                                          
  268: 
  269:                                                                         MASKNO:03800 
  270:             LAC    = 01     DN     = 23833902     EQN    = 1350- 0- 4-30 
  271:                CAT      = MS                                            MASKNO:03774 
  272:                LTT      = COSLAC2                                       MASKNO:03789 
  273:                OPTRCL   = 2                                             MASKNO:03798 
  274:                NUMCAL   = 1                                             MASKNO:08641 
  275:                ORIG1    = 5                                 
  276:                DIV      = DIVI     DIVIMOD  DDVIN                       MASKNO:08598 
  277:                LNATT    = PB                                            MASKNO:03787 
  278:                COS      = ACTCW    CONF3    CWACT    PROP8    CLIP      MASKNO:03777 
  279:                           FSK                                          
  280: 
  281: 
  282:             END JOB 9232
  283:                                  */
  284:  
  285:                                 match = Regex.Match(content, @"DISPSUB:DN=(\d{8});");
  286:  
  287:                                 if (match.Success)
  288:                                 {
  289:                                     service = match.Groups[1].Value;
  290:  
  291:                                     this.CommandString = @"DISPSUB:DN=" + service + ";";
  292:  
  293:                                     this.Service = int.Parse(service);
  294:  
  295:                                     this.IsProvisioned = true;
  296:  
  297:                                     returnCode = Ia.Ftn.Cl.Models.Business.Siemens.Ewsd.ResultCode.Successful;
  298:  
  299:                                     this.Content = content;
  300:                                     this.ReturnCode = returnCode;
  301:  
  302:                                     this.ParseDispsub(content, out int dn, out string lac, out string eqn, out string cat, out string ltt, out string optrcl, out string subtrcl, out string numcal, out string orig1, out string trarstr, out string lnatt, out string div, out string cos, out string addinf, out string numbch, out string ctdivi, out string blk);
  303:                                     this.Dn = dn;
  304:                                     this.Lac = lac;
  305:                                     this.Eqn = eqn;
  306:                                     this.Cat = cat;
  307:                                     this.Ltt = ltt;
  308:                                     this.Optrcl = optrcl;
  309:                                     this.Subtrcl = subtrcl;
  310:                                     this.Numcal = numcal;
  311:                                     this.Orig1 = orig1;
  312:                                     this.Trarstr = trarstr;
  313:                                     this.Lnatt = lnatt;
  314:                                     this.Div = div;
  315:                                     this.Cos = cos;
  316:                                     this.Addinf = addinf;
  317:                                     this.Numbch = numbch;
  318:                                     this.Ctdivi = ctdivi;
  319:                                     this.Blk = blk;
  320:  
  321:                                     serviceSupplementaryService = Ia.Ftn.Cl.Models.Business.Siemens.Ewsd.ServiceSupplementaryServiceStateFromServiceNetManagerOutputString(content);
  322:  
  323:                                     this.ServiceSupplementaryService = serviceSupplementaryService;
  324:                                 }
  325:                                 else
  326:                                 {
  327:                                     returnCode = Ia.Ftn.Cl.Models.Business.Siemens.Ewsd.ResultCode.Failed;
  328:  
  329:                                     this.Content = content;
  330:                                     this.ReturnCode = returnCode;
  331:                                 }
  332:                             }
  333:                             else
  334:                             {
  335:                                 returnCode = Ia.Ftn.Cl.Models.Business.Siemens.Ewsd.ResultCode.NotAcceptedUnreasonableValue;
  336:  
  337:                                 this.Content = content;
  338:                                 this.ReturnCode = returnCode;
  339:                             }
  340:                         }
  341:                         else
  342:                         {
  343:                             returnCode = Ia.Ftn.Cl.Models.Business.Siemens.Ewsd.ResultCode.FileFormatError;
  344:  
  345:                             this.Content = content;
  346:                             this.ReturnCode = returnCode;
  347:                         }
  348:                     }
  349:                     else
  350:                     {
  351:                         returnCode = Ia.Ftn.Cl.Models.Business.Siemens.Ewsd.ResultCode.FileFormatError;
  352:  
  353:                         this.Content = content;
  354:                         this.ReturnCode = returnCode;
  355:                     }
  356:                 }
  357:                 else
  358:                 {
  359:                     returnCode = Ia.Ftn.Cl.Models.Business.Siemens.Ewsd.ResultCode.FileFormatError;
  360:  
  361:                     this.Content = content;
  362:                     this.ReturnCode = returnCode;
  363:                 }
  364:             }
  365:  
  366:             ////////////////////////////////////////////////////////////////////////////
  367:  
  368:             /// <summary>
  369:             ///
  370:             /// </summary>
  371:             private void ParseDispsub(string suscpOutputContent, out int dn, out string lac, out string eqn, out string cat, out string ltt, out string optrcl, out string subtrcl, out string numcal, out string orig1, out string trarstr, out string lnatt, out string div, out string cos, out string addinf, out string numbch, out string ctdivi, out string blk)
  372:             {
  373:                 int dn2;
  374:  
  375:                 using (StringReader stringReader = new StringReader(suscpOutputContent))
  376:                 {
  377:                     string line;
  378:                     dn = -1;
  379:                     lac = eqn = cat = ltt = optrcl = subtrcl = numcal = orig1 = trarstr = lnatt = div = cos = addinf = numbch = ctdivi = blk = string.Empty;
  380:  
  381:                     while ((line = stringReader.ReadLine()) != null)
  382:                     {
  383:                         // remove "MASKNO:03774"
  384:                         line = Regex.Replace(line, @"MASKNO:\d+\s+", "");
  385:  
  386:                         //DISPSUB:DN=23833902;
  387:                         if (line.StartsWith("DISPSUB")) dn = int.Parse(Regex.Match(line, @"^DISPSUB:DN=(\d{8});").Groups[1].Value);
  388:                         else if (line.StartsWith("LAC"))
  389:                         {
  390:                             lac = Regex.Match(line, @"LAC\s+=\s+(.+?)\s+").Groups[1].Value;
  391:  
  392:                             dn2 = int.Parse(Regex.Match(line, @"DN\s+=\s+(\d{8})\s+").Groups[1].Value);
  393:  
  394:                             if (dn != dn2) throw new ArgumentException("dn != dn2");
  395:  
  396:                             eqn = Regex.Match(line, @"EQN\s+=\s+(.+)\s+").Groups[1].Value;
  397:                         }
  398:                         else if (line.StartsWith("   CAT")) cat = ThreeSpaceTermEntryValue(line, "CAT");
  399:                         else if (line.StartsWith("   LTT")) ltt = ThreeSpaceTermEntryValue(line, "LTT");
  400:                         else if (line.StartsWith("   OPTRCL")) optrcl = ThreeSpaceTermEntryValue(line, "OPTRCL");
  401:                         else if (line.StartsWith("   SUBTRCL")) subtrcl = ThreeSpaceTermEntryValue(line, "SUBTRCL");
  402:                         else if (line.StartsWith("   NUMCAL")) numcal = ThreeSpaceTermEntryValue(line, "NUMCAL");
  403:                         else if (line.StartsWith("   ORIG1")) orig1 = ThreeSpaceTermEntryValue(line, "ORIG1");
  404:                         else if (line.StartsWith("   TRARSTR")) trarstr = ThreeSpaceTermEntryValue(line, "TRARSTR");
  405:                         else if (line.StartsWith("   LNATT")) lnatt = ThreeSpaceTermEntryValue(line, "LNATT");
  406:                         else if (line.StartsWith("   DIV")) div = ThreeSpaceTermEntryValue(line, "DIV");
  407:                         else if (line.StartsWith("   COS")) cos = ThreeSpaceTermEntryValue(line, "COS");
  408:                         else if (line.StartsWith("   ADDINF")) addinf = ThreeSpaceTermEntryValue(line, "ADDINF");
  409:                         else if (line.StartsWith("   NUMBCH")) numbch = ThreeSpaceTermEntryValue(line, "NUMBCH");
  410:                         else if (line.StartsWith("   CTDIVI")) ctdivi = ThreeSpaceTermEntryValue(line, "CTDIVI");
  411:                         else if (line.StartsWith("   BLK")) blk = ThreeSpaceTermEntryValue(line, "BLK");
  412:                         else
  413:                         {
  414:                         }
  415:                     }
  416:                 }
  417:             }
  418:  
  419:             ////////////////////////////////////////////////////////////////////////////
  420:             ////////////////////////////////////////////////////////////////////////////
  421:         }
  422:  
  423:         ////////////////////////////////////////////////////////////////////////////
  424:  
  425:         /// <summary>
  426:         ///
  427:         /// </summary>
  428:         private static string ThreeSpaceTermEntryValue(string line, string term)
  429:         {
  430:             string s;
  431:  
  432:             s = Regex.Match(line, @"^\s+" + term + @"\s+=\s+(.+)\s+").Groups[1].Value;
  433:  
  434:             s = s.Trim();
  435:  
  436:             // replace spaces with ','
  437:             s = Regex.Replace(s, @"\s+", ",");
  438:  
  439:             return s;
  440:         }
  441:  
  442:         ////////////////////////////////////////////////////////////////////////////
  443:  
  444:         /// <summary>
  445:         ///
  446:         /// </summary>
  447:         public enum ResultCode
  448:         {
  449:             Successful = 0,
  450:             Failed = 1,
  451:             ObjectNotASubscriber = 2,
  452:             ObjectNotConnected = 3,
  453:             NotAcceptedUnreasonableValue = 4,
  454:             NotAcceptedCommandUnknown = 5,
  455:             FileFormatError = 6,
  456:         }
  457:  
  458:         ////////////////////////////////////////////////////////////////////////////
  459:  
  460:         /// <summary>
  461:         ///
  462:         /// </summary>
  463:         public Ewsd() { }
  464:  
  465:         ////////////////////////////////////////////////////////////////////////////
  466:  
  467:         /// <summary>
  468:         ///
  469:         /// </summary>
  470:         public static int ProperlySelectedSingleServiceQueueServiceNumber(List<Ia.Ftn.Cl.Models.Business.NetworkDesignDocument.Pstn> pstnList)
  471:         {
  472:             int service;
  473:             List<int> list;
  474:  
  475:             service = 0;
  476:  
  477:             if (serviceQueue.Count == 0)
  478:             {
  479:                 list = AllPossibleServiceNumbersPreferablyNotInEwsdSubscriberWithinPstn(pstnList);
  480:  
  481:                 serviceQueue = new Queue<int>(list.Shuffle()); //.OrderBy(o => o));
  482:             }
  483:  
  484:             if (serviceQueue.Count > 0) service = serviceQueue.Dequeue();
  485:  
  486:             return service;
  487:         }
  488:  
  489:         ////////////////////////////////////////////////////////////////////////////
  490:  
  491:         /// <summary>
  492:         ///
  493:         /// </summary>
  494:         public static List<int> AllPossibleServiceNumbersPreferablyNotInEwsdSubscriberWithinPstn(List<Ia.Ftn.Cl.Models.Business.NetworkDesignDocument.Pstn> pstnList)
  495:         {
  496:             var allPossibleServiceNumbersWithinPstn = new List<int>();
  497:  
  498:             foreach (var pstn in pstnList)
  499:             {
  500:                 allPossibleServiceNumbersWithinPstn.AddRange(Ia.Ftn.Cl.Models.Data.Service.AllPossibleServiceNumbersWithinPstn(pstn.Name));
  501:             }
  502:  
  503:             var dnList = Ia.Ftn.Cl.Models.Data.Siemens.Subscriber.DnList();
  504:  
  505:             var list = allPossibleServiceNumbersWithinPstn.Except(dnList).ToList();
  506:  
  507:             // if list is empty then will use the all list
  508:             if (list.Count == 0) list = allPossibleServiceNumbersWithinPstn;
  509:  
  510:             var hashSet = new HashSet<int>(list);
  511:  
  512:             return hashSet.OrderBy(u => u).ToList();
  513:         }
  514:  
  515:         ////////////////////////////////////////////////////////////////////////////
  516:  
  517:         /// <summary>
  518:         ///
  519:         /// </summary>
  520:         public static ProvisioningWorkflow DeleteAndReadEwsdServiceQueueCommand(Ia.Ftn.Cl.Models.Business.Default.Procedure procedure)
  521:         {
  522:             ProvisioningWorkflow provisioningWorkflow;
  523:             List<ProvisioningWorkflow> list;
  524:  
  525:             provisioningWorkflow = null;
  526:  
  527:             if (synchronizationCommandQueue.Count == 0 && procedure == Ia.Ftn.Cl.Models.Business.Default.Procedure.InitializeOrIterate)
  528:             {
  529:                 list = Ia.Ftn.Cl.Models.Business.Siemens.Ewsd.DeleteAndReadEwsdServiceCommandList();
  530:  
  531:                 synchronizationCommandQueue = new Queue<ProvisioningWorkflow>(list); // don't shuffle because a modify command is followed by a read .Shuffle());
  532:             }
  533:  
  534:             if (synchronizationCommandQueue.Count > 0) provisioningWorkflow = synchronizationCommandQueue.Dequeue();
  535:  
  536:             return provisioningWorkflow;
  537:         }
  538:  
  539:         ////////////////////////////////////////////////////////////////////////////
  540:  
  541:         /// <summary>
  542:         ///
  543:         /// </summary>
  544:         public static List<ProvisioningWorkflow> DeleteAndReadEwsdServiceCommandList()
  545:         {
  546:             ProvisioningWorkflow provisioningWorkflow;
  547:             List<ProvisioningWorkflow> provisioningWorkflowList;
  548:  
  549:             provisioningWorkflowList = new List<ProvisioningWorkflow>();
  550:  
  551:             //var imsServiceToRouterVendorDictionary0 = Ia.Ftn.Cl.Model.Data.Service.ImsServiceToOntRouterVendorInAllowedToBeMigratedOltDictionary;
  552:             var imsServiceToRouterVendorDictionary = Ia.Ftn.Cl.Models.Data.Service.ImsServiceToOntAndMsanRouterVendorInAllowedToBeMigratedOltAndDomainDictionary;
  553:  
  554:             var ewsdSubscriberProvisionedServiceList = Ia.Ftn.Cl.Models.Data.Siemens.Subscriber.ProvisionedServiceList();
  555:  
  556:             // intersect lists
  557:             var list0 = ewsdSubscriberProvisionedServiceList.Intersect(imsServiceToRouterVendorDictionary.Keys).ToList();
  558:  
  559:             // will exclude exempt numbers
  560:             var serviceExemptionList = Ia.Ftn.Cl.Models.Data.Provision.ServiceOfServiceExemptFromProvisionProcessingList();
  561:  
  562:             var list = list0.Except(serviceExemptionList).ToList();
  563:  
  564:             foreach (string service in list)
  565:             {
  566:                 var pstn = Ia.Ftn.Cl.Models.Data.NetworkDesignDocument.PstnFromService(service);
  567:  
  568:                 // delete
  569:                 provisioningWorkflowList.Add(new ProvisioningWorkflow
  570:                 {
  571:                     Service = service,
  572:                     Pstn = pstn,
  573:                     DeleteCommand = DeleteServiceCommand(pstn, service)
  574:                 });
  575:  
  576:                 // read
  577:                 provisioningWorkflowList.Add(provisioningWorkflow = new ProvisioningWorkflow
  578:                 {
  579:                     Service = service,
  580:                     Pstn = pstn,
  581:                     ReadCommand = ReadServiceCommand(pstn, service),
  582:                 });
  583:             }
  584:  
  585:             return provisioningWorkflowList;
  586:         }
  587:  
  588:         ////////////////////////////////////////////////////////////////////////////
  589:  
  590:         /// <summary>
  591:         ///
  592:         /// </summary>
  593:         public static ProvisioningWorkflow SynchronizeBetweenServiceRequestAdministrativeIssueAndSiemensEwsdPstnServiceProvisioningWorkflowItem()
  594:         {
  595:             ProvisioningWorkflow provisioningWorkflow;
  596:             List<ProvisioningWorkflow> list;
  597:  
  598:             provisioningWorkflow = null;
  599:  
  600:             if (serviceSuspentionSynchronizationProvisioningWorkflowQueue.Count == 0)
  601:             {
  602:                 list = Ia.Ftn.Cl.Models.Business.Siemens.Ewsd.ServiceSuspentionAndReadCommandSynchronizeBetweenServiceRequestAdministrativeIssueAndSiemensEwsdPstnServiceProvisioningWorkflowList();
  603:  
  604:                 serviceSuspentionSynchronizationProvisioningWorkflowQueue = new Queue<ProvisioningWorkflow>(list); // don't shuffle because a modify command is followed by a read .Shuffle());
  605:             }
  606:  
  607:             if (serviceSuspentionSynchronizationProvisioningWorkflowQueue.Count > 0) provisioningWorkflow = serviceSuspentionSynchronizationProvisioningWorkflowQueue.Dequeue();
  608:  
  609:             return provisioningWorkflow;
  610:         }
  611:  
  612:         ////////////////////////////////////////////////////////////////////////////
  613:  
  614:         /// <summary>
  615:         ///
  616:         /// </summary>
  617:         public static List<ProvisioningWorkflow> ServiceSuspentionAndReadCommandSynchronizeBetweenServiceRequestAdministrativeIssueAndSiemensEwsdPstnServiceProvisioningWorkflowList()
  618:         {
  619:             bool serviceSuspensionState;
  620:             ProvisioningWorkflow provisioningWorkflow;
  621:             List<ProvisioningWorkflow> provisioningWorkflowList;
  622:  
  623:             provisioningWorkflowList = new List<ProvisioningWorkflow>();
  624:  
  625:             Ia.Ftn.Cl.Models.Data.Provision.SiemensEwsdPstnServiceSuspensionMismatchBetweenServiceRequestAdministrativeIssueAndServiceServiceList(out List<string> serviceToSuspendList, out List<string> serviceToReleaseList, out _, out _);
  626:  
  627:             // will exclude exempt numbers
  628:             var serviceExemptionList = Ia.Ftn.Cl.Models.Data.Provision.ServiceOfServiceExemptFromProvisionProcessingList();
  629:  
  630:             serviceSuspensionState = true;
  631:  
  632:             foreach (var service in serviceToSuspendList)
  633:             {
  634:                 if (!serviceExemptionList.Contains(service))
  635:                 {
  636:                     var pstn = Ia.Ftn.Cl.Models.Data.NetworkDesignDocument.PstnFromService(service);
  637:  
  638:                     provisioningWorkflowList.Add(new ProvisioningWorkflow
  639:                     {
  640:                         Service = service,
  641:                         Pstn = pstn,
  642:                         ServiceSuspensionCommand = ServiceSuspensionCommand(pstn, service, serviceSuspensionState),
  643:                     });
  644:  
  645:                     provisioningWorkflowList.Add(new ProvisioningWorkflow
  646:                     {
  647:                         Service = service,
  648:                         Pstn = pstn,
  649:                         ReadCommand = ReadServiceCommand(pstn, service)
  650:                     });
  651:                 }
  652:             }
  653:  
  654:  
  655:             serviceSuspensionState = false;
  656:  
  657:             foreach (var service in serviceToReleaseList)
  658:             {
  659:                 if (!serviceExemptionList.Contains(service))
  660:                 {
  661:                     var pstn = Ia.Ftn.Cl.Models.Data.NetworkDesignDocument.PstnFromService(service);
  662:  
  663:                     provisioningWorkflowList.Add(new ProvisioningWorkflow
  664:                     {
  665:                         Service = service,
  666:                         Pstn = pstn,
  667:                         ServiceSuspensionCommand = ServiceSuspensionCommand(pstn, service, serviceSuspensionState),
  668:                     });
  669:  
  670:                     provisioningWorkflowList.Add(new ProvisioningWorkflow
  671:                     {
  672:                         Service = service,
  673:                         Pstn = pstn,
  674:                         ReadCommand = ReadServiceCommand(pstn, service)
  675:                     });
  676:                 }
  677:             }
  678:  
  679:             return provisioningWorkflowList;
  680:         }
  681:  
  682:         ////////////////////////////////////////////////////////////////////////////
  683:  
  684:         /// <summary>
  685:         /// 
  686:         /// </summary>
  687:         public static Ia.Ftn.Cl.Models.Business.Service.ServiceSupplementaryService ServiceSupplementaryServiceStateFromServiceNetManagerOutputString(string content)
  688:         {
  689:             string matchedText, line;
  690:             Match m;
  691:             Ia.Ftn.Cl.Models.Business.Service.ServiceSupplementaryService serviceSupplementaryService;
  692:  
  693:             serviceSupplementaryService = new Ia.Ftn.Cl.Models.Business.Service.ServiceSupplementaryService();
  694:  
  695:             /*
  696: ******************************************************************************************************
  697: Sample Subscriber Information:
  698: 
  699: QRN/QRN/KUWCPK1V5140P047/106                          19-06-26  10:39:40
  700: 3324  NetM         ROMMEL07           2816/03800 
  701: 
  702: DISPSUB:DN=25421113;                                          
  703: 
  704:                                                             MASKNO:03800 
  705: LAC    = 01     DN     = 25421113     EQN    =   20- 2-12-14 
  706:    CAT      = MS                                            MASKNO:03774 
  707:    OPTRCL   = 2                                             MASKNO:03798 
  708:    SUBTRCL  = 2   
  709:    NUMCAL   = 1                                             MASKNO:08641 
  710:    ORIG1    = 5                                 
  711:    TRARSTR  = TRACLACT                                      MASKNO:03803 
  712:    LNATT    = PB                                            MASKNO:03787 
  713:    COS      = CLIP     FSK                                  MASKNO:03777 
  714:    ADDINF   = KEYWORD                                       MASKNO:03772 
  715: 
  716: END JOB 3324
  717: 
  718: 
  719: ******************************************************************************************************
  720: 
  721:             OPTRCL   = 2 ---> WITHOUT INTERNATIONAL CALL ENTERED BY OPERATOR
  722: OPTRCL   = 0 ---> WITH INTERNATIONAL CALL ENTERED BY OPERATOR
  723: 
  724: SUBTRCL  = 2 ---> WITHOUT INTERNATIONAL CALL MODIFIED BY SUBSCRIBER
  725: SUBTRCL  = 0 ---> WITH INTERNATIONAL CALL MODIFIED BY SUBSCRIBER
  726: 
  727: TRARSTR  = ACTTRACL TRACLACT ---> TRAFFIC RESTRATION FEATURES IS ACTIVATED (SUBSCRIBER CAN OPEN AND CLOSE INTERNATIONAL CALL)
  728: 
  729: DIV      = DIVI     DIVIMOD  DDVIN  ---> DIVERSATION IMMIDIATE FEATURES IS ASSIGNED TO SUBSCRIBER
  730: DIV      = ACTDIVI -9793XXXX  ---> SUBSCRIBER IMMEDIATELY DIVERTED TO GIVEN NUMBER
  731: 
  732: COS      = ACTCW ---> CALL WAITING FEATURE ACTIVATED
  733: COS      = CWACT ---> CALL WAITING ACTIVATION/DEACTIVATION VIA SUBSCRIBER CONTROL INPUT
  734: COS      = CONF3 ---> 3 PARTY CALLFERENCING FEATURE ACTIVATED
  735: COS      = PROP8 ---> ALARM CALL SERVICE FEATURE IS ACTIVATED
  736: COS      = CLIP FSK ---> CALLER ID FEATURES IS ACTIVATED
  737: 
  738: ADDINF   = KEYWORD ---> SUBSCRIBER HAS PIN
  739:   NOTE: TO CHECK THE SUBSCRIBER PIN (PASSWORD) THE COMMAND IS 
  740:          DISPKEYWORD:DN=25421113;
  741:            
  742: BLK      = ACCSUSP  ---> SUBSCRIBER ACCOUNT SUSPENDED  NOT PAYING THE BILL
  743: BLK      = ADMIN    ---> SUBSCRIBER ACCOUNT SUSPENDED  NOT PAYING THE BILL
  744: BLK      = ADMIN1, ADMIN2, ADMIN3  ---> SUBSCRIBER ACCOUNT SUSPENDED OTHER REASON
  745:              */
  746:  
  747:  
  748:             /*
  749: 2019-12-26 06:07:42: ServiceSymbolList: Service symbol list: CAT = MS, LTT = COSLAC2, OPTRCL = 2, SU
  750: BTRCL = 2, NUMCAL = 1, ORIG1 = 5, DIV = DIVI DIVIMOD DDVIN, BLK = ACCSUSP, TRARSTR = ACTTRACL TRACLA
  751: CT, LNATT = PB, COS = ACTCW CONF3 CWACT PROP8 CLIP, OPTRCL = 0, BLK = ACCSUSP ADMIN1, ADDINF = KEYWO
  752: RD, COS = CLIP FSK, TRARSTR = TRACLACT, COS = CONF3 CWACT PROP8 CLIP FSK, DIV = ACTDIVI -22255408, C
  753: OS = ACTCW CWACT, DIV = ACTDIVI -1885050, DIV = ACTDIVI -98542783, SUBTRCL = 5, DIV = ACTDIVI -23630
  754: 149, DIV = ACTDIVI -97140405, DIV = ACTDIVI -98765061, LTT = COSLAC1, DIV = ACTDIVI -56660104, TRARS
  755: TR = REQSPORI REQSPTER, DIV = ACTDIVI -96608155, DIV = ACTDIVI -90070130, DIV = ACTDIVI -50867570, D
  756: IV = ACTDIVI -99066818, BLK = ADMIN1, COS = ACTCW CWACT CLIP FSK, DIV = ACTDIVI -55157777, DIV = ACT
  757: DIVI -22255407, DIV = ACTDIVI -60361542, DIV = ACTDIVI -23832042, BLK = ADMIN2, DIV = ACTDIVI -22255
  758: 406, DIV = ACTDIVI -97718256, DIV = ACTDIVI -25430752, DIV = ACTDIVI -23847000, DIV = ACTDIVI -94130
  759: 075, DIV = ACTDIVI -90070140, DIV = ACTDIVI -98941899, DIV = ACTDIVI -66165244, DIV = ACTDIVI -99000
  760: 064, DIV = ACTDIVI -99392712, DIV = ACTDIVI -99583218, DIV = ACTDIVI -90061187, TRARSTR = ACTTRACL T
  761: RACLACT TRACLMOD, DIV = ACTDIVI -66667641, DIV = ACTDIVI -99326080, DIV = ACTDIVI -55865281, DIV = A
  762: CTDIVI -94171955, DIV = ACTDIVI -22255495, DIV = DIVI -5610, COS = ACTCW CONF3 CWACT CLIP FSK, DIV =
  763:  ACTDIVI -50955607, DIV = ACTDIVI -22255496
  764:              */
  765:  
  766:             m = Regex.Match(content, @"DISPSUB:DN=(\d{8});");
  767:  
  768:             if (m.Success)
  769:             {
  770:                 matchedText = m.Groups[1].Value;
  771:  
  772:                 if (int.TryParse(matchedText, out int dn))
  773:                 {
  774:                     serviceSupplementaryService.Service = dn;
  775:  
  776:                     using (StringReader reader = new StringReader(content))
  777:                     {
  778:                         while ((line = reader.ReadLine()) != null)
  779:                         {
  780:                             // COS      = CLIP FSK ---> CALLER ID FEATURES IS ACTIVATED
  781:                             m = Regex.Match(line, @"COS.+CLIP.+FSK");
  782:                             if (m.Success) serviceSupplementaryService.SupplementaryServiceList.Add(Ia.Ftn.Cl.Models.Business.Service.SupplementaryService.CallerId);
  783:  
  784:                             // COS      = ACTCW ---> CALL WAITING FEATURE ACTIVATED
  785:                             m = Regex.Match(line, @"COS.+ACTCW");
  786:                             if (m.Success) serviceSupplementaryService.SupplementaryServiceList.Add(Ia.Ftn.Cl.Models.Business.Service.SupplementaryService.CallWaiting);
  787:  
  788:                             // COS      = CWACT ---> CALL WAITING ACTIVATION/DEACTIVATION VIA SUBSCRIBER CONTROL INPUT
  789:                             m = Regex.Match(line, @"COS.+CWACT");
  790:                             if (m.Success) serviceSupplementaryService.SupplementaryServiceList.Add(Ia.Ftn.Cl.Models.Business.Service.SupplementaryService.CallWaiting);
  791:  
  792:                             // COS      = CONF3 ---> 3 PARTY CALLFERENCING FEATURE ACTIVATED
  793:                             m = Regex.Match(line, @"COS.+CONF3");
  794:                             if (m.Success) serviceSupplementaryService.SupplementaryServiceList.Add(Ia.Ftn.Cl.Models.Business.Service.SupplementaryService.ConferenceCall);
  795:  
  796:                             // COS      = PROP8 ---> ALARM CALL SERVICE FEATURE IS ACTIVATED
  797:                             m = Regex.Match(line, @"COS.+PROP8");
  798:                             if (m.Success) serviceSupplementaryService.SupplementaryServiceList.Add(Ia.Ftn.Cl.Models.Business.Service.SupplementaryService.WakeupCall);
  799:  
  800:                             // DIV      = DIVI     DIVIMOD  DDVIN  ---> DIVERSATION IMMIDIATE FEATURES IS ASSIGNED TO SUBSCRIBER
  801:                             m = Regex.Match(line, @"DIV.+DIVI.+DIVIMOD.+DDVIN");
  802:                             if (m.Success) serviceSupplementaryService.SupplementaryServiceList.Add(Ia.Ftn.Cl.Models.Business.Service.SupplementaryService.CallForwarding);
  803:  
  804:                             // DIV      = ACTDIVI -9793XXXX  ---> SUBSCRIBER IMMEDIATELY DIVERTED TO GIVEN NUMBER
  805:                             m = Regex.Match(line, @"DIV\s+=.+ACTDIVI.+-(\d{8})");
  806:                             if (m.Success) serviceSupplementaryService.Pin = m.Value;
  807:  
  808:                             // OPTRCL   = 0 ---> WITH INTERNATIONAL CALL ENTERED BY OPERATOR
  809:                             // OPTRCL   = 2 ---> WITHOUT INTERNATIONAL CALL ENTERED BY OPERATOR
  810:                             m = Regex.Match(line, @"OPTRCL\s+=\s+0");
  811:                             if (m.Success) serviceSupplementaryService.SupplementaryServiceList.Add(Ia.Ftn.Cl.Models.Business.Service.SupplementaryService.InternationalCalling);
  812:  
  813:                             // TRARSTR  = ACTTRACL TRACLACT ---> TRAFFIC RESTRATION FEATURES IS ACTIVATED (SUBSCRIBER CAN OPEN AND CLOSE INTERNATIONAL CALL)
  814:                             m = Regex.Match(line, @"TRARSTR.+ACTTRACL.+TRACLACT");
  815:                             if (m.Success) serviceSupplementaryService.SupplementaryServiceList.Add(Ia.Ftn.Cl.Models.Business.Service.SupplementaryService.InternationalCallingUserControlled);
  816:  
  817:                             // SUBTRCL  = 0 ---> WITH INTERNATIONAL CALL MODIFIED BY SUBSCRIBER
  818:                             // SUBTRCL  = 2 ---> WITHOUT INTERNATIONAL CALL MODIFIED BY SUBSCRIBER
  819:                             m = Regex.Match(line, @"SUBTRCL\s+=\s+0");
  820:                             if (m.Success) serviceSupplementaryService.InternationalCallingUserControlledActivated = true;
  821:  
  822:                             // BLK      = ACCSUSP  ---> SUBSCRIBER ACCOUNT SUSPENDED  NOT PAYING THE BILL
  823:                             // BLK      = ADMIN    ---> SUBSCRIBER ACCOUNT SUSPENDED  NOT PAYING THE BILL
  824:                             // BLK      = ADMIN1, ADMIN2, ADMIN3  ---> SUBSCRIBER ACCOUNT SUSPENDED OTHER REASON
  825:                             m = Regex.Match(line, @"BLK\s+=.+[ACCSUSP|ADMIN]");
  826:                             if (m.Success)
  827:                             {
  828:                                 serviceSupplementaryService.ServiceAdministrativelySuspendedByBillingDepartment = true;
  829:                                 serviceSupplementaryService.SupplementaryServiceList.Add(Ia.Ftn.Cl.Models.Business.Service.SupplementaryService.ServiceSuspension);
  830:                             }
  831:                             m = Regex.Match(line, @"BLK\s+=.+[ADMIN1|ADMIN2|ADMIN3]");
  832:                             if (m.Success)
  833:                             {
  834:                                 serviceSupplementaryService.ServiceAdministrativelySuspendedForOtherReasons = true;
  835:                                 serviceSupplementaryService.SupplementaryServiceList.Add(Ia.Ftn.Cl.Models.Business.Service.SupplementaryService.ServiceSuspension);
  836:                             }
  837:  
  838:                             // ADDINF   = KEYWORD ---> SUBSCRIBER HAS PIN
  839:                             m = Regex.Match(line, @"ADDINF\s+=.+KEYWORD");
  840:                             if (m.Success) serviceSupplementaryService.SubscriberHasPin = true;
  841:                         }
  842:                     }
  843:  
  844:                     Ia.Ftn.Cl.Models.Business.Siemens.Ewsd.ExtractAndUpdateUniqueEwsdServiceSymbolListFromOutputContent(content);
  845:                 }
  846:                 else
  847:                 {
  848:                 }
  849:             }
  850:             else
  851:             {
  852:             }
  853:  
  854:             return serviceSupplementaryService;
  855:         }
  856:  
  857:         ////////////////////////////////////////////////////////////////////////////
  858:         ////////////////////////////////////////////////////////////////////////////
  859:  
  860:         /// <summary>
  861:         ///
  862:         /// </summary>
  863:         public static string ReadServiceCommand(Ia.Ftn.Cl.Models.Business.NetworkDesignDocument.Pstn pstn, string service)
  864:         {
  865:             return EwsdCommand(Opcode.Dispsub, service); // + "\r\n" + EwsdCommand(Opcode.Dispkeyword, service) + "\r\n";
  866:         }
  867:  
  868:         /*
  869:         ////////////////////////////////////////////////////////////////////////////
  870: 
  871:         /// <summary>
  872:         ///
  873:         /// </summary>
  874:         public static string RouteServiceCommand(Ia.Ftn.Cl.Model.Business.NetworkDesignDocument.Pstn pstn, string service)
  875:         {
  876:             string s;
  877: 
  878:             if (!pstn.UsesNpServer) s = EwsdCommand(Opcode.Crcpt, service) + "\r\n";
  879:             else s = string.Empty;
  880: 
  881:             return s;
  882:         }
  883:         */
  884:  
  885:         ////////////////////////////////////////////////////////////////////////////
  886:  
  887:         /// <summary>
  888:         ///
  889:         /// </summary>
  890:         public static string DeleteServiceCommand(Ia.Ftn.Cl.Models.Business.NetworkDesignDocument.Pstn pstn, string service)
  891:         {
  892:             string s;
  893:  
  894:             /*if (!pstn.UsesNpServer)*/
  895:             s = EwsdCommand(Opcode.Cansub, service) + "\r\n";
  896:             //else s = string.Empty;
  897:  
  898:             return s;
  899:         }
  900:  
  901:         ////////////////////////////////////////////////////////////////////////////
  902:  
  903:         /// <summary>
  904:         ///
  905:         /// </summary>
  906:         public static string UpdateSupplementaryServiceCommand(string service, Ia.Ftn.Cl.Models.Business.Service.SupplementaryService supplementaryService, bool supplementaryServiceState)
  907:         {
  908:             string dn;
  909:             string command;
  910:  
  911:             dn = service;
  912:  
  913:             switch (supplementaryService)
  914:             {
  915:                 case (Ia.Ftn.Cl.Models.Business.Service.SupplementaryService.AbbriviatedCalling):
  916:                     {
  917:                         command = EwsdCommand(Opcode.UpdateSubXxx, dn);
  918:                         break;
  919:                     }
  920:                 case (Ia.Ftn.Cl.Models.Business.Service.SupplementaryService.CallerId):
  921:                     {
  922:                         command = EwsdCommand(Opcode.UpdateSubXxx, dn);
  923:                         break;
  924:                     }
  925:                 case (Ia.Ftn.Cl.Models.Business.Service.SupplementaryService.CallForwarding):
  926:                     {
  927:                         command = EwsdCommand(Opcode.UpdateSubXxx, dn);
  928:                         break;
  929:                     }
  930:                 case (Ia.Ftn.Cl.Models.Business.Service.SupplementaryService.CallWaiting):
  931:                     {
  932:                         command = EwsdCommand(Opcode.UpdateSubXxx, dn);
  933:                         break;
  934:                     }
  935:                 case (Ia.Ftn.Cl.Models.Business.Service.SupplementaryService.ConferenceCall):
  936:                     {
  937:                         command = EwsdCommand(Opcode.UpdateSubXxx, dn);
  938:                         break;
  939:                     }
  940:                 case (Ia.Ftn.Cl.Models.Business.Service.SupplementaryService.WakeupCall):
  941:                     {
  942:                         command = EwsdCommand(Opcode.UpdateSubXxx, dn);
  943:                         break;
  944:                     }
  945:                 case (Ia.Ftn.Cl.Models.Business.Service.SupplementaryService.InternationalCallingUserControlled):
  946:                     {
  947:                         command = EwsdCommand(Opcode.UpdateSubXxx, dn);
  948:                         break;
  949:                     }
  950:                 case (Ia.Ftn.Cl.Models.Business.Service.SupplementaryService.InternationalCalling):
  951:                     {
  952:                         command = EwsdCommand(Opcode.UpdateSubXxx, dn);
  953:                         break;
  954:                     }
  955:                 case (Ia.Ftn.Cl.Models.Business.Service.SupplementaryService.ServiceSuspension):
  956:                     {
  957:                         command = EwsdCommand(Opcode.UpdateSubXxx, dn);
  958:                         break;
  959:                     }
  960:                 default:
  961:                     {
  962:                         command = dn + ",unknown SupplementaryService: " + supplementaryServiceState.ToString().ToLower();
  963:                         break;
  964:                     }
  965:             }
  966:  
  967:             return command;
  968:         }
  969:  
  970:         ////////////////////////////////////////////////////////////////////////////
  971:  
  972:         /// <summary>
  973:         ///
  974:         /// </summary>
  975:         public static string ServiceSuspensionCommand(Ia.Ftn.Cl.Models.Business.NetworkDesignDocument.Pstn pstn, string service, bool serviceSuspensionState)
  976:         {
  977:             string command;
  978:  
  979:             /*if (!pstn.UsesNpServer)*/
  980:             if (serviceSuspensionState) command = EwsdCommand(Opcode.SuspendTemp, service, true) + "\r\n"; // suspend
  981:             else command = EwsdCommand(Opcode.SuspendTemp, service, false) + "\r\n"; // release
  982:             //else s = string.Empty;
  983:  
  984:             return command;
  985:         }
  986:  
  987:         ////////////////////////////////////////////////////////////////////////////
  988:         ////////////////////////////////////////////////////////////////////////////
  989:  
  990:         /// <summary>
  991:         ///
  992:         /// </summary>
  993:         public static string EwsdCommand(Opcode opcode, string dn)
  994:         {
  995:             string command;
  996:  
  997:             if (opcode == Opcode.Dispsub) command = "DISPSUB:DN=" + dn + ";";
  998:             else if (opcode == Opcode.Dispkeyword) command = "DISPKEYWORD:DN=" + dn + ";";
  999:             else if (opcode == Opcode.Cansub) command = "CANSUB:DN=" + dn + ";";
 1000:             else if (opcode == Opcode.UpdateSubXxx) command = "DISPSUB:DN=" + dn + ";";
 1001:             //else if (opcode == Opcode.Crcpt) command = "CRCPT:CODE=" + dn + ",DEST=QRNTOHUAWEI,ORIG1=DEF;";
 1002:             //else if (opcode == Opcode.Disptime) command = "DISPTIME;";
 1003:             else
 1004:             {
 1005:                 throw new System.ArgumentOutOfRangeException("EwsdCommand(): Opcode unrecognized. ");
 1006:             }
 1007:  
 1008:             return command;
 1009:         }
 1010:  
 1011:         ////////////////////////////////////////////////////////////////////////////
 1012:  
 1013:         /// <summary>
 1014:         ///
 1015:         /// </summary>
 1016:         public static string EwsdCommand(Opcode opcode, string dn, bool b)
 1017:         {
 1018:             string command;
 1019:  
 1020:             if (opcode == Opcode.SuspendTemp) command = "SuspendTemp:DN=" + dn + ",Temp=" + b + ";";
 1021:             else if (opcode == Opcode.UpdateSubXxx) command = "DISPSUB:DN=" + dn + ";";
 1022:             else
 1023:             {
 1024:                 throw new System.ArgumentOutOfRangeException("EwsdCommand(): Opcode unrecognized. ");
 1025:             }
 1026:  
 1027:             return command;
 1028:         }
 1029:  
 1030:         ////////////////////////////////////////////////////////////////////////////
 1031:  
 1032:         /// <summary>
 1033:         /// Extract unique EWSD service symbols into array 
 1034:         /// </summary>
 1035:         public static void ExtractAndUpdateUniqueEwsdServiceSymbolListFromOutputContent(string outputContent)
 1036:         {
 1037:             string s;
 1038:             MatchCollection matchCollection;
 1039:  
 1040:             matchCollection = Regex.Matches(outputContent, @"\r\n   [\w]{1,}\s+= .+[^\r\n]");
 1041:  
 1042:             if (matchCollection.Count > 0)
 1043:             {
 1044:                 foreach (Match match in matchCollection)
 1045:                 {
 1046:                     s = Regex.Replace(match.Value, @"MASKNO:\d+", "");
 1047:                     s = Regex.Replace(s, @"\s+", " ");
 1048:                     s = s.Trim();
 1049:  
 1050:                     if (!ServiceSymbolList.Contains(s))
 1051:                     {
 1052:                         ServiceSymbolList.Add(s);
 1053:                     }
 1054:                 }
 1055:             }
 1056:         }
 1057:  
 1058:         ////////////////////////////////////////////////////////////////////////////
 1059:         ////////////////////////////////////////////////////////////////////////////
 1060:  
 1061:         /// <summary>
 1062:         ///
 1063:         /// </summary>
 1064:         public static string SpecialHandlingAndModificationOfPstnName(string pstnName)
 1065:         {
 1066:             // change JBL, SSB, FHH to QRN because they are just RSUs following QRN
 1067:             string modifiedPstnName;
 1068:  
 1069:             if (pstnName == "JBL") modifiedPstnName = "QRN";
 1070:             //else if (pstnName == "SSB") modifiedPstnName = "QRN"; // SSB is decommissioned
 1071:             else if (pstnName == "FHH") modifiedPstnName = "QRN";
 1072:             else if (pstnName == "WAF") modifiedPstnName = "QRN";
 1073:             else if (pstnName == "ZOR") modifiedPstnName = "QRN";
 1074:             else if (pstnName == "AMD") modifiedPstnName = "QRN";
 1075:             else if (pstnName == "RKK") modifiedPstnName = "QRN";
 1076:             else if (pstnName == "SHB") modifiedPstnName = "QRN";
 1077:             else if (pstnName == "UHN") modifiedPstnName = "QRN";
 1078:             else if (pstnName == "ABD") modifiedPstnName = "TECB";
 1079:             else modifiedPstnName = pstnName;
 1080:  
 1081:             return modifiedPstnName;
 1082:         }
 1083:  
 1084:         ////////////////////////////////////////////////////////////////////////////
 1085:         ////////////////////////////////////////////////////////////////////////////    
 1086:     }
 1087: }
 1088: