void CheriaServer::sendClientConnect(ProtocolServer::ClientState* sourceCs,ProtocolServer::ClientState* destCs,Comm::NetPipe& pipe)
	{
	/* Get handles on the Cheria state objects: */
	ClientState* mySourceCs=dynamic_cast<ClientState*>(sourceCs);
	ClientState* myDestCs=dynamic_cast<ClientState*>(destCs);
	if(mySourceCs==0||myDestCs==0)
		Misc::throwStdErr("CheriaServer::sendClientConnect: Client state object has mismatching type");
	
	#if DEBUGGING
	std::cout<<"CheriaServer::sendClientConnect..."<<std::flush;
	#endif
	
	/* Create a temporary message buffer with the same endianness as the pipe's write end: */
	MessageBuffer buffer;
	buffer.setSwapOnWrite(pipe.mustSwapOnWrite());
	
	/*********************************************************************
	Assemble the update message in the temporary buffer:
	*********************************************************************/
	
	/* Send creation messages for the source client's devices to the destination client: */
	for(ClientDeviceMap::Iterator cdIt=mySourceCs->clientDevices.begin();!cdIt.isFinished();++cdIt)
		{
		writeMessage(CREATE_DEVICE,buffer);
		buffer.write<Card>(cdIt->getSource());
		cdIt->getDest()->writeLayout(buffer);
		}
	
	/* Send creation messages for the source client's tools to the destination client: */
	for(ClientToolMap::Iterator ctIt=mySourceCs->clientTools.begin();!ctIt.isFinished();++ctIt)
		{
		writeMessage(CREATE_TOOL,buffer);
		buffer.write<Card>(ctIt->getSource());
		ctIt->getDest()->write(buffer);
		}
	
	/* Send the current states of the source client's devices: */
	writeMessage(DEVICE_STATES,buffer);
	for(ClientDeviceMap::Iterator cdIt=mySourceCs->clientDevices.begin();!cdIt.isFinished();++cdIt)
		{
		/* Send a device state message: */
		buffer.write<Card>(cdIt->getSource());
		cdIt->getDest()->write(DeviceState::FULL_UPDATE,buffer);
		}
	buffer.write<Card>(0);
	
	/*********************************************************************
	Send the assembled message to the client in one go:
	*********************************************************************/
	
	#if DEBUGGING
	std::cout<<" message size "<<buffer.getDataSize()<<std::endl;
	#endif
	
	/* Write the message's total size first: */
	pipe.write<Card>(buffer.getDataSize());
	
	/* Write the message itself: */
	buffer.writeToSink(pipe);
	}
