PMHandler.java :  » Messenger » tigertalk » server » Java Open Source

Java Open Source » Messenger » tigertalk 
tigertalk » server » PMHandler.java
package server;
import msgs.*;

import java.io.*;
import java.util.*;
/**
 * Authorizes PMs and handles offline pms
 * Team 9: Andrew Hayworth, Brian Parrella, Ryan Kortmann, Nina Papa
 * @author Andrew Hayworth
 */
public class PMHandler extends Thread implements TTConstants{
  private PMMsg pmmsg;
  
  public PMHandler(ClientMsg cmsg) {
    this.pmmsg = (PMMsg) cmsg;
  }
  
  public void run() {
    //ick, i dont like how i did this
    // essentially we see if they set an offline flag -- if they didn't we auth and send details back, if they did and the user
    // really is offline, then we go into offline pm
    // we handle the non-offline case first.
    System.out.println(pmmsg.isOffline());
    if (!(pmmsg.isOffline())) {
      // auth
      if (!(Arrays.equals(pmmsg.getClientKey(), TTServer.connTable.get(pmmsg.getName()).getClientKey()))) {
        // DENY!
        pmmsg.setSpecialResponse(1);
        ClientSender.outQ.add((ClientMsg) pmmsg);
        assert (pmmsg.getResponse() != null);
        return;
      }
      //System.out.println("Server thinks wants user is " + pmmsg.getWantsUser());
      //System.out.println("Server thinks name is " + pmmsg.getName());
      if ((TTServer.blockList.containsKey(pmmsg.getWantsUser()) && !(TTServer.blockList.get(pmmsg.getWantsUser()).contains(pmmsg.getName())))
          || !(TTServer.blockList.containsKey(pmmsg.getWantsUser()))) {
        System.out.println("Keys are " +TTServer.connTable.keys());
        if (TTServer.connTable.containsKey(pmmsg.getWantsUser())) {
          // ok!
          System.out.println("User is online:");
          System.out.println(pmmsg.getWantsUser());
          pmmsg.setSpecialResponse(0);
          assert (pmmsg.getResponse() != null);
          pmmsg.setUserIP(TTServer.connTable.get(pmmsg.getWantsUser()).getIp());
        }
        else {
          // offline pm!
          pmmsg.setSpecialResponse(2);
          assert (pmmsg.getResponse() != null);
          ClientSender.outQ.add((ClientMsg) pmmsg);
        }
      }
      ClientSender.outQ.add((ClientMsg) pmmsg);
      return;
    }
    else {
      // oh god, they want to offline pm.
      // ensure they're REALLY offline, and if they are, return it back to the user with "NO_THEY_ARE_ONLINE"
      if (!(TTServer.connTable.containsKey(pmmsg.getWantsUser()))) {
        // k cool theyre offline
        // add msg to queue, if they're in there, else make a queue for them.
        
        // so, this is the block if they already have some kind of offline queue going
        if (TTServer.offlinePm.containsKey(pmmsg.getWantsUser())) {
          
          // this is if they have a block, and this user has already tried to offline them before
          if (TTServer.offlinePm.get(pmmsg.getWantsUser()).containsKey(pmmsg.getName())) {
            synchronized(TTConstants.lock) {
              TTServer.offlinePm.get(pmmsg.getWantsUser()).get(pmmsg.getName()).add(pmmsg.getMsg());
              TTServer.writeHash(new File("data/offlinePm.dat"), TTServer.offlinePm);
            }
          }
          // and this is if they have a block, but this specific user hasn't tried an offline pm
          else {
            synchronized(TTConstants.lock) {
              //Hashtable<String, ArrayList<String>> ht = new Hashtable<String, ArrayList<String>>();
              ArrayList<String> al = new ArrayList();
              al.add(pmmsg.getMsg());
              //ht.add(pmmsg.getName(), al);
              TTServer.offlinePm.get(pmmsg.getWantsUser()).put(pmmsg.getName(), al);
              TTServer.writeHash(new File("data/offlinePm.dat"), TTServer.offlinePm);
            }
          }
        } 
        
        // and here is where we get if they have no block at all.
        else {
          synchronized(TTConstants.lock) {
            ArrayList<String> al = new ArrayList<String>();
            al.add(pmmsg.getMsg());
            Hashtable<String, ArrayList<String>> ht = new Hashtable<String, ArrayList<String>>();
            ht.put(pmmsg.getName(), al);
            TTServer.offlinePm.put(pmmsg.getWantsUser(), ht);
            TTServer.writeHash(new File("data/offlinePm.dat"), TTServer.offlinePm);
          }
        }
        pmmsg.setResponse(Responses.OK);
      }
      else {
        // they're back online, let the remote user know
        pmmsg.setSpecialResponse(3);
        pmmsg.setUserIP(TTServer.connTable.get(pmmsg.getWantsUser()).getIp());
      }
      ClientSender.outQ.add((ClientMsg) pmmsg);
    }
  }
}
java2s.com  | Contact Us | Privacy Policy
Copyright 2009 - 12 Demo Source and Support. All rights reserved.
All other trademarks are property of their respective owners.