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

Integrated Applications Programming Company

Skip Navigation LinksHome » Code Library » Dev

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

Huawei's Dev support class of Optical Fiber Network (OFN) business model.

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