POBox Server - ソース

//
//	$Date: 2002/07/06 09:16:59 $
//	$Revision: 1.10 $
//
//	POBox APIを使ったPOBox Serverを実装
//
//   ・USEWNNが定義されているときは動的曖昧検索を頑張って行なうかわりに
//     Jserverに変換を依頼する。
//   ・skkservはEUCの漢字の読みを受けつけるが、この版はローマ字を
//     受けつけるようになっている。(普通のSKKでは使えない)
//
//	WinCEにはread(),write(),close()などがないようなので
//	WinSockのrecv(),send(),closesocket()などを使う

#include 
#if defined(POCKET_SIZE) || defined(PALM_SIZE)
#define isupper(c) ((c) >= 'A' && (c) <= 'Z')
#else
#include 
#endif
#include "server.h"
#include "poboxlib.h"

#ifdef USE_PROFILER
#include 
struct timeval ts,te;
static void timebegin()
{
  gettimeofday(&ts,NULL);
}
static long timeend()
{
  long t;
  gettimeofday(&te,NULL);
  t = (te.tv_sec - ts.tv_sec) * 1000000 + (te.tv_usec - ts.tv_usec);
  return t;
}
#endif


#define POBOXSERVERPORT 1178

#define MAXCANDS 100
#define MAXWORDLEN 100
unsigned char *cands[MAXCANDS],*candspat[MAXCANDS];

int process(int);

unsigned char context[MAXCLIENT][MAXWORDLEN];

char *revision = "$Revision: 1.10 $";

int poboxdebug = 0;

// 
POBoxDict learndic = {
#if defined(POCKET_SIZE) || defined(PALM_SIZE)
	"\\POBox\\learndic",
#else
	"./learndic",
#endif
	POBOXDICT_STANDARD,
	POBOXDICT_TEXT,
	0 // not read-only
};
#ifdef USESARY
POBoxDict sarydic = {
#if defined(POCKET_SIZE) || defined(PALM_SIZE)
	"\\POBox\\staticdic",
#else
	"./staticdic",
#endif
	POBOXDICT_STANDARD,
	POBOXDICT_SARY,
	1 // read-only
};
#endif
#ifdef USELOOKUP
POBoxDict lookupdic = {
#if defined(POCKET_SIZE) || defined(PALM_SIZE)
	"\\POBox\\staticdic",
#else
	"./staticdic",
#endif
	POBOXDICT_STANDARD,
	POBOXDICT_LOOKUP,
	1 // read-only
};
#endif

#if defined(POCKET_SIZE) || defined(PALM_SIZE)
WinMain()
{
#else
main(int argc, char **argv)
{
	if(argc > 1) poboxdebug = 1;
#endif
	if(pobox_init() < 0) exit(0);
	if(pobox_usedict(&learndic) < 0) exit(0);
#ifdef USESARY
	if(pobox_usedict(&sarydic) < 0) exit(0);
#endif
#ifdef USELOOKUP
	if(pobox_usedict(&lookupdic) < 0) exit(0);
#endif
	server(POBOXSERVERPORT,process);
	pobox_finish();
}

process(int sock)
{	
	unsigned char buf[1000],combuf[BUFSIZE];

	unsigned char w[100],p[100];
	int i,n;
	char *host;
	char *pat;
	int patlen;

	if((n = recv(sock, &combuf[0], BUFSIZE, 0)) <= 0)  return -1;
	combuf[n] = '\0';
	while(n > 0 && (combuf[n-1] == '\n' || combuf[n-1] == '\r')){
		combuf[n-1] = '\0';
		n--;
	}
	if(poboxdebug) printf("command: [%s]\n",combuf);
	switch(combuf[0]){
	case '0':
		pobox_usedict(NULL); // save all existing changes
		return -1; // this makes the server's main routine disconnect 
	case '1':
		for(pat=combuf+1;*pat;pat++){
			if(isupper(*pat)) *pat = tolower(*pat);
		}
		pat = combuf+1;
		patlen = strlen(pat);
		pobox_context(context[sock],strlen(context[sock]));
		if(pat[patlen-1] == ' '){
			pobox_searchmode(0);
			pat[patlen-1] = '\0';
		}
		else {
			pobox_searchmode(POBOX_EXACT);
		}
		n = pobox_search(pat);
		pobox_getcands(cands,candspat,0,n);
		if(n == 0){
			sprintf(buf,"4%s\n",pat);
		}
		else {
			strcpy(buf,"1\t");
			for(i=0;i< n;i++){
				strcat(buf,cands[i]);
				strcat(buf,"\t");
			}
			strcat(buf,"\n");
		}
		if(send(sock, buf, strlen(buf), 0) < 0) return -1;
		return 0;
	case '2':
		if(send(sock, revision+11, strlen(revision)-13, 0) < 0) return -1;
		return 0;
	case '3':
host = "dummyhost";
		if(send(sock,host,strlen(host),0) < 0) return(-1);
		return 0;
	case '4':
		strcpy(context[sock],combuf+1);
		if(send(sock,"1\n",2,0) < 0) return -1;
		return 0;
	case '5':
		n = sscanf(combuf+1,"%s %s",w,p);
		if(send(sock,"1\n",2,0)<0) return -1;
		if(n == 2){
			for(pat=p;*pat;pat++){
				if(isupper(*pat)) *pat = tolower(*pat);
			}
			pobox_regword(&learndic,w,p,NULL);
			strcpy(context[sock],w);
		}
		return 0;
	case '6':
		n = sscanf(combuf+1,"%s %s",w,p);
		if(send(sock,"1\n",2,0)<0) return -1;
		if(n == 2){
			pobox_delword(&learndic,w,p);
		}
		return 0;
	case '7':
		if(send(sock,"1\n",2,0) < 0) return -1;
		// pobox_usedict(NULL);
		// pobox_savedic(...)??
		pobox_save(&learndic);
		return 0;
	case '8':
		n = sscanf(combuf+1,"%d",&i);
		if(send(sock,"1\n",2,0) < 0) return -1;
		if(n == 1){
			pobox_select(i);
			strcpy(context[sock],cands[i]);
		}
		return 0;
	case 'Q':
		exit(0);
	default:
		return -1;
	}
}