Exemple #1
0
void RPCConsole::startExecutor()
{
    QThread* thread = new QThread;
    RPCExecutor *executor = new RPCExecutor();
    executor->moveToThread(thread);

    // Notify executor when thread started (in executor thread)
    connect(thread, SIGNAL(started()), executor, SLOT(start()));
    // Replies from executor object must go to this object
    connect(executor, SIGNAL(reply(int,QString)), this, SLOT(message(int,QString)));
    // Requests from this object must go to executor
    connect(this, SIGNAL(cmdRequest(QString)), executor, SLOT(request(QString)));
    // On stopExecutor signal
    // - queue executor for deletion (in execution thread)
    // - quit the Qt event loop in the execution thread
    connect(this, SIGNAL(stopExecutor()), executor, SLOT(deleteLater()));
    connect(this, SIGNAL(stopExecutor()), thread, SLOT(quit()));
    // Queue the thread for deletion (in this thread) when it is finished
    connect(thread, SIGNAL(finished()), thread, SLOT(deleteLater()));

    // Default implementation of QThread::run() simply spins up an event loop in the thread,
    // which is what we want.
    thread->start();
}
Exemple #2
0
void ICACHE_FLASH_ATTR
MQTTCMD_Setup(CmdPacket *cmd) {
  CmdRequest req;
  cmdRequest(&req, cmd);

  MQTT_Client* client = &mqttClient;

  if (cmdGetArgc(&req) != 4) return;

#if 0
// This section is commented-out because we're using the same client as esp-link is using itself,
// i.e. the one set-up in the Web UI. This code was here when we used a separate client for the
// attached uC, which just makes life more complicated...

  if (cmdGetArgc(&req) != 9)
    return 0;

  // create mqtt client
  uint8_t clientLen = sizeof(MQTT_Client);
  MQTT_Client* client = (MQTT_Client*)os_zalloc(clientLen);
  if (client == NULL) return 0;
  os_memset(client, 0, clientLen);

  uint16_t len;
  uint8_t *client_id, *user_data, *pass_data;
  uint32_t keepalive, clean_session;

  // get client id
  len = cmdArgLen(&req);
  if (len > 32) return 0; // safety check
  client_id = (uint8_t*)os_zalloc(len + 1);
  cmdPopArg(&req, client_id, len);
  client_id[len] = 0;

  // get username
  len = cmdArgLen(&req);
  if (len > 32) return 0; // safety check
  user_data = (uint8_t*)os_zalloc(len + 1);
  cmdPopArg(&req, user_data, len);
  user_data[len] = 0;

  // get password
  len = cmdArgLen(&req);
  if (len > 32) return 0; // safety check
  pass_data = (uint8_t*)os_zalloc(len + 1);
  cmdPopArg(&req, pass_data, len);
  pass_data[len] = 0;

  // get keepalive
  cmdPopArg(&req, (uint8_t*)&keepalive, 4);

  // get clean session
  cmdPopArg(&req, (uint8_t*)&clean_session, 4);
#ifdef MQTTCMD_DBG
  DBG("MQTT: MQTTCMD_Setup clientid=%s, user=%s, pw=%s, keepalive=%ld, clean_session=%ld\n", client_id, user_data, pass_data, keepalive, clean_session);
#endif

  // init client
  // TODO: why malloc these all here, pass to MQTT_InitClient to be malloc'd again?
  MQTT_InitClient(client, (char*)client_id, (char*)user_data, (char*)pass_data, keepalive, clean_session);

  os_free(client_id);
  os_free(user_data);
  os_free(pass_data);
#endif

  // create callback
  MqttCmdCb* callback = (MqttCmdCb*)os_zalloc(sizeof(MqttCmdCb));
  cmdPopArg(&req, &callback->connectedCb, 4);
  cmdPopArg(&req, &callback->disconnectedCb, 4);
  cmdPopArg(&req, &callback->publishedCb, 4);
  cmdPopArg(&req, &callback->dataCb, 4);
  client->user_data = callback;

  DBG("MQTT connectedCb=%x\n", callback->connectedCb);

  client->cmdConnectedCb = cmdMqttConnectedCb;
  client->cmdDisconnectedCb = cmdMqttDisconnectedCb;
  client->cmdPublishedCb = cmdMqttPublishedCb;
  client->cmdDataCb = cmdMqttDataCb;

  if (client->connState == MQTT_CONNECTED) {
    if (callback->connectedCb)
      cmdMqttConnectedCb(client);
  } else if (callback->disconnectedCb) {
    cmdMqttDisconnectedCb(client);
  }
}
Exemple #3
0
void ConsolePage::on_lineEdit_returnPressed()
{
    QString cmd = ui->lineEdit->text();
    ui->lineEdit->clear();

    if(!cmd.isEmpty())
    {
        if(cmd.toStdString() == "clear")
    {
        message(CMD_REQUEST, cmd);
        clear();
        // Remove command, if already in history
            history.removeOne(cmd);
            // Append command to history
            history.append(cmd);
            // Enforce maximum history size
            while(history.size() > CONSOLE_HISTORY)
                history.removeFirst();
            // Set pointer to end of history
            historyPtr = history.size();
            // Scroll console view to end
            scrollToEnd();
    }
    else if(cmd.toStdString() == "markethistory")
    {
        message(CMD_REQUEST, cmd);
        dumpmarkethistory();
        // Remove command, if already in history
            history.removeOne(cmd);
            // Append command to history
            history.append(cmd);
            // Enforce maximum history size
            while(history.size() > CONSOLE_HISTORY)
                history.removeFirst();
            // Set pointer to end of history
            historyPtr = history.size();
            // Scroll console view to end
            scrollToEnd();
    }
    else if(cmd.toStdString() == "marketdata")
    {
        message(CMD_REQUEST, cmd);
        marketdata();
        // Remove command, if already in history
            history.removeOne(cmd);
            // Append command to history
            history.append(cmd);
            // Enforce maximum history size
            while(history.size() > CONSOLE_HISTORY)
                history.removeFirst();
            // Set pointer to end of history
            historyPtr = history.size();
            // Scroll console view to end
            scrollToEnd();
    }
    else
    {
            message(CMD_REQUEST, cmd);
            emit cmdRequest(cmd);
            // Remove command, if already in history
            history.removeOne(cmd);
            // Append command to history
            history.append(cmd);
            // Enforce maximum history size
            while(history.size() > CONSOLE_HISTORY)
                history.removeFirst();
            // Set pointer to end of history
            historyPtr = history.size();
            // Scroll console view to end
            scrollToEnd();
    }
    }
}
Exemple #4
0
void ICACHE_FLASH_ATTR
REST_Request(CmdPacket *cmd) {
  CmdRequest req;
  cmdRequest(&req, cmd);
  DBG("REST: request");
  if (cmd->argc != 2 && cmd->argc != 3) return;

  // Get client
  uint32_t clientNum = cmd->value;
  RestClient *client = restClient + (clientNum % MAX_REST);
  DBG(" #%ld", clientNum);

  // Get HTTP method
  uint16_t len = cmdArgLen(&req);
  if (len > 15) goto fail;
  char method[16];
  cmdPopArg(&req, method, len);
  method[len] = 0;
  DBG(" method=%s", method);

  // Get HTTP path
  len = cmdArgLen(&req);
  if (len > 1023) goto fail;
  char path[1024];
  cmdPopArg(&req, path, len);
  path[len] = 0;
  DBG(" path=%s", path);

  // Get HTTP body
  uint32_t realLen = 0;
  if (cmdGetArgc(&req) == 2) {
    realLen = 0;
  } else {
    realLen = cmdArgLen(&req);
    if (realLen > 2048) goto fail;
  }
  DBG(" bodyLen=%ld", realLen);

  // we need to allocate memory for the header plus the body. First we count the length of the
  // header (including some extra counted "%s" and then we add the body length. We allocate the
  // whole shebang and copy everything into it.
  // BTW, use http/1.0 to avoid responses with transfer-encoding: chunked
  char *headerFmt = "%s %s HTTP/1.0\r\n"
                    "Host: %s\r\n"
                    "%s"
                    "Content-Length: %d\r\n"
                    "Connection: close\r\n"
                    "Content-Type: %s\r\n"
                    "User-Agent: %s\r\n\r\n";
  uint16_t headerLen = strlen(headerFmt) + strlen(method) + strlen(path) + strlen(client->host) +
      strlen(client->header) + strlen(client->content_type) + strlen(client->user_agent);
  DBG(" hdrLen=%d", headerLen);
  if (client->data) os_free(client->data);
  client->data = (char*)os_zalloc(headerLen + realLen);
  if (client->data == NULL) goto fail;
  DBG(" totLen=%ld data=%p", headerLen + realLen, client->data);
  client->data_len = os_sprintf((char*)client->data, headerFmt, method, path, client->host,
      client->header, realLen, client->content_type, client->user_agent);
  DBG(" hdrLen=%d", client->data_len);

  if (realLen > 0) {
    cmdPopArg(&req, client->data + client->data_len, realLen);
    client->data_len += realLen;
  }
  DBG("\n");

  //DBG("REST request: %s", (char*)client->data);

  //DBG("REST: pCon state=%d\n", client->pCon->state);
  client->pCon->state = ESPCONN_NONE;
  espconn_regist_connectcb(client->pCon, tcpclient_connect_cb);
  espconn_regist_reconcb(client->pCon, tcpclient_recon_cb);

  if(UTILS_StrToIP((char *)client->host, &client->pCon->proto.tcp->remote_ip)) {
    DBG("REST: Connect to ip %s:%ld\n",client->host, client->port);
    //if(client->security){
    //  espconn_secure_connect(client->pCon);
    //}
    //else {
      espconn_connect(client->pCon);
    //}
  } else {
    DBG("REST: Connect to host %s:%ld\n", client->host, client->port);
    espconn_gethostbyname(client->pCon, (char *)client->host, &client->ip, rest_dns_found);
  }

  return;

fail:
  DBG("\n");
}
Exemple #5
0
void ICACHE_FLASH_ATTR
REST_Setup(CmdPacket *cmd) {
  CmdRequest req;
  uint32_t port, security;
  int32_t err = -1; // error code in case of failure

  // start parsing the command
  cmdRequest(&req, cmd);
  if(cmdGetArgc(&req) != 3) goto fail;
  err--;

  // get the hostname
  uint16_t len = cmdArgLen(&req);
  if (len > 128) goto fail; // safety check
  err--;
  uint8_t *rest_host = (uint8_t*)os_zalloc(len + 1);
  if (cmdPopArg(&req, rest_host, len)) goto fail;
  err--;
  rest_host[len] = 0;

  // get the port
  if (cmdPopArg(&req, (uint8_t*)&port, 2)) {
    os_free(rest_host);
    goto fail;
  }
  err--;

  // get the security mode
  if (cmdPopArg(&req, (uint8_t*)&security, 1)) {
    os_free(rest_host);
    goto fail;
  }
  err--;

  // clear connection structures the first time
  if (restNum == 0xff) {
    os_memset(restClient, 0, MAX_REST * sizeof(RestClient));
    restNum = 0;
  }

  // allocate a connection structure
  RestClient *client = restClient + restNum;
  uint8_t clientNum = restNum;
  restNum = (restNum+1)%MAX_REST;

  // free any data structure that may be left from a previous connection
  if (client->header) os_free(client->header);
  if (client->content_type) os_free(client->content_type);
  if (client->user_agent) os_free(client->user_agent);
  if (client->data) os_free(client->data);
  if (client->pCon) {
    if (client->pCon->proto.tcp) os_free(client->pCon->proto.tcp);
    os_free(client->pCon);
  }
  os_memset(client, 0, sizeof(RestClient));
  DBG("REST: setup #%d host=%s port=%ld security=%ld\n", clientNum, rest_host, port, security);

  client->resp_cb = cmd->value;

  client->host = (char *)rest_host;
  client->port = port;
  client->security = security;

  client->header = (char*)os_zalloc(4);
  client->header[0] = 0;

  client->content_type = (char*)os_zalloc(22);
  os_sprintf((char *)client->content_type, "x-www-form-urlencoded");

  client->user_agent = (char*)os_zalloc(9);
  os_sprintf((char *)client->user_agent, "esp-link");

  client->pCon = (struct espconn *)os_zalloc(sizeof(struct espconn));
  client->pCon->proto.tcp = (esp_tcp *)os_zalloc(sizeof(esp_tcp));

  client->pCon->type = ESPCONN_TCP;
  client->pCon->state = ESPCONN_NONE;
  client->pCon->proto.tcp->local_port = espconn_port();
  client->pCon->proto.tcp->remote_port = client->port;

  client->pCon->reverse = client;

  cmdResponseStart(CMD_RESP_V, clientNum, 0);
  cmdResponseEnd();
  return;

fail:
  cmdResponseStart(CMD_RESP_V, err, 0);
  cmdResponseEnd();
  return;
}
Exemple #6
0
void pSocket::OnRead()
{
	
	static_cast<PeerHandler&>(Handler()).SetPaused();

	if (m_state != STATE_GET_PIECE)
	{	

	}
	Session *sess = m_sess; //ref.GetSession(m_hash);
	if (!sess && m_hash.size() )
	{

		SetCloseAndDelete();
		static_cast<PeerHandler&>(Handler()).SetNotPaused();
		return;
	}
	Peer *peer = m_peer; //sess ? sess -> GetPeer(GetRemoteAddress()) : NULL;
	char slask[100];
	TcpSocket::OnRead();
	while (ibuf.GetLength() && !CloseAndDelete() )
	{
		size_t l = ibuf.GetLength();
		switch (m_state)
		{
		case ACCEPT_LENGTH:
			{
				char c;
				ibuf.Read(&c, 1);
				if (c != 0x13)
				{
	
					SetCloseAndDelete();
					static_cast<PeerHandler&>(Handler()).SetNotPaused();
					return;
				}
				m_state = ACCEPT_PROTOCOL;
			}
			break;
		case ACCEPT_PROTOCOL:
			if (l < 19)
			{
				static_cast<PeerHandler&>(Handler()).SetNotPaused();
				return;
			}
			ibuf.Read(slask, 19);
			slask[19] = 0;
			if (strcmp(slask, "BitTorrent protocol"))
			{

				SetCloseAndDelete();
				static_cast<PeerHandler&>(Handler()).SetNotPaused();
				return;
			}
			m_state = ACCEPT_NULLBYTES;
			break;
		case ACCEPT_NULLBYTES:
			if (l < 8)
			{static_cast<PeerHandler&>(Handler()).SetNotPaused();return;}
			ibuf.Read(slask, 8);
			m_state = ACCEPT_HASH;
			break;
		case ACCEPT_HASH:
			if (l < 20)
			{static_cast<PeerHandler&>(Handler()).SetNotPaused();return;}
			ibuf.Read(slask, 20);
			{
				std::string hash;
				for (size_t i = 0; i < 20; i++)
				{
					unsigned char c;
					char tmp[10];
					memcpy(&c, slask + i, 1);
					sprintf(tmp, "%02x", c);
					hash += tmp;
				}

				if (m_server) // incoming
				{
					// resolve session for incoming connection (m_sess is NULL)
					Session *s = static_cast<PeerHandler&>(Handler()).GetSession(hash);
					if (!s)
					{
						SetCloseAndDelete();
						static_cast<PeerHandler&>(Handler()).SetNotPaused();
						return;
					}
					m_hash = hash;
					m_sess = s;
					m_peer = s -> GetPeer(GetRemoteAddress()); // can be NULL
					sess = s;
					peer = m_peer;
				}
				if (hash != m_hash)
				{

					SetCloseAndDelete();
					static_cast<PeerHandler&>(Handler()).SetNotPaused();
					return;
				}
				if (m_server)
				{
					SendHello();
					SendBitmap();
				}
				m_state = ACCEPT_PEER_ID;
			}
			break;
		case ACCEPT_PEER_ID:
			if (l < 20)
			{static_cast<PeerHandler&>(Handler()).SetNotPaused();return;}
			ibuf.Read(slask, 20);
			slask[20]='\0';
			//  (If the receiving side's peer id doesn't match 
			//   the one the initiating side expects, it severs
			//   the connection.)
			if (!m_server)
			{
				bool ok = true;
				for (size_t i = 0; i < 20 && ok; i++)
					if (m_remote_peer_id[i] != (unsigned char)(slask[i]) )
						ok = false;
				if (!ok)
				{
					{
						if(ACTIVATE_LOG)
							this->pSocket_log->add_line(string("m_remote_peer_id != current_peer_id"),true);
						SetCloseAndDelete();
						static_cast<PeerHandler&>(Handler()).SetNotPaused();
						return;
					}
				}
			}
			else // if (m_server)
			{
				std::string ip = GetRemoteAddress();
				std::string id = static_cast<std::string>(slask).substr(0,20);
				if (sess && !sess -> GetPeer(ip))
				{
					Peer *p = new Peer(dynamic_cast<SocketHandler&>(Handler()),m_hash,ip,id,0);
					sess -> AddPeer(p);
					m_peer = p;
					peer = p;
				}
			}
			m_state = STATE_COMMAND;
			m_cts = true;
			break;
		case STATE_COMMAND:
			if (l < 4)
			{static_cast<PeerHandler&>(Handler()).SetNotPaused();return;}
			{
				uint32_t len;
				ibuf.Read( (char *)&len, 4);
				m_length_cmd = ntohl(len);
				if (len > 0)
				{
					m_state = STATE_COMMAND2;
				}

			}
			break;
		case STATE_COMMAND2:
			{
				ibuf.Read(&m_cmd, 1);
				//while(m_cmd<0 || m_cmd>8)
				//	ibuf.Read(&m_cmd, 1);
				char sMessage[100];
				
				//     * 0 - choke
				//     * 1 - unchoke
				//     * 2 - interested
				//     * 3 - not interested
				//     * 4 - have [piece(integer)]
				//     * 5 - bitfield [bitmap]
				//     * 6 - request [index begin length]
				//     * 7 - piece [index begin piece(byte[])]
				//     * 8 - cancel [index begin length]
				switch (m_cmd)
				{
				case 0:
					sprintf(sMessage, " Choke Received: %i", m_cmd);
					if(ACTIVATE_LOG)
						this->pSocket_log->add_line(string(sMessage),true);
					cmdChoke();
					m_state = STATE_COMMAND;
					break;
				case 1:
					sprintf(sMessage, " Unchoke Received: %i", m_cmd);
					if(ACTIVATE_LOG)
						this->pSocket_log->add_line(string(sMessage),true);
					cmdUnchoke();
					m_state = STATE_COMMAND;
					break;
				case 2:
					sprintf(sMessage, " Interested Received: %i", m_cmd);
					if(ACTIVATE_LOG)
						this->pSocket_log->add_line(string(sMessage),true);
					cmdInterested();
					m_state = STATE_COMMAND;
					break;
				case 3:
					sprintf(sMessage, " Not interested Received: %i", m_cmd);
					if(ACTIVATE_LOG)
						this->pSocket_log->add_line(string(sMessage),true);
					cmdNotinterested();
					m_state = STATE_COMMAND;
					break;
				case 4:
					sprintf(sMessage, " Have [piece(integer)] Received: %i", m_cmd);
					if(ACTIVATE_LOG)
						this->pSocket_log->add_line(string(sMessage),true);
					m_integers = 1;
					m_ptr = 0;
					m_state = STATE_GET_INTEGERS;
					break;
				case 5:
					sprintf(sMessage, " Bitfield [bitmap] Received: %i", m_cmd);
					if(ACTIVATE_LOG)
						this->pSocket_log->add_line(string(sMessage),true);
					m_ptr = 0;
					m_state = STATE_GET_BITMAP;
					break;
				case 6:
					sprintf(sMessage, " Request [index begin length] Received: %i", m_cmd);
					if(ACTIVATE_LOG)
						this->pSocket_log->add_line(string(sMessage),true);
					m_integers = 3;
					m_ptr = 0;
					m_state = STATE_GET_INTEGERS;
					break;
				case 7:
					{
						sprintf(sMessage, " Piece [index begin piece(byte[])] Received: %i", m_cmd);
						if(ACTIVATE_LOG)
							this->pSocket_log->add_line(string(sMessage),true);
						size_t test=ibuf.Space();
						m_integers = 2;
						m_ptr = 0;
						m_state = STATE_GET_INTEGERS;
					}
					break;
				case 8:
					sprintf(sMessage, " Cancel [index begin length] Received: %i", m_cmd);
					if(ACTIVATE_LOG)
						this->pSocket_log->add_line(string(sMessage),true);
					m_integers = 3;
					m_ptr = 0;
					m_state = STATE_GET_INTEGERS;
					break;
				default:
			
					sprintf(sMessage, " Unknown Command Received: %i", m_cmd);
					if(ACTIVATE_LOG)
						this->pSocket_log->add_line(string(sMessage),true);
					m_ptr = 1;
					m_state = STATE_GET_COMMAND;
					bRecoverFromError = true;
					SetCloseAndDelete();
				}
			}
			break;
		case STATE_GET_INTEGERS:
			if (l < 4)
			{static_cast<PeerHandler&>(Handler()).SetNotPaused();return;}
			uint32_t ll;
			ibuf.Read( (char *)&ll, 4);
			m_int[m_ptr++] = ntohl(ll);
			if (m_ptr >= m_integers)
			{
				switch (m_cmd)
				{
				case 4:
					if (m_int[0] < sess -> GetNumberOfPieces())
					{
						cmdHave(m_int[0]);
						m_state = STATE_COMMAND;
					}
					else
					{
					
						SetCloseAndDelete();
					}
					break;
				case 6:
					if (m_int[0] < sess -> GetNumberOfPieces() &&
						m_int[1] < sess -> GetPieceLength() &&
						m_int[2] < 131072 &&
						m_int[1] + m_int[2] <= sess -> GetPieceLength() &&
						m_int[2] > 0)
					{
						cmdRequest(m_int[0], m_int[1], m_int[2]);
						m_state = STATE_COMMAND;
					}
					else
					{
					
						SetCloseAndDelete();
					}
					break;
				case 7:
					m_ptr = 0;
					m_state = STATE_GET_PIECE;
					break;
				case 8:
					if (m_int[0] < sess -> GetNumberOfPieces() &&
						m_int[1] < sess -> GetPieceLength() &&
						m_int[2] < 131072 &&
						m_int[1] + m_int[2] <= sess -> GetPieceLength() &&
						m_int[2] > 0)
					{
						cmdCancel(m_int[0], m_int[1], m_int[2]);
						m_state = STATE_COMMAND;
					}
					else
					{
						if(ACTIVATE_LOG)
							this->pSocket_log->add_line(string("cmdCancel Error."),true);
						bRecoverFromError=true;
						SetCloseAndDelete();
					}
					break;
				}
			}
			break;
		case STATE_GET_BITMAP:
			if (l < peer -> GetBitmapSize())
			{static_cast<PeerHandler&>(Handler()).SetNotPaused();return;}
			ibuf.Read((char *)peer -> GetBitmap(), peer -> GetBitmapSize());
			cmdBitfield();
			m_state = STATE_COMMAND;
			break;
		case STATE_GET_PIECE:
			if(m_ptr+l<iSliceSize)
			{
				ibuf.Read( (char *)&m_slice[m_ptr], l);
				m_ptr+=l;
			}
			else
			{
				while(m_ptr<iSliceSize)
				{
					ibuf.Read( (char *)&m_slice[m_ptr], 1);
					m_ptr++;
				}
			}
			if (m_ptr == iSliceSize)
			{
				if (m_int[0] < sess -> GetNumberOfPieces() &&
					m_int[1] < sess -> GetPieceLength())
				{
					cmdPiece(m_int[0], m_int[1], m_slice);
					if (peer)
					{
						peer -> RefreshRequests();
					}
					m_state = STATE_COMMAND;
				}
				else
				{

					SetCloseAndDelete();
				}
			}
			break;
		case STATE_GET_COMMAND:
			{
				std::string hex;
				std::string txt;
				char slask[10];
				while (m_ptr < m_length_cmd && l && m_length_cmd<ibuf.GetLength())
				{
					unsigned char c;
					ibuf.Read( (char *)&c,1);
					sprintf(slask,"%02x",c);
					hex += slask;
					sprintf(slask,"%c",isprint((char)c) ? (char)c : '.');
					txt += slask;
					l--;
					m_ptr++;
				}
				
				if (m_ptr == m_length_cmd)
				{
					m_state = STATE_COMMAND;
				}else 
				{
					if(ACTIVATE_LOG)
						this->pSocket_log->add_line(string("STATE_GET_COMMAND Error m_ptr != m_length_cmd"),true);
					SetCloseAndDelete();
				}
			}
			break;
		}
	}
	static_cast<PeerHandler&>(Handler()).SetNotPaused();
}