Annotation of OpenXM/src/k097/lib/ox/ox.k, Revision 1.6
1.6 ! takayama 1: /* $OpenXM: OpenXM/src/k097/lib/ox/ox.k,v 1.5 2000/12/12 13:58:21 takayama Exp $ */
1.3 takayama 2:
1.5 takayama 3: /* Load_sm1(["ox.sm1",AddString([GetEnv("OpenXM_HOME"),"/lib/sm1/ox.sm1"])],
4: "ox.sm1.loaded"); */
5: Load_sm1(["oxasir.sm1",AddString([GetEnv("OpenXM_HOME"),
6: "/lib/sm1/oxasir.sm1"])],
7: "oxasir.sm1.loaded");
1.3 takayama 8:
9: class OXchannel extends Object {
10: local channel;
11: /* Just add a tag. */
1.5 takayama 12: def getChannel() {
13: return(channel);
14: }
1.3 takayama 15: def generate(c) {
16: this = new();
17: if (IsArray(c)) {
18: if (c[0] != "client") {
19: Error("OXchannel.generate(c) : c is not client object.");
20: }
21: }else{
22: Error("OXchannel.generate(c) : c is not client object.");
23: }
24: channel = c;
25: return(this);
26: }
27:
28: def pushCMO(ob) {
29: local cc;
30: cc = channel;
31: sm1(" cc ob oxpushcmo ");
32: }
33:
34: def pushCMD(ob) {
35: local cc;
36: cc = channel;
37: if (IsInteger(ob)) {
38: ob = IntegerToSm1Integer(ob);
39: }
1.4 takayama 40: sm1(" [(oxPushCMD) cc ob] extension ");
1.3 takayama 41: }
1.4 takayama 42:
43: def popCMO() {
44: local cc,r;
45: cc = channel;
46: sm1(" cc oxpopcmo /r set ");
47: return(r);
48: }
49:
1.3 takayama 50: }
1.1 takayama 51:
1.2 takayama 52: class OXcontrol extends Object {
53: local control;
1.5 takayama 54: def getControl() {
55: return(control);
56: }
1.3 takayama 57: def generate(c) {
1.2 takayama 58: if (Tag(c) != 0) {
59: control = c;
60: return(this);
61: }else{
62: return(start());
63: }
64: }
65: def start() {
1.1 takayama 66: local c,e, pass, peer, data, s, stmp;
67: this = new(super.new0());
68: sm1(" [(oxGenPass)] extension /pass set ");
69: sm1(" [(oxGetPort1) (localhost)] extension /peer set ");
70: sm1(" /data peer 1 get toString def ");
71: s = AddString(
1.5 takayama 72: [GetEnv("OpenXM_HOME"),
73: "/src/oxc/oxc",
1.1 takayama 74: " -c ", pass, " -h "," localhost ", " -p ", data, " -x ",
75: " & "]);
76: sm1(" [ (/bin/csh -c \") s (\") ] cat /stmp set ");
77: sm1(" stmp message ");
78: sm1(" stmp system ");
79: sm1(" [(oxCreateControl_RFC_101) peer 0 pass] extension /c set ");
1.3 takayama 80: control = OXchannel.generate(c);
1.1 takayama 81: return(this);
1.2 takayama 82: }
1.3 takayama 83: def pushCMO(a) {
84: control.channel.pushCMO(a);
85: }
86: def pushCMD(a) {
87: control.channel.pushCMD(a);
88: }
1.4 takayama 89: def popCMO() {
90: return(control.channel.popCMO());
91: }
1.2 takayama 92:
1.1 takayama 93: }
94:
1.4 takayama 95: /* How to debug?
96: sm1(" OX { vname } sendmsg /aaa set ");
97: Get the value of vname in the context OX and set it to aaa.
98: */
1.1 takayama 99:
1.3 takayama 100: class OX extends OXcontrol {
1.5 takayama 101: local engine, engineIDs;
102: def getEngine() {
103: return(engine);
104: }
105: def getEngineIDs() {
106: return(engineIDs);
107: }
108: /* OX.generate("ox_sm1"); or OX.generate("ox_sm1",null) */
109: def generate(name,control) {
1.2 takayama 110: local c,e, pass, peer, data, s, stmp, engineID;
1.5 takayama 111: if (Length(Arglist) == 0) {
112: name = "ox_sm1"; control = null;
113: }
114: if (Length(Arglist) == 1) {
115: control = null;
116: }
1.3 takayama 117: this = new(super.generate(control));
1.5 takayama 118: control = super.getControl();
1.2 takayama 119: sm1(" [(oxGetPort1) (localhost)] extension /peer set ");
120: sm1(" /data peer 1 get def ");
1.6 ! takayama 121: /* BUG: control.pushCMO(data) does not work.
! 122: Use control = super.getControl(); */
! 123: control.pushCMO([[data],name]);
1.2 takayama 124: control.pushCMD(SM_control_spawn_server);
125: engineID = control.popCMO();
1.4 takayama 126: print("engineID=");Println(engineID);
1.5 takayama 127: if (Tag(engineID) == 257 ) { /* error object */
128: Error("Server could be found.");
129: }
130: engineIDs = [engineID];
1.2 takayama 131: sm1(" [(oxCreateEngine_RFC_101) peer 0 (Empty) engineID] extension /c set ");
1.3 takayama 132: engine = OXchannel.generate(c);
1.2 takayama 133: return(this);
1.3 takayama 134: }
1.5 takayama 135: def pushCMO(a) {
136: engine.channel.pushCMO(a);
137: }
138: def pushCMD(a) {
139: engine.channel.pushCMD(a);
140: }
141: def popCMO() {
142: return(engine.channel.popCMO());
143: }
1.2 takayama 144:
1.5 takayama 145: def rpc(func,ar) {
146: local n,i,one,comm;
147: if (! IsString(func)) {
148: Error("The first argument of rpc must be a string.");
149: }
150: if (! IsArray(ar)) {
151: Error("The second argument of rpc must be a list.");
152: }
153: one = IntegerToSm1Integer(1);
154: sm1(" getVlist2 toString /comm set ");
155: comm = AddString(["OxVlist=",comm,";"]);
156: this.pushCMO(comm);
157: this.pushCMD(SM_executeStringByLocalParser);
158:
159: this.pushCMO("print(OxVlist);");
160: this.pushCMD(SM_executeStringByLocalParser);
161:
162: n = Length(ar);
163: for (i=n-1; i>=0; i--) {
164: this.pushCMO(ar[i]);
165: this.pushCMO(one);
166: this.pushCMO("ox_dtop");
167: this.pushCMD(SM_executeFunction);
168: }
169: this.pushCMO(IntegerToSm1Integer(n));
170: this.pushCMO(func);
171: this.pushCMD(SM_executeFunction);
172:
173: this.pushCMO(one);
174: this.pushCMO("ox_ptod");
175: this.pushCMD(SM_executeFunction);
176: return(this.popCMO());
177: }
178:
179: }
180:
181: /*
182: Example:
183: a = startAsir();
184: f = a.rpc("fctr",[x^10-1]);
185: Println(f);
186: */
187: def startAsir() {
188: local a,asirpeer;
189: a = OX.generate("ox_asir");
190: asirpeer = (a.getEngine()).getChannel();
191: Println(asirpeer);
192: sm1(" [asirpeer oxasirpath.asirlib] loadAsirFile ");
193: return(a);
1.2 takayama 194: }
1.1 takayama 195:
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>