Beispiel #1
0
void MySQLClient::handleCommandResult()
{
  readData();
  m_watchdog.stop(); //Stop timeout
  m_watchdog.reset();
  if(m_len<2)
  {
    DBG("Response too short..\n");
    onResult(MYSQL_PRTCL);
    return;
  }
  DBG("RC=%d ",m_buf[0]);
  if(m_buf[0]==0)
  {
    DBG("(OK)\n");
    onResult(MYSQL_OK);
  }
  else
  {
    m_buf[m_len] = 0;
    DBG("(SQL Error %d) : %s\n", *((uint16_t*)&m_buf[1]), &m_buf[9]); //LE
    onResult(MYSQL_SQL);
    return;
  }
}
Beispiel #2
0
void MySQLClient::sendAuth()
{
  if( m_len - (m_pPos - m_buf) != 44)
  {
    //We only support protocol >= mysql-4.1
    DBG("Message after pcsz has wrong len (%d != 44)...\n", m_len - (m_pPos - m_buf));
    onResult(MYSQL_PRTCL);
    return;
  }
   
  uint16_t serverFlags = *((uint16_t*)&m_pPos[13]);
  DBG("Server capabilities are %04X.\n", serverFlags);
  
  uint32_t clientFlags = CLIENT_CONNECT_WITH_DB | CLIENT_PROTOCOL_41 | CLIENT_SECURE_CONNECTION | CLIENT_INTERACTIVE;;
  
  //if(serverFlags & CLIENT_LONG_PASSWORD)
  
  DBG("Using auth 4.1+\n");
  //Encrypt pw using scramble
  byte scramble[20+20]={0};
  memcpy(scramble, m_pPos+4, 8); 
  memcpy(scramble+8, m_pPos+31, 12); // *(m_pPos+43) == 0 (zero-terminated char*)

  byte stage1_hash[20] = {0};
  sha1( (byte*)m_password.data(), m_password.length(), stage1_hash );

  sha1( stage1_hash, 20, ((byte*)scramble + 20) );

  byte token[20] = {0};
  sha1( scramble, 40, token );

  for(int i=0;i<20;i++)
    token[i] = token[i] ^ stage1_hash[i];
    
  clientFlags |= CLIENT_LONG_PASSWORD;
  
  DBG("Building response\n"); 
  //Build response

  //BE
  *((uint32_t*)&m_buf[0]) = htonl(clientFlags);
  *((uint32_t*)&m_buf[4]) = BUF_SIZE; //Max packets size
  m_buf[8] = 8; //latin1 charset
  memset((char*)(m_buf+9),0,23);
  strcpy((char*)(m_buf+32),m_user.c_str());
  m_pPos = m_buf + 32 + m_user.length() + 1;
  m_pPos[0] = 20;
  memcpy((char*)&m_pPos[1],token,20);
  strcpy((char*)(m_pPos+21),m_db.c_str());
  m_len = 32 + m_user.length() + 1 + 21 + m_db.length() + 1;
  
  //Save first part of scramble in case we need it again
  memcpy(&m_buf[BUF_SIZE-8], scramble, 8);

  m_state = MYSQL_AUTH;
  
  DBG("Writing data\n"); 
  writeData();
}
Beispiel #3
0
	void Request::Callback::setResult(InstancePtr instance)
	{ 
		if (!finish_)
		{
			finish_ = true;
			onResult(instance);
		}
	}
