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

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

U2020 Northbound Interface IP (SoftX) support class for Huawei's Fixed Telecommunications Network (FTN) business model.

    1: using System;
    2: using System.Collections.Generic;
    3: using System.Configuration;
    4: using System.Data;
    5: using System.Diagnostics;
    6: using System.Linq;
    7:  
    8: namespace Ia.Ftn.Cl.Model.Business.Huawei
    9: {
   10:     ////////////////////////////////////////////////////////////////////////////
   11:  
   12:     /// <summary publish="true">
   13:     /// U2020 Northbound Interface IP (SoftX) support class for Huawei's Fixed Telecommunications Network (FTN) business model.
   14:     /// </summary>
   15:  
   16:     /// <remarks> 
   17:     /// Copyright © 2019-2020 Jasem Y. Al-Shamlan (info@ia.com.kw), Integrated Applications - Kuwait. All Rights Reserved.
   18:     ///
   19:     /// 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
   20:     /// the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
   21:     ///
   22:     /// This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
   23:     /// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
   24:     /// 
   25:     /// You should have received a copy of the GNU General Public License along with this library. If not, see http://www.gnu.org/licenses.
   26:     /// 
   27:     /// Copyright notice: This notice may not be removed or altered from any source distribution.
   28:     /// </remarks> 
   29:     public class SoftX
   30:     {
   31:         /*
   32:          * Add the following settings
   33:          * <add key="softXHuaweiServerHost" value="*" />
   34:          * <add key="softXHuaweiServerPort" value="*" />
   35:          * <add key="softXHuaweiServerLoginUser" value="LGI:OP=&quot;******&quot;,PWD=&quot;******&quot;;" />
   36:          * <add key="softXHuaweiServerLogoutUser" value="LGO:OP=&quot;******&quot;;" />
   37:         */
   38:  
   39:         private static List<string> properlySelectedSoftXCommandList = new List<string>();
   40:         private static Queue<ProvisioningWorkflow> synchronizationCommandQueue = new Queue<ProvisioningWorkflow>();
   41:         private static readonly Procedure addOrRemoveAsbrSubscriberProcedure = new Ia.Ftn.Cl.Model.Business.Procedure(Ia.Ftn.Cl.Model.Business.Provision.ServiceOntToAddAndToRemoveInAsbrList);
   42:  
   43:         private static Ia.Ftn.Cl.Model.Client.Huawei.SoftX tecSoftX;
   44:         private static Ia.Ftn.Cl.Model.Client.Huawei.SoftX skbSoftX;
   45:  
   46:         /// <summary/>
   47:         public const int RemotePort = 2944;
   48:  
   49:         /// <summary/>
   50:         public enum SoftXOpcode { LstMgw, LstAsbr, AddMgw, AddAsbr, RemoveAsbr }
   51:  
   52:         /// <summary/>
   53:         //public enum Mode { NUM = 0, IMSINUM = 1 };
   54:  
   55:         /// <summary/>
   56:         //public enum Servattr { OMNP = 0 };
   57:  
   58:         /// <summary/>
   59:         //public enum NumType { TYPE0 = 0, TYPE1 = 1, TYPE2 = 2, TYPE3 = 3, TYPE4 = 4, TYPE5 = 5, TYPE8 = 8, TYPE9 = 9 };
   60:  
   61:         /// <summary/>
   62:         public class NetworkElement
   63:         {
   64:             public string Symbol;
   65:             public string Domain;
   66:             public string NetId;
   67:             public string Ip;
   68:             public string La;
   69:         }
   70:  
   71:         /// <summary/>
   72:         public static NetworkElement[] NetworkElementList =
   73:         {
   74:             new NetworkElement {Symbol = "TEC", Domain = "tec.agcf01", NetId = "tec-agcf-vnid", Ip="10.10.11.20", La="10.10.9.10" },
   75:             new NetworkElement {Symbol = "SKB", Domain = "skb.agcf01", NetId = "skb-agcf-vnid", Ip="10.10.15.20", La="10.10.13.10" },
   76:         };
   77:  
   78:         /// <summary/>
   79:         public static NetworkElement SkbNetworkElement
   80:         {
   81:             get
   82:             {
   83:                 return (from n in NetworkElementList where n.Symbol == "SKB" select n).Single();
   84:             }
   85:         }
   86:  
   87:         /// <summary/>
   88:         public static NetworkElement TecNetworkElement
   89:         {
   90:             get
   91:             {
   92:                 return (from n in NetworkElementList where n.Symbol == "TEC" select n).Single();
   93:             }
   94:         }
   95:  
   96:         /// <summary/>
   97:         public class FieldIdNameExplanation
   98:         {
   99:             public int Id;
  100:             public string FieldName;
  101:             public string FieldExplanation;
  102:         }
  103:  
  104:         /*
  105:         /// <summary/>
  106:         public static FieldIdNameExplanation[] NumTypeFieldIdExplanationList =
  107:            {
  108:             new FieldIdNameExplanation {Id = (int)NumType.TYPE0, FieldExplanation="In local network" },
  109:             new FieldIdNameExplanation {Id = (int)NumType.TYPE1, FieldExplanation="Moved out of local network" },
  110:             new FieldIdNameExplanation {Id = (int)NumType.TYPE2, FieldExplanation="Moved in from external network" },
  111:             new FieldIdNameExplanation {Id = (int)NumType.TYPE3, FieldExplanation="Moved to another non-local number" },
  112:             new FieldIdNameExplanation {Id = (int)NumType.TYPE4, FieldExplanation="Flexible number" },
  113:             new FieldIdNameExplanation {Id = (int)NumType.TYPE5, FieldExplanation="Moved from GSM to CDMA network" },
  114:             new FieldIdNameExplanation {Id = (int)NumType.TYPE8, FieldExplanation="Moved from CDMA to GSM network" },
  115:             new FieldIdNameExplanation {Id = (int)NumType.TYPE9, FieldExplanation="Local fixed network" }
  116:         };
  117:         */
  118:  
  119:         /// <summary/>
  120:         //public enum RnidxType { HLR = 0, RN = 1, ALL = 2 };
  121:  
  122:         /*
  123:         /// <summary/>
  124:         public static FieldIdNameExplanation[] RnidxTypeFieldIdExplanationList =
  125:            {
  126:             new FieldIdNameExplanation { Id = (int)RnidxType.HLR,FieldExplanation="HLR number index" },
  127:             new FieldIdNameExplanation { Id = (int)RnidxType.RN,FieldExplanation="Route number index" },
  128:             new FieldIdNameExplanation { Id = (int)RnidxType.ALL,FieldExplanation="HLR+RN" },
  129:         };
  130:         */
  131:  
  132:         /// <summary/>
  133:         public static FieldIdNameExplanation[] ParameterFieldNameExplanationList =
  134:            {
  135:             new FieldIdNameExplanation { FieldName = "TID",FieldExplanation="Termination ID" },
  136:             new FieldIdNameExplanation { FieldName = "PUI",FieldExplanation="PublicUser Id" },
  137:             new FieldIdNameExplanation { FieldName = "PRI",FieldExplanation="PrivateUser Id" },
  138:             new FieldIdNameExplanation { FieldName = "RGN",FieldExplanation="IMS Registration Group Name" },
  139:             new FieldIdNameExplanation { FieldName = "TET",FieldExplanation="Terminal Equipment Type" },
  140:             new FieldIdNameExplanation { FieldName = "MN",FieldExplanation="Module number" },
  141:             new FieldIdNameExplanation { FieldName = "DID",FieldExplanation="Port type" },
  142:             new FieldIdNameExplanation { FieldName = "PLF",FieldExplanation="Priority Line flag" },
  143:             new FieldIdNameExplanation { FieldName = "TS",FieldExplanation="Termination Status" },
  144:             //new FieldIdNameExplanation { FieldName = "XXXXXX",FieldExplanation="New Service Right" },
  145:             new FieldIdNameExplanation { FieldName = "DT",FieldExplanation="Default Dial Tone" },
  146:             new FieldIdNameExplanation { FieldName = "HNID",FieldExplanation="Home Network ID" },
  147:             new FieldIdNameExplanation { FieldName = "NETID",FieldExplanation="Visited Network ID" },
  148:             new FieldIdNameExplanation { FieldName = "NETINFO",FieldExplanation="Access Network Info" },
  149:             new FieldIdNameExplanation { FieldName = "PHNCON",FieldExplanation="Phone Context Index" },
  150:             new FieldIdNameExplanation { FieldName = "DIGMAP",FieldExplanation="Initial DigitMap Index" },
  151:             new FieldIdNameExplanation { FieldName = "GLOBDMAPIDX",FieldExplanation="Global DigitMap Index" },
  152:             new FieldIdNameExplanation { FieldName = "PWD",FieldExplanation="Password" },
  153:             new FieldIdNameExplanation { FieldName = "SGN",FieldExplanation="SCC Group Name" },
  154:             new FieldIdNameExplanation { FieldName = "SOCGN",FieldExplanation="SOC Group Number" },
  155:             new FieldIdNameExplanation { FieldName = "DP",FieldExplanation="Download Profile Flag" },
  156:             new FieldIdNameExplanation { FieldName = "DR",FieldExplanation="Send Registration Subscription Flag" },
  157:             new FieldIdNameExplanation { FieldName = "EMGCN",FieldExplanation="Emergency Call Group Name" },
  158:             new FieldIdNameExplanation { FieldName = "CONF",FieldExplanation="Conference URI index" },
  159:             new FieldIdNameExplanation { FieldName = "CLIPMD",FieldExplanation="CLIP/R Mode" },
  160:             new FieldIdNameExplanation { FieldName = "IFMIMN",FieldExplanation="IFMI Module Number" },
  161:             new FieldIdNameExplanation { FieldName = "CODEC",FieldExplanation="Codec prefer" },
  162:             new FieldIdNameExplanation { FieldName = "CGP",FieldExplanation="Gate Proprity" },
  163:             new FieldIdNameExplanation { FieldName = "EID",FieldExplanation="Equipment ID" },
  164:             new FieldIdNameExplanation { FieldName = "MGWID",FieldExplanation="MGW ID" },           
  165:             //new FieldIdNameExplanation { FieldName = "XXXXXX",FieldExplanation="Global MGW index" },           
  166:             new FieldIdNameExplanation { FieldName = "MGWDESC",FieldExplanation="MGW description" },
  167:             new FieldIdNameExplanation { FieldName = "MGWGROUPNO",FieldExplanation="MGW Group Number" },
  168:             new FieldIdNameExplanation { FieldName = "CP",FieldExplanation="Audio codec prefer" },           
  169:             //new FieldIdNameExplanation { FieldName = "XXXXXX",FieldExplanation="MGW Group Name" },           
  170:             //new FieldIdNameExplanation { FieldName = "XXXXXX",FieldExplanation="Session Border Control" },           
  171:             //new FieldIdNameExplanation { FieldName = "XXXXXX",FieldExplanation="Session Border Control Description" },           
  172:             new FieldIdNameExplanation { FieldName = "GWTP",FieldExplanation="Gateway type" },           
  173:             //new FieldIdNameExplanation { FieldName = "XXXXXX",FieldExplanation="Control MID" },           
  174:             new FieldIdNameExplanation { FieldName = "PTYPE",FieldExplanation="Protocol type" },
  175:             new FieldIdNameExplanation { FieldName = "CODETYPE",FieldExplanation="Code type" },
  176:             new FieldIdNameExplanation { FieldName = "TDMIFC1",FieldExplanation="TDM termination ID prefix1" },
  177:             new FieldIdNameExplanation { FieldName = "TDMIFC2",FieldExplanation="TDM termination ID prefix2" },
  178:             new FieldIdNameExplanation { FieldName = "TDMIFC3",FieldExplanation="TDM termination ID prefix3" },
  179:             new FieldIdNameExplanation { FieldName = "TDMIFC4",FieldExplanation="TDM termination ID prefix4" },
  180:             new FieldIdNameExplanation { FieldName = "TDMIFC5",FieldExplanation="TDM termination ID prefix5" },
  181:             new FieldIdNameExplanation { FieldName = "TDMIFC6",FieldExplanation="TDM termination ID prefix6" },
  182:             new FieldIdNameExplanation { FieldName = "TDMIFC7",FieldExplanation="TDM termination ID prefix7" },
  183:             new FieldIdNameExplanation { FieldName = "TDMIFC8",FieldExplanation="TDM termination ID prefix8" },
  184:             new FieldIdNameExplanation { FieldName = "TDMIFC9",FieldExplanation="TDM termination ID prefix9" },
  185:             new FieldIdNameExplanation { FieldName = "TDMIFC10",FieldExplanation="TDM termination ID prefix10" },
  186:             new FieldIdNameExplanation { FieldName = "TDMIFC11",FieldExplanation="TDM termination ID prefix11" },
  187:             new FieldIdNameExplanation { FieldName = "TDMIFC12",FieldExplanation="TDM termination ID prefix12" },
  188:             new FieldIdNameExplanation { FieldName = "TDMIFC13",FieldExplanation="TDM termination ID prefix13" },
  189:             new FieldIdNameExplanation { FieldName = "TDMIFC14",FieldExplanation="TDM termination ID prefix14" },
  190:             new FieldIdNameExplanation { FieldName = "TDMIFC15",FieldExplanation="TDM termination ID prefix15" },
  191:             new FieldIdNameExplanation { FieldName = "TDMIFC16",FieldExplanation="TDM termination ID prefix16" },
  192:             new FieldIdNameExplanation { FieldName = "RTPIFC",FieldExplanation="RTP termination ID prefix" },
  193:             new FieldIdNameExplanation { FieldName = "HAIRPIN",FieldExplanation="Hairpin connection" },
  194:             new FieldIdNameExplanation { FieldName = "MSTYPE",FieldExplanation="Master/Slave type" },
  195:             new FieldIdNameExplanation { FieldName = "MRSCAP",FieldExplanation="Media resource server" },
  196:             new FieldIdNameExplanation { FieldName = "UCATT",FieldExplanation="Special attributes" },
  197:             new FieldIdNameExplanation { FieldName = "UCATTEX",FieldExplanation="Extend Special attributes" },
  198:             new FieldIdNameExplanation { FieldName = "OIPDM",FieldExplanation="Origin IP domain" },
  199:             new FieldIdNameExplanation { FieldName = "E2ET",FieldExplanation="Support E2E trace or not" },
  200:             new FieldIdNameExplanation { FieldName = "TOS",FieldExplanation="TOS Value" },
  201:             new FieldIdNameExplanation { FieldName = "HEARTBEATTIMES",FieldExplanation="Heartbeat Times" },
  202:             new FieldIdNameExplanation { FieldName = "PREMRS1",FieldExplanation="Preference MRS 1" },
  203:             new FieldIdNameExplanation { FieldName = "PREMRS2",FieldExplanation="Preference MRS 2" },
  204:             new FieldIdNameExplanation { FieldName = "PREMRS3",FieldExplanation="Preference MRS 3" },
  205:             new FieldIdNameExplanation { FieldName = "AGID",FieldExplanation="Global AG number" },
  206:             new FieldIdNameExplanation { FieldName = "IMSFLAG",FieldExplanation="IMS flag" },
  207:             new FieldIdNameExplanation { FieldName = "MMFLAG",FieldExplanation="Single AG switch flag" },
  208:             new FieldIdNameExplanation { FieldName = "NOTHWDEV",FieldExplanation="Not Authentication MG" },
  209:             new FieldIdNameExplanation { FieldName = "MIXVOICE",FieldExplanation="Mix voice flag" },
  210:             new FieldIdNameExplanation { FieldName = "VBDCODECMODE",FieldExplanation="VBD code mode" },
  211:             new FieldIdNameExplanation { FieldName = "ET",FieldExplanation="Encryption type" },
  212:             new FieldIdNameExplanation { FieldName = "DYNIP",FieldExplanation="Support dynamic IP address" },
  213:             new FieldIdNameExplanation { FieldName = "KEY",FieldExplanation="Key" },           
  214:             //new FieldIdNameExplanation { FieldName = "XXXXXX",FieldExplanation="DH Authentication MGID" },           
  215:             //new FieldIdNameExplanation { FieldName = "XXXXXX",FieldExplanation="SPI" },           
  216:             new FieldIdNameExplanation { FieldName = "SUPROOTPKG",FieldExplanation="Root package" },           
  217:             //new FieldIdNameExplanation { FieldName = "XXXXXX",FieldExplanation="Normal MG execution time" },           
  218:             //new FieldIdNameExplanation { FieldName = "XXXXXX",FieldExplanation="Normal MGC execution time" },           
  219:             //new FieldIdNameExplanation { FieldName = "XXXXXX",FieldExplanation="MG provisional response timer value" },           
  220:             //new FieldIdNameExplanation { FieldName = "XXXXXX",FieldExplanation="MGC provisional response timer value" },           
  221:             //new FieldIdNameExplanation { FieldName = "XXXXXX",FieldExplanation="MGC originated pending limit" },           
  222:             //new FieldIdNameExplanation { FieldName = "XXXXXX",FieldExplanation="MG originated pending limit" },           
  223:             new FieldIdNameExplanation { FieldName = "LA",FieldExplanation="Local IP address" },           
  224:             //new FieldIdNameExplanation { FieldName = "XXXXXX",FieldExplanation="Local port" },           
  225:             new FieldIdNameExplanation { FieldName = "RA1",FieldExplanation="Remote IP address 1" },
  226:             new FieldIdNameExplanation { FieldName = "RA2",FieldExplanation="Remote IP address 2" },
  227:             new FieldIdNameExplanation { FieldName = "RA3",FieldExplanation="Remote IP address 3" },
  228:             new FieldIdNameExplanation { FieldName = "RA4",FieldExplanation="Remote IP address 4" },
  229:             new FieldIdNameExplanation { FieldName = "RA5",FieldExplanation="Remote IP address 5" },
  230:             new FieldIdNameExplanation { FieldName = "RP",FieldExplanation="Remote port" },
  231:             new FieldIdNameExplanation { FieldName = "LISTOFCODEC",FieldExplanation="Codec list" },
  232:             new FieldIdNameExplanation { FieldName = "EC",FieldExplanation="EC" },
  233:             new FieldIdNameExplanation { FieldName = "USRRATE",FieldExplanation="User Rate" },
  234:             new FieldIdNameExplanation { FieldName = "ENVOICEATTR",FieldExplanation="Enhanced Voice Attribute" },
  235:             new FieldIdNameExplanation { FieldName = "MGWFCFLAG",FieldExplanation="Gateway Support H.248.11 Protocol" },
  236:             new FieldIdNameExplanation { FieldName = "OBJRATE",FieldExplanation="OverLoad Object Rate" },
  237:             new FieldIdNameExplanation { FieldName = "PROTCTTM",FieldExplanation="OverLoad Protect time" },
  238:             new FieldIdNameExplanation { FieldName = "IPDOMAIN",FieldExplanation="IPDomain" },
  239:         };
  240:  
  241:         /// <summary/>
  242:         public class ProvisioningWorkflow
  243:         {
  244:             /// <summary/>
  245:             public string ReadCommand { get; set; }
  246:  
  247:             /// <summary/>
  248:             public string TecCreateCommand { get; set; }
  249:  
  250:             /// <summary/>
  251:             public string SkbCreateCommand { get; set; }
  252:  
  253:             /// <summary/>
  254:             public ProvisioningWorkflow()
  255:             {
  256:  
  257:             }
  258:         }
  259:  
  260:         /// <summary/>
  261:         public static string Host { get { return ConfigurationManager.AppSettings["softXHuaweiServerHost"].ToString(); } }
  262:  
  263:         /// <summary/>
  264:         public static int Port { get { return int.Parse(ConfigurationManager.AppSettings["softXHuaweiServerPort"].ToString()); } }
  265:  
  266:         /// <summary/>
  267:         public static string LoginUser { get { return ConfigurationManager.AppSettings["softXHuaweiServerLoginUser"].ToString(); } }
  268:  
  269:         /// <summary/>
  270:         public static string LogoutUser { get { return ConfigurationManager.AppSettings["softXHuaweiServerLogoutUser"].ToString(); } }
  271:  
  272:         /// <summary/>
  273:         public static string SemiColon { get { return ";"; } }
  274:  
  275:         ////////////////////////////////////////////////////////////////////////////
  276:  
  277:         /// <summary>
  278:         /// 
  279:         /// </summary>
  280:         public class Response
  281:         {
  282:             /// <summary/>
  283:             public bool IsSuccess { get { return ReturnCode == Ia.Ftn.Cl.Model.Client.Huawei.SoftX.ResultCode.OperationSucceeded; } }
  284:  
  285:             /// <summary/>
  286:             public Ia.Ftn.Cl.Model.Client.Huawei.SoftX.ResultCode ReturnCode { get; set; }
  287:  
  288:             /// <summary/>
  289:             public string NetworkElement { get; set; }
  290:  
  291:             /// <summary/>
  292:             public string CodeExplanation { get; set; }
  293:  
  294:             /// <summary/>
  295:             public string CommandString { get; set; }
  296:  
  297:             /// <summary/>
  298:             public string Content { get; set; }
  299:  
  300:             /// <summary/>
  301:             public int Count { get; set; }
  302:  
  303:             /// <summary/>
  304:             public Dictionary<string, string> QueryDictionary { get; set; }
  305:  
  306:             /// <summary/>
  307:             public Response() { }
  308:         }
  309:  
  310:         ////////////////////////////////////////////////////////////////////////////
  311:  
  312:         /// <summary>
  313:         ///
  314:         /// </summary>
  315:         public SoftX() { }
  316:  
  317:         ////////////////////////////////////////////////////////////////////////////
  318:  
  319:         /// <summary>
  320:         ///
  321:         /// </summary>
  322:         public static Ia.Cl.Models.Result Connect()
  323:         {
  324:             var result = new Ia.Cl.Models.Result();
  325:  
  326:             tecSoftX = new Cl.Model.Client.Huawei.SoftX();
  327:             skbSoftX = new Cl.Model.Client.Huawei.SoftX();
  328:  
  329:             if (tecSoftX != null && !tecSoftX.IsConnected) tecSoftX.Connect(out result);
  330:             else result.AddWarning("TEC SoftX is already connected. ");
  331:  
  332:             if (skbSoftX != null && !skbSoftX.IsConnected) skbSoftX.Connect(out result);
  333:             else result.AddWarning("SKB SoftX is already connected. ");
  334:  
  335:             return result;
  336:         }
  337:  
  338:         ////////////////////////////////////////////////////////////////////////////
  339:  
  340:         /// <summary>
  341:         ///
  342:         /// </summary>
  343:         public static Ia.Cl.Models.Result Disconnect()
  344:         {
  345:             var result = new Ia.Cl.Models.Result();
  346:  
  347:             if (tecSoftX != null && tecSoftX.IsConnected) tecSoftX.Disconnect(out result);
  348:             else result.AddWarning("TEC SoftX is already disconnected. ");
  349:  
  350:             if (skbSoftX != null && skbSoftX.IsConnected) skbSoftX.Disconnect(out result);
  351:             else result.AddWarning("SKB SoftX is already disconnected. ");
  352:  
  353:             return result;
  354:         }
  355:  
  356:         ////////////////////////////////////////////////////////////////////////////
  357:  
  358:         /// <summary>
  359:         ///
  360:         /// </summary>
  361:         public static void Login()
  362:         {
  363:             tecSoftX.Login();
  364:             skbSoftX.Login();
  365:         }
  366:  
  367:         ////////////////////////////////////////////////////////////////////////////
  368:  
  369:         /// <summary>
  370:         ///
  371:         /// </summary>
  372:         public static void Logout()
  373:         {
  374:             tecSoftX.Logout();
  375:             skbSoftX.Logout();
  376:         }
  377:  
  378:         ////////////////////////////////////////////////////////////////////////////
  379:  
  380:         /// <summary>
  381:         ///
  382:         /// </summary>
  383:         public static void RegisterNe()
  384:         {
  385:             var c = Ia.Ftn.Cl.Model.Business.Huawei.SoftX.RegisterNetworkElementCommand(Ia.Ftn.Cl.Model.Business.Huawei.SoftX.TecNetworkElement);
  386:             tecSoftX.SendQueue.Enqueue(c);
  387:  
  388:             c = Ia.Ftn.Cl.Model.Business.Huawei.SoftX.RegisterNetworkElementCommand(Ia.Ftn.Cl.Model.Business.Huawei.SoftX.SkbNetworkElement);
  389:             skbSoftX.SendQueue.Enqueue(c);
  390:         }
  391:  
  392:         ////////////////////////////////////////////////////////////////////////////
  393:  
  394:         /// <summary>
  395:         ///
  396:         /// </summary>
  397:         public static void UnregisterNe()
  398:         {
  399:             var c = Ia.Ftn.Cl.Model.Business.Huawei.SoftX.UnregisterNetworkElementCommand(Ia.Ftn.Cl.Model.Business.Huawei.SoftX.TecNetworkElement);
  400:             tecSoftX.SendQueue.Enqueue(c);
  401:  
  402:             c = Ia.Ftn.Cl.Model.Business.Huawei.SoftX.UnregisterNetworkElementCommand(Ia.Ftn.Cl.Model.Business.Huawei.SoftX.SkbNetworkElement);
  403:             skbSoftX.SendQueue.Enqueue(c);
  404:         }
  405:  
  406:         ////////////////////////////////////////////////////////////////////////////
  407:  
  408:         /// <summary>
  409:         ///
  410:         /// </summary>
  411:         private static string RegisterNetworkElementCommand(NetworkElement networkElement)
  412:         {
  413:             // REG NE:IP="10.10.11.20";
  414:             return @"REG NE:IP=""" + networkElement.Ip + @""";";
  415:         }
  416:  
  417:         ////////////////////////////////////////////////////////////////////////////
  418:  
  419:         /// <summary>
  420:         ///
  421:         /// </summary>
  422:         private static string UnregisterNetworkElementCommand(NetworkElement networkElement)
  423:         {
  424:             // UNREG NE:IP="10.161.198.243"; 
  425:             return @"UNREG NE:IP=""" + networkElement.Ip + @""";";
  426:         }
  427:  
  428:         ////////////////////////////////////////////////////////////////////////////
  429:  
  430:         /// <summary>
  431:         ///
  432:         /// </summary>
  433:         public static Queue<string> TecReceiveQueue
  434:         {
  435:             get
  436:             {
  437:                 return tecSoftX.ReceiveQueue;
  438:             }
  439:         }
  440:  
  441:         ////////////////////////////////////////////////////////////////////////////
  442:  
  443:         /// <summary>
  444:         ///
  445:         /// </summary>
  446:         public static Queue<string> TecSendQueue
  447:         {
  448:             get
  449:             {
  450:                 return tecSoftX.SendQueue;
  451:             }
  452:         }
  453:  
  454:         ////////////////////////////////////////////////////////////////////////////
  455:  
  456:         /// <summary>
  457:         ///
  458:         /// </summary>
  459:         public static Queue<string> SkbReceiveQueue
  460:         {
  461:             get
  462:             {
  463:                 return skbSoftX.ReceiveQueue;
  464:             }
  465:         }
  466:  
  467:         ////////////////////////////////////////////////////////////////////////////
  468:  
  469:         /// <summary>
  470:         ///
  471:         /// </summary>
  472:         public static Queue<string> SkbSendQueue
  473:         {
  474:             get
  475:             {
  476:                 return skbSoftX.SendQueue;
  477:             }
  478:         }
  479:  
  480:         ////////////////////////////////////////////////////////////////////////////
  481:  
  482:         /// <summary>
  483:         ///
  484:         /// </summary>
  485:         public static bool IsConnected
  486:         {
  487:             get
  488:             {
  489:                 return tecSoftX != null && tecSoftX.IsConnected && skbSoftX != null && skbSoftX.IsConnected;
  490:             }
  491:         }
  492:  
  493:         ////////////////////////////////////////////////////////////////////////////
  494:         ////////////////////////////////////////////////////////////////////////////
  495:  
  496:         /// <summary>
  497:         ///
  498:         /// </summary>
  499:         public static Ia.Cl.Models.Result ManageReceiveQueue()
  500:         {
  501:             string rowString, formattedString;
  502:  
  503:             var result = new Ia.Cl.Models.Result();
  504:             var tecSoftXResult = new Ia.Cl.Models.Result();
  505:             var skbSoftXResult = new Ia.Cl.Models.Result();
  506:  
  507:             try
  508:             {
  509:                 while (tecSoftX.ReceiveQueue.Count > 0)
  510:                 {
  511:                     rowString = tecSoftX.ReceiveQueue.Dequeue();
  512:  
  513:                     Debug.WriteLine("ManageReceiveQueue(): rowString: " + rowString);
  514:  
  515:                     formattedString = rowString;
  516:  
  517:                     tecSoftX.Update(formattedString, ref tecSoftX, out tecSoftXResult);
  518:                 }
  519:  
  520:                 while (skbSoftX.ReceiveQueue.Count > 0)
  521:                 {
  522:                     rowString = skbSoftX.ReceiveQueue.Dequeue();
  523:  
  524:                     Debug.WriteLine("ManageReceiveQueue(): rowString: " + rowString);
  525:  
  526:                     formattedString = rowString;
  527:  
  528:                     skbSoftX.Update(formattedString, ref skbSoftX, out skbSoftXResult);
  529:                 }
  530:  
  531:                 result.AddResult(tecSoftXResult);
  532:                 result.AddResult(skbSoftXResult);
  533:             }
  534:             catch (Exception ex)
  535:             {
  536:                 result.AddError("ManageReceiveQueue: Exception: " + ex.Message);
  537:             }
  538:  
  539:             return result;
  540:         }
  541:  
  542:         ////////////////////////////////////////////////////////////////////////////
  543:  
  544:         /// <summary>
  545:         ///
  546:         /// </summary>
  547:         public static string ManageSendQueue(out Ia.Cl.Models.Result result)
  548:         {
  549:             string command = string.Empty;
  550:             var commandList = new List<string>();
  551:  
  552:             result = new Ia.Cl.Models.Result();
  553:  
  554:             try
  555:             {
  556:                 if (tecSoftX.SendQueue.Count > 0)
  557:                 {
  558:                     command = tecSoftX.SendQueue.Dequeue();
  559:  
  560:                     Debug.WriteLine("ManageSendQueue(): command: " + command);
  561:  
  562:                     tecSoftX.Send(command, out Ia.Cl.Models.Result r);
  563:  
  564:                     if (r.HasError) result.AddError(r.Message);
  565:  
  566:                     commandList.Add(command);
  567:                 }
  568:  
  569:                 if (skbSoftX.SendQueue.Count > 0)
  570:                 {
  571:                     command = skbSoftX.SendQueue.Dequeue();
  572:  
  573:                     Debug.WriteLine("ManageSendQueue(): command: " + command);
  574:  
  575:                     skbSoftX.Send(command, out Ia.Cl.Models.Result r);
  576:  
  577:                     if (r.HasError) result.AddError(r.Message);
  578:  
  579:                     commandList.Add(command);
  580:                 }
  581:             }
  582:             catch (Exception ex)
  583:             {
  584:                 result.AddError("ManageSendQueue: Exception: " + ex.Message);
  585:             }
  586:  
  587:             return result.HasError ? string.Empty : string.Join(" ", commandList);
  588:         }
  589:  
  590:         ////////////////////////////////////////////////////////////////////////////
  591:  
  592:         /// <summary>
  593:         ///
  594:         /// </summary>
  595:         private static string KeepAliveShakeHandCommand
  596:         {
  597:             get
  598:             {
  599:                 return "SHK HAND:;";
  600:             }
  601:         }
  602:  
  603:         ////////////////////////////////////////////////////////////////////////////
  604:  
  605:         /// <summary>
  606:         ///
  607:         /// </summary>
  608:         private static string ProperlySelectedSingleSoftXCommandQueueCommand(ref int referenceIndex, out int itemIndex, out int listCount)
  609:         {
  610:             if (properlySelectedSoftXCommandList.JustStartedOrRolledOver())
  611:             {
  612:                 //list = new List<string>(); // SoftXCommandToRetrieveAllPossibleMgwsPreferablyNotInMgwTable();
  613:  
  614:                 properlySelectedSoftXCommandList = SoftXCommandToRetrieveAllPossibleAsbrsPreferablyNotInAsbrsTable();
  615:             }
  616:  
  617:             var command = properlySelectedSoftXCommandList.Next(ref referenceIndex, out itemIndex, out listCount);
  618:  
  619:             return command;
  620:         }
  621:  
  622:         ////////////////////////////////////////////////////////////////////////////
  623:  
  624:         /// <summary>
  625:         ///
  626:         /// </summary>
  627:         public static List<string> SoftXCommandToRetrieveAllPossibleMgwsPreferablyNotInMgwTable()
  628:         {
  629:             HashSet<string> hashSet;
  630:  
  631:             hashSet = new HashSet<string>();
  632:  
  633:             //var nddOntInHuaweiSwitchNokiaAccessWithAccessList = Ia.Ftn.Cl.Model.Data.Huawei.Ims.NddOntInHuaweiSwitchNokiaAccessWithAccessList();
  634:             var nddOntInHuaweiSwitchNokiaAccessList = Ia.Ftn.Cl.Model.Data.Huawei.Ims.NddOntInHuaweiSwitchNokiaAccessList();
  635:  
  636:             var ipEidOfnddOntInHuaweiSwitchNokiaAccessWithAccessList = new List<string>();
  637:  
  638:             /*
  639:             foreach (var n in nddOntInHuaweiSwitchNokiaAccessWithAccessList)
  640:             {
  641:                 if (Ia.Cl.Models.Default.IsValidIpv4(n.Ip))
  642:                 {
  643:                     ipEidOfnddOntInHuaweiSwitchNokiaAccessWithAccessList.Add(IpToEid(n.Ip));
  644:                 }
  645:                 else
  646:                 {
  647:                 }
  648:             }
  649:             */
  650:  
  651:             var ipEidOfnddOntInHuaweiSwitchNokiaAccessList = new List<string>();
  652:  
  653:             foreach (var n in nddOntInHuaweiSwitchNokiaAccessList)
  654:             {
  655:                 if (Ia.Cl.Models.Default.IsValidIpv4(n.Ip))
  656:                 {
  657:                     ipEidOfnddOntInHuaweiSwitchNokiaAccessList.Add(IpToEid(n.Ip));
  658:                 }
  659:                 else
  660:                 {
  661:                 }
  662:             }
  663:  
  664:             var eid0List = Ia.Ftn.Cl.Model.Data.Huawei.Mgw.EidList();
  665:             eid0List = eid0List.Distinct().ToList();
  666:  
  667:             //var eidList = ipEidOfnddOntInHuaweiSwitchNokiaAccessWithAccessList.Except(eid0List).ToList();
  668:             var eidList = ipEidOfnddOntInHuaweiSwitchNokiaAccessList.Except(eid0List).ToList();
  669:  
  670:             // if eidList is empty then will use the all list
  671:             //if (eidList.Count == 0) eidList = ipEidOfnddOntInHuaweiSwitchNokiaAccessWithAccessList;
  672:             if (eidList.Count == 0) eidList = ipEidOfnddOntInHuaweiSwitchNokiaAccessList;
  673:  
  674:             var commandList = new List<string>();
  675:  
  676:             foreach (string eid in eidList)
  677:             {
  678:                 commandList.Add(Ia.Ftn.Cl.Model.Business.Huawei.SoftX.FormatSoftXLstCommand(SoftXOpcode.LstMgw, eid));
  679:             }
  680:  
  681:             hashSet.UnionWith(new HashSet<string>(commandList));
  682:  
  683:             return hashSet.OrderBy(u => u).ToList();
  684:         }
  685:  
  686:         ////////////////////////////////////////////////////////////////////////////
  687:  
  688:         /// <summary>
  689:         ///
  690:         /// </summary>
  691:         public static List<string> SoftXCommandToRetrieveAllPossibleAsbrsPreferablyNotInAsbrsTable()
  692:         {
  693:             string pui;
  694:             HashSet<string> hashSet;
  695:  
  696:             hashSet = new HashSet<string>();
  697:  
  698:             var possibleList = Ia.Ftn.Cl.Model.Data.Service.AllPossibleServiceNumberWithinSoftX().ConvertAll<string>(u => u.ToString());
  699:  
  700:             // temp
  701:             //possibleList = possibleList.Where(u => u.StartsWith("254")).ToList();
  702:  
  703:             var existingList = Ia.Ftn.Cl.Model.Data.Huawei.Asbr.ServiceList();
  704:  
  705:             var list = possibleList.Except(existingList).ToList();
  706:  
  707:             // if list is empty then will use the possibleList
  708:             if (list.Count == 0) list = possibleList;
  709:  
  710:             var commandList = new List<string>();
  711:  
  712:             foreach (string service in list)
  713:             {
  714:                 pui = Ia.Ftn.Cl.Model.Business.NumberFormatConverter.ImpuSipDomain(service);
  715:  
  716:                 commandList.Add(Ia.Ftn.Cl.Model.Business.Huawei.SoftX.FormatSoftXLstCommand(SoftXOpcode.LstAsbr, pui));
  717:             }
  718:  
  719:             hashSet.UnionWith(new HashSet<string>(commandList));
  720:  
  721:             return hashSet.OrderBy(u => u).ToList();
  722:         }
  723:  
  724:         ////////////////////////////////////////////////////////////////////////////
  725:         ////////////////////////////////////////////////////////////////////////////
  726:  
  727:  
  728:  
  729:         ////////////////////////////////////////////////////////////////////////////
  730:         ////////////////////////////////////////////////////////////////////////////
  731:  
  732:         /// <summary>
  733:         ///
  734:         /// </summary>
  735:         public static Ia.Cl.Models.Result AddAsbr(Ia.Ftn.Cl.Model.Business.NetworkDesignDocument.Ont nddOnt, string service, int port)
  736:         {
  737:             string command;
  738:             Ia.Cl.Models.Result result;
  739:  
  740:             result = new Ia.Cl.Models.Result();
  741:  
  742:             var ont = Ia.Ftn.Cl.Model.Data.Nokia.Ont.Read(nddOnt.Id);
  743:  
  744:             if (ont != null)
  745:             {
  746:                 port = (port != Ia.Ftn.Cl.Model.Business.Default.PortUndefinedOrInvalidOrUnknown) ? port : Ia.Ftn.Cl.Model.Data.Huawei.Asbr.NextVacantTidForOnt(nddOnt, ont);
  747:  
  748:                 if (port != Ia.Ftn.Cl.Model.Business.Default.PortUndefinedOrInvalidOrUnknown)
  749:                 {
  750:                     command = Ia.Ftn.Cl.Model.Business.Huawei.SoftX.AddAsbrCommand(Ia.Ftn.Cl.Model.Business.Huawei.SoftX.TecNetworkElement, nddOnt, service, port);
  751:                     tecSoftX.SendQueue.Enqueue(command);
  752:  
  753:                     command = Ia.Ftn.Cl.Model.Business.Huawei.SoftX.AddAsbrCommand(Ia.Ftn.Cl.Model.Business.Huawei.SoftX.SkbNetworkElement, nddOnt, service, port);
  754:                     skbSoftX.SendQueue.Enqueue(command);
  755:                 }
  756:                 else
  757:                 {
  758:                     result.AddError("Port is invalid or does not exist:" + nddOnt.Access.Name);
  759:                 }
  760:             }
  761:             else
  762:             {
  763:                 result.AddError("Ont is null, does not exist for access:" + nddOnt.Access.Name);
  764:             }
  765:  
  766:             return result;
  767:         }
  768:  
  769:         ////////////////////////////////////////////////////////////////////////////
  770:  
  771:         /// <summary>
  772:         ///
  773:         /// </summary>
  774:         public static void ReadAsbr(string service)
  775:         {
  776:             string command;
  777:  
  778:             command = Ia.Ftn.Cl.Model.Business.Huawei.SoftX.ReadAsbrCommand(service);
  779:  
  780:             tecSoftX.SendQueue.Enqueue(command);
  781:             skbSoftX.SendQueue.Enqueue(command);
  782:         }
  783:  
  784:         ////////////////////////////////////////////////////////////////////////////
  785:  
  786:         /// <summary>
  787:         ///
  788:         /// </summary>
  789:         public static void RemoveAsbr(Ia.Ftn.Cl.Model.Business.NetworkDesignDocument.Ont nddOnt, string service)
  790:         {
  791:             string command;
  792:  
  793:             // try to handle removing a number without knowing the ONT
  794:  
  795:             command = Ia.Ftn.Cl.Model.Business.Huawei.SoftX.RemoveAsbrCommand(Ia.Ftn.Cl.Model.Business.Huawei.SoftX.TecNetworkElement, nddOnt, service, 0);
  796:             tecSoftX.SendQueue.Enqueue(command);
  797:  
  798:             command = Ia.Ftn.Cl.Model.Business.Huawei.SoftX.RemoveAsbrCommand(Ia.Ftn.Cl.Model.Business.Huawei.SoftX.SkbNetworkElement, nddOnt, service, 0);
  799:             skbSoftX.SendQueue.Enqueue(command);
  800:         }
  801:  
  802:         /*
  803:         ////////////////////////////////////////////////////////////////////////////
  804: 
  805:         /// <summary>
  806:         ///
  807:         /// </summary>
  808:         private static Ia.Cl.Models.Result ManageSynchronizationBetweenHuaweiImsAndNokiaAccess()
  809:         {
  810:             Ia.Ftn.Cl.Model.Business.Huawei.SoftX.ProvisioningWorkflow provisioningWorkflow;
  811: 
  812:             var result = new Ia.Cl.Models.Result();
  813: 
  814:             provisioningWorkflow = Ia.Ftn.Cl.Model.Business.Huawei.SoftX.SynchronizeAsbrServiceToMatchHuaweiSwitchNokiaAccessServiceQueueCommand;
  815: 
  816:             if (provisioningWorkflow != null)
  817:             {
  818:                 tecSoftX.SendQueue.Enqueue(provisioningWorkflow.TecCreateCommand);
  819:                 tecSoftX.SendQueue.Enqueue(provisioningWorkflow.ReadCommand);
  820: 
  821:                 skbSoftX.SendQueue.Enqueue(provisioningWorkflow.SkbCreateCommand);
  822:                 skbSoftX.SendQueue.Enqueue(provisioningWorkflow.ReadCommand);
  823: 
  824:                 result.AddSuccess("Create (TEC): " + provisioningWorkflow.TecCreateCommand + "(SKB): " + provisioningWorkflow.SkbCreateCommand + ", Read: " + provisioningWorkflow.ReadCommand);
  825:             }
  826:             else
  827:             {
  828:                 result.AddWarning("No sync. ");
  829:             }
  830: 
  831:             return result;
  832:         }
  833:          */
  834:  
  835:         ////////////////////////////////////////////////////////////////////////////
  836:  
  837:         /// <summary>
  838:         ///
  839:         /// </summary>
  840:         public static Ia.Cl.Models.Result ManageSynchronizationBetweenHuaweiImsAndNokiaAccess(Ia.Ftn.Cl.Model.Business.Default.Procedure procedure)
  841:         {
  842:             Ia.Ftn.Cl.Model.Business.Procedure.Process process;
  843:  
  844:             var result = new Ia.Cl.Models.Result();
  845:  
  846:             process = addOrRemoveAsbrSubscriberProcedure.NextProcess();
  847:  
  848:             if (process.Type != Ia.Ftn.Cl.Model.Business.Procedure.ProcessType.None)
  849:             {
  850:                 if (process.Type == Ia.Ftn.Cl.Model.Business.Procedure.ProcessType.Create)
  851:                 {
  852:                     result.AddSuccess("create: " + process.Service + " (" + process.Ont.Access.Name + ") " + addOrRemoveAsbrSubscriberProcedure.ProgressCounterString);
  853:  
  854:                     AddAsbr(process.Ont, process.Service, Ia.Ftn.Cl.Model.Business.Default.PortUndefinedOrInvalidOrUnknown);
  855:  
  856:                     // not suitable causes too many messages
  857:                     //Ia.Ftn.Cl.Model.Data.Msmq.SecretaryApplication.Enqueue(Ia.Ftn.Cl.Model.Business.Msmq.Application.SoftXApplication, Ia.Ftn.Cl.Model.Business.Msmq.Process.ReadService, process.Service);
  858:                 }
  859:                 else if (process.Type == Ia.Ftn.Cl.Model.Business.Procedure.ProcessType.Read)
  860:                 {
  861:                     result.AddSuccess("read: " + process.Service + " (" + process.Ont.Access.Name + ") " + addOrRemoveAsbrSubscriberProcedure.ProgressCounterString);
  862:  
  863:                     ReadAsbr(process.Service);
  864:                 }
  865:                 else if (process.Type == Ia.Ftn.Cl.Model.Business.Procedure.ProcessType.Delete)
  866:                 {
  867:                     result.AddSuccess("delete: " + process.Service + " (" + process.Ont.Access.Name + ") " + addOrRemoveAsbrSubscriberProcedure.ProgressCounterString);
  868:  
  869:                     RemoveAsbr(process.Ont, process.Service);
  870:  
  871:                     // not suitable causes too many messages
  872:                     //Ia.Ftn.Cl.Model.Data.Msmq.SecretaryApplication.Enqueue(Ia.Ftn.Cl.Model.Business.Msmq.Application.SoftXApplication, Ia.Ftn.Cl.Model.Business.Msmq.Process.ReadService, process.Service);
  873:                 }
  874:                 else result.AddError("sync: undefined procedure. ");
  875:  
  876:                 Ia.Ftn.Cl.Model.Data.Msmq.SecretaryApplication.Enqueue(Ia.Ftn.Cl.Model.Business.Msmq.Application.SoftXApplication, Ia.Ftn.Cl.Model.Business.Msmq.Process.SynchronizeCompleted, process.Service);
  877:             }
  878:             else result.AddWarning("sync: nothing to create or delete");
  879:  
  880:             return result;
  881:         }
  882:  
  883:         ////////////////////////////////////////////////////////////////////////////
  884:         ////////////////////////////////////////////////////////////////////////////
  885:  
  886:  
  887:  
  888:  
  889:  
  890:  
  891:  
  892:  
  893:  
  894:         ////////////////////////////////////////////////////////////////////////////
  895:         ////////////////////////////////////////////////////////////////////////////
  896:  
  897:         /// <summary>
  898:         ///
  899:         /// </summary>
  900:         public static string ManageProperly(ref int properlySelectedSoftXCommandListIndex)
  901:         {
  902:             var command = Ia.Ftn.Cl.Model.Business.Huawei.SoftX.ProperlySelectedSingleSoftXCommandQueueCommand(ref properlySelectedSoftXCommandListIndex, out int itemIndex, out int listCount);
  903:  
  904:             tecSoftX.SendQueue.Enqueue(command);
  905:             skbSoftX.SendQueue.Enqueue(command);
  906:  
  907:             var r = command + " (" + itemIndex + "/" + listCount + ")";
  908:  
  909:             return r;
  910:         }
  911:  
  912:         ////////////////////////////////////////////////////////////////////////////
  913:  
  914:         /// <summary>
  915:         ///
  916:         /// </summary>
  917:         public static Ia.Cl.Models.Result ManageMsmqQueue()
  918:         {
  919:             string command;
  920:  
  921:             var result = new Ia.Cl.Models.Result();
  922:  
  923:             var queueCount = Ia.Ftn.Cl.Model.Data.Msmq.SoftXApplication.Count;
  924:  
  925:             if (queueCount > 0)
  926:             {
  927:                 var message = Ia.Ftn.Cl.Model.Data.Msmq.SoftXApplication.Dequeue;
  928:  
  929:                 if (message.Process == Ia.Ftn.Cl.Model.Business.Msmq.Process.ReadService)
  930:                 {
  931:                     if (Ia.Ftn.Cl.Model.Data.Service.ServiceIsWithinSoftXDomainList(message.Service))
  932:                     {
  933:                         command = Ia.Ftn.Cl.Model.Business.Huawei.SoftX.ReadAsbrCommand(message.Service);
  934:  
  935:                         tecSoftX.SendQueue.Enqueue(command);
  936:                         skbSoftX.SendQueue.Enqueue(command);
  937:  
  938:                         result.AddSuccess(message.Service);
  939:                     }
  940:                     else result.AddError("Service: " + message.Service + " is not within SoftX server.");
  941:                 }
  942:                 else if (message.Process == Ia.Ftn.Cl.Model.Business.Msmq.Process.ReadAccess)
  943:                 {
  944:                     var accessName = message.AccessName;
  945:  
  946:                     if (!string.IsNullOrEmpty(accessName))
  947:                     {
  948:                         command = Ia.Ftn.Cl.Model.Business.Huawei.SoftX.ReadMgwCommand(message.AccessName);
  949:  
  950:                         tecSoftX.SendQueue.Enqueue(command);
  951:                         skbSoftX.SendQueue.Enqueue(command);
  952:  
  953:                         result.AddSuccess(message.AccessName);
  954:                     }
  955:                     else result.AddError("AccessName is null or empty.");
  956:                 }
  957:                 else if (message.Process == Ia.Ftn.Cl.Model.Business.Msmq.Process.ResetAccess)
  958:                 {
  959:                     result.AddError("Process " + message.Process.ToString() + " undefined.");
  960:                 }
  961:                 else if (message.Process == Ia.Ftn.Cl.Model.Business.Msmq.Process.CreateReadServiceAccessPort)
  962:                 {
  963:                     var service = message.Service;
  964:                     var accessName = message.AccessName;
  965:                     var port = message.Port;
  966:  
  967:                     if (Ia.Ftn.Cl.Model.Data.Service.ServiceIsWithinSoftXDomainList(service))
  968:                     {
  969:                         var nddOnt = Ia.Ftn.Cl.Model.Data.NetworkDesignDocument.OntByAccessName(accessName);
  970:  
  971:                         var createResult = AddAsbr(nddOnt, message.Service, port);
  972:  
  973:                         ReadAsbr(service);
  974:  
  975:                         result.AddSuccess("Create/Read: " + service + "|" + accessName + "|" + port + ": " + message.Service + "," + createResult.Message);
  976:                     }
  977:                     else result.AddError("Create/Read: " + service + "|" + accessName + "|" + port + ": Service: " + service + " is not within SoftX server.");
  978:                 }
  979:                 else if (message.Process == Ia.Ftn.Cl.Model.Business.Msmq.Process.DeleteReadServiceAccess)
  980:                 {
  981:                     var service = message.Service;
  982:                     var accessName = message.AccessName;
  983:  
  984:                     if (Ia.Ftn.Cl.Model.Data.Service.ServiceIsWithinSoftXDomainList(message.Service))
  985:                     {
  986:                         if (!string.IsNullOrEmpty(accessName))
  987:                         {
  988:                             var nddOnt = Ia.Ftn.Cl.Model.Data.NetworkDesignDocument.OntByAccessName(accessName);
  989:  
  990:                             RemoveAsbr(nddOnt, service);
  991:  
  992:                             ReadAsbr(service);
  993:  
  994:                             result.AddSuccess("Delete/Read: " + service + "|" + accessName + ": " + message.Service);
  995:                         }
  996:                         else result.AddError("Delete/Read: " + service + "|" + accessName + ": AccessName is null or empty.");
  997:                     }
  998:                     else result.AddError("Delete/Read: " + service + "|" + accessName + ": Service " + service + " is not within SoftX server.");
  999:                 }
 1000:                 else if (message.Process == Ia.Ftn.Cl.Model.Business.Msmq.Process.Synchronize)
 1001:                 {
 1002:                     var r = Ia.Ftn.Cl.Model.Business.Huawei.SoftX.ManageSynchronizationBetweenHuaweiImsAndNokiaAccess(Ia.Ftn.Cl.Model.Business.Default.Procedure.InitializeOrIterate);
 1003:  
 1004:                     result.AddSuccess("Synchronize: " + r.Message);
 1005:                 }
 1006:                 else if (message.Process == Ia.Ftn.Cl.Model.Business.Msmq.Process.ActiveApplicationRunningPermissionState)
 1007:                 {
 1008:                     Ia.Ftn.Cl.Model.Business.Default.PermitActiveApplicationsToRun = message.State;
 1009:  
 1010:                     result.AddSuccess("PermitActiveApplicationsToRun: " + message.State);
 1011:                 }
 1012:                 else
 1013:                 {
 1014:                     throw new ArgumentOutOfRangeException("MSMQ process " + message.Process.ToString() + " is undefined");
 1015:                 }
 1016:             }
 1017:             else
 1018:             {
 1019:             }
 1020:  
 1021:             return result;
 1022:         }
 1023:  
 1024:         ////////////////////////////////////////////////////////////////////////////
 1025:  
 1026:         /// <summary>
 1027:         ///
 1028:         /// </summary>
 1029:         public static Ia.Cl.Models.Result ManageCreateMissingMgw()
 1030:         {
 1031:             string command;
 1032:  
 1033:             var result = new Ia.Cl.Models.Result();
 1034:  
 1035:             var nddOnt = Ia.Ftn.Cl.Model.Data.Provision.NddHuaweiSwitchAndNokiaAccessOntWithAccessButNoMgwRecord(out string r0);
 1036:  
 1037:             if (nddOnt != null)
 1038:             {
 1039:                 command = Ia.Ftn.Cl.Model.Business.Huawei.SoftX.AddMgwCommand(Ia.Ftn.Cl.Model.Business.Huawei.SoftX.TecNetworkElement, nddOnt);
 1040:                 tecSoftX.SendQueue.Enqueue(command);
 1041:  
 1042:                 command = Ia.Ftn.Cl.Model.Business.Huawei.SoftX.AddMgwCommand(Ia.Ftn.Cl.Model.Business.Huawei.SoftX.SkbNetworkElement, nddOnt);
 1043:                 skbSoftX.SendQueue.Enqueue(command);
 1044:  
 1045:                 command = Ia.Ftn.Cl.Model.Business.Huawei.SoftX.ReadMgwCommand(nddOnt);
 1046:                 tecSoftX.SendQueue.Enqueue(command);
 1047:                 skbSoftX.SendQueue.Enqueue(command);
 1048:  
 1049:                 result.AddSuccess("Updated: " + nddOnt.Access.Name + " " + r0);
 1050:             }
 1051:             else
 1052:             {
 1053:                 result.AddWarning("There are no missing MGWs in Huawei-Nokia networks. ");
 1054:             }
 1055:  
 1056:             return result;
 1057:         }
 1058:  
 1059:         ////////////////////////////////////////////////////////////////////////////
 1060:  
 1061:         /// <summary>
 1062:         ///
 1063:         /// </summary>
 1064:         public static Ia.Cl.Models.Result ManageKeepAliveShakeHand()
 1065:         {
 1066:             var result = new Ia.Cl.Models.Result();
 1067:  
 1068:             var c = Ia.Ftn.Cl.Model.Business.Huawei.SoftX.KeepAliveShakeHandCommand;
 1069:  
 1070:             tecSoftX.SendQueue.Enqueue(c);
 1071:             skbSoftX.SendQueue.Enqueue(c);
 1072:  
 1073:             result.AddSuccess(c);
 1074:  
 1075:             return result;
 1076:         }
 1077:  
 1078:         ////////////////////////////////////////////////////////////////////////////
 1079:         ////////////////////////////////////////////////////////////////////////////
 1080:  
 1081:         /// <summary>
 1082:         ///
 1083:         /// </summary>
 1084:         public static bool SpecialBooleanParameterHandling(string parameterName, string parameterValue)
 1085:         {
 1086:             bool b;
 1087:  
 1088:             if (parameterValue == "Yes") b = true;
 1089:             else if (parameterName == "No") b = false;
 1090:             else if (parameterName == "Active") b = true;
 1091:             else b = false;
 1092:  
 1093:             return b;
 1094:         }
 1095:  
 1096:         ////////////////////////////////////////////////////////////////////////////
 1097:  
 1098:         /// <summary>
 1099:         ///
 1100:         /// </summary>
 1101:         public static int SpecialIntegerParameterHandling(string parameterName, string parameterValue)
 1102:         {
 1103:             int i;
 1104:  
 1105:             if (parameterValue == "NULL") i = 0;
 1106:             else i = int.Parse(parameterName);
 1107:  
 1108:             return i;
 1109:         }
 1110:  
 1111:         ////////////////////////////////////////////////////////////////////////////
 1112:         ////////////////////////////////////////////////////////////////////////////
 1113:  
 1114:         /// <summary>
 1115:         ///
 1116:         /// </summary>
 1117:         private static string ReadAsbrCommand(string service)
 1118:         {
 1119:             var pui = Ia.Ftn.Cl.Model.Business.NumberFormatConverter.ImpuSipDomain(service);
 1120:  
 1121:             return FormatSoftXLstCommand(SoftXOpcode.LstAsbr, pui);
 1122:         }
 1123:  
 1124:         ////////////////////////////////////////////////////////////////////////////
 1125:  
 1126:         /// <summary>
 1127:         ///
 1128:         /// </summary>
 1129:         private static string ReadMgwCommand(string accessName)
 1130:         {
 1131:             string command;
 1132:  
 1133:             var ip = Ia.Ftn.Cl.Model.Data.NetworkDesignDocument.OntAccessNameToOntIpDictionary[accessName];
 1134:  
 1135:             if (Ia.Cl.Models.Default.IsValidIpv4(ip))
 1136:             {
 1137:                 var eid = IpToEid(ip);
 1138:  
 1139:                 command = FormatSoftXLstCommand(SoftXOpcode.LstMgw, eid);
 1140:             }
 1141:             else command = string.Empty;
 1142:  
 1143:             return command;
 1144:         }
 1145:  
 1146:         ////////////////////////////////////////////////////////////////////////////
 1147:  
 1148:         /// <summary>
 1149:         ///
 1150:         /// </summary>
 1151:         private static string ReadMgwCommand(Ia.Ftn.Cl.Model.Business.NetworkDesignDocument.Ont ont)
 1152:         {
 1153:             string command;
 1154:  
 1155:             if (ont != null)
 1156:             {
 1157:                 var eid = IpToEid(ont.Ip);
 1158:  
 1159:                 command = FormatSoftXLstCommand(SoftXOpcode.LstMgw, eid);
 1160:             }
 1161:             else command = string.Empty;
 1162:  
 1163:             return command;
 1164:         }
 1165:  
 1166:         ////////////////////////////////////////////////////////////////////////////
 1167:  
 1168:         /// <summary>
 1169:         ///
 1170:         /// </summary>
 1171:         private static string AddMgwCommand(NetworkElement networkElement, Ia.Ftn.Cl.Model.Business.NetworkDesignDocument.Ont ont)
 1172:         {
 1173:             string command;
 1174:  
 1175:             if (ont != null)
 1176:             {
 1177:                 command = FormatSoftXCommand(SoftXOpcode.AddMgw, networkElement, ont.Ip, ont.Access.Name);
 1178:             }
 1179:             else command = string.Empty;
 1180:  
 1181:             return command;
 1182:         }
 1183:  
 1184:         ////////////////////////////////////////////////////////////////////////////
 1185:  
 1186:         /// <summary>
 1187:         ///
 1188:         /// </summary>
 1189:         private static string AddAsbrCommand(NetworkElement networkElement, Ia.Ftn.Cl.Model.Business.NetworkDesignDocument.Ont ont, string serivce, int port)
 1190:         {
 1191:             string command;
 1192:  
 1193:             if (ont != null)
 1194:             {
 1195:                 command = FormatSoftXCommand(SoftXOpcode.AddAsbr, networkElement, ont.Ip, ont.Access.Name, serivce, port);
 1196:             }
 1197:             else command = string.Empty;
 1198:  
 1199:             return command;
 1200:         }
 1201:  
 1202:         ////////////////////////////////////////////////////////////////////////////
 1203:  
 1204:         /// <summary>
 1205:         ///
 1206:         /// </summary>
 1207:         private static string RemoveAsbrCommand(NetworkElement networkElement, Ia.Ftn.Cl.Model.Business.NetworkDesignDocument.Ont ont, string serivce, int port)
 1208:         {
 1209:             string command;
 1210:  
 1211:             if (ont != null)
 1212:             {
 1213:                 command = FormatSoftXCommand(SoftXOpcode.RemoveAsbr, networkElement, ont.Ip, ont.Access.Name, serivce, port);
 1214:             }
 1215:             else command = string.Empty;
 1216:  
 1217:             return command;
 1218:         }
 1219:  
 1220:         ////////////////////////////////////////////////////////////////////////////
 1221:         ////////////////////////////////////////////////////////////////////////////
 1222:  
 1223:         /// <summary>
 1224:         ///
 1225:         /// </summary>
 1226:         private static string FormatSoftXLstCommand(SoftXOpcode softXOpcode, string parameter)
 1227:         {
 1228:             string command;
 1229:  
 1230:             if (softXOpcode == SoftXOpcode.LstMgw)
 1231:             {
 1232:                 // LST MGW:EID="10.12.42.190:2944";
 1233:                 command = @"LST MGW:EID=""" + parameter + @""";";
 1234:             }
 1235:             else if (softXOpcode == SoftXOpcode.LstAsbr)
 1236:             {
 1237:                 // LST ASBR: PUI="sip:+96525449809@ims.moc.kw";
 1238:                 command = @"LST ASBR:PUI=""" + parameter + @""";";
 1239:             }
 1240:             else command = string.Empty;
 1241:  
 1242:             return command;
 1243:         }
 1244:  
 1245:         ////////////////////////////////////////////////////////////////////////////
 1246:  
 1247:         /// <summary>
 1248:         ///
 1249:         /// </summary>
 1250:         private static string FormatSoftXCommand(SoftXOpcode softXOpcode, NetworkElement networkElement, string ontIp, string accessName)
 1251:         {
 1252:             return FormatSoftXCommand(softXOpcode, networkElement, ontIp, accessName, null, 0);
 1253:         }
 1254:  
 1255:         ////////////////////////////////////////////////////////////////////////////
 1256:  
 1257:         /// <summary>
 1258:         ///
 1259:         /// </summary>
 1260:         private static string FormatSoftXCommand(SoftXOpcode softXOpcode, NetworkElement networkElement, string ontIp, string accessName, string service, int port)
 1261:         {
 1262:             string command;
 1263:  
 1264:             if (softXOpcode == SoftXOpcode.AddMgw)
 1265:             {
 1266:                 // ADD MGW: EID="ONT IP:2944", GWTP=AG, MGWDESC="ONT IP", MGCMODULENO=22, PTYPE=H248, LA="10.10.9.10", DYNIP=NS, RA1="ONT IP", RP=2944, LISTOFCODEC=PCMA-1&PCMU-1&G7231-0&G729-1&G726-0&T38-0&AMR-0&H261-0&H263-0&MPEG4-0&CLEARMODE-1&G726_40-0&G726_32-0&G726_24-0&G726_16-0&ILBC-0&SPEEX-0&G711A_VBD-0&G711U_VBD-0&GSM_FR-0, EC=TRUE, ET=NO, TDMIFC1=10, RTPIFC=11, OWDYNA=YES, SUPROOTPKG=NS, MGWFCFLAG=FALSE, HEARTBEATTIMES=5;
 1267:                 command = @"ADD MGW:EID=""" + ontIp + @":" + RemotePort + @""", GWTP=AG, MGWDESC=""" + accessName + @""", MGCMODULENO=22, PTYPE=H248, LA=""" + networkElement.La + @""", DYNIP=NS, RA1=""" + ontIp + @""", RP=" + RemotePort + @", LISTOFCODEC=PCMA-1&PCMU-1&G7231-0&G729-1&G726-0&T38-0&AMR-0&H261-0&H263-0&MPEG4-0&CLEARMODE-1&G726_40-0&G726_32-0&G726_24-0&G726_16-0&ILBC-0&SPEEX-0&G711A_VBD-0&G711U_VBD-0&GSM_FR-0, EC=TRUE, ET=NO, TDMIFC1=10, RTPIFC=11, OWDYNA=YES, SUPROOTPKG=NS, MGWFCFLAG=FALSE, HEARTBEATTIMES=5;";
 1268:             }
 1269:             else if (softXOpcode == SoftXOpcode.AddAsbr)
 1270:             {
 1271:                 var pui = Ia.Ftn.Cl.Model.Business.NumberFormatConverter.Pui(service);
 1272:                 var pri = Ia.Ftn.Cl.Model.Business.NumberFormatConverter.Pri(service);
 1273:                 var tid = port;
 1274:  
 1275:                 // ADD ASBR: PUI="sip:+9652400xxxx@ims.moc.kw", PRI="+9652400xxxx@ims.moc.kw", REGTP=SINGLE, DID=ESL, EID="ONT IP:2944", TID="1", HNID="agcf-hnid", NETID="tec-agcf-vnid", NETINFO="access", PHNCON="Kuwait", DIGMAP=10, PWD="admin", DP=YES;
 1276:                 command = @"ADD ASBR:PUI=""" + pui + @""", PRI=""" + pri + @""", REGTP=SINGLE, DID=ESL, EID=""" + ontIp + @":" + RemotePort + @""", TID=""" + tid + @""", HNID=""agcf-hnid"", NETID=""" + networkElement.NetId + @""", NETINFO=""access"", PHNCON=""Kuwait"", DIGMAP=10, PWD=""admin"", DP=YES;";
 1277:             }
 1278:             else if (softXOpcode == SoftXOpcode.RemoveAsbr)
 1279:             {
 1280:                 var pui = Ia.Ftn.Cl.Model.Business.NumberFormatConverter.Pui(service);
 1281:                 var pri = Ia.Ftn.Cl.Model.Business.NumberFormatConverter.Pri(service);
 1282:                 var tid = port;
 1283:  
 1284:                 // RMV ASBR: PUI="sip:+556239901189@ims1.gvt.net.br";
 1285:                 command = @"RMV ASBR:PUI=""" + pui + @""";";
 1286:             }
 1287:             else command = string.Empty;
 1288:  
 1289:             return command;
 1290:         }
 1291:  
 1292:         ////////////////////////////////////////////////////////////////////////////
 1293:  
 1294:         /// <summary>
 1295:         ///
 1296:         /// </summary>
 1297:         private static string FormatSoftXModCommand(SoftXOpcode amsOpcode, string service, int rnidxRoute)
 1298:         {
 1299:             string command;
 1300:  
 1301:             if (amsOpcode == SoftXOpcode.LstAsbr)
 1302:             {
 1303:                 command = @"MOD SERUATTR:MODE=NUM,USRNUM=""" + service + @""",RNIDXTYPE=RN,RNIDX=" + rnidxRoute + ";";
 1304:             }
 1305:             else command = string.Empty;
 1306:  
 1307:             return command;
 1308:         }
 1309:  
 1310:         ////////////////////////////////////////////////////////////////////////////
 1311:  
 1312:         /// <summary>
 1313:         ///
 1314:         /// </summary>
 1315:         public static string IpToEid(string ip)
 1316:         {
 1317:             return ip + ":" + RemotePort;
 1318:         }
 1319:  
 1320:         ////////////////////////////////////////////////////////////////////////////    
 1321:         ////////////////////////////////////////////////////////////////////////////    
 1322:     }
 1323:  
 1324:     ////////////////////////////////////////////////////////////////////////////
 1325:     ////////////////////////////////////////////////////////////////////////////   
 1326: }