www.pudn.com > isync2[1].0.rar > isync.cpp


//
// isync.cpp
//
#include     //for int chdir(const char *path);
#include 
#include 
#include "isync.h"
//#include "showcard.h"
#include "show_free.h"
#include "CardStruct.h"
#include "CTransferCard.h"
#include "warn.xpm"
#include "isync.xpm"

#define ISYNC_RUN_ATOM          "ISYNC_RUN_ATOM"
#define CARD_RUN_ATOM           "CARD_RUN_FLAG"
#define EMAIL_RUN_ATOM          "EMAIL_RUN_FLAG"
#define SMS_MAIN_ATOM           "messagewindow1"

#define SEND2SET_INFORM_ATOM    "SEND2SET_INFORM_ATOM"
#define SET_RUN_ATOM            "SET_RUN_ATOM"

Atom isync_run_atom;

extern FL_EXPORT Display *fl_display;

const char *pathtmp="/tmp/isync";
char sendtoiphoneFileName[] = "/tmp/isync/sendtoiphone.tmp";
char lasttimeFileName[] = "/tmp/isync/lasttime.tmp";
char sendtopcFileName[] = "/tmp/isync/sendtopc.tmp";
char backuptopcFileName[] = "/tmp/isync/home.tgz";
char com_tarbackup[]="tar czf /tmp/isync/home.tgz set/ notepad/ telephone/ card/ email/ user/ chinput/ sms/ gbrow/";
char com_tarrecover[]="tar zxf /tmp/isync/home.tgz";
char clean_command[]="rm set/ notepad/ telephone/ card/ email/ user/ chinput/ sms/ gbrow/ -rf";

const char *TelTypeName[] = {"电话", "手机", "办公", "宅电", "内线"};    // 电话类别名称
const char *AcceptLevelName[] = {"VIP", "普通", "黑名单"};              // 免打扰级别
CardStruct_T card;
static void LoadCard (void);

pthread_t Threadisync;
//TransferDetail icard[CARD_MAX_COUNT+1];
struct timeval nowtime;
long lasttime;
int isync_type;  //0: card; 1: backup; 2: recover
int g_threadStatus = 0; //0 sending; 1: over
int cardcount;
int addcardcount;
char strmessage[50];
bool isyncover=false;
bool backupflag=false;
bool recoverflag=false;
bool restartflag=false;

int s_sock;//server's sock
int a_sock;//accept's sock

Fl_Window *window;
Fl_Window *popwin_title=(Fl_Window *)0;
Fl_Window *popwin_message=(Fl_Window *)0;
Fl_Round_Button *btnRound[3];
Fl_Box *title=(Fl_Box *)0;
Fl_Box *box_message=(Fl_Box *)0;
Fl_Button *exit_btn = (Fl_Button *)0;

void exec_program(char* path, char *param = NULL)
{
	if (fork() == 0)
	{
		if (fork() == 0)
		{
			execlp(path,path,param,NULL);
			exit(1);
		}
		exit(0);
	}
	wait((int *) 0);
}

//去掉字符串两端空格
void chopwhitespace(char *str)
{
	int ln = strlen (str);
	while ( (ln>0) && ( (str[ln-1]==' ') ) )
		str[--ln] = 0;
	while ((str[0] == ' ')||(str[0] == '\t'))
	{
		memmove (str,str+1,(size_t) strlen(str));
	}
}

long GetFileSize(char *FileName)
{
/*
	long size=0;
	FILE *fp;
	fp=fopen(FileName,"r");
	if(fp==NULL)
	{
	printf("GetFileSIze Open %s File Error\n",FileName);
	return 0;
	}
	fseek(fp,0,SEEK_END);
	size=ftell(fp);
	fclose(fp);
	return size;
*/
	struct stat mystat;
	long need_read;
	if (stat (FileName, &mystat) != 0)
	{
		//InformDlg ("读消息管道出错!","错误信息");
		return 1;
	}
	
	need_read = mystat.st_size;
	return need_read;
}