예제 #2
0
inline bool PartialProcessPacket(Battlenet::Session* session, MessageBuffer& inputBuffer)
{
    MessageBuffer& buffer = session->*outputBuffer;

    // We have full read header, now check the data payload
    if (buffer.GetRemainingSpace() > 0)
    {
        // need more data in the payload
        std::size_t readDataSize = std::min(inputBuffer.GetActiveSize(), buffer.GetRemainingSpace());
        buffer.Write(inputBuffer.GetReadPointer(), readDataSize);
        inputBuffer.ReadCompleted(readDataSize);
    }

    if (buffer.GetRemainingSpace() > 0)
    {
        // Couldn't receive the whole data this time.
        ASSERT(inputBuffer.GetActiveSize() == 0);
        return false;
    }

    // just received fresh new payload
    if (!(session->*processMethod)())
    {
        session->CloseSocket();
        return false;
    }

    return true;
}
예제 #3
0
MessageBuffer *Session::ReadMessage() {
	unsigned char len_buf[4];
	unsigned char *buf = NULL;
	unsigned long msg_len;
	read_monitor.Enter();
	try {
		if (ReadData(len_buf, 0, 4) != 4)
			throw MessageException("Unable to read data");
		unsigned long msg_len_net = *((unsigned int *)len_buf);
		msg_len = ntohl(msg_len_net);
		buf = new unsigned char[msg_len];
		if (ReadData(buf, 0, msg_len) != msg_len)
			throw MessageException("Unable to read data");
	} catch (...) {
		read_monitor.Exit();
		if (buf != NULL)
			delete[] buf;
		throw;
	}
	read_monitor.Exit();

	MessageBuffer *rv = new MessageBuffer();
	try {
		rv->SetData(buf, msg_len);
	} catch (...) {
		delete[] buf;
		delete rv;
		throw;
	}
	delete[] buf;
	return rv;
}
void TellMasterThatWorkerStartedAWorkUnit( MessageBuffer &mb, CDSInfo *pInfo, WUIndexType iWU )
{
    mb.setLen( 0 );
    PrepareDistributeWorkHeader( &mb, DW_SUBPACKETID_WU_STARTED );
    mb.write( &iWU, sizeof( iWU ) );
    VMPI_SendData( mb.data, mb.getLen(), VMPI_MASTER_ID, k_eVMPISendFlags_GroupPackets );
}
void PreDistributeWorkSync( CDSInfo *pInfo )
{
    if ( g_bMPIMaster )
    {
        // Send a message telling all the workers we're ready to go on this DistributeWork call.
        MessageBuffer mb;
        PrepareDistributeWorkHeader( &mb, DW_SUBPACKETID_MASTER_READY );
        VMPI_SendData( mb.data, mb.getLen(), VMPI_PERSISTENT );
    }
    else
    {
        if ( g_iVMPIVerboseLevel >= 1 )
            Msg( "PreDistributeWorkSync: waiting for master\n" );

        // Wait for the master's message saying it's ready to go.
        while ( g_iMasterReadyForDistributeWorkCall < g_iCurDSInfo )
        {
            VMPI_DispatchNextMessage();
        }

        if ( g_iVMPIVerboseLevel >= 1 )
            Msg( "PreDistributeWorkSync: master ready\n" );

        // Now tell the master we're ready.
        MessageBuffer mb;
        PrepareDistributeWorkHeader( &mb, DW_SUBPACKETID_WORKER_READY );
        VMPI_SendData( mb.data, mb.getLen(), VMPI_MASTER_ID );
    }
}
예제 #6
0
파일: main.cpp 프로젝트: JohannesEbke/a4
 // Called when the metadata object is about to be written
 // FIll the fields on the metadata
 virtual void compute_info(const MessageBuffer& buffer)
 {
     ProcessingStep& p = *_processing_step;
     
     p.set_name("root2a4");
 
     p.set_walltime((chrono::steady_clock::now() - _start_wallclock).count());
     p.set_cputime((chrono::thread_clock::now() - _start_cpuclock).count());
     
     p.set_input_events(_input_events);
     p.set_input_bytes_read(_input_bytes_read);
     
     _metadata.set_event_count(buffer.size());
     
     if (buffer.size() >= 1) {
         if (_field_run) {
             auto run_number = _refl->GetUInt32(*buffer[0], _field_run);
             _metadata.add_run(run_number);
             
             auto* full_period = get_period(run_number);
             std::string period = full_period;
             
             if (period != "UNK") {
                 period = period[0];
             }
             
             _metadata.add_period(period);
             _metadata.add_subperiod(full_period);
         }
         if (_field_mc_channel && _refl->HasField(*buffer[0], _field_mc_channel)) 
             _metadata.add_mc_channel(_refl->GetUInt32(*buffer[0], _field_mc_channel));
     }
 }
예제 #7
0
파일: LedHandler.cpp 프로젝트: cbm/KArch
  void LedHandler::process_messages()
  {
      MessageBuffer* buf = _blk->getBuffer();
    //  cout << "led process" <<endl;
      google::protobuf::Message* cur = buf->remove_head();
      while(cur != 0)
      {
	  if(cur->GetTypeName() != "LedChangeMessage")
	  {
	      cout << "not led" << endl;
	      delete cur;
	      cur = buf->remove_head();
	      continue;
	  }

	  LedChangeMessage* led_change = (LedChangeMessage*)cur;

	  for(int i = 0; i < led_change->leds_size(); i++)
	  {

	      setLed(led_change->leds(i).chain(),led_change->leds(i).color());

	  }

	  delete cur;
	  cur = buf->remove_head();

      }


  }
