Index: /trunk/src/game/WorldSocket.h
===================================================================
--- /trunk/src/game/WorldSocket.h (revision 102)
+++ /trunk/src/game/WorldSocket.h (revision 181)
@@ -11,10 +11,10 @@
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  * GNU General Public License for more details.
  *
  * You should have received a copy of the GNU General Public License
  * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  */
 
@@ -26,5 +26,5 @@
 
 #ifndef _WORLDSOCKET_H
-#define	_WORLDSOCKET_H
+#define _WORLDSOCKET_H
 
 #include <ace/Basic_Types.h>
@@ -44,5 +44,5 @@
 
 #include "Common.h"
-#include "Auth/AuthCrypt.h" 
+#include "Auth/AuthCrypt.h"
 
 class ACE_Message_Block;
@@ -55,181 +55,181 @@
 /**
  * WorldSocket.
- * 
- * This class is responsible for the comunication with 
+ *
+ * This class is responsible for the comunication with
  * remote clients.
- * Most methods return -1 on failure. 
+ * Most methods return -1 on failure.
  * The class uses refferece counting.
  *
- * For output the class uses one buffer (64K usually) and 
- * a queue where it stores packet if there is no place on 
- * the queue. The reason this is done, is because the server 
- * does realy a lot of small-size writes to it, and it doesn't 
- * scale well to allocate memory for every. When something is 
- * writen to the output buffer the socket is not immideately 
- * activated for output (again for the same reason), there 
- * is 10ms celling (thats why there is Update() method). 
- * This concept is simmilar to TCP_CORK, but TCP_CORK 
- * usses 200ms celling. As result overhead generated by 
- * sending packets from "producer" threads is minimal, 
+ * For output the class uses one buffer (64K usually) and
+ * a queue where it stores packet if there is no place on
+ * the queue. The reason this is done, is because the server
+ * does realy a lot of small-size writes to it, and it doesn't
+ * scale well to allocate memory for every. When something is
+ * writen to the output buffer the socket is not immideately
+ * activated for output (again for the same reason), there
+ * is 10ms celling (thats why there is Update() method).
+ * This concept is simmilar to TCP_CORK, but TCP_CORK
+ * usses 200ms celling. As result overhead generated by
+ * sending packets from "producer" threads is minimal,
  * and doing a lot of writes with small size is tollerated.
- * 
+ *
  * The calls to Upate () method are managed by WorldSocketMgr
  * and ReactorRunnable.
- * 
- * For input ,the class uses one 1024 bytes buffer on stack 
- * to which it does recv() calls. And then recieved data is 
- * distributed where its needed. 1024 matches pritey well the 
+ *
+ * For input ,the class uses one 1024 bytes buffer on stack
+ * to which it does recv() calls. And then recieved data is
+ * distributed where its needed. 1024 matches pritey well the
  * traffic generated by client for now.
- *  
- * The input/output do speculative reads/writes (AKA it tryes 
- * to read all data avaible in the kernel buffer or tryes to 
- * write everything avaible in userspace buffer), 
- * which is ok for using with Level and Edge Trigered IO 
+ *
+ * The input/output do speculative reads/writes (AKA it tryes
+ * to read all data avaible in the kernel buffer or tryes to
+ * write everything avaible in userspace buffer),
+ * which is ok for using with Level and Edge Trigered IO
  * notification.
- * 
+ *
  */
 class WorldSocket : protected WorldHandler
 {
-public:
-  /// Declare some friends
-  friend class ACE_Acceptor< WorldSocket, ACE_SOCK_ACCEPTOR >;
-  friend class WorldSocketMgr;
-  friend class ReactorRunnable;
-
-  /// Declare the acceptor for this class
-  typedef ACE_Acceptor< WorldSocket, ACE_SOCK_ACCEPTOR > Acceptor;
-
-  /// Mutex type used for various syncronizations.
-  typedef ACE_Thread_Mutex LockType;
-  typedef ACE_Guard<LockType> GuardType;
-
-  /// Queue for storing packets for which there is no space.
-  typedef ACE_Unbounded_Queue< WorldPacket* > PacketQueueT;
-
-  /// Check if socket is closed.
-  bool IsClosed (void) const;
-
-  /// Close the socket.
-  void CloseSocket (void);
-
-  /// Get address of connected peer.
-  const std::string& GetRemoteAddress (void) const;
-
-  /// Send A packet on the socket, this function is reentrant.
-  /// @param pct packet to send
-  /// @return -1 of failure
-  int SendPacket (const WorldPacket& pct);
-
-  /// Add refference to this object.
-  long AddReference (void);
-
-  /// Remove refference to this object.
-  long RemoveReference (void);
-
-protected:
-  /// things called by ACE framework.
-  WorldSocket (void);
-  virtual ~WorldSocket (void);
-
-  /// Called on open ,the void* is the acceptor.
-  virtual int open (void *);
-
-  /// Called on failures inside of the acceptor, don't call from your code.
-  virtual int close (int);
-
-  /// Called when we can read from the socket.
-  virtual int handle_input (ACE_HANDLE = ACE_INVALID_HANDLE);
-
-  /// Called when the socket can write.
-  virtual int handle_output (ACE_HANDLE = ACE_INVALID_HANDLE);
-
-  /// Called when connection is closed or error happens.
-  virtual int handle_close (ACE_HANDLE = ACE_INVALID_HANDLE,
-                            ACE_Reactor_Mask = ACE_Event_Handler::ALL_EVENTS_MASK);
-
-  /// Called by WorldSocketMgr/ReactorRunnable.
-  int Update (void);
-
-private:
-  /// Helper functions for processing incoming data.
-  int handle_input_header (void);
-  int handle_input_payload (void);
-  int handle_input_missing_data (void);
-
-  /// Help functions to mark/unmark the socket for output.
-  /// @param g the guard is for m_OutBufferLock, the function will release it
-  int cancel_wakeup_output (GuardType& g);
-  int schedule_wakeup_output (GuardType& g);
-
-  /// process one incoming packet.
-  /// @param new_pct received packet ,note that you need to delete it. 
-  int ProcessIncoming (WorldPacket* new_pct);
-
-  /// Called by ProcessIncoming() on CMSG_AUTH_SESSION.
-  int HandleAuthSession (WorldPacket& recvPacket);
-
-  /// Called by ProcessIncoming() on CMSG_PING.
-  int HandlePing (WorldPacket& recvPacket);
-
-  /// Try to write WorldPacket to m_OutBuffer ,return -1 if no space
-  /// Need to be called with m_OutBufferLock lock held
-  int iSendPacket (const WorldPacket& pct);
-
-  /// Flush m_PacketQueue if there are packets in it
-  /// Need to be called with m_OutBufferLock lock held
-  /// @return true if it wrote to the buffer ( AKA you need 
-  /// to mark the socket for output ).
-  bool iFlushPacketQueue ();
-
-private:
-  /// Time in which the last ping was received
-  ACE_Time_Value m_LastPingTime;
-  
-  /// Keep track of overspeed pings ,to prevent ping flood.
-  uint32 m_OverSpeedPings;
-
-  /// Address of the remote peer
-  std::string m_Address;
-
-  /// Class used for managing encryption of the headers
-  AuthCrypt m_Crypt;
-
-  /// Mutex lock to protect m_Session
-  LockType m_SessionLock;
-
-  /// Session to which recieved packets are routed
-  WorldSession* m_Session;
-
-  /// here are stored the fragmens of the recieved data
-  WorldPacket* m_RecvWPct;
-
-  /// This block actually refers to m_RecvWPct contents,
-  /// which alows easy and safe writing to it. 
-  /// It wont free memory when its deleted. m_RecvWPct takes care of freeing.
-  ACE_Message_Block m_RecvPct;
-
-  /// Fragment of the recieved header.
-  ACE_Message_Block m_Header;
-
-  /// Mutex for protecting otuput related data.
-  LockType m_OutBufferLock;
-
-  /// Buffer used for writing output.
-  ACE_Message_Block *m_OutBuffer;
-
-  /// Size of the m_OutBuffer.
-  size_t m_OutBufferSize;
-
-  /// Here are stored packets for which there was no space on m_OutBuffer,
-  /// this alows not-to kick player if its buffer is overflowed.
-  PacketQueueT m_PacketQueue;
-
-  /// True if the socket is registered with the reactor for output
-  bool m_OutActive;
-
-  uint32 m_Seed;
+    public:
+        /// Declare some friends
+        friend class ACE_Acceptor< WorldSocket, ACE_SOCK_ACCEPTOR >;
+        friend class WorldSocketMgr;
+        friend class ReactorRunnable;
+
+        /// Declare the acceptor for this class
+        typedef ACE_Acceptor< WorldSocket, ACE_SOCK_ACCEPTOR > Acceptor;
+
+        /// Mutex type used for various syncronizations.
+        typedef ACE_Thread_Mutex LockType;
+        typedef ACE_Guard<LockType> GuardType;
+
+        /// Queue for storing packets for which there is no space.
+        typedef ACE_Unbounded_Queue< WorldPacket* > PacketQueueT;
+
+        /// Check if socket is closed.
+        bool IsClosed (void) const;
+
+        /// Close the socket.
+        void CloseSocket (void);
+
+        /// Get address of connected peer.
+        const std::string& GetRemoteAddress (void) const;
+
+        /// Send A packet on the socket, this function is reentrant.
+        /// @param pct packet to send
+        /// @return -1 of failure
+        int SendPacket (const WorldPacket& pct);
+
+        /// Add refference to this object.
+        long AddReference (void);
+
+        /// Remove refference to this object.
+        long RemoveReference (void);
+
+    protected:
+        /// things called by ACE framework.
+        WorldSocket (void);
+        virtual ~WorldSocket (void);
+
+        /// Called on open ,the void* is the acceptor.
+        virtual int open (void *);
+
+        /// Called on failures inside of the acceptor, don't call from your code.
+        virtual int close (int);
+
+        /// Called when we can read from the socket.
+        virtual int handle_input (ACE_HANDLE = ACE_INVALID_HANDLE);
+
+        /// Called when the socket can write.
+        virtual int handle_output (ACE_HANDLE = ACE_INVALID_HANDLE);
+
+        /// Called when connection is closed or error happens.
+        virtual int handle_close (ACE_HANDLE = ACE_INVALID_HANDLE,
+            ACE_Reactor_Mask = ACE_Event_Handler::ALL_EVENTS_MASK);
+
+        /// Called by WorldSocketMgr/ReactorRunnable.
+        int Update (void);
+
+    private:
+        /// Helper functions for processing incoming data.
+        int handle_input_header (void);
+        int handle_input_payload (void);
+        int handle_input_missing_data (void);
+
+        /// Help functions to mark/unmark the socket for output.
+        /// @param g the guard is for m_OutBufferLock, the function will release it
+        int cancel_wakeup_output (GuardType& g);
+        int schedule_wakeup_output (GuardType& g);
+
+        /// process one incoming packet.
+        /// @param new_pct received packet ,note that you need to delete it.
+        int ProcessIncoming (WorldPacket* new_pct);
+
+        /// Called by ProcessIncoming() on CMSG_AUTH_SESSION.
+        int HandleAuthSession (WorldPacket& recvPacket);
+
+        /// Called by ProcessIncoming() on CMSG_PING.
+        int HandlePing (WorldPacket& recvPacket);
+
+        /// Try to write WorldPacket to m_OutBuffer ,return -1 if no space
+        /// Need to be called with m_OutBufferLock lock held
+        int iSendPacket (const WorldPacket& pct);
+
+        /// Flush m_PacketQueue if there are packets in it
+        /// Need to be called with m_OutBufferLock lock held
+        /// @return true if it wrote to the buffer ( AKA you need
+        /// to mark the socket for output ).
+        bool iFlushPacketQueue ();
+
+    private:
+        /// Time in which the last ping was received
+        ACE_Time_Value m_LastPingTime;
+
+        /// Keep track of overspeed pings ,to prevent ping flood.
+        uint32 m_OverSpeedPings;
+
+        /// Address of the remote peer
+        std::string m_Address;
+
+        /// Class used for managing encryption of the headers
+        AuthCrypt m_Crypt;
+
+        /// Mutex lock to protect m_Session
+        LockType m_SessionLock;
+
+        /// Session to which recieved packets are routed
+        WorldSession* m_Session;
+
+        /// here are stored the fragmens of the recieved data
+        WorldPacket* m_RecvWPct;
+
+        /// This block actually refers to m_RecvWPct contents,
+        /// which alows easy and safe writing to it.
+        /// It wont free memory when its deleted. m_RecvWPct takes care of freeing.
+        ACE_Message_Block m_RecvPct;
+
+        /// Fragment of the recieved header.
+        ACE_Message_Block m_Header;
+
+        /// Mutex for protecting otuput related data.
+        LockType m_OutBufferLock;
+
+        /// Buffer used for writing output.
+        ACE_Message_Block *m_OutBuffer;
+
+        /// Size of the m_OutBuffer.
+        size_t m_OutBufferSize;
+
+        /// Here are stored packets for which there was no space on m_OutBuffer,
+        /// this alows not-to kick player if its buffer is overflowed.
+        PacketQueueT m_PacketQueue;
+
+        /// True if the socket is registered with the reactor for output
+        bool m_OutActive;
+
+        uint32 m_Seed;
 };
 