int tell_set(void)
{
	Window twin;
	Atom send2set_inform_atom;
	send2set_inform_atom= XInternAtom (fl_display,SEND2SET_INFORM_ATOM , False);
	Atom set_run_atom;
	set_run_atom=XInternAtom (fl_display,SET_RUN_ATOM , False);
	//通知set
	if ((twin = XGetSelectionOwner (fl_display, set_run_atom)) != 0)
	{
		XClientMessageEvent event;
		event.type = ClientMessage;
		event.window = 0;
		event.message_type =send2set_inform_atom;
		event.format = 32;
		XSendEvent (fl_display, twin, False, 0, (XEvent *) & event);
	}
	return 0;
}

int writelasttime()
{
	FILE *fp;
	char tempbuf[200];
	if((fp = fopen(lasttimeFileName , "wb")) == NULL)
	{
		printf ("can't open write /temp/isync/lasttime.tmp\n");
		return -1;
	}
	gettimeofday(&nowtime,0);
	
	sprintf(tempbuf,"%ld",nowtime.tv_sec);
	strcat(tempbuf, "\n");
	fputs(tempbuf, fp);
	
	fclose(fp);
	return 0;
}

int readlasttime()
{
	FILE *fp;
	char strline[100];
	
	if ((fp = fopen (lasttimeFileName, "r")) == NULL)
	{
		//printf ("can't open read /temp/isync/lasttime.tmp\n");
		return -1;
	}
	
	fgets(strline, 100, fp);
	chopwhitespace(strline);
	//	printf("strline=%s\n",strline);
	
	if (sscanf(strline, "%ld", &lasttime) != 1)
	{
		printf("lasttime.tmp file format error\n");
		return -1;
	}
	//	printf("lasttime=%ld\n",lasttime);
	fclose(fp);
	return 0;
}

int comparetime()
{
	gettimeofday(&nowtime,0);
	
//	printf("nowtime.tv_sec=%ld\n",nowtime.tv_sec);
//	printf("lasttime=%ld\n",lasttime);

	if((nowtime.tv_sec-lasttime>=0)&&(nowtime.tv_sec-lasttime<=5))
		return -1;

	return 0; 	
}

void exit_cb(Fl_Widget*)
{
	if (1 == g_threadStatus)
	{
		return;
	}
	printf("close(a_sock)\n");
	printf("close(s_sock)\n");
	close(a_sock);
	close(s_sock);

	if(backupflag||recoverflag)
	{
		writelasttime();
		system("killall tar");
		exec_program("/Xapp/tel");		
		exec_program("/Xapp/pm");		
		exec_program("/Xapp/notepad");		
	}
	system("rm /tmp/card -rf");
	exit(0);
}

void init_Display(void)
{
	fl_open_display();
}

void initAtom(void)
{
	Window twin;
	Window root_ret;
	Window parent_ret;
	Window *children_ret;
	unsigned int nchildren_ret;
	
	isync_run_atom = XInternAtom (fl_display, ISYNC_RUN_ATOM, False);
	if((twin = XGetSelectionOwner (fl_display, isync_run_atom)) != None)
	{
		XQueryTree (fl_display, twin, &root_ret, &parent_ret, &children_ret, &nchildren_ret);
		XRaiseWindow (fl_display, parent_ret);
		
		twin = parent_ret;
		XQueryTree (fl_display, twin, &root_ret, &parent_ret, &children_ret, &nchildren_ret);
		XRaiseWindow (fl_display, parent_ret);
		
		XQueryTree (fl_display, twin, &root_ret, &parent_ret, &children_ret, &nchildren_ret);
		exit (127);
	}
}

int search_cardprogram()
{
	//printf("run search_cardprogram()\n");
	Atom card_run_atom;
	card_run_atom = XInternAtom (fl_display, CARD_RUN_ATOM, False);
	Window twin;
	twin = XGetSelectionOwner (fl_display, card_run_atom);
	if(twin != 0)
		return -1;
	else
		return 0;
}

int search_emailprogram()
{
	//printf("run search_emailprogram()\n");
	Atom email_run_atom;
	email_run_atom = XInternAtom (fl_display, EMAIL_RUN_ATOM, False);
	Window twin;
	twin = XGetSelectionOwner (fl_display, email_run_atom);
	if(twin != 0)
		return -1;
	else
		return 0;
}

int search_smsprogram()
{
	//printf("run search_smsprogram()\n");
	Atom sms_run_atom;
	sms_run_atom = XInternAtom (fl_display, SMS_MAIN_ATOM, False);
	Window twin;
	twin = XGetSelectionOwner (fl_display, sms_run_atom);
	if(twin != 0)
		return -1;
	else
		return 0;
}

