From: <spo...@us...> - 2007-04-14 18:04:37
|
Revision: 388 http://svn.sourceforge.net/opengate/?rev=388&view=rev Author: spom_spom Date: 2007-04-14 11:04:36 -0700 (Sat, 14 Apr 2007) Log Message: ----------- Fixed some client and server issues. Modified Paths: -------------- branches/ogsector/data/Console.png branches/ogsector/data/simpleHUD.fontdef branches/ogsector/src/Sector.cpp branches/ogsector/src/SectorClientFrameListener.cpp branches/ogsector/src/SectorClientFrameListener.h branches/ogsector/src/SectorObjects.cpp branches/ogsector/src/SectorObjects.h branches/ogsector/src/networkClient.cpp branches/ogsector/src/networkClient.h branches/ogsector/src/networkProtocol.h branches/ogsector/src/networkServer.cpp branches/ogsector/src/networkServer.h branches/ogsector/src/networkServerUser.cpp branches/ogsector/src/networkServerUser.h branches/ogsector/src/ogconsole.cpp branches/ogsector/src/ogsectorclient.cpp branches/ogsector/src/ogsectorserver.cpp Modified: branches/ogsector/data/Console.png =================================================================== (Binary files differ) Modified: branches/ogsector/data/simpleHUD.fontdef =================================================================== --- branches/ogsector/data/simpleHUD.fontdef 2007-04-14 00:25:52 UTC (rev 387) +++ branches/ogsector/data/simpleHUD.fontdef 2007-04-14 18:04:36 UTC (rev 388) @@ -4,6 +4,7 @@ source bluehigh.ttf size 32 resolution 55 + code_points 33-255 } @@ -13,5 +14,6 @@ source bluehigh.ttf size 32 resolution 55 + code_points 33-255 } Modified: branches/ogsector/src/Sector.cpp =================================================================== --- branches/ogsector/src/Sector.cpp 2007-04-14 00:25:52 UTC (rev 387) +++ branches/ogsector/src/Sector.cpp 2007-04-14 18:04:36 UTC (rev 388) @@ -46,6 +46,12 @@ Ogre::Real( 500.0 ), Ogre::Degree( 0.0 ) ); +// createStaticObject( Ogre::String("tmp/astro1.mesh"), +// "tmp", +// Ogre::Vector3( -300, 300, 0 ), +// Ogre::Real( 100.0 ), +// Ogre::Degree( 0.0 ) ); + // createStaticObject( Ogre::String("misc/jumpgate.mesh"), // "jumpgate", // Ogre::Vector3( 0, -1000, 0 ), @@ -184,7 +190,7 @@ void Sector::spawnAiObject( ){ int childID = 1; - while ( localAiObjects_.find( childID ) != localAiObjects_.end() ){ childID ++; } + while ( localAiObjects_.count( childID ) ){ childID ++; } SectorObjectMoveableAi *obj = createAiMoveableObject( avatar_->name() + "_Spawn" + Ogre::StringConverter::toString( childID ), childID ); @@ -309,12 +315,12 @@ void Sector::receiveVesselRegister( const MessageBodyShipRegister & msg ){ if ( msg.senderID() != network_->userID() ){ - std::map< long , SectorObjectMoveable * >::iterator it; + // std::map< long , SectorObjectMoveable * >::iterator it; - if ( ( it = movableObjects_.find( createGlobalID( msg.senderID(), msg.childID() ) ) ) != movableObjects_.end() ){ + if ( movableObjects_.count( createGlobalID( msg.senderID(), msg.childID() ) ) ){ if ( msg.status() == false ){ log_->info( "Deregistering " + msg.name() ); - destructMoveableObject( it->second ); + destructMoveableObject( movableObjects_[ createGlobalID( msg.senderID(), msg.childID() ) ] ); } else { log_->info( "Object " + msg.name() + " allready registered." ); } Modified: branches/ogsector/src/SectorClientFrameListener.cpp =================================================================== --- branches/ogsector/src/SectorClientFrameListener.cpp 2007-04-14 00:25:52 UTC (rev 387) +++ branches/ogsector/src/SectorClientFrameListener.cpp 2007-04-14 18:04:36 UTC (rev 388) @@ -9,6 +9,25 @@ namespace OpenGate{ +// inline std::string encode_utf8( std::string & ansi ){ +// size_t ansi_len = ansi.length(); +// int len = MultiByteToWideChar( Ogre::CP_ACP, 0, ansi.c_str(), ansi_len, NULL, 0 ); + +// if (ansi_len > 0 && len > 0) { +// WCHAR *utf16 = new WCHAR[len]; + +// MultiByteToWideChar(CP_ACP, 0, ansi.c_str(), ansi_len, (LPWSTR)utf16, len); +// ansi_len = WideCharToMultiByte(CP_UTF8, 0, (LPWSTR)utf16, len, NULL, 0, NULL, NULL); + +// std::string unicode(ansi_len, 0); + +// WideCharToMultiByte(CP_UTF8, 0, (LPWSTR)utf16, len, (LPSTR)unicode.c_str(), ansi_len, NULL, NULL); +// delete[] utf16; +// return unicode; +// } +// return ""; +// } + SectorClientFrameListener::SectorClientFrameListener( Ogre::RenderWindow * win, Ogre::Camera * cam, Sector * sector, NetworkClient * nw, InputManager * input ) @@ -35,8 +54,6 @@ timeSinceLastSectorUpdate_ = 0.0; timeSinceLastNetworkUpdate_ = 0.0; - inputInitialState_ = true; - lastInputWheelState_ = 0; hudOverlay_ = Ogre::OverlayManager::getSingleton().getByName("OpenGate/SimpleHUD"); Ogre::OverlayManager::getSingleton().getOverlayElement("OpenGate/SimpleHUDChatInPanel")->hide( ); @@ -51,14 +68,13 @@ hudOverlay_->show( ); - mouseOverlay_ = Ogre::OverlayManager::getSingleton().getByName( "Overlay/MousePointer" ); + Ogre::OverlayManager::getSingleton().getByName( "Overlay/MousePointer" )->show(); + mousePointer_ = Ogre::OverlayManager::getSingleton().getOverlayElement( "MousePointer/Pointer" ); - mousePointer_->setTop( windowsHalfWidth_ ); - mousePointer_->setLeft( windowsHalfHeight_ ); - mouseOverlay_->show(); + mousePointer_->setTop( windowsHalfHeight_ - 16 ); + mousePointer_->setLeft( windowsHalfWidth_ - 16 ); - // cameraRotateSpeed_ = 36; // cameraRotateScale_ = 0.0f; // cameraMoveSpeed_ = 100; @@ -262,18 +278,19 @@ } else { // ** chatmode if ( e.key != OIS::KC_BACK ) { - if ( (int)e.text < 255 && (int)e.text > 0 ) { + if ( (int)e.text > 32 && (int)e.text < 167 ) { chatString_ += e.text; } else { - std::cout << (char)e.text << " " << e.text << std::endl; + std::cout << (char)e.text << " " << e.text << std::endl; } } else if ( chatString_.length() > 1 ) { chatString_ = chatString_.substr( 0, chatString_.length() - 1 ); } - Ogre::OverlayManager::getSingleton().getOverlayElement("OpenGate/SimpleHUDChatInTextField")->setCaption( chatString_ ); + Ogre::OverlayElement *hudChatIn = Ogre::OverlayManager::getSingleton().getOverlayElement("OpenGate/SimpleHUDChatInTextField"); +// hudChatIn->setCaption( chatString_ ); - // hudChatIn->setCaption( Ogre::UTFString(chatString_.c_str()).asUTF32() ); + hudChatIn->setCaption( Ogre::UTFString( chatString_ ) ); // hudChatIn->setCaption( Ogre::UTFString( chatString_ ).asUTF32_c_str() ); if ( e.key == OIS::KC_RETURN) { @@ -323,16 +340,24 @@ } bool SectorClientFrameListener::mouseMoved( const OIS::MouseEvent & e ){ - mousePointer_->setLeft( e.state.X.abs - 16); - mousePointer_->setTop( e.state.Y.abs - 16); + mousePointer_->setLeft( mousePointer_->getLeft( ) + e.state.X.rel ); + mousePointer_->setTop( mousePointer_->getTop( ) + e.state.Y.rel ); + if ( mousePointer_->getLeft( ) < -16 ) mousePointer_->setLeft( -16 ); + if ( mousePointer_->getTop( ) < -16 ) mousePointer_->setTop( -16 ); + + if ( mousePointer_->getLeft( ) > windowsWidth_-16 ) mousePointer_->setLeft( windowsWidth_-16 ); + if ( mousePointer_->getTop( ) > windowsHeight_-16 ) mousePointer_->setTop( windowsHeight_-16 ); + if ( sector_->avatar() != NULL ){ - // std::cout << "X" << e.state.X.abs << " " << e.state.X.rel<< std::endl; - // std::cout << "Y" << e.state.Y.abs << " " << e.state.Y.rel<< std::endl; - // std::cout << "Z" << e.state.Z.abs << " " << e.state.Z.rel<< std::endl; +// std::cout << "X" << e.state.X.abs << " " << e.state.X.rel << " " << mousePointer_->getLeft( ) << std::endl; +// std::cout << "Y" << e.state.Y.abs << " " << e.state.Y.rel << " " << mousePointer_->getTop( ) << std::endl; +// std::cout << "Z" << e.state.Z.abs << " " << e.state.Z.rel<< std::endl; +// return true; - int relativToMidPointX = (int)rint( e.state.X.abs - windowsHalfWidth_ ); - int relativToMidPointY = (int)rint( e.state.Y.abs - windowsHalfHeight_ ); + int relativToMidPointX = (int)rint( (mousePointer_->getLeft( ) +16) - windowsHalfWidth_ ); + int relativToMidPointY = (int)rint( (mousePointer_->getTop( ) +16) - windowsHalfHeight_ ); + int minActiveZonePercent = 5; int maxActiveZonePercent = 90; @@ -354,37 +379,28 @@ if ( fabs( relativToMidPointX ) < minRadius ) yaw = 0.0; if ( fabs( relativToMidPointY ) < minRadius ) pitch = 0.0; - if ( inputInitialState_ == true ){ - if ( yaw == 0.0 && pitch == 0.0 ){ - inputInitialState_ = false; - } - } else{ - - yaw = min( yaw, 1.0f ); yaw = max( yaw, -1.0f ); - pitch = min( pitch, 1.0f ); pitch = max( pitch, -1.0f ); - - // std::cout << ( String("Mouse rel: ") + StringConverter::toString( e.state.X.rel ) + - // String(" ") + StringConverter::toString( e.state.Y.rel ) + - // String(" abs: ") + StringConverter::toString( e.state.X.abs ) + - // String(" ") + StringConverter::toString( e.state.Y.abs ) + - // String(" relMid: ") + StringConverter::toString( relativToMidPointX ) + - // String(" ") + StringConverter::toString( relativToMidPointY ) + - // String(" yaw: ") + StringConverter::toString( yaw ) + - // String(" pitch ") + StringConverter::toString( pitch ) ) << std::endl; - - sector_->avatar()->setScaledYaw( -yaw ); - sector_->avatar()->setScaledPitch( -pitch ); - } + yaw = min( yaw, 1.0f ); yaw = max( yaw, -1.0f ); + pitch = min( pitch, 1.0f ); pitch = max( pitch, -1.0f ); + + // std::cout << ( String("Mouse rel: ") + StringConverter::toString( e.state.X.rel ) + + // String(" ") + StringConverter::toString( e.state.Y.rel ) + + // String(" abs: ") + StringConverter::toString( e.state.X.abs ) + + // String(" ") + StringConverter::toString( e.state.Y.abs ) + + // String(" relMid: ") + StringConverter::toString( relativToMidPointX ) + + // String(" ") + StringConverter::toString( relativToMidPointY ) + + // String(" yaw: ") + StringConverter::toString( yaw ) + + // String(" pitch ") + StringConverter::toString( pitch ) ) << std::endl; + + sector_->avatar()->setScaledYaw( -yaw ); + sector_->avatar()->setScaledPitch( -pitch ); } // if avatar; - if ( e.state.Z.abs-10 > lastInputWheelState_ ){ // mouse wheel up + if ( e.state.Z.rel < -10 ){ // mouse wheel up setTarget( sector_->nextTarget() ); - lastInputWheelState_ = e.state.Z.abs; - - } else if( lastInputWheelState_ > e.state.Z.abs+10 ) { // mouse wheel down + } else if ( e.state.Z.rel > 10 ) { setTarget( sector_->prevTarget() ); - lastInputWheelState_ = e.state.Z.abs; } + return true; } Modified: branches/ogsector/src/SectorClientFrameListener.h =================================================================== --- branches/ogsector/src/SectorClientFrameListener.h 2007-04-14 00:25:52 UTC (rev 387) +++ branches/ogsector/src/SectorClientFrameListener.h 2007-04-14 18:04:36 UTC (rev 388) @@ -61,9 +61,8 @@ InputManager * inputManager_; Ogre::Overlay * hudOverlay_; - Ogre::Overlay * mouseOverlay_; Ogre::OverlayElement * mousePointer_; - Ogre::SceneNode * hudTarget_; + // Ogre::SceneNode * hudTarget_; Ogre::SceneNode * targetPointer_; SectorObject * target_; Ogre::Billboard *targetPointerBB_; @@ -73,8 +72,6 @@ bool deathSequence_; double timeSinceLastSectorUpdate_; double timeSinceLastNetworkUpdate_; - bool inputInitialState_; - int lastInputWheelState_; int cameraMode_; double cameraMoveScale_; Modified: branches/ogsector/src/SectorObjects.cpp =================================================================== --- branches/ogsector/src/SectorObjects.cpp 2007-04-14 00:25:52 UTC (rev 387) +++ branches/ogsector/src/SectorObjects.cpp 2007-04-14 18:04:36 UTC (rev 388) @@ -314,7 +314,9 @@ // roll_ += scaledRoll; // mainNode_->translate( ( destP- srcP ) / 5.0 ); - interpolateVel_ = ( destP-srcP ) / lastFrameCount_ / 1.0; + if ( lastFrameCount_ > 0 ){ + interpolateVel_ = ( destP-srcP ) / lastFrameCount_ / 1.0; + } if ( ( srcP - destP ).length() > 100 ) forceMovement_ = true; } @@ -397,7 +399,11 @@ Ogre::Vector3 flightDir( vel_ ); flightDir.normalise(); //** thrust = mass * acc; - acc_ = ( - trustDir * thrust() - flightDir * friction ) / mass_; + if ( mass_ > 0 ){ + acc_ = ( - trustDir * thrust() - flightDir * friction ) / mass_; + } else { + std::cerr << "mass: " << mass_ << std::endl; + } if ( breakPressed_ == true ) { if ( velocity() > 0 ) { @@ -556,7 +562,7 @@ } bool SectorObjectMoveableAi::update( Ogre::Real elapsedTime ){ - if ( target_ != NULL ) { + if ( target_ != NULL && elapsedTime > 1e-4 ) { Ogre::Vector3 src = mainNode_->getWorldOrientation() * Ogre::Vector3::NEGATIVE_UNIT_Z; src.normalise(); Modified: branches/ogsector/src/SectorObjects.h =================================================================== --- branches/ogsector/src/SectorObjects.h 2007-04-14 00:25:52 UTC (rev 387) +++ branches/ogsector/src/SectorObjects.h 2007-04-14 18:04:36 UTC (rev 388) @@ -151,7 +151,7 @@ inline Ogre::Real scaledRoll() const { return roll_; } inline void setScaledRoll( float rotZScale ){ roll_ = rotZScale; } - Ogre::Real rotFriction(){ return 0.4 + (0.6 * (100.0-percentageThrust_ )/ 100.0 ); } + Ogre::Real rotFriction(){ return 0.4 + ( 0.6 * ( 100.0 - percentageThrust_ )/ 100.0 ); } inline Ogre::Real thrustPercent() const { return 100.0 * thrust() / maxThrust(); } inline void setThrustPercent( Ogre::Real thrust ) { Modified: branches/ogsector/src/networkClient.cpp =================================================================== --- branches/ogsector/src/networkClient.cpp 2007-04-14 00:25:52 UTC (rev 387) +++ branches/ogsector/src/networkClient.cpp 2007-04-14 18:04:36 UTC (rev 388) @@ -48,6 +48,7 @@ } void NetworkClient::login( const std::string & userName, const std::string & passwd ) { + userName_ = userName; if ( online_ ){ MessageBodyUserName msg( userName ); send( msg ); @@ -68,12 +69,12 @@ } } -std::string NetworkClient::userName( int userID ) const { +std::string NetworkClient::userName( int userID ) { if ( userID == 0 ) userID = userID_; - std::map < int, std::string >::const_iterator it; - if ( ( it = users_.find( userID ) ) != users_.end() ){ - return it->second; + if ( users_.count( userID ) ){ + std::string str( users_[ userID ] ); + return str; } else { return "unknown user: " + toStr( userID ) ; } @@ -139,6 +140,18 @@ std::cout << "New user = " << (int)msg.senderID() << " " << msg.userName() << std::endl; users_[ (int)msg.senderID() ] = msg.userName(); } break; + case PROTO_CONNECTION_REFUSED: { + MessageBodyConnectionRefused msg( readMsg_.body() ); + switch ( msg.reason() ){ + case CONNECTION_REFUSED_USER_ALREADY_EXIST: + std::cerr << "Connection refused: " << userName_ << " already conneced to the server" << std::endl; + doClose(); + online_ = false; + break; + default: + std::cerr << "Connection refused for unknown reason:" << msg.reason() << std::endl; + } + } break; case PROTO_DISCONNECT: { MessageBodyDisconnect msg( readMsg_.body() ); std::cout << "Disconnect user = " << (int)msg.userID() << " " << userName( (int)msg.userID() ) << std::endl; @@ -168,7 +181,7 @@ bool write_in_progress = !msgsToWrite_.empty(); msgsToWrite_.push_back( Message( body ) ); // std::cout << "send.length() = " << msgsToWrite_.front().length() << std::endl; - if ( !write_in_progress ) { + if ( !write_in_progress && online_ ) { asio::async_write( socket_, asio::buffer( msgsToWrite_.front().data(), msgsToWrite_.front().length() ), boost::bind( & NetworkClient::handleWrite, this, asio::placeholders::error ) ); @@ -180,7 +193,7 @@ if ( online_ ){ if ( !error ){ msgsToWrite_.pop_front(); - if ( !msgsToWrite_.empty() ) { + if ( !msgsToWrite_.empty() && online_ ) { asio::async_write(socket_, asio::buffer( msgsToWrite_.front().data(), msgsToWrite_.front().length() ), boost::bind( &NetworkClient::handleWrite, this, asio::placeholders::error ) ); @@ -196,6 +209,7 @@ if ( online_ ){ std::cout << "User disconnected." << std::endl; socket_.close(); + pingTime_ = -1; online_ = false; } } Modified: branches/ogsector/src/networkClient.h =================================================================== --- branches/ogsector/src/networkClient.h 2007-04-14 00:25:52 UTC (rev 387) +++ branches/ogsector/src/networkClient.h 2007-04-14 18:04:36 UTC (rev 388) @@ -26,7 +26,7 @@ Uint32 userID() const { return userID_; } - std::string userName( int userID = 0 ) const; + std::string userName( int userID = 0 ); bool online() const { return online_; } @@ -73,6 +73,7 @@ std::deque< std::vector< char > > msgsToPull_; + std::string userName_; std::map < int, std::string > users_; Uint32 userID_; float pingTime_; Modified: branches/ogsector/src/networkProtocol.h =================================================================== --- branches/ogsector/src/networkProtocol.h 2007-04-14 00:25:52 UTC (rev 387) +++ branches/ogsector/src/networkProtocol.h 2007-04-14 18:04:36 UTC (rev 388) @@ -38,7 +38,8 @@ #define PROTO_USERNAME 3 #define PROTO_LOGIN 4 #define PROTO_DISCONNECT 5 -#define PROTO_CHAT 6 +#define PROTO_CONNECTION_REFUSED 6 +#define PROTO_CHAT 7 #define PROTO_SHIPBASE 10 #define PROTO_SHIPREGISTER 11 #define PROTO_SHIPSTATUS 12 @@ -46,6 +47,8 @@ #define PROTO_SHIPAMMOHIT 14 #define PROTO_TEST 255 +#define CONNECTION_REFUSED_USER_ALREADY_EXIST 1 + typedef unsigned char Uint8; typedef unsigned short Uint16; typedef int Uint32; @@ -176,6 +179,30 @@ std::string username_; }; +class MessageBodyConnectionRefused : public MessageBodyBase{ +public: + MessageBodyConnectionRefused( Uint8 reason ) : MessageBodyBase(), reason_( reason ){ + type_ = (Uint8)PROTO_CONNECTION_REFUSED; + } + + MessageBodyConnectionRefused( const char * data ) : MessageBodyBase( data ) { + int count = MessageBodyBase::dataSize(); + readFromData( reason_, data, count ); + } + + ~MessageBodyConnectionRefused(){} + + virtual void createOutStream() { + MessageBodyBase::createOutStream(); + writeToOut( out_, reason_ ); + } + + Uint8 reason( ) const { return reason_; } + +protected: + Uint8 reason_; +}; + class MessageBodyChat : public MessageBodyBase { public: MessageBodyChat( const std::string & message ) : MessageBodyBase(), message_( message ) { Modified: branches/ogsector/src/networkServer.cpp =================================================================== --- branches/ogsector/src/networkServer.cpp 2007-04-14 00:25:52 UTC (rev 387) +++ branches/ogsector/src/networkServer.cpp 2007-04-14 18:04:36 UTC (rev 388) @@ -29,7 +29,7 @@ void Server::handleAccept( UserSession * user, const asio::error & error ){ // std::cout << "Server::handle_accept" << std::endl; if ( !error ) { - addUser( user ); + addUserSession( user ); UserSession * newUser = new UserSession( this, ++userIDCounter_ ); acceptor_.async_accept( newUser->socket(), @@ -40,43 +40,59 @@ } } -void Server::addUser( UserSession * user ){ +void Server::addUserSession( UserSession * user ){ std::cout << "USER_NEW: " << user->userID() << std::endl; user->start(); - allUsers_.join( user ); } -void Server::disconnectUser( UserSession * user ){ - std::string name( user->userName() ); - std::cout << "DISCONNECTING: " << user->userID() << " " << user->userName() << std::endl; - allUsers_.leave( user ); +void Server::receiveUserName( UserSession * user, const MessageBodyUserName & msg ){ + std::cout << "USER_NAME: " << user->userID() << " " << msg.userName() << std::endl; - for ( std::map < int, UserObject * >::iterator i = user->childs()->begin(); i != user->childs()->end();){ - destroyUserObject( (i++)->second ); + if ( !userNames_.count( msg.userName() ) ){ + user->setUserName( msg.userName() ); + allUsers_.join( user ); + userNames_.insert( msg.userName() ); + + //** send the user name and the userId to all connected users; + MessageBodyUserName newUserMsg( msg.userName(), user->userID() ); + allUsers_.send( newUserMsg ); + + //** send all usernames and the userIds to the new user; + for ( UserSessionGroup::iterator it = allUsers_.begin(); it != allUsers_.end(); it ++ ){ + if ( (*it)->userID() != user->userID() ){ + MessageBodyUserName n( (*it)->userName(), (*it)->userID() ); + user->send( n ); + } + } + + user->setRegistered( true ); + } else { + std::cerr << "USER: " << msg.userName()<< " already exist." << std::endl; + + MessageBodyConnectionRefused msg( CONNECTION_REFUSED_USER_ALREADY_EXIST ); + user->send( msg ); + // disconnectUser( user, false ); } - - MessageBodyDisconnect disco( user->userID() ); - allUsers_.send( disco ); - - delete user; - std::cout << "DISCONNECTED: " << name << std::endl; } -void Server::receiveUserName( UserSession * user, const MessageBodyUserName & msg ){ - std::cout << "USER_NAME: " << user->userID() << " " << msg.userName() << std::endl; - user->setUserName( msg.userName() ); +void Server::disconnectUser( UserSession * user ){ + std::string name( user->userName() ); + std::cout << "DISCONNECTING: " << user->userID() << " " << name << std::endl; - //** send the user name and the userId to all connected users; - MessageBodyUserName newUserMsg( msg.userName(), user->userID() ); - allUsers_.send( newUserMsg ); - - //** send all usernames and the userIds to the new user; - for ( UserSessionGroup::iterator it = allUsers_.begin(); it != allUsers_.end(); it ++ ){ - if ( (*it)->userID() != user->userID() ){ - MessageBodyUserName n( (*it)->userName(), (*it)->userID() ); - user->send( n ); + if ( user->registered() ){ + allUsers_.leave( user ); + + for ( std::map < int, UserObject * >::iterator i = user->childs()->begin(); i != user->childs()->end();){ + destroyUserObject( (i++)->second ); } + + MessageBodyDisconnect disco( user->userID() ); + allUsers_.send( disco ); + userNames_.erase( name ); } + + // delete user; + std::cout << "DISCONNECTED: " << name << std::endl; } void Server::receiveChat( UserSession * user, const MessageBodyChat & msg ){ @@ -88,19 +104,32 @@ } UserObject * Server::createUserObject( UserSession * user, const std::string & name, int userID, int childID ){ - std::map < long, UserObject * >::iterator it; +// std::map < long, UserObject * >::iterator it; +// UserObject * obj = NULL; +// long id = createGlobalID( userID, childID ); + +// if ( ( it = userObjects_.find( id ) ) == userObjects_.end() ){ +// std::cout << "Create user object: " << name << std::endl; +// obj = new UserObject( user, name, childID ); +// user->insertChild( obj ); +// userObjects_[ id ] = obj; +// } else { +// std::cout << "Create request, but object already exist: " << name << std::endl; +// obj = it->second; +// } + UserObject * obj = NULL; long id = createGlobalID( userID, childID ); - if ( ( it = userObjects_.find( id ) ) == userObjects_.end() ){ + if ( !userObjects_.count( id ) ){ std::cout << "Create user object: " << name << std::endl; obj = new UserObject( user, name, childID ); user->insertChild( obj ); userObjects_[ id ] = obj; } else { - std::cout << "Create request, but object allready exist: " << name << std::endl; - obj = it->second; + std::cout << "Create request, but object already exist: " << name << std::endl; + obj = userObjects_[ id ]; } return obj; @@ -167,7 +196,7 @@ } } } else { - std::cerr << "object: " << name << " allready registered. " << std::endl; + std::cerr << "object: " << name << " already registered. " << std::endl; } } else { std::cerr << "Cannot register object: " << name << std::endl; Modified: branches/ogsector/src/networkServer.h =================================================================== --- branches/ogsector/src/networkServer.h 2007-04-14 00:25:52 UTC (rev 387) +++ branches/ogsector/src/networkServer.h 2007-04-14 18:04:36 UTC (rev 388) @@ -10,7 +10,6 @@ #include "networkProtocol.h" #include "networkServerUser.h" - using asio::ip::tcp; namespace OpenGate{ @@ -46,12 +45,12 @@ void handleAccept( UserSession * user, const asio::error & error ); - void addUser( UserSession * user ); + void addUserSession( UserSession * user ); - void disconnectUser( UserSession * user ); - void receiveUserName( UserSession * user, const MessageBodyUserName & msg ); - + + void disconnectUser( UserSession * user ); + void receiveChat( UserSession * user, const MessageBodyChat & msg ); UserObject * createUserObject( UserSession * user, const std::string & name, int userID, int childID ); @@ -62,13 +61,13 @@ void deRegisterUserObject( UserObject * obj ); - private: asio::io_service & io_service_; tcp::acceptor acceptor_; long userIDCounter_; std::map < long, UserObject * > userObjects_; + std::set < std::string > userNames_; UserSessionGroup allUsers_; }; Modified: branches/ogsector/src/networkServerUser.cpp =================================================================== --- branches/ogsector/src/networkServerUser.cpp 2007-04-14 00:25:52 UTC (rev 387) +++ branches/ogsector/src/networkServerUser.cpp 2007-04-14 18:04:36 UTC (rev 388) @@ -12,6 +12,8 @@ UserSession::UserSession( Server * server, int userID ) : socket_( server->io_service() ), server_( server ), userID_ ( userID ), userName_( "" ) { + connected_ = true; + registered_ = false; } UserSession::~UserSession(){ @@ -20,6 +22,7 @@ void UserSession::start() { MessageBodyUserID msg( userID_ ); this->send( msg ); + connected_ = true; asio::async_read( socket_, asio::buffer( readMsg_.data(), Message::HeaderLength ), boost::bind( & UserSession::handleReadHeader, this, asio::placeholders::error ) ); } @@ -29,13 +32,13 @@ } void UserSession::eraseChild( UserObject * obj ) { - if ( childs_.find( obj->childID() ) != childs_.end() ){ - childs_.erase( childs_.find( obj->childID() ) ); + if ( childs_.count( obj->childID() ) ){ + childs_.erase( obj->childID() ); } } UserObject * UserSession::child( int childID ) { - if ( childs_.find( childID ) != childs_.end() ) { + if ( childs_.count( childID ) ) { return childs_[ childID ]; } else { return NULL; @@ -49,7 +52,7 @@ // std::cout << "send.length() = " << writeMsgs_.front().length() << std::endl; - if ( ! write_in_progress ) { + if ( ! write_in_progress && connected_ ) { asio::async_write( socket_, asio::buffer( writeMsgs_.front().data(), writeMsgs_.front().length() ), boost::bind( & UserSession::handleWrite, this, asio::placeholders::error ) ); } @@ -82,6 +85,7 @@ asio::async_read( socket_, asio::buffer( readMsg_.body(), readMsg_.bodyLength() ), boost::bind( & UserSession::handleReadBody, this, asio::placeholders::error ) ); } else { + connected_ = false; server_->disconnectUser( this ); } } @@ -137,7 +141,7 @@ if ( !error ) { writeMsgs_.pop_front(); - if ( !writeMsgs_.empty() ) { + if ( !writeMsgs_.empty() && connected_ ) { asio::async_write( socket_, asio::buffer( writeMsgs_.front().data(), writeMsgs_.front().length() ), boost::bind( & UserSession::handleWrite, this, asio::placeholders::error ) ); } Modified: branches/ogsector/src/networkServerUser.h =================================================================== --- branches/ogsector/src/networkServerUser.h 2007-04-14 00:25:52 UTC (rev 387) +++ branches/ogsector/src/networkServerUser.h 2007-04-14 18:04:36 UTC (rev 388) @@ -28,6 +28,10 @@ int userID() const { return userID_; } + bool registered() const{ return registered_; } + + void setRegistered( bool reg ) { registered_ = reg; } + void setUserName( const std::string & userName ) { userName_ = userName; } const std::string userName( ) const { return userName_; } @@ -56,6 +60,8 @@ tcp::socket socket_; Server * server_; int userID_; + bool connected_; + bool registered_; std::string userName_; Message readMsg_; Modified: branches/ogsector/src/ogconsole.cpp =================================================================== --- branches/ogsector/src/ogconsole.cpp 2007-04-14 00:25:52 UTC (rev 387) +++ branches/ogsector/src/ogconsole.cpp 2007-04-14 18:04:36 UTC (rev 388) @@ -96,12 +96,14 @@ root_->getAutoCreatedWindow()->writeContentsToFile( screenieName ); print( std::string( "Wrote: " + screenieName ) ); } else{ - char legalchars[] = "ABCDEFGHIJKLMNOPQRSTUVWXUZabcdefghijklmnopqrstuvwxyz1234567890+!\"#%&/()=?[]\\*-_.:,; "; - for ( size_t c = 0; c < sizeof( legalchars ); c++ ){ - if ( legalchars[ c ] == e.text ){ - prompt_ += e.text; - break; - } +// char legalchars[] = "ABCDEFGHIJKLMNOPQRSTUVWXUZabcdefghijklmnopqrstuvwxyz1234567890+!\"#%&/()=?[]\\*-_.:,; "; +// for ( size_t c = 0; c < sizeof( legalchars ); c++ ){ +// if ( legalchars[ c ] == e.text ){ +// prompt_ += e.text; +// break; +// } + if ( (int)e.text > 32 && (int)e.text < 167 ) { + prompt_ += e.text; } } updateConsole_ = true; Modified: branches/ogsector/src/ogsectorclient.cpp =================================================================== --- branches/ogsector/src/ogsectorclient.cpp 2007-04-14 00:25:52 UTC (rev 387) +++ branches/ogsector/src/ogsectorclient.cpp 2007-04-14 18:04:36 UTC (rev 388) @@ -74,7 +74,7 @@ #ifdef NETWORKCHECK myMSleep( 1 ); int count = 0; - while( nw.online() && count < 20 ){ + while( nw.online() && count < 1000 ){ myMSleep( 1000 ); Modified: branches/ogsector/src/ogsectorserver.cpp =================================================================== --- branches/ogsector/src/ogsectorserver.cpp 2007-04-14 00:25:52 UTC (rev 387) +++ branches/ogsector/src/ogsectorserver.cpp 2007-04-14 18:04:36 UTC (rev 388) @@ -50,5 +50,4 @@ } return EXIT_SUCCESS; - } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |