📄 wmacommunicationhandler.java
字号:
/* * Copyright 2001, 2002, 2003 Sun Microsystems, Inc. All Rights Reserved. * Except for any files in PNG format (which are marked with the filename * extension ".png"), GIF format (which are marked with the filename * extension ".gif"), or JPEG format (which are marked with the filename * extension ".jpg"), redistribution and use in source and binary forms, * with or without modification, are permitted provided that the * following conditions are met: * - Redistribution of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistribution in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * You may compile, use, perform and display the following files with * original Java Smart Ticket Sample Application code obtained from Sun * Microsystems, Inc. only: * - files in PNG format and having the ".png" extension * - files in GIF format and having the ".gif" extension * - files in JPEG format and having the ".jpg" extension * You may not modify or redistribute .png, .gif, or .jpg files in any * form, in whole or in part, by any means without prior written * authorization from Sun Microsystems, Inc. and its licensors, if any. * Neither the name of Sun Microsystems, Inc., the 'Java Smart Ticket * Sample Application', 'Java', 'Java'-based names, or the names of * contributors may be used to endorse or promote products derived from * this software without specific prior written permission. * This software is provided "AS IS," without a warranty of any kind. ALL * EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES, * INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A * PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY EXCLUDED. SUN * MIDROSYSTEMS, INC. ("SUN") AND ITS LICENSORS SHALL NOT BE LIABLE FOR * ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING OR * DISTRIBUTING THIS SOFTWARE OR ITS DERIVATIVES. IN NO EVENT WILL SUN OR * ITS LICENSORS BE LIABLE FOR ANY LOST REVENUE, PROFIT OR DATA, OR FOR * DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL, INCIDENTAL OR PUNITIVE * DAMAGES, HOWEVER CAUSED AND REGARDLESS OF THE THEORY OF LIABILITY, * ARISING OUT OF THE USE OF OR INABILITY TO USE THIS SOFTWARE, EVEN IF * SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. * You acknowledge that this software is not designed, licensed or * intended for use in the design, construction, operation or maintenance * of any nuclear facility. * $Id: WMACommunicationHandler.java,v 1.9 2003/06/24 22:56:41 zull Exp $ */package com.sun.j2me.blueprints.smartticket.client.midp.model;import javax.microedition.io.*;import javax.wireless.messaging.*;import java.io.*;import com.sun.j2me.blueprints.smartticket.shared.midp.*;import com.sun.j2me.blueprints.smartticket.shared.midp.model.*;import com.sun.j2me.blueprints.smartticket.shared.midp.model.SeatingPlan.Seat;public class WMACommunicationHandler extends MessageHandler implements MessageListener { private MessageConnection connection = null; private boolean threadStopRequested = false; private RecommendationReceiver receiver = null; private int pendingMessages = 0; private final String smscAddress; private final String listeningAddress; public WMACommunicationHandler(MessageHandler nextHandler, String smsPort) throws ApplicationException { super(nextHandler); smscAddress = "sms://" + System.getProperty("wireless.messaging.sms.smsc") + ":" + smsPort; listeningAddress = "sms://:" + smsPort; if (!isAlreadyRegistered()) { try { PushRegistry.registerConnection(listeningAddress, "com.sun.j2me.blueprints.smartticket.client.midp.SmartTicketMIDlet", "*"); } catch (Exception e) { System.err.println(e); e.printStackTrace(); throw new ApplicationException(e); } } return; } private boolean isAlreadyRegistered() { String[] connections = PushRegistry.listConnections(false); for (int i = 0; i < connections.length; i++) { if (connections[i].equals(listeningAddress)) { return true; } } return false; } public boolean isPushActivated() { String[] connections = PushRegistry.listConnections(true); for (int i = 0; i < connections.length; i++) { if (connections[i].equals(listeningAddress)) { return true; } } return false; } public void init() throws ApplicationException { return; } public void destroy() throws ApplicationException { synchronized (this) { threadStopRequested = true; notify(); } try { if (connection != null) { connection.setMessageListener(null); connection.close(); } } catch (IOException ioe) {} return; } public void sendRecommendation(String text, MovieRating rating, String[] recipients) throws ApplicationException { if (recipients.length > 0) { MessageConnection connection = null; byte[] data = serializeMessageData(text, rating); try { connection = (MessageConnection) Connector.open(recipients[0]); for (int i = 0; i < recipients.length; i++) { if (!recipients.equals(smscAddress)) { // Do not send to himself BinaryMessage message = (BinaryMessage) connection.newMessage(MessageConnection.BINARY_MESSAGE, recipients[i]); message.setPayloadData(data); connection.send(message); // System.err.println("Message: " + message + " sent to:" + recipients[i] + " by " + smscAddress); } } } catch (IOException ioe) { System.err.println(ioe); ioe.printStackTrace(); throw new ApplicationException(ioe); } finally { if (connection != null) { try { connection.close(); } catch (IOException ioe) {} // Ignored } } // } else { // throw new IllegalArgumentException("Empty recipient list."); } } public void receiveRecommendation(RecommendationReceiver receiver) throws ApplicationException { this.receiver = receiver; try { connection = (MessageConnection) Connector.open(listeningAddress); connection.setMessageListener(this); threadStopRequested = false; new Thread() { public void run() { while (true) { try { synchronized (WMACommunicationHandler.this) { while (!threadStopRequested && pendingMessages == 0) { try { WMACommunicationHandler.this.wait(); } catch (InterruptedException e) {} } if (threadStopRequested) { break; } pendingMessages--; } try { Message message = connection.receive(); if (message instanceof BinaryMessage) { StringBuffer text = new StringBuffer(); MovieRating movieRating = deserializeMessageData(((BinaryMessage) message).getPayloadData(), text); String sender = message.getAddress(); WMACommunicationHandler.this.receiver.recommendationReceived(text.toString(), movieRating, sender); } } catch (IOException ioe) { System.err.println(ioe); ioe.printStackTrace(); } } catch (ApplicationException ae) { System.err.println(ae); // break; } } } }.start(); } catch (IOException ioe) { ioe.printStackTrace(); throw new ApplicationException(ioe); } } public void notifyIncomingMessage(MessageConnection connection) { // System.err.println(smscAddress + " notifyIncomingMessage."); synchronized (this) { pendingMessages++; notify(); } } public String getSMSCAddress() throws ApplicationException { return smscAddress; } private byte[] serializeMessageData(String text, MovieRating movieRating) throws ApplicationException { try { ByteArrayOutputStream stream = new ByteArrayOutputStream(); DataOutputStream dataStream = new DataOutputStream(stream); dataStream.writeUTF(text); movieRating.serialize(dataStream); dataStream.flush(); return stream.toByteArray(); } catch (IOException ioe) { throw new ApplicationException(ioe); } } private MovieRating deserializeMessageData(byte[] data, StringBuffer textBuffer) throws ApplicationException { try { DataInputStream stream = new DataInputStream(new ByteArrayInputStream(data)); String text = stream.readUTF(); textBuffer.append(text); MovieRating movieRating = MovieRating.deserialize(stream); return movieRating; } catch (IOException ioe) { throw new ApplicationException(ioe); } } }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -