1: using System;
2: using System.Linq;
3: using System.Text.RegularExpressions;
4:
5: namespace Ia.Ngn.Cl.Model.Data.Nokia
6: {
7: ////////////////////////////////////////////////////////////////////////////
8:
9: /// <summary publish="true">
10: /// Nokia's Siemens EWSD support class of Next Generation Network'a (NGN's) data model.
11: /// </summary>
12: ///
13: /// <remarks>
14: /// Copyright © 2006-2019 Jasem Y. Al-Shamlan (info@ia.com.kw), Integrated Applications - Kuwait. All Rights Reserved.
15: ///
16: /// 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
17: /// the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
18: ///
19: /// This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
20: /// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
21: ///
22: /// You should have received a copy of the GNU General Public License along with this library. If not, see http://www.gnu.org/licenses.
23: ///
24: /// Copyright notice: This notice may not be removed or altered from any source distribution.
25: /// </remarks>
26: public class SiemensEwsd
27: {
28: ////////////////////////////////////////////////////////////////////////////
29:
30: /// <summary>
31: ///
32: /// </summary>
33: public SiemensEwsd() { }
34:
35: ////////////////////////////////////////////////////////////////////////////
36:
37: /// <summary>
38: ///
39: /// </summary>
40: public static bool UpdateDatabaseWithEwsdCommandOutput(string fileContent, out Ia.Cl.Model.Result result)
41: {
42: bool b;
43: Ia.Ngn.Cl.Model.Business.Nokia.SiemensEwsd.Response response;
44:
45: b = false;
46: result = new Ia.Cl.Model.Result();
47:
48: response = Ia.Ngn.Cl.Model.Data.Nokia.SiemensEwsd.ParseResponse(fileContent);
49:
50: if (response.ReturnCode == Ia.Ngn.Cl.Model.Business.Nokia.SiemensEwsd.ResultCode.OperationIsSuccessful
51: || response.ReturnCode == Ia.Ngn.Cl.Model.Business.Nokia.SiemensEwsd.ResultCode.ObjectNotASubscriber
52: || response.ReturnCode == Ia.Ngn.Cl.Model.Business.Nokia.SiemensEwsd.ResultCode.ObjectNotConnected
53: )
54: {
55: if (response.CommandString.StartsWith("DISPSUB:"))
56: {
57: b = Ia.Ngn.Cl.Model.Data.Nokia.SiemensEwsd.UpdateServiceFromSiemensEwsdResponse(response, out result);
58: }
59: else if (response.CommandString.StartsWith("DISPTIME;"))
60: {
61: result.AddSuccess(response.DateTime.ToString("yyyy-MM-dd hh:mm:ss"));
62: }
63: else
64: {
65: result.AddWarning("No designated opcode to process. ");
66:
67: b = false;
68: }
69: }
70: else
71: {
72: result.AddError("Operation failed. ");
73:
74: b = false;
75: }
76:
77: return b;
78: }
79:
80: ////////////////////////////////////////////////////////////////////////////
81:
82: /// <summary>
83: ///
84: /// </summary>
85: public static bool UpdateServiceFromSiemensEwsdResponse(Ia.Ngn.Cl.Model.Business.Nokia.SiemensEwsd.Response response, out Ia.Cl.Model.Result result)
86: {
87: bool insert, update, delete;
88: int serviceType;
89: string serviceId, service;
90: Ia.Ngn.Cl.Model.Service2 service2, newService;
91:
92: insert = update = delete = false;
93: result = new Ia.Cl.Model.Result();
94:
95: service = response.Service.ToString();
96:
97: using (var db = new Ia.Ngn.Cl.Model.Ngn())
98: {
99: serviceType = Ia.Ngn.Cl.Model.Business.Service.ServiceType.PstnService;
100: serviceId = Ia.Ngn.Cl.Model.Business.Service2.ServiceId(service, serviceType);
101:
102: if (response.IsProvisioned)
103: {
104: newService = new Ia.Ngn.Cl.Model.Service2();
105:
106: newService.Id = serviceId;
107: newService.AreaCode = Ia.Ngn.Cl.Model.Business.Service.CountryCode;
108: newService.Service = service;
109: newService.ServiceType = serviceType;
110:
111: if (response.ServiceSupplementaryService != null)
112: {
113: newService.CallerId = response.ServiceSupplementaryService.SupplementaryServiceList.Contains(Ia.Ngn.Cl.Model.Business.Service.SupplementaryService.CallerId);
114: newService.AbbriviatedCalling = response.ServiceSupplementaryService.SupplementaryServiceList.Contains(Ia.Ngn.Cl.Model.Business.Service.SupplementaryService.AbbriviatedCalling);
115: newService.CallForwarding = response.ServiceSupplementaryService.SupplementaryServiceList.Contains(Ia.Ngn.Cl.Model.Business.Service.SupplementaryService.CallForwarding);
116: newService.CallWaiting = response.ServiceSupplementaryService.SupplementaryServiceList.Contains(Ia.Ngn.Cl.Model.Business.Service.SupplementaryService.CallWaiting);
117: newService.ConferenceCall = response.ServiceSupplementaryService.SupplementaryServiceList.Contains(Ia.Ngn.Cl.Model.Business.Service.SupplementaryService.ConferenceCall);
118: newService.InternationalCalling = response.ServiceSupplementaryService.SupplementaryServiceList.Contains(Ia.Ngn.Cl.Model.Business.Service.SupplementaryService.InternationalCalling);
119: newService.InternationalCallingUserControlled = response.ServiceSupplementaryService.SupplementaryServiceList.Contains(Ia.Ngn.Cl.Model.Business.Service.SupplementaryService.InternationalCallingUserControlled);
120:
121: newService.AlarmCall = response.ServiceSupplementaryService.SupplementaryServiceList.Contains(Ia.Ngn.Cl.Model.Business.Service.SupplementaryService.WakeupCall);
122: newService.WakeupCall = response.ServiceSupplementaryService.SupplementaryServiceList.Contains(Ia.Ngn.Cl.Model.Business.Service.SupplementaryService.WakeupCall);
123:
124: newService.ServiceSuspension = response.ServiceSupplementaryService.SupplementaryServiceList.Contains(Ia.Ngn.Cl.Model.Business.Service.SupplementaryService.ServiceSuspension);
125: //newService.CallBarring = subParty.ServiceSuspension;
126:
127: newService.Pin = int.TryParse(response.ServiceSupplementaryService.Pin, out int i) ? i : 0;
128: }
129:
130: //if (nddOnt != null) newService.Access = (from a in db.Accesses where a.Id == nddOnt.Access.Id select a).SingleOrDefault();
131: //else
132: newService.Access = null;
133:
134: service2 = (from s in db.Service2s
135: where s.ServiceType == Ia.Ngn.Cl.Model.Business.Service.ServiceType.PstnService && s.Id == newService.Id
136: select s).SingleOrDefault();
137:
138: if (service2 == null)
139: {
140: newService.Created = newService.Updated = DateTime.UtcNow.AddHours(3);
141: db.Service2s.Add(newService);
142:
143: insert = true;
144: }
145: else
146: {
147: if (service2.Update(newService))
148: {
149: db.Service2s.Attach(service2);
150: db.Entry(service2).State = Microsoft.EntityFrameworkCore.EntityState.Modified;
151:
152: update = true;
153: }
154: else update = false;
155: }
156: }
157: else
158: {
159: service2 = (from s in db.Service2s
160: where s.ServiceType == Ia.Ngn.Cl.Model.Business.Service.ServiceType.PstnService && s.Id == serviceId
161: select s).SingleOrDefault();
162:
163: if (service2 != null)
164: {
165: db.Service2s.Remove(service2);
166:
167: delete = true;
168: }
169: }
170:
171: db.SaveChanges();
172: }
173:
174: result.AddSuccess(service + ": state: " + Ia.Ngn.Cl.Model.Ui.Text.ExpressionOfInsertOrUpdateOrDelete(insert, update, delete));
175:
176: return insert || update || delete;
177: }
178:
179: ////////////////////////////////////////////////////////////////////////////
180:
181: /// <summary>
182: /// Parse response of Siemens EWSD
183: /// </summary>
184: private static Ia.Ngn.Cl.Model.Business.Nokia.SiemensEwsd.Response ParseResponse(string fileContent)
185: {
186: string service;
187: Match match;
188: Ia.Ngn.Cl.Model.Business.Service.ServiceSupplementaryService serviceSupplementaryService;
189: Ia.Ngn.Cl.Model.Business.Nokia.SiemensEwsd.ResultCode returnCode;
190: Ia.Ngn.Cl.Model.Business.Nokia.SiemensEwsd.Response response;
191:
192: response = new Ia.Ngn.Cl.Model.Business.Nokia.SiemensEwsd.Response();
193:
194: if (fileContent.Contains("OBJECT NOT A SUBSCRIBER"))
195: {
196: // maybe a PBX?
197:
198: /*
199: -----------------------------------------------------------------------------
200:
201:
202: 7514
203:
204: COMMAND SUBMITTED
205:
206:
207:
208:
209:
210: 7514 MASKNO:10001
211: COMMAND ERROR MESSAGE FOR DISPSUB : 1 ERROR(S)
212: MASKNO:10990
213: OBJECT NOT A SUBSCRIBER
214:
215: CNTXT PAR.NAME PARAMETER VALUE
216: -----+--------+---------------------------------------------------------
217: DN =<25410000>
218:
219:
220: END JOB 7514
221:
222:
223:
224: -----------------------------------------------------------------------------
225:
226: */
227:
228: response.DateTime = DateTime.UtcNow.AddHours(3);
229:
230: match = Regex.Match(fileContent, @"DN =<(\d{8})>");
231:
232: if (match.Success)
233: {
234: service = match.Groups[1].Value;
235:
236: response.CommandString = @"DISPSUB:DN=" + service + ";";
237:
238: response.Service = int.Parse(service);
239:
240: response.IsProvisioned = true;
241:
242: returnCode = Ia.Ngn.Cl.Model.Business.Nokia.SiemensEwsd.ResultCode.ObjectNotASubscriber;
243: }
244: else
245: {
246: returnCode = Ia.Ngn.Cl.Model.Business.Nokia.SiemensEwsd.ResultCode.OperationFailed;
247: }
248: }
249: else if (fileContent.Contains("OBJECT NOT CONNECTED"))
250: {
251: /*
252:
253: -----------------------------------------------------------------------------
254:
255:
256: 6918
257:
258: COMMAND SUBMITTED
259:
260:
261:
262:
263:
264: 6918 MASKNO:10001
265: COMMAND ERROR MESSAGE FOR DISPSUB : 1 ERROR(S)
266: MASKNO:10990
267: OBJECT NOT CONNECTED
268:
269: CNTXT PAR.NAME PARAMETER VALUE
270: -----+--------+---------------------------------------------------------
271: DN =<25410011>
272:
273:
274: END JOB 6918
275:
276:
277:
278: -----------------------------------------------------------------------------
279: */
280:
281: response.DateTime = DateTime.UtcNow.AddHours(3);
282:
283: match = Regex.Match(fileContent, @"DN =<(\d{8})>");
284:
285: if (match.Success)
286: {
287: service = match.Groups[1].Value;
288:
289: response.CommandString = @"DISPSUB:DN=" + service + ";";
290:
291: response.Service = int.Parse(service);
292:
293: response.IsProvisioned = false;
294:
295: returnCode = Ia.Ngn.Cl.Model.Business.Nokia.SiemensEwsd.ResultCode.ObjectNotConnected;
296: }
297: else
298: {
299: returnCode = Ia.Ngn.Cl.Model.Business.Nokia.SiemensEwsd.ResultCode.OperationFailed;
300: }
301: }
302: else
303: {
304: match = Regex.Match(fileContent, @"(\d\d-\d\d-\d\d \d\d:\d\d:\d\d)");
305:
306: if (match.Success)
307: {
308: response.DateTime = DateTime.Parse(match.Value);
309:
310: match = Regex.Match(fileContent, @"(DISPSUB:DN=(\d{8});)");
311:
312: if (match.Success)
313: {
314: service = match.Groups[2].Value;
315:
316: response.CommandString = match.Value;
317:
318: serviceSupplementaryService = Ia.Ngn.Cl.Model.Business.Nokia.SiemensEwsd.ServiceSupplementaryServiceStateFromServiceNetManagerOutputString(fileContent);
319: response.ServiceSupplementaryService = serviceSupplementaryService;
320:
321: response.Service = int.Parse(service);
322:
323: response.IsProvisioned = true;
324:
325: returnCode = Ia.Ngn.Cl.Model.Business.Nokia.SiemensEwsd.ResultCode.OperationIsSuccessful;
326: }
327: else
328: {
329: returnCode = Ia.Ngn.Cl.Model.Business.Nokia.SiemensEwsd.ResultCode.OperationFailed;
330: }
331: }
332: else
333: {
334: returnCode = Ia.Ngn.Cl.Model.Business.Nokia.SiemensEwsd.ResultCode.OperationFailed;
335: }
336: }
337:
338: response.ReturnCode = returnCode;
339:
340: return response;
341: }
342:
343: ////////////////////////////////////////////////////////////////////////////
344: ////////////////////////////////////////////////////////////////////////////
345: }
346:
347: ////////////////////////////////////////////////////////////////////////////
348: ////////////////////////////////////////////////////////////////////////////
349: }
350: