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; }
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()))); }