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

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

Huawei's Dev support class of Fixed Telecommunications Network (FTN) business model.

    1: using System;
    2: using System.Collections.Generic;
    3: using System.Linq;
    4: using System.Text.RegularExpressions;
    5:  
    6: namespace Ia.Ftn.Cl.Models.Business.Huawei
    7: {
    8:     ////////////////////////////////////////////////////////////////////////////
    9:  
   10:     /// <summary publish="true">
   11:     /// Huawei's Dev support class of Fixed Telecommunications Network (FTN) business model.
   12:     /// </summary>
   13:     /// 
   14:     /// <remarks> 
   15:     /// Copyright © 2016-2021 Jasem Y. Al-Shamlan (info@ia.com.kw), Integrated Applications - Kuwait. All Rights Reserved.
   16:     /// </remarks> 
   17:     public class Dev
   18:     {
   19:         /// <summary/>
   20:         public static int MsanPortCapacity = 1028;
   21:  
   22:         private static int sequentialEmsDevDevQueueOriginalCount, sequentialEmsMsanDevPortQueueOriginalCount;
   23:         private static Queue<Ia.Ftn.Cl.Models.Huawei.EmsDev> sequentialEmsDevDevQueue = new Queue<Ia.Ftn.Cl.Models.Huawei.EmsDev>();
   24:         private static Queue<Ia.Ftn.Cl.Models.Huawei.EmsPort> sequentialEmsMsanDevPortQueue = new Queue<Ia.Ftn.Cl.Models.Huawei.EmsPort>();
   25:  
   26:         public enum Type { Olt, Mdu, Msan, Unknown };
   27:  
   28:         ////////////////////////////////////////////////////////////////////////////
   29:  
   30:         /// <summary>
   31:         ///
   32:         /// </summary>
   33:         public class MduDev
   34:         {
   35:             /// <summary/>
   36:             public int Did;
   37:  
   38:             /// <summary/>
   39:             public string Dev;
   40:  
   41:             /// <summary/>
   42:             public Ia.Ftn.Cl.Models.Business.Huawei.Dev.Type DevType;
   43:  
   44:             /// <summary/>
   45:             public string DevIp;
   46:  
   47:             /// <summary/>
   48:             public string AccessName;
   49:  
   50:             /// <summary/>
   51:             public string AccessId;
   52:  
   53:             /// <summary/>
   54:             public string NddOntId;
   55:  
   56:             /// <summary/>
   57:             public int TelPortCount;
   58:  
   59:             /// <summary/>
   60:             public int EthernetPortCount;
   61:  
   62:             /// <summary/>
   63:             public List<Ia.Ftn.Cl.Models.Business.Huawei.Default.FnSnPnPort> PossibleFnSnPnPortList;
   64:  
   65:             /// <summary/>
   66:             public Ia.Ftn.Cl.Models.Business.Huawei.Default.FnSnPnPort FirstFnSnPnPort;
   67:  
   68:             /// <summary/>
   69:             public List<Ia.Ftn.Cl.Models.Business.Huawei.Board.MduDevBoard> MduDevBoardList;
   70:  
   71:             ////////////////////////////////////////////////////////////////////////////
   72:  
   73:             /// <summary>
   74:             ///
   75:             /// </summary>
   76:             public MduDev(int did)
   77:             {
   78:                 string dev, accessName, s;
   79:  
   80:                 var didToDevDictionary = Ia.Ftn.Cl.Models.Data.Huawei.Dev.DidToDevDictionary;
   81:  
   82:                 var ontAccessNameToOntIdDictionary = Ia.Ftn.Cl.Models.Data.NetworkDesignDocument.OntAccessNameToOntIdDictionary;
   83:                 var ontAccessNameToOntAccessIdDictionary = Ia.Ftn.Cl.Models.Data.NetworkDesignDocument.OntAccessNameToOntAccessIdDictionary;
   84:  
   85:                 if (didToDevDictionary.ContainsKey(did))
   86:                 {
   87:                     dev = didToDevDictionary[did];
   88:                     s = Ia.Ftn.Cl.Models.Business.Huawei.Ems.HuaweiAccessNameFormatFromInaccurateHuaweiFileAndEmsNameFormat(dev);
   89:                     accessName = Ia.Ftn.Cl.Models.Business.Default.StandardizeAccessNameInLegalFormatFromValue(s);
   90:  
   91:                     this.Did = did;
   92:                     this.Dev = dev;
   93:  
   94:                     this.AccessName = accessName;
   95:  
   96:                     this.NddOntId = ontAccessNameToOntIdDictionary.ContainsKey(accessName) ? ontAccessNameToOntIdDictionary[accessName] : this.NddOntId = string.Empty;
   97:                     this.AccessId = ontAccessNameToOntAccessIdDictionary.ContainsKey(accessName) ? ontAccessNameToOntAccessIdDictionary[accessName] : this.AccessId = string.Empty;
   98:                 }
   99:                 else
  100:                 {
  101:                     //throw new System.Exception("DidToDevDictionary does not contain did key: " + did);
  102:                 }
  103:             }
  104:  
  105:             ////////////////////////////////////////////////////////////////////////////
  106:  
  107:             /// <summary>
  108:             /// 
  109:             /// </summary>
  110:             public int PortByFnSnPn(int fn, int sn, int pn)
  111:             {
  112:                 int port;
  113:  
  114:                 var list = this.PossibleFnSnPnPortList;
  115:  
  116:                 if (list != null)
  117:                 {
  118:                     var fnSnPnPort = (from l in list where l.Fn == fn && l.Sn == sn && l.Pn == pn select l).SingleOrDefault();
  119:  
  120:                     if (fnSnPnPort != null) port = fnSnPnPort.Port;
  121:                     else port = Ia.Ftn.Cl.Models.Business.Default.PortUndefinedOrInvalidOrUnknown;
  122:                 }
  123:                 else port = Ia.Ftn.Cl.Models.Business.Default.PortUndefinedOrInvalidOrUnknown;
  124:  
  125:                 return port;
  126:             }
  127:  
  128:             ////////////////////////////////////////////////////////////////////////////
  129:  
  130:             /// <summary>
  131:             ///
  132:             /// </summary>
  133:             public override string ToString()
  134:             {
  135:                 string line;
  136:  
  137:                 line = "Dev: " + this.Dev + ", AccessName: " + this.AccessName;
  138:  
  139:                 return line;
  140:             }
  141:  
  142:             ////////////////////////////////////////////////////////////////////////////
  143:             ////////////////////////////////////////////////////////////////////////////
  144:         }
  145:  
  146:         ////////////////////////////////////////////////////////////////////////////
  147:         ////////////////////////////////////////////////////////////////////////////
  148:  
  149:         /// <summary>
  150:         ///
  151:         /// </summary>
  152:         public class MsanDev
  153:         {
  154:             private static int fixedLengthOfMsanDevId = Ia.Ftn.Cl.Models.Business.NetworkDesignDocument.Msan.FixedLengthOfMsanId + 2 + 2;
  155:  
  156:             /// <summary/>
  157:             public static int FixedLengthOfMsanDevId { get { return fixedLengthOfMsanDevId; } }
  158:  
  159:             /// <summary/>
  160:             public int Did, Cabinet, Frame, Capacity = 1028;
  161:  
  162:             /// <summary/>
  163:             public string Id, Dev;
  164:  
  165:             /// <summary/>
  166:             public List<Ia.Ftn.Cl.Models.Business.Huawei.Default.FnSnPnPort> PossibleFnSnPnList;
  167:  
  168:             /// <summary/>
  169:             public Ia.Ftn.Cl.Models.Business.Huawei.Default.FnSnPnPort FirstFnSnPn;
  170:  
  171:             /// <summary/>
  172:             public Ia.Ftn.Cl.Models.Business.NetworkDesignDocument.Msan Msan;
  173:  
  174:             ////////////////////////////////////////////////////////////////////////////
  175:  
  176:             /// <summary>
  177:             ///
  178:             /// </summary>
  179:             public class Lic
  180:             {
  181:                 /// <summary/>
  182:                 public string EmsVoipPstnUserId { get; set; }
  183:  
  184:                 /// <summary/>
  185:                 public int Did { get; set; }
  186:  
  187:                 /// <summary/>
  188:                 public int Fn { get; set; }
  189:  
  190:                 /// <summary/>
  191:                 public int Sn { get; set; }
  192:  
  193:                 /// <summary/>
  194:                 public int Pn { get; set; }
  195:  
  196:                 /// <summary/>
  197:                 public string Dn { get; set; }
  198:  
  199:                 /// <summary/>
  200:                 public string Service { get; set; }
  201:  
  202:                 /// <summary/>
  203:                 public int Cabinet { get; set; }
  204:  
  205:                 /// <summary/>
  206:                 public int Frame { get; set; }
  207:  
  208:                 /// <summary/>
  209:                 public string MsanId { get; set; }
  210:  
  211:                 /// <summary/>
  212:                 public string MsanNameSymbol { get; set; }
  213:  
  214:                 /// <summary/>
  215:                 public string MsanDevId { get; set; }
  216:  
  217:                 /// <summary/>
  218:                 public string MsanDevDev { get; set; }
  219:  
  220:                 /// <summary/>
  221:                 public string Name
  222:                 {
  223:                     get
  224:                     {
  225:                         return ToMsanNameSymbolCabinetFrameSnPnTextString();
  226:                     }
  227:                 }
  228:  
  229:                 /// <summary/>
  230:                 public DateTime Created { get; set; }
  231:  
  232:                 /// <summary/>
  233:                 public DateTime Updated { get; set; }
  234:  
  235:                 ////////////////////////////////////////////////////////////////////////////
  236:  
  237:                 /// <summary>
  238:                 ///
  239:                 /// </summary>
  240:                 public Lic()
  241:                 {
  242:                     this.EmsVoipPstnUserId = string.Empty;
  243:                     this.Did = 0;
  244:                     this.Fn = 0;
  245:                     this.Sn = 0;
  246:                     this.Pn = 0;
  247:                     this.Dn = string.Empty;
  248:                     this.MsanId = string.Empty;
  249:                     this.MsanNameSymbol = string.Empty;
  250:                     this.MsanDevId = string.Empty;
  251:                     this.MsanDevDev = string.Empty;
  252:                 }
  253:  
  254:                 ////////////////////////////////////////////////////////////////////////////
  255:  
  256:                 /// <summary>
  257:                 ///
  258:                 /// </summary>
  259:                 public string ToCabinetFrameSnPnTextString()
  260:                 {
  261:                     var s = this.Cabinet + "-" + this.Frame + "-" + this.Sn + "-" + this.Pn;
  262:  
  263:                     return s;
  264:                 }
  265:  
  266:                 ////////////////////////////////////////////////////////////////////////////
  267:  
  268:                 /// <summary>
  269:                 ///
  270:                 /// </summary>
  271:                 public string ToMsanDevDevCabinetFrameFnSnPnTextString()
  272:                 {
  273:                     var s = this.MsanDevDev + "-" + this.Cabinet + "-" + this.Frame + "-" + this.Fn + "-" + this.Sn + "-" + this.Pn;
  274:  
  275:                     return s;
  276:                 }
  277:  
  278:                 ////////////////////////////////////////////////////////////////////////////
  279:  
  280:                 /// <summary>
  281:                 ///
  282:                 /// </summary>
  283:                 public string ToMsanDevDevSnPnTextString()
  284:                 {
  285:                     var s = this.MsanDevDev + "-" + this.Sn + "-" + this.Pn;
  286:  
  287:                     return s;
  288:                 }
  289:  
  290:                 ////////////////////////////////////////////////////////////////////////////
  291:  
  292:                 /// <summary>
  293:                 ///
  294:                 /// </summary>
  295:                 public string ToMsanNameSymbolCabinetFrameSnPnTextString()
  296:                 {
  297:                     var s = this.MsanNameSymbol + "-" + this.Cabinet + "-" + this.Frame + "-" + this.Sn + "-" + this.Pn;
  298:  
  299:                     return s;
  300:                 }
  301:  
  302:                 ////////////////////////////////////////////////////////////////////////////
  303:  
  304:                 /// <summary>
  305:                 ///
  306:                 /// </summary>
  307:                 public static Lic Parse(string input)
  308:                 {
  309:                     Ia.Ftn.Cl.Models.Business.Huawei.Dev.MsanDev.Lic lic;
  310:  
  311:                     if (Parse(input, out string msanNameSymbol, out int cabinet, out int frame, out int sn, out int pn))
  312:                     {
  313:                         var msan = Ia.Ftn.Cl.Models.Data.NetworkDesignDocument.MsanFromNameSymbol(msanNameSymbol);
  314:  
  315:                         if (msan != null)
  316:                         {
  317:                             lic = Ia.Ftn.Cl.Models.Data.Huawei.VoipPstnUser.MsanDevLicByNddMsanAndCabinetAndFrameAndFnAndSnAndPn(msan, cabinet, frame, 0, sn, pn);
  318:                         }
  319:                         else lic = null;
  320:                     }
  321:                     else lic = null;
  322:  
  323:                     return lic;
  324:                 }
  325:  
  326:                 ////////////////////////////////////////////////////////////////////////////
  327:  
  328:                 /// <summary>
  329:                 ///
  330:                 /// </summary>
  331:                 private static bool Parse(string input, out string msanSiteSymbolName, out int cabinet, out int frame, out int sn, out int pn)
  332:                 {
  333:                     bool parseSuccess;
  334:                     int i;
  335:  
  336:                     if (!string.IsNullOrEmpty(input))
  337:                     {
  338:                         var match = Regex.Match(input, @"^([a-zA-Z]{3})\-(\d{1,2})\-(\d{1,2})\-(\d{1,2})\-(\d{1,2})$", RegexOptions.Singleline);
  339:  
  340:                         if (match.Success)
  341:                         {
  342:                             msanSiteSymbolName = match.Groups[1].Value.ToUpper();
  343:  
  344:                             cabinet = int.TryParse(match.Groups[2].Value, out i) ? i : Ia.Ftn.Cl.Models.Business.Default.PortUndefinedOrInvalidOrUnknown;
  345:                             frame = int.TryParse(match.Groups[3].Value, out i) ? i : Ia.Ftn.Cl.Models.Business.Default.PortUndefinedOrInvalidOrUnknown;
  346:                             sn = int.TryParse(match.Groups[4].Value, out i) ? i : Ia.Ftn.Cl.Models.Business.Default.PortUndefinedOrInvalidOrUnknown;
  347:                             pn = int.TryParse(match.Groups[5].Value, out i) ? i : Ia.Ftn.Cl.Models.Business.Default.PortUndefinedOrInvalidOrUnknown;
  348:  
  349:                             parseSuccess = true;
  350:                         }
  351:                         else
  352:                         {
  353:                             msanSiteSymbolName = string.Empty;
  354:                             cabinet = frame = sn = pn = -1;
  355:  
  356:                             parseSuccess = false;
  357:                         }
  358:                     }
  359:                     else
  360:                     {
  361:                         msanSiteSymbolName = string.Empty;
  362:                         cabinet = frame = sn = pn = -1;
  363:  
  364:                         parseSuccess = false;
  365:                     }
  366:  
  367:                     return parseSuccess;
  368:                 }
  369:             }
  370:  
  371:             ////////////////////////////////////////////////////////////////////////////
  372:  
  373:             /// <summary>
  374:             ///
  375:             /// </summary>
  376:             public MsanDev(int did)
  377:             {
  378:                 bool msanExists;
  379:                 var didToDevDictionary = Ia.Ftn.Cl.Models.Data.Huawei.Dev.DidToDevDictionary;
  380:  
  381:                 if (didToDevDictionary.ContainsKey(did))
  382:                 {
  383:                     var dev = didToDevDictionary[did];
  384:  
  385:                     msanExists = ExtractMsanAndCabinetAndFrameFromDev(dev, out Ia.Ftn.Cl.Models.Business.NetworkDesignDocument.Msan msan, out int cabinet, out int frame);
  386:  
  387:                     if (msanExists)
  388:                     {
  389:                         this.Dev = dev;
  390:                         this.Did = did;
  391:                         this.Msan = msan;
  392:                         this.Cabinet = cabinet;
  393:                         this.Frame = frame;
  394:  
  395:                         this.Id = MsanDevId(msan.Id, cabinet, frame);
  396:                     }
  397:                 }
  398:                 else
  399:                 {
  400:                     //throw new System.Exception("DidToDevDictionary does not contain did key: " + did);
  401:                 }
  402:             }
  403:  
  404:             ////////////////////////////////////////////////////////////////////////////
  405:  
  406:             /// <summary>
  407:             /// 
  408:             /// </summary>
  409:             private string MsanDevId(string msanId, int cabinet, int frame)
  410:             {
  411:                 var id = msanId + cabinet.ToString().PadLeft(2, '0') + frame.ToString().PadLeft(2, '0');
  412:  
  413:                 if (id.Length != fixedLengthOfMsanDevId)
  414:                 {
  415:                     throw new ArgumentOutOfRangeException(@"MsanDevId(): Id length is not " + fixedLengthOfMsanDevId);
  416:                 }
  417:  
  418:                 return id;
  419:             }
  420:  
  421:             ////////////////////////////////////////////////////////////////////////////
  422:  
  423:             /// <summary>
  424:             /// 
  425:             /// </summary>
  426:             private bool ExtractMsanAndCabinetAndFrameFromDev(string dev, out Ia.Ftn.Cl.Models.Business.NetworkDesignDocument.Msan msan, out int cabinet, out int frame)
  427:             {
  428:                 bool msanExists;
  429:                 string msanNameSymbol;
  430:                 Match match;
  431:  
  432:                 if (!string.IsNullOrEmpty(dev))
  433:                 {
  434:                     // e.g. ARD_MSAN_Cabinet 1_Frame 0
  435:                     match = Regex.Match(dev, @"^(.+)_MSAN_Cabinet (\d+)_Frame (\d+)$", RegexOptions.Singleline);
  436:  
  437:                     if (match.Success)
  438:                     {
  439:                         msanNameSymbol = match.Groups[1].Value;
  440:                         msan = Ia.Ftn.Cl.Models.Data.NetworkDesignDocument.MsanFromNameSymbol(msanNameSymbol);
  441:  
  442:                         cabinet = int.Parse(match.Groups[2].Value);
  443:                         frame = int.Parse(match.Groups[3].Value);
  444:                     }
  445:                     else
  446:                     {
  447:                         // e.g. SLM_MSAN_A01_F00 or SSB_MSAN_B01_F00
  448:                         match = Regex.Match(dev, @"(\w+)_MSAN_\w(\d+)_\w(\d+)", RegexOptions.Singleline);
  449:  
  450:                         if (match.Success)
  451:                         {
  452:                             msanNameSymbol = match.Groups[1].Value;
  453:                             msan = Ia.Ftn.Cl.Models.Data.NetworkDesignDocument.MsanFromNameSymbol(msanNameSymbol);
  454:  
  455:                             cabinet = int.Parse(match.Groups[2].Value);
  456:                             frame = int.Parse(match.Groups[3].Value);
  457:                         }
  458:                         else
  459:                         {
  460:                             msan = null;
  461:                             cabinet = frame = -1;
  462:                             //throw new Exception("Dev format " + dev + " is not readable.");
  463:                         }
  464:                     }
  465:                 }
  466:                 else
  467:                 {
  468:                     msan = null;
  469:                     cabinet = frame = -1;
  470:                     //throw new Exception("Dev is null.");
  471:                 }
  472:  
  473:                 msanExists = msan != null;
  474:  
  475:                 return msanExists;
  476:             }
  477:  
  478:             ////////////////////////////////////////////////////////////////////////////
  479:  
  480:             /// <summary>
  481:             ///
  482:             /// </summary>
  483:             public override string ToString()
  484:             {
  485:                 string line;
  486:  
  487:                 line = "Dev: " + this.Dev + ", MSAN name: " + this.Dev;
  488:  
  489:                 return line;
  490:             }
  491:  
  492:             ////////////////////////////////////////////////////////////////////////////
  493:             ////////////////////////////////////////////////////////////////////////////
  494:         }
  495:  
  496:         ////////////////////////////////////////////////////////////////////////////
  497:         ////////////////////////////////////////////////////////////////////////////
  498:  
  499:         /// <summary>
  500:         ///
  501:         /// </summary>
  502:         public Dev() { }
  503:  
  504:         ////////////////////////////////////////////////////////////////////////////
  505:  
  506:         /// <summary>
  507:         ///
  508:         /// </summary>
  509:         public static int DevId(int did)
  510:         {
  511:             /*
  512:              * Id: OLT_01 Id-Frame-Slot-Port-OnuID
  513:              * FN    SN   PN   ONTID
  514:              * 
  515:              * Dev: did
  516:              * Board: FN SN
  517:              * Port: FN SN PN
  518:              * Ont: FN SN PN ONTID
  519:              * 
  520:              * /// FN INTEGER 0-255 Indicates the subrack ID of the OLT. 
  521:              * /// SN INTEGER 0-35 Indicates the slot ID of the OLT. 
  522:              * /// PN INTEGER 0-63 Indicates the port ID of the OLT. 
  523:              * /// ONTID INTEGER 0-255 NOTE If the UNI port is of 10G GPON, the value range is 0-255; if the UNI port is of 1G GPON, the value range is 0-127. Indicates the ONT ID. 
  524:              */
  525:  
  526:             int id;
  527:  
  528:             id = did;
  529:  
  530:             return id;
  531:         }
  532:  
  533:         ////////////////////////////////////////////////////////////////////////////
  534:  
  535:         /// <summary>
  536:         ///
  537:         /// </summary>
  538:         public static Ia.Ftn.Cl.Models.Huawei.EmsDev SequentialEmsDevListItem(out int sequentialEmsDevDevQueueCount, out string progressCounterString)
  539:         {
  540:             Ia.Ftn.Cl.Models.Huawei.EmsDev item;
  541:             List<Ia.Ftn.Cl.Models.Huawei.EmsDev> list;
  542:  
  543:             if (sequentialEmsDevDevQueue.Count == 0)
  544:             {
  545:                 list = Ia.Ftn.Cl.Models.Data.Huawei.Dev.List();
  546:                 //list = Ia.Ftn.Cl.Model.Data.Huawei.Default.AccessListBy5616Or5878OntEquipmentId();
  547:  
  548:                 sequentialEmsDevDevQueue = new Queue<Ia.Ftn.Cl.Models.Huawei.EmsDev>(list.Shuffle());
  549:  
  550:                 sequentialEmsDevDevQueueOriginalCount = sequentialEmsDevDevQueue.Count;
  551:             }
  552:  
  553:             if (sequentialEmsDevDevQueue.Count > 0) item = sequentialEmsDevDevQueue.Dequeue();
  554:             else item = null;
  555:  
  556:             progressCounterString = "(" + sequentialEmsDevDevQueue.Count + "/" + sequentialEmsDevDevQueueOriginalCount + ")";
  557:  
  558:             sequentialEmsDevDevQueueCount = sequentialEmsDevDevQueue.Count;
  559:  
  560:             return item;
  561:         }
  562:  
  563:         ////////////////////////////////////////////////////////////////////////////
  564:  
  565:         /// <summary>
  566:         ///
  567:         /// </summary>
  568:         public static Ia.Ftn.Cl.Models.Huawei.EmsPort SequentialEmsMsanDevPortListItem(out int sequentialEmsMsanDevPortQueueCount, out string progressCounterString)
  569:         {
  570:             Ia.Ftn.Cl.Models.Huawei.EmsPort item;
  571:             List<Ia.Ftn.Cl.Models.Huawei.EmsPort> list;
  572:  
  573:             if (sequentialEmsMsanDevPortQueue.Count == 0)
  574:             {
  575:                 var msan = Ia.Ftn.Cl.Models.Data.Huawei.Default.MsanDevList.RandomThenNext();
  576:  
  577:                 list = Ia.Ftn.Cl.Models.Data.Huawei.Default.MsanPortList(msan);
  578:  
  579:                 sequentialEmsMsanDevPortQueue = new Queue<Ia.Ftn.Cl.Models.Huawei.EmsPort>(list);
  580:  
  581:                 sequentialEmsMsanDevPortQueueOriginalCount = sequentialEmsMsanDevPortQueue.Count;
  582:             }
  583:  
  584:             if (sequentialEmsMsanDevPortQueue.Count > 0) item = sequentialEmsMsanDevPortQueue.Dequeue();
  585:             else item = null;
  586:  
  587:             progressCounterString = "(" + sequentialEmsMsanDevPortQueue.Count + "/" + sequentialEmsMsanDevPortQueueOriginalCount + ")";
  588:  
  589:             sequentialEmsMsanDevPortQueueCount = sequentialEmsMsanDevPortQueue.Count;
  590:  
  591:             return item;
  592:         }
  593:  
  594:         ////////////////////////////////////////////////////////////////////////////
  595:         ////////////////////////////////////////////////////////////////////////////
  596:     }
  597:  
  598:     ////////////////////////////////////////////////////////////////////////////
  599:     ////////////////////////////////////////////////////////////////////////////
  600: }