Example #1
0
Message *GetMdsMsg(int id, int *status) {
  MsgHdr header;
  Message *msg = 0;
  int msglen = 0;
  //MdsSetClientAddr(0);
  *status = 0;
  *status = GetBytes(id, (void *)&header, sizeof(MsgHdr));
  if (*status &1){
    if ( Endian(header.client_type) != Endian(ClientType()) ) FlipHeader(&header);
#ifdef DEBUG
    printf("msglen = %d\nstatus = %d\nlength = %d\nnargs = %d\ndescriptor_idx = %d\nmessage_id = %d\ndtype = %d\n",
               header.msglen,header.status,header.length,header.nargs,header.descriptor_idx,header.message_id,header.dtype);
    printf("client_type = %d\nndims = %d\n",header.client_type,header.ndims);
#endif
    if (CType(header.client_type) > CRAY_CLIENT || header.ndims > MAX_DIMS)
    {
      DisconnectConnection(id);
      fprintf(stderr,"\rGetMdsMsg shutdown connection %d: bad msg header, header.ndims=%d, client_type=%d\n",id,header.ndims,CType(header.client_type));
      *status = 0;
      return 0;
    }  
    msglen = header.msglen;
    msg = malloc(header.msglen);
    msg->h = header;
    *status = GetBytes(id, msg->bytes, msglen - sizeof(MsgHdr));
    if (*status & 1 && IsCompressed(header.client_type))
    {
      Message *m;
      unsigned long dlen;
      memcpy(&msglen, msg->bytes, 4);
      if (Endian(header.client_type) != Endian(ClientType()))
        FlipBytes(4,(char *)&msglen);
      m = malloc(msglen);
      m->h = header;
      dlen = msglen - sizeof(MsgHdr);
      *status = uncompress(m->bytes, &dlen, msg->bytes + 4, header.msglen - sizeof(MsgHdr) - 4) == 0;
      if (*status & 1)
      {
	m->h.msglen = msglen;
        free(msg);
	msg = m;
      }
      else
	free(m);
    }
    if (*status & 1 && (Endian(header.client_type) != Endian(ClientType())))
      FlipData(msg);
  }
  return msg;
}
Example #2
0
DualRPC::Variant GlobalServerObject::login(const DualRPC::Variant &args)
{
	ClientInfo info;

	info.name = args.item("name").toString();
	info.domain = args.item("domain").toString();
	info.id = (unsigned int)args.item("login").toInt();
	info.type = ClientType(args.item("type").toInt());
	info.objectPtr = args.item("object").toObject();

	if(info.id == 0)
		info.id = getNextClientID();
	m_clients[info.id] = info;

	return DualRPC::Variant("login", (int)info.id).
		add("object", DualRPC::IObjectPtr(new ServerObject(shared_from_this())));
}