1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980 |
- using System;
- using System.Collections.Generic;
- using System.Drawing;
- using System.Messaging;
- using System.Reactive.Concurrency;
- using System.Reactive.Linq;
- using System.Reactive.Subjects;
- namespace RxMouseServer
- {
- partial class Program
- {
- static IObserver<Point> Msmq()
- {
- var q = "BARTDE-M6500\\Private$\\MouseService";
- var queue = default(MessageQueue);
- if (MessageQueue.Exists(q))
- {
- queue = new MessageQueue(q);
- }
- else
- {
- queue = MessageQueue.Create(q);
- }
- var format = new System.Messaging.BinaryMessageFormatter();
- queue.Formatter = format;
- var incoming = Observable.Create<string>(observer =>
- {
- return NewThreadScheduler.Default.ScheduleLongRunning(cancel =>
- {
- while (!cancel.IsDisposed)
- {
- var msg = queue.Receive();
- observer.OnNext((string)msg.Body);
- }
- });
- });
- var sub = new ReplaySubject<Point>();
- var map = new Dictionary<string, IDisposable>();
- incoming.Subscribe(clientQueue =>
- {
- var command = clientQueue[0];
- var target = clientQueue.Substring(2);
- switch (command)
- {
- case 'S':
- {
- var cq = new MessageQueue(target);
- var crm = new System.Messaging.BinaryMessageFormatter();
- cq.Formatter = crm;
- map[target] = sub.Subscribe(pt =>
- {
- cq.Send(pt);
- });
- }
- break;
- case 'D':
- {
- var d = default(IDisposable);
- if (map.TryGetValue(target, out d))
- d.Dispose();
- }
- break;
- default:
- throw new Exception("Don't know what you're talking about!");
- }
- });
- return sub;
- }
- }
- }
|