-#endif	/* _WORLDSOCKET_H */
+#endif  /* _WORLDSOCKET_H */
 
 /// @}
Index: /trunk/src/game/World.cpp
===================================================================
--- /trunk/src/game/World.cpp (revision 168)
+++ /trunk/src/game/World.cpp (revision 181)
@@ -129,5 +129,5 @@
 
     if(m_resultQueue) delete m_resultQueue;
-    
+
     //TODO free addSessQueue
 }
@@ -183,5 +183,5 @@
 void World::AddSession(WorldSession* s)
 {
-  addSessQueue.add(s);
+    addSessQueue.add(s);
 }
 
@@ -189,59 +189,59 @@
 World::AddSession_ (WorldSession* s)
 {
-  ASSERT (s);
-
-  //NOTE - Still there is race condition in WorldSession* being used in the Sockets
-
-  ///- kick already loaded player with same account (if any) and remove session
-  ///- if player is in loading and want to load again, return
-  if (!RemoveSession (s->GetAccountId ()))
-    {
-      s->KickPlayer ();
-      m_kicked_sessions.insert (s);
-      return;
-    }
-
-  WorldSession* old = m_sessions[s->GetAccountId ()];
-  m_sessions[s->GetAccountId ()] = s;
-
-  // if session already exist, prepare to it deleting at next world update
-  // NOTE - KickPlayer() should be called on "old" in RemoveSession()
-  if (old)
-    m_kicked_sessions.insert (old);
-
-  uint32 Sessions = GetActiveAndQueuedSessionCount ();
-  uint32 pLimit = GetPlayerAmountLimit ();
-  uint32 QueueSize = GetQueueSize (); //number of players in the queue
-  bool inQueue = false;
-  //so we don't count the user trying to 
-  //login as a session and queue the socket that we are using
-  --Sessions;
-
-  if (pLimit > 0 && Sessions >= pLimit && s->GetSecurity () == SEC_PLAYER )
-    {
-      AddQueuedPlayer (s);
-      UpdateMaxSessionCounters ();
-      sLog.outDetail ("PlayerQueue: Account id %u is in Queue Position (%u).", s->GetAccountId (), ++QueueSize);
-      return;
-    }
-  
-  WorldPacket packet(SMSG_AUTH_RESPONSE, 1 + 4 + 1 + 4 + 1);
-  packet << uint8 (AUTH_OK);
-  packet << uint32 (0); // unknown random value...
-  packet << uint8 (0);
-  packet << uint32 (0);
-  packet << uint8 (s->Expansion () ? 1 : 0); // 0 - normal, 1 - TBC, must be set in database manually for each account
-  s->SendPacket (&packet);
-
-  UpdateMaxSessionCounters ();
-
-  // Updates the population
-  if (pLimit > 0)
-    {
-      float popu = GetActiveSessionCount (); //updated number of users on the server
-      popu /= pLimit;
-      popu *= 2;
-      loginDatabase.PExecute ("UPDATE realmlist SET population = '%f' WHERE id = '%d'", popu, realmID);
-      sLog.outDetail ("Server Population (%f).", popu);
+    ASSERT (s);
+
+    //NOTE - Still there is race condition in WorldSession* being used in the Sockets
+
+    ///- kick already loaded player with same account (if any) and remove session
+    ///- if player is in loading and want to load again, return
+    if (!RemoveSession (s->GetAccountId ()))
+    {
+        s->KickPlayer ();
+        m_kicked_sessions.insert (s);
+        return;
+    }
+
+    WorldSession* old = m_sessions[s->GetAccountId ()];
+    m_sessions[s->GetAccountId ()] = s;
+
+    // if session already exist, prepare to it deleting at next world update
+    // NOTE - KickPlayer() should be called on "old" in RemoveSession()
+    if (old)
+        m_kicked_sessions.insert (old);
+
+    uint32 Sessions = GetActiveAndQueuedSessionCount ();
+    uint32 pLimit = GetPlayerAmountLimit ();
+    uint32 QueueSize = GetQueueSize (); //number of players in the queue
+    bool inQueue = false;
+    //so we don't count the user trying to
+    //login as a session and queue the socket that we are using
+    --Sessions;
+
+    if (pLimit > 0 && Sessions >= pLimit && s->GetSecurity () == SEC_PLAYER )
+    {
+        AddQueuedPlayer (s);
+        UpdateMaxSessionCounters ();
+        sLog.outDetail ("PlayerQueue: Account id %u is in Queue Position (%u).", s->GetAccountId (), ++QueueSize);
+        return;
+    }
+
+    WorldPacket packet(SMSG_AUTH_RESPONSE, 1 + 4 + 1 + 4 + 1);
+    packet << uint8 (AUTH_OK);
+    packet << uint32 (0); // unknown random value...
+    packet << uint8 (0);
+    packet << uint32 (0);
+    packet << uint8 (s->Expansion()); // 0 - normal, 1 - TBC, must be set in database manually for each account
+    s->SendPacket (&packet);
+
+    UpdateMaxSessionCounters ();
+
+    // Updates the population
+    if (pLimit > 0)
+    {
+        float popu = GetActiveSessionCount (); //updated number of users on the server
+        popu /= pLimit;
+        popu *= 2;
+        loginDatabase.PExecute ("UPDATE realmlist SET population = '%f' WHERE id = '%d'", popu, realmID);
+        sLog.outDetail ("Server Population (%f).", popu);
     }
 }
@@ -261,5 +261,5 @@
 {
     m_QueuedPlayer.push_back (sess);
-    
+
     // The 1st SMSG_AUTH_RESPONSE needs to contain other info too.
     WorldPacket packet (SMSG_AUTH_RESPONSE, 1 + 4 + 1 + 4 + 1);
@@ -271,5 +271,5 @@
     packet << uint32(GetQueuePos (sess));
     sess->SendPacket (&packet);
-    
+
     //sess->SendAuthWaitQue (GetQueuePos (sess));
 }
@@ -2283,30 +2283,30 @@
 
     ///- Update the database with ban information
-	switch(mode)
+    switch(mode)
     {
         case BAN_IP:
-			//No SQL injection as strings are escaped
-			resultAccounts = loginDatabase.PQuery("SELECT id FROM account WHERE last_ip = '%s'",nameOrIP.c_str());
-			loginDatabase.PExecute("INSERT INTO ip_banned VALUES ('%s',UNIX_TIMESTAMP(),UNIX_TIMESTAMP()+%u,'%s','%s')",nameOrIP.c_str(),duration_secs,safe_author.c_str(),reason.c_str());
-			break;
-		case BAN_ACCOUNT:
-			//No SQL injection as string is escaped
-			resultAccounts = loginDatabase.PQuery("SELECT id FROM account WHERE username = '%s'",nameOrIP.c_str());
-			break;
-		case BAN_CHARACTER:
-			//No SQL injection as string is escaped
-			resultAccounts = CharacterDatabase.PQuery("SELECT account FROM characters WHERE name = '%s'",nameOrIP.c_str());
-			break;
-		default:
-			return BAN_SYNTAX_ERROR;
-    }
-    
-	if(!resultAccounts)
-	{
-		if(mode==BAN_IP)
-            return BAN_SUCCESS;
-		else
-			return BAN_NOTFOUND;                                // Nobody to ban
-	}
+            //No SQL injection as strings are escaped
+            resultAccounts = loginDatabase.PQuery("SELECT id FROM account WHERE last_ip = '%s'",nameOrIP.c_str());
+            loginDatabase.PExecute("INSERT INTO ip_banned VALUES ('%s',UNIX_TIMESTAMP(),UNIX_TIMESTAMP()+%u,'%s','%s')",nameOrIP.c_str(),duration_secs,safe_author.c_str(),reason.c_str());
+            break;
+        case BAN_ACCOUNT:
+            //No SQL injection as string is escaped
+            resultAccounts = loginDatabase.PQuery("SELECT id FROM account WHERE username = '%s'",nameOrIP.c_str());
+            break;
+        case BAN_CHARACTER:
+            //No SQL injection as string is escaped
+            resultAccounts = CharacterDatabase.PQuery("SELECT account FROM characters WHERE name = '%s'",nameOrIP.c_str());
+            break;
+        default:
+            return BAN_SYNTAX_ERROR;
+    }
+
+    if(!resultAccounts)
+    {
+        if(mode==BAN_IP)
+            return BAN_SUCCESS;                             // ip correctly banned but nobody affected (yet)
+        else
+            return BAN_NOTFOUND;                                // Nobody to ban
+    }
 
     ///- Disconnect all affected players (for IP it can be several)
@@ -2317,9 +2317,9 @@
 
         if(mode!=BAN_IP)