void timer_cb(void*)
{
	if (1 == g_threadStatus)
	{
		title->label(" 正在更新名片数据,请稍候 . . .");
		exit_btn->hide();
	}
	if(isyncover)
	{
		g_threadStatus = 0;
		tell_set();
		XFlush(fl_display);
		//    window->hide();
		//    popwin_title->hide();
		box_message->label(strmessage);
		popwin_message->show();
		Fl::remove_timeout(timer_cb);
	}
	else
		Fl::repeat_timeout(0.1, timer_cb);
}

void isync_yes(Fl_Widget *)
{
	if (btnRound[0]->value() == 1)
	{
		title->label(" 请同时运行PC端i风名片管理软件, 进\n\n 行数据传输, 退出将中断数据传输.");
		popwin_title->label("名片同步");
	}
	else if (btnRound[1]->value() == 1)
	{
		//printf("run KillAllSRProg()\n");
		//KillAllSRProg();
		backupflag=true;
		title->label(" 请同时运行PC端i风数据备份与恢复软\n\n 件, 进行数据备份, 退出将中断备份.");
		popwin_title->label("数据备份");
	}
	else if (btnRound[2]->value() == 1)
	{
		//KillAllSRProg();
		recoverflag=true;
		title->label(" 请同时运行PC端i风数据备份与恢复软\n\n 件, 进行数据恢复, 退出将中断恢复并有\n\n 可能造成数据丢失.");
		popwin_title->label("数据恢复");
	}
	//  window->hide();
	popwin_title->show();
	
	Fl::add_timeout(0.1,timer_cb);
	
	isynctransfers();
}

void isync_cancel(Fl_Widget *)
{
	printf("close(a_sock)\n");
	printf("close(s_sock)\n");
	close(a_sock);
	close(s_sock);
	
	if(restartflag)
		system("reboot");
	else if(backupflag|recoverflag)
	{
		writelasttime();
		system("killall tar");
		exec_program("/Xapp/tel");		
		exec_program("/Xapp/pm");		
		exec_program("/Xapp/notepad");		
		exit(0);
	}	
	else  
		exit(0);
}

