1 29 30 40 41 42 package org.planetamessenger.protocols.jabber; 43 44 import java.util.Calendar ; 45 import java.util.Collection ; 46 import java.util.GregorianCalendar ; 47 import java.util.Iterator ; 48 import java.util.Locale ; 49 import org.jivesoftware.smack.AccountManager; 50 import org.jivesoftware.smack.Chat; 51 import org.jivesoftware.smack.ConnectionListener; 52 import org.jivesoftware.smack.PacketListener; 53 import org.jivesoftware.smack.Roster; 54 import org.jivesoftware.smack.RosterListener; 55 import org.jivesoftware.smack.SSLXMPPConnection; 56 import org.jivesoftware.smack.XMPPConnection; 57 import org.jivesoftware.smack.XMPPException; 58 import org.jivesoftware.smack.filter.PacketFilter; 59 import org.jivesoftware.smack.filter.PacketTypeFilter; 60 import org.jivesoftware.smack.packet.Message; 61 import org.jivesoftware.smack.packet.Packet; 62 import org.jivesoftware.smack.packet.Presence; 63 import org.planetamessenger.io.JClassPath; 64 import org.planetamessenger.mos.engine.JConfiguration; 65 import org.planetamessenger.plugin.JMessengerEventListener; 66 import org.planetamessenger.plugin.*; 67 import sun.security.x509.X400Address; 68 69 70 71 75 public class JJabberPlugin extends JPlugin { 76 77 private static final String JABBER_STATUS_OFFLINE = "offline"; 81 82 86 int port = -1; 88 boolean ssl = true; 89 String host = null; 90 boolean autoReconnect = true; 91 boolean loggedIn = false; 92 JJabberPlugin selfPluginObject = null; 93 94 XMPPConnection connection = null; 95 JUIEventListener uiListener = null; 96 JProtocolListener protocolListener = null; 97 JMessageListener messageListener = null; 98 JSubscribeListener subscribeListener = null; 99 100 private int status; 101 102 protected class JJabberPluginException extends Exception { 103 104 105 private static final long serialVersionUID = 1L; 106 107 protected JJabberPluginException() { 108 super(); 109 } 110 111 protected JJabberPluginException( String message, Throwable cause ) { 112 super( message, cause ); 113 } 114 115 protected JJabberPluginException( String message ) { 116 super( message ); 117 } 118 119 protected JJabberPluginException( Throwable cause ) { 120 super( cause ); 121 } 122 123 } 124 125 126 protected class JMessageListener implements PacketListener { 127 public void processPacket( Packet packet ) { 128 Message chat = ( Message ) packet; 129 130 String address = fixAddress( chat.getFrom() ); 131 String body = chat.getBody(); 132 133 GregorianCalendar cal = new GregorianCalendar ( Locale.getDefault() ); 134 fireOnReceiveMessage( address, cal, body ); 135 } 136 }; 137 138 139 protected class JSubscribeListener implements PacketListener { 140 public void processPacket( Packet packet ) { 141 Presence pres = ( Presence ) packet; 142 String address = pres.getFrom(); 143 144 fireOnRequestAuthorization( address, address ); 145 } 146 }; 147 148 protected class JUIEventListener implements JMessengerEventListener { 149 150 154 155 public void onAddUserToContactList( String strUserId ) { 156 System.err.println( "JJabberPlugin.onAddUserToContactList(...) - strUserId=" + strUserId ); 157 if( connection.getRoster().contains( strUserId ) ) 158 return; 159 160 try { 161 String nick = connection.getRoster().getEntry( strUserId ).getName(); 162 connection.getRoster().createEntry( strUserId, nick, null ); 163 } catch( XMPPException e ) { 164 System.err.println( "JJabberPlugin.onAddUserToContactList(...) - " + e ); 165 e.printStackTrace( System.err ); 166 } 167 } 168 169 public void onAuthorizeBuddy( String strUserId ) { 170 System.err.println( "JJabberPlugin.onAuthorizeBuddy(...) - strUserId=" + strUserId ); 171 Presence p = new Presence( Presence.Type.SUBSCRIBED ); 172 connection.sendPacket( p ); 173 } 174 175 public void onBuddyDetails( String strUserId ) { 176 System.err.println( "JJabberPlugin.onBuddyDetails(...) - strUserId=" + strUserId ); 178 } 179 180 public void onChangePassword( String strNewPasswd ) { 181 System.err.println( "JJabberPlugin.onChangePassword(...)" ); 182 183 AccountManager m = new AccountManager( connection ); 184 try { 185 m.changePassword( strNewPasswd ); 186 fireOnPasswordChangedSuccessfull( strNewPasswd ); 187 } catch( XMPPException e ) { 188 fireOnPasswordChangedFailed(); 189 e.printStackTrace(); 190 } 191 } 192 193 public void onChangePrivacy( String strUserId, int nPrivacyType ) { 194 System.err.println( "JJabberPlugin.onChangePrivacy(...) - strUserId=" + strUserId + ", nPrivacyType=" + nPrivacyType ); 196 } 197 198 public void onLogin( int nPluginStatus ) { 199 System.err.println( "JJabberPlugin.onLogin(...) - user=" + getUserId() + ", host=" + host + ", port=" + port ); 200 201 try { 202 if( ssl ) { 203 if( port == -1 ) { 205 connection = new XMPPConnection( host, 5222 ); 206 } 207 else { 208 connection = new XMPPConnection( host, port ); 209 } 210 } 211 else { 212 if( port == -1 ) { 214 connection = new SSLXMPPConnection( host, 5223 ); 215 } 216 else { 217 connection = new SSLXMPPConnection( host, port ); 218 } 219 } 220 221 connection.login( getUserId(), getPassword(), "PlanetaMessenger.org", false ); 222 223 if( !connection.isAuthenticated() ) { 224 throw new JJabberPluginException( "Failed to authenticate user=" + getUserId() + ", host=" + host + ", port=" + port ); 225 } 226 227 connection.addConnectionListener( protocolListener ); 228 229 Roster roster = connection.getRoster(); 230 roster.addRosterListener( protocolListener ); 231 connection.addPacketListener( messageListener, new PacketTypeFilter( Message.class ) ); 232 233 roster.setSubscriptionMode( Roster.SUBSCRIPTION_MANUAL ); 234 connection.addPacketListener( subscribeListener, new PacketTypeFilter( Presence.class ) { 235 236 public boolean accept( Packet packet ) { 237 if( !( packet instanceof Presence ) ) 242 return false; 243 244 Presence pres = ( Presence ) packet; 245 return super.accept( packet ) && pres.getType() == Presence.Type.SUBSCRIBE; 246 } 247 248 } ); 249 250 System.err.println( "JJabberPlugin.onLogin(...) - Logged in. user=" + getUserId() + ", host=" + host + ", port=" + port ); 251 loggedIn = true; 252 fireOnLoginAccepted(); 253 fireOnRegisterUserSucessfull(); fireOnPluginStatusChanged( nPluginStatus ); 258 } catch( XMPPException e ) { 259 System.err.println( "JJabberPlugin.onLogin(...) - " + e ); 260 e.printStackTrace( System.err ); 261 262 loggedIn = false; 263 fireOnLoginFailed(); 264 fireOnRegisterUserFailed(); } catch( JJabberPluginException e ) { 268 System.err.println( "JJabberPlugin.onLogin(...) - " + e ); 269 e.printStackTrace( System.err ); 270 271 loggedIn = false; 272 fireOnLoginFailed(); 273 fireOnRegisterUserFailed(); } catch( IllegalStateException e ) { 277 System.err.println( "JJabberPlugin.onLogin(...) - " + e ); 278 e.printStackTrace( System.err ); 279 280 loggedIn = false; 281 fireOnLoginFailed(); 282 fireOnRegisterUserFailed(); } 286 } 287 288 public void onLogout() { 289 System.err.println( "JJabberPlugin.onLogout()" ); 290 loggedIn = false; 291 if( !isConnected() ) 292 return; 293 294 connection.close(); 295 } 296 297 public void onPluginPropertiesUpdated() { 298 System.err.println( "JJabberPlugin.onPluginPropertiesUpdated()" ); 300 } 301 302 public void onPluginStatusChanged( int nStatus ) { 303 System.err.println( "JJabberPlugin.onPluginStatusChanged(...) - nStatus=" + nStatus ); 304 305 Presence p = new Presence( Presence.Type.AVAILABLE ); 306 Presence.Mode m = ( Presence.Mode ) translateStatusToPlugin( nStatus ); 307 308 if( m == null || m.equals( JABBER_STATUS_OFFLINE ) ) { 309 p.setType( Presence.Type.UNAVAILABLE ); 310 } 311 else { 312 p.setMode( m ); 313 } 314 315 connection.sendPacket( p ); 316 } 317 318 public void onPrivacyChanged() { 319 System.err.println( "JJabberPlugin.onPrivacyChanged()" ); 321 } 322 323 public void onRegisterExistingUser( String strNickName, String strUserId, String strPasswd ) { 324 System.err.println( "JJabberPlugin.onRegisterExistingUser(...) - strNickName=" + strNickName + ",strUserId=" + strUserId ); 325 326 JUserInfo userInfo = new JUserInfo( strUserId, strNickName, strPasswd, JPlugin.STATUS_ONLINE ); 327 328 setUserInfo( userInfo ); 329 fireOnLogin(); 330 } 331 332 public void onRegisterNewUser( String strNickName, StringBuffer strNewUserId, String strPasswd ) { 333 System.err.println( "JJabberPlugin.onRegisterNewUser(...) - strNickName=" + strNickName + ",strNewUserId=" + strNewUserId ); 334 335 JUserInfo userInfo = new JUserInfo( strNewUserId.toString(), strNickName, strPasswd, JPlugin.STATUS_ONLINE ); 336 337 setUserInfo( userInfo ); 338 fireOnLogin(); 339 } 340 341 public void onRemoveUserFromContactList( String strUserId ) { 342 System.err.println( "JJabberPlugin.onRemoveUserFromContactList(...) - strUserId=" + strUserId ); 344 345 Presence p = new Presence( Presence.Type.UNSUBSCRIBE ); 346 p.setTo( strUserId ); 347 p.setFrom( getUserId() ); 348 connection.sendPacket( p ); 349 } 350 351 public void onRequestAuthorization( String strUserId, String strNickName ) { 352 System.err.println( "JJabberPlugin.onRequestAuthorization(...) - strUserId=" + strUserId + ",strNickName=" + strNickName ); 353 354 Presence p = new Presence( Presence.Type.SUBSCRIBE ); 355 p.setTo( strUserId ); 356 p.setFrom( getUserId() ); 357 connection.sendPacket( p ); 358 } 359 360 public void onSendMessage( String strToUser, String msg, int nMsgType ) { 361 363 System.err.println( "JJabberPlugin.onSendMessage(...) - strToUser=" + strToUser + ",msg=" + msg ); 364 365 Message m = new Message( strToUser, Message.Type.NORMAL ); 366 m.setBody( msg ); 367 368 connection.sendPacket( m ); 369 } 370 371 public void onUnauthorizeBuddy( String strUserId ) { 372 System.err.println( "JJabberPlugin.onUnauthorizeBuddy(...) - strUserId=" + strUserId ); 374 } 375 376 public void onUnregisterUser() { 377 System.err.println( "JJabberPlugin.onUnregisterUser()" ); 378 379 AccountManager m = new AccountManager( connection ); 380 try { 381 m.deleteAccount(); 382 fireOnUnregisterUserSuccessfull(); 383 } catch( XMPPException e ) { 384 e.printStackTrace(); 385 } 386 } 387 388 } 389 390 391 protected class JProtocolListener implements RosterListener, ConnectionListener { 392 393 398 public void entriesAdded( Collection addresses ) { 399 System.err.println( "JJabberPlugin.entriesAdded() - addresses=" + addresses ); 400 Iterator addyIt = addresses.iterator(); 401 while( addyIt.hasNext() ) { 402 String xmppAddress = ( String ) addyIt.next(); 403 fireOnAddUserToContactList( xmppAddress ); 404 405 } 406 } 407 408 public void entriesDeleted( Collection addresses ) { 409 System.err.println( "JJabberPlugin.entriesDeleted() - addresses=" + addresses ); 410 } 416 417 public void entriesUpdated( Collection addresses ) { 418 System.err.println( "JJabberPlugin.entriesUpdated() - addresses=" + addresses ); 419 Iterator addyIt = addresses.iterator(); 420 while( addyIt.hasNext() ) { 421 String xmppAddress = ( String ) addyIt.next(); 422 fireOnBuddyDetails( xmppAddress ); 423 } 424 } 425 426 public void presenceChanged( String xmppAddress ) { 427 428 JContactListItem item; 429 String strUserId = fixAddress( xmppAddress ); 430 431 item = new JContactListItem( selfPluginObject.getPluginProperties().getPluginId(), strUserId, strUserId ); 432 433 System.err.println( "JJabberPlugin.presenceChanged() - xmppAddress=" + item.getUserId() ); 434 435 if( !getKernelManager().getContactListManager().isContact( selfPluginObject, item.getUserId() ) ) 437 getKernelManager().getContactListManager().addToContactList( selfPluginObject, item.getUserId(), item.getUserId() ); 438 439 Presence p = connection.getRoster().getPresence( xmppAddress ); 440 int newStatus = ( p == null ? JPlugin.STATUS_OFFLINE : translateStatusFromPlugin( p.getMode() ) ); 441 442 System.err.println( "JJabberPlugin.presenceChanged() - p=" + p + ", newStatus=" + newStatus ); 443 444 status = newStatus; 445 fireOnBuddyStatusChanged( item.getUserId(), newStatus ); 446 } 447 448 452 public void connectionClosed() { 453 System.err.println( "JJabberPlugin.connectionClosed()" ); 454 455 fireOnLogout(); 456 457 if( autoReconnect && loggedIn ) { 458 uiListener.onLogin( status ); 459 } 460 } 461 462 public void connectionClosedOnError( Exception e ) { 463 System.err.println( "JJabberPlugin.connectionClosedOnError(...) - " + e ); 464 465 fireOnLogout(); 466 467 if( autoReconnect && loggedIn ) { 468 uiListener.onLogin( status ); 469 } 470 } 471 472 } 473 474 478 482 485 public JJabberPlugin() { 486 host = "jabber.org"; 488 selfPluginObject = this; 489 } 490 491 495 499 502 public boolean isConnected() { 503 return connection != null && ( ( connection.isAuthenticated() == true ) && ( connection.isConnected() == true ) ); 504 } 505 506 509 public void onCreate() { 510 511 super.onCreate(); 512 513 JPluginCapabilities capabilities = getPluginCapabilities(); 514 515 capabilities.putBool( JPluginCapabilities.CAPABILITY_REGISTER_NEW_USER, true ); 517 capabilities.putBool( JPluginCapabilities.CAPABILITY_OFFLINE_MESSAGE, true ); 518 setPluginCapabilities( capabilities ); 519 520 protocolListener = this.new JProtocolListener(); 521 messageListener = this.new JMessageListener(); 522 subscribeListener = this.new JSubscribeListener(); 523 524 uiListener = this.new JUIEventListener(); 525 addMessengerEventListener( uiListener ); 526 527 addStatus( JPlugin.STATUS_OFFLINE, Presence.Mode.fromString( JABBER_STATUS_OFFLINE ) ); 528 addStatus( JPlugin.STATUS_ONLINE, Presence.Mode.AVAILABLE ); 529 addStatus( JPlugin.STATUS_FREE_CHAT, Presence.Mode.CHAT ); 530 addStatus( JPlugin.STATUS_DND, Presence.Mode.DO_NOT_DISTURB ); 531 addStatus( JPlugin.STATUS_AWAY, Presence.Mode.AWAY ); 532 addStatus( JPlugin.STATUS_BUSY, Presence.Mode.EXTENDED_AWAY ); 533 addStatus( JPlugin.STATUS_INVISIBLE, Presence.Mode.INVISIBLE ); 534 } 535 536 540 544 private String fixAddress( String address ) { 545 int slash = address.lastIndexOf( '/' ); 546 if( slash != -1 ) 547 address = address.substring( 0, slash ); 548 return address; 549 } 550 } 551 | Popular Tags |