home *** CD-ROM | disk | FTP | other *** search
/ Phoenix Heaven Sunny 2 / APPARE2.BIN / oh_towns / install / instexec.c < prev    next >
Text File  |  1995-06-20  |  9KB  |  308 lines

  1. /*************************************************************************
  2. *    インストール処理
  3. *************************************************************************/
  4.  
  5. int        install_exec( char **probuf )
  6. {
  7.     int            ret, i, fcopy_att, drv, argc, srcdrv;
  8.     char      **argv, *p, *typename;
  9.     char        instdir[256];
  10.     char        softname[80];
  11.     char        srcdir[128], instfile[128];
  12.     char        helpfn[128];
  13.     char        item_ttl[80],item_prog[32], item_para[128];
  14.     int            item_setup, item_num, item_att;
  15.     char        arcfn[128], arcdir[128], arcflag;
  16.     char        runfn[128], runpara[128];
  17.     char        demo_msg[80], demo_func[80];
  18.     char       *lhalib;
  19.     char       *dlgTxm;
  20.     char        tmp[256], tmp2[256];
  21.  
  22.     fcopy_att = FCOPY_ATT_SUBDIR | FCOPY_ATT_TIMESTAMP | FCOPY_ATT_CHK_OVERWRITE;
  23.     instdir[0]   = '\0';
  24.     srcdir[0]    = '\0';
  25.     instfile[0]  = '\0';
  26.     helpfn[0]    = '\0';
  27.     item_num     =  0;
  28.     item_ttl[0]  = '\0';
  29.     arcfn[0]     = '\0';
  30.     arcdir[0]    = '\0';
  31.     arcflag      = 0;
  32.     runpara[0]   = '\0';
  33.     runfn[0]     = '\0';
  34.     demo_msg[0]  = '\0';
  35.     demo_func[0] = '\0';
  36.  
  37.     srcdrv = toupper(DirStart[0]) - 'A';
  38.  
  39.     /* インストールプロジェクト設定        --------------------------------*/
  40.     for ( i = 0; probuf[i] != NULL; ++i )
  41.     {
  42.         if ( (argc = DTA_makeArg(probuf[i],&argv)) > 0 )
  43.         {
  44.             typename = argv[0];
  45.             if ( strcmpi(typename,"softname") == 0 )
  46.             {
  47.                 if ( argc >= 2 )
  48.                     strcpy( softname, argv[1]);
  49.             } else if ( strcmpi(typename,"instfile") == 0 )
  50.             {
  51.                 if ( argc >= 2 )
  52.                     strcpy(srcdir  , argv[1]);
  53.                 if ( argc >= 3 )
  54.                     strcpy(instfile, argv[2]);
  55.                 if ( argc >= 4 )
  56.                 {
  57.                     if ( strcmpi(argv[3],"-nocopydir") == 0 )
  58.                         fcopy_att &= (~FCOPY_ATT_SUBDIR);
  59.                 }
  60.             } else if ( strcmpi(typename,"help") == 0 )
  61.             {
  62.                 if ( argc >= 2 )
  63.                 {
  64.                     if ( FS_isDelim(argv[1][0]) )
  65.                         strcpy(helpfn, argv[1]);
  66.                     else if ( srcdir[0] != '\0' )
  67.                         sprintf(helpfn,"%s/%s",srcdir,argv[1]);
  68.                 }
  69.             } else if ( strcmpi(typename,"item") == 0 )
  70.             {
  71.                 ++item_num;
  72.                 if ( argc >= 5 )
  73.                 {
  74.                     strcpy(item_ttl , argv[1]);
  75.                     strcpy(item_prog, argv[2]);
  76.                     strcpy(item_para, argv[3]);
  77.                     item_att = atoi(argv[4]);
  78.                 }
  79.             } else if ( strcmpi(typename,"arcfile") == 0 )
  80.             {    /* arcfile "filename.lzh" <展開ディクトリ>    */
  81.                 if ( argc >= 2 )
  82.                 {
  83.                     strcpy( arcfn , argv[1]);
  84.                     arcflag = 1;
  85.                 }
  86.                 if ( argc >= 3 )    /* ソースリストとみなす */
  87.                     strcpy( arcdir, argv[2]);
  88.             } else if ( strcmpi(typename,"runexp") == 0 )
  89.             {
  90.                 if ( argc >= 2 && srcdir[0] )
  91.                 {
  92.                     strcpy(runfn,srcdir);
  93.                     add_path_fn(runfn,argv[1]);
  94.                 }
  95.                 if ( argc >= 3 )
  96.                     strcpy(runpara,argv[2]);
  97.             } else if ( strcmpi(typename,"demo") == 0 )
  98.             {
  99.                 if ( argc >= 3 )
  100.                 {
  101.                     strcpy(demo_msg ,argv[1]);
  102.                     strcpy(demo_func,argv[2]);
  103.                 }
  104.             }
  105.             DTA_clearArg(argc,argv);
  106.         }
  107.     }
  108.  
  109.     /* インストールトップメニュー    ------------------------------------*/
  110. _TOP:
  111.     syl_putf("%s",softname);
  112.     dlgTxm = DlgTxm_open(ColBoxNormal);
  113.     DlgTxm_setTitle(dlgTxm,Fnt16x16,softname);
  114.     DlgTxm_putf( dlgTxm, Fnt16x16, TXMDAT_ATT_CENTER,
  115.         "%s をインストールします。", softname );
  116.     DlgTxm_setBtn( dlgTxm, Fnt16x16, 128, 20, C_MBLACK, C_WHITE, C_HILIGHT, C_DARK, '\r'  , KA_EXEC  ,
  117.         1, "", NULL, "インストール : [実行]");
  118.     DlgTxm_setBtn( dlgTxm, Fnt16x16, 128, 20, C_MBLACK, C_WHITE, C_HILIGHT, C_DARK, 'H'   , KA_H     ,
  119.         2, "inst_help", helpfn, "説明 : [H]");
  120.     if ( runfn[0] )
  121.     {
  122.         DlgTxm_setBtn( dlgTxm, Fnt16x16, 128, 20, C_MBLACK, C_WHITE, C_HILIGHT, C_DARK, 'R'   , KA_R     ,
  123.             3, "", NULL, "実行 : [R]");
  124.     } else if ( demo_msg[0] )
  125.     {
  126.         DlgTxm_setBtn( dlgTxm, Fnt16x16, 128, 20, C_MBLACK, C_WHITE, C_HILIGHT, C_DARK, 'D'   , KA_D     ,
  127.             3, "", NULL, "%s : [D]", demo_msg);
  128.     }
  129.     DlgTxm_setBtn( dlgTxm, Fnt16x16, 128, 20, C_MBLACK, C_WHITE, C_HILIGHT, C_DARK, '\x1B', KA_CANCEL,
  130.         4, "", NULL, "取消 : [取消]");
  131.     DlgTxm_setSize(dlgTxm,320,40);
  132.     DlgTxm_setPosition(dlgTxm,DLGPOS_CENTER_OF_SCREEN);
  133.     do
  134.     {
  135.         ret = DlgTxm_start(dlgTxm);
  136.     } while ( ret == 2 );
  137.     DlgTxm_close(dlgTxm);
  138.     if ( ret == 3 )
  139.     {
  140.         if ( runfn[0] )
  141.         {
  142.             dlgTxm = DlgTxm_open(ColBoxCaution);
  143.             DlgTxm_setTitle(dlgTxm,Fnt16x16,softname);
  144.             DlgTxm_putf( dlgTxm, Fnt16x16, TXMDAT_ATT_CENTER,
  145.                 "%s を実行します。", softname );
  146.             DlgTxm_putf( dlgTxm, Fnt16x12, TXMDAT_ATT_CENTER,"");
  147.             DlgTxm_putf( dlgTxm, Fnt16x16, TXMDAT_ATT_CENTER,
  148.                 "※ メモリが不足している場合は実行できません。" );
  149.             DlgTxm_setBtn( dlgTxm, Fnt16x16, 128, 20, C_MBLACK, C_WHITE, C_HILIGHT, C_DARK, '\r'  , KA_EXEC  ,
  150.                 1, "", NULL, "実行 : [実行]");
  151.             DlgTxm_setBtn( dlgTxm, Fnt16x16, 128, 20, C_MBLACK, C_WHITE, C_HILIGHT, C_DARK, '\x1B', KA_CANCEL,
  152.                 0, "", NULL, "取消 : [取消]");
  153.             DlgTxm_setSize(dlgTxm,400,40);
  154.             DlgTxm_setPosition(dlgTxm,DLGPOS_CENTER_OF_SCREEN);
  155.             ret = DlgTxm_start(dlgTxm);
  156.             DlgTxm_close(dlgTxm);
  157.             if ( ret == 1 )
  158.                 exprun(runfn,runpara);
  159.         } else if ( demo_msg )
  160.         {
  161.             _funcCall(demo_func, 0);
  162.         }
  163.         goto _TOP;
  164.     } else if ( ret != 1 )
  165.         goto _RET;
  166.  
  167.  
  168.     /* ソース展開確認    ------------------------------------------------*/
  169.     if ( arcfn[0] && arcdir[0] )
  170.     {
  171.         dlgTxm = DlgTxm_open(ColBoxNormal);
  172.         DlgTxm_setTitle(dlgTxm,Fnt16x16,softname);
  173.         DlgTxm_putf( dlgTxm, Fnt16x16, TXMDAT_ATT_CENTER,
  174.             "ソースプログラムもインストールしますか?" );
  175.         DlgTxm_setBtn( dlgTxm, Fnt16x16, 160, 20, C_MBLACK, C_WHITE, C_HILIGHT, C_DARK, 'S'   , KA_S    ,
  176.             1, "", 0, "ソースをインストールする : [S]");
  177.         DlgTxm_setBtn( dlgTxm, Fnt16x16, 160, 20, C_MBLACK, C_WHITE, C_HILIGHT, C_DARK, '\x1B', KA_CANCEL,
  178.             0, "", 0, "インストールしない : [取消]");
  179.         DlgTxm_setSize(dlgTxm,480,40);
  180.         DlgTxm_setPosition(dlgTxm,DLGPOS_CENTER_OF_SCREEN);
  181.         ret = DlgTxm_start(dlgTxm);
  182.         DlgTxm_close(dlgTxm);
  183.         arcflag = (ret == 1) ? 1 : 0;
  184.     }
  185.  
  186.     /* インストール先指定    --------------------------------------------*/
  187.     ret = APL_setInstallDir(instdir,"%s : インストール先指定", softname);
  188.     if ( ret )
  189.         goto _TOP;
  190.  
  191.     dlgTxm = DlgTxm_open(ColBoxNormal);
  192.     DlgTxm_setTitle(dlgTxm,Fnt16x16,softname);
  193.     DlgTxm_putf( dlgTxm, Fnt16x16, TXMDAT_ATT_CENTER,
  194.         "%s", instdir );
  195.     DlgTxm_putf( dlgTxm, Fnt16x16, TXMDAT_ATT_CENTER,
  196.         "このディレクトリにインストールしてもいいですか?" );
  197.     DlgTxm_putf( dlgTxm, Fnt16x12, TXMDAT_ATT_CENTER,"");
  198.     if ( item_ttl[0] )
  199.     {
  200.         DlgTxm_putf( dlgTxm, Fnt16x16, TXMDAT_ATT_CENTER,
  201.             "インストール1 … ファイルを複写してTownsMENU にアイテム登録");
  202.         DlgTxm_putf( dlgTxm, Fnt16x16, TXMDAT_ATT_CENTER,
  203.             "インストール2 … ファイルを複写(アイテム登録はしない)    ");
  204.  
  205.         DlgTxm_setBtn( dlgTxm, Fnt16x16, 144, 20, C_MBLACK, C_WHITE, C_HILIGHT, C_DARK, '\r'  , KA_EXEC  , 1, "", 0, "インストール1 : [実行]");
  206.         DlgTxm_setBtn( dlgTxm, Fnt16x16, 144, 20, C_MBLACK, C_WHITE, C_HILIGHT, C_DARK, 'C'   , KA_C     , 2, "", 0, "インストール2 : [C]");
  207.     } else
  208.     {    /* アイテム登録はなし    */
  209.         DlgTxm_setBtn( dlgTxm, Fnt16x16, 144, 20, C_MBLACK, C_WHITE, C_HILIGHT, C_DARK, '\r'  , KA_EXEC  , 2, "", 0, "インストール : [実行]");
  210.     }
  211.     DlgTxm_setBtn( dlgTxm, Fnt16x16, 144, 20, C_MBLACK, C_WHITE, C_HILIGHT, C_DARK, '\x1B', KA_CANCEL, 3, "", 0, "取消 : [取消]");
  212.     DlgTxm_setSize(dlgTxm,320,40);
  213.     DlgTxm_setPosition(dlgTxm,DLGPOS_CENTER_OF_SCREEN);
  214.     ret = DlgTxm_start(dlgTxm);
  215.     DlgTxm_close(dlgTxm);
  216.     if ( ret != 1 && ret != 2 )
  217.         goto _TOP;
  218.     item_setup = (ret == 1 ? 1 : 0);
  219.  
  220.  
  221.     /* インストール開始    ------------------------------------------------*/
  222.     syl_putf("INSTALL START");
  223.     FS_chdrv(srcdrv);
  224.     if ( *srcdir == '\0' || *srcdir == '.' )
  225.     {
  226.         strcpy(tmp,DirStart);
  227.         ret = strlen(tmp);
  228.         if ( ret > 3 && FS_isDelim(tmp[ret-1]) )
  229.             tmp[ret-1] = '\0';
  230.     } else
  231.     {
  232.         if ( FS_isDelim(*srcdir) )
  233.             strcpy(tmp,srcdir);
  234.         else
  235.             sprintf(tmp,"%s%s",DirStart, srcdir);
  236.     }
  237.     if ( instfile[0] )
  238.     {
  239.         FS_getFullPn(tmp2,tmp);
  240.         srcdir = tmp2;
  241.         ret = FCOPY_exec(fcopy_att, srcdir, instfile, instdir);
  242.     }
  243.  
  244.     /* 書庫展開    --------------------------------------------------------*/
  245.     if ( arcfn[0] && arcflag )
  246.     {
  247.         syl_putf("ARC(.LZH) FILE EXTRACT");
  248.         FS_chdrv(srcdrv);
  249.         strcpy(tmp,srcdir);
  250.         add_path_fn(tmp,arcfn);
  251.  
  252.         strcpy(tmp2,instdir);
  253.         if ( arcdir[0] )
  254.             add_path_fn(tmp2,arcdir);
  255.         if ( (lhalib = LHA_openArc(tmp)) != NULL )
  256.         {
  257.             ret = LHA_extractAll(lhalib,tmp2);
  258.             LHA_closeArc(lhalib);
  259.         } else
  260.         {
  261.             syl_putf("ARC OPEN ERROR");
  262.             ret = ERR;
  263.         }
  264.     }
  265.  
  266.     /* アイテム登録    ----------------------------------------------------*/
  267.     if ( ret == NORMAL && item_setup != 0 )
  268.     {
  269.         syl_putf("ITEM SETUP");
  270.         drv = toupper(instdir[0]) - 'A';
  271.         if ( item_num == 1 )
  272.         {    /* 単一    */
  273.             strcpy(tmp,instdir);
  274.             add_path_fn(tmp,item_prog);
  275.             item_setApl( drv, 1024, item_ttl, tmp, item_para, item_att );
  276.         } else
  277.         {    /* 複数登録    */
  278.             for ( i = 0; probuf[i] != NULL; ++i )
  279.             {
  280.                 if ( (argc = DTA_makeArg(probuf[i],&argv)) > 0 )
  281.                 {
  282.                     typename = argv[0];
  283.                     if ( strcmpi(typename,"item") == 0 )
  284.                     {
  285.                         if ( argc >= 5 )
  286.                         {
  287.                             strcpy(item_ttl , argv[1]);
  288.                             strcpy(item_prog, argv[2]);
  289.                             strcpy(item_para, argv[3]);
  290.                             item_att = atoi(argv[4]);
  291.                             strcpy(tmp,instdir);
  292.                             add_path_fn(tmp,item_prog);
  293.                             item_setApl( drv, 1024, item_ttl, tmp, item_para, item_att );
  294.                         }
  295.                     }
  296.                     DTA_clearArg(argc,argv);
  297.                 }
  298.             }
  299.         }
  300.     }
  301.     install_end( softname, ret );
  302.  
  303. _RET:
  304.     syl_clear();
  305.  
  306.     return (0);
  307. }
  308.