/////////////////////////////////////////////////////////////////////
//   main
/////////////////////////////////////////////////////////////////////
int main(int argc, char **argv)
{
	init_Display();
	
	struct stat mystat;
	if (stat(pathtmp, &mystat) != 0)
		mkdir(pathtmp, 0700);

	int ret=readlasttime();
	//printf("ret=%d\n",ret);
	if(ret==0)
	{
		int rc=comparetime();
		//printf("rc=%d\n",rc);		
		if(rc==-1)
		{
			printf("time too short! ->>>exit(0)!\n");
			Cursor cursor;
			int cursor_shape = 68;
		cursor = XCreateFontCursor(fl_display, cursor_shape);
		XDefineCursor(fl_display, DefaultRootWindow(fl_display), cursor);
			exit(0);
		}
	}
	
	if (stat("/home/set", &mystat) != 0)
		mkdir("/home/set", 0700);
	if (stat("/home/notepad", &mystat) != 0)
		mkdir("/home/notepad", 0700);
	if (stat("/home/telephone", &mystat) != 0)
		mkdir("/home/telephone", 0700);
	if (stat("/home/card", &mystat) != 0)
		mkdir("/home/card", 0700);
	if (stat("/home/email", &mystat) != 0)
		mkdir("/home/email", 0700);
	if (stat("/home/user", &mystat) != 0)
		mkdir("/home/user", 0700);
	if (stat("/home/chinput", &mystat) != 0)
		mkdir("/home/chinput", 0700);
	if (stat("/home/sms", &mystat) != 0)
		mkdir("/home/sms", 0700);
	if (stat("/home/gbrow", &mystat) != 0)
		mkdir("/home/gbrow", 0700);
	
	initAtom();
	
	fl_mapcolor(FL_FREE_COL1, 234, 206, 245);
	fl_mapcolor(FL_FREE_COL2, 133, 169, 237);
  
	window = new Fl_Window(195,175,250,130,"数据传输");
	fl_set_object_color(window,FL_FREE_COL1,FL_FREE_COL1);
	fl_redraw_object(window);
	{
		Fl_FormsPixmap *o = new Fl_FormsPixmap(FL_NORMAL_PIXMAP, 35,15,40,40, "");
		o->set(isync_xpm);
	}
	{
		btnRound[0]=new Fl_Round_Button(80,10,100,25,"名片同步");
		btnRound[1]=new Fl_Round_Button(80,35,100,25,"数据备份");
		btnRound[2]=new Fl_Round_Button(80,60,100,25,"数据恢复");
	}
	for (int i=0;i<3;i++)
	{
		btnRound[i]->type(FL_RADIO_BUTTON);
	}
	btnRound[0]->value(1);
	
	{
		Fl_Button *o=new Fl_Button(35,95,86,25,"确定");
		fl_set_object_color(o,FL_FREE_COL2,FL_FREE_COL2);
		fl_redraw_object(o);
		o->callback((Fl_Callback*)isync_yes);
	}
	{
		Fl_Button *o=new Fl_Button(129,95,86,25,"取消");
		fl_set_object_color(o,FL_FREE_COL2,FL_FREE_COL2);
		fl_redraw_object(o);
		o->callback((Fl_Callback*)isync_cancel);
	}
	
	window->end();
  
	////////////////////////////////////////////////////
	//提示界面
	////////////////////////////////////////////////////
	popwin_title = new Fl_Window(140,145,360,165,"");
	popwin_title->set_modal();
	fl_set_object_color(popwin_title,FL_FREE_COL1,FL_FREE_COL1);
	fl_redraw_object(popwin_title);
	popwin_title->callback((Fl_Callback*)exit_cb);
	{
		Fl_FormsPixmap *o = new Fl_FormsPixmap(FL_NORMAL_PIXMAP, 15,25,25,25, "");
		o->set(warn_xpm);
	}
	//产生一个提示信息
	{
		title= new Fl_Box(50,30,100,75, "");
		title->align(FL_ALIGN_INSIDE|FL_ALIGN_LEFT);
	}
	{
		Fl_Button *o = exit_btn = new Fl_Button(137,125,86,25,"退出");
		fl_set_object_color(o,FL_FREE_COL2,FL_FREE_COL2);
		fl_redraw_object(o);
		o->callback((Fl_Callback*)exit_cb);
	}
	popwin_title->end();

	////////////////////////////////////////////////////
	//警告信息界面
	////////////////////////////////////////////////////
	popwin_message = new Fl_Window(130, 166, 380, 100, "信息");
	popwin_message->set_modal();
	popwin_message->callback((Fl_Callback *)isync_cancel);
	fl_set_object_color(popwin_message, FL_FREE_COL1, FL_FREE_COL1);
	fl_redraw_object(popwin_message);
	{
		box_message = new Fl_Box(FL_FLAT_BOX, 60, 25, 200, 25,"");
		box_message->align(FL_ALIGN_INSIDE|FL_ALIGN_LEFT);
		fl_set_object_color(box_message, FL_FREE_COL1, FL_FREE_COL1);
		fl_redraw_object(box_message);
	}
	{
		Fl_FormsPixmap *o = new Fl_FormsPixmap(FL_NORMAL_PIXMAP, 15,15,40,40, "");
		o->set(warn_xpm);
	}
	{
		Fl_Button *o = new Fl_Button(147, 65, 86, 25, "确定");
		fl_set_object_color(o, FL_FREE_COL2, FL_FREE_COL2);
		fl_redraw_object(o);
		o->callback((Fl_Callback*)isync_cancel);
	}
	popwin_message->end();

	int rc=search_cardprogram();
	int rd=search_emailprogram();
	int rs=search_smsprogram();
	if(rc==-1||rd==-1||rs==-1)
	{
		//box_message->label("名片,邮件,短信启动后,数据传输禁止使用!");
		box_message->label("名片启动后,数据传输禁止使用!");
		popwin_message->show();
		XSetSelectionOwner(fl_display, isync_run_atom, fl_xid(popwin_message),CurrentTime);
	}
	else
	{
		window->show();
		XSetSelectionOwner(fl_display, isync_run_atom, fl_xid(window),CurrentTime);
	}
	return Fl::run();
}

