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; } }
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(); }
void Request::Callback::setResult(InstancePtr instance) { if (!finish_) { finish_ = true; onResult(instance); } }
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; } }
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; }
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; }
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(); }
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 }
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; } }
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"); } }
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; }
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(); }
void MySQLClient::onTimeout() //Connection has timed out { DBG("Timed out.\n"); onResult(MYSQL_TIMEOUT); close(); }