PageRenderTime 50ms CodeModel.GetById 14ms RepoModel.GetById 1ms app.codeStats 0ms

/Movistar.SMS/Movistar.SMS.Service/MovistarService.cs

#
C# | 259 lines | 202 code | 50 blank | 7 comment | 31 complexity | 968d95b04f283183b894fba9a45fcaa4 MD5 | raw file
  1. using System;
  2. using System.Collections.Generic;
  3. using System.ComponentModel;
  4. using System.Data;
  5. using System.Diagnostics;
  6. using System.Linq;
  7. using System.ServiceProcess;
  8. using System.Text;
  9. using System.Threading;
  10. using Microsoft.Win32;
  11. using System.IO;
  12. namespace Movistar.SMS.Service
  13. {
  14. public partial class MovistarService : ServiceBase
  15. {
  16. private bool bRunning = false;
  17. private bool bStopping = false;
  18. private RemindersDB remindersDB = null;
  19. private string sLogFilePath = null;
  20. private string sServiceURL = null;
  21. private string sServicePass = null;
  22. private string sServiceMobile = null;
  23. #region Start/Stoping routines
  24. public MovistarService()
  25. {
  26. InitializeComponent();
  27. }
  28. protected override void OnStart(string[] args)
  29. {
  30. Thread myThread = new Thread(new ThreadStart(ThreadMain));
  31. myThread.Start();
  32. }
  33. protected override void OnStop()
  34. {
  35. bStopping = true;
  36. while (bRunning) // Wait for thread to finish
  37. Thread.Sleep(100);
  38. }
  39. #endregion
  40. #region ThreadMain
  41. private void ThreadMain()
  42. {
  43. try
  44. {
  45. RegistryKey key = Registry.LocalMachine.OpenSubKey(Service.Properties.Settings.Default.RegKeyAddIn);
  46. remindersDB = new RemindersDB(key.GetValue(Service.Properties.Settings.Default.RegKeyDB).ToString());
  47. sLogFilePath = key.GetValue(Service.Properties.Settings.Default.RegKeyLogFile).ToString();
  48. }
  49. catch (Exception e)
  50. {
  51. WriteToEventLog("Fallo al inicializar el servicio: " + e.Message, EventLogEntryType.Error);
  52. Stop(); // This is called in the actual thread. No deadlocks since bRunning is true at this time
  53. }
  54. bRunning = true;
  55. while (!bStopping)
  56. {
  57. try
  58. {
  59. // Get appointments with reminders that occurs on the future
  60. var nextReminders = from app in remindersDB.Appointments
  61. where app.Occurs >= DateTime.Now
  62. join appRem in remindersDB.AppointmentReminders
  63. on app.AppointmentID_ equals appRem.AppointmentID_
  64. join Rem in remindersDB.Reminders
  65. on appRem.ReminderID_ equals Rem.ReminderID_
  66. select new
  67. {
  68. To = app.To,
  69. TemplateID = app.TemplateID_,
  70. CustomMessage = app.CustomMessage,
  71. Occurs = app.Occurs,
  72. Days = Rem.Days,
  73. Hours = Rem.Hours,
  74. Minutes = Rem.Minutes,
  75. AppointmentID = app.AppointmentID_,
  76. ReminderID = Rem.ReminderID_
  77. };
  78. foreach (var reminder in nextReminders)
  79. {
  80. if (bStopping) // Allow it to stop in the middle
  81. break;
  82. // Process each reminder
  83. if ((reminder.To.Trim().Length == 0) || (reminder.TemplateID == null)) // If TO field is empty
  84. continue; // or no message skip to next one
  85. DateTime reminderABS = reminder.Occurs;
  86. reminderABS = reminderABS.Subtract(new TimeSpan(reminder.Days, reminder.Hours, reminder.Minutes, 0));
  87. if (DateTime.Now >= reminderABS) // It is time to send a reminder
  88. {
  89. bool bOkToSent = true;
  90. // Check that the reminder has not been sent already
  91. var sentReminders = from h in remindersDB.Historic
  92. where h.AppointmentID_ == reminder.AppointmentID &&
  93. h.ReminderID_ == reminder.ReminderID
  94. select h;
  95. if (sentReminders.Count() > 0) // Some reminders were already sent
  96. foreach (var sentReminder in sentReminders)
  97. if (sentReminder.SentOK)
  98. bOkToSent = false; // If any of them was sent OK then don't send again
  99. if (bOkToSent)
  100. {
  101. string sMessage = null; // Get text for message
  102. if (reminder.TemplateID == 0)
  103. sMessage = reminder.CustomMessage;
  104. else
  105. sMessage = (from t in remindersDB.Templates
  106. where t.TemplateID_ == reminder.TemplateID
  107. select t.Text).Single();
  108. if (sMessage.Trim().Length == 0) // If empty message text skip to next one
  109. continue;
  110. // Extract fields from message
  111. sMessage = sMessage.Replace("$DIA$", reminder.Occurs.ToShortDateString());
  112. sMessage = sMessage.Replace("$HORA$", reminder.Occurs.ToShortTimeString());
  113. // Normalize TO mobile numbers to API standard
  114. string toField = "";
  115. foreach (string number in reminder.To.Split(';'))
  116. {
  117. if (toField.Length > 0)
  118. toField += ";";
  119. toField += number.Trim();
  120. }
  121. Historic historicReminder = new Historic()
  122. {
  123. AppointmentID_ = reminder.AppointmentID,
  124. ReminderID_ = reminder.ReminderID,
  125. Date = DateTime.Now,
  126. SentTo = toField,
  127. Message = sMessage,
  128. SentOK = false
  129. };
  130. sServiceURL = LoadSetting("SERVICEURL");
  131. sServiceMobile = LoadSetting("SERVICEMOBILE");
  132. sServicePass = LoadSetting("SERVICEPASS");
  133. if ((sServiceURL.Length == 0) || (sServicePass.Length == 0) || (sServiceMobile.Length == 0))
  134. {
  135. WriteToEventLog("Parámetros de configuración de Movistar SMS inválidos", EventLogEntryType.Warning);
  136. // Call SMS HTTP gateway
  137. }
  138. else
  139. {
  140. string sStatus = MovistarGateway.SendMessage(sServiceURL, sServiceMobile, sServicePass,
  141. reminder.To, sMessage);
  142. if (sStatus.Length > 0)
  143. WriteToLogFile(sStatus);
  144. else
  145. historicReminder.SentOK = true;
  146. }
  147. // Save historic information
  148. remindersDB.Historic.InsertOnSubmit(historicReminder);
  149. remindersDB.SubmitChanges();
  150. }
  151. }
  152. }
  153. }
  154. catch (Exception e)
  155. {
  156. WriteToEventLog("Error inesperado: " + e.Message, EventLogEntryType.Error);
  157. }
  158. if (!bStopping) // Pause 60 seconds but allow it to stop in the middle
  159. for (int i = 1; i <= 12; i++)
  160. {
  161. Thread.Sleep(5000);
  162. if(bStopping)
  163. break;
  164. }
  165. }
  166. bRunning = false;
  167. }
  168. private string LoadSetting(string sKey)
  169. {
  170. var value = from setting in remindersDB.Settings
  171. where setting.Key == sKey
  172. select setting;
  173. if (value.Count() > 0)
  174. return (value.Single().Value);
  175. else
  176. {
  177. Settings newSetting = new Settings() { Key = sKey, Value = "" };
  178. remindersDB.Settings.InsertOnSubmit(newSetting);
  179. remindersDB.SubmitChanges();
  180. }
  181. return ("");
  182. }
  183. #endregion
  184. #region Tracing
  185. private void WriteToEventLog(string sMessage, EventLogEntryType type)
  186. {
  187. try
  188. {
  189. EventLog myLog = new EventLog();
  190. myLog.Source = "Movistar.SMS.Service";
  191. myLog.WriteEntry(sMessage, type);
  192. WriteToLogFile(sMessage);
  193. }
  194. catch { }
  195. }
  196. private void WriteToLogFile(string sMessage)
  197. {
  198. try
  199. {
  200. StreamWriter sw = new StreamWriter(sLogFilePath, true);
  201. sw.WriteLine(sMessage);
  202. sw.Flush();
  203. sw.Close();
  204. }
  205. catch { }
  206. }
  207. #endregion
  208. }
  209. }