예제 #8
0
void ChatRoom::Deliver(const ChatMessage& chat)
{
    MessageBuffer msgs;
    auto ptr = std::unique_ptr<Message>(new ChatMessage(chat));
    msgs.Push(ptr);

    for (auto& user : _users)
        user->Deliver(msgs);
}
예제 #9
0
bool Netstream::write(const std::string &data)
{
	MessageBuffer msg;
	if (msg.set_body_length(data.size())) {
		memcpy(msg.body(), data.c_str(), data.size());
		boost::asio::async_write(sock_, boost::asio::buffer(msg.data(), msg.length()), boost::bind(&Netstream::handle_write, this, boost::asio::placeholders::error));
		return true;
	}
	return false;
}
예제 #10
0
void MuddComm::ProcessMessage(const TimeMessage& timeMsg)
{
    MessageBuffer msgs;
    auto now = time(0);
    auto s = ctime(&now);
    auto timeChat = std::unique_ptr<Message>(new ChatMessage(s));
    
    msgs.Push(timeChat);

    Deliver(msgs);
}
예제 #11
0
void SendQDirInfo()
{
	char cPacketID[2] = { VMPI_SHARED_PACKET_ID, VMPI_SUBPACKETID_DIRECTORIES };

	MessageBuffer mb;
	mb.write( cPacketID, 2 );
	mb.write( gamedir, strlen( gamedir ) + 1 );
	mb.write( qdir, strlen( qdir ) + 1 );

	VMPI_SendData( mb.data, mb.getLen(), VMPI_PERSISTENT );
}
void WorldSocket::Start()
{
    AsyncRead();

    MessageBuffer initializer;
    ServerPktHeader header(ServerConnectionInitialize.size(), 0);
    initializer.Write(header.header, header.getHeaderLength() - 2);
    initializer.Write(ServerConnectionInitialize.c_str(), ServerConnectionInitialize.length());

    std::unique_lock<std::mutex> dummy(_writeLock, std::defer_lock);
    QueuePacket(std::move(initializer), dummy);
}
예제 #13
0
void AuthSession::SendPacket(ByteBuffer& packet)
{
    if (!IsOpen())
        return;

    if (!packet.empty())
    {
        MessageBuffer buffer;
        buffer.Write(packet.contents(), packet.size());
        QueuePacket(std::move(buffer));
    }
}
예제 #14
0
파일: connection.cpp 프로젝트: Xenjin/fserv
bool ConnectionInstance::sendRaw(string& message) {
    if (closed)
        return false;

    MessageBuffer* buffer = new MessageBuffer();
    MessagePtr outMessage(buffer);
    buffer->Set(message.data(), message.length());

    writeQueue.push_back(outMessage);
    ev_io_start(loop, writeEvent);
    return true;
}
예제 #15
0
파일: ckm_db_tool.cpp 프로젝트: Samsung/ckm
int DbWrapper::unlock()
{
    // no unlock for system db
    if (m_uid < 5000)
        return CKM_API_SUCCESS;

    int retCode;
    RawBuffer ret = m_logic.unlockUserKey(m_uid, m_pw);
    MessageBuffer buff;
    buff.Push(ret);
    buff.Deserialize(retCode);
    return retCode;
}
예제 #16
0
void AuthSession::SendPacket(ByteBuffer& packet)
{
    if (!IsOpen())
        return;

    if (!packet.empty())
    {
        MessageBuffer buffer;
        buffer.Write(packet.contents(), packet.size());

        std::unique_lock<std::mutex> guard(_writeLock);

        QueuePacket(std::move(buffer), guard);
    }
}
예제 #17
0
MessageBuffer::MessageBuffer(const MessageBuffer& other)
{
	mutex.Lock();
  owner = other.getOwner();
  copyFrom(other);
	mutex.Unlock();
}
예제 #18
0
void MessageBuffer::mergeFrom(const MessageBuffer& other)
{
	mutex.Lock();
 std::vector<Message*>& tmp = other.getBuffer();
 msg_buf->insert(msg_buf->end(),tmp.begin(),tmp.end());

mutex.Unlock();
}
예제 #19
0
void Battlenet::Session::SendResponse(uint32 token, uint32 status)
{
    Header header;
    header.set_token(token);
    header.set_status(status);
    header.set_service_id(0xFE);

    uint16 headerSize = header.ByteSize();
    EndianConvertReverse(headerSize);

    MessageBuffer packet;
    packet.Write(&headerSize, sizeof(headerSize));
    uint8* ptr = packet.GetWritePointer();
    packet.WriteCompleted(header.ByteSize());
    header.SerializeToArray(ptr, header.ByteSize());

    AsyncWrite(&packet);
}
예제 #20
0
void MuddComm::HandleReadBody(const error_code& error)
{
    if (!error)
    {
        MessageBuffer msgs;
        msgs.Deserialize(_readMsg.data());

        ProcessMessageBuffer(msgs);

        // Reserve space for the header, then read it in
        _readMsg.resize(MessageBuffer::HEADER_LENGTH, '\0');
        async_read(_socket, buffer(_readMsg.data(), MessageBuffer::HEADER_LENGTH), bind(&MuddComm::HandleReadHeader, shared_from_this(), _1));
    }
    else
    {
        _room.Leave(shared_from_this());
    }
}
예제 #21
0
void Socket::WritePacketToBuffer(Packet const& packet, MessageBuffer& buffer)
{
    ServerHeader header;
    uint32 sizeOfHeader = SizeOfServerHeader;
    uint32 opcode = packet.GetOpcode();
    uint32 packetSize = packet.size();

    // Reserve space for buffer
    uint8* headerPos = buffer.GetWritePointer();
    buffer.WriteCompleted(sizeOfHeader);

    if (!packet.empty())
        buffer.Write(packet.contents(), packet.size());

    header.Size = packetSize;
    header.Command = opcode;
    memcpy(headerPos, &header, sizeOfHeader);
}
예제 #22
0
int getCertChain(
    ServiceConnection & serviceConnection,
    LogicCommand command,
    int counter,
    const CertificateShPtr &certificate,
    const T &untrustedVector,
    const T &trustedVector,
    bool useTrustedSystemCertificates,
    CertificateShPtrVector &certificateChainVector)
{
    return try_catch([&] {
        MessageBuffer recv;
        auto send = MessageBuffer::Serialize(static_cast<int>(command),
                                             counter,
                                             certificate->getDER(),
                                             untrustedVector,
                                             trustedVector,
                                             useTrustedSystemCertificates);

        int retCode = serviceConnection.processRequest(send.Pop(), recv);
        if (CKM_API_SUCCESS != retCode)
            return retCode;

        int retCommand;
        int retCounter;
        RawBufferVector rawBufferVector;
        recv.Deserialize(retCommand, retCounter, retCode, rawBufferVector);

        if ((counter != retCounter) || (static_cast<int>(command) != retCommand))
            return CKM_API_ERROR_UNKNOWN;

        if (retCode != CKM_API_SUCCESS)
            return retCode;

        for (auto &e: rawBufferVector) {
            CertificateShPtr cert(new CertificateImpl(e, DataFormat::FORM_DER));
            if (cert->empty())
                return CKM_API_ERROR_BAD_RESPONSE;
            certificateChainVector.push_back(cert);
        }

        return retCode;
    });
}
예제 #23
0
void MuddComm::ProcessMessageBuffer(MessageBuffer& msgs)
{
    auto msg_up = msgs.Pop();
    while (msg_up)
    {
        if (msg_up->Header() == ChatMessage::HEADER)
        {
            ChatMessage* msg = dynamic_cast<ChatMessage*>(msg_up.get());
            ProcessMessage(*msg);
        }
        else if (msg_up->Header() == TimeMessage::HEADER)
        {
            TimeMessage* msg = dynamic_cast<TimeMessage*>(msg_up.get());
            ProcessMessage(*msg);
        }

        msg_up = msgs.Pop();
    }
}
예제 #24
0
파일: main.cpp 프로젝트: JohannesEbke/a4
 void write_metadata(shared<a4::io::OutputStream> stream, 
                      const MessageBuffer& buffer)
 {
     compute_info(buffer);
     // Only write metadata if there is at least one message to be written
     // (A4 doesn't deal well with the case of metadata for 0 events yet)
     if (buffer.size() >= 1) {
         stream->metadata(_metadata);
     }
     reset_counters();
 }