void isynctransfers()
{
/*
  FILE *fp;
  fp = fopen(sendtoiphoneFileName , "r");
  if(fp)
  {
    fclose(fp);
    if (fl_ask("发现未完成的文件,是否继续处理?")) //gggggg
    {
      AddToDB();
    }
    remove(sendtoiphoneFileName);//删除文件
  }
*/  
	pthread_create(&Threadisync , NULL ,NetLink, NULL);    
	//LoadCard();
}

void *NetLink(void *pArg)
{
	struct sockaddr_in s_in;
	struct sockaddr_in a_in;
	char message[5];
	//char updatetype[3];
	char updatetype[4];
	char strcardcount[5];
	char straddcardcount[5];
	int rc;
	unsigned long tmpfreesize;
	int retadd;
	
	retadd=false;
	isyncover=false;
	restartflag=false;
	
	s_sock = socket(AF_INET , SOCK_STREAM , 0);
	//printf("create sock success!\n");
	
	int pram = 1;
	setsockopt(s_sock, SOL_SOCKET, SO_REUSEADDR, (char *) &pram, sizeof (int));
	
	bzero(&s_in , sizeof(sockaddr_in));
	s_in.sin_family = AF_INET;
	s_in.sin_port = htons(PORT);
	s_in.sin_addr.s_addr = htonl(INADDR_ANY);
	rc = bind(s_sock, (struct sockaddr *)&s_in , sizeof(struct sockaddr));   //bind
	if(-1 == rc)
	{
	printf("bind fail!\n");
	close(a_sock);
	close(s_sock);
	strcpy(strmessage,"网络操作失败,请重新运行数据传输程序!");
	isyncover=true;
	return NULL;
	}
	printf("bind success!\n");

//skip_continue:

	if (-1 == listen(s_sock , 5))  //listen
	{
		printf("listen fail!\n");
		close(s_sock);
		strcpy(strmessage,"网络操作失败,请重新运行数据传输程序!");
		isyncover=true;
		return NULL;
	}
	printf("listen success!\n");
	
	int ainsize = sizeof(struct sockaddr_in);
	a_sock = accept(s_sock , (struct sockaddr *)&a_in , (socklen_t *)&ainsize);  //accept
	if (-1 == a_sock)
	{
		printf("accept fail!\n");
		close(s_sock);
		strcpy(strmessage,"网络操作失败,请重新运行数据传输程序!");
		isyncover=true;
		return NULL;
	}
	printf("\naccept success!\n");

	///////////////////////////////////////
	//read pc message  
	///////////////////////////////////////
	strcpy(message,"");
	rc = recv(a_sock , message , 4 , 0);
	message[4]='\0';
	//printf("(message=%s)\n",message);
	
	if (-1 == rc)
	{
		printf("error when received client message!\n");  //接收数据时出现错误
		close(a_sock);
		close(s_sock);
		strcpy(strmessage,"数据传输出现错误,请重试!");
		isyncover=true;
		return NULL;
	}

	//PC read card from IPHONE
	if(strcmp(message,"read")==0)
	{
		//printf("get (read) flag when IPHONE send to PC!\n");

		FILE *fpsendtopc;
		int j=0;
		int rec;
			
		LoadCard();

		if (-1 == send(a_sock , &cardcount , sizeof(int), 0)  )
		{
			printf("error when send cardcount!\n");
			close(a_sock);
			close(s_sock);
			strcpy(strmessage,"数据传输出现错误,请重试!");
			isyncover=true;
			return NULL;
		}
		
		unsigned long filelength;
		filelength=GetFileSize(sendtopcFileName);
		if (-1 == send(a_sock , &filelength , sizeof(unsigned long), 0)  )
		{
			printf("error when send filelength!\n");
			close(a_sock);
			close(s_sock);
			strcpy(strmessage,"数据传输出现错误,请重试!");
			isyncover=true;
			return NULL;
		}
		char *str=(char*)malloc(filelength);
		fpsendtopc = fopen(sendtopcFileName, "rb");
		if(fpsendtopc)
		{
			fread(str,filelength,1,fpsendtopc);
		//      printf("str=%s\n",str);
		}
		if (-1 == send(a_sock , str , filelength , 0)  )
		{
			printf("error when send sendtopcFileName!\n");
			fclose(fpsendtopc);
			free(str);
			close(a_sock);
			close(s_sock);
			strcpy(strmessage,"数据传输出现错误,请重试!");
			isyncover=true;
			return NULL;
		}
		fclose(fpsendtopc);
		free(str);
		//    printf("send over!\n");
		remove(sendtopcFileName);
		//    goto skip_continue;
		close(a_sock);
		close(s_sock);
		sprintf(strcardcount,"%d",cardcount);
		strcpy(strmessage,"向PC端发送");
		strcat(strmessage, strcardcount);
		strcat(strmessage,"张名片!");
	}
/*
	//PC send card to IPHONE
	else if(strcmp(message,"send")==0)
	{
		//printf("get (send) flag when PC send to IPHONE!\n");
		strcpy(updatetype,"");
		rc = recv(a_sock , updatetype , 3 , 0);
		updatetype[3]='\0';
		
		if(strcmp(updatetype,"rep")==0)
		{
			//printf("get (rep) flag\n");
			DeleteAllNamecard();
			SaveNamecardLogFile(0,0,false);
		}

		//strcpy(strcardcount,"");
		cardcount=0;
		//rc = recv(a_sock, strcardcount , 4 , 0);
		rc = recv(a_sock, &cardcount, 4 , 0);
		//printf("\t\t\tstrcardcount return = %d\n", rc);
		if (-1 == rc)
		{
			printf("error when received cardcount data!\n"); //接收数据时出现错误
			close(a_sock);
			close(s_sock);
			strcpy(strmessage,"数据传输出现错误,请重试!");
			isyncover=true;
			return NULL;
		}
		//strcardcount[4]='\0';
		//cardcount=atoi(strcardcount);
		printf("get cardcount=%d\n" , cardcount);
		
		char szBuf[1024];
		unsigned long nBufSize = 0;
		unsigned long nCnt = 0;
		unsigned long nRecived = 0;//已经接收到的数据个数
		//rc = recv(a_sock , &nBufSize , sizeof(nBufSize) , 0);
		rc = recv(a_sock , &nBufSize , sizeof(unsigned long) , 0);
		
		if (-1 == rc)
		{
			printf("error when received data!\n"); //接收数据时出现错误
			close(a_sock);
			close(s_sock);
			strcpy(strmessage,"数据传输出现错误,请重试!");
			isyncover=true;
			return NULL;
		}
		printf("be going to receive datacount=%d byte\n" , nBufSize);

		if (nBufSize > 0)
		{
			FILE *fpsendtoiphone;
			fpsendtoiphone = fopen(sendtoiphoneFileName , "wb");//
			if (fpsendtoiphone)
			{
				nCnt = nBufSize;				
				while(   (nCnt > 0)    &&   (rc != -1)   )
				{
					memset(szBuf , 0 , 1024);
					rc = recv(a_sock , szBuf , 1024 , 0);
					if(rc == -1)
					{
						printf("error when received data!"); //
						break;
					}
					fwrite(szBuf , sizeof(char) , rc , fpsendtoiphone);//
					nCnt -= rc;
					nRecived += rc;
					//printf("已经接收了 %d 字节\n" , nRecived);
					//printf("rc=%d , nCnt=%d , nRecived=%d\n" , rc , nCnt , nRecived);
					
					//if(pbar->position() < 100)
					//{
					//	pbar->step(10+(nRecived/nBufSize)*90);//
					// XFlush(fl_display);
					//}
				}
			}
			fclose(fpsendtoiphone);
			printf("receive over!\n");

			if(nRecived != nBufSize)
			{
				printf("recv data incorrect\n"); //接收的数据不正确,请重新获取
				remove(sendtoiphoneFileName);
			}
			
			printf("begin fill record in card_db!\n");
			retadd=AddToDB(); //向数据库中增加记录
			printf("fill record in card_db over!\n");
			remove(sendtoiphoneFileName);//
		}

		close(a_sock);
		close(s_sock);
		if(retadd==0)
		{
			sprintf(straddcardcount,"%d",addcardcount);
			strcpy(strmessage,"从PC端接收");
			strcat(strmessage, straddcardcount);
			strcat(strmessage,"张名片!");
		}
		else if (retadd == -2)
		{
			strcpy(strmessage,"永久空间不足,添加名片失败!");
		}
		else if (retadd == -3)
		{
			strcpy(strmessage,"名片张数达到最大值,添加名片失败!");
		}
		else if (retadd == -4)
		{
			strcpy(strmessage,"临时空间不足,添加名片失败!");
		}
		else
			strcpy(strmessage,"添加名片失败!");
	}

	//backup
	else if(strcmp(message,"back")==0)
	{
		//printf("get (back) flag when IPHONE backup to PC!\n");
		tmpfreesize=(unsigned long) show_free("",(char*)pathtmp);
		if(tmpfreesize<6*1024*1024)
		{
			if (-1 == send(a_sock, "fail", 4, 0)  )
			{
				printf("error when send (fail)!\n");
				close(a_sock);
				close(s_sock);
				strcpy(strmessage,"数据传输出现错误,请重试!");
				isyncover=true;
				return NULL;
			}
			close(a_sock);
			close(s_sock);
			strcpy(strmessage,"临时存储空间不足,数据备份失败!");
			isyncover=true;
			return NULL;
		}
		else
		{
			if (-1 == send(a_sock, "succ", 4, 0)  )
			{
				printf("error when send (succ)!\n");
				close(a_sock);
				close(s_sock);
				strcpy(strmessage,"数据传输出现错误,请重试!");
				isyncover=true;
				return NULL;
			}
			//printf("/tmp/isync have enough free!\n");
		}

		chdir("/home/");
		printf("tar czf /tmp/isync/home.tgz\n");
		int ret=system(com_tarbackup);
		if(ret==-1)
			printf("tar czf /tmp/isync/home.tgz fail\n");    
		
		unsigned long filelength;
		filelength=GetFileSize(backuptopcFileName);
		if (-1 == send(a_sock , &filelength , sizeof(unsigned long), 0)  )
		{
			printf("error when send filelength!\n");
			close(a_sock);
			close(s_sock);
			strcpy(strmessage,"数据传输出现错误,请重试!");
			isyncover=true;
			return NULL;
		}
		char *str=(char*)malloc(filelength);
		FILE *fpbackuptopc;
		fpbackuptopc = fopen(backuptopcFileName, "rb");
		if(fpbackuptopc)
		{
			fread(str,filelength,1,fpbackuptopc);
		//      printf("str=%s\n",str);
		}
		if (-1 == send(a_sock , str , filelength , 0)  )
		{
			printf("error when send backuptopcFileName!\n");
			fclose(fpbackuptopc);
			free(str);
			close(a_sock);
			close(s_sock);
			strcpy(strmessage,"数据传输出现错误,请重试!");
			isyncover=true;
			return NULL;
		}
		fclose(fpbackuptopc);
		free(str);
		//    printf("send backup data over!\n");
		remove(backuptopcFileName);//
		
		close(a_sock);
		close(s_sock);
		strcpy(strmessage,"i风数据已成功发送到PC端!");
	}

	//recover
	else if(strcmp(message,"reco")==0)
	{
		//printf("get (reco) flag when PC recover to IPHONE!\n");
		tmpfreesize=(unsigned long) show_free("",(char*)pathtmp);
		if(tmpfreesize<6*1024*1024)
		{
			if (-1 == send(a_sock, "fail", 4, 0)  )
			{
				printf("error when send (fail)!\n");
				close(a_sock);
				close(s_sock);
				strcpy(strmessage,"数据传输出现错误,请重试!");
				isyncover=true;
				return NULL;
			}
			close(a_sock);
			close(s_sock);
			strcpy(strmessage,"临时存储空间不足,数据恢复失败!");
			isyncover=true;
			return NULL;
		}
		else
		{
			if (-1 == send(a_sock, "succ", 4, 0)  )
			{
				printf("error when send (succ)!\n");
				close(a_sock);
				close(s_sock);
				strcpy(strmessage,"数据传输出现错误,请重试!");
				isyncover=true;
				return NULL;
			}      
			//printf("/tmp/isync have enough free!\n");
		}

		char szBuf[1024];
		unsigned long nBufSize = 0;
		unsigned long nCnt = 0;
		unsigned long nRecived = 0;//
		//rc = recv(a_sock , &nBufSize , sizeof(nBufSize) , 0);
		rc = recv(a_sock , &nBufSize , sizeof(unsigned long) , 0);
		
		if (-1 == rc)
		{
			printf("error when received recover data!\n"); //
			close(a_sock);
			close(s_sock);
			strcpy(strmessage,"数据传输出现错误,请重试!");
			isyncover=true;
			return NULL;
		}
		//printf("be going to receive datacount=%d byte\n" , nBufSize);

		if (nBufSize > 0)
		{
			FILE *fpbackuptopc;
			fpbackuptopc = fopen(backuptopcFileName , "wb");//
			if (fpbackuptopc)
			{
				nCnt = nBufSize;
				
				while(   (nCnt > 0)    &&   (rc != -1)   )
				{
					memset(szBuf , 0 , 1024);
					rc = recv(a_sock , szBuf , 1024 , 0);
					if(rc == -1)
					{
						printf("error when received data!"); //
						break;
					}
					fwrite(szBuf , sizeof(char) , rc , fpbackuptopc);//
					nCnt -= rc;
					nRecived += rc;
					//printf("已经接收了 %d 字节\n" , nRecived);
					//printf("rc=%d , nCnt=%d , nRecived=%d\n" , rc , nCnt , nRecived);
					
					//if(pbar->position() < 100)
					//{
					//		pbar->step(10+(nRecived/nBufSize)*90);//
					//    XFlush(fl_display);
					//}
				}
			}
			fclose(fpbackuptopc);
			//      printf("receive recover data over!\n");
			
			if(nRecived != nBufSize)
			{
				printf("recv data incorrect!\n"); //
				remove(backuptopcFileName);
				close(a_sock);
				close(s_sock);
				strcpy(strmessage,"数据传输出现错误,请重试!");
				isyncover=true;        
				return NULL;
			}

			chdir("/home/");
				
			//printf("clean home path file!\n");
			int ret=system(clean_command);
			//printf("%s\n",clean_command);
			if(ret==-1)
				printf("clean home path file fail!\n");
						
			printf("tar zxf /tmp/isync/home.tgz\n");
			ret=system(com_tarrecover);
			if(ret==-1)
				printf("tar zxf /tmp/isync/home.tgz fail!\n");
			
			//printf("update home over!\n");
			remove(backuptopcFileName);//
		}
		//goto skip_continue;
		close(a_sock);
		close(s_sock);
		strcpy(strmessage,"i风数据已成功恢复,确定后系统重新启动!");
		restartflag=true;
	}
*/
	isyncover=true;  
	return NULL;
}