Beispiel #4
0
void MySQLClient::onTCPSocketEvent(TCPSocketEvent e)
{
  DBG("Event %d in MySQLClient::onTCPSocketEvent()\n", e);

  if(m_closed)
  {
    DBG("WARN: Discarded\n");
    return;
  }
  
  switch(e)
  {
  case TCPSOCKET_READABLE: //Incoming data
    resetTimeout();
    if(m_state == MYSQL_HANDSHAKE)
      handleHandshake();
    else if(m_state == MYSQL_AUTH)
      handleAuthResult();
    else if(m_state == MYSQL_COMMANDS)
      handleCommandResult();
    break;
  case TCPSOCKET_WRITEABLE: //We can send data
    resetTimeout();
    break;
  case TCPSOCKET_CONNECTED: //Connected, wait for handshake packet
    resetTimeout();
    break;
  case TCPSOCKET_CONTIMEOUT:
  case TCPSOCKET_CONRST:
  case TCPSOCKET_CONABRT:
  case TCPSOCKET_ERROR:
    DBG("Connection error.\n");
    onResult(MYSQL_CONN);
  case TCPSOCKET_DISCONNECTED:
    //There might still be some data available for reading
    //So if we are in a reading state, do not close the socket yet
    if(m_state != MYSQL_CLOSED)
    {
      onResult(MYSQL_CONN);
    }
    DBG("Connection closed by remote host.\n");
    break;
  }
}
Beispiel #5
0
bool Renderer::requestRendering() {
    auto s = getSource();
    if (!_enabled || _renderingInProgress || _surfaceSize.equals(cocos2d::Size::ZERO) || !s) {
        return false;
    }
    font::Source *fontSet = nullptr;
    Document *document = nullptr;
    if (s->isReady()) {
        fontSet = s->getSource();
        document = s->getDocument();
    }

    if (fontSet && document) {
        auto media = _media;
        media.fontScale = s->getFontScale();
        media.pageMargin = _pageMargin;
        if (_isPageSplitted) {
            media.flags |= RenderFlag::SplitPages;
        }

        Builder * impl = new Builder(document, media, fontSet, _ids);
        impl->setHyphens(_hyphens);
        _renderingInProgress = true;
        if (_renderingCallback) {
            _renderingCallback(nullptr, true);
        }

        retain();
        auto &thread = resource::thread();
        thread.perform([impl] (cocos2d::Ref *) -> bool {
            // auto now = Time::now();
            impl->render();
            // TimeInterval all = (Time::now() - now);
            // log::format("Profiling", "Result rendering: %lu (%lu reader %lu other)", all.toMicroseconds(),
            //		impl->getReaderTime().toMicroseconds(), (all - impl->getReaderTime()).toMicroseconds());
            return true;
        }, [this, impl] (cocos2d::Ref *, bool) {
            auto result = impl->getResult();
            //log::format("Result size:", "%lu %d %d %d", result->getSizeInMemory(), sizeof(font::CharSpec), sizeof(font::LineSpec), sizeof(font::RangeSpec));
            if (result) {
                onResult(result);
            }
            release();
            delete impl;
        }, this);

        _renderingDirty = false;
    }
    return false;
}
Beispiel #6
0
void MySQLClient::handleAuthResult()
{
  readData();
  if(m_len==1 && *m_buf==0xfe)
  {
    //Re-send auth using 4.0- auth
    sendAuth323();
    return;
  }
  m_watchdog.stop(); //Stop timeout
  m_watchdog.reset();
  if(m_len<2)
  {
    DBG("Response too short..\n");
    onResult(MYSQL_PRTCL);
    return;
  }
  DBG("RC=%d ",m_buf[0]);
  if(m_buf[0]==0)
  {
    m_buf[m_len] = 0;
    m_pPos = m_buf + 1;
    m_pPos += m_buf[1] +1;
    m_pPos += m_pPos[0];
    m_pPos += 1;
    DBG("(OK) : Server status %d, Message : %s\n", *((uint16_t*)&m_pPos[0]), m_pPos+4);
    onResult(MYSQL_OK);
  }
  else
  {
    m_buf[m_len] = 0;
    DBG("(Error %d) : %s\n", *((uint16_t*)&m_buf[1]), &m_buf[9]); //LE
    onResult(MYSQL_AUTHFAILED);
    return;
  }
  m_state = MYSQL_COMMANDS;
}
Beispiel #7
0
void MySQLClient::handleHandshake()
{
  readData();
  if( ! (( m_len > 1 ) && ( memchr( m_buf + 1, 0, m_len ) != NULL )) )
  {
    DBG("Connected but could not find pcsz...\n");
    onResult(MYSQL_PRTCL);
    return;
  }
  
  DBG("Connected to server: %d bytes read ; Protocol version %d, mysql-%s.\n", m_len, m_buf[0], &m_buf[1]);
  
  m_pPos = (byte*) memchr( (char*)(m_buf + 1), 0, m_len ) + 1;
  
  sendAuth();
}
Beispiel #8
0
void MySQLClient::writeData() //Copy from buf
{
  byte head[4] = { 0 };
  *((uint16_t*)&head[0]) = m_len;
  head[3] = m_packetId;
  DBG("Packet Id %d\n", head[3]);
  m_packetId++;
  int ret = m_pTCPSocket->send((char*)head, 4); //Packet header
  if(ret>0)
    ret = m_pTCPSocket->send((char*)m_buf, m_len);
  if(ret < 0)//Error
  {
    onResult(MYSQL_CONN);
    return;
  }
  m_len = 0;//FIXME... incomplete packets handling
}
Beispiel #9
0
void Visualizator::onGdbResponse(const GdbResponse* response, int& maxDuration)
{
	Q_ASSERT(response);
	VisualizationContext context = static_cast<VisualizationContext>( response->getUserData() );
	switch ( response->getType() )
	{
		case GdbResponse::EXEC_ASYNC_OUTPUT: return onExecAsyncOut(response->getItemTree(), response->getReason(), context, maxDuration);
		case GdbResponse::STATUS_ASYNC_OUTPUT: return onStatusAsyncOut(response->getItemTree(), response->getReason(), context, maxDuration);
		case GdbResponse::NOTIFY_ASYNC_OUTPUT: return onNotifyAsyncOut(response->getItemTree(), response->getReason(), context, maxDuration);
		case GdbResponse::LOG_STREAM_OUTPUT: return onLogStreamOutput(response->getText(), context, maxDuration);
		case GdbResponse::TARGET_STREAM_OUTPUT: return onTargetStreamOutput(response->getText(), context, maxDuration);
		case GdbResponse::CONSOLE_STREAM_OUTPUT: return onConsoleStreamOutput(response->getText(), context, maxDuration);
		case GdbResponse::RESULT: return onResult(response->getItemTree(), context, maxDuration);

		default: break;
	}
}
Beispiel #10
0
void Channel::onMessage(Json::Value &jsonObj)
{
    LOGI("%s:receive:%s",m_sComponentName.c_str(),jsonObj.toStyledString().data());
    bool run = false;
    // id
    if (jsonObj.isMember("id"))
    {
        int msgID = jsonObj["id"].asInt();
        if(jsonObj.isMember("result")){
            if(msgID==m_iIDRegRequest){
                run=true;
                m_iIDStart = jsonObj["result"].asInt();
                m_iGenerateId= m_iIDStart;
                onRegistered();

            }
            else if(msgID == m_iIDUnRegRequest){
                run=true;
                m_iIDUnRegRequest=jsonObj["result"].asInt();
                onUnregistered();
            }
            else
            {
                run=true;
                onResult(jsonObj);
            }
        }
        else if(jsonObj.isMember("error")){
            run=true;
            onError(jsonObj["error"].asString());
        }
        else{
            run=true;
            onRequest(jsonObj);
        }
    }
    else
    {
        run=true;
        onNotification(jsonObj);
    }

    if(!run){
        LOGE("NOT USED");
    }
}
Beispiel #11
0
void MySQLClient::readData() //Copy to buf
{
  byte head[4];
  int ret = m_pTCPSocket->recv((char*)head, 4); //Packet header
  m_len = *((uint16_t*)&head[0]);
  m_packetId = head[3];
  DBG("Packet Id %d of length %d\n", head[3], m_len);
  m_packetId++;
  if(ret>0)
    ret = m_pTCPSocket->recv((char*)m_buf, m_len);
  if(ret < 0)//Error
  {
    onResult(MYSQL_CONN);
    return;
  }
  if(ret < m_len)
  {
    DBG("WARN: Incomplete packet\n");
  }
  m_len = ret;
}
Beispiel #12
0
void MySQLClient::onDNSReply(DNSReply r)
{
  if(m_closed)
  {
    DBG("WARN: Discarded\n");
    return;
  }
  
  if( r != DNS_FOUND )
  {
    DBG("Could not resolve hostname.\n");
    onResult(MYSQL_DNS);
    return;
  }
  
  DBG("DNS Resolved to %d.%d.%d.%d.\n",m_host.getIp()[0],m_host.getIp()[1],m_host.getIp()[2],m_host.getIp()[3]);
  //If no error, m_host has been updated by m_pDnsReq so we're set to go !
  m_pDnsReq->close();
  delete m_pDnsReq;
  m_pDnsReq = NULL;
  connect();
}
Beispiel #13
0
void MySQLClient::onTimeout() //Connection has timed out
{
  DBG("Timed out.\n");
  onResult(MYSQL_TIMEOUT);
  close();
}