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 */
main () { /* One extra set of data structures are allocated for A's and B's. The last A and B will be connected as a dipole. */ int sts, i, half_A, half_B; OM_S_OBJID a_objid[MAXA+1], b_objid[MAXB+1]; OM_S_OBJID resa_objid[MAXA+1], resb_objid[MAXB+1]; int relindex=0; uword minorchan=0; OM_S_MESSAGE disconnect_msg,connect_msg,showa, showb; OM_S_MESSAGE range_disconnect_msg; OM_S_CHANSELECT chansel; char *chan_acb,*chan_bca, *chan_resacb, *chan_resbca; struct connect_struct { OM_S_CHANSELECT to_sel; int to_idx; OM_S_OBJID fr_objid; OMuword fr_os; OM_S_CHANSELECT fr_sel; int fr_idx; } connect_args; struct disconnect_struct { OM_S_CHANSELECT to_sel; OM_S_OBJID fr_objid; OMuword fr_os; OM_S_CHANSELECT fr_sel; } disconnect_args; struct range_disconnect_struct { OM_S_CHANSELECT to_sel; int low_index; int hi_index; } range_disconnect_args; half_A=MAXA/2; half_B=MAXB/2; sts = om$runtime_init(); if (!(sts&1)) { printf ("error in om$runtime_init: %x \n", sts ); om$report_error(sts=sts); exit(); } chan_acb = "A.acb"; chan_bca = "B.bca"; /* Construct A's */ printf("\n>>> Table of A's object IDs::\n"); for (i=0; i<MAXA+1; i++) { sts = om$construct (osname="OM_TransOS_0",classname="A", p_objid=&a_objid[i] ); if (!(sts&1)) { printf ("error in om$construct object A[%d]: %x \n", i, sts ); om$report_error(sts=sts); exit(); } printf("\n>>> A[%d]: %d",i,a_objid[i]); } /* Construct B's */ printf("\n\n>>> Table of B's object IDs::\n"); for (i=0; i<MAXB+1; i++) { sts = om$construct (osname="OM_TransOS_0",classname="B", p_objid=&b_objid[i] ); if (!(sts&1)) { printf ("error in om$construct object B[%d]: %x \n", i, sts ); om$report_error(sts=sts); exit(); } printf("\n>>> B[%d]: %d ",i,b_objid[i]); } /* Connect last A to last B */ printf("\n\n>>> Connect Last A to Last B\n"); 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[MAXA]; 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$make_message(classname = "Root", methodname = "connect", size = sizeof( struct connect_struct), p_arglist = &connect_args, p_msg = &connect_msg ); if(!(sts&1)) { printf("error in om$make_message for connect: %x\n", sts); om$report_error(sts=sts); exit(); } sts = om$send (msg = &connect_msg, senderid = a_objid[MAXA], targetid = b_objid[MAXB] ); if (!(sts&1)) { printf ("error in om$send msg=connect LAST A to LAST B: %x\n", i, sts ); om$report_error(sts=sts); exit(); } /* Connect last half of B's to A[0] */ printf("\n\n>>> Connect last half of B's to A[0]"); 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[0]; 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; for (i=half_B; i<MAXB; i++) { sts = om$send (msg = &connect_msg, senderid = a_objid[0], targetid = b_objid[i] ); if (!(sts&1)) { printf ("error in om$send msg=connect B[%d]: %x \n", i, sts ); om$report_error(sts=sts); printf("iteration: %d\n", i); exit(); } } /* Connect last half of A's to B[0] */ printf("\n\n>>> Connect last half of A's to B[0]"); connect_args.to_sel.type = OM_e_name; connect_args.to_sel.u_sel.name = chan_acb; connect_args.to_idx = 0; connect_args.fr_objid = b_objid[0]; connect_args.fr_os = OM_Gw_current_OS; connect_args.fr_sel.type = OM_e_name; connect_args.fr_sel.u_sel.name = chan_bca; connect_args.fr_idx = 0; for (i=half_A; i<MAXA; i++) { sts = om$send (msg = &connect_msg, senderid = b_objid[0], targetid = a_objid[i] ); if (!(sts&1)) { printf ("error in om$send msg=connect A[%d]: %x \n", i, sts ); om$report_error(sts=sts); printf("iteration: %d\n", i); exit(); } } /* Connect first half of B's to A[1] note: a many-to-many object existed for B[0] thus a connection between two many-to-many objects occurs */ printf("\n\n>>> Connect first half of B's to A[1]"); printf("\n>>>>>> note: an entry was inserted into B[0]'s bca channel"); printf("\n>>>>>> linking itself to A[1]'s acb channel"); 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[1]; 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; for (i=0; i<half_B; i++) { sts = om$send (msg = &connect_msg, senderid = a_objid[1], targetid = b_objid[i] ); if (!(sts&1)) { printf ("error in om$send msg=connect B[%d]: %x \n", i, sts ); om$report_error(sts=sts); printf("iteration: %d\n", i); exit(); } } /* Connect first half of A's to B[1] note: a many-to-many connection existed for A[0] thus a connection between two many-to-many connections occurs */ printf("\n\n>>> Connect first half of A's to B[1]"); printf("\n>>>>>> note: an entry was inserted into A[0]'s acb channel"); printf("\n>>>>>> linking itself to B[1]'s bca channel"); connect_args.to_sel.type = OM_e_name; connect_args.to_sel.u_sel.name = chan_acb; connect_args.to_idx = 0; connect_args.fr_objid = b_objid[1]; connect_args.fr_os = OM_Gw_current_OS; connect_args.fr_sel.type = OM_e_name; connect_args.fr_sel.u_sel.name = chan_bca; connect_args.fr_idx = 0; for (i=0; i<half_A; i++) { sts = om$send (msg = &connect_msg, senderid = b_objid[1], targetid = a_objid[i] ); if (!(sts&1)) { printf ("error in om$send msg=connect A[%d]: %x \n", i, sts ); om$report_error(sts=sts); printf("iteration: %d\n", i); exit(); } } /* For each B dump relations */ printf("\n\n>>> For each B dump relations::\n"); for(i=0; i<MAXB+1; i++) { printf("\n>>> B[%d]:",i); sts = OMT_dump_relation( OM_Gw_current_OS, b_objid[i], chan_bca); if(!(sts&1)) { printf("error in OMT_dump_relation for B[%d]: %x\n", i, sts); om$report_error(sts=sts); exit(); } } /* Make message to send to B objects */ sts = om$make_message(classname="B",methodname="show_b",p_msg=&showb); if(!(sts&1)) { printf("error in om$make_message for show_b: %x\n", sts); om$report_error(sts=sts); exit(); } /* Send message to all B objects connected on A[0]'s "acb" channel */ printf("\n>>> Send message to all B's connected on A[0]'s \"acb\" chan\n"); chansel.type = OM_e_name; chansel.u_sel.name = "acb"; sts = om$send (msg=&showb,mode=OM_e_wrt_object,senderid=a_objid[0], p_chanselect=&chansel ); if(!(sts&1)) { printf("error in om$send msg=show_b A[0]: %x\n", sts); om$report_error(sts=sts); exit(); } /* Send message to all B objects connected on A[1]'s "acb" channel */ printf("\n>>> Send message to all B's connected on A[1]'s \"acb\" chan\n"); chansel.type = OM_e_name; chansel.u_sel.name = "acb"; sts = om$send (msg=&showb,mode=OM_e_wrt_object,senderid=a_objid[1], p_chanselect=&chansel ); if(!(sts&1)) { printf("error in om$send msg= show_b A[1]: %x\n", sts); om$report_error(sts=sts); exit(); } /* For each A dump relations */ printf("\n>>> For each A dump relations\n"); for(i=0; i<MAXA+1; i++) { printf("\n>>> A[%d]:",i); sts = OMT_dump_relation( OM_Gw_current_OS, a_objid[i], chan_acb); if(!(sts&1)) { printf("error in OMT_dump_relation for A[%d]: %x\n", i, sts); om$report_error(sts=sts); exit(); } } /* Make message to send to A objects */ sts = om$make_message(classname="A",methodname="show_a",p_msg=&showa); if(!(sts&1)) { printf("error in om$make_message for show_a: %x\n", sts); om$report_error(sts=sts); exit(); } /* Send message to all A objects connected on B[0]'s "bca" channel */ printf("\n>>> Send message to all A's connected on B[0]'s \"bca\" chan\n"); chansel.type = OM_e_name; chansel.u_sel.name = "bca"; sts = om$send (msg=&showa,mode=OM_e_wrt_object,senderid=b_objid[0], p_chanselect=&chansel ); if(!(sts&1)) { printf("error in om$send msg= show_a B[0]: %x\n", sts); om$report_error(sts=sts); exit(); } /* Send message to all A objects connected on B[1]'s "bca" channel */ printf("\n>>> Send message to all A's connected on B[1]'s \"bca\" chan\n"); chansel.type = OM_e_name; chansel.u_sel.name = "bca"; sts = om$send (msg=&showa,mode=OM_e_wrt_object,senderid=b_objid[1], p_chanselect=&chansel ); if(!(sts&1)) { printf("error in om$send msg= show_a B[1]: %x\n", sts); om$report_error(sts=sts); exit(); } /* Disconnect the first A contained wihtin the last half of A's from it's associated B. note: Remember that the last half of the A's were connected to B[0] (see above). */ printf("\n>>> Disconnect the 1st in the 2nd half of A from corresponding B\n"); range_disconnect_args.to_sel.type = OM_e_name; range_disconnect_args.to_sel.u_sel.name = chan_acb; range_disconnect_args.low_index = 0; range_disconnect_args.hi_index = 0; sts = om$make_message(classname = "Root", methodname = "range_disconnect", size = sizeof( struct range_disconnect_struct), p_arglist = &range_disconnect_args, p_msg = &range_disconnect_msg ); sts = om$send (msg = &range_disconnect_msg, senderid = a_objid[half_A], targetid = a_objid[half_A]); if (!(sts&1)) { printf ("error in om$send msg=disconnect A[half_A] case: %x \n", sts ); om$report_error(sts=sts); exit(); } /* Dump relations of the channel "acb" of A[half_A] */ printf("\n>>> Dump relations of the channel \"acb\" of A[half_A]\n"); printf("\n>>> A[%d]:",half_A); sts = OMT_dump_relation( OM_Gw_current_OS, a_objid[half_A], chan_acb); if(!(sts&1)) { printf("error in OMT_dump_relation for A[half_A]: %x\n", sts); om$report_error(sts=sts); exit(); } /* Dump relations of the channel "bca" for B[0] */ printf("\n>>> Dump relations of the channel \"bca\" of B[0] (A[MAXA/2])\n"); printf("\n>>>>>> note: \"A[half_A]\" was connected to B[0]"); printf("\n>>> B[0]:"); sts = OMT_dump_relation( OM_Gw_current_OS, b_objid[0], chan_bca); if(!(sts&1)) { printf("error in OMT_dump_relation for B[0] ( A[MAXA/2] case ): %x\n",i,sts); om$report_error(sts=sts); exit(); } /* Disconnect 1st half of objects connected to B[1] */ printf("\n>>> Disconnect 1st half of objects connected to B[1]\n"); range_disconnect_args.to_sel.type = OM_e_name; range_disconnect_args.to_sel.u_sel.name = chan_bca; range_disconnect_args.low_index = 0; range_disconnect_args.hi_index = half_A/2; sts = om$send (msg = &range_disconnect_msg, senderid = b_objid[1], targetid = b_objid[1] ); if (!(sts&1)) { printf ("error in om$disconnect range B[1] case: %x \n", sts ); om$report_error(sts=sts); exit(); } /* Dump relations of the channel "bca" of B[1] */ printf("\n>>> Dump relations on the channel \"bca\" of B[1]\n"); sts = OMT_dump_relation( OM_Gw_current_OS, b_objid[1], chan_bca); if(!(sts&1)) { printf("error in OMT_dump_relation for B[1]: %x\n", sts); om$report_error(sts=sts); exit(); } /* Dump relations on channel "acb" of all A's */ printf("\n>>> Dump relations on channel \"acb\" of all A's\n"); for(i=0; i<MAXA+1; i++) { printf("\n>>> A[%d]:",i); sts = OMT_dump_relation( OM_Gw_current_OS, a_objid[i], chan_acb); if(!(sts&1)) { printf("error in OMT_dump_relation for A[%d]: %x\n", i, sts); om$report_error(sts=sts); exit(); } } /* Disconnect All objects connected to A[0] on channel "acb" note: the last index of the relation is used if it is exceeded by the given "end" index */ printf("\n>>> Disconnect All objects connected to A[0] on channel \"acb\"\n"); range_disconnect_args.to_sel.type = OM_e_name; range_disconnect_args.to_sel.u_sel.name = chan_acb; range_disconnect_args.low_index = 0; range_disconnect_args.hi_index = MAXB+99; sts = om$send (msg = &range_disconnect_msg, senderid = a_objid[0], targetid = a_objid[0] ); if (!(sts&1)) { printf ("error in om$disconnect range A[0] case: %x \n", sts ); om$report_error(sts=sts); exit(); } /* Dump relations of the channel "acb" of A[0] */ printf("\n>>> Dump relations of the channel \"acb\" of A[0]\n"); sts = OMT_dump_relation( OM_Gw_current_OS, a_objid[0], chan_acb); if(!(sts&1)) { printf("error in OMT_dump_relation for A[0]: %x\n", sts); om$report_error(sts=sts); exit(); } /* Dump relations of the channel "bca" for all B's */ printf("\n>>> Dump relations of the channel \"bca\" for all B's\n"); for(i=0; i<MAXB+1; i++) { printf("\n>>> B[%d]:",i); sts = OMT_dump_relation( OM_Gw_current_OS, b_objid[i], chan_bca); if(!(sts&1)) { printf("error in OMT_dump_relation for B[%d]: %x\n", i, sts); om$report_error(sts=sts); exit(); } } /* Disconnect LAST A from LAST B */ printf("\n>>> Disconnect LAST A from LAST B \"acb\"\n"); range_disconnect_args.to_sel.type = OM_e_name; range_disconnect_args.to_sel.u_sel.name = chan_acb; range_disconnect_args.low_index = 0; range_disconnect_args.hi_index = MAXA; sts = om$send (msg = &range_disconnect_msg, senderid = a_objid[MAXA], targetid = a_objid[MAXA] ); if (!(sts&1)) { printf ("error in om$disconnect range LAST A & B case: %x \n", sts ); om$report_error(sts=sts); exit(); } /* Dump relations of the channel "acb" of A[MAXA] */ printf("\n>>> Dump relations of the channel \"acb\" of LAST A\n"); printf("\n>>> A[%d]:",MAXA); sts = OMT_dump_relation( OM_Gw_current_OS, a_objid[MAXA], chan_acb); if(!(sts&1)) { printf("error in OMT_dump_relation for LAST A: %x\n", sts); om$report_error(sts=sts); exit(); } /* Dump relations of the channel "bca" for B[MAXB] */ printf("\n>>> Dump relations of the channel \"bca\" of LAST B\n"); printf("\n>>> B[%d]:",MAXB); sts = OMT_dump_relation( OM_Gw_current_OS, b_objid[MAXB], chan_bca); if(!(sts&1)) { printf("error in OMT_dump_relation for LAST B: %x\n", i, sts); om$report_error(sts=sts); exit(); } /*************************************************************/ /* Restricted Section */ /*************************************************************/ printf("\n\n******************************************************\n"); printf(" Restricted Tests\n"); printf("******************************************************\n\n"); chan_resacb = "ResA.acb"; chan_resbca = "ResB.bca"; /* Construct ResA's */ printf("\n>>> Table of ResA's object IDs::\n"); for (i=0; i<MAXA+1; i++) { sts = om$construct (osname="OM_TransOS_0",classname="ResA", p_objid=&resa_objid[i] ); if (!(sts&1)) { printf ("error in om$construct object ResA[%d]: %x \n", i, sts ); om$report_error(sts=sts); exit(); } printf("\n>>> ResA[%d]: %d",i,resa_objid[i]); } /* Construct ResB's */ printf("\n\n>>> Table of ResB's object IDs::\n"); for (i=0; i<MAXB+1; i++) { sts = om$construct (osname="OM_TransOS_0",classname="ResB", p_objid=&resb_objid[i] ); if (!(sts&1)) { printf ("error in om$construct object ResB[%d]: %x \n", i, sts ); om$report_error(sts=sts); exit(); } printf("\n>>> ResB[%d]: %d ",i,resb_objid[i]); } /* Connect last ResA to last ResB */ printf("\n\n>>> Connect Last ResA to Last ResB\n"); 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[MAXA]; 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$make_message(classname = "Root", methodname = "connect", size = sizeof( struct connect_struct), p_arglist = &connect_args, p_msg = &connect_msg ); if(!(sts&1)) { printf("error in om$make_message for connect: %x\n", sts); om$report_error(sts=sts); exit(); } sts = om$send (msg = &connect_msg, senderid = resa_objid[MAXA], targetid = resb_objid[MAXB] ); if (!(sts&1)) { printf ("error in om$send msg=connect LAST ResA to LAST ResB: %x\n", i, sts ); om$report_error(sts=sts); exit(); } /* Connect last half of ResB's to ResA[0] */ printf("\n\n>>> Connect last half of ResB's to ResA[0]"); 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[0]; 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; for (i=half_B; i<MAXB; i++) { sts = om$send (msg = &connect_msg, senderid = resa_objid[0], targetid = resb_objid[i] ); if (!(sts&1)) { printf ("error in om$send msg=connect ResB[%d]: %x \n", i, sts ); om$report_error(sts=sts); printf("iteration: %d\n", i); exit(); } } /* Connect last half of ResA's to ResB[0] */ printf("\n\n>>> Connect last half of ResA's to ResB[0]"); connect_args.to_sel.type = OM_e_name; connect_args.to_sel.u_sel.name = chan_resacb; connect_args.to_idx = 0; connect_args.fr_objid = resb_objid[0]; connect_args.fr_os = OM_Gw_current_OS; connect_args.fr_sel.type = OM_e_name; connect_args.fr_sel.u_sel.name = chan_resbca; connect_args.fr_idx = 0; for (i=half_A; i<MAXA; i++) { sts = om$send (msg = &connect_msg, senderid = resb_objid[0], targetid = resa_objid[i] ); if (!(sts&1)) { printf ("error in om$send msg=connect ResA[%d]: %x \n", i, sts ); om$report_error(sts=sts); printf("iteration: %d\n", i); exit(); } } /* Connect first half of ResB's to ResA[1] note: a many-to-many object existed for ResB[0] thus a connection between two many-to-many objects occurs */ printf("\n\n>>> Connect first half of ResB's to ResA[1]"); printf("\n>>>>>> note: an entry was inserted into ResB[0]'s bca channel"); printf("\n>>>>>> linking itself to ResA[1]'s acb channel"); 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[1]; 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; for (i=0; i<half_B; i++) { sts = om$send (msg = &connect_msg, senderid = resa_objid[1], targetid = resb_objid[i] ); if (!(sts&1)) { printf ("error in om$send msg=connect ResB[%d]: %x \n", i, sts ); om$report_error(sts=sts); printf("iteration: %d\n", i); exit(); } } /* Connect first half of ResA's to ResB[1] note: a many-to-many connection existed for ResA[0] thus a connection between two many-to-many connections occurs */ printf("\n\n>>> Connect first half of ResA's to ResB[1]"); printf("\n>>>>>> note: an entry was inserted into ResA[0]'s acb channel"); printf("\n>>>>>> linking itself to ResB[1]'s bca channel"); connect_args.to_sel.type = OM_e_name; connect_args.to_sel.u_sel.name = chan_resacb; connect_args.to_idx = 0; connect_args.fr_objid = resb_objid[1]; connect_args.fr_os = OM_Gw_current_OS; connect_args.fr_sel.type = OM_e_name; connect_args.fr_sel.u_sel.name = chan_resbca; connect_args.fr_idx = 0; for (i=0; i<half_A; i++) { sts = om$send (msg = &connect_msg, senderid = resb_objid[1], targetid = resa_objid[i] ); if (!(sts&1)) { printf ("error in om$send msg=connect ResA[%d]: %x \n", i, sts ); om$report_error(sts=sts); printf("iteration: %d\n", i); exit(); } } /* For each ResB dump relations */ printf("\n\n>>> For each ResB dump relations::\n"); for(i=0; i<MAXB+1; i++) { printf("\n>>> ResB[%d]:",i); sts = OMT_dump_relation( OM_Gw_current_OS, resb_objid[i], chan_resbca); if(!(sts&1)) { printf("error in OMT_dump_relation for ResB[%d]: %x\n", i, sts); om$report_error(sts=sts); exit(); } } /* Make message to send to ResB objects */ sts = om$make_message(classname="ResB",methodname="show_b",p_msg=&showb); if(!(sts&1)) { printf("error in om$make_message for show_b: %x\n", sts); om$report_error(sts=sts); exit(); } /* Send message to all ResB objects connected on ResA[0]'s "acb" channel */ printf("\n>>> Send message to all ResB's connected on ResA[0]'s \"acb\" chan\n"); chansel.type = OM_e_name; chansel.u_sel.name = "ResA.acb"; sts = om$send (msg=&showb,mode=OM_e_wrt_object,senderid=resa_objid[0], p_chanselect=&chansel ); if(!(sts&1)) { printf("error in om$send msg=show_b ResA[0]: %x\n", sts); om$report_error(sts=sts); exit(); } /* Send message to all ResB objects connected on ResA[1]'s "acb" channel */ printf("\n>>> Send message to all ResB's connected on ResA[1]'s \"acb\" chan\n"); chansel.type = OM_e_name; chansel.u_sel.name = "ResA.acb"; sts = om$send (msg=&showb,mode=OM_e_wrt_object,senderid=resa_objid[1], p_chanselect=&chansel ); if(!(sts&1)) { printf("error in om$send msg= show_b ResA[1]: %x\n", sts); om$report_error(sts=sts); exit(); } /* For each ResA dump relations */ printf("\n>>> For each ResA dump relations\n"); for(i=0; i<MAXA+1; i++) { printf("\n>>> ResA[%d]:",i); sts = OMT_dump_relation( OM_Gw_current_OS, resa_objid[i], chan_resacb); if(!(sts&1)) { printf("error in OMT_dump_relation for ResA[%d]: %x\n", i, sts); om$report_error(sts=sts); exit(); } } /* Make message to send to ResA objects */ sts = om$make_message(classname="ResA",methodname="show_a",p_msg=&showa); if(!(sts&1)) { printf("error in om$make_message for show_a: %x\n", sts); om$report_error(sts=sts); exit(); } /* Send message to all ResA objects connected on ResB[0]'s "bca" channel */ printf("\n>>> Send message to all ResA's connected on ResB[0]'s \"bca\" chan\n"); chansel.type = OM_e_name; chansel.u_sel.name = "ResB.bca"; sts = om$send (msg=&showa,mode=OM_e_wrt_object,senderid=resb_objid[0], p_chanselect=&chansel ); if(!(sts&1)) { printf("error in om$send msg= show_a ResB[0]: %x\n", sts); om$report_error(sts=sts); exit(); } /* Send message to all ResA objects connected on ResB[1]'s "bca" channel */ printf("\n>>> Send message to all ResA's connected on ResB[1]'s \"bca\" chan\n"); chansel.type = OM_e_name; chansel.u_sel.name = "ResB.bca"; sts = om$send (msg=&showa,mode=OM_e_wrt_object,senderid=resb_objid[1], p_chanselect=&chansel ); if(!(sts&1)) { printf("error in om$send msg= show_a ResB[1]: %x\n", sts); om$report_error(sts=sts); exit(); } /* Disconnect the first ResA contained wihtin the last half of ResA's from it's associated ResB. note: Remember that the last half of the ResA's were connected to ResB[0] (see above). */ printf("\n>>> Disconnect the 1st in the 2nd half of ResA from corresponding ResB\n"); range_disconnect_args.to_sel.type = OM_e_name; range_disconnect_args.to_sel.u_sel.name = chan_resacb; range_disconnect_args.low_index = 0; range_disconnect_args.hi_index = 0; sts = om$make_message(classname = "Root", methodname = "range_disconnect", size = sizeof( struct range_disconnect_struct), p_arglist = &range_disconnect_args, p_msg = &range_disconnect_msg ); sts = om$send (msg = &range_disconnect_msg, senderid = resa_objid[half_A], targetid = resa_objid[half_A]); if (!(sts&1)) { printf ("error in om$send msg=disconnect ResA[half_A] case: %x \n", sts ); om$report_error(sts=sts); exit(); } /* Dump relations of the channel "acb" of ResA[half_A] */ printf("\n>>> Dump relations of the channel \"acb\" of ResA[half_A]\n"); printf("\n>>> ResA[%d]:",half_A); sts = OMT_dump_relation( OM_Gw_current_OS, resa_objid[half_A], chan_resacb); if(!(sts&1)) { printf("error in OMT_dump_relation for ResA[half_A]: %x\n", sts); om$report_error(sts=sts); exit(); } /* Dump relations of the channel "bca" for ResB[0] */ printf("\n>>> Dump relations of the channel \"bca\" of ResB[0] (ResA[MAXA/2])\n"); printf("\n>>>>>> note: \"ResA[half_A]\" was connected to ResB[0]"); printf("\n>>> ResB[0]:"); sts = OMT_dump_relation( OM_Gw_current_OS, resb_objid[0], chan_resbca); if(!(sts&1)) { printf("error in OMT_dump_relation for ResB[0] ( ResA[MAXA/2] case ): %x\n",i,sts); om$report_error(sts=sts); exit(); } /* Disconnect 1st half of objects connected to ResB[1] */ printf("\n>>> Disconnect 1st half of objects connected to ResB[1]\n"); range_disconnect_args.to_sel.type = OM_e_name; range_disconnect_args.to_sel.u_sel.name = chan_resbca; range_disconnect_args.low_index = 0; range_disconnect_args.hi_index = half_A/2; sts = om$send (msg = &range_disconnect_msg, senderid = resb_objid[1], targetid = resb_objid[1] ); if (!(sts&1)) { printf ("error in om$disconnect range ResB[1] case: %x \n", sts ); om$report_error(sts=sts); exit(); } /* Dump relations of the channel "bca" of ResB[1] */ printf("\n>>> Dump relations on the channel \"bca\" of ResB[1]\n"); sts = OMT_dump_relation( OM_Gw_current_OS, resb_objid[1], chan_resbca); if(!(sts&1)) { printf("error in OMT_dump_relation for ResB[1]: %x\n", sts); om$report_error(sts=sts); exit(); } /* Dump relations on channel "acb" of all ResA's */ printf("\n>>> Dump relations on channel \"acb\" of all A's\n"); for(i=0; i<MAXA+1; i++) { printf("\n>>> ResA[%d]:",i); sts = OMT_dump_relation( OM_Gw_current_OS, resa_objid[i], chan_resacb); if(!(sts&1)) { printf("error in OMT_dump_relation for ResA[%d]: %x\n", i, sts); om$report_error(sts=sts); exit(); } } /* Disconnect All objects connected to ResA[0] on channel "acb" note: the last index of the relation is used if it is exceeded by the given "end" index */ printf("\n>>> Disconnect All objects connected to ResA[0] on channel \"acb\"\n"); range_disconnect_args.to_sel.type = OM_e_name; range_disconnect_args.to_sel.u_sel.name = chan_resacb; range_disconnect_args.low_index = 0; range_disconnect_args.hi_index = MAXB+99; sts = om$send (msg = &range_disconnect_msg, senderid = resa_objid[0], targetid = resa_objid[0] ); if (!(sts&1)) { printf ("error in om$disconnect range ResA[0] case: %x \n", sts ); om$report_error(sts=sts); exit(); } /* Dump relations of the channel "acb" of A[0] */ printf("\n>>> Dump relations of the channel \"acb\" of ResA[0]\n"); sts = OMT_dump_relation( OM_Gw_current_OS, resa_objid[0], chan_resacb); if(!(sts&1)) { printf("error in OMT_dump_relation for ResA[0]: %x\n", sts); om$report_error(sts=sts); exit(); } /* Dump relations of the channel "bca" for all ResB's */ printf("\n>>> Dump relations of the channel \"bca\" for all ResB's\n"); for(i=0; i<MAXB+1; i++) { printf("\n>>> ResB[%d]:",i); sts = OMT_dump_relation( OM_Gw_current_OS, resb_objid[i], chan_resbca); if(!(sts&1)) { printf("error in OMT_dump_relation for ResB[%d]: %x\n", i, sts); om$report_error(sts=sts); exit(); } } /* Disconnect LAST A from LAST ResB */ printf("\n>>> Disconnect LAST ResA from LAST ResB \"acb\"\n"); range_disconnect_args.to_sel.type = OM_e_name; range_disconnect_args.to_sel.u_sel.name = chan_resacb; range_disconnect_args.low_index = 0; range_disconnect_args.hi_index = MAXA; sts = om$send (msg = &range_disconnect_msg, senderid = resa_objid[MAXA], targetid = resa_objid[MAXA] ); if (!(sts&1)) { printf ("error in om$disconnect range LAST ResA & ResB case: %x \n", sts ); om$report_error(sts=sts); exit(); } /* Dump relations of the channel "acb" of ResA[MAXA] */ printf("\n>>> Dump relations of the channel \"acb\" of LAST ResA\n"); printf("\n>>> ResA[%d]:",MAXA); sts = OMT_dump_relation( OM_Gw_current_OS, resa_objid[MAXA], chan_resacb); if(!(sts&1)) { printf("error in OMT_dump_relation for LAST ResA: %x\n", sts); om$report_error(sts=sts); exit(); } /* Dump relations of the channel "bca" for ResB[MAXB] */ printf("\n>>> Dump relations of the channel \"bca\" of LAST ResB\n"); printf("\n>>> ResB[%d]:",MAXB); sts = OMT_dump_relation( OM_Gw_current_OS, resb_objid[MAXB], chan_resbca); if(!(sts&1)) { printf("error in OMT_dump_relation for LAST ResB: %x\n", i, sts); om$report_error(sts=sts); exit(); } }