/*
int AddToDB(void)
{
  FILE *fp;
  datum key;

//  printf("run AddToDB\n"); //正在向数据库中增加资料

  if((fp = fopen (sendtoiphoneFileName, "rb+")) == NULL)  //打开数据临时文件
    return -1;

//  printf("cardcount=%d\n", cardcount);

  int retadd;
  for(int i=0; i0)
    {
      g_threadStatus = 1;
      addcardcount=SaveNameCardComplete();
      if(addcardcount<0)
      {
        fclose (fp);
        return -2;
      }
      else
        break;
    }
  }

  if(retadd==0)
  {
    g_threadStatus = 1;
    addcardcount=SaveNameCardComplete();
    if(addcardcount<0)
    {
      fclose (fp);
      return -2;
    }
  }

  fclose (fp);
  return 0;
}
*/
void LoadCard (void)
{
	CTransferCard trans;
	CTransferCard::RetValue_T ret;
	ret = trans.InitRead();

	FILE *fpsendtopc;
	fpsendtopc = fopen(sendtopcFileName, "wb");
	
	cardcount=trans.DBUsedCount();
			
	if (ret != CTransferCard::RET_OK)
	{
		printf("%s\n", trans.GetErrString(ret));
		exit(255);
	}
	
	while ((ret = trans.ReadCard(&card)) != CTransferCard::RET_READ_OVER)
	{
		if (CTransferCard::ERR_READDB == ret)
		{
			printf("%s\n", trans.GetErrString(ret));
			break;
		}
		card.PrintSelfInfo();
		
		if(fwrite(&card, sizeof(struct CardStruct_T), 1, fpsendtopc)!= 1)
			printf ("file fpsendtopc write error\n");		
	}
}