|
|
import java.awt.*; import java.awt.event.*; import java.util.*; import mqoa.*; import com.ms.com.*; import com.ms.io.*; import java.io.*; import com.ms.wfc.ui.MessageBox;
//
//
// DistDraw-
// This Class is used to manage all the creation and managment of MSMQ queues
// and events. It also uses to manage the sending and receiving of messages.
//
//
public class DistDraw extends Frame implements ScribbleL, ActionListener, _DMSMQEventEvents { ScribbleC scribble = null; TextField txtSend = null; TextField txtReceive = null; Button sendButton = null; MenuItem menuConnect = null; MenuItem menuClear = null; TextField statusBar = null;
IMSMQQueue msmqSend = null; IMSMQQueue msmqReceive = null; MSMQEvent msmqEvent = null;
String loginName = null;
private ConnectionPointCookie cookie = null;
public static void main(String[] args) { DistDraw st = new DistDraw(); //
// Check DS status.
//
if (!st.IsDsEnabledLocally()) { MessageBox.show("This application is not designed to run on DS-Disabled environment", "Error", MessageBox.OK); System.exit(0); } st.setSize(320, 200); st.show(); st.start(); } public boolean IsDsEnabledLocally() { IMSMQApplication2 qapp2 = (IMSMQApplication2) new MSMQApplication(); boolean fIsDsEnabeledLocaly = qapp2.getIsDsEnabled() ; return fIsDsEnabeledLocaly; }
public DistDraw() { setLayout(new BorderLayout()); scribble = new ScribbleC(); scribble.addScribbleListener(this); add("Center", scribble);
// Create and add text panel
Panel textPanel = new Panel(); textPanel.setLayout(new BorderLayout(4,4)); txtSend = new TextField(25); txtReceive = new TextField(25); txtReceive.setEditable(false); sendButton = new Button("Send");
textPanel.add("Center", txtSend); textPanel.add("East", sendButton); textPanel.add("South", txtReceive); sendButton.addActionListener(this); add("North", textPanel);
// Add menu for connecting and clearing screen
Menu fileMenu = new Menu("File"); Menu viewMenu = new Menu("View"); menuConnect = new MenuItem("Connect"); menuClear = new MenuItem("Clear"); fileMenu.add(menuConnect); viewMenu.add(menuClear); MenuBar menuBar = new MenuBar(); menuBar.add(fileMenu); menuBar.add(viewMenu); setMenuBar(menuBar); menuConnect.addActionListener(this); menuClear.addActionListener(this);
//Add status bar
statusBar = new TextField(); statusBar.setEditable(false); add("South", statusBar);
// Enable events for closing window
enableEvents(AWTEvent.WINDOW_EVENT_MASK); }
public void start() { NameDlg d = new NameDlg(this, "Please Enter Your Name", "Login"); d.pack(); d.show();
loginName = d.getName(); setTitle(loginName);
createReceiveQueue(loginName); }
public void processWindowEvent(WindowEvent e) { if(e.getID() == e.WINDOW_CLOSING) { System.exit(0); } }
// Callback for the ScribbleC (scribble canvas) class
public void strokeCreated(Stroke stroke) { sendData(stroke, 3); } public void sendData(Object data, int priority) { // Check for send queue
if(msmqSend != null) { // Create safe array based on stroke
SafeArrayOutputStream safeOutStream = new SafeArrayOutputStream(); ObjectOutputStream objOutStream = null; try { objOutStream= new ObjectOutputStream(safeOutStream); objOutStream.writeObject(data); objOutStream.flush(); safeOutStream.close(); } catch(Exception e) { System.out.println("Error in ObjectOutputStream"); }
SafeArray bytes = safeOutStream.getSafeArray(); // Create message to send
IMSMQMessage msmqMsg=(IMSMQMessage)new MSMQMessage(); Variant msgbody=new Variant(); msgbody.putSafeArray ( bytes ); msmqMsg.setBody ( msgbody ); msmqMsg.setPriority( priority);
Variant noParam = new Variant(); noParam.noParam(); msmqMsg.Send ( msmqSend, noParam); } }
// Callback for the connect menu
public void actionPerformed(ActionEvent e) { if(e.getSource() == menuConnect) { // Connect to friend queue
NameDlg nd = new NameDlg(this, "Please Enter Friends Name", "Enter"); nd.pack(); nd.show();
if(nd.getName() != "") { System.out.println(nd.getName()); boolean retval = createSendQueue(nd.getName()); if(retval) setTitle(loginName + " connected to "+nd.getName()); } } else if(e.getSource() == menuClear) { scribble.clear(); sendData(new ClrAction(), 6); } else if(e.getSource() == sendButton) { // Send text
sendData(txtSend.getText(), 5); } }
public void createReceiveQueue(String queueName) {
Variant noParam = new Variant(); Variant vLabel = new Variant() ;
noParam.noParam (); vLabel.putString (queueName) ; IMSMQQuery query = (IMSMQQuery)new MSMQQuery(); IMSMQQueueInfos qinfos = null; IMSMQQueueInfo qinfo = null;
showStatus("Looking up Queue "+queueName);
// Search for queues with this name
qinfos = query.LookupQueue (noParam, noParam, vLabel, noParam, noParam, noParam, noParam, noParam, noParam) ; qinfos.Reset(); qinfo = qinfos.Next(); if(qinfo != null) { // Get the queue if it exists
try { showStatus("Attempting to open Queue "+queueName); msmqReceive=qinfo.Open ( MQACCESS.MQ_RECEIVE_ACCESS, MQSHARE.MQ_DENY_NONE ); } catch(Exception e) { showStatus("Attempt to open "+queueName+" failed"); System.out.println(e.toString()); } } else { // Create a queue
Variant isTransactional; Variant IsWorldReadable; qinfo = (IMSMQQueueInfo) new MSMQQueueInfo();
qinfo.setPathName(".\\"+queueName); // setPathName using JactiveX, putPathName using Typelib wizard
isTransactional = new Variant(); isTransactional.putBoolean(false); IsWorldReadable = new Variant(); IsWorldReadable.putBoolean(false);
qinfo.setLabel(queueName);
try { showStatus("Creating Queue named "+queueName); qinfo.Create(IsWorldReadable, isTransactional); } catch(Exception e) { System.out.println(e.toString()); }
showStatus("Opening Queue named "+queueName); msmqReceive=qinfo.Open ( MQACCESS.MQ_RECEIVE_ACCESS, MQSHARE.MQ_DENY_NONE ); } // Enable notifications on the receive queue
if ( msmqReceive != null ) { msmqEvent = new MSMQEvent();
showStatus("Enabling Notification for "+queueName); msmqReceive.EnableNotification((IMSMQEvent)msmqEvent, noParam, noParam); try { cookie = new ConnectionPointCookie(msmqEvent, this, Class.forName("mqoa._DMSMQEventEvents")); showStatus("Done."); } catch(Exception ex) { showStatus("Unable setup Notification"); } } }
public boolean createSendQueue(String queueName) {
Variant noParam = new Variant(); Variant vLabel = new Variant() ;
noParam.noParam (); vLabel.putString (queueName) ; IMSMQQuery query = (IMSMQQuery)new MSMQQuery(); IMSMQQueueInfos qinfos = null; IMSMQQueueInfo qinfo = null;
// Search for queues with this name
showStatus("Looking up Queue "+queueName); qinfos = query.LookupQueue (noParam, noParam, vLabel, noParam, noParam, noParam, noParam, noParam, noParam) ;
qinfos.Reset(); qinfo = qinfos.Next(); if ( qinfo != null ) { // We have at least one queue in this list
// Get the queue if it exists
showStatus("Attempting to open Queue "+queueName); msmqSend=qinfo.Open ( MQACCESS.MQ_SEND_ACCESS, MQSHARE.MQ_DENY_NONE ); if ( msmqSend == null ) { // We were not sucessful at opening the queue
showStatus("Attempt to open "+queueName+" failed"); System.out.println("Cannot open existing queue"); return false; } else { showStatus("Done."); return true; } } else { showStatus("Cannot find \"Friend\" "+queueName); return false; } }
// Event handlers for DMSMQEventEvents
public void Arrived(Object pdispQueue, int cursor) { IMSMQMessage msmqMsg; Variant wantbody=new Variant(); wantbody.putBoolean( true ); Variant noParam = new Variant(); noParam.noParam();
try { showStatus("Message arrived."); msmqMsg=msmqReceive.Receive ( noParam, noParam, wantbody, noParam); if ( msmqMsg != null ) { // Get Variant from message and convert to SafeArray
Variant body = msmqMsg.getBody(); SafeArray bytes = body.toSafeArray();
SafeArrayInputStream safeInStream = new SafeArrayInputStream(bytes);
ObjectInputStream objInStream = new ObjectInputStream(safeInStream);
Object data = objInStream.readObject();
if(data instanceof Stroke) scribble.addStroke((Stroke)data); else if(data instanceof String) txtReceive.setText((String)data); else if(data instanceof ClrAction) scribble.clear(); } } catch(Exception e) { showStatus("An error occured while processing message"); System.out.println(e.toString()); }
showStatus("Done.");
//Reenable notifications from the input queue
msmqReceive.EnableNotification((IMSMQEvent)msmqEvent, noParam, noParam); } public void ArrivedError(Object pdispQueue, int lErrorCode, int cursor) { showStatus("An error occurred."); Variant noParam = new Variant(); noParam.noParam ();
//Reenable notifications from the input queue
msmqReceive.EnableNotification((IMSMQEvent)msmqEvent, noParam, noParam); }
public void showStatus(String txt) { statusBar.setText(txt); } }
//
//
// SafeArrayOutputStream -
// This class is used to convert data from an OutputStream to a SafeArray .
//
//
class SafeArrayOutputStream extends ByteArrayOutputStream { public SafeArray getSafeArray() { // Allocate an array the size of the vector
byte[] byteArray = toByteArray();
// Create the safearray
SafeArray array = new SafeArray(Variant.VariantByte, byteArray.length);
// Fill in safearray
array.setBytes(0, byteArray.length, byteArray, 0);
return array; } } //
//
// SafeArrayInputStream-
// This class is used to convert data from a SafeArray
// to an InputStream.
//
//
class SafeArrayInputStream extends ByteArrayInputStream { public SafeArrayInputStream(SafeArray array) { super(array.toByteArray()); } }
|