コード例 #1
0
ファイル: remote_pvd_pwrsrv.c プロジェクト: jordibrus/proview
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));
}
コード例 #2
0
ファイル: remote_pvd_pwrcli.cpp プロジェクト: Strongc/proview
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;
  }
}