-		{
+        {
             //No SQL injection as strings are escaped
             loginDatabase.PExecute("INSERT INTO account_banned VALUES ('%u', UNIX_TIMESTAMP(), UNIX_TIMESTAMP()+%u, '%s', '%s', '1')",
                 account,duration_secs,safe_author.c_str(),reason.c_str());
-		}
+        }
 
         if (WorldSession* sess = FindSession(account))
@@ -2343,5 +2343,5 @@
     else
     {
-        uint32 account=0;
+        uint32 account = 0;
         if (mode == BAN_ACCOUNT)
             account = accmgr.GetId (nameOrIP);
@@ -2349,7 +2349,7 @@
             account = objmgr.GetPlayerAccountIdByPlayerName (nameOrIP);
 
-        if(!account)
+        if (!account)
             return false;
-            
+
         //NO SQL injection as account is uint32
         loginDatabase.PExecute("UPDATE account_banned SET active = '0' WHERE id = '%u'",account);
@@ -2434,5 +2434,5 @@
 
         SendServerMessage(msgid,str.c_str(),player);
-        outstring_log("Server will %s in %s", (m_ShutdownMask & SHUTDOWN_MASK_RESTART ? "restart" : "shutdown"), str.c_str());
+        DEBUG_LOG("Server is %s in %s",(m_ShutdownMask & SHUTDOWN_MASK_RESTART ? "restart" : "shuttingdown"),str.c_str());
     }
 }
@@ -2474,8 +2474,8 @@
       AddSession_ (sess);
     }
-        
+
     ///- Delete kicked sessions at add new session
     for (std::set<WorldSession*>::iterator itr = m_kicked_sessions.begin(); itr != m_kicked_sessions.end(); ++itr)
-    {   
+    {
         RemoveQueuedPlayer (*itr);
         delete *itr;
@@ -2505,7 +2505,8 @@
 {
     if (cliCmdQueue.empty())
-		return;
+        return;
 
     CliCommandHolder::Print* zprint;
+
     while (!cliCmdQueue.empty())
     {
@@ -2513,7 +2514,7 @@
         CliCommandHolder *command = cliCmdQueue.next();
 
-		zprint = command->m_print;
-
-		CliHandler(zprint).ParseCommands(command->m_command);
+        zprint = command->m_print;
+
+        CliHandler(zprint).ParseCommands(command->m_command);
 
         delete command;
@@ -2623,13 +2624,13 @@
 void World::LoadDBVersion()
 {
-	QueryResult* result = WorldDatabase.Query("SELECT version FROM db_version LIMIT 1");
-	if(result)
-	{
-		Field* fields = result->Fetch();
-
-		m_DBVersion = fields[0].GetString();
-		delete result;
-	}
-	else
-		m_DBVersion = "unknown world database";
-}
+    QueryResult* result = WorldDatabase.Query("SELECT version FROM db_version LIMIT 1");
+    if(result)
+    {
+        Field* fields = result->Fetch();
+
+        m_DBVersion = fields[0].GetString();
+        delete result;
+    }
+    else
+        m_DBVersion = "unknown world database";
+}
Index: /trunk/src/game/WorldSession.cpp
===================================================================
--- /trunk/src/game/WorldSession.cpp (revision 174)
+++ /trunk/src/game/WorldSession.cpp (revision 181)
@@ -11,10 +11,10 @@
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  * GNU General Public License for more details.
  *
  * You should have received a copy of the GNU General Public License
  * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  */
 
@@ -51,9 +51,9 @@
 _logoutTime(0), m_playerLoading(false), m_playerLogout(false), m_playerRecentlyLogout(false), m_latency(0)
 {
-   if (sock)
-   {
-	   m_Address = sock->GetRemoteAddress ();
-	   sock->AddReference ();
-   }
+    if (sock)
+    {
+        m_Address = sock->GetRemoteAddress ();
+        sock->AddReference ();
+    }
 }
 
@@ -62,13 +62,13 @@
 {
     ///- unload player if not unloaded
-    if(_player)
-        LogoutPlayer(true);
+    if (_player)
+        LogoutPlayer (true);
 
     /// - If have unclosed socket, close it
-  if (m_Socket)
-    {
-      m_Socket->CloseSocket ();   
-      m_Socket->RemoveReference ();
-      m_Socket = NULL;
+    if (m_Socket)
+    {
+        m_Socket->CloseSocket ();
+        m_Socket->RemoveReference ();
+        m_Socket = NULL;
     }
 
@@ -76,8 +76,7 @@
     while(!_recvQueue.empty())
     {
-        WorldPacket *packet = _recvQueue.next();
+        WorldPacket *packet = _recvQueue.next ();
         delete packet;
     }
-    
 }
 
@@ -134,8 +133,8 @@
     }
 
-	#endif                                                  // !TRINITY_DEBUG
-
-	if (m_Socket->SendPacket (*packet) == -1)
-		m_Socket->CloseSocket ();
+    #endif                                                  // !MANGOS_DEBUG
+
+    if (m_Socket->SendPacket (*packet) == -1)
+        m_Socket->CloseSocket ();
 }
 
@@ -158,10 +157,10 @@
 bool WorldSession::Update(uint32 /*diff*/)
 {
-  if (m_Socket && m_Socket->IsClosed ())
-  {
+    if (m_Socket && m_Socket->IsClosed ())
+    {
         m_Socket->RemoveReference ();
         m_Socket = NULL;
-  }
-  
+    }
+
     WorldPacket *packet;
 
@@ -248,5 +247,5 @@
         if (uint64 lguid = GetPlayer()->GetLootGUID())
             DoLootRelease(lguid);
-            
+
         ///- If the player just died before logging out, make him appear as a ghost
         //FIXME: logout must be delayed in case lost connection with client in time of combat
@@ -285,5 +284,5 @@
             // give honor to all attackers from set like group case
             for(std::set<Player*>::const_iterator itr = aset.begin(); itr != aset.end(); ++itr)
-                (*itr)->RewardHonor(_player, aset.size(), -1, true);
+                (*itr)->RewardHonor(_player,aset.size());
 
             // give bg rewards and update counters like kill by first from attackers
@@ -403,5 +402,5 @@
         //No SQL injection as AccountId is uint32
         CharacterDatabase.PExecute("UPDATE characters SET online = 0 WHERE account = '%u'",
-			GetAccountId());
+            GetAccountId());
         sLog.outDebug( "SESSION: Sent SMSG_LOGOUT_COMPLETE Message" );
     }
@@ -415,6 +414,6 @@
 void WorldSession::KickPlayer()
 {
-	if (m_Socket)
-		m_Socket->CloseSocket ();
+    if (m_Socket)
+        m_Socket->CloseSocket ();
 }
 
@@ -522,6 +521,2 @@
      }
  }
- 
-
-
-
Index: /trunk/src/game/WorldSocket.cpp
===================================================================
--- /trunk/src/game/WorldSocket.cpp (revision 149)
+++ /trunk/src/game/WorldSocket.cpp (revision 181)
@@ -1,21 +1,21 @@
 /* 
- * Copyright (C) 2005-2008 MaNGOS <http://www.mangosproject.org/>
- *
- * Copyright (C) 2008 Trinity <http://www.trinitycore.org/>
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- */
+* Copyright (C) 2005-2008 MaNGOS <http://www.mangosproject.org/>
+*
+* Copyright (C) 2008 Trinity <http://www.trinitycore.org/>
+*
+* This program is free software; you can redistribute it and/or modify
+* it under the terms of the GNU General Public License as published by
+* the Free Software Foundation; either version 2 of the License, or
+* (at your option) any later version.
+*
+* This program is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+* GNU General Public License for more details.
+*
+* You should have received a copy of the GNU General Public License
+* along with this program; if not, write to the Free Software
+* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+*/
 
 #include <ace/Message_Block.h>
@@ -55,12 +55,12 @@
 struct ServerPktHeader
 {
-  ACE_UINT16 size;
-  ACE_UINT16 cmd;
+    uint16 size;
+    uint16 cmd;
 };
 
 struct ClientPktHeader
 {
-  ACE_UINT16 size;
-  ACE_UINT32 cmd;
+    uint16 size;
+    uint32 cmd;
 };
 
