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

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

Fixed Telecommunications Network's Operations Support System Management Intranet (FTN OSS) client support class for Nokia's Fixed Telecommunications Network (FTN) AMS client model.

    1: using Dart.PowerTCP.Telnet;
    2: using System;
    3: using System.Collections.Generic;
    4: using System.Diagnostics;
    5:  
    6: namespace Ia.Ftn.Cl.Model.Client.Nokia
    7: {
    8:     ////////////////////////////////////////////////////////////////////////////
    9:  
   10:     /// <summary publish="true">
   11:     /// Fixed Telecommunications Network's Operations Support System Management Intranet (FTN OSS) client support class for Nokia's Fixed Telecommunications Network (FTN) AMS client model.
   12:     /// </summary>
   13:     /// 
   14:     /// <remarks> 
   15:     /// Copyright © 2020-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 Ams
   28:     {
   29:         private bool isLoggedIn;
   30:  
   31:         // interactive Telnet does not require a very large buffer, so 1024 is fine
   32:         private readonly byte[] buffer = new byte[1024];
   33:         private string receiveString;
   34:         internal Telnet telnet;
   35:  
   36:         /// <summary/>
   37:         public static int WaitAfterSendInMillisecond { get { return 4000; } }
   38:         public static int WaitAfterSendForCfgCommandInMillisecond { get { return 10000; } }
   39:  
   40:         public string LastSentCommand { get; private set; }
   41:  
   42:         public Queue<string> ReceiveQueue { get; set; }
   43:  
   44:         public Queue<string> SendQueue { get; set; }
   45:  
   46:         ////////////////////////////////////////////////////////////////////////////
   47:  
   48:         /// <summary>
   49:         ///
   50:         /// </summary>
   51:         public Ams()
   52:         {
   53:             this.telnet = new Dart.PowerTCP.Telnet.Telnet(); // this.components);
   54:  
   55:             this.telnet.ClientOptions.AddRange(new Dart.PowerTCP.Telnet.Option[] {
   56:             new Dart.PowerTCP.Telnet.Option(Dart.PowerTCP.Telnet.OptionCode.SuppressGoAheads, null, Dart.PowerTCP.Telnet.OptionState.RequestOn),
   57:             new Dart.PowerTCP.Telnet.Option(Dart.PowerTCP.Telnet.OptionCode.WindowSize, new byte[] {((byte)(0)),((byte)(80)),((byte)(0)),((byte)(24))}, Dart.PowerTCP.Telnet.OptionState.RequestOn),
   58:             new Dart.PowerTCP.Telnet.Option(Dart.PowerTCP.Telnet.OptionCode.TerminalType, new byte[] {((byte)(0)),((byte)(120)),((byte)(116)),((byte)(101)),((byte)(114)),((byte)(109))}, Dart.PowerTCP.Telnet.OptionState.RequestOn)});
   59:  
   60:             this.telnet.ServerOptions.AddRange(new Dart.PowerTCP.Telnet.Option[] {
   61:             new Dart.PowerTCP.Telnet.Option(Dart.PowerTCP.Telnet.OptionCode.SuppressGoAheads, null, Dart.PowerTCP.Telnet.OptionState.RequestOn),
   62:             new Dart.PowerTCP.Telnet.Option(Dart.PowerTCP.Telnet.OptionCode.Echo, null, Dart.PowerTCP.Telnet.OptionState.RequestOn)});
   63:  
   64:             //this.telnet.SynchronizingObject = this;
   65:             this.telnet.TerminalType = "xterm";
   66:             //this.telnet.WindowSize = new System.Drawing.Size(80, 24);
   67:             this.telnet.EndReceive += new Dart.PowerTCP.Telnet.SegmentEventHandler(this.Telnet_EndReceive);
   68:             this.telnet.ConnectedChangedEx += new Dart.PowerTCP.Telnet.EventHandlerEx(this.Telnet_ConnectedChangedEx);
   69:  
   70:             receiveString = string.Empty;
   71:             ReceiveQueue = new Queue<string>(100);
   72:             SendQueue = new Queue<string>(100);
   73:  
   74:             isLoggedIn = false;
   75:         }
   76:  
   77:         ////////////////////////////////////////////////////////////////////////////
   78:  
   79:         /// <summary>
   80:         ///
   81:         /// </summary>
   82:         ~Ams()
   83:         {
   84:             Dispose();
   85:         }
   86:  
   87:         ////////////////////////////////////////////////////////////////////////////
   88:  
   89:         /// <summary>
   90:         ///
   91:         /// </summary>
   92:         public void Connect(out Ia.Cl.Models.Result result)
   93:         {
   94:             result = new Ia.Cl.Models.Result();
   95:  
   96:             try
   97:             {
   98:                 telnet.ClientOptions.Add(new Option(OptionCode.SuppressGoAheads, null, OptionState.RequestOn));
   99:                 telnet.ClientOptions.Add(new Option(OptionCode.TerminalType, new System.Byte[] { ((System.Byte)(0)), ((System.Byte)(116)), ((System.Byte)(116)), ((System.Byte)(121)) }, OptionState.RequestOn));
  100:                 telnet.ServerOptions.Add(new Option(OptionCode.SuppressGoAheads, null, OptionState.RequestOn));
  101:                 telnet.ServerOptions.Add(new Option(OptionCode.Echo, null, OptionState.RequestOn));
  102:                 telnet.ServerOptions.Add(new Option(OptionCode.OutputPageSize, null, OptionState.RequestOn));
  103:  
  104:                 telnet.Connect(Ia.Ftn.Cl.Model.Business.Nokia.Ams.Host, Ia.Ftn.Cl.Model.Business.Nokia.Ams.Port.ToString());
  105:  
  106:                 // receive using asynchronous technique
  107:                 telnet.ReceiveTimeout = 0;
  108:                 telnet.BeginReceive(buffer);
  109:  
  110:                 result.AddSuccess("Connected. ");
  111:             }
  112:             catch (Exception ex)
  113:             {
  114:                 result.AddError("Exception: " + ex.Message);
  115:  
  116:                 telnet.Close();
  117:             }
  118:         }
  119:  
  120:         ////////////////////////////////////////////////////////////////////////////
  121:  
  122:         /// <summary>
  123:         ///
  124:         /// </summary>
  125:         public void Disconnect(out Ia.Cl.Models.Result result)
  126:         {
  127:             result = new Ia.Cl.Models.Result();
  128:  
  129:             try
  130:             {
  131:                 telnet.Close();
  132:  
  133:                 result.AddSuccess("Disconnected. ");
  134:             }
  135:             catch (Exception ex)
  136:             {
  137:                 result.AddError(ex.Message);
  138:             }
  139:         }
  140:  
  141:         ////////////////////////////////////////////////////////////////////////////
  142:  
  143:         /// <summary>
  144:         ///
  145:         /// </summary>
  146:         public bool IsConnected
  147:         {
  148:             get
  149:             {
  150:                 return telnet.Connected;
  151:             }
  152:         }
  153:  
  154:         ////////////////////////////////////////////////////////////////////////////
  155:  
  156:         /// <summary>
  157:         ///
  158:         /// </summary>
  159:         public bool IsLoggedIn
  160:         {
  161:             get
  162:             {
  163:                 return isLoggedIn;
  164:             }
  165:             set
  166:             {
  167:                 isLoggedIn = value;
  168:             }
  169:         }
  170:  
  171:         ////////////////////////////////////////////////////////////////////////////
  172:  
  173:         /// <summary>
  174:         ///
  175:         /// </summary>
  176:         public void Dispose()
  177:         {
  178:             telnet.Dispose();
  179:         }
  180:  
  181:         ////////////////////////////////////////////////////////////////////////////
  182:  
  183:         /// <summary>
  184:         ///
  185:         /// </summary>
  186:         public void Send(string text, out Ia.Cl.Models.Result result)
  187:         {
  188:             result = new Ia.Cl.Models.Result();
  189:  
  190:             try
  191:             {
  192:                 if (telnet.Connected)
  193:                 {
  194:                     if (text != null)
  195:                     {
  196:                         LastSentCommand = text;
  197:  
  198:                         //this.textBox.AppendText("\r\n/* Sending: " + text + " */\r\n");
  199:  
  200:                         telnet.Send(text);
  201:  
  202:                         //result.AddSuccess("Sent: " + text);
  203:                     }
  204:                     else
  205:                     {
  206:                         result.AddError("No text to send. ");
  207:                     }
  208:                 }
  209:                 else
  210:                 {
  211:                     result.AddError("No established telnet connection. ");
  212:                     //if(processRunning) waitToConnectionCounter = waitToConnectionCounterSeconds;
  213:                 }
  214:             }
  215:             catch (Exception ex)
  216:             {
  217:                 //if(processRunning) waitToConnectionCounter = waitToConnectionCounterSeconds;
  218:  
  219:                 result.AddError(ex.Message);
  220:             }
  221:         }
  222:  
  223:         ////////////////////////////////////////////////////////////////////////////
  224:  
  225:         /// <summary>
  226:         ///
  227:         /// </summary>
  228:         private void Telnet_EndReceive(object sender, Dart.PowerTCP.Telnet.SegmentEventArgs e)
  229:         {
  230:             string message, entry;
  231:             string[] receiveStringSplit;
  232:  
  233:             if (e.Exception == null)
  234:             {
  235:                 receiveString += e.Segment.ToString();
  236:  
  237:                 if (!string.IsNullOrEmpty(receiveString))
  238:                 {
  239:                     receiveStringSplit = receiveString.Split(new string[] { "\r\n;" }, StringSplitOptions.None);
  240:  
  241:                     if (receiveStringSplit.Length > 0)
  242:                     {
  243:                         for (int i = 0; i < receiveStringSplit.Length; i++)
  244:                         {
  245:                             entry = receiveStringSplit[i];
  246:  
  247:                             if (!string.IsNullOrEmpty(entry) && !string.IsNullOrWhiteSpace(entry))
  248:                             {
  249:                                 // will not enqueue an empty entry
  250:  
  251:                                 if (i == receiveStringSplit.Length - 1)
  252:                                 {
  253:                                     // if there is a non empty last entry that means its incomplete and we will assign it to receiveString
  254:  
  255:                                     receiveString = entry;
  256:                                 }
  257:                                 else
  258:                                 {
  259:                                     message = entry + "\r\n;"; // important
  260:  
  261:                                     if (!ReceiveQueue.Contains(message))
  262:                                     {
  263:                                         // will not enqueue duplicate
  264:  
  265:                                         ReceiveQueue.Enqueue(message);
  266:                                     }
  267:  
  268:                                     receiveString = string.Empty;
  269:                                 }
  270:                             }
  271:                         }
  272:                     }
  273:                 }
  274:                 else
  275:                 {
  276:  
  277:                 }
  278:  
  279:                 if (telnet.Connected) telnet.BeginReceive(buffer);
  280:             }
  281:             else
  282:             {
  283:                 Debug.WriteLine("Telnet_EndReceive(): Exception: " + e.Exception.Message);
  284:  
  285:                 // I will not throw or handle the exception from the event handler
  286:                 // https://stackoverflow.com/questions/3114543/should-event-handlers-in-c-sharp-ever-raise-exceptions
  287:                 //throw new Exception("Telnet_EndReceive(): " + e.Exception.Message);
  288:             }
  289:         }
  290:  
  291:         ////////////////////////////////////////////////////////////////////////////
  292:  
  293:         /// <summary>
  294:         ///
  295:         /// </summary>
  296:         private void Telnet_ConnectedChangedEx(object sender, System.EventArgs e)
  297:         {
  298:             // always raised when Connection is established or closed (Connected property changes)
  299:  
  300:             //UpdateToolStripStatusLabel();
  301:         }
  302:  
  303:         ////////////////////////////////////////////////////////////////////////////
  304:  
  305:         /// <summary>
  306:         ///
  307:         /// </summary>
  308:         public Ia.Cl.Models.Result Update(string rowData)
  309:         {
  310:             bool isUpdated;
  311:  
  312:             isUpdated = Ia.Ftn.Cl.Model.Business.Nokia.Ams.UpdateDatabaseWithAmsCommandOutput(rowData, out Ia.Cl.Models.Result updateDatabaseWithAmsCommandOutputResult);
  313:  
  314:             return updateDatabaseWithAmsCommandOutputResult;
  315:         }
  316:  
  317:         ////////////////////////////////////////////////////////////////////////////
  318:         ////////////////////////////////////////////////////////////////////////////
  319:     }
  320:  
  321:     ////////////////////////////////////////////////////////////////////////////
  322:     ////////////////////////////////////////////////////////////////////////////
  323: }