diff lib/Xsj3clib/connect.c @ 0:92745d501b9a

initial import from kinput2-v3.1
author Yoshiki Yazawa <yaz@honeyplanet.jp>
date Mon, 08 Mar 2010 04:44:30 +0900
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/lib/Xsj3clib/connect.c	Mon Mar 08 04:44:30 2010 +0900
@@ -0,0 +1,232 @@
+#ifndef lint
+static char *rcsid = "$Id: connect.c,v 2.0 1992/02/13 18:33:14 nao Exp $";
+#endif
+/*
+ * Copyright 1991 Sony Corporation
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation, and that the name of Sony not be used in advertising or
+ * publicity pertaining to distribution of the software without specific,
+ * written prior permission.  Sony makes no representations about the
+ * suitability of this software for any purpose.  It is provided "as is"
+ * without express or implied warranty.
+ *
+ * SONY DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL SONY
+ * BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION
+ * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN 
+ * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ */
+/*
+ * Author: Naoshi Suzuki, SONY Corporation.  (nao@sm.sony.co.jp)
+ */
+
+#include "common.h"
+#include "util.h"
+
+extern Xsj3cCVServerIF      serverIF[SERVER_NUM];
+
+int                         Xsj3cOpen();
+void                        Xsj3cClose();
+void                        Xsj3cConnect();
+
+static void                 _Xsj3cOpenError();
+static void                 _Xsj3cCloseError();
+
+static int                  connected[SERVER_NUM]= {0};
+
+/*
+ * Xsj3cOpen()
+ *  Connect to sj3serv(kana-kanji conversion server).
+ */
+int
+Xsj3cOpen(buf, host, user, force, second)
+    Xsj3cBuf    buf;
+    char       *host;
+    char       *user;
+    int         force;
+    int         second;
+{
+    extern char        *getenv();
+    char               *p;
+    char                hostname[SERVER_NUM][32];
+    int                 value;
+    
+    if (connected[buf->server] && !force) {
+        return CONNECT_OK;
+    }
+    if (host) {
+        if (user) {
+            if ((value = serverIF[buf->server].func[FUNC_OPEN](host, user))
+                    != SJ3_NORMAL_END) {
+                _Xsj3cOpenError(value);
+                if (value == SJ3_SERVER_DEAD || value == SJ3_CONNECT_ERROR)
+                    return CONNECT_FAIL;
+            }
+        } else {
+            Xsj3cError("can't connect sj3serv by null user");
+            return CONNECT_FAIL;
+        }
+    } else {
+        if (user) {
+            hostname[buf->server][0] = '\0';
+            if (buf->server == SERVER_SJ3) {
+                if (!second) {
+                    if ((p = getenv("SJ3SERV")) && *p != '\0') {
+                        strcpy(hostname[buf->server], p);
+                    } else if (buf->sj3serv) {
+                        strcpy(hostname[buf->server], buf->sj3serv);
+                    }
+                } else {
+                    if ((p = getenv("SJ3SERV2")) && *p != '\0') {
+                        strcpy(hostname[buf->server], p);
+                    } else if (buf->sj3serv2) {
+                        strcpy(hostname[buf->server], buf->sj3serv2);
+                    }
+                }
+            }
+            if ((value = serverIF[buf->server].func[FUNC_OPEN](hostname, user))
+                    != SJ3_NORMAL_END) {
+                _Xsj3cOpenError(value);
+                if (value == SJ3_SERVER_DEAD || value == SJ3_CONNECT_ERROR)
+                    return CONNECT_FAIL;
+            }
+        } else {
+            Xsj3cError("can't connect sj3serv by null user");
+            return CONNECT_FAIL;
+        }
+    }
+    locked[buf->server] = 0;
+    connected[buf->server] = 1;
+    return CONNECT_OK;
+}
+
+/*
+ * Xsj3cConnect()
+ *  Disconnect to sj3serv and reonnect to sj3serv.
+ */
+void
+Xsj3cConnect(buf, host, host2, user)
+    Xsj3cBuf    buf;
+    char       *host;
+    char       *host2;
+    char       *user;
+{
+    serverIF[buf->server].func[FUNC_UNLOCK]();
+    Xsj3cClose(buf, ON);
+    if ((Xsj3cOpen(buf, host, user, OFF, OFF)) != CONNECT_OK) {
+        Xsj3cWarning("Failed to connect first server. try to second server");
+        if ((Xsj3cOpen(buf, host2, user, OFF, ON)) != CONNECT_OK) {
+            Xsj3cError("Failed to connect seconON server.");
+        }
+    }
+}
+
+/*
+ * Xsj3cClose()
+ *  Disconnect to sj3serv.
+ */
+void
+Xsj3cClose(buf, force)
+    Xsj3cBuf    buf;
+    int         force;
+{
+    int         value;
+
+    if (connected[buf->server]) {
+        if ((value = serverIF[buf->server].func[FUNC_CLOSE]())
+                != SJ3_NORMAL_END && !force) {
+            _Xsj3cCloseError(value);
+        }
+        connected[buf->server] = 0;
+    }
+}
+
+/*
+ * _Xsj3cOpenError()
+ *  Print error messages for connecting to sj3serv.
+ */
+static void
+_Xsj3cOpenError(error)
+    int error;
+{
+    switch (error) {
+        case SJ3_SERVER_DEAD:
+            Xsj3cWarning("sj3_open: server died in connecting");
+            break;
+        case SJ3_CONNECT_ERROR:
+            Xsj3cWarning("sj3_open: connected to server error");
+            break;
+        case SJ3_ALREADY_CONNECTED:
+            Xsj3cWarning("sj3_open: already connected to server");
+            break;
+        case SJ3_CANNOT_OPEN_MDICT:
+            Xsj3cWarning("sj3_open: can't open main dictionaries");
+            break;
+        case SJ3_CANNOT_OPEN_UDICT:
+            Xsj3cWarning("sj3_open: can't open user dictionaries");
+            break;
+        case SJ3_CANNOT_OPEN_STUDY:
+            Xsj3cWarning("sj3_open: can't open files for study");
+            break;
+        case SJ3_CANNOT_MAKE_UDIR:
+            Xsj3cWarning("sj3_open: can't make directries for user");
+            break;
+        case SJ3_CANNOT_MAKE_UDICT:
+            Xsj3cWarning("sj3_open: can't make user dictionaries");
+            break;
+        case SJ3_CANNOT_MAKE_STUDY:
+            Xsj3cWarning("sj3_open: can't make files for study");
+            break;
+        default:
+            Xsj3cWarning("sj3_open: unknown error");
+            break;
+    }
+}
+
+/*
+ * _Xsj3cCloseError()
+ *  Print error messages for disconnecting to sj3serv.
+ */
+static void
+_Xsj3cCloseError(error)
+    int error;
+{
+    switch (error) {
+        case SJ3_SERVER_DEAD:
+            Xsj3cWarning("sj3_close: server died in disconnecting");
+            break;
+        case SJ3_DISCONNECT_ERROR:
+            Xsj3cWarning("sj3_close: server internal error");
+            break;
+        case SJ3_NOT_CONNECTED:
+            Xsj3cWarning("sj3_close: already disconnected to server");
+            break;
+        case SJ3_NOT_OPENED_MDICT:
+            Xsj3cWarning("sj3_close: main dictionaries are not opend");
+            break;
+        case SJ3_NOT_OPENED_UDICT:
+            Xsj3cWarning("sj3_close: user dictionaries are not opend");
+            break;
+        case SJ3_NOT_OPENED_STUDY:
+            Xsj3cWarning("sj3_close: files for study are not opend");
+            break;
+        case SJ3_CLOSE_MDICT_ERROR:
+            Xsj3cWarning("sj3_close: can't close main dictionaries");
+            break;
+        case SJ3_CLOSE_UDICT_ERROR:
+            Xsj3cWarning("sj3_close: can't close user dictionaries");
+            break;
+        case SJ3_CLOSE_STUDY_ERROR:
+            Xsj3cWarning("sj3_close: can't close files for study");
+            break;
+        default:
+            Xsj3cWarning("sj3_close: unknown error");
+            break;
+    }
+}
+