예제 #25
0
void Battlenet::Session::AsyncWrite(ServerPacket* packet)
{
    if (!IsOpen())
    {
        delete packet;
        return;
    }

    TC_LOG_DEBUG("session.packets", "%s Sending %s", GetClientInfo().c_str(), PacketToStringHelper(packet).c_str());

    packet->Write();

    MessageBuffer buffer;
    buffer.Write(packet->GetData(), packet->GetSize());
    delete packet;

    std::unique_lock<std::mutex> guard(_writeLock);

    _crypt.EncryptSend(buffer.GetReadPointer(), buffer.GetActiveSize());

    QueuePacket(std::move(buffer), guard);
}
예제 #26
0
bool WorldSocket::Update()
{

	EncryptablePacket* queued;
	MessageBuffer buffer;
	while (_bufferQueue.Dequeue(queued))
	{
		ServerPktHeader header(queued->size() + 2, queued->GetOpcode());
		if (queued->NeedsEncryption())
			_authCrypt.EncryptSend(header.header, header.getHeaderLength());

		if (buffer.GetRemainingSpace() < queued->size() + header.getHeaderLength())
		{
			QueuePacket(std::move(buffer));
			buffer.Resize(4096);
		}

		if (buffer.GetRemainingSpace() >= queued->size() + header.getHeaderLength())
		{
			buffer.Write(header.header, header.getHeaderLength());
			if (!queued->empty())
				buffer.Write(queued->contents(), queued->size());
		}
		else    // single packet larger than 4096 bytes
		{
			MessageBuffer packetBuffer(queued->size() + header.getHeaderLength());
			packetBuffer.Write(header.header, header.getHeaderLength());
			if (!queued->empty())
				packetBuffer.Write(queued->contents(), queued->size());

			QueuePacket(std::move(packetBuffer));
		}

		delete queued;
	}

	if (buffer.GetActiveSize() > 0)
		QueuePacket(std::move(buffer));

    if (!BaseSocket::Update())
        return false;

    
       
        if (_queryFuture.valid() && _queryFuture.wait_for(std::chrono::seconds(0)) == std::future_status::ready)
        {
			auto callback = _queryCallback;
            _queryCallback = nullptr;
            callback(_queryFuture.get());
        }
    

    return true;
}
예제 #27
0
int main()
{
    Foo foo;

    MessageBuffer mb;

    std::ostringstream ostr;

    MsgJoinReq msgJoinReq("foo", 1234);
    msgJoinReq.encode(ostr);

    MsgJoinAccept msgJoinAccept(4321);
    msgJoinAccept.encode(ostr);

    MsgJoinReject msgJoinReject;
    msgJoinReject.encode(ostr);

    mb.append(ostr.str());
    std::cout << ostr.str() << std::endl;

    try 
    {
	while (true)
	{
	    std::string message = mb.getMessage();
	    std::cout << "Message: " << message << std::endl;
	    std::istringstream istr(message);
	    Message* msg = Message::decode(istr);
	    msg->handle(&foo, 0);
	}
    }
    catch (MessageNotReady& ex)
    {
	std::cout << "Message not ready" << std::endl;
    }

    return 0;
}
예제 #28
0
void WorldSocket::WritePacketToBuffer(WorldPacket const& packet, MessageBuffer& buffer)
{
    ServerPktHeader header;
    uint32 sizeOfHeader = SizeOfServerHeader[_authCrypt.IsInitialized()];
    uint32 opcode = packet.GetOpcode();
    uint32 packetSize = packet.size();

    // Reserve space for buffer
    uint8* headerPos = buffer.GetWritePointer();
    buffer.WriteCompleted(sizeOfHeader);

    if (packetSize > 0x400)
    {
        CompressedWorldPacket cmp;
        cmp.UncompressedSize = packetSize + 4;
        cmp.UncompressedAdler = adler32(adler32(0x9827D8F1, (Bytef*)&opcode, 4), packet.contents(), packetSize);

        // Reserve space for compression info - uncompressed size and checksums
        uint8* compressionInfo = buffer.GetWritePointer();
        buffer.WriteCompleted(sizeof(CompressedWorldPacket));

        uint32 compressedSize = CompressPacket(buffer.GetWritePointer(), packet);

        cmp.CompressedAdler = adler32(0x9827D8F1, buffer.GetWritePointer(), compressedSize);

        memcpy(compressionInfo, &cmp, sizeof(CompressedWorldPacket));
        buffer.WriteCompleted(compressedSize);
        packetSize = compressedSize + sizeof(CompressedWorldPacket);

        opcode = SMSG_COMPRESSED_PACKET;
    }
    else if (!packet.empty())
        buffer.Write(packet.contents(), packet.size());

    if (_authCrypt.IsInitialized())
    {
        header.Normal.Size = packetSize;
        header.Normal.Command = opcode;
        _authCrypt.EncryptSend((uint8*)&header, sizeOfHeader);
    }
    else
    {
        header.Setup.Size = packetSize + 4;
        header.Setup.Command = opcode;
    }

    memcpy(headerPos, &header, sizeOfHeader);
}
void DistributeWork_Master( CDSInfo *pInfo, ProcessWorkUnitFn processFn, ReceiveWorkUnitFn receiveFn )
{
    pInfo->m_WorkerInfo.m_pProcessFn = processFn;
    pInfo->m_MasterInfo.m_ReceiveFn = receiveFn;

    VMPITracker_Start( (int) pInfo->m_nWorkUnits );

    g_bMasterDistributingWork = true;
    g_pCurDistributorMaster->DistributeWork_Master( pInfo );
    g_bMasterDistributingWork = false;

    VMPITracker_End();

    // Tell all workers to move on.
    MessageBuffer mb;
    PrepareDistributeWorkHeader( &mb, DW_SUBPACKETID_MASTER_FINISHED );
    VMPI_SendData( mb.data, mb.getLen(), VMPI_PERSISTENT );

    // Clear the master's local completed work unit list.
    CMasterWorkUnitCompletedList *pList = g_MasterWorkUnitCompletedList.Lock();
    pList->m_CompletedWUs.RemoveAll();
    g_MasterWorkUnitCompletedList.Unlock();
}
예제 #30
0
void Battlenet::Session::SendRequest(uint32 serviceHash, uint32 methodId, pb::Message const* request)
{
    Header header;
    header.set_service_id(0);
    header.set_service_hash(serviceHash);
    header.set_method_id(methodId);
    header.set_size(request->ByteSize());
    header.set_token(_requestToken++);

    uint16 headerSize = header.ByteSize();
    EndianConvertReverse(headerSize);

    MessageBuffer packet;
    packet.Write(&headerSize, sizeof(headerSize));
    uint8* ptr = packet.GetWritePointer();
    packet.WriteCompleted(header.ByteSize());
    header.SerializeToArray(ptr, header.ByteSize());
    ptr = packet.GetWritePointer();
    packet.WriteCompleted(request->ByteSize());
    request->SerializeToArray(ptr, request->ByteSize());

    AsyncWrite(&packet);
}