Sirikata
libspace/plugins/craq/craq_oseg/asyncConnection.hpp
Go to the documentation of this file.
00001 /*  Sirikata
00002  *  asyncConnection.hpp
00003  *
00004  *  Copyright (c) 2010, Behram Mistree
00005  *  All rights reserved.
00006  *
00007  *  Redistribution and use in source and binary forms, with or without
00008  *  modification, are permitted provided that the following conditions are
00009  *  met:
00010  *  * Redistributions of source code must retain the above copyright
00011  *    notice, this list of conditions and the following disclaimer.
00012  *  * Redistributions in binary form must reproduce the above copyright
00013  *    notice, this list of conditions and the following disclaimer in
00014  *    the documentation and/or other materials provided with the
00015  *    distribution.
00016  *  * Neither the name of Sirikata nor the names of its contributors may
00017  *    be used to endorse or promote products derived from this software
00018  *    without specific prior written permission.
00019  *
00020  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
00021  * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
00022  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
00023  * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER
00024  * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
00025  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
00026  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
00027  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
00028  * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
00029  * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
00030  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
00031  */
00032 
00033 
00034 #ifndef __CRAQ_ASYNC_CONNECTION_HPP__
00035 #define __CRAQ_ASYNC_CONNECTION_HPP__
00036 
00037 #include <sirikata/core/util/Platform.hpp>
00038 #include <boost/asio.hpp>
00039 #include "asyncUtil.hpp"
00040 #include <sirikata/space/SpaceContext.hpp>
00041 
00042 
00043 //#define ASYNC_CONNECTION_DEBUG
00044 namespace Sirikata
00045 {
00046 class CraqEntry;
00047 
00048 class AsyncConnection
00049 {
00050 
00051 public:
00052 
00053   enum ConnectionState {READY, NEED_NEW_SOCKET,PROCESSING};
00054 
00055   void initialize(boost::asio::ip::tcp::socket* socket, boost::asio::ip::tcp::resolver::iterator, SpaceContext* spc, Network::IOStrand*  );
00056 
00057   void tick(std::vector<CraqOperationResult*>&opResults_get, std::vector<CraqOperationResult*>&opResults_error, std::vector<CraqOperationResult*>&opResults_trackedSets);  //runs through one iteration of io_service.run_once.
00058 
00059   AsyncConnection::ConnectionState ready(); //tells the querier whether I'm processing a message or available for more information.
00060 
00061 
00062   bool set(CraqDataKey& dataToSet, const CraqEntry&  dataToSetTo, bool& track, int& trackNum);
00063   bool get(CraqDataKey& dataToGet);
00064 
00065   ~AsyncConnection();
00066   AsyncConnection();
00067 
00068 private:
00069 
00070   boost::asio::ip::tcp::socket* mSocket;
00071 
00072   CraqDataKey currentlySearchingFor;
00073   CraqEntry currentlySettingTo;
00074   ConnectionState mReady;
00075 
00076   SpaceContext* ctx;
00077   Network::IOStrand* mStrand;
00078 
00079   bool mTracking;
00080   int mTrackNumber;
00081   std::vector<CraqOperationResult*> mOperationResultVector;
00082   std::vector<CraqOperationResult*> mOperationResultErrorVector;
00083   std::vector<CraqOperationResult*> mOperationResultTrackedSetsVector;
00084 
00085   //connect_handler
00086   void connect_handler(const boost::system::error_code& error);
00087 
00088   //set handler
00089   void read_handler_set ( const boost::system::error_code& error, std::size_t bytes_transferred, boost::asio::streambuf* sBuff);
00090   void finish_read_handler_set(std::string line, boost::asio::streambuf* sBuff);
00091   void write_some_handler_set(  const boost::system::error_code& error, std::size_t bytes_transferred);
00092   //get handler
00093   void write_some_handler_get(  const boost::system::error_code& error, std::size_t bytes_transferred);
00094   void read_handler_get ( const boost::system::error_code& error, std::size_t bytes_transferred, boost::asio::streambuf* sBuff);
00095 };
00096 
00097 }//end namespace
00098 
00099 #endif