PageRenderTime 53ms CodeModel.GetById 15ms RepoModel.GetById 0ms app.codeStats 1ms

/v2.1/Router/Persister.cs

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