PageRenderTime 56ms CodeModel.GetById 20ms RepoModel.GetById 1ms app.codeStats 0ms

/v3.0/Router/Persister.cs

#
C# | 1107 lines | 910 code | 192 blank | 5 comment | 142 complexity | 2f7492da90107668fae39d08c989fae8 MD5 | raw file
  1. using System;
  2. using System.Collections;
  3. using System.Collections.Generic;
  4. using System.ComponentModel;
  5. using System.Data;
  6. using System.IO;
  7. using System.Net;
  8. using System.Net.Sockets;
  9. using System.Diagnostics;
  10. using System.ServiceProcess;
  11. using System.Threading;
  12. using System.Text;
  13. using System.Reflection;
  14. using System.Reflection.Emit;
  15. using System.Xml.XPath;
  16. using Microsoft.WebSolutionsPlatform.Event;
  17. using Microsoft.WebSolutionsPlatform.PubSubManager;
  18. using Microsoft.WebSolutionsPlatform.Common;
  19. namespace Microsoft.WebSolutionsPlatform.Router
  20. {
  21. public partial class Router : ServiceBase
  22. {
  23. internal class PersistEventInfo
  24. {
  25. internal bool InUse;
  26. internal bool Loaded;
  27. internal string CopyToFileDirectory;
  28. internal string TempFileDirectory;
  29. internal long MaxFileSize;
  30. internal long CopyIntervalTicks;
  31. internal long NextCopyTick;
  32. internal bool CreateEmptyFiles;
  33. internal string OutFileName;
  34. internal StreamWriter OutStream;
  35. internal char FieldTerminator;
  36. internal char RowTerminator;
  37. internal char KeyValueSeparator;
  38. internal char BeginObjectSeparator;
  39. internal char EndObjectSeparator;
  40. internal char BeginArraySeparator;
  41. internal char EndArraySeparator;
  42. internal char StringDelimiter;
  43. internal char EscapeCharacter;
  44. internal Subscription subscription;
  45. internal Guid persistEventType;
  46. internal Guid PersistEventType
  47. {
  48. get
  49. {
  50. return persistEventType;
  51. }
  52. set
  53. {
  54. persistEventType = value;
  55. subscription.SubscriptionEventType = value;
  56. }
  57. }
  58. internal bool localOnly;
  59. internal bool LocalOnly
  60. {
  61. get
  62. {
  63. return localOnly;
  64. }
  65. set
  66. {
  67. localOnly = value;
  68. subscription.LocalOnly = value;
  69. }
  70. }
  71. internal PersistEventInfo()
  72. {
  73. InUse = false;
  74. Loaded = false;
  75. CopyIntervalTicks = 600000000;
  76. MaxFileSize = long.MaxValue - 1;
  77. CreateEmptyFiles = false;
  78. subscription = new Subscription();
  79. subscription.Subscribe = true;
  80. }
  81. }
  82. internal class Persister : ServiceThread
  83. {
  84. internal static bool copyInProcess = false;
  85. internal static bool localOnly = true;
  86. internal static long lastConfigFileTick;
  87. internal static long nextConfigFileCheckTick = 0;
  88. internal static long lastLocalConfigFileTick;
  89. internal static WspEventPublish eventPush = null;
  90. internal static Dictionary<Guid, PersistEventInfo> persistEvents = new Dictionary<Guid, PersistEventInfo>();
  91. private Stack<PersistFileEvent> persistFileEvents;
  92. private long nextCopyTick = 0;
  93. private string fileNameBase = string.Empty;
  94. private string fileNameSuffix = string.Empty;
  95. private QueueElement element;
  96. public Persister()
  97. {
  98. string hostName = Dns.GetHostName().ToLower();
  99. try
  100. {
  101. char[] splitChar = { '.' };
  102. IPHostEntry hostEntry = Dns.GetHostEntry(hostName);
  103. string[] temp = hostEntry.HostName.ToLower().Split(splitChar, 2);
  104. hostName = temp[0];
  105. }
  106. catch
  107. {
  108. }
  109. fileNameBase = hostName + @".Events.";
  110. fileNameSuffix = @".txt";
  111. persistFileEvents = new Stack<PersistFileEvent>();
  112. }
  113. public override void Start()
  114. {
  115. bool elementRetrieved;
  116. WspBuffer serializedEvent;
  117. long currentTick;
  118. long configFileTick;
  119. long localConfigFileTick;
  120. PersistEventInfo eventInfo;
  121. string eventFieldTerminator = @",";
  122. StreamWriter eventStream;
  123. PubSubManager.ReturnCode rc;
  124. string propName;
  125. byte propType;
  126. object propValue;
  127. try
  128. {
  129. Manager.ThreadInitialize.Release();
  130. }
  131. catch
  132. {
  133. // If the thread is restarted, this could throw an exception but just ignore
  134. }
  135. try
  136. {
  137. eventPush = new WspEventPublish();
  138. while (true)
  139. {
  140. currentTick = DateTime.UtcNow.Ticks;
  141. if (currentTick > nextConfigFileCheckTick)
  142. {
  143. nextConfigFileCheckTick = currentTick + 300000000;
  144. configFileTick = Configurator.GetConfigFileTick();
  145. localConfigFileTick = Configurator.GetLocalConfigFileTick();
  146. if (configFileTick != lastConfigFileTick || localConfigFileTick != lastLocalConfigFileTick)
  147. {
  148. nextCopyTick = 0;
  149. foreach (PersistEventInfo eInfo in persistEvents.Values)
  150. {
  151. eInfo.Loaded = false;
  152. }
  153. lock (configFileLock)
  154. {
  155. Configurator.LoadLogSettings();
  156. Configurator.LoadLocalLogSettings();
  157. }
  158. foreach (PersistEventInfo eInfo in persistEvents.Values)
  159. {
  160. if (eInfo.Loaded == false)
  161. {
  162. eInfo.InUse = false;
  163. eInfo.NextCopyTick = currentTick - 1;
  164. eInfo.subscription.Subscribe = false;
  165. WspEvent wspEvent = new WspEvent(Subscription.SubscriptionEvent, null, eInfo.subscription.Serialize());
  166. eventPush.OnNext(wspEvent, out rc);
  167. }
  168. }
  169. lastConfigFileTick = configFileTick;
  170. lastLocalConfigFileTick = localConfigFileTick;
  171. }
  172. foreach (PersistEventInfo eInfo in persistEvents.Values)
  173. {
  174. if (eInfo.InUse == true)
  175. {
  176. eInfo.subscription.Subscribe = true;
  177. WspEvent wspEvent = new WspEvent(Subscription.SubscriptionEvent, null, eInfo.subscription.Serialize());
  178. eventPush.OnNext(wspEvent, out rc);
  179. }
  180. }
  181. }
  182. try
  183. {
  184. element = persisterQueue.Dequeue();
  185. if (element == default(QueueElement))
  186. {
  187. elementRetrieved = false;
  188. }
  189. else
  190. {
  191. elementRetrieved = true;
  192. }
  193. }
  194. catch (InvalidOperationException)
  195. {
  196. elementRetrieved = false;
  197. }
  198. currentTick = DateTime.UtcNow.Ticks;
  199. if (currentTick > nextCopyTick)
  200. {
  201. nextCopyTick = long.MaxValue;
  202. foreach (PersistEventInfo persistEventInfo in persistEvents.Values)
  203. {
  204. if (currentTick > persistEventInfo.NextCopyTick)
  205. {
  206. persistEventInfo.NextCopyTick = currentTick + persistEventInfo.CopyIntervalTicks;
  207. if (persistEventInfo.OutStream != null)
  208. {
  209. persistEventInfo.OutStream.Close();
  210. SendPersistEvent(PersistFileState.Close, persistEventInfo, persistEventInfo.OutFileName);
  211. persistEventInfo.OutStream = null;
  212. }
  213. if (persistEventInfo.InUse == true)
  214. {
  215. persistEventInfo.OutFileName = persistEventInfo.TempFileDirectory + fileNameBase + DateTime.UtcNow.ToString("u").Replace(":", "-") + fileNameSuffix;
  216. if (File.Exists(persistEventInfo.OutFileName) == true)
  217. persistEventInfo.OutStream = new StreamWriter(File.Open(persistEventInfo.OutFileName, FileMode.Append, FileAccess.Write, FileShare.None), Encoding.Unicode);
  218. else
  219. persistEventInfo.OutStream = new StreamWriter(File.Open(persistEventInfo.OutFileName, FileMode.Create, FileAccess.Write, FileShare.None), Encoding.Unicode);
  220. SendPersistEvent(PersistFileState.Open, persistEventInfo, persistEventInfo.OutFileName);
  221. }
  222. }
  223. if (persistEventInfo.NextCopyTick < nextCopyTick)
  224. {
  225. nextCopyTick = persistEventInfo.NextCopyTick;
  226. }
  227. }
  228. if (copyInProcess == false)
  229. {
  230. Thread copyThread = new Thread(new ThreadStart(CopyFile));
  231. copyInProcess = true;
  232. copyThread.Start();
  233. }
  234. }
  235. if (elementRetrieved == true)
  236. {
  237. eventInfo = persistEvents[element.WspEvent.EventType];
  238. if (eventInfo.InUse == true)
  239. {
  240. eventFieldTerminator = eventInfo.FieldTerminator.ToString();
  241. eventStream = eventInfo.OutStream;
  242. if (eventStream == null)
  243. {
  244. eventInfo.NextCopyTick = DateTime.UtcNow.Ticks + eventInfo.CopyIntervalTicks;
  245. eventInfo.OutFileName = eventInfo.TempFileDirectory + fileNameBase + DateTime.UtcNow.ToString("u").Replace(":", "-") + fileNameSuffix;
  246. if (File.Exists(eventInfo.OutFileName) == true)
  247. eventInfo.OutStream = new StreamWriter(File.Open(eventInfo.OutFileName, FileMode.Append, FileAccess.Write, FileShare.None), Encoding.Unicode);
  248. else
  249. eventInfo.OutStream = new StreamWriter(File.Open(eventInfo.OutFileName, FileMode.Create, FileAccess.Write, FileShare.None), Encoding.Unicode);
  250. eventStream = eventInfo.OutStream;
  251. if (eventInfo.NextCopyTick < nextCopyTick)
  252. {
  253. nextCopyTick = eventInfo.NextCopyTick;
  254. }
  255. SendPersistEvent(PersistFileState.Open, eventInfo, eventInfo.OutFileName);
  256. }
  257. eventStream.Write(eventInfo.BeginObjectSeparator);
  258. eventStream.Write(eventInfo.StringDelimiter.ToString());
  259. eventStream.Write("OriginatingRouterName");
  260. eventStream.Write(eventInfo.StringDelimiter.ToString());
  261. eventStream.Write(eventInfo.KeyValueSeparator.ToString());
  262. eventStream.Write(eventInfo.StringDelimiter.ToString());
  263. eventStream.Write(CleanseString(element.WspEvent.OriginatingRouterName, eventInfo));
  264. eventStream.Write(eventInfo.StringDelimiter.ToString());
  265. eventStream.Write(eventInfo.FieldTerminator.ToString());
  266. eventStream.Write(eventInfo.StringDelimiter.ToString());
  267. eventStream.Write("InRouterName");
  268. eventStream.Write(eventInfo.StringDelimiter.ToString());
  269. eventStream.Write(eventInfo.KeyValueSeparator.ToString());
  270. eventStream.Write(eventInfo.StringDelimiter.ToString());
  271. eventStream.Write(CleanseString(element.WspEvent.InRouterName, eventInfo));
  272. eventStream.Write(eventInfo.StringDelimiter.ToString());
  273. serializedEvent = new WspBuffer(element.WspEvent.Body);
  274. while (serializedEvent.Position < serializedEvent.Size)
  275. {
  276. if (serializedEvent.Read(out propName) == false)
  277. {
  278. throw new EventDeserializationException("Error reading PropertyName from buffer");
  279. }
  280. eventStream.Write(eventInfo.FieldTerminator.ToString());
  281. eventStream.Write(eventInfo.StringDelimiter.ToString());
  282. eventStream.Write(CleanseString(propName, eventInfo));
  283. eventStream.Write(eventInfo.StringDelimiter.ToString());
  284. eventStream.Write(eventInfo.KeyValueSeparator.ToString());
  285. if (serializedEvent.Read(out propType) == false)
  286. {
  287. throw new EventDeserializationException("Error reading PropertyType from buffer");
  288. }
  289. switch (propType)
  290. {
  291. case (byte)PropertyType.StringDictionary:
  292. WriteStringDictionary(eventStream, serializedEvent, eventInfo);
  293. break;
  294. case (byte)PropertyType.ObjectDictionary:
  295. WriteObjectDictionary(eventStream, serializedEvent, eventInfo);
  296. break;
  297. case (byte)PropertyType.StringList:
  298. WriteStringList(eventStream, serializedEvent, eventInfo);
  299. break;
  300. case (byte)PropertyType.ObjectList:
  301. WriteObjectList(eventStream, serializedEvent, eventInfo);
  302. break;
  303. case (byte)PropertyType.ByteArray:
  304. WriteByteArray(eventStream, serializedEvent, eventInfo);
  305. break;
  306. case (byte)PropertyType.CharArray:
  307. WriteCharArray(eventStream, serializedEvent, eventInfo);
  308. break;
  309. case (byte)PropertyType.DateTime:
  310. WriteDateTime(eventStream, serializedEvent, eventInfo);
  311. break;
  312. case (byte)PropertyType.Int64:
  313. if (string.Compare(propName, "EventTime", true) == 0)
  314. {
  315. WriteDateTime(eventStream, serializedEvent, eventInfo);
  316. }
  317. else
  318. {
  319. if (serializedEvent.Read((PropertyType)propType, out propValue) == false)
  320. {
  321. throw new EventDeserializationException("Error reading PropertyValue from buffer");
  322. }
  323. eventStream.Write(eventInfo.StringDelimiter.ToString());
  324. eventStream.Write(CleanseString(propValue.ToString(), eventInfo));
  325. eventStream.Write(eventInfo.StringDelimiter.ToString());
  326. }
  327. break;
  328. default:
  329. if (serializedEvent.Read((PropertyType)propType, out propValue) == false)
  330. {
  331. throw new EventDeserializationException("Error reading PropertyValue from buffer");
  332. }
  333. eventStream.Write(eventInfo.StringDelimiter.ToString());
  334. eventStream.Write(CleanseString(propValue.ToString(), eventInfo));
  335. eventStream.Write(eventInfo.StringDelimiter.ToString());
  336. break;
  337. }
  338. }
  339. eventStream.Write(eventInfo.EndObjectSeparator);
  340. eventStream.Write(eventInfo.RowTerminator);
  341. if (eventStream.BaseStream.Length >= eventInfo.MaxFileSize)
  342. {
  343. eventInfo.NextCopyTick = currentTick - 1;
  344. nextCopyTick = eventInfo.NextCopyTick;
  345. }
  346. }
  347. }
  348. }
  349. }
  350. catch (IOException e)
  351. {
  352. EventLog.WriteEntry("WspEventRouter", e.ToString(), EventLogEntryType.Error);
  353. Thread.Sleep(60000);
  354. }
  355. catch (ThreadAbortException)
  356. {
  357. // Another thread has signalled that this worker
  358. // thread must terminate. Typically, this occurs when
  359. // the main service thread receives a service stop
  360. // command.
  361. }
  362. catch (Exception e)
  363. {
  364. EventLog.WriteEntry("WspEventRouter", e.ToString(), EventLogEntryType.Error);
  365. throw e;
  366. }
  367. }
  368. private void WriteStringDictionary(StreamWriter eventStream, WspBuffer serializedEvent, PersistEventInfo eventInfo)
  369. {
  370. int dictCount;
  371. string stringKey;
  372. string stringValue;
  373. bool first = true;
  374. if (serializedEvent.Read(out dictCount) == false)
  375. {
  376. throw new EventDeserializationException("Error reading StringDictionary length from buffer");
  377. }
  378. eventStream.Write(eventInfo.BeginObjectSeparator);
  379. for (int i = 0; i < dictCount; i++)
  380. {
  381. if (first == true)
  382. {
  383. first = false;
  384. }
  385. else
  386. {
  387. eventStream.Write(eventInfo.FieldTerminator);
  388. }
  389. if (serializedEvent.Read(out stringKey) == false)
  390. {
  391. throw new EventDeserializationException("Error reading StringDictionary key from buffer");
  392. }
  393. eventStream.Write(eventInfo.StringDelimiter.ToString());
  394. eventStream.Write(CleanseString(stringKey, eventInfo));
  395. eventStream.Write(eventInfo.StringDelimiter.ToString());
  396. eventStream.Write(eventInfo.KeyValueSeparator);
  397. if (serializedEvent.Read(out stringValue) == false)
  398. {
  399. throw new EventDeserializationException("Error reading StringDictionary value from buffer");
  400. }
  401. eventStream.Write(eventInfo.StringDelimiter.ToString());
  402. eventStream.Write(CleanseString(stringValue, eventInfo));
  403. eventStream.Write(eventInfo.StringDelimiter.ToString());
  404. }
  405. eventStream.Write(eventInfo.EndObjectSeparator);
  406. }
  407. private void WriteObjectDictionary(StreamWriter eventStream, WspBuffer serializedEvent, PersistEventInfo eventInfo)
  408. {
  409. int dictCount;
  410. string stringKey;
  411. byte propType;
  412. object propValue;
  413. bool first = true;
  414. if (serializedEvent.Read(out dictCount) == false)
  415. {
  416. throw new EventDeserializationException("Error reading StringDictionary length from buffer");
  417. }
  418. eventStream.Write(eventInfo.BeginObjectSeparator);
  419. for (int i = 0; i < dictCount; i++)
  420. {
  421. if (first == true)
  422. {
  423. first = false;
  424. }
  425. else
  426. {
  427. eventStream.Write(eventInfo.FieldTerminator);
  428. }
  429. if (serializedEvent.Read(out stringKey) == false)
  430. {
  431. throw new EventDeserializationException("Error reading StringDictionary key from buffer");
  432. }
  433. eventStream.Write(eventInfo.StringDelimiter.ToString());
  434. eventStream.Write(CleanseString(stringKey, eventInfo));
  435. eventStream.Write(eventInfo.StringDelimiter.ToString());
  436. eventStream.Write(eventInfo.KeyValueSeparator);
  437. if (serializedEvent.Read(out propType) == false)
  438. {
  439. throw new EventDeserializationException("Error reading PropertyType from buffer");
  440. }
  441. if ((PropertyType)propType == PropertyType.StringDictionary)
  442. {
  443. WriteStringDictionary(eventStream, serializedEvent, eventInfo);
  444. }
  445. else
  446. {
  447. if ((PropertyType)propType == PropertyType.ObjectDictionary)
  448. {
  449. WriteObjectDictionary(eventStream, serializedEvent, eventInfo);
  450. }
  451. else
  452. {
  453. if ((PropertyType)propType == PropertyType.StringList)
  454. {
  455. WriteStringList(eventStream, serializedEvent, eventInfo);
  456. }
  457. else
  458. {
  459. if ((PropertyType)propType == PropertyType.ObjectList)
  460. {
  461. WriteObjectList(eventStream, serializedEvent, eventInfo);
  462. }
  463. else
  464. {
  465. if (serializedEvent.Read((PropertyType)propType, out propValue) == false)
  466. {
  467. throw new EventDeserializationException("Error reading PropertyValue from buffer");
  468. }
  469. eventStream.Write(eventInfo.StringDelimiter.ToString());
  470. eventStream.Write(CleanseString(propValue.ToString(), eventInfo));
  471. eventStream.Write(eventInfo.StringDelimiter.ToString());
  472. }
  473. }
  474. }
  475. }
  476. }
  477. eventStream.Write(eventInfo.EndObjectSeparator);
  478. }
  479. private void WriteStringList(StreamWriter eventStream, WspBuffer serializedEvent, PersistEventInfo eventInfo)
  480. {
  481. int listCount;
  482. string stringValue;
  483. bool first = true;
  484. if (serializedEvent.Read(out listCount) == false)
  485. {
  486. throw new EventDeserializationException("Error reading List length from buffer");
  487. }
  488. eventStream.Write(eventInfo.BeginArraySeparator);
  489. for (int i = 0; i < listCount; i++)
  490. {
  491. if (first == true)
  492. {
  493. first = false;
  494. }
  495. else
  496. {
  497. eventStream.Write(eventInfo.FieldTerminator);
  498. }
  499. if (serializedEvent.Read(out stringValue) == false)
  500. {
  501. throw new EventDeserializationException("Error reading List value from buffer");
  502. }
  503. eventStream.Write(eventInfo.StringDelimiter.ToString());
  504. eventStream.Write(CleanseString(stringValue, eventInfo));
  505. eventStream.Write(eventInfo.StringDelimiter.ToString());
  506. }
  507. eventStream.Write(eventInfo.EndArraySeparator);
  508. }
  509. private void WriteObjectList(StreamWriter eventStream, WspBuffer serializedEvent, PersistEventInfo eventInfo)
  510. {
  511. int listCount;
  512. byte propType;
  513. object propValue;
  514. bool first = true;
  515. if (serializedEvent.Read(out listCount) == false)
  516. {
  517. throw new EventDeserializationException("Error reading List length from buffer");
  518. }
  519. eventStream.Write(eventInfo.BeginArraySeparator);
  520. for (int i = 0; i < listCount; i++)
  521. {
  522. if (first == true)
  523. {
  524. first = false;
  525. }
  526. else
  527. {
  528. eventStream.Write(eventInfo.FieldTerminator);
  529. }
  530. if (serializedEvent.Read(out propType) == false)
  531. {
  532. throw new EventDeserializationException("Error reading PropertyType from buffer");
  533. }
  534. if ((PropertyType)propType == PropertyType.StringDictionary)
  535. {
  536. WriteStringDictionary(eventStream, serializedEvent, eventInfo);
  537. }
  538. else
  539. {
  540. if ((PropertyType)propType == PropertyType.ObjectDictionary)
  541. {
  542. WriteObjectDictionary(eventStream, serializedEvent, eventInfo);
  543. }
  544. else
  545. {
  546. if ((PropertyType)propType == PropertyType.StringList)
  547. {
  548. WriteStringList(eventStream, serializedEvent, eventInfo);
  549. }
  550. else
  551. {
  552. if ((PropertyType)propType == PropertyType.ObjectList)
  553. {
  554. WriteObjectList(eventStream, serializedEvent, eventInfo);
  555. }
  556. else
  557. {
  558. if (serializedEvent.Read((PropertyType)propType, out propValue) == false)
  559. {
  560. throw new EventDeserializationException("Error reading PropertyValue from buffer");
  561. }
  562. eventStream.Write(eventInfo.StringDelimiter.ToString());
  563. eventStream.Write(CleanseString(propValue.ToString(), eventInfo));
  564. eventStream.Write(eventInfo.StringDelimiter.ToString());
  565. }
  566. }
  567. }
  568. }
  569. }
  570. eventStream.Write(eventInfo.EndArraySeparator);
  571. }
  572. private void WriteByteArray(StreamWriter eventStream, WspBuffer serializedEvent, PersistEventInfo eventInfo)
  573. {
  574. byte[] byteArray;
  575. bool first = true;
  576. if (serializedEvent.Read(out byteArray) == false)
  577. {
  578. throw new EventDeserializationException("Error reading List length from buffer");
  579. }
  580. eventStream.Write(eventInfo.BeginArraySeparator);
  581. for (int i = 0; i < byteArray.Length; i++)
  582. {
  583. if (first == true)
  584. {
  585. first = false;
  586. }
  587. else
  588. {
  589. eventStream.Write(eventInfo.FieldTerminator);
  590. }
  591. eventStream.Write(eventInfo.StringDelimiter.ToString());
  592. eventStream.Write(CleanseString(byteArray[i].ToString(), eventInfo));
  593. eventStream.Write(eventInfo.StringDelimiter.ToString());
  594. }
  595. eventStream.Write(eventInfo.EndArraySeparator);
  596. }
  597. private void WriteCharArray(StreamWriter eventStream, WspBuffer serializedEvent, PersistEventInfo eventInfo)
  598. {
  599. char[] charArray;
  600. bool first = true;
  601. if (serializedEvent.Read(out charArray) == false)
  602. {
  603. throw new EventDeserializationException("Error reading List length from buffer");
  604. }
  605. eventStream.Write(eventInfo.BeginArraySeparator);
  606. for (int i = 0; i < charArray.Length; i++)
  607. {
  608. if (first == true)
  609. {
  610. first = false;
  611. }
  612. else
  613. {
  614. eventStream.Write(eventInfo.FieldTerminator);
  615. }
  616. eventStream.Write(eventInfo.StringDelimiter.ToString());
  617. eventStream.Write(CleanseString(charArray[i].ToString(), eventInfo));
  618. eventStream.Write(eventInfo.StringDelimiter.ToString());
  619. }
  620. eventStream.Write(eventInfo.EndArraySeparator);
  621. }
  622. private void WriteDateTime(StreamWriter eventStream, WspBuffer serializedEvent, PersistEventInfo eventInfo)
  623. {
  624. DateTime dateTime;
  625. if (serializedEvent.Read(out dateTime) == false)
  626. {
  627. throw new EventDeserializationException("Error reading List length from buffer");
  628. }
  629. eventStream.Write(eventInfo.StringDelimiter.ToString());
  630. eventStream.Write(CleanseString(dateTime.ToString("o"), eventInfo));
  631. eventStream.Write(eventInfo.StringDelimiter.ToString());
  632. }
  633. private string CleanseString(string stringIn, PersistEventInfo eventInfo)
  634. {
  635. StringBuilder sb = new StringBuilder();
  636. if (string.IsNullOrEmpty(stringIn) == false)
  637. {
  638. for (int i = 0; i < stringIn.Length; i++)
  639. {
  640. if (stringIn[i] == eventInfo.StringDelimiter)
  641. {
  642. sb.Append(eventInfo.EscapeCharacter);
  643. sb.Append(eventInfo.StringDelimiter);
  644. continue;
  645. }
  646. else if (stringIn[i] == eventInfo.EscapeCharacter)
  647. {
  648. if (eventInfo.EscapeCharacter == '\\' && (i + 1) < stringIn.Length)
  649. {
  650. switch (stringIn.Substring(i, 2))
  651. {
  652. case @"\b":
  653. sb.Append(@"\b");
  654. i++;
  655. continue;
  656. case @"\f":
  657. sb.Append(@"\f");
  658. i++;
  659. continue;
  660. case @"\n":
  661. sb.Append(@"\n");
  662. i++;
  663. continue;
  664. case @"\r":
  665. sb.Append(@"\r");
  666. i++;
  667. continue;
  668. case @"\t":
  669. sb.Append(@"\t");
  670. i++;
  671. continue;
  672. case @"\u":
  673. sb.Append(@"\u");
  674. i++;
  675. continue;
  676. case @"\/":
  677. sb.Append(@"\/");
  678. i++;
  679. continue;
  680. case "\\\"":
  681. sb.Append("\\\"");
  682. i++;
  683. continue;
  684. case @"\\":
  685. sb.Append(@"\\");
  686. i++;
  687. continue;
  688. default:
  689. sb.Append(eventInfo.EscapeCharacter);
  690. sb.Append(eventInfo.EscapeCharacter);
  691. continue;
  692. }
  693. }
  694. else
  695. {
  696. sb.Append(eventInfo.EscapeCharacter);
  697. sb.Append(eventInfo.EscapeCharacter);
  698. continue;
  699. }
  700. }
  701. else
  702. {
  703. switch (stringIn[i])
  704. {
  705. case '\b':
  706. sb.Append(eventInfo.EscapeCharacter);
  707. sb.Append('b');
  708. continue;
  709. case '\f':
  710. sb.Append(eventInfo.EscapeCharacter);
  711. sb.Append('f');
  712. continue;
  713. case '\n':
  714. sb.Append(eventInfo.EscapeCharacter);
  715. sb.Append('n');
  716. continue;
  717. case '\r':
  718. sb.Append(eventInfo.EscapeCharacter);
  719. sb.Append('r');
  720. continue;
  721. case '\t':
  722. sb.Append(eventInfo.EscapeCharacter);
  723. sb.Append('t');
  724. continue;
  725. case '/':
  726. sb.Append(eventInfo.EscapeCharacter);
  727. sb.Append('/');
  728. continue;
  729. case '\"':
  730. sb.Append(eventInfo.EscapeCharacter);
  731. sb.Append('\"');
  732. continue;
  733. case '\\':
  734. sb.Append(eventInfo.EscapeCharacter);
  735. sb.Append('\\');
  736. continue;
  737. default:
  738. sb.Append(stringIn[i]);
  739. continue;
  740. }
  741. }
  742. }
  743. }
  744. return sb.ToString();
  745. }
  746. private void CopyFile()
  747. {
  748. PersistEventInfo eventInfo;
  749. bool inCopy = true;
  750. string[] files;
  751. FileInfo currentFileInfo;
  752. FileInfo listFileInfo = null;
  753. try
  754. {
  755. copyInProcess = true;
  756. foreach (Guid eventType in persistEvents.Keys)
  757. {
  758. eventInfo = persistEvents[eventType];
  759. files = Directory.GetFiles(eventInfo.TempFileDirectory);
  760. currentFileInfo = new FileInfo(eventInfo.OutFileName);
  761. for (int i = 0; i < files.Length; i++)
  762. {
  763. try
  764. {
  765. listFileInfo = new FileInfo(files[i]);
  766. if (eventInfo.InUse == false || string.Compare(currentFileInfo.Name, listFileInfo.Name, true) != 0)
  767. {
  768. try
  769. {
  770. inCopy = true;
  771. File.Copy(files[i], eventInfo.CopyToFileDirectory + @"temp\" + listFileInfo.Name, true);
  772. inCopy = false;
  773. SendPersistEvent(PersistFileState.Copy, eventInfo, files[i]);
  774. try
  775. {
  776. File.Move(eventInfo.CopyToFileDirectory + @"temp\" + listFileInfo.Name, eventInfo.CopyToFileDirectory + listFileInfo.Name);
  777. SendPersistEvent(PersistFileState.Move, eventInfo, eventInfo.CopyToFileDirectory + listFileInfo.Name);
  778. }
  779. catch (IOException)
  780. {
  781. SendPersistEvent(PersistFileState.MoveFailed, eventInfo, eventInfo.CopyToFileDirectory + @"temp\" + listFileInfo.Name);
  782. if (File.Exists(eventInfo.CopyToFileDirectory + listFileInfo.Name) == true &&
  783. new FileInfo(eventInfo.CopyToFileDirectory + listFileInfo.Name).Length ==
  784. new FileInfo(eventInfo.CopyToFileDirectory + @"temp\" + listFileInfo.Name).Length)
  785. {
  786. File.Delete(eventInfo.CopyToFileDirectory + @"temp\" + listFileInfo.Name);
  787. }
  788. else
  789. {
  790. File.Delete(eventInfo.CopyToFileDirectory + listFileInfo.Name);
  791. File.Move(eventInfo.CopyToFileDirectory + @"temp\" + listFileInfo.Name, eventInfo.CopyToFileDirectory + listFileInfo.Name);
  792. SendPersistEvent(PersistFileState.Move, eventInfo, eventInfo.CopyToFileDirectory + listFileInfo.Name);
  793. }
  794. }
  795. File.Delete(files[i]);
  796. }
  797. catch
  798. {
  799. if (inCopy == true)
  800. {
  801. SendPersistEvent(PersistFileState.CopyFailed, eventInfo, files[i]);
  802. }
  803. else
  804. {
  805. SendPersistEvent(PersistFileState.MoveFailed, eventInfo, eventInfo.CopyToFileDirectory + @"temp\" + listFileInfo.Name);
  806. }
  807. Directory.CreateDirectory(eventInfo.CopyToFileDirectory);
  808. Directory.CreateDirectory(eventInfo.CopyToFileDirectory + @"temp\");
  809. inCopy = true;
  810. File.Copy(files[i], eventInfo.CopyToFileDirectory + @"temp\" + listFileInfo.Name, true);
  811. inCopy = false;
  812. SendPersistEvent(PersistFileState.Copy, eventInfo, files[i]);
  813. File.Move(eventInfo.CopyToFileDirectory + @"temp\" + listFileInfo.Name, eventInfo.CopyToFileDirectory + listFileInfo.Name);
  814. SendPersistEvent(PersistFileState.Move, eventInfo, eventInfo.CopyToFileDirectory + listFileInfo.Name);
  815. File.Delete(files[i]);
  816. }
  817. }
  818. }
  819. catch
  820. {
  821. if (inCopy == true)
  822. {
  823. SendPersistEvent(PersistFileState.CopyFailed, eventInfo, files[i]);
  824. }
  825. else
  826. {
  827. if (listFileInfo == null)
  828. {
  829. SendPersistEvent(PersistFileState.MoveFailed, eventInfo, null);
  830. }
  831. else
  832. {
  833. SendPersistEvent(PersistFileState.MoveFailed, eventInfo, eventInfo.CopyToFileDirectory + @"temp\" + listFileInfo.Name);
  834. }
  835. }
  836. }
  837. }
  838. }
  839. }
  840. catch (ThreadAbortException e)
  841. {
  842. throw e;
  843. }
  844. catch (Exception e)
  845. {
  846. EventLog.WriteEntry("WspEventRouter", e.ToString(), EventLogEntryType.Warning);
  847. }
  848. finally
  849. {
  850. copyInProcess = false;
  851. }
  852. }
  853. private void SendPersistEvent(PersistFileState fileState, PersistEventInfo eventInfo, string outFileName)
  854. {
  855. PersistFileEvent persistFileEvent;
  856. PubSubManager.ReturnCode rc;
  857. try
  858. {
  859. persistFileEvent = persistFileEvents.Pop();
  860. }
  861. catch
  862. {
  863. persistFileEvent = new PersistFileEvent();
  864. }
  865. persistFileEvent.PersistEventType = eventInfo.PersistEventType;
  866. persistFileEvent.FileState = fileState;
  867. persistFileEvent.FileName = outFileName;
  868. persistFileEvent.SettingLocalOnly = eventInfo.LocalOnly;
  869. persistFileEvent.SettingMaxCopyInterval = (int)(eventInfo.CopyIntervalTicks / 10000000);
  870. persistFileEvent.SettingMaxFileSize = eventInfo.MaxFileSize;
  871. persistFileEvent.SettingFieldTerminator = eventInfo.FieldTerminator;
  872. persistFileEvent.SettingRowTerminator = eventInfo.RowTerminator;
  873. persistFileEvent.SettingBeginObjectSeparator = eventInfo.BeginObjectSeparator;
  874. persistFileEvent.SettingEndObjectSeparator = eventInfo.EndObjectSeparator;
  875. persistFileEvent.SettingBeginArraySeparator = eventInfo.BeginArraySeparator;
  876. persistFileEvent.SettingEndArraySeparator = eventInfo.EndArraySeparator;
  877. persistFileEvent.SettingKeyValueSeparator = eventInfo.KeyValueSeparator;
  878. persistFileEvent.SettingStringDelimiter = eventInfo.StringDelimiter;
  879. persistFileEvent.SettingEscapeCharacter = eventInfo.EscapeCharacter;
  880. persistFileEvent.FileNameBase = fileNameBase;
  881. if (fileState == PersistFileState.Open || outFileName == null)
  882. {
  883. persistFileEvent.FileSize = 0;
  884. }
  885. else
  886. {
  887. try
  888. {
  889. persistFileEvent.FileSize = (new FileInfo(outFileName)).Length;
  890. }
  891. catch
  892. {
  893. persistFileEvent.FileSize = 0;
  894. }
  895. }
  896. for (int i = 0; i < 20; i++)
  897. {
  898. try
  899. {
  900. WspEvent wspEvent = new WspEvent(PersistFileEvent.EventType, null, persistFileEvent.Serialize());
  901. eventPush.OnNext(wspEvent, out rc);
  902. if (rc == PubSubManager.ReturnCode.Success)
  903. {
  904. break;
  905. }
  906. }
  907. catch
  908. {
  909. }
  910. }
  911. persistFileEvents.Push(persistFileEvent);
  912. }
  913. }
  914. }
  915. }