static void pwrsrv_SubAdd( rpvd_sMsgSubAdd *msg) { rpvd_sMsgAny rmsg; pwr_tAName name; pwr_tUInt32 asize, aoffs, aelem; pwr_tTypeId atid; pwr_tStatus sts; pwrsrv_sSubItem *si; void *p; pwr_tRefId dlid; rmsg.Type = rpvd_eMsg_Status; rmsg.Id = msg->Id; /* Check that this rix doesn't exist */ for ( si = pwrsrv_sublist; si; si = si->next) { if ( si->rix == msg->Rix) { return; } } sts = gdh_ObjidToName( msg->Oid, name, sizeof(name), cdh_mName_volumeStrict); if ( EVEN(sts)) { rmsg.Status = sts; udp_Send( (char *)&rmsg, sizeof(rmsg)); return; } if ( strcmp( msg->Attribute, "") != 0) { strcat( name, "."); strcat( name, msg->Attribute); sts = gdh_GetAttributeCharacteristics( name, &atid, &asize, &aoffs, &aelem); if ( EVEN(sts)) { rmsg.Status = sts; udp_Send( (char *)&rmsg, sizeof(rmsg)); return; } } else { sts = gdh_GetObjectSize( msg->Oid, &asize); if ( EVEN(sts)) { rmsg.Status = sts; udp_Send( (char *)&rmsg, sizeof(rmsg)); return; } } /* Direct link to atttribute */ sts = gdh_RefObjectInfo( name, &p, &dlid, asize); if ( EVEN(sts)) { rmsg.Status = sts; udp_Send( (char *)&rmsg, sizeof(rmsg)); return; } /* Insert first in sublist */ si = (pwrsrv_sSubItem *) calloc( 1, sizeof(pwrsrv_sSubItem)); si->oid = msg->Oid; strcpy( si->attribute, msg->Attribute); si->size = asize; si->rix = msg->Rix; si->p = p; si->dlid = dlid; si->next = pwrsrv_sublist; if ( si->next) si->next->prev = si; pwrsrv_sublist = si; printf( "SubAdd: %d %s\n", msg->Rix, name); rmsg.Status = GDH__SUCCESS; udp_Send( (char *)&rmsg, sizeof(rmsg)); }
void remote_pvd_pwrcli::subAssociateBuffer( co_procom *pcom, void **buff, int oix, int offset, int size, pwr_tSubid subid) { rpvd_sMsgSubAdd msg; rpvd_sMsgAny *rmsg; pwr_tStatus sts; pwr_tAttrRef aref; pwr_tOName aname; pwr_tCid cid; pwr_tUInt32 osize; msg.Type = rpvd_eMsg_SubAdd; msg.Id = rpvd_id++; msg.Oid.oix = oix; msg.Oid.vid = rpvd_vid; sts = gdh_GetObjectSize( msg.Oid, &osize); if ( EVEN(sts)) { pcom->provideStatus( sts); return; } memset( &aref, 0, sizeof(aref)); aref.Objid = msg.Oid; aref.Offset = offset; aref.Size = size; if ( (int) osize == size) aref.Flags.b.Object = 1; sts = gdh_GetObjectClass( msg.Oid, &cid); if ( EVEN(sts)) { pcom->provideStatus( sts); return; } if ( aref.Flags.b.Object) strcpy( aname, ""); else { sts = gdh_ClassAttrrefToAttr( cid, &aref, aname, sizeof(aname)); if ( EVEN(sts)) { pcom->provideStatus( sts); return; } } strcpy( msg.Attribute, aname); msg.Rix = subid.rix; msg.Size = size; if ( pvd_cLog) logg( "AssoBuff", msg.Oid.oix, aname); sts = udp_Request( (char *)&msg, sizeof(msg), (char **)&rmsg); if ( EVEN(sts)) { pcom->provideStatus( sts); return; } if ( sts == REM__TIMEOUT) { pcom->provideStatus( REM__UDPNOCON); return; } while ( rmsg->Id != msg.Id) { dispatch( pcom, (rpvd_sMsg *)rmsg); sts = udp_Receive( (char **)&rmsg, 1000); if ( sts == REM__TIMEOUT) { pcom->provideStatus( REM__DISORDER); return; } } if ( rmsg->Type != rpvd_eMsg_Status) { pcom->provideStatus( REM__DISORDER); return; } if ( EVEN( rmsg->Status)) { pcom->provideStatus( rmsg->Status); return; } pcom->provideStatus( rmsg->Status); if ( ODD(rmsg->Status)) { // Add to local list subitem s(size, cid, offset, msg.Attribute, msg.Oid); rpvd_sublist[subid.rix] = s; *buff = rpvd_sublist[subid.rix].m_p; } }