439 lines
10 KiB
Java
439 lines
10 KiB
Java
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());
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|