@@ -84,70 +84,65 @@
 m_LastPingTime (ACE_Time_Value::zero)
 {
-  this->reference_counting_policy ().value (ACE_Event_Handler::Reference_Counting_Policy::ENABLED);
+    reference_counting_policy ().value (ACE_Event_Handler::Reference_Counting_Policy::ENABLED);
 }
 
 WorldSocket::~WorldSocket (void)
 {
-  if (m_RecvWPct)
-    delete m_RecvWPct;
-
-  if (m_OutBuffer)
-    m_OutBuffer->release ();
-
-  this->closing_ = true;
-
-  this->peer ().close ();
-
-  WorldPacket* pct;
-  while (m_PacketQueue.dequeue_head (pct) == 0)
-    delete pct;
-}
-
-bool
-WorldSocket::IsClosed (void) const
-{
-  return this->closing_;
-}
-
-void
-WorldSocket::CloseSocket (void)
-{
-  {
-    ACE_GUARD (LockType, Guard, m_OutBufferLock);
-
-    if (this->closing_)
-      return;
-
-    this->closing_ = true;
-
-    this->peer ().close_writer ();
-  }
-
-  {
-    ACE_GUARD (LockType, Guard, m_SessionLock);
-
-    m_Session = NULL;
-  }
-
-}
-
-const std::string&
-WorldSocket::GetRemoteAddress (void) const
-{
-  return m_Address;
-}
-
-int
-WorldSocket::SendPacket (const WorldPacket& pct)
-{
-  ACE_GUARD_RETURN (LockType, Guard, m_OutBufferLock, -1);
-
-  if (this->closing_)
-    return -1;
-
-  // Dump outgoing packet.
-  if (sWorldLog.LogWorld ())
-    {
-      sWorldLog.Log ("SERVER:\nSOCKET: %u\nLENGTH: %u\nOPCODE: %s (0x%.4X)\nDATA:\n",
+    if (m_RecvWPct)
+        delete m_RecvWPct;
+
+    if (m_OutBuffer)
+        m_OutBuffer->release ();
+
+    closing_ = true;
+
+    peer ().close ();
+
+    WorldPacket* pct;
+    while (m_PacketQueue.dequeue_head (pct) == 0)
+        delete pct;
+}
+
+bool WorldSocket::IsClosed (void) const
+{
+    return closing_;
+}
+
+void WorldSocket::CloseSocket (void)
+{
+    {
+        ACE_GUARD (LockType, Guard, m_OutBufferLock);
+
+        if (closing_)
+        return;
+
+        closing_ = true;
+
+        peer ().close_writer ();
+    }
+
+    {
+        ACE_GUARD (LockType, Guard, m_SessionLock);
+
+        m_Session = NULL;
+    }
+}
+
+const std::string& WorldSocket::GetRemoteAddress (void) const
+{
+    return m_Address;
+}
+
+int WorldSocket::SendPacket (const WorldPacket& pct)
+{
+    ACE_GUARD_RETURN (LockType, Guard, m_OutBufferLock, -1);
+
+    if (closing_)
+        return -1;
+
+    // Dump outgoing packet.
+    if (sWorldLog.LogWorld ())
+    {
+        sWorldLog.Log ("SERVER:\nSOCKET: %u\nLENGTH: %u\nOPCODE: %s (0x%.4X)\nDATA:\n",
                      (uint32) get_handle (),
                      pct.size (),
@@ -155,461 +150,431 @@
                      pct.GetOpcode ());
 
-      uint32 p = 0;
-      while (p < pct.size ())
-        {
-          for (uint32 j = 0; j < 16 && p < pct.size (); j++)
-            sWorldLog.Log ("%.2X ", const_cast<WorldPacket&> (pct)[p++]);
-
-          sWorldLog.Log ("\n");
-        }
-
-      sWorldLog.Log ("\n\n");
-    }
-
-  if (iSendPacket (pct) == -1)
-    {
-      WorldPacket* npct;
-
-      ACE_NEW_RETURN (npct, WorldPacket (pct), -1);
-
-      // NOTE maybe check of the size of the queue can be good ?
-      // to make it bounded instead of unbounded
-      if (m_PacketQueue.enqueue_tail (npct) == -1)
-        {
-          delete npct;
-          sLog.outError ("WorldSocket::SendPacket: m_PacketQueue.enqueue_tail failed");
-          return -1;
-        }
-    }
-
-  return 0;
-}
-
-long
-WorldSocket::AddReference (void)
-{
-  return static_cast<long> (this->add_reference ());
-}
-
-long
-WorldSocket::RemoveReference (void)
-{
-  return static_cast<long> (this->remove_reference ());
-}
-
-int
-WorldSocket::open (void *a)
-{
-  ACE_UNUSED_ARG (a);
-
-  // Prevent double call to this func.
-  if (m_OutBuffer)
-    return -1;
-
-  // This will also prevent the socket from being Updated
-  // while we are initializing it.
-  m_OutActive = true;
-
-  // Hook for the manager.
-  if (sWorldSocketMgr->OnSocketOpen (this) == -1)
-    return -1;
-
-  // Allocate the buffer.
-  ACE_NEW_RETURN (m_OutBuffer, ACE_Message_Block (m_OutBufferSize), -1);
-
-  // Store peer address.
-  ACE_INET_Addr remote_addr;
-
-  if (this->peer ().get_remote_addr (remote_addr) == -1)
-    {
-      sLog.outError ("WorldSocket::open: peer ().get_remote_addr errno = %s", ACE_OS::strerror (errno));
-      return -1;
-    }
-
-  m_Address = remote_addr.get_host_addr ();
-
-  // Send startup packet.
-  WorldPacket packet (SMSG_AUTH_CHALLENGE, 4);
-  packet << m_Seed;
-
-  if (SendPacket (packet) == -1)
-    return -1;
-
-  // Register with ACE Reactor
-  if (this->reactor ()->register_handler
-      (this,
-       ACE_Event_Handler::READ_MASK | ACE_Event_Handler::WRITE_MASK) == -1)
-    {
-      sLog.outError ("WorldSocket::open: unable to register client handler errno = %s", ACE_OS::strerror (errno));
-      return -1;
-    }
-
-  // reactor takes care of the socket from now on
-  this->remove_reference ();
-
-  return 0;
-}
-
-int
-WorldSocket::close (int)
-{
-  this->shutdown ();
-
-  this->closing_ = true;
-
-  this->remove_reference ();
-
-  return 0;
-}
-
-int
-WorldSocket::handle_input (ACE_HANDLE)
-{
-  if (this->closing_)
-    return -1;
-
-  switch (this->handle_input_missing_data ())
-    {
-    case -1 :
-      {
-        if ((errno == EWOULDBLOCK) ||
-            (errno == EAGAIN))
-          {
-            //return 0;
-            return this->Update (); // interesting line ,isnt it ?
-          }
-
-        DEBUG_LOG ("WorldSocket::handle_input: Peer error closing connection errno = %s", ACE_OS::strerror (errno));
-
-        return -1;
-      }
-    case 0:
-      {
-        DEBUG_LOG ("WorldSocket::handle_input: Peer has closed connection\n");
-
-        errno = ECONNRESET;
-
-        return -1;
-      }
-    case 1:
-      return 1;
-    }
-
-  //return 0;
-  return this->Update (); // another interesting line ;)
-}
-
-int
-WorldSocket::handle_output (ACE_HANDLE)
-{
-  ACE_GUARD_RETURN (LockType, Guard, m_OutBufferLock, -1);
-
-  if (this->closing_)
-    return -1;
-
-  const size_t send_len = m_OutBuffer->length ();
-
-  if (send_len == 0)
-    return this->cancel_wakeup_output (Guard);
-
-  // TODO SO_NOSIGPIPE on platforms that support it
+        uint32 p = 0;
+        while (p < pct.size ())
+        {
+            for (uint32 j = 0; j < 16 && p < pct.size (); j++)
+                sWorldLog.Log ("%.2X ", const_cast<WorldPacket&>(pct)[p++]);
+
+            sWorldLog.Log ("\n");
+        }
+
+        sWorldLog.Log ("\n\n");
+    }
+
+    if (iSendPacket (pct) == -1)
+    {
+        WorldPacket* npct;
+
+        ACE_NEW_RETURN (npct, WorldPacket (pct), -1);
+
+        // NOTE maybe check of the size of the queue can be good ?
+        // to make it bounded instead of unbounded
+        if (m_PacketQueue.enqueue_tail (npct) == -1)
+        {
+            delete npct;
+            sLog.outError ("WorldSocket::SendPacket: m_PacketQueue.enqueue_tail failed");
+            return -1;
+        }
+    }
+
+    return 0;
+}
+
+long WorldSocket::AddReference (void)
+{
+    return static_cast<long> (add_reference ());
+}
+
+long WorldSocket::RemoveReference (void)
+{
+    return static_cast<long> (remove_reference ());
+}
+
+int WorldSocket::open (void *a)
+{
+    ACE_UNUSED_ARG (a);
+
+    // Prevent double call to this func.
+    if (m_OutBuffer)
+        return -1;
+
+    // This will also prevent the socket from being Updated
+    // while we are initializing it.
+    m_OutActive = true;
+
+    // Hook for the manager.
+    if (sWorldSocketMgr->OnSocketOpen (this) == -1)
+        return -1;
+
+    // Allocate the buffer.
+    ACE_NEW_RETURN (m_OutBuffer, ACE_Message_Block (m_OutBufferSize), -1);
+
+    // Store peer address.
+    ACE_INET_Addr remote_addr;
+
+    if (peer ().get_remote_addr (remote_addr) == -1)
+    {
+        sLog.outError ("WorldSocket::open: peer ().get_remote_addr errno = %s", ACE_OS::strerror (errno));
+        return -1;
+    }
+
+    m_Address = remote_addr.get_host_addr ();
+
+    // Send startup packet.
+    WorldPacket packet (SMSG_AUTH_CHALLENGE, 4);
+    packet << m_Seed;
+
+    if (SendPacket (packet) == -1)
+        return -1;
+
+    // Register with ACE Reactor
+    if (reactor ()->register_handler(this, ACE_Event_Handler::READ_MASK | ACE_Event_Handler::WRITE_MASK) == -1)
+    {
+        sLog.outError ("WorldSocket::open: unable to register client handler errno = %s", ACE_OS::strerror (errno));
+        return -1;
+    }
+
+    // reactor takes care of the socket from now on
+    remove_reference ();
+
+    return 0;
+}
+
+int WorldSocket::close (int)
+{
+    shutdown ();
+
+    closing_ = true;
+
+    remove_reference ();
+
+    return 0;
+}
+
+int WorldSocket::handle_input (ACE_HANDLE)
+{
+    if (closing_)
+        return -1;
+
+    switch (handle_input_missing_data ())
+    {
+        case -1 :
+        {
+            if ((errno == EWOULDBLOCK) ||
+                (errno == EAGAIN))
+            {
+                return Update (); // interesting line ,isnt it ?
+            }
+
+            DEBUG_LOG ("WorldSocket::handle_input: Peer error closing connection errno = %s", ACE_OS::strerror (errno));
+
+            errno = ECONNRESET;
+            return -1;
+        }
+        case 0:
+        {
+            DEBUG_LOG ("WorldSocket::handle_input: Peer has closed connection\n");
+
+            errno = ECONNRESET;
+            return -1;
+        }
+        case 1:
+            return 1;
+        default:
+            return Update (); // another interesting line ;)
+    }
+
+    ACE_NOTREACHED(return -1);
+}
+
+int WorldSocket::handle_output (ACE_HANDLE)
+{
+    ACE_GUARD_RETURN (LockType, Guard, m_OutBufferLock, -1);
+
+    if (closing_)
+        return -1;
+
+    const size_t send_len = m_OutBuffer->length ();
+
+    if (send_len == 0)
+        return cancel_wakeup_output (Guard);
+
 #ifdef MSG_NOSIGNAL
-  ssize_t n = this->peer ().send (m_OutBuffer->rd_ptr (), send_len, MSG_NOSIGNAL);
+    ssize_t n = peer ().send (m_OutBuffer->rd_ptr (), send_len, MSG_NOSIGNAL);
 #else
-  ssize_t n = this->peer ().send (m_OutBuffer->rd_ptr (), send_len);
+    ssize_t n = peer ().send (m_OutBuffer->rd_ptr (), send_len);
 #endif // MSG_NOSIGNAL
 
-  if (n == 0)
-    return -1;
-  else if (n == -1)
-    {
-      if (errno == EWOULDBLOCK || errno == EAGAIN)
-        return this->schedule_wakeup_output (Guard);
-
-      return -1;
-    }
-  else if (n < send_len) //now n > 0
-    {
-      m_OutBuffer->rd_ptr (static_cast<size_t> (n));
-
-      // move the data to the base of the buffer
-      m_OutBuffer->crunch ();
-
-      return this->schedule_wakeup_output (Guard);
-    }
-  else //now n == send_len
-    {
-      m_OutBuffer->reset ();
-
-      if (!iFlushPacketQueue ())
-        return this->cancel_wakeup_output (Guard);
-      else
-        return this->schedule_wakeup_output (Guard);
-    }
-
-  ACE_NOTREACHED (return 0);
-}
-
-int
-WorldSocket::handle_close (ACE_HANDLE h, ACE_Reactor_Mask)
-{
-  // Critical section
-  {
-    ACE_GUARD_RETURN (LockType, Guard, m_OutBufferLock, -1);
-
-    this->closing_ = true;
-
-    if (h == ACE_INVALID_HANDLE)
-      this->peer ().close_writer ();
-  }
-
-  // Critical section
-  {
-    ACE_GUARD_RETURN (LockType, Guard, m_SessionLock, -1);
-
-    m_Session = NULL;
-  }
-
-  return 0;
-}
-
-int
-WorldSocket::Update (void)
-{
-  if (this->closing_)
-    return -1;
-
-  if (m_OutActive || m_OutBuffer->length () == 0)
+    if (n == 0)
+        return -1;
+    else if (n == -1)
+    {
+        if (errno == EWOULDBLOCK || errno == EAGAIN)
+            return schedule_wakeup_output (Guard);
+
+        return -1;
+    }
+    else if (n < send_len) //now n > 0
+    {
+        m_OutBuffer->rd_ptr (static_cast<size_t> (n));
+
+        // move the data to the base of the buffer
+        m_OutBuffer->crunch ();
+
+        return schedule_wakeup_output (Guard);
+    }
+    else //now n == send_len
+    {
+        m_OutBuffer->reset ();
+
+        if (!iFlushPacketQueue ())
+            return cancel_wakeup_output (Guard);
+        else
+            return schedule_wakeup_output (Guard);
+    }
+
+    ACE_NOTREACHED (return 0);
+}
+
+int WorldSocket::handle_close (ACE_HANDLE h, ACE_Reactor_Mask)
+{
+    // Critical section
+    {
+        ACE_GUARD_RETURN (LockType, Guard, m_OutBufferLock, -1);
+
+        closing_ = true;
+
+        if (h == ACE_INVALID_HANDLE)
+            peer ().close_writer ();
+    }
+
+    // Critical section
+    {
+        ACE_GUARD_RETURN (LockType, Guard, m_SessionLock, -1);
+
+        m_Session = NULL;
+    }
+
     return 0;
-
-  return this->handle_output (this->get_handle ());
-}
-
-int
-WorldSocket::handle_input_header (void)
-{
-  ACE_ASSERT (m_RecvWPct == NULL);
-
-  if (m_Header.length () != sizeof (ClientPktHeader))
-    {
-      sLog.outError ("WorldSocket::handle_input_header: internal error: invalid header");
-      errno = EINVAL;
-      return -1;
-    }
-
-  m_Crypt.DecryptRecv ((ACE_UINT8*) m_Header.rd_ptr (), sizeof (ClientPktHeader));
-
-  ClientPktHeader& header = *((ClientPktHeader*) m_Header.rd_ptr ());
-
-  header.size = ACE_NTOHS (header.size);
-
-#if ACE_BYTE_ORDER == ACE_BIG_ENDIAN
-  header.cmd = ACE_SWAP_LONG (header.cmd)
-#endif // ACE_BIG_ENDIAN
-
-  if ((header.size < 4) ||
-      (header.size > 10240) ||
-      (header.cmd <= 0) ||
-      (header.cmd > 10240)
-      )
-    {
-      sLog.outError ("WorldSocket::handle_input_header: client sent mailformed packet size = %d , cmd = %d",
-                     header.size,
-                     header.cmd);
-
-      errno = EINVAL;
-      return -1;
-    }
-
-  header.size -= 4;
-
-  ACE_NEW_RETURN (m_RecvWPct, WorldPacket ((uint16) header.cmd, header.size), -1);
-
-  if (header.size > 0)
-    {
-      m_RecvWPct->resize (header.size);
-      m_RecvPct.base ((char*) m_RecvWPct->contents (), m_RecvWPct->size ());
-    }
-  else
-    {
-      ACE_ASSERT (m_RecvPct.space () == 0);
-    }
-
-
-  return 0;
-}
-
-int
-WorldSocket::handle_input_payload (void)
-{
-  // set errno properly here on error !!!
-  // now have a header and payload
-
-  ACE_ASSERT (m_RecvPct.space () == 0);
-  ACE_ASSERT (m_Header.space () == 0);
-  ACE_ASSERT (m_RecvWPct != NULL);
-
-  const int ret = this->ProcessIncoming (m_RecvWPct);
-
-  m_RecvPct.base (NULL, 0);
-  m_RecvPct.reset ();
-  m_RecvWPct = NULL;
-
-  m_Header.reset ();
-
-  if (ret == -1)
-    errno = EINVAL;
-
-  return ret;
-}
-
-int
-WorldSocket::handle_input_missing_data (void)
-{
-  char buf [1024];
-
-  ACE_Data_Block db (sizeof (buf),
-                     ACE_Message_Block::MB_DATA,
-                     buf,
-                     0,
-                     0,
-                     ACE_Message_Block::DONT_DELETE,
-                     0);
-
-  ACE_Message_Block message_block (&db,
-                                   ACE_Message_Block::DONT_DELETE,
-                                   0);
-
-  const size_t recv_size = message_block.space ();
-
-  const ssize_t n = this->peer ().recv (message_block.wr_ptr (),
-                                        recv_size);
-
-  if (n <= 0)
-    return n;
-
-  message_block.wr_ptr (n);
-
-  while (message_block.length () > 0)
-    {
-      if (m_Header.space () > 0)
-        {
-          //need to recieve the header
-          const size_t to_header = (message_block.length () > m_Header.space () ? m_Header.space () : message_block.length ());
-          m_Header.copy (message_block.rd_ptr (), to_header);
-          message_block.rd_ptr (to_header);
-
-          if (m_Header.space () > 0)
+}
+
+int WorldSocket::Update (void)
+{
+    if (closing_)
+        return -1;
+
+    if (m_OutActive || m_OutBuffer->length () == 0)
+        return 0;
+
+    return handle_output (get_handle ());
+}
+
+int WorldSocket::handle_input_header (void)
+{
+    ACE_ASSERT (m_RecvWPct == NULL);
+
+    ACE_ASSERT (m_Header.length () == sizeof (ClientPktHeader));
+
+    m_Crypt.DecryptRecv ((ACE_UINT8*) m_Header.rd_ptr (), sizeof (ClientPktHeader));
+
+    ClientPktHeader& header = *((ClientPktHeader*) m_Header.rd_ptr ());
+
+    EndianConvertReverse(header.size);
+    EndianConvert(header.cmd);
+
+    if ((header.size < 4) || (header.size > 10240) ||
+        (header.cmd  < 0) || (header.cmd  > 10240) )
+    {
+        sLog.outError ("WorldSocket::handle_input_header: client sent mailformed packet size = %d , cmd = %d",
+                       header.size, header.cmd);
+
+        errno = EINVAL;
+        return -1;
+    }
+
+    header.size -= 4;
+
+    ACE_NEW_RETURN (m_RecvWPct, WorldPacket ((uint16) header.cmd, header.size), -1);
+
+    if(header.size > 0)
+    {
+        m_RecvWPct->resize (header.size);
+        m_RecvPct.base ((char*) m_RecvWPct->contents (), m_RecvWPct->size ());
+    }
+    else
+    {
+        ACE_ASSERT(m_RecvPct.space() == 0);
+    }
+
+    return 0;
+}
+
+int WorldSocket::handle_input_payload (void)
+{
+    // set errno properly here on error !!!
+    // now have a header and payload
+
+    ACE_ASSERT (m_RecvPct.space () == 0);
+    ACE_ASSERT (m_Header.space () == 0);
+    ACE_ASSERT (m_RecvWPct != NULL);
+
+    const int ret = ProcessIncoming (m_RecvWPct);
+
+    m_RecvPct.base (NULL, 0);
+    m_RecvPct.reset ();
+    m_RecvWPct = NULL;
+
+    m_Header.reset ();
+
+    if (ret == -1)
+        errno = EINVAL;
+
+    return ret;
+}
+
+int WorldSocket::handle_input_missing_data (void)
+{
+    char buf [1024];
+
+    ACE_Data_Block db ( sizeof (buf),
+                        ACE_Message_Block::MB_DATA,
+                        buf,
+                        0,
+                        0,
+                        ACE_Message_Block::DONT_DELETE,
+                        0);
+
+    ACE_Message_Block message_block(&db,
+                                    ACE_Message_Block::DONT_DELETE,
+                                    0);
+
+    const size_t recv_size = message_block.space ();
+
+    const ssize_t n = peer ().recv (message_block.wr_ptr (),
+                                          recv_size);
+
+    if (n <= 0)
+        return n;
+
+    message_block.wr_ptr (n);
+
+    while (message_block.length () > 0)
+    {
+        if (m_Header.space () > 0)
+        {
+            //need to recieve the header
+            const size_t to_header = (message_block.length () > m_Header.space () ? m_Header.space () : message_block.length ());
+            m_Header.copy (message_block.rd_ptr (), to_header);
+            message_block.rd_ptr (to_header);
+
+            if (m_Header.space () > 0)
             {
-              //couldnt recieve the whole header this time
-              ACE_ASSERT (message_block.length () == 0);
-              errno = EWOULDBLOCK;
-              return -1;
+                //couldnt recieve the whole header this time
+                ACE_ASSERT (message_block.length () == 0);
+                errno = EWOULDBLOCK;
+                return -1;
             }
 
           //we just recieved nice new header
-          if (this->handle_input_header () == -1)
+            if (handle_input_header () == -1)
             {
-              ACE_ASSERT ((errno != EWOULDBLOCK) && (errno != EAGAIN));
-              return -1;
+                ACE_ASSERT ((errno != EWOULDBLOCK) && (errno != EAGAIN));
+                return -1;
             }
         }
 
-      // Its possible on some error situations that this happens
-      // for example on closing when epoll recieves more chunked data and stuff
-      // hope this is not hack ,as proper m_RecvWPct is asserted around
-      if (!m_RecvWPct)
-        {
-          sLog.outError ("Forsing close on input m_RecvWPct = NULL");
-          errno = EINVAL;
-          return -1;
-        }
-
-      // We have full readed header, now check the data payload
-      if (m_RecvPct.space () > 0)
-        {
-          //need more data in the payload
-          const size_t to_data = (message_block.length () > m_RecvPct.space () ? m_RecvPct.space () : message_block.length ());
-          m_RecvPct.copy (message_block.rd_ptr (), to_data);
-          message_block.rd_ptr (to_data);
-
-          if (m_RecvPct.space () > 0)
+        // Its possible on some error situations that this happens
+        // for example on closing when epoll recieves more chunked data and stuff
+        // hope this is not hack ,as proper m_RecvWPct is asserted around
+        if (!m_RecvWPct)
+        {
+            sLog.outError ("Forsing close on input m_RecvWPct = NULL");
+            errno = EINVAL;
+            return -1;
+        }
+
+        // We have full readed header, now check the data payload
+        if (m_RecvPct.space () > 0)
+        {
+            //need more data in the payload
+            const size_t to_data = (message_block.length () > m_RecvPct.space () ? m_RecvPct.space () : message_block.length ());
+            m_RecvPct.copy (message_block.rd_ptr (), to_data);
+            message_block.rd_ptr (to_data);
+
+            if (m_RecvPct.space () > 0)
             {
-              //couldnt recieve the whole data this time
-              ACE_ASSERT (message_block.length () == 0);
-              errno = EWOULDBLOCK;
-              return -1;
+                //couldnt recieve the whole data this time
+                ACE_ASSERT (message_block.length () == 0);
+                errno = EWOULDBLOCK;
+                return -1;
             }
         }
 
-      //just recieved fresh new payload
-      if (this->handle_input_payload () == -1)
-        {
-          ACE_ASSERT ((errno != EWOULDBLOCK) && (errno != EAGAIN));
-          return -1;
-        }
-    }
-
-  return n == recv_size ? 1 : 2;
-}
-
-int
-WorldSocket::cancel_wakeup_output (GuardType& g)
-{
-  if (!m_OutActive)
+        //just recieved fresh new payload
+        if (handle_input_payload () == -1)
+        {
+            ACE_ASSERT ((errno != EWOULDBLOCK) && (errno != EAGAIN));
+            return -1;
+        }
+    }
+
+    return n == recv_size ? 1 : 2;
+}
+
+int WorldSocket::cancel_wakeup_output (GuardType& g)
+{
+    if (!m_OutActive)
+        return 0;
+
+    m_OutActive = false;
+
+    g.release ();
+
+    if (reactor ()->cancel_wakeup
+        (this, ACE_Event_Handler::WRITE_MASK) == -1)
+    {
+        // would be good to store errno from reactor with errno guard
+        sLog.outError ("WorldSocket::cancel_wakeup_output");
+        return -1;
+    }
+
     return 0;
-
-  m_OutActive = false;
-
-  g.release ();
-
-  if (this->reactor ()->cancel_wakeup
-      (this, ACE_Event_Handler::WRITE_MASK) == -1)
-    {
-      // would be good to store errno from reactor with errno guard
-      sLog.outError ("WorldSocket::cancel_wakeup_output");
-      return -1;
-    }
-
-  return 0;
-}
-
-int
-WorldSocket::schedule_wakeup_output (GuardType& g)
-{
-  if (m_OutActive)
+}
+
+int WorldSocket::schedule_wakeup_output (GuardType& g)
+{
+    if (m_OutActive)
+        return 0;
+
+    m_OutActive = true;
+
+    g.release ();
+
+    if (reactor ()->schedule_wakeup
+        (this, ACE_Event_Handler::WRITE_MASK) == -1)
+    {
+        sLog.outError ("WorldSocket::schedule_wakeup_output");
+        return -1;
+    }
+
     return 0;
-
-  m_OutActive = true;
-
-  g.release ();
-
-  if (this->reactor ()->schedule_wakeup
-      (this, ACE_Event_Handler::WRITE_MASK) == -1)
-    {
-      sLog.outError ("WorldSocket::schedule_wakeup_output");
-      return -1;
-    }
-
-  return 0;
-}
-
-int
-WorldSocket::ProcessIncoming (WorldPacket* new_pct)
-{
-  ACE_ASSERT (new_pct);
-
-  // manage memory ;)
-  ACE_Auto_Ptr<WorldPacket> aptr (new_pct);
-
-  const ACE_UINT16 opcode = new_pct->GetOpcode ();
-
-  if (this->closing_)
-    return -1;
-
-  // dump recieved packet
-  if (sWorldLog.LogWorld ())
-    {
-      sWorldLog.Log ("CLIENT:\nSOCKET: %u\nLENGTH: %u\nOPCODE: %s (0x%.4X)\nDATA:\n",
+}
+
+int WorldSocket::ProcessIncoming (WorldPacket* new_pct)
+{
+    ACE_ASSERT (new_pct);
+
+    // manage memory ;)
+    ACE_Auto_Ptr<WorldPacket> aptr (new_pct);
+
+    const ACE_UINT16 opcode = new_pct->GetOpcode ();
+
+    if (closing_)
+        return -1;
+
+    // dump recieved packet
+    if (sWorldLog.LogWorld ())
+    {
+        sWorldLog.Log ("CLIENT:\nSOCKET: %u\nLENGTH: %u\nOPCODE: %s (0x%.4X)\nDATA:\n",
                      (uint32) get_handle (),
                      new_pct->size (),
@@ -617,107 +582,107 @@
                      new_pct->GetOpcode ());
 
-      uint32 p = 0;
-      while (p < new_pct->size ())
-        {
-          for (uint32 j = 0; j < 16 && p < new_pct->size (); j++)
-            sWorldLog.Log ("%.2X ", (*new_pct)[p++]);
-          sWorldLog.Log ("\n");
-        }
-      sWorldLog.Log ("\n\n");
-    }
-
-  // like one switch ;)
-  if (opcode == CMSG_PING)
-    {
-      return HandlePing (*new_pct);
-    }
-  else if (opcode == CMSG_AUTH_SESSION)
-    {
-      if (m_Session)
-        {
-          sLog.outError ("WorldSocket::ProcessIncoming: Player send CMSG_AUTH_SESSION again");
-          return -1;
-        }
-
-      return HandleAuthSession (*new_pct);
-    }
-  else if (opcode == CMSG_KEEP_ALIVE)
-    {
-      DEBUG_LOG ("CMSG_KEEP_ALIVE ,size: %d", new_pct->size ());
-
-      return 0;
-    }
-  else
-    {
-      ACE_GUARD_RETURN (LockType, Guard, m_SessionLock, -1);
-
-      if (m_Session != NULL)
-        {
-          // OK ,give the packet to WorldSession
-          aptr.release ();
-          // WARNINIG here we call it with locks held.
-          // Its possible to cause deadlock if QueuePacket calls back
-          m_Session->QueuePacket (new_pct);
-          return 0;
-        }
-      else
-        {
-          sLog.outError ("WorldSocket::ProcessIncoming: Client not authed opcode = ", opcode);
-          return -1;
-        }
-    }
-
-  ACE_NOTREACHED (return 0);
-}
-
-int
-WorldSocket::HandleAuthSession (WorldPacket& recvPacket)
-{
-  uint8 digest[20];
-  uint32 clientSeed;
-  uint32 unk2;
-  uint32 BuiltNumberClient;
-  uint32 id, security;
-  //uint8 expansion = 0;
-  LocaleConstant locale;
-  std::string account;
-  Sha1Hash sha1;
-  BigNumber v, s, g, N, x, I;
-  WorldPacket packet, SendAddonPacked;
-
-  BigNumber K;
-
-  if (recvPacket.size () < (4 + 4 + 1 + 4 + 20))
-    {
-      sLog.outError ("WorldSocket::HandleAuthSession: wrong packet size");
-      return -1;
-    }
-
-  // Read the content of the packet
-  recvPacket >> BuiltNumberClient; // for now no use
-  recvPacket >> unk2;
-  recvPacket >> account;
-
-  if (recvPacket.size () < (4 + 4 + (account.size () + 1) + 4 + 20))
-    {
-      sLog.outError ("WorldSocket::HandleAuthSession: wrong packet size second check");
-      return -1;
-    }
-
-  recvPacket >> clientSeed;
-  recvPacket.read (digest, 20);
-
-  DEBUG_LOG ("WorldSocket::HandleAuthSession: client %u, unk2 %u, account %s, clientseed %u",
-             BuiltNumberClient,
-             unk2,
-             account.c_str (),
-             clientSeed);
-
-  // Get the account information from the realmd database
-  std::string safe_account = account; // Duplicate, else will screw the SHA hash verification below
-  loginDatabase.escape_string (safe_account);
-  // No SQL injection, username escaped.
-
-  QueryResult *result =
+        uint32 p = 0;
+        while (p < new_pct->size ())
+        {
+            for (uint32 j = 0; j < 16 && p < new_pct->size (); j++)
+                sWorldLog.Log ("%.2X ", (*new_pct)[p++]);
+            sWorldLog.Log ("\n");
+        }
+        sWorldLog.Log ("\n\n");
+    }
+
+    // like one switch ;)
+    if (opcode == CMSG_PING)
+    {
+        return HandlePing (*new_pct);
+    }
+    else if (opcode == CMSG_AUTH_SESSION)
+    {
+        if (m_Session)
+        {
+            sLog.outError ("WorldSocket::ProcessIncoming: Player send CMSG_AUTH_SESSION again");
+            return -1;
+        }
+
+        return HandleAuthSession (*new_pct);
+    }
+    else if (opcode == CMSG_KEEP_ALIVE)
+    {
+        DEBUG_LOG ("CMSG_KEEP_ALIVE ,size: %d", new_pct->size ());
+
+        return 0;
+    }
+    else
+    {
+        ACE_GUARD_RETURN (LockType, Guard, m_SessionLock, -1);
+
+        if (m_Session != NULL)
+        {
+            // OK ,give the packet to WorldSession
+            aptr.release ();
+            // WARNINIG here we call it with locks held.
+            // Its possible to cause deadlock if QueuePacket calls back
+            m_Session->QueuePacket (new_pct);
+            return 0;
+        }
+        else
+        {
+            sLog.outError ("WorldSocket::ProcessIncoming: Client not authed opcode = ", opcode);
+            return -1;
+        }
+    }
+
+    ACE_NOTREACHED (return 0);
+}
+
+int WorldSocket::HandleAuthSession (WorldPacket& recvPacket)
+{
+    // NOTE: ATM the socket is singlethreaded, have this in mind ...
+    uint8 digest[20];
+    uint32 clientSeed;
+    uint32 unk2;
+    uint32 BuiltNumberClient;
+    uint32 id, security;
+    //uint8 expansion = 0;
+    LocaleConstant locale;
+    std::string account;
+    Sha1Hash sha1;
+    BigNumber v, s, g, N, x, I;
+    WorldPacket packet, SendAddonPacked;
+
+    BigNumber K;
+
+    if (recvPacket.size () < (4 + 4 + 1 + 4 + 20))
+    {
+        sLog.outError ("WorldSocket::HandleAuthSession: wrong packet size");
+        return -1;
+    }
+
+    // Read the content of the packet
+    recvPacket >> BuiltNumberClient;                        // for now no use
+    recvPacket >> unk2;
+    recvPacket >> account;
+
+    if (recvPacket.size () < (4 + 4 + (account.size () + 1) + 4 + 20))
+    {
+        sLog.outError ("WorldSocket::HandleAuthSession: wrong packet size second check");
+        return -1;
+    }
+
+    recvPacket >> clientSeed;
+    recvPacket.read (digest, 20);
+
+    DEBUG_LOG ("WorldSocket::HandleAuthSession: client %u, unk2 %u, account %s, clientseed %u",
+                BuiltNumberClient,
+                unk2,
+                account.c_str (),
+                clientSeed);
+
+    // Get the account information from the realmd database
+    std::string safe_account = account; // Duplicate, else will screw the SHA hash verification below
+    loginDatabase.escape_string (safe_account);
+    // No SQL injection, username escaped.
+
+    QueryResult *result =
           loginDatabase.PQuery ("SELECT "
                                 "id, " //0
@@ -736,17 +701,17 @@
                                 safe_account.c_str ());
 
-  // Stop if the account is not found
-  if (!result)
-    {
-      packet.Initialize (SMSG_AUTH_RESPONSE, 1);
-      packet << uint8 (AUTH_UNKNOWN_ACCOUNT);
-
-      SendPacket (packet);
-
-      sLog.outError ("WorldSocket::HandleAuthSession: Sent Auth Response (unknown account).");
-      return -1;
-    }
-
-  Field* fields = result->Fetch ();
+    // Stop if the account is not found
+    if (!result)
+    {
+        packet.Initialize (SMSG_AUTH_RESPONSE, 1);
+        packet << uint8 (AUTH_UNKNOWN_ACCOUNT);
+
+        SendPacket (packet);
+
+        sLog.outError ("WorldSocket::HandleAuthSession: Sent Auth Response (unknown account).");
+        return -1;
+    }
+
+    Field* fields = result->Fetch ();
 
     uint8 expansion = fields[8].GetUInt8();
@@ -755,86 +720,85 @@
         expansion = world_expansion;
 
-  N.SetHexStr ("894B645E89E1535BBDAD5B8B290650530801B18EBFBF5E8FAB3C82872A3E9BB7");
-  g.SetDword (7);
-  I.SetHexStr (fields[5].GetString ());
-
-  //In case of leading zeros in the I hash, restore them
-  uint8 mDigest[SHA_DIGEST_LENGTH];
-  memset (mDigest, 0, SHA_DIGEST_LENGTH);
-
-  if (I.GetNumBytes () <= SHA_DIGEST_LENGTH)
-    memcpy (mDigest, I.AsByteArray (), I.GetNumBytes ());
-
-  std::reverse (mDigest, mDigest + SHA_DIGEST_LENGTH);
-
-  s.SetHexStr (fields[7].GetString ());
-  sha1.UpdateData (s.AsByteArray (), s.GetNumBytes ());
-  sha1.UpdateData (mDigest, SHA_DIGEST_LENGTH);
-  sha1.Finalize ();
-  x.SetBinary (sha1.GetDigest (), sha1.GetLength ());
-  v = g.ModExp (x, N);
-
-  const char* sStr = s.AsHexStr (); //Must be freed by OPENSSL_free()
-  const char* vStr = v.AsHexStr (); //Must be freed by OPENSSL_free()
-  const char* vold = fields[6].GetString ();
-
-  DEBUG_LOG ("WorldSocket::HandleAuthSession: "
-             "(s,v) check s: %s v_old: %s v_new: %s",
-             sStr,
-             vold,
-             vStr);
-
-  loginDatabase.PExecute ("UPDATE account "
-                          "SET "
-                          "v = '0', "
-                          "s = '0' "
-                          "WHERE username = '%s'",
-                          safe_account.c_str ());
-
-  if (!vold || strcmp (vStr, vold))
-    {
-      packet.Initialize (SMSG_AUTH_RESPONSE, 1);
-      packet << uint8 (AUTH_UNKNOWN_ACCOUNT);
-      SendPacket (packet);
-      delete result;
-      OPENSSL_free ((void*) sStr);
-      OPENSSL_free ((void*) vStr);
-
-      sLog.outBasic ("WorldSocket::HandleAuthSession: User not logged.");
-      return -1;
-    }
-
-  OPENSSL_free ((void*) sStr);
-  OPENSSL_free ((void*) vStr);
-
-  ///- Re-check ip locking (same check as in realmd).
-  if (fields[4].GetUInt8 () == 1) // if ip is locked
-    {
-      if (strcmp (fields[3].GetString (), GetRemoteAddress ().c_str ()))
-        {
-          packet.Initialize (SMSG_AUTH_RESPONSE, 1);
-          packet << uint8 (AUTH_FAILED);
-          SendPacket (packet);
-
-          delete result;
-          sLog.outBasic ("WorldSocket::HandleAuthSession: Sent Auth Response (Account IP differs).");
-          return -1;
-        }
-    }
-
-  id = fields[0].GetUInt32 ();
-  security = fields[1].GetUInt16 ();
-  K.SetHexStr (fields[2].GetString ());
-
-  time_t mutetime = time_t (fields[9].GetUInt64 ());
-
-  locale = LocaleConstant (fields[10].GetUInt8 ());
-  if (locale >= MAX_LOCALE)
-    locale = LOCALE_enUS;
-
-  delete result;
-
-  // Re-check account ban (same check as in realmd) 
-  QueryResult *banresult =
+    N.SetHexStr ("894B645E89E1535BBDAD5B8B290650530801B18EBFBF5E8FAB3C82872A3E9BB7");
+    g.SetDword (7);
+    I.SetHexStr (fields[5].GetString ());
+
+    //In case of leading zeros in the I hash, restore them
+    uint8 mDigest[SHA_DIGEST_LENGTH];
+    memset (mDigest, 0, SHA_DIGEST_LENGTH);
+
+    if (I.GetNumBytes () <= SHA_DIGEST_LENGTH)
+        memcpy (mDigest, I.AsByteArray (), I.GetNumBytes ());
+
+    std::reverse (mDigest, mDigest + SHA_DIGEST_LENGTH);
+
+    s.SetHexStr (fields[7].GetString ());
+    sha1.UpdateData (s.AsByteArray (), s.GetNumBytes ());
+    sha1.UpdateData (mDigest, SHA_DIGEST_LENGTH);
+    sha1.Finalize ();
+    x.SetBinary (sha1.GetDigest (), sha1.GetLength ());
+    v = g.ModExp (x, N);
+
+    const char* sStr = s.AsHexStr (); //Must be freed by OPENSSL_free()
+    const char* vStr = v.AsHexStr (); //Must be freed by OPENSSL_free()
+    const char* vold = fields[6].GetString ();
+
+    DEBUG_LOG ("WorldSocket::HandleAuthSession: (s,v) check s: %s v_old: %s v_new: %s",
+                sStr,
+                vold,
+                vStr);
+
+    loginDatabase.PExecute ("UPDATE account "
+                            "SET "
+                            "v = '0', "
+                            "s = '0' "
+                            "WHERE username = '%s'",
+                            safe_account.c_str ());
+
+    if (!vold || strcmp (vStr, vold))
+    {
+        packet.Initialize (SMSG_AUTH_RESPONSE, 1);
+        packet << uint8 (AUTH_UNKNOWN_ACCOUNT);
+        SendPacket (packet);
+        delete result;
+        OPENSSL_free ((void*) sStr);
+        OPENSSL_free ((void*) vStr);
+
+        sLog.outBasic ("WorldSocket::HandleAuthSession: User not logged.");
+        return -1;
+    }
+
+    OPENSSL_free ((void*) sStr);
+    OPENSSL_free ((void*) vStr);
+
+    ///- Re-check ip locking (same check as in realmd).
+    if (fields[4].GetUInt8 () == 1) // if ip is locked
+    {
+        if (strcmp (fields[3].GetString (), GetRemoteAddress ().c_str ()))
+        {
+            packet.Initialize (SMSG_AUTH_RESPONSE, 1);
+            packet << uint8 (AUTH_FAILED);
+            SendPacket (packet);
+
+            delete result;
+            sLog.outBasic ("WorldSocket::HandleAuthSession: Sent Auth Response (Account IP differs).");
+            return -1;
+        }
+    }
+
+    id = fields[0].GetUInt32 ();
+    security = fields[1].GetUInt16 ();
+    K.SetHexStr (fields[2].GetString ());
+
+    time_t mutetime = time_t (fields[9].GetUInt64 ());
+
+    locale = LocaleConstant (fields[10].GetUInt8 ());
+    if (locale >= MAX_LOCALE)
+        locale = LOCALE_enUS;
+
+    delete result;
+
+    // Re-check account ban (same check as in realmd)
+    QueryResult *banresult =
           loginDatabase.PQuery ("SELECT "
                                 "bandate, "
@@ -845,218 +809,210 @@
                                 id);
 
-  if (banresult) // if account banned
-    {
-      packet.Initialize (SMSG_AUTH_RESPONSE, 1);
-      packet << uint8 (AUTH_BANNED);
-      SendPacket (packet);
-
-      delete banresult;
-
-      sLog.outBasic ("WorldSocket::HandleAuthSession: Sent Auth Response (Account banned).");
-      return -1;
-    }
-
-  // Check locked state for server
-  AccountTypes allowedAccountType = sWorld.GetPlayerSecurityLimit ();
-
-  if (allowedAccountType > SEC_PLAYER && security < allowedAccountType)
-    {
-      WorldPacket Packet (SMSG_AUTH_RESPONSE, 1);
-      Packet << uint8 (AUTH_UNAVAILABLE);
-
-      SendPacket (packet);
-
-      sLog.outBasic ("WorldSocket::HandleAuthSession: User tryes to login but his security level is not enough");
-      return -1;
-    }
-
-  // Check that Key and account name are the same on client and server
-  Sha1Hash sha;
-
-  uint32 t = 0;
-  uint32 seed = m_Seed;
-
-  sha.UpdateData (account);
-  sha.UpdateData ((uint8 *) & t, 4);
-  sha.UpdateData ((uint8 *) & clientSeed, 4);
-  sha.UpdateData ((uint8 *) & seed, 4);
-  sha.UpdateBigNumbers (&K, NULL);
-  sha.Finalize ();
-
-  if (memcmp (sha.GetDigest (), digest, 20))
-    {
-      packet.Initialize (SMSG_AUTH_RESPONSE, 1);
-      packet << uint8 (AUTH_FAILED);
-
-      SendPacket (packet);
-
-      sLog.outBasic ("WorldSocket::HandleAuthSession: Sent Auth Response (authentification failed).");
-      return -1;
-    }
-
-  std::string address = this->GetRemoteAddress ();
-
-  DEBUG_LOG ("WorldSocket::HandleAuthSession: Client '%s' authenticated successfully from %s.",
-             account.c_str (),
-             address.c_str ());
-
-  // Update the last_ip in the database
-  // No SQL injection, username escaped.
-  loginDatabase.escape_string (address);
-
-  loginDatabase.PExecute ("UPDATE account "
-                          "SET last_ip = '%s' "
-                          "WHERE username = '%s'",
-                          address.c_str (),
-                          safe_account.c_str ());
-
-  // TODO protect here probably ?
-  // Althought atm the socket is singlethreaded
-  ACE_NEW_RETURN (m_Session, WorldSession (id, this, security, expansion, mutetime, locale), -1);
-
-  m_Crypt.SetKey (&K);
-  m_Crypt.Init ();
-
-  // In case needed sometime the second arg is in microseconds 1 000 000 = 1 sec
-  ACE_OS::sleep (ACE_Time_Value (0, 10000));
-
-  // TODO error handling
-  sWorld.AddSession (this->m_Session);
-
-  // Create and send the Addon packet
-  if (sAddOnHandler.BuildAddonPacket (&recvPacket, &SendAddonPacked))
-    SendPacket (SendAddonPacked);
-
-  return 0;
-}
-
-int
-WorldSocket::HandlePing (WorldPacket& recvPacket)
-{
-  uint32 ping;
-  uint32 latency;
-
-  if (recvPacket.size () < 8)
-    {
-      sLog.outError ("WorldSocket::_HandlePing wrong packet size");
-      return -1;
-    }
-
-  // Get the ping packet content
-  recvPacket >> ping;
-  recvPacket >> latency;
-
-  if (m_LastPingTime == ACE_Time_Value::zero)
-    m_LastPingTime = ACE_OS::gettimeofday (); // for 1st ping
-  else
-    {
-      ACE_Time_Value cur_time = ACE_OS::gettimeofday ();
-      ACE_Time_Value diff_time (cur_time);
-      diff_time -= m_LastPingTime;
-      m_LastPingTime = cur_time;
-
-      if (diff_time < ACE_Time_Value (27))
-        {
-          ++m_OverSpeedPings;
-
-          uint32 max_count = sWorld.getConfig (CONFIG_MAX_OVERSPEED_PINGS);
-
-          if (max_count && m_OverSpeedPings > max_count)
+    if (banresult) // if account banned
+    {
+        packet.Initialize (SMSG_AUTH_RESPONSE, 1);
+        packet << uint8 (AUTH_BANNED);
+        SendPacket (packet);
+
+        delete banresult;
+
+        sLog.outError ("WorldSocket::HandleAuthSession: Sent Auth Response (Account banned).");
+        return -1;
+    }
+
+    // Check locked state for server
+    AccountTypes allowedAccountType = sWorld.GetPlayerSecurityLimit ();
+
+    if (allowedAccountType > SEC_PLAYER && security < allowedAccountType)
+    {
+        WorldPacket Packet (SMSG_AUTH_RESPONSE, 1);
+        Packet << uint8 (AUTH_UNAVAILABLE);
+
+        SendPacket (packet);
+
+        sLog.outBasic ("WorldSocket::HandleAuthSession: User tryes to login but his security level is not enough");
+        return -1;
+    }
+
+    // Check that Key and account name are the same on client and server
+    Sha1Hash sha;
+
+    uint32 t = 0;
+    uint32 seed = m_Seed;
+
+    sha.UpdateData (account);
+    sha.UpdateData ((uint8 *) & t, 4);
+    sha.UpdateData ((uint8 *) & clientSeed, 4);
+    sha.UpdateData ((uint8 *) & seed, 4);
+    sha.UpdateBigNumbers (&K, NULL);
+    sha.Finalize ();
+
+    if (memcmp (sha.GetDigest (), digest, 20))
+    {
+        packet.Initialize (SMSG_AUTH_RESPONSE, 1);
+        packet << uint8 (AUTH_FAILED);
+
+        SendPacket (packet);
+
+        sLog.outError ("WorldSocket::HandleAuthSession: Sent Auth Response (authentification failed).");
+        return -1;
+    }
+
+    std::string address = GetRemoteAddress ();
+
+    DEBUG_LOG ("WorldSocket::HandleAuthSession: Client '%s' authenticated successfully from %s.",
+                account.c_str (),
+                address.c_str ());
+
+    // Update the last_ip in the database
+    // No SQL injection, username escaped.
+    loginDatabase.escape_string (address);
+
+    loginDatabase.PExecute ("UPDATE account "
+                            "SET last_ip = '%s' "
+                            "WHERE username = '%s'",
+                            address.c_str (),
+                            safe_account.c_str ());
+
+    // NOTE ATM the socket is singlethreaded, have this in mind ...
+    ACE_NEW_RETURN (m_Session, WorldSession (id, this, security, expansion, mutetime, locale), -1);
+
+    m_Crypt.SetKey (&K);
+    m_Crypt.Init ();
+
+    // In case needed sometime the second arg is in microseconds 1 000 000 = 1 sec
+    ACE_OS::sleep (ACE_Time_Value (0, 10000));
+
+    sWorld.AddSession (m_Session);
+
+    // Create and send the Addon packet
+    if (sAddOnHandler.BuildAddonPacket (&recvPacket, &SendAddonPacked))
+        SendPacket (SendAddonPacked);
+
+    return 0;
+}
+
+int WorldSocket::HandlePing (WorldPacket& recvPacket)
+{
+    uint32 ping;
+    uint32 latency;
+
+    if (recvPacket.size () < 8)
+    {
+        sLog.outError ("WorldSocket::_HandlePing wrong packet size");
+        return -1;
+    }
+
+    // Get the ping packet content
+    recvPacket >> ping;
+    recvPacket >> latency;
+
+    if (m_LastPingTime == ACE_Time_Value::zero)
+        m_LastPingTime = ACE_OS::gettimeofday (); // for 1st ping
+    else
+    {
+        ACE_Time_Value cur_time = ACE_OS::gettimeofday ();
+        ACE_Time_Value diff_time (cur_time);
+        diff_time -= m_LastPingTime;
+        m_LastPingTime = cur_time;
+
+        if (diff_time < ACE_Time_Value (27))
+        {
+            ++m_OverSpeedPings;
+
+            uint32 max_count = sWorld.getConfig (CONFIG_MAX_OVERSPEED_PINGS);
+
+            if (max_count && m_OverSpeedPings > max_count)
             {
-              ACE_GUARD_RETURN (LockType, Guard, m_SessionLock, -1);
-
-              if (m_Session && m_Session->GetSecurity () == SEC_PLAYER)
+                ACE_GUARD_RETURN (LockType, Guard, m_SessionLock, -1);
+
+                if (m_Session && m_Session->GetSecurity () == SEC_PLAYER)
                 {
-                  sLog.outError ("WorldSocket::HandlePing: Player kicked for "
-                                 "overspeeded pings adress = %s",
-                                 GetRemoteAddress ().c_str ());
-
-                  return -1;
+                    sLog.outError  ("WorldSocket::HandlePing: Player kicked for "
+                                    "overspeeded pings adress = %s",
+                                    GetRemoteAddress ().c_str ());
+
+                    return -1;
                 }
             }
         }
-      else
-        m_OverSpeedPings = 0;
-    }
-
-  // critical section
-  {
-    ACE_GUARD_RETURN (LockType, Guard, m_SessionLock, -1);
-
-    if (m_Session)
-      m_Session->SetLatency (latency);
-    else
-      {
-        sLog.outError ("WorldSocket::HandlePing: peer sent CMSG_PING, "
-                       "but is not authenticated or got recently kicked,"
-                       " adress = %s",
-                       this->GetRemoteAddress ().c_str ());
-        return -1;
-      }
-  }
-
-  WorldPacket packet (SMSG_PONG, 4);
-  packet << ping;
-  return this->SendPacket (packet);
-}
-
-int
-WorldSocket::iSendPacket (const WorldPacket& pct)
-{
-  if (m_OutBuffer->space () < pct.size () + sizeof (ServerPktHeader))
-    {
-      errno = ENOBUFS;
-      return -1;
-    }
-
-  ServerPktHeader header;
-
-  header.cmd = pct.GetOpcode ();
-
-#if ACE_BYTE_ORDER == ACE_BIG_ENDIAN
-  header.cmd = ACE_SWAP_WORD (header.cmd)
-#endif
-
-          header.size = (uint16) pct.size () + 2;
-  header.size = ACE_HTONS (header.size);
-
-  m_Crypt.EncryptSend ((uint8*) & header, sizeof (header));
-
-  if (m_OutBuffer->copy ((char*) & header, sizeof (header)) == -1)
-    ACE_ASSERT (false);
-
-  if (!pct.empty ())
-    if (m_OutBuffer->copy ((char*) pct.contents (), pct.size ()) == -1)
-      ACE_ASSERT (false);
-
-  return 0;
-}
-
-bool
-WorldSocket::iFlushPacketQueue ()
-{
-  WorldPacket *pct;
-  bool haveone = false;
-
-  while (m_PacketQueue.dequeue_head (pct) == 0)
-    {
-      if (iSendPacket (*pct) == -1)
-        {
-          if (m_PacketQueue.enqueue_head (pct) == -1)
+        else
+            m_OverSpeedPings = 0;
+    }
+
+    // critical section
+    {
+        ACE_GUARD_RETURN (LockType, Guard, m_SessionLock, -1);
+
+        if (m_Session)
+        m_Session->SetLatency (latency);
+        else
+        {
+            sLog.outError ("WorldSocket::HandlePing: peer sent CMSG_PING, "
+                            "but is not authenticated or got recently kicked,"
+                            " adress = %s",
+                            GetRemoteAddress ().c_str ());
+             return -1;
+        }
+    }
+
+    WorldPacket packet (SMSG_PONG, 4);
+    packet << ping;
+    return SendPacket (packet);
+}
+
+int WorldSocket::iSendPacket (const WorldPacket& pct)
+{
+    if (m_OutBuffer->space () < pct.size () + sizeof (ServerPktHeader))
+    {
+        errno = ENOBUFS;
+        return -1;
+    }
+
+    ServerPktHeader header;
+
+    header.cmd = pct.GetOpcode ();
+    EndianConvert(header.cmd);
+
+    header.size = (uint16) pct.size () + 2;
+    EndianConvertReverse(header.size);
+
+    m_Crypt.EncryptSend ((uint8*) & header, sizeof (header));
+
+    if (m_OutBuffer->copy ((char*) & header, sizeof (header)) == -1)
+        ACE_ASSERT (false);
+
+    if (!pct.empty ())
+        if (m_OutBuffer->copy ((char*) pct.contents (), pct.size ()) == -1)
+            ACE_ASSERT (false);
+
+    return 0;
+}
+
+bool WorldSocket::iFlushPacketQueue ()
+{
+    WorldPacket *pct;
+    bool haveone = false;
+
+    while (m_PacketQueue.dequeue_head (pct) == 0)
+    {
+        if (iSendPacket (*pct) == -1)
+        {
+            if (m_PacketQueue.enqueue_head (pct) == -1)
             {
-              delete pct;
-              sLog.outError ("WorldSocket::iFlushPacketQueue m_PacketQueue->enqueue_head");
-              return false;
+                delete pct;
+                sLog.outError ("WorldSocket::iFlushPacketQueue m_PacketQueue->enqueue_head");
+                return false;
             }
 
-          break;
-        }
-      else
-        {
-          haveone = true;
-          delete pct;
-        }
-    }
-
-  return haveone;
-}
+            break;
+        }
+        else
+        {
+            haveone = true;
+            delete pct;
+        }
+    }
+
+    return haveone;
+}
Index: /trunk/src/framework/Utilities/ByteConverter.h
===================================================================
--- /trunk/src/framework/Utilities/ByteConverter.h (revision 102)
+++ /trunk/src/framework/Utilities/ByteConverter.h (revision 181)
@@ -11,10 +11,10 @@
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  * GNU General Public License for more details.
  *
  * You should have received a copy of the GNU General Public License
  * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  */
 
@@ -49,11 +49,17 @@
 #if TRINITY_ENDIAN == TRINITY_BIGENDIAN
 template<typename T> inline void EndianConvert(T& val) { ByteConverter::apply<T>(&val); }
+template<typename T> inline void EndianConvertReverse(T&) { }
 #else
 template<typename T> inline void EndianConvert(T&) { }
+template<typename T> inline void EndianConvertReverse(T& val) { ByteConverter::apply<T>(&val); }
 #endif
 
-template<typename T> inline void EndianConvert(T*) { }
+template<typename T> void EndianConvert(T*);         // will generate link error
+template<typename T> void EndianConvertReverse(T*);  // will generate link error
+
 inline void EndianConvert(uint8&) { }
 inline void EndianConvert( int8&) { }
+inline void EndianConvertReverse(uint8&) { }
+inline void EndianConvertReverse( int8&) { }
 
 #endif
