Ejemplo n.º 1
0
void MSG_db1_data::set_channel(char *chname)
{
  if (! this->has_channel(chname))
  {
    if (dirname)
      std::cerr << "Channel not present in " << dirname << std::endl;
  }
  char iname[PATH_MAX];
  sprintf(iname, "%s/%s.Calibration", dirname, chname);
  Calibration = iniparser_new(iname);
  if (Calibration == 0)
  {
    std::cerr << "No such file: " << iname << std::endl;
    std::cerr << "No Calibration performed for " << chname << std::endl;
  }
  sprintf(iname, "%s/%s.RAW", dirname, chname);
  FILE *fp = fopen(iname, "r");
  if (! fp)
  {
    std::cerr << "Cannot open file: " << iname << std::endl;
    return;
  }
  rawdata = (unsigned short *) (new unsigned char[chfstat.st_size]);
  if (fread(rawdata, chfstat.st_size, 1, fp) != 1)
  {
    std::cerr << "Cannot read file: " << iname << std::endl;
    return;
  }
  fclose(fp);
  this->chnum = get_channel_number(chname);
  ncalval = (int) (pow(2.0, (double) get_INFO_image_bitsperpixel( )));
  cal_values = new float[ncalval];

  for (int i = 0; i < ncalval; i ++)
    cal_values[i] = get_channel_Calibration_value_calibrated(i);

  return;
}
Ejemplo n.º 2
0
uint8_t http_process_url(char* first_char, uint8_t length, void* jsonvoid) {
    char temp[80];
    Json* json = (Json*) jsonvoid;
    uint8_t temp_len = length;
    
    HttpApiInfo api_info;
    http_api_info_ctor(&api_info);
    
    strncpy(temp, first_char, 80);
    
    if(!strncmp(temp, "/a/", 3)) {
        //ok, we have an api command
        advance_string(temp, &temp_len, 3);
        //!printf("we have a web API command: leftover %s\n", temp);
        
        if( ((temp[0] == 'o') || (temp[0] == 'i')) && (temp[1] == '/') ) {
            //we have an input or an output being specified
            //!printf("input/output status: %c\n", temp[0]);
            http_api_info_set_io(&api_info, ( (temp[0] == 'i') ? INPUT : OUTPUT ));
            
            advance_string(temp, &temp_len, 2);
            //!printf("%s\n",temp);
            //now we need to find the channel number
            uint8_t testnum = get_channel_number(temp,&temp_len);
            Io_enum io = (Io_enum) http_api_info_get_io(&api_info);
            
            if ( (testnum > 0) && (http_api_info_set_chan_num(&api_info, testnum) > 0) ) {
                Channel* tempchan = get_channel_from_memory(io, testnum);
                
                //make sure a channel according to those specifications exists.  if not, return no match.	
                if ( tempchan == NULL )	return 0;
                
                if (!strncmp(temp, "eqparams", 7)) {
                	json_encode_eq(tempchan, json);
                    //!printf("eqparams!!\n");
                    return 1;
                } else if(!strncmp(temp,"modeq",5)) {
                	advance_string(temp, &temp_len, 5);
                    extract_query_params(temp, &temp_len, http_api_info_get_params(&api_info));
                    float band_num = map_get_value_by_key(http_api_info_get_params(&api_info),"b");
                    float eq_type = map_get_value_by_key(http_api_info_get_params(&api_info),"t");
                    float eq_q = map_get_value_by_key(http_api_info_get_params(&api_info),"q");
                    float eq_freq = map_get_value_by_key(http_api_info_get_params(&api_info),"f");
                    float eq_gain = map_get_value_by_key(http_api_info_get_params(&api_info),"g");
                    float eq_enable = map_get_value_by_key(http_api_info_get_params(&api_info),"e");
                    
                    if( (band_num >= 1) && (band_num <= 4 ) ) {
                    	//EqBand* temp_eq_band = channel_get_eqband(tempchan, (uint8_t) band_num);
                    	
                    	//eqband_set_type(temp_eq_band, (Eq_type_enum)(eq_type));
                    	//eqband_set_bw(temp_eq_band, eq_q);
                    	//eqband_set_freq(temp_eq_band, eq_freq);
                    	//eqband_set_gain(temp_eq_band, eq_gain);
                    	//( (uint8_t)eq_enable == ENABLED) ? eqband_enable(temp_eq_band) : eqband_disable(temp_eq_band);
                    	
                    	Api_set_eqband_type(tempchan, (uint8_t) band_num, (Eq_type_enum)(eq_type));
                    	Api_set_eqband_bw(tempchan, (uint8_t) band_num, eq_q);
                    	Api_set_eqband_freq(tempchan, (uint8_t)band_num, eq_freq);
                    	Api_set_eqband_gain(tempchan, (uint8_t)band_num, eq_gain);
                    	( (uint8_t)eq_enable == ENABLED) ? Api_enable_eqband(tempchan, (uint8_t)band_num) : Api_disable_eqband(tempchan, (uint8_t)band_num);
                    	
                    	
                    	
                    	json_encode_ok(json);
                    	return 1;
                    } else return 0;
                    
                	
                } else if (!strncmp(temp, "compparams", 9)) {
                	json_encode_comp(tempchan, json);
                    //!printf("compparams!!\n");
                    return 1;
                } else if (!strncmp(temp,"modcomp",7)) {
                	//!printf("modcomp!\n");
                	advance_string(temp, &temp_len, 7);
                	
                    extract_query_params(temp, &temp_len, http_api_info_get_params(&api_info));
                    float ratio = map_get_value_by_key(http_api_info_get_params(&api_info),"r");
                    float threshold = map_get_value_by_key(http_api_info_get_params(&api_info),"t");
                    float attack = map_get_value_by_key(http_api_info_get_params(&api_info),"a");
                    float release = map_get_value_by_key(http_api_info_get_params(&api_info),"rls");
                    float gain = map_get_value_by_key(http_api_info_get_params(&api_info),"g");
                    float enable = map_get_value_by_key(http_api_info_get_params(&api_info),"e");

					Comp* temp_comp = channel_get_comp(tempchan);
                    comp_set_ratio(temp_comp, ratio);
                    comp_set_threshold(temp_comp,threshold);
                    comp_set_attack(temp_comp,attack);
                    comp_set_release(temp_comp,release);
                    comp_set_gain(temp_comp, gain);
                    ( (uint8_t)enable == ENABLED) ? comp_enable(temp_comp) : comp_disable(temp_comp);
                    	
                    json_encode_ok(json);
                    return 1;
                } else if (!strncmp(temp,"rename?name=",12)) {
                    //!printf("rename channel!!!");
                    advance_string(temp, &temp_len, 12);
                	//!printf("\nname: %s\n", temp);
                	
                	char ts[20];
                	strcpy(ts, temp);
                	
                	//allow A-Z, a-z, 0-9, -, _
                	//convert + to space
                	uint8_t j = 0;
                	uint8_t good_length = 0;
                	for(j=0; j < strlen(ts); j++) {
                		if ( ( (ts[j] <= 0x39) && (ts[j] >= 0x30) ) || 
                			 ( (ts[j] <= 0x5A) && (ts[j] >= 0x41) ) ||
                			 ( (ts[j] <= 0x7A) && (ts[j] >= 0x61) ) ||
                			 (ts[j] == 0x20) || (ts[j] == 0x5F) ||
                			 (ts[j] == 0x2D) || (ts[j] == 0x2B)
                			) {
                				if ( ts[j] == 0x2B ) ts[j] = 0x20;
                				good_length++;
                		} else break;
                	}
                	                    
                    channel_set_name(tempchan, ts);
                    json_encode_ok(json);
                    return 1;
                    
                } else {
                    //ERROR
                    //!printf("ERROR: not eqparams, compparams, or rename\n");
                }
                
            } else if (!strncmp(temp, "chanlist", 8)) {
                //return a list of channel data
                if ( io == INPUT) {
                	json_encode_channels(INPUT,NUM_INPUT_CHANNELS, json);
                	return 1;
                } else if ( io == OUTPUT) {
                	json_encode_channels(OUTPUT,NUM_OUTPUT_CHANNELS,json);
                	return 1;
                } else return 0;
                
            } else {
                //ERROR
                //!printf("ERROR: what error is this?\n");
            }
            
        } else if (temp[0] == 's') {
            //!printf("we are requesting a status\n");
            advance_string(temp, &temp_len, 2);
            if(!strncmp(temp,"bob",3)) {
                //!printf("return the bob status info\n");
            } else if(!strncmp(temp,"clip",4)) {
                //!printf("return clip information\n");
            } else {
                //!printf("no matching status api command\n");
            }
            
            
        } else if(temp[0] == 'm' && temp[1] == '/') {
            advance_string(temp, &temp_len, 2);
            //!printf("we are requesting routing matrix\n");
            if ( (http_api_info_set_chan_num(&api_info, get_channel_number(temp, &temp_len))) > 0) {
                //!printf("matrix output chan number: %d \n", http_api_info_get_chan_num(&api_info));
                
                if(!strncmp(temp, "modroute", 8)) {
                    //!printf("now we're modifying a route\n");
                    advance_string(temp, &temp_len, 8);
                    extract_query_params(temp, &temp_len, http_api_info_get_params(&api_info));
                    map_get_value_by_key(http_api_info_get_params(&api_info),"i");
                    char test[5];
                    strncpy(test, "blah",4);
                    map_get_value_by_key(http_api_info_get_params(&api_info), test);
                }
                
            }
            
        } else {
            //ERROR
            //!printf("ERROR: incorrect api command identifier\n");
            return 0;
        }
    } else {
        //printf("we don't have a web API command\n");
        return 0;
        //we don't have an API command... send it to the filesystem
    }
    //!printf("channel number: %d\n\n\n", http_api_info_get_chan_num(&api_info));
    return 0;
}
Ejemplo n.º 3
0
main()
{
   int                  sts, i, zro=0;
   OM_S_OBJID           a_objid[MAXA], b_objid[MAXB], c_objid;
   OM_S_OBJID           resa_objid[MAXA], resb_objid[MAXB], c2_objid;
   OM_S_CHANNUM         chan_a, chan_b;
   OM_S_CHANNUM         chan_resa, chan_resb;
   uword                count, siz;
   char                 *chan_acany,*chan_acbc,*chan_acb,*chan_bca;
   char                 *chan_sbca;
   char                 *chan_resacany,*chan_resacbc,*chan_resacb,*chan_resbca;
   char                 *chan_sca;
   OM_S_CHANSELECT      chansel;
   int		        relindex=0, to=0, from=0;
   OM_S_MESSAGE 	showb,showresb,connect_msg,move_chan_msg;
   uword        	OSnum;
   uword	        minorchan=0;
   
struct connect_struct
       {
	 OM_S_CHANSELECT      to_sel;
	 int		      to_idx;
	 OM_S_OBJID	      fr_objid;
	 uword                fr_os;
	 OM_S_CHANSELECT      fr_sel;
	 int		      fr_idx;
       } connect_args;
struct move_chan_struct
       {
	 OM_S_CHANSELECT      to_sel;
	 OM_S_OBJID	      fr_objid;
	 OMuword              fr_os;
	 OM_S_CHANSELECT      fr_sel;
       } move_chan_args;
   sts = om$runtime_init();
   if (!(sts&1))
   {
      printf (" error in om%runtine_init\n" );
      om$report_error(sts = sts);
      exit();
   }

   OSnum = OM_Gw_TransOSnum_0;
   

   chan_acb  = "A.acb";
   chan_acany  = "A.acany";
   chan_acbc = "A.acbc";
   chan_bca  = "B.bca";
   chan_sbca  = "C.sbca";

   for ( i=0; i<MAXA; i++ )
   {
      sts = om$construct(osname = "OM_TransOS_0",
                         classname = "A",
                         p_objid = &a_objid[i],
                         neighbor = OM_GS_NULL_NEIGHBOR);
      if (!(sts&1))
      {
         printf (" error in om$construct for A\n" );
         om$report_error(sts = sts);
         printf (" iteration : %d \n", i );
         exit();
      }
   }


   sts = om$get_channel_number(channame = "A.acb",
                               p_channum = &chan_a );
   if (!(sts&1))
   {
      printf (" error in om$get channel_number for acb\n" );
      om$report_error(sts = sts);
      exit();
   }

   sts = om$get_channel_number(channame = "B.bca",
                               p_channum = &chan_b );
   if (!(sts&1))
   {
      printf (" error in om$get_channel_number for bca\n" );
      om$report_error(sts = sts);
      exit();
   }


   for ( i=0; i<MAXB; i++ )
   {
      sts = om$construct(osname = "OM_TransOS_0",
                         classname = "B",
                         p_objid = &b_objid[i],
                         neighbor = OM_GS_NULL_NEIGHBOR);
      if (!(sts&1))
      {
         printf (" error in om$construct for B\n" );
         om$report_error(sts = sts);
         printf (" iteration : %d \n", i );
         exit();
      }
   } /* for */

/* Now I need to build the following relations for the test:
	a1 - b0    	Dipole
	a2,a3 - b1  	TO:FROM
	a4 - b2,b3	FROM:TO
	a5 - b4         Dipole
	a10 - b5	Dipole
*/

	connect_args.to_sel.type = OM_e_num;
	connect_args.to_sel.u_sel.number = chan_b;
	connect_args.to_idx = 0;
	connect_args.fr_objid = a_objid[1];
	connect_args.fr_os = OM_Gw_current_OS;
	connect_args.fr_sel.type = OM_e_num;
	connect_args.fr_sel.u_sel.number = chan_a;
	connect_args.fr_idx            = 0;

	sts = om$make_message(classname = "Root",		
			      methodname = "connect",		
			      size = sizeof( struct connect_struct),
			      p_arglist = &connect_args,	
			      p_msg = &connect_msg );


	sts = om$send (msg = &connect_msg,			
		       senderid = a_objid[1],			
		       targetid = b_objid[0] );

   if (!(sts&1))
      {
      printf (" error in om$send (connect) for B\n" );
      om$report_error(sts = sts);
      exit();
      }
   printf ("A1 connected to B0\n");

   printf ("----- Dumping A[1]'s acb channel\n");
   OMT_dump_relation( OM_Gw_current_OS, a_objid[1], "acb" );

   printf ("----- Dumping B[0]'s bca channel\n");
   OMT_dump_relation( OM_Gw_current_OS, b_objid[0], "bca" );
   
     
for(i=2; i<4; i++)
{
	connect_args.to_sel.type = OM_e_name;
	connect_args.to_sel.u_sel.name = chan_bca;
	connect_args.to_idx = 0;
	connect_args.fr_objid = a_objid[i];
	connect_args.fr_os = OM_Gw_current_OS;
	connect_args.fr_sel.type = OM_e_name;
	connect_args.fr_sel.u_sel.name = chan_acb;
	connect_args.fr_idx            = 0;

	sts = om$send (msg = &connect_msg,			
		       senderid = a_objid[i],			
		       targetid = b_objid[1] );
 
   switch(sts)
   {
      case OM_I_ADDEDATEND:
      case OM_S_SUCCESS:  printf("A%d connected to B1\n", i);
      			  break;
      case OM_E_CHAN_NOTEMPTY: printf("B1 is already connected\n");
      			       break;
      case OM_E_INVCHAN:  printf("an invalid channel was used\n");
      		          break;
      case OM_E_REL_MISMATCH:  printf("relations don't match\n");
      				break;
      default:				
         printf("error in om$send (connect) for A%d to B1\n", i);
         om$report_error(sts = sts);
   }
   printf ("----- Dumping A[%d]'s acb channel\n",i);
   OMT_dump_relation( OM_Gw_current_OS, a_objid[i], "acb" );

   printf ("----- Dumping B[1]'s bca channel\n");
   OMT_dump_relation( OM_Gw_current_OS, b_objid[1], "bca" );
}
      

for(i=2; i<4; i++)
{
	connect_args.to_sel.type = OM_e_name;
	connect_args.to_sel.u_sel.name = chan_bca;
	connect_args.to_idx = 0;
	connect_args.fr_objid = a_objid[4];
	connect_args.fr_os = OM_Gw_current_OS;
	connect_args.fr_sel.type = OM_e_name;
	connect_args.fr_sel.u_sel.name = chan_acb;
	connect_args.fr_idx            = 0;

	sts = om$send (msg = &connect_msg,			
		       senderid = a_objid[4],			
		       targetid = b_objid[i] );

   switch(sts)
   {
      case OM_I_ADDEDATEND:
      case OM_S_SUCCESS:  printf("A4 connected to B%d\n", i);
      			  break;
      case OM_E_CHAN_NOTEMPTY: printf("Channel is not empty\n");
      			       break;
      case OM_E_INVCHAN:  printf("an invalid channel was used\n");
      		          break;
      case OM_E_REL_MISMATCH:  printf("relations don't match\n");
      				break;
      default:				
         printf("error in om$send (connect) for A4 to B%d\n", i);
         om$report_error(sts = sts);
   }
   printf ("----- Dumping A[4]'s acb channel\n");
   OMT_dump_relation( OM_Gw_current_OS, a_objid[4], "acb" );

   printf ("----- Dumping B[%d]'s bca channel\n",i);
   OMT_dump_relation( OM_Gw_current_OS, b_objid[i], "bca" );
}

	connect_args.to_sel.type = OM_e_name;
	connect_args.to_sel.u_sel.name = chan_bca;
	connect_args.to_idx = 0;
	connect_args.fr_objid = a_objid[5];
	connect_args.fr_os = OM_Gw_current_OS;
	connect_args.fr_sel.type = OM_e_name;
	connect_args.fr_sel.u_sel.name = chan_acb;
	connect_args.fr_idx            = 0;

	sts = om$send (msg = &connect_msg,			
		       senderid = a_objid[5],			
		       targetid = b_objid[4] );
 
   if (!(sts&1))
      {
      printf (" error in om$send (connect)\n");
      om$report_error(sts = sts);
      exit();
      }
   printf ("A5 connected to B4\n");

   printf ("----- Dumping A[5]'s acb channel\n");
   OMT_dump_relation( OM_Gw_current_OS, a_objid[5], "acb" );

   printf ("----- Dumping B[4]'s bca channel\n");
   OMT_dump_relation( OM_Gw_current_OS, b_objid[4], "bca" );

	connect_args.to_sel.type = OM_e_name;
	connect_args.to_sel.u_sel.name = chan_bca;
	connect_args.to_idx = 0;
	connect_args.fr_objid = a_objid[10];
	connect_args.fr_os = OM_Gw_current_OS;
	connect_args.fr_sel.type = OM_e_name;
	connect_args.fr_sel.u_sel.name = chan_acb;
	connect_args.fr_idx            = 0;

	sts = om$send (msg = &connect_msg,			
		       senderid = a_objid[10],			
		       targetid = b_objid[5] );
   if (!(sts&1))
      {
      printf (" error in om$send (connect)\n");
      om$report_error(sts = sts);
      exit();
      }

   printf ("A10 connected to B5\n");

   printf ("----- Dumping A[10]'s acb channel\n");
   OMT_dump_relation( OM_Gw_current_OS, a_objid[10], "acb" );

   printf ("----- Dumping B[5]'s bca channel\n");
   OMT_dump_relation( OM_Gw_current_OS, b_objid[5], "bca" );

/******************************************************************
Test # 1 - Source is a singleton.
*******************************************************************/

   printf ("\n\n******* Test 1 - A0.acb to A6.acb but A0 is empty\n");

	move_chan_args.to_sel.type = OM_e_name;
	move_chan_args.to_sel.u_sel.name = chan_acb;
	move_chan_args.fr_objid = a_objid[0];
	move_chan_args.fr_os = OM_Gw_current_OS;
	move_chan_args.fr_sel.type = OM_e_name;
	move_chan_args.fr_sel.u_sel.name = chan_acb;

	sts = om$make_message(classname = "Root",		
			      methodname = "move_chan",		
			      size = sizeof( struct move_chan_struct),
			      p_arglist = &move_chan_args,	
			      p_msg = &move_chan_msg );

	sts = om$send (msg = &move_chan_msg,			
		       senderid = a_objid[0],			
		       targetid = a_objid[6] );

   switch(sts)
   {
      case OM_I_CHAN_EMPTY:
      case OM_S_SUCCESS:  printf("\n\nA0.acb moved to A6.acb\n");
      			  break;
      case OM_E_CHAN_NOTEMPTY: printf("Channel is not empty\n");
      			       break;
      case OM_E_INVCHAN:  printf("an invalid channel was used\n");
      		          break;
      case OM_E_REL_MISMATCH:  printf("relations don't match\n");
      				break;
      default:				
         printf("error in om$send (move_chan) for A0 to A6\n");
         om$report_error(sts = sts);
   }
   printf ("----- Dumping A[0]'s acb channel\n");
   OMT_dump_relation( OM_Gw_current_OS, a_objid[0], "acb" );

   printf ("----- Dumping A[6]'s acb channel\n");
   OMT_dump_relation( OM_Gw_current_OS, a_objid[6], "acb" );


/******************************************************************
Test # 2 - Source is a dipole.
*******************************************************************/

   printf ("\n\n******* Test 2 - A1.acb to A7.acb\n");

	move_chan_args.to_sel.type = OM_e_name;
	move_chan_args.to_sel.u_sel.name = chan_acb;
	move_chan_args.fr_objid = a_objid[1];
	move_chan_args.fr_os = OM_Gw_current_OS;
	move_chan_args.fr_sel.type = OM_e_name;
	move_chan_args.fr_sel.u_sel.name = chan_acb;

	sts = om$send (msg = &move_chan_msg,			
		       senderid = a_objid[1],			
		       targetid = a_objid[7] );

   switch(sts)
   {
      case OM_S_SUCCESS:  printf("\n\nA1.acb moved to A7.acb\n");
      			  break;
      case OM_E_CHAN_NOTEMPTY: printf("Channel is not empty\n");
      			       break;
      case OM_E_INVCHAN:  printf("an invalid channel was used\n");
      		          break;
      case OM_E_REL_MISMATCH:  printf("relations don't match\n");
      				break;
      default:				
         printf("error in om$send (move_chan) for A1 to A7\n");
         om$report_error(sts = sts);
   }
   printf ("----- Dumping A[1]'s acb channel\n");
   OMT_dump_relation( OM_Gw_current_OS, a_objid[1], "acb" );

   printf ("----- Dumping A[7]'s acb channel\n");
   OMT_dump_relation( OM_Gw_current_OS, a_objid[7], "acb" );

   sts = om$make_message(classname = "B",
                         methodname = "show_b",
                         size = 0,
                         p_arglist = 0,
                         p_msg = &showb);
   if(!(sts&1))
   {
	printf("error in om%make_message for show_b\n");
	om$report_error(sts = sts);
	exit();
   }
   chansel.type = OM_e_name;
   chansel.u_sel.name = chan_acb;
   sts = om$send(mode = OM_e_wrt_object,
                 msg = &showb,
                 senderid = a_objid[7],
                 p_chanselect = &chansel);
   if(!(sts&1))
   {
	printf("error in om$send (show_b)\n");
	om$report_error(sts = sts);
	exit();
   }

/******************************************************************
Test # 3 - Source is on the TO side of a relation.
*******************************************************************/

   printf ("\n\n******* Test 3 - A2.acb to A8.acb\n");

	move_chan_args.to_sel.type = OM_e_name;
	move_chan_args.to_sel.u_sel.name = chan_acb;
	move_chan_args.fr_objid = a_objid[2];
	move_chan_args.fr_os = OM_Gw_current_OS;
	move_chan_args.fr_sel.type = OM_e_name;
	move_chan_args.fr_sel.u_sel.name = chan_acb;

	sts = om$send (msg = &move_chan_msg,			
		       senderid = a_objid[2],			
		       targetid = a_objid[8] );

   switch(sts)
   {
      case OM_S_SUCCESS:  printf("\n\nA2.acb moved to A8.acb\n");
      			  break;
      case OM_E_CHAN_NOTEMPTY: printf("Channel is not empty\n");
      			       break;
      case OM_E_INVCHAN:  printf("an invalid channel was used\n");
      		          break;
      case OM_E_REL_MISMATCH:  printf("relations don't match\n");
      				break;
      default:				
         printf("error in om$send (move_chan) for A2 to A8\n");
         om$report_error(sts = sts);
   }
   printf ("----- Dumping A[2]'s acb channel\n");
   OMT_dump_relation( OM_Gw_current_OS, a_objid[2], "acb" );

   printf ("----- Dumping A[8]'s acb channel\n");
   OMT_dump_relation( OM_Gw_current_OS, a_objid[8], "acb" );

   chansel.type = OM_e_name;
   chansel.u_sel.name = chan_acb;
   sts = om$send(mode = OM_e_wrt_object,
                 msg = &showb,
                 senderid = a_objid[8],
                 p_chanselect = &chansel);
   if(!(sts&1))
   {
	printf("error in om$send (show_b)\n");
	om$report_error(sts = sts);
	exit();
   }

/******************************************************************
Test # 4 - Source is on the FROM side of a relation.
*******************************************************************/

   printf ("\n\n******* Test 4 - A4.acb to A9.acb\n");

	move_chan_args.to_sel.type = OM_e_name;
	move_chan_args.to_sel.u_sel.name = chan_acb;
	move_chan_args.fr_objid = a_objid[4];
	move_chan_args.fr_os = OM_Gw_current_OS;
	move_chan_args.fr_sel.type = OM_e_name;
	move_chan_args.fr_sel.u_sel.name = chan_acb;

	sts = om$send (msg = &move_chan_msg,			
		       senderid = a_objid[4],			
		       targetid = a_objid[9] );

   switch(sts)
   {
      case OM_S_SUCCESS:  printf("\n\nA4.acb moved to A9.acb\n");
      			  break;
      case OM_E_CHAN_NOTEMPTY: printf("Channel is not empty\n");
      			       break;
      case OM_E_INVCHAN:  printf("an invalid channel was used\n");
      		          break;
      case OM_E_REL_MISMATCH:  printf("relations don't match\n");
      				break;
      default:				
         printf("error in om$send (move_chan) for A4 to A9\n");
         om$report_error(sts = sts);
   }
   printf ("----- Dumping A[4]'s acb channel\n");
   OMT_dump_relation( OM_Gw_current_OS, a_objid[4], "acb" );

   printf ("----- Dumping A[9]'s acb channel\n");
   OMT_dump_relation( OM_Gw_current_OS, a_objid[9], "acb" );

   chansel.type = OM_e_name;
   chansel.u_sel.name = chan_acb;
   sts = om$send(mode = OM_e_wrt_object,
                 msg = &showb,
                 senderid = a_objid[9],
                 p_chanselect = &chansel);
   if(!(sts&1))
   {
	printf("error in om$send (show_b)\n");
	om$report_error(sts = sts);
	exit();
   }

/******************************************************************
Test # 5 - Source is a dipole and target is a dipole.  This should 
           generate a error because the target should be empty.
*******************************************************************/

   printf ("\n\n******* Test 5 - A5.acb to A10.acb but A10.acb is not empty\n");

	move_chan_args.to_sel.type = OM_e_name;
	move_chan_args.to_sel.u_sel.name = chan_acb;
	move_chan_args.fr_objid = a_objid[5];
	move_chan_args.fr_os = OM_Gw_current_OS;
	move_chan_args.fr_sel.type = OM_e_name;
	move_chan_args.fr_sel.u_sel.name = chan_acb;

	sts = om$send (msg = &move_chan_msg,			
		       senderid = a_objid[5],			
		       targetid = a_objid[10] );

   switch(sts)
   {
      case OM_S_SUCCESS:  printf("\n\nA5.acb moved to A10\n");
      			  break;
      case OM_E_CHAN_NOTEMPTY: printf("Channel is not empty\n");
      			       break;
      case OM_E_INVCHAN:  printf("\nOM_E_INVCHAN - expected error\n\n");
      		          break;
      case OM_E_REL_MISMATCH:  printf("relations don't match\n");
      				break;
      default:				
         printf("error in om$send (move_chan) for A5 to A10\n");
         om$report_error(sts = sts);
   }
   printf ("----- Dumping A[5]'s acb channel\n");
   OMT_dump_relation( OM_Gw_current_OS, a_objid[5], "acb" );

   printf ("----- Dumping A[10]'s acb channel\n");
   OMT_dump_relation( OM_Gw_current_OS, a_objid[10], "acb" );

/******************************************************************
Test # 6 - Source is a dipole and its channel has only Bs on rhs.  
           Target is empty and its channel accepts Bs & Cs on rhs.
	   Target channel is a superset of Source's channel.
*******************************************************************/

   printf ("\n\n******* Test 6 - A7.acb to A1.acbc\n");

	move_chan_args.to_sel.type = OM_e_name;
	move_chan_args.to_sel.u_sel.name = chan_acbc;
	move_chan_args.fr_objid = a_objid[7];
	move_chan_args.fr_os = OM_Gw_current_OS;
	move_chan_args.fr_sel.type = OM_e_name;
	move_chan_args.fr_sel.u_sel.name = chan_acb;

	sts = om$send (msg = &move_chan_msg,			
		       senderid = a_objid[7],			
		       targetid = a_objid[1] );

   switch(sts)
   {
      case OM_I_CHAN_EMPTY:
      case OM_S_SUCCESS:  printf("\n\nA7.acb moved to A1.acbc\n");
      			  break;
      case OM_E_CHAN_NOTEMPTY: printf("Channel is not empty\n");
      			       break;
      case OM_E_INVCHAN:  printf("an invalid channel was used\n");
      		          break;
      case OM_E_REL_MISMATCH:  printf("relations don't match\n");
      				break;
      default:				
         printf("error in om$send (move_chan) for A7.acb to A1.acbc\n");
         om$report_error(sts = sts);
   }
   printf ("----- Dumping A[7]'s acb channel\n");
   OMT_dump_relation( OM_Gw_current_OS, a_objid[7], "acb" );

   printf ("----- Dumping A[1]'s acbc channel\n");
   OMT_dump_relation( OM_Gw_current_OS, a_objid[1], "acbc" );

/******************************************************************
Test # 7 - Source is FROM side of relation and its channel has
		 only Bs on rhs.  
           Target is empty and its channel accepts any class on rhs.
	   Target channel is a wildcard channel.
*******************************************************************/

   printf ("\n\n******* Test 7 - A9.acb to A10.acany\n");

	move_chan_args.to_sel.type = OM_e_name;
	move_chan_args.to_sel.u_sel.name = chan_acany;
	move_chan_args.fr_objid = a_objid[9];
	move_chan_args.fr_os = OM_Gw_current_OS;
	move_chan_args.fr_sel.type = OM_e_name;
	move_chan_args.fr_sel.u_sel.name = chan_acb;

	sts = om$send (msg = &move_chan_msg,			
		       senderid = a_objid[9],			
		       targetid = a_objid[10] );

   switch(sts)
   {
      case OM_S_SUCCESS:  printf("\n\nA9.acb moved to A10.acany\n");
      			  break;
      case OM_E_CHAN_NOTEMPTY: printf("Channel is not empty\n");
      			       break;
      case OM_E_INVCHAN:  printf("an invalid channel was used\n");
      		          break;
      case OM_E_REL_MISMATCH:  printf("relations don't match\n");
      				break;
      default:				
         printf("error in om$send (move_chan) for A9.acb to A10.acany\n");
         om$report_error(sts = sts);
   }
   printf ("----- Dumping A[9]'s acb channel\n");
   OMT_dump_relation( OM_Gw_current_OS, a_objid[9], "acb" );

   printf ("----- Dumping A[10]'s acany channel\n");
   OMT_dump_relation( OM_Gw_current_OS, a_objid[10], "acany" );

/******************************************************************
Test # 8 - Source is FROM side of relation and its channel has
	    only any class on rhs.  
           Target is empty and its channel accepts Bs & Cs on rhs.
	   Target channel is a subset of source channel but all
	    objects currently hooked to channel are allowed on source.
*******************************************************************/

   printf ("\n\n******* Test 8 - A10.acany to A4.acbc\n");

	move_chan_args.to_sel.type = OM_e_name;
	move_chan_args.to_sel.u_sel.name = chan_acbc;
	move_chan_args.fr_objid = a_objid[10];
	move_chan_args.fr_os = OM_Gw_current_OS;
	move_chan_args.fr_sel.type = OM_e_name;
	move_chan_args.fr_sel.u_sel.name = chan_acany;

	sts = om$send (msg = &move_chan_msg,			
		       senderid = a_objid[10],			
		       targetid = a_objid[4] );

   switch(sts)
   {
      case OM_S_SUCCESS:  printf("\n\nA10.acany moved to A4.acbc\n");
      			  break;
      case OM_E_CHAN_NOTEMPTY: printf("Channel is not empty\n");
      			       break;
      case OM_E_INVCHAN:  printf("an invalid channel was used\n");
      		          break;
      case OM_E_REL_MISMATCH:  printf("relations don't match\n");
      				break;
      default:				
         printf("error in om$send (move_chan) for A10.acany to A4.acbc\n");
         om$report_error(sts = sts);
   }
   printf ("----- Dumping A[10]'s acany channel\n");
   OMT_dump_relation( OM_Gw_current_OS, a_objid[10], "acany" );

   printf ("----- Dumping A[4]'s acbc channel\n");
   OMT_dump_relation( OM_Gw_current_OS, a_objid[4], "acbc" );

/* Construct a C object and connect it to A[4].acbc */

      sts = om$construct(osname = "OM_TransOS_0",
                         classname = "C",
                         p_objid = &c_objid,
                         neighbor = OM_GS_NULL_NEIGHBOR);
      if (!(sts&1))
      {
         printf (" error in om$construct for C\n" );
         om$report_error(sts = sts);
         exit();
      }

	connect_args.to_sel.type = OM_e_name;
	connect_args.to_sel.u_sel.name = chan_sbca;
	connect_args.to_idx = 0;
	connect_args.fr_objid = a_objid[4];
	connect_args.fr_os = OM_Gw_current_OS;
	connect_args.fr_sel.type = OM_e_name;
	connect_args.fr_sel.u_sel.name = chan_acbc;
	connect_args.fr_idx            = 0;

	sts = om$send (msg = &connect_msg,			
		       senderid = a_objid[4],			
		       targetid = c_objid );
 
   if (!(sts&1))
      {
      printf (" error in om$send (connect) for C\n");
      om$report_error(sts = sts);
      exit();
      }

   printf ("A4 connected to C\n");

   printf ("----- Dumping A[4]'s acbc channel\n");
   OMT_dump_relation( OM_Gw_current_OS, a_objid[4], "acbc" );

   printf ("----- Dumping C's sbca channel\n");
   OMT_dump_relation( OM_Gw_current_OS, c_objid, "sbca" );
   

/******************************************************************
Test # 9 - Source is FROM side of relation and its channel has
	    Bs and Cs on rhs.  
           Target is empty and its channel accepts only Bs on rhs.
	   Target channel is a subset of source channel but all
	    objects currently hooked to channel are not allowed
	    on source.  This test should fail.
*******************************************************************/

   printf ("\n\n******* Test 9 - A4.acbc to A9.acb but C is not allowed on acb\n");
	move_chan_args.to_sel.type = OM_e_name;
	move_chan_args.to_sel.u_sel.name = chan_acb;
	move_chan_args.fr_objid = a_objid[4];
	move_chan_args.fr_os = OM_Gw_current_OS;
	move_chan_args.fr_sel.type = OM_e_name;
	move_chan_args.fr_sel.u_sel.name = chan_acbc;

	sts = om$send (msg = &move_chan_msg,			
		       senderid = a_objid[4],			
		       targetid = a_objid[9] );

   switch(sts)
   {
      case OM_I_CHAN_EMPTY:
      case OM_S_SUCCESS:  printf("\n\nA4.acbc moved to A9.acb\n");
      			  break;
      case OM_E_CHAN_NOTEMPTY: printf("Channel is not empty\n");
      			       break;
      case OM_E_INVCHAN:  printf("an invalid channel was used\n");
      		          break;
      case OM_E_CLASS_CONFLICT: 
                         printf ("\nOM_E_CLASS_CONFLICT - expected error\n\n");
                         break;
      case OM_E_REL_MISMATCH:  printf("relations don't match\n");
      				break;
      default:				
         printf("error in om$send (move_chan) for A4.acbc to A9.acb\n");
         om$report_error(sts = sts);
   }
   printf ("----- Dumping A[4]'s acbc channel\n");
   OMT_dump_relation( OM_Gw_current_OS, a_objid[4], "acbc" );

   printf ("----- Dumping A[9]'s acb channel\n");
   OMT_dump_relation( OM_Gw_current_OS, a_objid[9], "acb" );


   /*=========================================================*/
   /*=========================================================*/
   /*   R E S T R I C T E D     C H A N N E L    T E S T S    */
   /*=========================================================*/
   /*=========================================================*/

   printf ("\nStart of restrcited channel tests\n\n\n");

   chan_resacb    = "ResA.acb";
   chan_resacany  = "ResA.acany";
   chan_resacbc   = "ResA.acbc";
   chan_resbca    = "ResB.bca";
   chan_sca       = "C.sca";

   for ( i=0; i<MAXA; i++ )
   {
      sts = om$construct(osname = "OM_TransOS_0",
                         classname = "ResA",
                         p_objid = &resa_objid[i],
                         neighbor = OM_GS_NULL_NEIGHBOR);
      if (!(sts&1))
      {
         printf (" error in om$construct for ResA\n" );
         om$report_error(sts = sts);
         printf (" iteration : %d \n", i );
         exit();
      }
   }


   sts = om$get_channel_number(channame = "ResA.acb",
                               p_channum = &chan_a );
   if (!(sts&1))
   {
      printf (" error in om$get channel_number for acb\n" );
      om$report_error(sts = sts);
      exit();
   }

   sts = om$get_channel_number(channame = "ResB.bca",
                               p_channum = &chan_b );
   if (!(sts&1))
   {
      printf (" error in om$get_channel_number for bca\n" );
      om$report_error(sts = sts);
      exit();
   }


   for ( i=0; i<MAXB; i++ )
   {
      sts = om$construct(osname = "OM_TransOS_0",
                         classname = "ResB",
                         p_objid = &resb_objid[i],
                         neighbor = OM_GS_NULL_NEIGHBOR);
      if (!(sts&1))
      {
         printf (" error in om$construct for ResB\n" );
         om$report_error(sts = sts);
         printf (" iteration : %d \n", i );
         exit();
      }
   } /* for */

/* Now I need to build the following relations for the test:
	a1 - b0    	Dipole
	a2,a3 - b1  	TO:FROM
	a4 - b2,b3	FROM:TO
	a5 - b4         Dipole
	a10 - b5	Dipole
*/

	connect_args.to_sel.type = OM_e_num;
	connect_args.to_sel.u_sel.number = chan_b;
	connect_args.to_idx = 0;
	connect_args.fr_objid = resa_objid[1];
	connect_args.fr_os = OM_Gw_current_OS;
	connect_args.fr_sel.type = OM_e_num;
	connect_args.fr_sel.u_sel.number = chan_a;
	connect_args.fr_idx            = 0;

	sts = om$make_message(classname = "Root",		
			      methodname = "connect",		
			      size = sizeof( struct connect_struct),
			      p_arglist = &connect_args,	
			      p_msg = &connect_msg );


	sts = om$send (msg = &connect_msg,			
		       senderid = resa_objid[1],			
		       targetid = resb_objid[0] );

   if (!(sts&1))
      {
      printf (" error in om$send (connect) for ResB\n" );
      om$report_error(sts = sts);
      exit();
      }
   printf ("ResA1 connected to ResB0\n");

   printf ("----- Dumping ResA[1]'s acb channel\n");
   OMT_dump_relation( OM_Gw_current_OS, resa_objid[1], "acb" );

   printf ("----- Dumping ResB[0]'s bca channel\n");
   OMT_dump_relation( OM_Gw_current_OS, resb_objid[0], "bca" );
   
     
for(i=2; i<4; i++)
{
	connect_args.to_sel.type = OM_e_name;
	connect_args.to_sel.u_sel.name = chan_resbca;
	connect_args.to_idx = 0;
	connect_args.fr_objid = resa_objid[i];
	connect_args.fr_os = OM_Gw_current_OS;
	connect_args.fr_sel.type = OM_e_name;
	connect_args.fr_sel.u_sel.name = chan_resacb;
	connect_args.fr_idx            = 0;

	sts = om$send (msg = &connect_msg,			
		       senderid = resa_objid[i],			
		       targetid = resb_objid[1] );
 
   switch(sts)
   {
      case OM_I_ADDEDATEND:
      case OM_S_SUCCESS:  printf("ResA%d connected to ResB1\n", i);
      			  break;
      case OM_E_CHAN_NOTEMPTY: printf("ResB1 is already connected\n");
      			       break;
      case OM_E_INVCHAN:  printf("an invalid channel was used\n");
      		          break;
      case OM_E_REL_MISMATCH:  printf("relations don't match\n");
      				break;
      default:				
         printf("error in om$send (connect) for ResA%d to ResB1\n", i);
         om$report_error(sts = sts);
   }
   printf ("----- Dumping ResA[%d]'s acb channel\n",i);
   OMT_dump_relation( OM_Gw_current_OS, resa_objid[i], "acb" );

   printf ("----- Dumping ResB[1]'s bca channel\n");
   OMT_dump_relation( OM_Gw_current_OS, resb_objid[1], "bca" );
}
      

for(i=2; i<4; i++)
{
	connect_args.to_sel.type = OM_e_name;
	connect_args.to_sel.u_sel.name = chan_resbca;
	connect_args.to_idx = 0;
	connect_args.fr_objid = resa_objid[4];
	connect_args.fr_os = OM_Gw_current_OS;
	connect_args.fr_sel.type = OM_e_name;
	connect_args.fr_sel.u_sel.name = chan_resacb;
	connect_args.fr_idx            = 0;

	sts = om$send (msg = &connect_msg,			
		       senderid = resa_objid[4],			
		       targetid = resb_objid[i] );

   switch(sts)
   {
      case OM_I_ADDEDATEND:
      case OM_S_SUCCESS:  printf("ResA4 connected to ResB%d\n", i);
      			  break;
      case OM_E_CHAN_NOTEMPTY: printf("Channel is not empty\n");
      			       break;
      case OM_E_INVCHAN:  printf("an invalid channel was used\n");
      		          break;
      case OM_E_REL_MISMATCH:  printf("relations don't match\n");
      				break;
      default:				
         printf("error in om$send (connect) for ResA4 to ResB%d\n", i);
         om$report_error(sts = sts);
   }
   printf ("----- Dumping ResA[4]'s acb channel\n");
   OMT_dump_relation( OM_Gw_current_OS, resa_objid[4], "acb" );

   printf ("----- Dumping ResB[%d]'s bca channel\n",i);
   OMT_dump_relation( OM_Gw_current_OS, resb_objid[i], "bca" );
}

	connect_args.to_sel.type = OM_e_name;
	connect_args.to_sel.u_sel.name = chan_resbca;
	connect_args.to_idx = 0;
	connect_args.fr_objid = resa_objid[5];
	connect_args.fr_os = OM_Gw_current_OS;
	connect_args.fr_sel.type = OM_e_name;
	connect_args.fr_sel.u_sel.name = chan_resacb;
	connect_args.fr_idx            = 0;

	sts = om$send (msg = &connect_msg,			
		       senderid = resa_objid[5],			
		       targetid = resb_objid[4] );
 
   if (!(sts&1))
      {
      printf (" error in om$send (connect)\n");
      om$report_error(sts = sts);
      exit();
      }
   printf ("ResA5 connected to ResB4\n");

   printf ("----- Dumping ResA[5]'s acb channel\n");
   OMT_dump_relation( OM_Gw_current_OS, resa_objid[5], "acb" );

   printf ("----- Dumping ResB[4]'s bca channel\n");
   OMT_dump_relation( OM_Gw_current_OS, resb_objid[4], "bca" );

	connect_args.to_sel.type = OM_e_name;
	connect_args.to_sel.u_sel.name = chan_resbca;
	connect_args.to_idx = 0;
	connect_args.fr_objid = resa_objid[10];
	connect_args.fr_os = OM_Gw_current_OS;
	connect_args.fr_sel.type = OM_e_name;
	connect_args.fr_sel.u_sel.name = chan_resacb;
	connect_args.fr_idx            = 0;

	sts = om$send (msg = &connect_msg,			
		       senderid = resa_objid[10],			
		       targetid = resb_objid[5] );
   if (!(sts&1))
      {
      printf (" error in om$send (connect)\n");
      om$report_error(sts = sts);
      exit();
      }

   printf ("ResA10 connected to ResB5\n");

   printf ("----- Dumping ResA[10]'s acb channel\n");
   OMT_dump_relation( OM_Gw_current_OS, resa_objid[10], "acb" );

   printf ("----- Dumping ResB[5]'s bca channel\n");
   OMT_dump_relation( OM_Gw_current_OS, resb_objid[5], "bca" );

/******************************************************************
Test # 1 - Source is a singleton.
*******************************************************************/

   printf ("\n\n******* Test 1 - ResA0.acb to ResA6.acb but ResA0 is empty\n");

	move_chan_args.to_sel.type = OM_e_name;
	move_chan_args.to_sel.u_sel.name = chan_resacb;
	move_chan_args.fr_objid = resa_objid[0];
	move_chan_args.fr_os = OM_Gw_current_OS;
	move_chan_args.fr_sel.type = OM_e_name;
	move_chan_args.fr_sel.u_sel.name = chan_resacb;

	sts = om$make_message(classname = "Root",		
			      methodname = "move_chan",		
			      size = sizeof( struct move_chan_struct),
			      p_arglist = &move_chan_args,	
			      p_msg = &move_chan_msg );

	sts = om$send (msg = &move_chan_msg,			
		       senderid = resa_objid[0],			
		       targetid = resa_objid[6] );

   switch(sts)
   {
      case OM_I_CHAN_EMPTY:
      case OM_S_SUCCESS:  printf("\n\nResA0.acb moved to ResA6.acb\n");
      			  break;
      case OM_E_CHAN_NOTEMPTY: printf("Channel is not empty\n");
      			       break;
      case OM_E_INVCHAN:  printf("an invalid channel was used\n");
      		          break;
      case OM_E_REL_MISMATCH:  printf("relations don't match\n");
      				break;
      default:				
         printf("error in om$send (move_chan) for ResA0 to ResA6\n");
         om$report_error(sts = sts);
   }
   printf ("----- Dumping ResA[0]'s acb channel\n");
   OMT_dump_relation( OM_Gw_current_OS, resa_objid[0], "acb" );

   printf ("----- Dumping ResA[6]'s acb channel\n");
   OMT_dump_relation( OM_Gw_current_OS, resa_objid[6], "acb" );


/******************************************************************
Test # 2 - Source is a dipole.
*******************************************************************/

   printf ("\n\n******* Test 2 - ResA1.acb to ResA7.acb\n");

	move_chan_args.to_sel.type = OM_e_name;
	move_chan_args.to_sel.u_sel.name = chan_resacb;
	move_chan_args.fr_objid = resa_objid[1];
	move_chan_args.fr_os = OM_Gw_current_OS;
	move_chan_args.fr_sel.type = OM_e_name;
	move_chan_args.fr_sel.u_sel.name = chan_resacb;

	sts = om$send (msg = &move_chan_msg,			
		       senderid = resa_objid[1],			
		       targetid = resa_objid[7] );

   switch(sts)
   {
      case OM_S_SUCCESS:  printf("\n\nResA1.acb moved to ResA7.acb\n");
      			  break;
      case OM_E_CHAN_NOTEMPTY: printf("Channel is not empty\n");
      			       break;
      case OM_E_INVCHAN:  printf("an invalid channel was used\n");
      		          break;
      case OM_E_REL_MISMATCH:  printf("relations don't match\n");
      				break;
      default:				
         printf("error in om$send (move_chan) for ResA1 to ResA7\n");
         om$report_error(sts = sts);
   }
   printf ("----- Dumping ResA[1]'s acb channel\n");
   OMT_dump_relation( OM_Gw_current_OS, resa_objid[1], "acb" );

   printf ("----- Dumping ResA[7]'s acb channel\n");
   OMT_dump_relation( OM_Gw_current_OS, resa_objid[7], "acb" );

   sts = om$make_message(classname = "ResB",
                         methodname = "show_b",
                         size = 0,
                         p_arglist = 0,
                         p_msg = &showresb);
   if(!(sts&1))
   {
	printf("error in om%make_message for show_b\n");
	om$report_error(sts = sts);
	exit();
   }
   chansel.type = OM_e_name;
   chansel.u_sel.name = chan_resacb;
   sts = om$send(mode = OM_e_wrt_object,
                 msg = &showresb,
                 senderid = resa_objid[7],
                 p_chanselect = &chansel);
   if(!(sts&1))
   {
	printf("error in om$send (show_b)\n");
	om$report_error(sts = sts);
	exit();
   }

/******************************************************************
Test # 3 - Source is on the TO side of a relation.
*******************************************************************/

   printf ("\n\n******* Test 3 - ResA2.acb to ResA8.acb\n");

	move_chan_args.to_sel.type = OM_e_name;
	move_chan_args.to_sel.u_sel.name = chan_resacb;
	move_chan_args.fr_objid = resa_objid[2];
	move_chan_args.fr_os = OM_Gw_current_OS;
	move_chan_args.fr_sel.type = OM_e_name;
	move_chan_args.fr_sel.u_sel.name = chan_resacb;

	sts = om$send (msg = &move_chan_msg,			
		       senderid = resa_objid[2],			
		       targetid = resa_objid[8] );

   switch(sts)
   {
      case OM_S_SUCCESS:  printf("\n\nResA2.acb moved to ResA8.acb\n");
      			  break;
      case OM_E_CHAN_NOTEMPTY: printf("Channel is not empty\n");
      			       break;
      case OM_E_INVCHAN:  printf("an invalid channel was used\n");
      		          break;
      case OM_E_REL_MISMATCH:  printf("relations don't match\n");
      				break;
      default:				
         printf("error in om$send (move_chan) for ResA2 to ResA8\n");
         om$report_error(sts = sts);
   }
   printf ("----- Dumping ResA[2]'s acb channel\n");
   OMT_dump_relation( OM_Gw_current_OS, resa_objid[2], "acb" );

   printf ("----- Dumping ResA[8]'s acb channel\n");
   OMT_dump_relation( OM_Gw_current_OS, resa_objid[8], "acb" );

   chansel.type = OM_e_name;
   chansel.u_sel.name = chan_resacb;
   sts = om$send(mode = OM_e_wrt_object,
                 msg = &showresb,
                 senderid = resa_objid[8],
                 p_chanselect = &chansel);
   if(!(sts&1))
   {
	printf("error in om$send (show_b)\n");
	om$report_error(sts = sts);
	exit();
   }

/******************************************************************
Test # 4 - Source is on the FROM side of a relation.
*******************************************************************/

   printf ("\n\n******* Test 4 - ResA4.acb to ResA9.acb\n");

	move_chan_args.to_sel.type = OM_e_name;
	move_chan_args.to_sel.u_sel.name = chan_resacb;
	move_chan_args.fr_objid = resa_objid[4];
	move_chan_args.fr_os = OM_Gw_current_OS;
	move_chan_args.fr_sel.type = OM_e_name;
	move_chan_args.fr_sel.u_sel.name = chan_resacb;

	sts = om$send (msg = &move_chan_msg,			
		       senderid = resa_objid[4],			
		       targetid = resa_objid[9] );

   switch(sts)
   {
      case OM_S_SUCCESS:  printf("\n\nResA4.acb moved to ResA9.acb\n");
      			  break;
      case OM_E_CHAN_NOTEMPTY: printf("Channel is not empty\n");
      			       break;
      case OM_E_INVCHAN:  printf("an invalid channel was used\n");
      		          break;
      case OM_E_REL_MISMATCH:  printf("relations don't match\n");
      				break;
      default:				
         printf("error in om$send (move_chan) for ResA4 to ResA9\n");
         om$report_error(sts = sts);
   }
   printf ("----- Dumping ResA[4]'s acb channel\n");
   OMT_dump_relation( OM_Gw_current_OS, resa_objid[4], "acb" );

   printf ("----- Dumping ResA[9]'s acb channel\n");
   OMT_dump_relation( OM_Gw_current_OS, resa_objid[9], "acb" );

   chansel.type = OM_e_name;
   chansel.u_sel.name = chan_resacb;
   sts = om$send(mode = OM_e_wrt_object,
                 msg = &showresb,
                 senderid = resa_objid[9],
                 p_chanselect = &chansel);
   if(!(sts&1))
   {
	printf("error in om$send (show_b)\n");
	om$report_error(sts = sts);
	exit();
   }

/******************************************************************
Test # 5 - Source is a dipole and target is a dipole.  This should 
           generate a error because the target should be empty.
*******************************************************************/

   printf ("\n\n******* Test 5 - ResA5.acb to ResA10.acb but ResA10.acb is not empty\n");

	move_chan_args.to_sel.type = OM_e_name;
	move_chan_args.to_sel.u_sel.name = chan_resacb;
	move_chan_args.fr_objid = resa_objid[5];
	move_chan_args.fr_os = OM_Gw_current_OS;
	move_chan_args.fr_sel.type = OM_e_name;
	move_chan_args.fr_sel.u_sel.name = chan_resacb;

	sts = om$send (msg = &move_chan_msg,			
		       senderid = resa_objid[5],			
		       targetid = resa_objid[10] );

   switch(sts)
   {
      case OM_S_SUCCESS:  printf("\n\nResA5.acb moved to ResA10\n");
      			  break;
      case OM_E_CHAN_NOTEMPTY: printf("Channel is not empty\n");
      			       break;
      case OM_E_INVCHAN:  printf("\nOM_E_INVCHAN - expected error\n\n");
      		          break;
      case OM_E_REL_MISMATCH:  printf("relations don't match\n");
      				break;
      default:				
         printf("error in om$send (move_chan) for ResA5 to ResA10\n");
         om$report_error(sts = sts);
   }
   printf ("----- Dumping ResA[5]'s acb channel\n");
   OMT_dump_relation( OM_Gw_current_OS, resa_objid[5], "acb" );

   printf ("----- Dumping ResA[10]'s acb channel\n");
   OMT_dump_relation( OM_Gw_current_OS, resa_objid[10], "acb" );

/******************************************************************
Test # 6 - Source is a dipole and its channel has only ResBs on rhs.  
           Target is empty and its channel accepts ResBs & Cs on rhs.
	   Target channel is a superset of Source's channel.
*******************************************************************/

   printf ("\n\n******* Test 6 - ResA7.acb to ResA1.acbc - should error\n");

	move_chan_args.to_sel.type = OM_e_name;
	move_chan_args.to_sel.u_sel.name = chan_resacbc;
	move_chan_args.fr_objid = resa_objid[7];
	move_chan_args.fr_os = OM_Gw_current_OS;
	move_chan_args.fr_sel.type = OM_e_name;
	move_chan_args.fr_sel.u_sel.name = chan_resacb;

	sts = om$send (msg = &move_chan_msg,			
		       senderid = resa_objid[7],			
		       targetid = resa_objid[1] );

   switch(sts)
   {
      case OM_I_CHAN_EMPTY:
      case OM_S_SUCCESS:  printf("\n\nResA7.acb moved to ResA1.acbc\n");
      			  break;
      case OM_E_CHAN_NOTEMPTY: printf("Channel is not empty\n");
      			       break;
      case OM_E_INVCHAN:  printf("an invalid channel was used\n");
      		          break;
      case OM_E_REL_MISMATCH:  printf("relations don't match\n");
      				break;
      case OM_E_CLASS_CONFLICT:
                           printf("\nOM_E_CLASS_CONFLICT - expected error\n");
                           break;
      default:				
         printf("error in om$send (move_chan) for ResA7.acb to ResA1.acbc\n");
         om$report_error(sts = sts);
   }
   printf ("----- Dumping ResA[7]'s acb channel\n");
   OMT_dump_relation( OM_Gw_current_OS, resa_objid[7], "acb" );

   printf ("----- Dumping ResA[1]'s acbc channel\n");
   OMT_dump_relation( OM_Gw_current_OS, resa_objid[1], "acbc" );

/******************************************************************
Test # 7 - Source is FROM side of relation and its channel has
		 only ResBs on rhs.  
           Target is empty and its channel accepts any class on rhs.
	   Target channel is a wildcard channel.
*******************************************************************/

   printf ("\n\n******* Test 7 - ResA9.acb to ResA10.acany - should error\n");

	move_chan_args.to_sel.type = OM_e_name;
	move_chan_args.to_sel.u_sel.name = chan_resacany;
	move_chan_args.fr_objid = resa_objid[9];
	move_chan_args.fr_os = OM_Gw_current_OS;
	move_chan_args.fr_sel.type = OM_e_name;
	move_chan_args.fr_sel.u_sel.name = chan_resacb;

	sts = om$send (msg = &move_chan_msg,			
		       senderid = resa_objid[9],			
		       targetid = resa_objid[10] );

   switch(sts)
   {
      case OM_S_SUCCESS:  printf("\n\nResA9.acb moved to ResA10.acany\n");
      			  break;
      case OM_E_CHAN_NOTEMPTY: printf("Channel is not empty\n");
      			       break;
      case OM_E_INVCHAN:  printf("an invalid channel was used\n");
      		          break;
      case OM_E_REL_MISMATCH:  printf("relations don't match\n");
      				break;
      case OM_E_CLASS_CONFLICT:
                           printf("\nOM_E_CLASS_CONFLICT - expected error\n");
                           break;
      default:				
         printf("error in om$send (move_chan) for ResA9.acb to ResA10.acany\n");
         om$report_error(sts = sts);
   }
   printf ("----- Dumping ResA[9]'s acb channel\n");
   OMT_dump_relation( OM_Gw_current_OS, resa_objid[9], "acb" );

   printf ("----- Dumping ResA[10]'s acany channel\n");
   OMT_dump_relation( OM_Gw_current_OS, resa_objid[10], "acany" );

/******************************************************************
Test # 8 - Source is FROM side of relation and its channel has
	    only any class on rhs.  
           Target is empty and its channel accepts ResBs & Cs on rhs.
	   Target channel is a subset of source channel but all
	    objects currently hooked to channel are allowed on source.
*******************************************************************/

   printf ("\n\n******* Test 8 - ResA10.acany to ResA4.acbc but Res10.acany is empty\n");

	move_chan_args.to_sel.type = OM_e_name;
	move_chan_args.to_sel.u_sel.name = chan_resacbc;
	move_chan_args.fr_objid = resa_objid[10];
	move_chan_args.fr_os = OM_Gw_current_OS;
	move_chan_args.fr_sel.type = OM_e_name;
	move_chan_args.fr_sel.u_sel.name = chan_resacany;

	sts = om$send (msg = &move_chan_msg,			
		       senderid = resa_objid[10],			
		       targetid = resa_objid[4] );

   switch(sts)
   {
      case OM_S_SUCCESS:  printf("\n\nResA10.acany moved to ResA4.acbc\n");
      			  break;
      case OM_E_CHAN_NOTEMPTY: printf("Channel is not empty\n");
      			       break;
      case OM_E_INVCHAN:  printf("an invalid channel was used\n");
      		          break;
      case OM_E_REL_MISMATCH:  printf("relations don't match\n");
      				break;
      case OM_I_CHAN_EMPTY:
                           printf("\nOM_I_CHAN_EMPTY - expected status\n");
                           break;
      default:				
         printf("error in om$send (move_chan) for ResA10.acany to ResA4.acbc\n");
         om$report_error(sts = sts);
   }
   printf ("----- Dumping ResA[10]'s acany channel\n");
   OMT_dump_relation( OM_Gw_current_OS, resa_objid[10], "acany" );

   printf ("----- Dumping ResA[4]'s acbc channel\n");
   OMT_dump_relation( OM_Gw_current_OS, resa_objid[4], "acbc" );

/* Construct a C object and connect it to ResA[4].acbc */

      sts = om$construct(osname = "OM_TransOS_0",
                         classname = "C",
                         p_objid = &c2_objid,
                         neighbor = OM_GS_NULL_NEIGHBOR);
      if (!(sts&1))
      {
         printf (" error in om$construct for C2\n" );
         om$report_error(sts = sts);
         exit();
      }

	connect_args.to_sel.type = OM_e_name;
	connect_args.to_sel.u_sel.name = chan_sca;
	connect_args.to_idx = 0;
	connect_args.fr_objid = resa_objid[4];
	connect_args.fr_os = OM_Gw_current_OS;
	connect_args.fr_sel.type = OM_e_name;
	connect_args.fr_sel.u_sel.name = chan_resacbc;
	connect_args.fr_idx            = 0;

	sts = om$send (msg = &connect_msg,			
		       senderid = resa_objid[4],			
		       targetid = c2_objid );
 
   if (!(sts&1))
      {
      printf (" error in om$send (connect) for C2\n");
      om$report_error(sts = sts);
      exit();
      }

   printf ("ResA4 connected to C2\n");

   printf ("----- Dumping ResA[4]'s acbc channel\n");
   OMT_dump_relation( OM_Gw_current_OS, resa_objid[4], "acbc" );

   printf ("----- Dumping C2's sca channel\n");
   OMT_dump_relation( OM_Gw_current_OS, c2_objid, "sca" );
   

/******************************************************************
Test # 9 - Source is FROM side of relation and its channel has
	    ResBs and C2s on rhs.  
           Target is empty and its channel accepts only ResBs on rhs.
	   Target channel is a subset of source channel but all
	    objects currently hooked to channel are not allowed
	    on source.  This test should fail.
*******************************************************************/

   printf ("\n\n******* Test 9 - ResA4.acbc to ResA9.acb but C2 is not allowed on acb\n");
	move_chan_args.to_sel.type = OM_e_name;
	move_chan_args.to_sel.u_sel.name = chan_resacb;
	move_chan_args.fr_objid = resa_objid[4];
	move_chan_args.fr_os = OM_Gw_current_OS;
	move_chan_args.fr_sel.type = OM_e_name;
	move_chan_args.fr_sel.u_sel.name = chan_resacbc;

	sts = om$send (msg = &move_chan_msg,			
		       senderid = resa_objid[4],			
		       targetid = resa_objid[9] );

   switch(sts)
   {
      case OM_I_CHAN_EMPTY:
      case OM_S_SUCCESS:  printf("\n\nResA4.acbc moved to ResA9.acb\n");
      			  break;
      case OM_E_CHAN_NOTEMPTY: printf("Channel is not empty\n");
      			       break;
      case OM_E_INVCHAN:  printf("\nOM_E_INVCHAN - expected error\n");
      		          break;
      case OM_E_CLASS_CONFLICT: 
                         printf ("\nOM_E_CLASS_CONFLICT - expected error\n\n");
                         break;
      case OM_E_REL_MISMATCH:  printf("relations don't match\n");
      				break;
      default:				
         printf("error in om$send (move_chan) for ResA4.acbc to ResA9.acb\n");
         om$report_error(sts = sts);
   }
   printf ("----- Dumping ResA[4]'s acbc channel\n");
   OMT_dump_relation( OM_Gw_current_OS, resa_objid[4], "acbc" );

   printf ("----- Dumping ResA[9]'s acb channel\n");
   OMT_dump_relation( OM_Gw_current_OS, resa_objid[9], "acb" );

return(1);
}  /* main */