version 1.16, 2000/11/28 22:11:13 |
version 1.20, 2003/01/13 12:03:12 |
|
|
/* -*- mode: C; coding: euc-japan -*- */ |
/* -*- mode: C; coding: euc-japan -*- */ |
/* $OpenXM: OpenXM/src/ox_toolkit/ox.c,v 1.15 2000/10/12 15:53:25 ohara Exp $ */ |
/* $OpenXM: OpenXM/src/ox_toolkit/ox.c,v 1.19 2003/01/11 11:42:31 ohara Exp $ */ |
|
|
/* |
/* |
This module includes functions for sending/receiveng CMO's. |
This module includes functions for sending/receiveng CMO's. |
|
|
|
|
#include <stdio.h> |
#include <stdio.h> |
#include <stdlib.h> |
#include <stdlib.h> |
|
#include <stdarg.h> |
#include <string.h> |
#include <string.h> |
#include <unistd.h> |
#include <unistd.h> |
#include <fcntl.h> |
#include <fcntl.h> |
|
|
#include "ox_toolkit.h" |
#include "ox_toolkit.h" |
#include "parse.h" |
#include "parse.h" |
|
|
/* CMO_xxx の値の順にならべること(デバッグのため) */ |
static FILE *ox_stderr = NULL; |
|
|
|
/* sorting by the value of CMO_xxx. (for debugging) */ |
static cmo_null* receive_cmo_null(OXFILE *oxfp); |
static cmo_null* receive_cmo_null(OXFILE *oxfp); |
static cmo_int32* receive_cmo_int32(OXFILE *oxfp); |
static cmo_int32* receive_cmo_int32(OXFILE *oxfp); |
static cmo_string* receive_cmo_string(OXFILE *oxfp); |
static cmo_string* receive_cmo_string(OXFILE *oxfp); |
Line 88 cmo_error2* make_error_object(int err_code, cmo *ob) |
|
Line 91 cmo_error2* make_error_object(int err_code, cmo *ob) |
|
list_append(li, (cmo *)new_cmo_int32(current_received_serial)); |
list_append(li, (cmo *)new_cmo_int32(current_received_serial)); |
list_append(li, (cmo *)new_cmo_int32(err_code)); |
list_append(li, (cmo *)new_cmo_int32(err_code)); |
list_append(li, ob); |
list_append(li, ob); |
/* 他の情報を加えるならココ */ |
|
return new_cmo_error2((cmo *)li); |
return new_cmo_error2((cmo *)li); |
} |
} |
|
|
Line 226 static cmo_error2* receive_cmo_error2(OXFILE *oxfp) |
|
Line 228 static cmo_error2* receive_cmo_error2(OXFILE *oxfp) |
|
return new_cmo_error2(ob); |
return new_cmo_error2(ob); |
} |
} |
|
|
/* receive_ox_tag() == OX_DATA の後に呼び出される */ |
/* receive_cmo() is called after receive_ox_tag(). */ |
/* 関数ポインタを使った方がきれいに書けるような気がする. */ |
|
/* if (foo[tag] != NULL) foo[tag](oxfp); とか */ |
|
|
|
cmo* receive_cmo(OXFILE *oxfp) |
cmo* receive_cmo(OXFILE *oxfp) |
{ |
{ |
cmo* m; |
cmo* m; |
Line 275 cmo* receive_cmo(OXFILE *oxfp) |
|
Line 274 cmo* receive_cmo(OXFILE *oxfp) |
|
case CMO_QQ: |
case CMO_QQ: |
default: |
default: |
m = NULL; |
m = NULL; |
fprintf(stderr, "the CMO (%d) is not implemented.\n", tag); |
ox_printf("the CMO (%d) is not implemented.\n", tag); |
} |
} |
return m; |
return m; |
} |
} |
Line 305 void ox_close(OXFILE *sv) |
|
Line 304 void ox_close(OXFILE *sv) |
|
#ifdef DEBUG |
#ifdef DEBUG |
sleep(2); |
sleep(2); |
/* We wait thar an OpenXM server terminates. */ |
/* We wait thar an OpenXM server terminates. */ |
fprintf(stderr, "I have closed the connection to an Open XM server.\n"); |
ox_printf("I have closed the connection to an Open XM server.\n"); |
#endif |
#endif |
} |
} |
|
|
Line 382 int ox_flush(OXFILE *sv) |
|
Line 381 int ox_flush(OXFILE *sv) |
|
void ox_reset(OXFILE *sv) |
void ox_reset(OXFILE *sv) |
{ |
{ |
send_ox_command(oxf_control(sv), SM_control_reset_connection); |
send_ox_command(oxf_control(sv), SM_control_reset_connection); |
|
|
receive_ox_tag(oxf_control(sv)); /* OX_DATA */ |
|
receive_cmo(oxf_control(sv)); /* (CMO_INT32, 0) */ |
|
|
|
while(receive_ox_tag(sv) != OX_SYNC_BALL) { |
while(receive_ox_tag(sv) != OX_SYNC_BALL) { |
receive_cmo(sv); /* skipping a message. */ |
receive_cmo(sv); /* skipping a message. */ |
} |
} |
|
|
send_ox_tag(sv, OX_SYNC_BALL); |
send_ox_tag(sv, OX_SYNC_BALL); |
#ifdef DEBUG |
#ifdef DEBUG |
fprintf(stderr, "I have reset an Open XM server.\n"); |
ox_printf("I have reset an Open XM server.\n"); |
#endif |
#endif |
} |
} |
|
|
Line 570 ox_sync_ball* new_ox_sync_ball() |
|
Line 565 ox_sync_ball* new_ox_sync_ball() |
|
ox_sync_ball *m = malloc(sizeof(ox_sync_ball)); |
ox_sync_ball *m = malloc(sizeof(ox_sync_ball)); |
m->tag = OX_SYNC_BALL; |
m->tag = OX_SYNC_BALL; |
return m; |
return m; |
|
} |
|
|
|
int ox_stderr_init(FILE *fp) |
|
{ |
|
ox_stderr = (fp != NULL)? fp: (stderr); |
|
setbuf(ox_stderr, NULL); |
|
} |
|
|
|
int ox_printf(char *format, ...) |
|
{ |
|
va_list ap; |
|
va_start(ap, format); |
|
vfprintf(ox_stderr, format, ap); |
} |
} |