Annotation of OpenXM/src/kan96xx/plugin/Old/oxmisc2.c, Revision 1.1
1.1 ! maekawa 1: #include <stdio.h>
! 2: #include "ox_kan.h"
! 3: #include "oxmisc2.h" /* This file requires sm1 object description. */
! 4: extern FILE *MyErrorOut;
! 5:
! 6: int oxGet(oxclientp client, struct object *op,int *isObj)
! 7: /* This method should be synchronized. */
! 8: /* oxGet is a function for client. */
! 9: {
! 10: int ans;
! 11: ox_stream os;
! 12: int m;
! 13: struct object rob;
! 14: *isObj = 0;
! 15: op->tag = Snull;
! 16: os = client->datafp2;
! 17: switch(client->dstate) {
! 18: case DSTATE_ANY:
! 19: m = oxGetInt32(os);
! 20: switch(m) {
! 21: case OX_DATA:
! 22: client->dstate = DSTATE_WAIT_OX_DATA;
! 23: return(oxGet(client,op,isObj));
! 24: case OX_SYNC_BALL:
! 25: client->dstate = DSTATE_ANY;
! 26: return(OX_SYNC_BALL);
! 27: default:
! 28: errorOxmisc2("oxGet: cannot handle this tag.\n");
! 29: client->dstate = DSTATE_ERROR;
! 30: return(-1);
! 31: }
! 32: break;
! 33: case DSTATE_FIRST_SYNC: /* waiting the first sync ball */
! 34: /* I need to clear the buffer?? */
! 35: oxWaitSyncBall(os);
! 36: client->dstate = DSTATE_ANY;
! 37: oxSendSyncBall(os);
! 38: return(OX_SYNC_BALL);
! 39: break;
! 40: case DSTATE_WAIT_OX_DATA: /* waiting a cmo data. */
! 41: *op = cmoObjectFromStream2(client->datafp2);
! 42: client->dstate = DSTATE_ANY;
! 43: *isObj = 1;
! 44: return(0);
! 45: break;
! 46: case DSTATE_ERROR:
! 47: client->dstate = DSTATE_ERROR;
! 48: errorOxmisc2("oxGet: dstate == DSTATE_ERROR (error state)\n");
! 49: return(-1);
! 50: default:
! 51: client->dstate = DSTATE_ERROR;
! 52: errorOxmisc2("oxGet: Unknown state number.");
! 53: }
! 54:
! 55: return(-1);
! 56: }
! 57:
! 58: int oxGetFromControl(oxclientp client)
! 59: {
! 60: int ans = -1;
! 61: if (client->cstate != -1) {
! 62: ans = oxGetResultOfControlInt32(client->controlfd);
! 63: if (ans != -1) { client->cstate = 0; }
! 64: else {client->cstate = -1; }
! 65: }
! 66: return(ans);
! 67: }
! 68:
! 69: int oxReq(oxclientp client,int func,struct object ob)
! 70: {
! 71: /* request to the control channel */
! 72: if (func == SM_control_reset_connection ||
! 73: func == SM_control_kill) {
! 74: switch(func) {
! 75: case SM_control_reset_connection:
! 76: oxReqControlResetConnection(client->controlfd);
! 77: client->cstate = 1;
! 78: client->dstate = DSTATE_FIRST_SYNC;
! 79: break;
! 80: case SM_control_kill:
! 81: oxReqControlKill(client->controlfd);
! 82: client->cstate = 0;
! 83: client->dstate = DSTATE_ANY;
! 84: break;
! 85: }
! 86: fflush(NULL);
! 87: return(0);
! 88: }
! 89:
! 90: /* request to the data channel */
! 91: if (client->dstate != DSTATE_ANY) {
! 92: errorOxmisc2("oxReq: client->dstate != DSTATE_ANY, data channel is not ready to send data.\n");
! 93: return(-1);
! 94: }
! 95: switch(func) {
! 96: case SM_DUMMY_sendcmo:
! 97: oxSendInt32(client->datafp2,OX_DATA);
! 98: cmoObjectToStream2(ob,client->datafp2);
! 99: client->dstate = DSTATE_ANY;
! 100: break;
! 101: case SM_sync_ball:
! 102: oxSendSyncBall(client->datafp2);
! 103: client->dstate = DSTATE_ANY; /* We do not expect the sync ball.*/
! 104: client->cstate = 0; /* clear the cstate */
! 105: break;
! 106: case SM_popCMO:
! 107: oxReqPopCMO(client->datafp2);
! 108: client->dstate = DSTATE_ANY;
! 109: break;
! 110: case SM_mathcap:
! 111: oxReqMathCap(client->datafp2);
! 112: client->dstate = DSTATE_ANY;
! 113: break;
! 114: case SM_pops:
! 115: if (ob.tag != Sinteger) {
! 116: errorOxmisc2("SM_pops : the argument must be an integer.");
! 117: return(-1);
! 118: }
! 119: oxReqPops(client->datafp2, KopInteger(ob));
! 120: client->dstate = DSTATE_ANY;
! 121: break;
! 122: case SM_executeStringByLocalParser:
! 123: if (ob.tag != Sdollar) {
! 124: errorOxmisc2("SM_executeStringByLocalParser : the argument must be a string.");
! 125: return(-1);
! 126: }
! 127: oxReqExecuteStringByLocalParser(client->datafp2,KopString(ob));
! 128: client->dstate = DSTATE_ANY;
! 129: break;
! 130: case SM_executeFunction:
! 131: if (ob.tag != Sdollar) {
! 132: errorOxmisc2("SM_executeFunction : the argument must be a string.");
! 133: return(-1);
! 134: }
! 135: oxReqExecuteFunction(client->datafp2,KopString(ob));
! 136: client->dstate = DSTATE_ANY;
! 137: break;
! 138: case SM_popString:
! 139: oxReqPopString(client->datafp2);
! 140: client->dstate = DSTATE_ANY;
! 141: break;
! 142: case SM_evalName:
! 143: if (ob.tag != Sdollar) {
! 144: errorOxmisc2("SM_evalName : the argument must be a string.");
! 145: return(-1);
! 146: }
! 147: oxReqEvalName(client->datafp2,KopString(ob));
! 148: client->dstate = DSTATE_ANY;
! 149: break;
! 150: case SM_setName:
! 151: if (ob.tag != Sdollar) {
! 152: errorOxmisc2("SM_setName : the argument must be a string.");
! 153: return(-1);
! 154: }
! 155: oxReqSetName(client->datafp2,KopString(ob));
! 156: client->dstate = DSTATE_ANY;
! 157: break;
! 158: default:
! 159: fprintf(MyErrorOut,"func=%d ",func);
! 160: errorOxmisc2("This function is not implemented.");
! 161: break;
! 162: }
! 163: fp2fflush(client->datafp2);
! 164: return(0);
! 165: }
! 166:
! 167: struct object KoxCreateClient(struct object ip,
! 168: struct object portStream,
! 169: struct object portControl)
! 170: {
! 171: struct object rob;
! 172: oxclientp client;
! 173: rob.tag = Snull;
! 174: if (ip.tag != Sdollar) {
! 175: errorOxmisc2("KoxCreateClient(): The first argument must be a hostname given by a string.");
! 176: return(rob);
! 177: }
! 178: if (portStream.tag == Sdollar) {
! 179: client = oxCreateClientFile(KopString(ip),KopString(portStream),
! 180: "/dev/null","w");
! 181: if (client == NULL) {
! 182: errorOxmisc2("KoxCreateClient(): Open error.");
! 183: return(rob);
! 184: }
! 185: rob = newObjectArray(N_OF_CLIENT_FIELDS);
! 186: oxClientToObject(client,rob);
! 187: return(rob);
! 188: }
! 189:
! 190: if (portStream.tag != Sinteger) {
! 191: errorOxmisc2("KoxCreateClient(): The second argument must be a port number given in an integer.");
! 192: return(rob);
! 193: }
! 194: if (portControl.tag != Sinteger) {
! 195: errorOxmisc2("KoxCreateClient(): The third argument must be a port number given in an integer.");
! 196: return(rob);
! 197: }
! 198: client = oxCreateClient(KopString(ip),KopInteger(portStream),KopInteger(portControl));
! 199: if (client == NULL) {
! 200: errorOxmisc2("KoxCreateClient(): Open error.");
! 201: return(rob);
! 202: }
! 203: rob = newObjectArray(N_OF_CLIENT_FIELDS);
! 204: oxClientToObject(client,rob);
! 205: return(rob);
! 206: }
! 207:
! 208: static int isItClientObject(struct object ob)
! 209: {
! 210: int size,i;
! 211: struct object ee[N_OF_CLIENT_FIELDS];
! 212: if (ob.tag != Sarray) {
! 213: return(0);
! 214: }
! 215: size = getoaSize(ob);
! 216: if (size != N_OF_CLIENT_FIELDS) return(0);
! 217: for (i=0; i<N_OF_CLIENT_FIELDS; i++) {
! 218: ee[i] = getoa(ob,i);
! 219: }
! 220:
! 221: if (ee[0].tag != Sdollar) return(0);
! 222: if (strcmp(KopString(ee[0]),"client")!=0) return(0);
! 223:
! 224: if (ee[1].tag != Sfile) return(0);
! 225: if (strcmp((ee[1]).lc.str,MAGIC2) != 0) return(0);
! 226:
! 227: for (i=2; i<N_OF_CLIENT_FIELDS; i++) {
! 228: if (ee[i].tag != Sinteger) return(0);
! 229: }
! 230: return(1);
! 231: }
! 232:
! 233:
! 234: struct object KoxIsThereErrorClient(struct object ob)
! 235: {
! 236: struct object rob;
! 237: int ans;
! 238: int size;
! 239: oxclient cc;
! 240: rob.tag = Snull;
! 241: if (!isItClientObject(ob)) {
! 242: errorOxmisc2("KoxIsThereErrorClient(): the argument must be an array for client object.");
! 243: return(rob);
! 244: }
! 245: if (oxObjectToClient(ob,&cc) == -1) return(KpoInteger(-1));
! 246: ans = oxIsThereErrorClient(&cc);
! 247: return(KpoInteger(ans));
! 248: }
! 249:
! 250: int oxClientToObject(oxclientp client,struct object rob)
! 251: {
! 252: struct object ob;
! 253: if (client == NULL) return;
! 254: /* rob = newObjectArray(N_OF_CLIENT_FIELDS); */
! 255: if (rob.tag != Sarray) {
! 256: errorOxmisc2("oxClientToObject(): the second argument must be an array.");
! 257: return(-1);
! 258: }
! 259: if (getoaSize(rob) != N_OF_CLIENT_FIELDS) {
! 260: errorOxmisc2("oxClientToObject(): the second argument must be an array of size N_OF_CLIENT_FIELDS.");
! 261: return(-1);
! 262: }
! 263:
! 264: ob = KpoString("client");
! 265: putoa(rob,0,ob);
! 266:
! 267: ob.tag = Sfile; ob.lc.str = MAGIC2; ob.rc.voidp = (void *)(client->datafp2);
! 268: putoa(rob,1,ob);
! 269:
! 270: putoa(rob,2,KpoInteger(client->dataport));
! 271: putoa(rob,3,KpoInteger(client->controlfd));
! 272: putoa(rob,4,KpoInteger(client->controlport));
! 273: putoa(rob,5,KpoInteger(client->dstate));
! 274: putoa(rob,6,KpoInteger(client->cstate));
! 275: putoa(rob,7,KpoInteger(client->humanio));
! 276: putoa(rob,8,KpoInteger(client->id));
! 277: putoa(rob,9,KpoInteger(client->type));
! 278: return(0);
! 279: }
! 280:
! 281: int oxObjectToClient(struct object ob,oxclientp cp)
! 282: {
! 283: struct object ob1;
! 284: if (cp == NULL) {
! 285: errorOxmisc2("oxObjectToClient(): the second argument is NULL");
! 286: return(-1);
! 287: }
! 288: if (!isItClientObject(ob)) {
! 289: errorOxmisc2("oxObjectToClient(): the first argument is not client object.");
! 290: oxInitClient(cp);
! 291: return(-1);
! 292: }
! 293:
! 294: ob1 = getoa(ob,1);
! 295: cp->datafp2 = (FILE2 *) (ob1.rc.voidp);
! 296:
! 297: ob1 = getoa(ob,2);
! 298: cp->dataport = KopInteger(ob1);
! 299:
! 300: ob1 = getoa(ob,3);
! 301: cp->controlfd = KopInteger(ob1);
! 302:
! 303: ob1 = getoa(ob,4);
! 304: cp->controlport = KopInteger(ob1);
! 305:
! 306: ob1 = getoa(ob,5);
! 307: cp->dstate = KopInteger(ob1);
! 308:
! 309: ob1 = getoa(ob,6);
! 310: cp->cstate = KopInteger(ob1);
! 311:
! 312: ob1 = getoa(ob,7);
! 313: cp->humanio = KopInteger(ob1);
! 314:
! 315: ob1 = getoa(ob,8);
! 316: cp->id = KopInteger(ob1);
! 317:
! 318: ob1 = getoa(ob,9);
! 319: cp->type = KopInteger(ob1);
! 320:
! 321: return(0);
! 322: }
! 323:
! 324: struct object KoxReq(struct object client,
! 325: struct object func,
! 326: struct object ob1)
! 327: {
! 328: int ans;
! 329: static oxclientp cc1 = NULL;
! 330: struct object rob;
! 331: rob.tag = Snull;
! 332: if (cc1 == NULL) {
! 333: cc1 = (oxclientp) mymalloc(sizeof(oxclient));
! 334: if (cc1 == NULL) {
! 335: errorOxmisc2("KoxReq(): no more memory.");
! 336: return(rob);
! 337: }
! 338: oxInitClient(cc1);
! 339: }
! 340:
! 341: if (oxObjectToClient(client,cc1) == -1) return(rob);
! 342: if (cc1 == NULL) {
! 343: errorOxmisc2("KoxReq(): the first argument must be a client object.");
! 344: return(rob);
! 345: }
! 346: if (func.tag != Sinteger) {
! 347: errorOxmisc2("KoxReq(): the second argument must be an integer.");
! 348: return(rob);
! 349: }
! 350: ans = oxReq(cc1,KopInteger(func),ob1);
! 351: /* synchronize cc1 and client. */
! 352: oxClientToObject(cc1,client);
! 353:
! 354: return(KpoInteger(ans));
! 355: }
! 356:
! 357: struct object KoxGet(struct object client)
! 358: {
! 359: int ans,k;
! 360: static oxclientp cc1 = NULL;
! 361: struct object rob;
! 362: rob.tag = Snull;
! 363: if (cc1 == NULL) {
! 364: cc1 = (oxclientp) mymalloc(sizeof(oxclient));
! 365: if (cc1 == NULL) {
! 366: errorOxmisc2("KoxGet(): no more memory.");
! 367: return(rob);
! 368: }
! 369: oxInitClient(cc1);
! 370: }
! 371:
! 372: if (oxObjectToClient(client,cc1) == -1) return(rob);
! 373: if (cc1 == NULL) {
! 374: errorOxmisc2("KoxGet(): the first argument must be a client object.");
! 375: return(rob);
! 376: }
! 377:
! 378: ans = oxGet(cc1,&rob,&k);
! 379: /* synchronize cc1 and client. */
! 380: oxClientToObject(cc1,client);
! 381:
! 382: if (k) return(rob);
! 383: else {
! 384: return(KpoInteger(ans));
! 385: }
! 386: }
! 387:
! 388: struct object KoxGetFromControl(struct object client)
! 389: {
! 390: int ans;
! 391: static oxclientp cc1 = NULL;
! 392: struct object rob;
! 393: rob.tag = Snull;
! 394: if (cc1 == NULL) {
! 395: cc1 = (oxclientp) mymalloc(sizeof(oxclient));
! 396: if (cc1 == NULL) {
! 397: errorOxmisc2("KoxGetFromControl(): no more memory.");
! 398: return(rob);
! 399: }
! 400: oxInitClient(cc1);
! 401: }
! 402:
! 403: if (oxObjectToClient(client,cc1) == -1) return(rob);
! 404: if (cc1 == NULL) {
! 405: errorOxmisc2("KoxGetFromControl(): the first argument must be a client object.");
! 406: return(rob);
! 407: }
! 408:
! 409: ans = oxGetFromControl(cc1);
! 410: /* synchronize cc1 and client. */
! 411: oxClientToObject(cc1,client);
! 412:
! 413: return(KpoInteger(ans));
! 414: }
! 415:
! 416: struct object KoxMultiSelect(struct object oclients,struct object t)
! 417: {
! 418: static int first = 1;
! 419: static int csize = 0;
! 420: static oxclientp *clients = NULL;
! 421: oxclientp cc1;
! 422: struct object rob;
! 423: int i;
! 424: int tt;
! 425: struct object ob1;
! 426: struct object ob2;
! 427: struct object ob0;
! 428: int size;
! 429: int ans;
! 430: int dataready[1024];
! 431: int controlready[1024];
! 432:
! 433: rob.tag = Snull;
! 434: if (oclients.tag != Sarray) {
! 435: errorOxmisc2("KoxMultiSelect(): the first argument must be an array.");
! 436: return(rob);
! 437: }
! 438: size = getoaSize(oclients);
! 439: if (first) {
! 440: first = 0; csize = size;
! 441: clients = (oxclientp *)mymalloc(sizeof(oxclientp)*(size+1));
! 442: if (clients == NULL) {
! 443: errorOxmisc2("KoxMultiSelect(): no more memory.");
! 444: return(rob);
! 445: }
! 446: for (i=0; i<size; i++) {
! 447: clients[i] = (oxclientp) mymalloc(sizeof(oxclient));
! 448: if (clients[i] == NULL) {
! 449: errorOxmisc2("KoxMultiSelect(): no more memory.");
! 450: return(rob);
! 451: }
! 452: oxInitClient(clients[i]);
! 453: }
! 454: }
! 455: if (csize < size) {
! 456: first = 1;
! 457: return(KoxMultiSelect(oclients,t));
! 458: }
! 459: for (i=0; i<size; i++) {
! 460: ob0 = getoa(oclients,i);
! 461: if (oxObjectToClient(ob0,clients[i]) == -1) return(rob);
! 462: }
! 463: if (t.tag != Sinteger) {
! 464: errorOxmisc2("KoxMultiSelect(): the second argument must be an integer.");
! 465: }
! 466: tt = KopInteger(t);
! 467: ans = oxclientMultiSelect(clients,dataready,controlready,size,tt);
! 468: /* synchronize oclients and clients. */
! 469: for (i=0; i<size; i++) {
! 470: ob0 = getoa(oclients,i);
! 471: oxClientToObject(clients[i],ob0);
! 472: putoa(oclients,i,ob0);
! 473: }
! 474: rob = newObjectArray(3);
! 475: putoa(rob,0,KpoInteger(ans));
! 476: ob1 = newObjectArray(size);
! 477: ob2 = newObjectArray(size);
! 478: for (i=0; i<size; i++) {
! 479: putoa(ob1,i,KpoInteger(dataready[i]));
! 480: putoa(ob2,i,KpoInteger(controlready[i]));
! 481: }
! 482: putoa(rob,1,ob1);
! 483: putoa(rob,2,ob2);
! 484: return(rob);
! 485: }
! 486:
! 487: struct object KoxWatch(struct object client,struct object f)
! 488: /* f is not used for now. It should be log file. */
! 489: {
! 490: int ans,k;
! 491: static oxclientp cc1 = NULL;
! 492: struct object rob;
! 493: rob.tag = Snull;
! 494: if (cc1 == NULL) {
! 495: cc1 = (oxclientp) mymalloc(sizeof(oxclient));
! 496: if (cc1 == NULL) {
! 497: errorOxmisc2("KoxWatch(): no more memory.");
! 498: return(rob);
! 499: }
! 500: oxInitClient(cc1);
! 501: }
! 502:
! 503: if (oxObjectToClient(client,cc1) == -1) return(rob);
! 504: if (cc1 == NULL) {
! 505: errorOxmisc2("KoxWatch(): the first argument must be a client object.");
! 506: return(rob);
! 507: }
! 508:
! 509: k = fp2watch(cc1->datafp2,stdout);
! 510: /* synchronize cc1 and client. */
! 511: oxClientToObject(cc1,client);
! 512:
! 513: return(KpoInteger(ans));
! 514: }
! 515:
! 516:
! 517: struct object KoxCloseClient(struct object client) {
! 518: oxclientp cc1 = NULL;
! 519: oxclient cc;
! 520: struct object rob;
! 521: rob.tag = Snull;
! 522: cc1 = &cc;
! 523: if (oxObjectToClient(client,cc1) == -1) return(rob);
! 524: if (cc1 == NULL) {
! 525: errorOxmisc2("KoxCloseClient(): the first argument must be a client object.");
! 526: return(rob);
! 527: }
! 528:
! 529: fp2fflush(cc1->datafp2);
! 530: if (cc1->humanio) {
! 531: /* Do not close the file. */
! 532: return(KpoInteger(0));
! 533: }
! 534: switch (cc1->type) {
! 535: case CLIENT_SOCKET:
! 536: fp2fclose(cc1->datafp2);
! 537: close(cc1->controlfd);
! 538: break;
! 539: case CLIENT_FILE:
! 540: fp2fclose(cc1->datafp2);
! 541: close(cc1->controlfd);
! 542: break;
! 543: default:
! 544: errorOxmisc2("Unknown client->type\n");
! 545: break;
! 546: }
! 547: return(KpoInteger(0));
! 548:
! 549: }
! 550:
! 551:
! 552: errorOxmisc2(char *s) {
! 553: fprintf(MyErrorOut,"error in oxmisc2.c: %s\n",s);
! 554: return;
! 555: }
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>