00001
00002
00003
00004
00005
00006
00007 #include "SgSystem.h"
00008 #include "SgGtpClient.h"
00009
00010 #include <sstream>
00011 #include "SgDebug.h"
00012
00013 using namespace std;
00014
00015
00016
00017 SgGtpFailure::SgGtpFailure(const std::string& message)
00018 : SgException(message)
00019 {
00020 }
00021
00022
00023
00024 SgGtpClient::SgGtpClient(istream& in, ostream& out, bool verbose)
00025 : m_verbose(verbose),
00026 m_in(in),
00027 m_out(out)
00028 {
00029 }
00030
00031 SgGtpClient::~SgGtpClient()
00032 {
00033 }
00034
00035 string SgGtpClient::Send(const string& command)
00036 {
00037 m_out << command << '\n';
00038 m_out.flush();
00039 if (m_verbose)
00040 SgDebug() << "<< " << command << '\n';
00041 if (! m_out)
00042 throw SgGtpFailure("GTP write connection is broken");
00043 ostringstream response;
00044 bool done = false;
00045 bool isFirst = true;
00046 bool success = true;
00047 while (! done)
00048 {
00049 string line;
00050 getline(m_in, line);
00051 if (! m_in)
00052 throw SgGtpFailure("GTP read connection is broken");
00053 if (m_verbose)
00054 SgDebug() << ">> " << line << '\n';
00055 if (isFirst)
00056 {
00057 if (line.size() < 2 || (line[0] != '=' && line[0] != '?')
00058 || line[1] != ' ')
00059 throw SgGtpFailure("Invalid response: '" + line + "'");
00060 if (line[0] == '?')
00061 success = false;
00062 line = line.substr(2);
00063 response << line;
00064 isFirst = false;
00065 }
00066 else
00067 {
00068 if (line.empty())
00069 done = true;
00070 else
00071 response << '\n' << line;
00072 }
00073 }
00074 if (! success)
00075 throw SgGtpFailure(response.str());
00076 return response.str();
00077 }
00078
00079