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


//
// isync.cpp
//
#include     //for int chdir(const char *path);
#include 
#include 
#include "isync.h"
#include "showcard.h"
#include "show_free.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";

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();
    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();
    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("名片,邮件,短信启动后,数据传输禁止使用!");
    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);    
}

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;
    fpsendtopc = fopen(sendtopcFileName, "wb");
    if(fpsendtopc)
    {
//      printf("seccess open sendtopcFileName to write\n");
      while((rec=LoadNameCard(&(icard[j])))>0)
      {
//        printf("icard[j].card.szMobileTel=%s\n",icard[j].card.szMobileTel);
//        printf("icard[j].card.szEmail=%s\n",icard[j].card.szEmail);
        if(fwrite(&icard[j], sizeof(struct TransferDetail), 1, fpsendtopc)!= 1)
          printf ("file fpsendtopc write error\n");
        j++;
        cardcount=j;
      }
      if(rec==0){}
//        printf("read card DB over\n");
      if(rec==-1)
        printf("read card DB error\n");
      fclose(fpsendtopc);
//      printf("read card count=%d\n",cardcount);
    }

    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;
}