home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 35 Internet / 35-Internet.zip / kkmail01.zip / kk.c next >
C/C++ Source or Header  |  1996-10-23  |  90KB  |  2,662 lines

  1. /**************************************
  2.    module : kk.c
  3.    usage  : âüâCâôâvâìâOâëâÇ
  4. ***************************************/
  5. #define INCL_WIN                       /* PM function      */
  6. #define INCL_DOSPROCESS                /* Process and thread */
  7. #define INCL_DOSSESMGR
  8. #define INCL_DOSMEMMGR                 /* Memory function  */
  9. #define INCL_DOSFILEMGR                /* Files function   */
  10. #define INCL_WIN_SHELLDATA               /* Profile */
  11. #define INCL_WINSTDFONT                 /* âEâBâôâhâEòWÅÇâtâHâôâgï@ö\     */
  12. #include "os2.h"
  13. #include "string.h"
  14. #include "stdio.h"
  15. #include "stdlib.h"
  16. #include "math.h"
  17. #include "memory.h"
  18. #include "kk.h"
  19.  
  20. #define  EOF_CODE        0x1a
  21. #define  TEXT_SIZE        64000L
  22. #define  EDMAX            50
  23. #define  TITLE_POS      23
  24. #define  START_FOLDER   "INBOX"
  25. #define  MQUEUE_FOLDER  "MQUEUE"
  26. #define  RESERVE_FOLDER "RESERVE"
  27. #define  MODE_FOLOW     0
  28. #define  MODE_RESERVE   1
  29. #define  PRFAPP            "KABE"
  30. #define  PRFKEY_DIR     "DIR"
  31. #define  PRFKEY_SWP      "SWP"
  32. #define  PRFKEY_FONT    "FONT"
  33. #define  PRFKEY_COLOR   "COLOR"
  34. #define  PRFKEY_EXTDATA "ED"
  35. #define  PRFKEY_EXTCNT  "EDCNT"
  36. #define  PRFKEY_DECODE  "DECODE"
  37. #define  PRFKEY_WIN        "WIN"
  38.  
  39. typedef struct AllSwp {
  40.     SWP    swpMain;
  41.     SWP    swpList;
  42.     SWP    swpEntry;
  43. } ASWP;
  44.  
  45. typedef struct FolderDir {
  46.     char   szKabeFolder[256];
  47.     char   szMqueFolder[256];
  48.     char   szMyFrom[128];
  49.     char   szPrefix[64];
  50.     char   szSigFile[256];
  51.     char   szEditor[256];
  52.     char   szLinkApp[256];
  53.     char   szFiller[576];
  54. } FOLDIR;
  55.  
  56. typedef struct EntryColor {
  57.     LONG   TextColor;
  58.     LONG   BackColor;
  59. } CO;
  60.  
  61. typedef struct WinSetting {
  62.     BOOL   flgVirt;
  63.     UINT   uTitleSize;
  64.     BOOL   flgPopup;
  65.     BOOL   flgReserve;
  66.     UINT   uCurTitlePos;
  67. } WS;
  68.  
  69. typedef struct ExtractData {
  70.     char   szJyoken[64];
  71.     char   szFolder[64];
  72. } EXTDATA;
  73.  
  74. typedef struct DecodeProg {
  75.     char   szISH[256];
  76.     char   szUUDECODE[256];
  77.     char   szMIME[256];
  78.     char   szDecodeDir[256];
  79.     char   szBINHEX[256];
  80. } DECPROG;
  81.  
  82.  
  83. /* ProtType */
  84. MRESULT EXPENTRY subClassMleWndProc(HWND, ULONG, MPARAM, MPARAM);
  85. MRESULT EXPENTRY subClassListWndProc(HWND, ULONG, MPARAM, MPARAM);
  86. MRESULT EXPENTRY ClientWndProc(HWND, ULONG, MPARAM, MPARAM);
  87. MRESULT EXPENTRY AboutDlg(HWND, ULONG, MPARAM, MPARAM);
  88. MRESULT EXPENTRY ReserveDlg(HWND, ULONG, MPARAM, MPARAM);
  89. MRESULT EXPENTRY OptionDlg(HWND, ULONG, MPARAM, MPARAM);
  90. MRESULT EXPENTRY OptDirDlg(HWND, ULONG, MPARAM, MPARAM);
  91. MRESULT EXPENTRY FolderDlg(HWND, ULONG, MPARAM, MPARAM);
  92. MRESULT EXPENTRY ExtractDlg(HWND, ULONG, MPARAM, MPARAM);
  93. MRESULT EXPENTRY MoveDlg(HWND, ULONG, MPARAM, MPARAM);
  94. MRESULT EXPENTRY NewfolderDlg(HWND, ULONG, MPARAM, MPARAM);
  95. MRESULT EXPENTRY DelfolderDlg(HWND, ULONG, MPARAM, MPARAM);
  96. MRESULT EXPENTRY DecodeDlg(HWND, ULONG, MPARAM, MPARAM);
  97. MRESULT EXPENTRY Extract2Dlg(HWND, ULONG, MPARAM, MPARAM);
  98.  
  99. VOID   AppMain(HAB);                   /* PMâüâCâôÅêù¥ */
  100. VOID   AppTitle();                     /*  */
  101. VOID   MoveControls(HWND);             /* âRâôâgâìü[âïé≡ê┌ô«é╖éΘ */
  102. VOID   GetProfile(INT, PCHAR *);
  103. VOID   ImportText();
  104. VOID   LoadText();                       /* âtâ@âCâïé≡ô╟é▌ì₧é▐ */
  105. VOID   LoadTitle();
  106. INT    StripSpaceLength(PCHAR);
  107. VOID   FolowMake(UINT);
  108. VOID   NewPost();
  109. VOID   ArticleFlagON(PCHAR);
  110. VOID   ToMake(PCHAR, PCHAR);
  111. UINT   GetNumberPms(PCHAR, PCHAR);
  112. VOID   PutNumberPms(PCHAR, UINT);
  113. VOID   PutFirstPms(PCHAR, UINT);
  114. BOOL   StartEditor(PCHAR);
  115. BOOL   iskanji(UCHAR);
  116. BOOL   iskanji2(UCHAR);
  117. VOID   ThreadLoadTitle();
  118. BOOL   GetArticle(PCHAR, BOOL);
  119. BOOL   ReadArticle(PCHAR);
  120. BOOL   MoveArticle(PCHAR, PCHAR);
  121. VOID   Renumber();
  122. VOID   ThreadRenumber();
  123. BOOL   StartLinkApp();
  124. VOID   Folder2Listbox(HWND);
  125. UINT   LoadED(EXTDATA *);
  126. VOID   Extract(BOOL);
  127. VOID   ThreadExtract();
  128. VOID   SendAll();
  129. VOID   EditArticle();
  130. VOID   DeleteArticle();
  131. VOID   BaseTitle();
  132. BOOL   TitleSort();
  133. BOOL   StartDecoder(PCHAR);
  134. UINT   GetSelectIndex(UINT, UINT *);
  135. BOOL   SetSelectIndex(UINT);
  136.  
  137. /* Grobal */
  138. PFNWP  oldMleWndProc;
  139. PFNWP  oldListWndProc;
  140. HWND   hFrameWnd;                      /* Frame Window */
  141. HWND   hClientWnd;                     /* Client Window */
  142. HWND   hEntryWnd;                      /* ôⁿù═â{âbâNâX */
  143. HWND   hListWnd;
  144. TID    tidThread;                       /* ô╟é▌ì₧é▌âXâîâbâhé╠ID */
  145. HAB    hab;
  146. CHAR   szCurFolder[256];
  147. CHAR   szBaseFolder[256];
  148. CHAR   szIniName[256];
  149. CHAR   szProvider[256];
  150. CHAR   szMoveArticleFile[256];
  151. UINT   uMoveArticleIdx;
  152. PVOID  pvText;                           /* âeâLâXâgèiö[âoâbâtâ@é╠âAâhâîâX */
  153. PCHAR  pszText;
  154. PCHAR  pszRead;
  155. ULONG  ulTextLength;                   /* âeâLâXâgÆ╖ */
  156. ASWP   as;                               /* SWP */
  157. FATTRS fattrsEntry;                       /* FONT */
  158. CO     co;
  159. FOLDIR fd;
  160. UINT   uMaxItem;
  161. FILESTATUS3  FileInfoBuf;           /* âtâ@âCâïÅεò±âoâbâtâ@ü[ */
  162. WS     ws;
  163.  
  164. EXTDATA ed[EDMAX];
  165. UINT    ued;
  166.  
  167. DECPROG dec;
  168. CHAR    szSubCmd[256];
  169.  
  170. BOOL   flgProfDir  = TRUE;
  171. BOOL   flgProfSwp  = TRUE;
  172. BOOL   flgProfFont = TRUE;
  173. BOOL   flgProfColor= TRUE;
  174. BOOL   flgProfDecode = TRUE;
  175. BOOL   flgProfWin  = TRUE;
  176.  
  177. BOOL   flgFirst    = TRUE; 
  178. BOOL   flgOptHdr   = FALSE;
  179. BOOL   flgThread   = FALSE;
  180. BOOL   flgVScroll  = FALSE;
  181. BOOL   flgSelect   = TRUE;
  182. BOOL   flgUseBuf   = FALSE;
  183.  
  184. /**************************************/
  185. /* èJÄnÅêù¥                           */
  186. /**************************************/
  187. INT main(INT argc, PCHAR *argv)
  188. {
  189.    HMQ    hmq;
  190.    TID    tidSub;
  191.    APIRET rc;
  192.  
  193.    /* âAâvâèé╠Åëè·ë╗ */
  194.    hab = WinInitialize(0);
  195.    hmq = WinCreateMsgQueue(hab, 0);
  196.    GetProfile(argc, argv);
  197.                                             /* âeâLâXâgæ▐ö≡ùpé╠âüâéâèü[é╠èmò█ */
  198.    rc = DosAllocMem(&pvText, TEXT_SIZE, PAG_COMMIT | PAG_READ | PAG_WRITE); 
  199.    if (rc != 0) {
  200.       AppMsg("Can't Allocate Memory");
  201.    } else {
  202.       AppMain(hab);                     /* PMÄnô«èJÄn */
  203.       DosFreeMem(pvText);                /* âüâéâèü[é╠èJò· */
  204.    } /* endif */
  205.  
  206.    /* ÅIù╣Åêù¥ */
  207.    WinDestroyMsgQueue(hmq);
  208.    WinTerminate(hab);
  209.    return 0;
  210. }
  211.  
  212. /**************************************/
  213. /* âvâìâtâ@âCâïé╠ô╟é▌é╛é╡             */
  214. /**************************************/
  215. VOID GetProfile(INT argc, PCHAR *argv)
  216. {
  217.    HINI  hini;
  218.    INT   l;
  219.    ULONG ulLen;
  220.    PCHAR prog;
  221.  
  222.    switch (argc) {
  223.    case 1:
  224.       strcpy(szIniName, argv[0]);
  225.       strcpy(szProvider, APP_TITLE);
  226.       break;
  227.    case 2:
  228.       strcpy(szIniName, argv[0]);
  229.       strcpy(szProvider, argv[1]);
  230.       break;
  231.    default:
  232.       strcpy(szIniName, argv[2]);
  233.       strcpy(szProvider, argv[1]);
  234.       break;
  235.    } /* endswitch */
  236.    l = strlen(szIniName);
  237.    strcpy(szIniName + (l - 3), "INI");
  238.  
  239.    l = strlen(argv[0]);
  240.    strcpy(szSubCmd, argv[0]);
  241.    strcpy(szSubCmd + (l - 4), "SUB.CMD");
  242.  
  243.    /* Profileé╠ô╟é▌é╛é╡ */
  244.    hini = PrfOpenProfile(hab, szIniName);
  245.    if (hini != NULLHANDLE) {
  246.       ulLen = (ULONG)sizeof(as);
  247.       if (!PrfQueryProfileData(hini, PRFAPP, PRFKEY_SWP, (PVOID)&as, &ulLen)) 
  248.          flgProfSwp = FALSE;
  249.       ulLen = (ULONG)sizeof(fattrsEntry);
  250.       if (!PrfQueryProfileData(hini, PRFAPP, PRFKEY_FONT, (PVOID)&fattrsEntry, &ulLen)) 
  251.          flgProfFont = FALSE;
  252.       ulLen = (ULONG)sizeof(co);
  253.       if (!PrfQueryProfileData(hini, PRFAPP, PRFKEY_COLOR, (PVOID)&co, &ulLen)) 
  254.          flgProfColor = FALSE;
  255.       ulLen = (ULONG)sizeof(fd);
  256.       if (!PrfQueryProfileData(hini, PRFAPP, PRFKEY_DIR, (PVOID)&fd, &ulLen)) 
  257.          flgProfDir = FALSE;
  258.       ulLen = (ULONG)sizeof(dec);
  259.       if (!PrfQueryProfileData(hini, PRFAPP, PRFKEY_DECODE, (PVOID)&dec, &ulLen)) 
  260.          flgProfDecode = FALSE;
  261.       ulLen = (ULONG)sizeof(ws);
  262.       if (!PrfQueryProfileData(hini, PRFAPP, PRFKEY_WIN, (PVOID)&ws, &ulLen)) 
  263.          flgProfWin = FALSE;
  264.       PrfCloseProfile(hini);
  265.    }
  266. }
  267.  
  268. /**************************************/
  269. /* âüâbâZü[âWé╠âïü[âv                 */
  270. /**************************************/
  271. VOID AppMain(HAB hab)
  272. {
  273.    QMSG    qmsg;                       /* âüâbâZü[âWèiö[âGâèâA */
  274.    ULONG   ulStyle;                    /* âEâCâôâhâEâXâ^âCâï */
  275.  
  276.    /* âtâîü[âÇâEâCâôâhâEâNâëâXé╠ôoÿ^ */
  277.    if (!WinRegisterClass(hab, APP_FRAMECLASS, (PFNWP)ClientWndProc, CS_SIZEREDRAW, 0)){
  278.       AppMsg("Can't Register Class  App Terminate!");
  279.       return;
  280.    }
  281.    /* âtâîü[âÇâEâCâôâhâEé╠É╢ɼ */
  282.    ulStyle =  FCF_TITLEBAR   | FCF_SYSMENU       | FCF_MINMAX   |
  283.               FCF_SIZEBORDER | FCF_SHELLPOSITION | FCF_TASKLIST |
  284.               FCF_ICON       | /*FCF_ACCELTABLE    |*/ FCF_MENU     |
  285.               WS_VISIBLE;
  286.    hFrameWnd = WinCreateStdWindow(HWND_DESKTOP, WS_ANIMATE, &ulStyle, APP_FRAMECLASS,
  287.                                   APP_TITLE, 0, NULLHANDLE, ID_FRAMEWIN, &hClientWnd);
  288.    if (hFrameWnd == NULLHANDLE) {
  289.       AppMsg("Can't Create Frame Window  App Terminate!");
  290.       return;
  291.    }
  292.  
  293.    /* âRâôâgâìü[âïé≡ì∞ɼé╖éΘ */
  294.    hListWnd  = WinCreateWindow(hClientWnd, WC_LISTBOX, NULL,
  295.                                LS_MULTIPLESEL | LS_EXTENDEDSEL |
  296.                                ES_LEFT | ES_AUTOSCROLL | WS_TABSTOP | WS_VISIBLE,
  297.                                10, 140, 240, 80, hClientWnd, HWND_TOP,
  298.                                IDC_LIST, NULL, NULL);
  299.    if (hListWnd == NULLHANDLE) {
  300.       AppMsg("Can't Create Controls  App Terminate!");
  301.       return;
  302.    }
  303.    oldListWndProc = WinSubclassWindow(hListWnd, (PFNWP)subClassListWndProc);
  304.  
  305.    hEntryWnd = WinCreateWindow(hClientWnd, WC_MLE, NULL,
  306.                                MLS_BORDER | MLS_WORDWRAP| MLS_IGNORETAB | MLS_READONLY |
  307.                                ES_LEFT | ES_AUTOSCROLL | WS_TABSTOP | WS_VISIBLE,
  308.                                10, 140, 240, 80, hClientWnd, HWND_TOP,
  309.                                IDC_ENTRY, NULL, NULL);
  310.    if (hEntryWnd == NULLHANDLE) {
  311.       AppMsg("Can't Create Controls  App Terminate!");
  312.       return;
  313.    }
  314.    oldMleWndProc = WinSubclassWindow(hEntryWnd, (PFNWP)subClassMleWndProc);
  315.  
  316.    /* âEâCâôâhâEâvâìâVâWââé≡èJÄné╖éΘ */
  317.    WinShowWindow(hFrameWnd, TRUE);     /* âEâCâôâhâEé≡ò\Īé╡üAâtâHü[âJâXé≡ôûé─éΘ */
  318.    WinSetFocus(HWND_DESKTOP, hEntryWnd);
  319.  
  320.    /* WM_QUITé¬ùêéΘé▄é┼âüâbâZü[âWâïü[âv */
  321.    while (WinGetMsg(hab, &qmsg, 0, 0, 0)){
  322.       WinDispatchMsg(hab, &qmsg);
  323.    }
  324.  
  325.    WinDestroyWindow(hFrameWnd);        /* âtâîü[âÇâEâCâôâhâEé╠öjèⁿ */
  326. }
  327.  
  328. /**************************************/
  329. /* MLEé╠subClassé╠âRü[âïâoâbâNè╓Éö    */
  330. /**************************************/
  331. MRESULT EXPENTRY subClassMleWndProc(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2)
  332. {
  333.    SHORT  flg, key;
  334.  
  335.    switch (msg) {
  336.    case WM_BUTTON2UP:
  337.       if (ws.flgPopup)
  338.          WinPostMsg(hClientWnd, msg, mp1, mp2);
  339.       return 0;
  340.    case WM_CHAR:
  341.       flg = SHORT1FROMMP(mp1);
  342.       if (flg & KC_KEYUP)                  /* âLü[âAâbâvÄ₧é═û│Äïé╖éΘ */
  343.          break;
  344.       if ((flg & KC_VIRTUALKEY)) {
  345.          switch (SHORT2FROMMP(mp2)) {
  346.          case VK_DELETE:
  347.          case VK_INSERT:
  348.             WinPostMsg(hClientWnd, msg, mp1, mp2);
  349.             break;
  350.          case VK_TAB:
  351.             WinSetFocus(hListWnd, TRUE);
  352.             return 0;
  353.          default :
  354.             break;
  355.          }
  356.       }
  357.       break;
  358.    default: 
  359.       break;
  360.    }
  361.    return oldMleWndProc(hwnd, msg, mp1, mp2);
  362. }
  363.  
  364. /**************************************/
  365. /* Listé╠subClassé╠âRü[âïâoâbâNè╓Éö   */
  366. /**************************************/
  367. MRESULT EXPENTRY subClassListWndProc(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2)
  368. {
  369.    SHORT  flg, key;
  370.  
  371.    switch (msg) {
  372.    case WM_CHAR:
  373.       flg = SHORT1FROMMP(mp1);
  374.       if (flg & KC_KEYUP)                  /* âLü[âAâbâvÄ₧é═û│Äïé╖éΘ */
  375.          break;
  376.       if ((flg & KC_VIRTUALKEY)) {
  377.          switch (SHORT2FROMMP(mp2)) {
  378.          case VK_SPACE:
  379.             WinPostMsg(hClientWnd, msg, mp1, mp2);
  380.             return 0;
  381.          case VK_TAB:
  382.             WinSetFocus(hEntryWnd, TRUE);
  383.             return 0;
  384.          default :
  385.             break;
  386.          }
  387.       }
  388.       WinPostMsg(hClientWnd, msg, mp1, mp2);
  389.       break;
  390.    default:
  391.       break;
  392.    }
  393.    return oldListWndProc(hwnd, msg, mp1, mp2);
  394. }
  395.  
  396. /**************************************/
  397. /* âNâëâCâAâôâgé╠âRü[âïâoâbâNè╓Éö     */
  398. /**************************************/
  399. MRESULT EXPENTRY ClientWndProc(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2)
  400. {
  401.    /*
  402.       âtâîü[âÇâEâCâôâhâEâvâìâVâWââé┼é╖üB
  403.    */
  404.    HPS    hps;
  405.    HINI   hini;
  406.    SHORT  flg, key;
  407.    UINT   uIdx, uIdx2;
  408.    CHAR   buf[1024];
  409.    /* POPUPâüâjâàü[ */
  410.    HWND    hMenu;                      /* âüâjâàü[é╠ânâôâhâï */
  411.    PPOINTS ppts;                       /* â}âEâXé╠â|âCâôâg */
  412.    ULONG   flOpt;
  413.  
  414.  
  415.    switch (msg) {
  416.    case WM_CREATE:
  417.       WinPostMsg(hwnd, WUM_LOADTEXT, 0, 0);
  418.       break;
  419.    case WM_CLOSE:
  420.       if (flgThread)
  421.          return 0;
  422.       break;
  423.    case WM_ERASEBACKGROUND :           /* öwîié╠ì─ò`Ä╩ */
  424.       return MRFROMLONG(TRUE);
  425.    case WM_SIZE :                      /* âTâCâYò╧ìX */
  426.       MoveControls(hwnd);
  427.       break;
  428.    case WM_BUTTON2UP:
  429.       if (flgThread)
  430.          return 0;
  431.       ppts  = (PPOINTS)&mp1;
  432.       flOpt = PU_SELECTITEM | PU_NONE | PU_KEYBOARD | PU_MOUSEBUTTON1 |
  433.               PU_HCONSTRAIN | PU_VCONSTRAIN;
  434.       if (stricmp(szCurFolder, RESERVE_FOLDER) == 0){
  435.          hMenu = WinLoadMenu(hFrameWnd, NULLHANDLE, IDM_POPUP2);
  436.          WinPopupMenu(hFrameWnd, hFrameWnd, hMenu, ppts->x, ppts->y, ID_EDIT_SND, flOpt);
  437.       }
  438.       else{
  439.          hMenu = WinLoadMenu(hFrameWnd, NULLHANDLE, IDM_POPUP);
  440.          WinPopupMenu(hFrameWnd, hFrameWnd, hMenu, ppts->x, ppts->y, ID_EDIT_RES, flOpt);
  441.       }
  442.       return 0;
  443.    case WM_CONTROL:
  444.       switch (SHORT1FROMMP(mp1)) {
  445.       case IDC_LIST:
  446.          switch (SHORT2FROMMP(mp1)) {
  447.          case LN_SELECT:
  448.             if (flgSelect)
  449.                LoadText();
  450.             break;
  451.          default:
  452.            break;
  453.          } /* endswitch */
  454.          break;
  455.       case IDC_ENTRY:
  456.          switch (SHORT2FROMMP(mp1)) {
  457.          case MLN_VSCROLL:
  458.             if (flgVScroll && (mp2 + 1) == WinSendMsg(hEntryWnd, MLM_QUERYLINECOUNT, 0, 0)){
  459.                uIdx = (UINT)WinSendMsg(hListWnd, LM_QUERYSELECTION, 0, 0) + 1;
  460.                while(TRUE){
  461.                   if (uIdx >= uMaxItem){
  462.                      AppMsg("No Message");
  463.                      break;
  464.                   }
  465.                   WinSendMsg(hListWnd, LM_QUERYITEMTEXT, MPFROM2SHORT(uIdx, 1024), (MPARAM)buf);
  466.                   if (buf[0] == '*'){
  467.                      WinSendMsg(hListWnd, LM_SELECTITEM,  MPFROM2SHORT(LIT_NONE,   0), 0);
  468.                      uIdx2 = uIdx - ((flgProfWin)? ws.uCurTitlePos : 3);
  469.                      WinSendMsg(hListWnd, LM_SETTOPINDEX, MPFROM2SHORT(uIdx2, 0), 0);
  470.                      WinPostMsg(hListWnd, LM_SELECTITEM,  MPFROM2SHORT(uIdx, 0), MPFROM2SHORT(TRUE, 0));
  471.                       break;
  472.                   }
  473.                   uIdx++;
  474.                }
  475.             }
  476.             flgVScroll = FALSE;
  477.             break;
  478.          default:
  479.             break;
  480.          } /* endswitch */
  481.          break;
  482.       default:
  483.         break;
  484.       } /* endswitch */
  485.       break;
  486.    case WM_CHAR:
  487.       flg = SHORT1FROMMP(mp1);
  488.       if (flg & KC_KEYUP)                  /* âLü[âAâbâvÄ₧é═û│Äïé╖éΘ */
  489.          break;
  490.       if ((flg & KC_VIRTUALKEY)) {
  491.          switch (SHORT2FROMMP(mp2)) {
  492.          case VK_SPACE:
  493.             flgVScroll = TRUE;
  494.             WinPostMsg(hEntryWnd, WM_VSCROLL, 0, MPFROM2SHORT(0, SB_PAGEDOWN));
  495.             break;
  496.          case VK_DELETE:
  497.             WinPostMsg(hwnd, WM_COMMAND, MPFROM2SHORT(ID_EDIT_DELETE, 0), 0);
  498.             break;
  499.          case VK_INSERT:
  500.             WinPostMsg(hwnd, WM_COMMAND, MPFROM2SHORT(ID_EDIT_MOVE, 0), 0);
  501.             break;
  502.          default :
  503.             break;
  504.          }
  505.       }
  506.       else {
  507.          key = toupper(SHORT1FROMMP(mp2));
  508.          switch (key) {
  509.          case 'F':
  510.             WinPostMsg(hwnd, WM_COMMAND, MPFROM2SHORT(ID_EDIT_RES, 0), 0);
  511.             break;
  512.          case 'R':
  513.             WinPostMsg(hwnd, WM_COMMAND, MPFROM2SHORT(ID_EDIT_RSV, 0), 0);
  514.             break;
  515.          case 'H':
  516.             WinPostMsg(hwnd, WM_COMMAND, MPFROM2SHORT(ID_EDIT_HDR, 0), 0);
  517.             break;
  518.          case 'N':
  519.             uIdx = GetSelectIndex(0, &uIdx2);
  520.             uIdx++;
  521.             if (uIdx < uMaxItem){
  522.                SetSelectIndex(uIdx);
  523.             }
  524.             break;
  525.          case 'P':
  526.             uIdx = GetSelectIndex(0, &uIdx2);
  527.             if (uIdx > 0){
  528.                uIdx--;
  529.                SetSelectIndex(uIdx);
  530.             }
  531.             break;
  532.          case 'T':
  533.             SetSelectIndex(0);
  534.             break;
  535.          case 'B':
  536.             SetSelectIndex(uMaxItem - 1);
  537.             break;
  538.          case 'Q':
  539.             AppClose();
  540.             break;
  541.          case 'O':
  542.             WinPostMsg(hwnd, WM_COMMAND, MPFROM2SHORT(ID_FILE_FOLDER, 0), 0);
  543.             break;
  544.          case 'L':
  545.             WinPostMsg(hwnd, WM_COMMAND, MPFROM2SHORT(ID_FILE_LINK, 0), 0);
  546.             break;
  547.          case 'D':
  548.             WinPostMsg(hListWnd, WM_VSCROLL, MPFROM2SHORT(FID_VERTSCROLL, 0), MPFROM2SHORT(0, SB_PAGEDOWN));
  549.             break;
  550.          case 'U':
  551.             WinPostMsg(hListWnd, WM_VSCROLL, 0, MPFROM2SHORT(0, SB_PAGEUP));
  552.             break;
  553.          case 'E':
  554.             WinPostMsg(hwnd, WM_COMMAND, MPFROM2SHORT(ID_EDIT_EDIT, 0), 0);
  555.             break;
  556.          case 'S':
  557.             WinPostMsg(hwnd, WM_COMMAND, MPFROM2SHORT(ID_EDIT_SND, 0), 0);
  558.             break;
  559.          case 'I':
  560.             WinPostMsg(hwnd, WM_COMMAND, MPFROM2SHORT(ID_FILE_LOAD, 0), 0);
  561.             break;
  562.          case 'M':
  563.             WinPostMsg(hwnd, WM_COMMAND, MPFROM2SHORT(ID_FILE_MQUE, 0), 0);
  564.             break;
  565.          case 'Z':
  566.             WinPostMsg(hwnd, WM_COMMAND, MPFROM2SHORT(ID_FILE_RESV, 0), 0);
  567.             break;
  568.          default: 
  569.            break;
  570.          } /* endswitch */
  571.       }
  572.       break;
  573.    case WM_COMMAND :
  574.       switch (SHORT1FROMMP(mp1)) {
  575.       case ID_FILE_LOAD:
  576.          if (!flgThread){
  577.             strcpy(szCurFolder, START_FOLDER);
  578.             LoadTitle();
  579.          }
  580.          return 0;
  581.       case ID_FILE_RESV:
  582.          if (!flgThread){
  583.             strcpy(szCurFolder, RESERVE_FOLDER);
  584.             LoadTitle();
  585.          }
  586.          return 0;
  587.       case ID_FILE_MQUE:
  588.          if (!flgThread){
  589.             strcpy(szCurFolder, MQUEUE_FOLDER);
  590.             LoadTitle();
  591.          }
  592.          return 0;
  593.       case ID_FILE_QUITN:              /* Æ╩Åφé╠ÅIù╣ */
  594.          AppClose();
  595.          return 0;
  596.       case ID_FILE_CATCH:
  597.          uIdx  = 0;
  598.          uIdx2 = (UINT)WinSendMsg(hListWnd, LM_QUERYSELECTION, 0, 0) + 1;
  599.          while(TRUE){
  600.            if (uIdx >= uIdx2)
  601.               break;
  602.            WinSendMsg(hListWnd, LM_QUERYITEMTEXT, MPFROM2SHORT(uIdx, 1024), (MPARAM)buf);
  603.            if (buf[0] == '*'){
  604.               SetSelectIndex(uIdx);
  605.            }
  606.            uIdx++;
  607.          }
  608.          return 0;
  609.       case ID_FILE_FOLDER:
  610.          if (flgThread)
  611.             return 0;
  612.          if (WinDlgBox(HWND_DESKTOP, hwnd, (PFNWP)FolderDlg, NULLHANDLE, IDD_FOLDER, NULL)
  613.              == DID_OK){
  614.             LoadTitle();
  615.          }
  616.          return 0;
  617.       case ID_FILE_RENUM:
  618.          Renumber();         
  619.          return 0;
  620.       case ID_FILE_EXTRACT:
  621.          Extract(TRUE);
  622.          return 0;
  623.       case ID_FILE_LINK:
  624.          if (!(strlen(fd.szLinkApp) > 0 && StartLinkApp()))
  625.             AppMsg("Invalid LinkApp");
  626.          return 0;
  627.       case ID_FILE_SORT:
  628.          if (!flgThread && TitleSort())
  629.             LoadTitle();
  630.          return 0;
  631.       case ID_FILE_NEWFOLDER:
  632.          WinDlgBox(HWND_DESKTOP, hwnd, (PFNWP)NewfolderDlg, NULLHANDLE, IDD_NEWFOLDER, NULL);
  633.          return 0;
  634.       case ID_FILE_DELFOLDER:
  635.          WinDlgBox(HWND_DESKTOP, hwnd, (PFNWP)DelfolderDlg, NULLHANDLE, IDD_DELFOLDER, NULL);
  636.          return 0;
  637.       case ID_FILE_EXTRACT2:
  638.          if (WinDlgBox(HWND_DESKTOP, hwnd, (PFNWP)Extract2Dlg, 
  639.                         NULLHANDLE, IDD_EXTRACT2, NULL) == DID_OK)
  640.             Extract(FALSE);
  641.          return 0;
  642.       case ID_EDIT_COPY:
  643.          WinSendMsg(hEntryWnd, MLM_COPY, 0L, 0L);
  644.          return 0;
  645.       case ID_EDIT_HDR:
  646.          flgOptHdr = !flgOptHdr;
  647.          ImportText();
  648.          return 0;
  649.       case ID_EDIT_RES:
  650.          FolowMake(MODE_FOLOW);
  651.          return 0;
  652.       case ID_EDIT_RSV:
  653.          if (ws.flgReserve)
  654.             FolowMake(MODE_RESERVE);
  655.          else
  656.             AppMsg("âèâUü[âué═Ägéªé▄é╣é±");
  657.          return 0;
  658.       case ID_EDIT_NEW:
  659.          NewPost();
  660.          return 0;
  661.       case ID_EDIT_EDIT:
  662.          EditArticle();
  663.          return 0;
  664.       case ID_EDIT_DELETE:
  665.          DeleteArticle();
  666.          return 0;
  667.       case ID_EDIT_MOVE:
  668.          uIdx = GetSelectIndex(0, &uIdx2);
  669.          if (uIdx == LIT_NONE){
  670.             AppMsg("No Select Article!");
  671.             return;
  672.          }
  673.          sprintf(szMoveArticleFile, "%s%d", szBaseFolder, uIdx2);
  674.          uMoveArticleIdx = uIdx;
  675.          WinDlgBox(HWND_DESKTOP, hwnd, (PFNWP)MoveDlg, NULLHANDLE, IDD_MOVE, NULL);
  676.          return 0;
  677.       case ID_EDIT_SND:
  678.          if (stricmp(szCurFolder, RESERVE_FOLDER) == 0){
  679.             uIdx = GetSelectIndex(0, &uIdx2);
  680.             if (uIdx == LIT_NONE){
  681.                AppMsg("No Select Article!");
  682.                return;
  683.             }
  684.             sprintf(szMoveArticleFile, "%s%d", szBaseFolder, uIdx2);
  685.             if (MoveArticle(szMoveArticleFile, fd.szMqueFolder)){
  686.                WinSendMsg(hListWnd, LM_DELETEITEM, MPFROM2SHORT(uMoveArticleIdx, 0), 0);
  687.                BaseTitle();
  688.                if (!SetSelectIndex(uMoveArticleIdx))
  689.                   WinSetWindowText(hEntryWnd, "");
  690.             }
  691.             else
  692.                AppMsg("Can't Move Article");
  693.          }
  694.          return 0;
  695.       case ID_EDIT_SNDALL:
  696.          SendAll();
  697.          return 0;
  698.       case ID_EDIT_ISH:
  699.          StartDecoder(dec.szISH);
  700.          return 0;
  701.       case ID_EDIT_UUDECODE:
  702.          StartDecoder(dec.szUUDECODE);
  703.          return 0;
  704.       case ID_EDIT_MIME:
  705.          StartDecoder(dec.szMIME);
  706.          return 0;
  707.       case ID_EDIT_BINHEX:
  708.          StartDecoder(dec.szBINHEX);
  709.          return 0;
  710.       case ID_OPTIONS_SET:
  711.          if (WinDlgBox(HWND_DESKTOP, hwnd, (PFNWP)OptionDlg, NULLHANDLE, IDD_OPTIONS, NULL)
  712.              == DID_OK) {
  713.              hini = PrfOpenProfile(hab, szIniName);
  714.              if (hini != NULLHANDLE) {
  715.                  PrfWriteProfileData(hini, PRFAPP, PRFKEY_WIN, (PVOID)&ws, sizeof(ws));
  716.                  PrfCloseProfile(hini);
  717.                  flgProfWin = TRUE;
  718.              }
  719.              WinSendMsg(hwnd, WM_SIZE, 0, 0);
  720.              WinShowWindow(hwnd, FALSE);
  721.              WinShowWindow(hwnd, TRUE);
  722.              WinSendMsg(hwnd, WM_COMMAND, MPFROM2SHORT(ID_OPTIONS_POS, 0), 0);
  723.          }
  724. /*
  725.          WinSendMsg(hEntryWnd, MLM_QUERYFONT, &fattrsEntry, 0);
  726.          co.TextColor = (LONG)WinSendMsg(hEntryWnd, MLM_QUERYTEXTCOLOR, 0, 0);
  727.          co.BackColor = (LONG)WinSendMsg(hEntryWnd, MLM_QUERYBACKCOLOR, 0, 0);
  728.          if (WinDlgBox(HWND_DESKTOP, hwnd, (PFNWP)OptionDlg, NULLHANDLE, IDD_OPTIONS, NULL)
  729.              == DID_OK) {
  730.              WinSendMsg(hEntryWnd, MLM_SETFONT, &fattrsEntry, 0);
  731.              WinSendMsg(hEntryWnd, MLM_SETTEXTCOLOR, (MPARAM)co.TextColor, 0);
  732.              WinSendMsg(hEntryWnd, MLM_SETBACKCOLOR, (MPARAM)co.BackColor, 0);
  733.              hini = PrfOpenProfile(hab, szIniName);
  734.              if (hini != NULLHANDLE) {
  735.                  PrfWriteProfileData(hini, PRFAPP, PRFKEY_FONT, (PVOID)&fattrsEntry, sizeof(fattrsEntry));
  736.                  PrfWriteProfileData(hini, PRFAPP, PRFKEY_COLOR, (PVOID)&co, sizeof(co));
  737.                  PrfCloseProfile(hini);
  738.                  AppMsg("Success(^^");
  739.              }
  740.             }
  741. */
  742.          return 0;
  743.       case ID_OPTIONS_DIR:
  744.          if (WinDlgBox(HWND_DESKTOP, hwnd, (PFNWP)OptDirDlg, NULLHANDLE, IDD_OPTDIR, NULL)
  745.              == DID_OK) {
  746.             hini = PrfOpenProfile(hab, szIniName);
  747.             if (hini != NULLHANDLE) {
  748.                  PrfWriteProfileData(hini, PRFAPP, PRFKEY_DIR, (PVOID)&fd, sizeof(fd));
  749.                PrfCloseProfile(hini);
  750.                flgProfDir = TRUE;
  751.             }
  752.             LoadTitle();
  753.          }
  754.          return 0;
  755.       case ID_OPTIONS_POS:
  756.          WinQueryWindowPos(hFrameWnd, (PSWP)&as.swpMain);
  757.          WinQueryWindowPos(hListWnd, (PSWP)&as.swpList);
  758.          WinQueryWindowPos(hEntryWnd, (PSWP)&as.swpEntry);
  759.          hini = PrfOpenProfile(hab, szIniName);
  760.          if (hini != NULLHANDLE) {
  761.               PrfWriteProfileData(hini, PRFAPP, PRFKEY_SWP, (PVOID)&as, sizeof(as));
  762.             PrfCloseProfile(hini);
  763.             AppMsg("Success(^^");
  764.          }
  765.          return 0;
  766.       case ID_OPTIONS_EXT:
  767.          WinDlgBox(HWND_DESKTOP, hwnd, (PFNWP)ExtractDlg, NULLHANDLE, IDD_EXTRACT, NULL);
  768.          return 0;
  769.       case ID_OPTIONS_DECODE:
  770.          if (WinDlgBox(HWND_DESKTOP, hwnd, (PFNWP)DecodeDlg, NULLHANDLE, IDD_DECODE, NULL)
  771.              == DID_OK) {
  772.             hini = PrfOpenProfile(hab, szIniName);
  773.             if (hini != NULLHANDLE) {
  774.                  PrfWriteProfileData(hini, PRFAPP, PRFKEY_DECODE, (PVOID)&dec, sizeof(dec));
  775.                PrfCloseProfile(hini);
  776.                flgProfDecode = TRUE;
  777.             }
  778.          }
  779.          return 0;
  780.       case ID_HELP_VER:                /* âoü[âWâçâôò\Ī */
  781.          WinDlgBox(HWND_DESKTOP, hwnd, (PFNWP)AboutDlg, NULLHANDLE, IDD_ABOUT, NULL);
  782.          return 0;
  783.       case ID_HELP_KEY:
  784.          WinDlgBox(HWND_DESKTOP, hwnd, (PFNWP)AboutDlg, NULLHANDLE, IDD_KEYHELP, NULL);
  785.          return 0;
  786.       default:
  787.         break;
  788.       } /* endswitch */
  789.       break;
  790.    case WUM_LOADTEXT:
  791.       if (flgProfDir) {
  792.          WinSendMsg(hListWnd, WM_PAINT, 0, 0);
  793.          WinSendMsg(hEntryWnd, WM_PAINT, 0, 0);
  794.          WinPostMsg(hwnd, WM_COMMAND, MPFROM2SHORT(ID_FILE_LOAD, 0), 0);
  795.       }
  796.       else {
  797.          WinPostMsg(hwnd, WM_COMMAND, MPFROM2SHORT(ID_OPTIONS_DIR, 0), 0);
  798.       }
  799.       strcpy(szCurFolder, START_FOLDER);
  800.       return 0;
  801.    default: 
  802.       break;
  803.    } /* endswitch */
  804.  
  805.     return WinDefWindowProc(hwnd, msg, mp1, mp2);
  806. }
  807.  
  808. /**************************************/
  809. /* èεû{é╠â^âCâgâïé≡ò\Īé╖éΘ           */
  810. /**************************************/
  811. VOID BaseTitle()
  812. {
  813.    CHAR   buf[256];
  814.  
  815.    uMaxItem = (UINT)WinSendMsg(hListWnd, LM_QUERYITEMCOUNT, 0, 0);
  816.    sprintf(buf, "%s <%s>   %d articles", szProvider, szCurFolder, uMaxItem);
  817.    WinSetWindowText(hFrameWnd, buf);
  818. }
  819.  
  820. /**************************************/
  821. /* æIæ≡é│éΩé╜âCâôâfâbâNâXé≡ò╘é╖       */
  822. /**************************************/
  823. UINT GetSelectIndex(UINT uStartIndex, UINT *puFileIndex)
  824. {
  825.    CHAR buf[256];
  826.    UINT uIdx;
  827.  
  828.    if (uStartIndex == 0)
  829.       uStartIndex = LIT_FIRST;
  830.    uIdx = (UINT)WinSendMsg(hListWnd, LM_QUERYSELECTION, MPFROM2SHORT(uStartIndex, 0), 0);
  831.    if (uIdx == LIT_NONE)
  832.       return LIT_NONE;
  833.  
  834.    WinSendMsg(hListWnd, LM_QUERYITEMTEXT, MPFROM2SHORT(uIdx, 256), (MPARAM)buf);
  835.    buf[6] = 0;
  836.    *puFileIndex = atoi(buf + 1);
  837.  
  838.    return uIdx;
  839. }
  840.  
  841. /**************************************/
  842. /* ÆPêΩæIæ≡é╖éΘ                       */
  843. /**************************************/
  844. BOOL SetSelectIndex(UINT uIndex)
  845. {
  846.   UINT uTopIdx;
  847.  
  848.    WinSendMsg(hListWnd, LM_SELECTITEM,  MPFROM2SHORT(LIT_NONE,   0), 0);
  849.    if (flgProfWin)
  850.       uTopIdx = uIndex - ws.uCurTitlePos;
  851.    else
  852.       uTopIdx = uIndex - 3;
  853.    WinSendMsg(hListWnd, LM_SETTOPINDEX, MPFROM2SHORT(uTopIdx, 0), 0);
  854.    return (BOOL)WinSendMsg(hListWnd, LM_SELECTITEM, MPFROM2SHORT(uIndex, 0), MPFROM2SHORT(TRUE, 0));
  855. }
  856.  
  857. /**************************************/
  858. /* âRâôâgâìü[âïé≡ê┌ô«é╖éΘ             */
  859. /**************************************/
  860. VOID MoveControls(HWND hwnd)
  861. {
  862.    RECTL  ClientRect;
  863.    ULONG  ulX, ulY;
  864.  
  865.    if (flgProfFont) {
  866.       WinSendMsg(hEntryWnd, MLM_SETFONT, &fattrsEntry, 0);
  867.       flgProfFont = FALSE;
  868.    }
  869.    if (flgProfColor) {
  870.       WinSendMsg(hEntryWnd, MLM_SETTEXTCOLOR, (MPARAM)co.TextColor, 0);
  871.       WinSendMsg(hEntryWnd, MLM_SETBACKCOLOR, (MPARAM)co.BackColor, 0);
  872.       flgProfColor = FALSE;
  873.    }
  874.    if (flgProfSwp) {                        /* ê╩ÆuïLë»é│éΩé─éóéΘÅΩìç */
  875.       WinSetWindowPos(hFrameWnd, HWND_TOP,
  876.                       as.swpMain.x, as.swpMain.y, as.swpMain.cx, as.swpMain.cy,
  877.                       SWP_SIZE | SWP_MOVE | SWP_SHOW);
  878.       WinSetWindowPos(hEntryWnd, HWND_TOP,
  879.                       as.swpEntry.x, as.swpEntry.y, as.swpEntry.cx, as.swpEntry.cy,
  880.                       SWP_SIZE | SWP_MOVE | SWP_SHOW);
  881.       WinSetWindowPos(hListWnd, HWND_TOP,
  882.                       as.swpList.x, as.swpList.y, as.swpList.cx, as.swpList.cy,
  883.                       SWP_SIZE | SWP_MOVE | SWP_SHOW);
  884.       flgProfSwp = FALSE;
  885.    }
  886.    else {                                    /* ïLë»é│éΩé─é╚éóÅΩìç */
  887.       if (!flgProfWin) {
  888.          ws.flgVirt    = FALSE;
  889.          ws.uTitleSize = 35;
  890.       }
  891.       WinQueryWindowRect(hClientWnd, &ClientRect);
  892.       if (ws.flgVirt) {
  893.          ulX = (ClientRect.xRight - 15) *  ws.uTitleSize / 100;
  894.          WinSetWindowPos(hEntryWnd, HWND_TOP,
  895.                          ulX + 10, 5,
  896.                          ClientRect.xRight - (ulX + 15), ClientRect.yTop - 10,
  897.                          SWP_SIZE | SWP_MOVE | SWP_SHOW);
  898.  
  899.          WinSetWindowPos(hListWnd, HWND_TOP,
  900.                          5, 5,
  901.                          ulX, ClientRect.yTop - 10,
  902.                          SWP_SIZE | SWP_MOVE | SWP_SHOW);
  903.       }
  904.       else {
  905.          ulY = (ClientRect.yTop - 15) * (100 - ws.uTitleSize) / 100;
  906.          WinSetWindowPos(hEntryWnd, HWND_TOP,
  907.                          5, 5,
  908.                          ClientRect.xRight - 10, ulY,
  909.                          SWP_SIZE | SWP_MOVE | SWP_SHOW);
  910.          WinSetWindowPos(hListWnd, HWND_TOP,
  911.                          5, ulY + 10,
  912.                          ClientRect.xRight - 10, ClientRect.yTop - (ulY + 15),
  913.                          SWP_SIZE | SWP_MOVE | SWP_SHOW);
  914.       }
  915.    }
  916. }
  917.  
  918. /**************************************/
  919. /* â^âCâgâïé╠ô╟é▌é╛é╡ü@ü@ü@ü@ü@ü@ü@   */
  920. /**************************************/
  921. VOID LoadTitle()
  922. {
  923.    if (flgThread)
  924.       return;
  925.    WinSetWindowText(hEntryWnd, "");
  926.    sprintf(szBaseFolder, "%s%s", fd.szKabeFolder, szCurFolder);
  927.    if (szBaseFolder[strlen(szBaseFolder) - 1] != '\\')
  928.       strcat(szBaseFolder, "\\");
  929.    DosCreateThread(&tidThread, ThreadLoadTitle, 0, 0, 65536);
  930. }
  931.  
  932. /**************************************/
  933. /*â^âCâgâïô╟é▌ì₧é▌âXâîâbâh            */
  934. /**************************************/
  935. VOID ThreadLoadTitle()
  936. {
  937.    HAB   hab;
  938.    HMQ   hmq;
  939.    BOOL  rc;
  940.    UINT     uFcnt, uIdx, uPms, uPar;
  941.    INT   nTop;
  942.    BOOL  flgSubj, flgFrom, flgInbox, flgNextSubj, flgHdr;
  943.    CHAR  c;
  944.    CHAR  szFName[256], buf[1024];
  945.    CHAR  szSubj[256], szFrom[256];
  946.  
  947.    /* PMâAâvâèé╠Åëè·ë╗ */
  948.    flgThread = TRUE;
  949.    hab = WinInitialize(0);
  950.    hmq = WinCreateMsgQueue(hab, 0);
  951.  
  952.    if (stricmp(szCurFolder, START_FOLDER)   == 0 ||
  953.        stricmp(szCurFolder, RESERVE_FOLDER) == 0)
  954.       flgInbox = TRUE;
  955.    else
  956.       flgInbox = FALSE;
  957.    /* â^âCâgâïé╠ô╟é▌ì₧é▌Åêù¥ */
  958.    WinSendMsg(hListWnd, LM_DELETEALL, 0, 0);
  959.    uIdx   = 0;
  960.    nTop   = -1;
  961.    uPms   = GetNumberPms(szBaseFolder, buf);
  962.    for (uFcnt = 1; uFcnt < uPms; uFcnt++) {
  963.       sprintf(szFName, "%s%d", szBaseFolder, uFcnt);
  964.       if (GetArticle(szFName, FALSE)) {
  965.          flgSubj = flgFrom = FALSE;
  966.          flgNextSubj = FALSE;
  967.          StrEmpty(szSubj);
  968.          StrEmpty(szFrom);
  969.          while(ReadArticle(buf)){
  970.             if (flgNextSubj){
  971.                flgNextSubj = FALSE;
  972.                flgSubj     = TRUE;
  973.                if (buf[0] == ' ')
  974.                   strcat(szSubj, buf + 1);
  975.             }
  976.             if (strnicmp(buf, "SUBJECT: ", 9) == 0){
  977.                strcpy(szSubj, buf + 9);
  978.                flgNextSubj = TRUE;
  979.             }
  980.             if (strnicmp(buf, "FROM: ", 6) == 0){
  981.                strcpy(szFrom, buf + 6);
  982.                flgFrom = TRUE;
  983.             }
  984.             if (flgSubj && flgFrom)
  985.                break;
  986.          }
  987.          if (FileInfoBuf.ftimeCreation.twosecs == 0 && FileInfoBuf.ftimeLastWrite.twosecs == 29){
  988.             c = ' ';
  989.             if (stricmp(szCurFolder, RESERVE_FOLDER) == 0)
  990.                c = '#';
  991.          }
  992.          else {
  993.             if (nTop == -1 && !flgInbox)
  994.                nTop = uIdx;
  995.             c = '*';
  996.             if (stricmp(szCurFolder, RESERVE_FOLDER) == 0)
  997.                c = ' ';
  998.          }
  999.          sprintf(buf, "%c%5d %-15.15s %s", c, uFcnt, szFrom, szSubj);
  1000.          WinSendMsg(hListWnd, LM_INSERTITEM, MPFROM2SHORT(uIdx++, 0), (MPARAM)buf);
  1001.          if (nTop > -1){
  1002.             SetSelectIndex(nTop);
  1003. /*
  1004.             WinPostMsg(hListWnd, LM_SELECTITEM, MPFROM2SHORT(nTop, 0), MPFROM2SHORT(TRUE, 0));
  1005. */
  1006.             nTop = -2;
  1007.          }
  1008.       }
  1009.       uPar = uFcnt * 100 / uPms;
  1010.       if ((uPar % 5) == 0) {
  1011.          sprintf(buf, "%s Loading %d %%", szProvider,  uPar);
  1012.          WinSetWindowText(hFrameWnd, buf);
  1013.       }
  1014.    }
  1015.    uMaxItem = (UINT)WinSendMsg(hListWnd, LM_QUERYITEMCOUNT, 0, 0);
  1016.    if (nTop == -1 && !flgInbox){
  1017.       SetSelectIndex(uMaxItem - 1);
  1018.    }
  1019.    BaseTitle();
  1020.    LoadText();
  1021.    /* ÅIù╣Åêù¥ */
  1022.    WinDestroyMsgQueue(hmq);
  1023.    WinTerminate(hab);
  1024.    flgThread = FALSE;
  1025.    DosExit(EXIT_THREAD, 0L);
  1026. }
  1027.  
  1028. /**************************************/
  1029. /* âtâ@âCâïé≡ô╟é▌ì₧é▐                 */
  1030. /**************************************/
  1031. VOID LoadText()
  1032. {
  1033.    UINT       uFcnt, uIdx;
  1034.    CHAR    szFName[256], buf[1024];
  1035.    BOOL    flgHdr, flgEA;
  1036.                                        /* âtâ@âCâïé≡âIü[âvâôé╖éΘ */
  1037.    uIdx = GetSelectIndex(0, &uFcnt);
  1038.    if (uIdx == LIT_NONE) {
  1039.       WinSetWindowText(hEntryWnd, "");
  1040.       return;
  1041.    }
  1042.    WinSendMsg(hListWnd, LM_QUERYITEMTEXT, MPFROM2SHORT(uIdx, 1024), (MPARAM)buf);
  1043.    if (buf[0] == '*') {
  1044.       buf[0] = ' ';
  1045.       WinSendMsg(hListWnd, LM_SETITEMTEXT, MPFROM2SHORT(uIdx, 0), (MPARAM)buf);
  1046.    }
  1047.    sprintf(szFName, "%s%d", szBaseFolder, uFcnt);
  1048.  
  1049.    if (stricmp(szCurFolder, RESERVE_FOLDER) == 0)
  1050.       flgEA = FALSE;
  1051.    else
  1052.       flgEA = TRUE;
  1053.  
  1054.    if (GetArticle(szFName, flgEA)) {
  1055.       flgHdr  = FALSE;
  1056.       while(ReadArticle(buf)) {
  1057.          if (strlen(buf) > 0) {
  1058.             if (flgHdr){
  1059.                if (StripSpaceLength(buf) == 0)
  1060.                   break;
  1061.             }
  1062.             else
  1063.                flgHdr = TRUE;
  1064.          }
  1065.          else {
  1066.             if (flgHdr)
  1067.                break;
  1068.          }
  1069.       }
  1070.       pszText = pszRead;
  1071.    }
  1072.    ImportText();
  1073. }
  1074.  
  1075.  
  1076. /**************************************/
  1077. /* âXâyü[âXê╚èOé╠ò╢ÄÜÉöé≡ò╘é╖         */
  1078. /**************************************/
  1079. INT StripSpaceLength(PCHAR pszStr)
  1080. {
  1081.    PCHAR ps;
  1082.    INT   len;
  1083.  
  1084.    len = 0;
  1085.    ps = pszStr;
  1086.    while(*ps != 0){
  1087.       if (*ps != ' ')
  1088.          len++;
  1089.       ps++;
  1090.    }
  1091.    return len;
  1092. }
  1093.  
  1094.  
  1095. /**************************************/
  1096. /* TextBufferé⌐éτMLEé╔ĵéΦì₧é▐        */
  1097. /**************************************/
  1098. VOID ImportText()
  1099. {
  1100.    IPT  ipt = -1;
  1101.  
  1102.    WinSetWindowText(hEntryWnd, "");
  1103.    if (flgOptHdr){
  1104.       WinSendMsg(hEntryWnd, MLM_SETIMPORTEXPORT, (MPARAM)pvText, (MPARAM)TEXT_SIZE);
  1105.       WinSendMsg(hEntryWnd, MLM_IMPORT, (MPARAM)&ipt, MPFROMLONG(ulTextLength));
  1106.    }
  1107.    else {
  1108.       WinSendMsg(hEntryWnd, MLM_SETIMPORTEXPORT, (MPARAM)pszText, (MPARAM)TEXT_SIZE);
  1109.       WinSendMsg(hEntryWnd, MLM_IMPORT, (MPARAM)&ipt, MPFROMLONG(ulTextLength - (pszText - (PCHAR)pvText)));
  1110.    }
  1111.    /*
  1112.    WinSetFocus(HWND_DESKTOP, hEntryWnd);
  1113.    */
  1114. }
  1115.  
  1116. /**************************************/
  1117. /* âtâHâìü[âtâ@âCâïé╠ì∞ɼ             */
  1118. /**************************************/
  1119. VOID FolowMake(UINT FolowMode)
  1120. {
  1121.    PCHAR   pszFolowFolder, pszT;
  1122.    CHAR    szReserveFolder[256];
  1123.    CHAR    szFOLOW[256], buf[512], buf2[512], buf3[512];
  1124.    CHAR    szYourFrom[256], szYourReplyto[256], szSubject[256];
  1125.    CHAR    szMessageID[128];
  1126.    BOOL    flgHdr, flgBody, flgNextSubj;
  1127.    FILE    *fp, *fpsig;
  1128.  
  1129.    if (flgThread)
  1130.       return;
  1131.  
  1132.    /* âtâHâìü[âtâ@âCâïé╠âIü[âvâô */
  1133.    if (FolowMode == MODE_FOLOW){
  1134.       pszFolowFolder = fd.szMqueFolder;
  1135.    }
  1136.    else {
  1137.       sprintf(szReserveFolder, "%s%s\\", fd.szKabeFolder, RESERVE_FOLDER);
  1138.       pszFolowFolder = szReserveFolder;
  1139.    }
  1140.    PutNumberPms(pszFolowFolder, GetNumberPms(pszFolowFolder, szFOLOW) + 1);
  1141.    if ((fp = fopen(szFOLOW, "wt")) == NULL){
  1142.       AppMsg("Can't Create Folow File");
  1143.       return;
  1144.    }
  1145.  
  1146.    pszRead = (PCHAR)pvText;
  1147.    flgHdr  = FALSE;
  1148.    flgBody = FALSE;
  1149.    StrEmpty(szYourFrom);
  1150.    StrEmpty(szYourReplyto);
  1151.    StrEmpty(szSubject);
  1152.    StrEmpty(szMessageID);
  1153.    /* âeâôâvâîü[âgé╠ì∞ɼ */
  1154.    while(ReadArticle(buf)){
  1155.       if (strlen(buf) > 0){                            /*** ï≤öÆìsé┼é╚éóÄ₧é╠Åêù¥ ***/
  1156.          if (!flgHdr)                                /* âwâbâ_èJÄn */
  1157.             flgHdr = TRUE;
  1158.          if (flgBody) {                             /* Bodyìsé╚éτPrefixòtë┴é╡é─Åoù═ */
  1159.             sprintf(buf2, "%s%s\n", fd.szPrefix, buf);
  1160.             fputs(buf2, fp);
  1161.          }
  1162.          else if (flgHdr) {                         /* Headerìsé╚éτâfü[â^ò█è╟ */
  1163.             if (flgNextSubj){
  1164.                flgNextSubj = FALSE;
  1165.                if (buf[0] == ' '){
  1166.                   strcat(szSubject, buf + 1);
  1167.                }
  1168.             }
  1169.             if (strnicmp(buf, "FROM: ", 6) == 0){
  1170.                strcpy(szYourFrom, buf + 6);
  1171.             }
  1172.             else if (strnicmp(buf, "REPLY-TO: ", 10) == 0){
  1173.                strcpy(szYourReplyto, buf + 10);
  1174.             }
  1175.             else if (strnicmp(buf, "SUBJECT: ", 9) == 0){
  1176.                strcpy(szSubject, buf + 9);
  1177.                flgNextSubj = TRUE;
  1178.             }
  1179.             else if (strnicmp(buf, "MESSAGE-ID: ", 12) == 0){
  1180.                strcpy(szMessageID, buf + 12);
  1181.             }
  1182.          }
  1183.       }
  1184.       else {                                        /*** ï≤öÆìsé╠Ä₧é╠Åêù¥ **/
  1185.          if (flgHdr && !flgBody){                   /* â{âfâBèJÄné╠Ä₧âwâbâ_é╠Åoù═ */
  1186.             flgBody = TRUE;                         /* â{âfâBèJÄn */
  1187.             if (strlen(szYourReplyto) > 0)            /* Replytoé¬éáéΩé╬ùDɵ */
  1188.                ToMake(szYourReplyto, buf2);
  1189.             else
  1190.                ToMake(szYourFrom, buf2);
  1191.             sprintf(buf, "To: %s\n", buf2);
  1192.             fputs(buf, fp);
  1193.             fputs("Cc: \nBcc: \nFcc: outbox\n", fp);
  1194.             sprintf(buf, "From: %s\n", fd.szMyFrom);
  1195.             fputs(buf, fp);
  1196.             sprintf(buf, "Subject: Re:%s\n", szSubject);
  1197.             fputs(buf, fp);
  1198.             if (strlen(szMessageID) > 0) {
  1199.                sprintf(buf, "In-Reply-To: %s\n", szMessageID);
  1200.                fputs(buf, fp);
  1201.             }
  1202.             sprintf(buf, "X-Mailer: %s %s\n\n", APP_TITLE, APP_VERSION);
  1203.             fputs(buf, fp);
  1204.             sprintf(buf, "%s said :\n\n", szYourFrom);
  1205.             fputs(buf, fp);
  1206.          }
  1207.       }
  1208.    }
  1209.  
  1210.    if (strlen(fd.szSigFile) > 0) {                    /* Signé╠É▌ÆΦé¬éáéΘÄ₧ */
  1211.       if ((fpsig = fopen(fd.szSigFile, "rt")) != NULL) {
  1212.          while (fgets(buf, 512, fpsig) != NULL) {
  1213.             fputs(buf, fp);
  1214.          }
  1215.          fclose(fpsig);
  1216.       }
  1217.    }
  1218.    fclose(fp);
  1219.  
  1220.    ArticleFlagON(szFOLOW);
  1221.    if (FolowMode == MODE_RESERVE){
  1222.       if (WinDlgBox(HWND_DESKTOP, hClientWnd, (PFNWP)ReserveDlg, NULLHANDLE, IDD_RESERVE, NULL)
  1223.              == DID_CANCEL){
  1224.          if (!StartEditor(szFOLOW))
  1225.             AppMsg("Can't Execute Editor");
  1226.       }
  1227.    }
  1228.    else{ 
  1229.      if (!StartEditor(szFOLOW))
  1230.         AppMsg("Can't Execute Editor");
  1231.    }
  1232. }
  1233.  
  1234. /**************************************/
  1235. /* ÉVïKâ|âXâgâtâ@âCâïé╠ì∞ɼ           */
  1236. /**************************************/
  1237. VOID NewPost()
  1238. {
  1239.    CHAR    szFOLOW[256], buf[512];
  1240.    FILE    *fp, *fpsig;
  1241.  
  1242.    if (flgThread)
  1243.       return;
  1244.  
  1245.    /* âtâHâìü[âtâ@âCâïé╠âIü[âvâô */
  1246.    PutNumberPms(fd.szMqueFolder, GetNumberPms(fd.szMqueFolder, szFOLOW) + 1);
  1247.    if ((fp = fopen(szFOLOW, "wt")) == NULL){
  1248.       AppMsg("Can't Create Folow File");
  1249.       return;
  1250.    }
  1251.    sprintf(buf, "To: \nBcc: \nFcc: outbox\nFrom: %s\nSubject: \n", fd.szMyFrom);
  1252.    fputs(buf, fp);
  1253.    sprintf(buf, "X-Mailer: %s %s\n\n", APP_TITLE, APP_VERSION);
  1254.    fputs(buf, fp);
  1255.  
  1256.    if (strlen(fd.szSigFile) > 0) {                    /* Signé╠É▌ÆΦé¬éáéΘÄ₧ */
  1257.       if ((fpsig = fopen(fd.szSigFile, "rt")) != NULL) {
  1258.          while (fgets(buf, 512, fpsig) != NULL) {
  1259.             fputs(buf, fp);
  1260.          }
  1261.          fclose(fpsig);
  1262.       }
  1263.    }
  1264.    fclose(fp);
  1265.  
  1266.    ArticleFlagON(szFOLOW);
  1267.    if (!StartEditor(szFOLOW))
  1268.       AppMsg("Can't Execute Editor");
  1269. }
  1270.  
  1271. /**************************************/
  1272. /* ArticleâtâëâOâIâô                  */
  1273. /**************************************/
  1274. VOID ArticleFlagON(PCHAR pszFile)
  1275. {
  1276.    APIRET      rc;           /* û▀éΦâRü[âh */
  1277.    HFILE       hFile;
  1278.    ULONG       Action;
  1279.  
  1280.    /* âtâ@âCâïâtâëâOé≡âIâté╔é╖éΘ */
  1281.    rc = DosOpen(pszFile, &hFile, &Action,  0L, FILE_NORMAL,
  1282.                    FILE_OPEN, OPEN_ACCESS_READWRITE | OPEN_SHARE_DENYNONE, 0L );
  1283.    if (rc != 0)
  1284.       return;
  1285.    DosQueryFileInfo(hFile, 1, &FileInfoBuf, sizeof(FILESTATUS3));
  1286.    FileInfoBuf.ftimeCreation.twosecs  = 0;
  1287.    FileInfoBuf.ftimeLastWrite.twosecs = 29;
  1288.    rc = DosSetFileInfo(hFile, 1, &FileInfoBuf, sizeof(FILESTATUS3));
  1289.    DosClose(hFile);
  1290. }
  1291.  
  1292. /**************************************/
  1293. /* number.pmsĵô╛                     */
  1294. /**************************************/
  1295. UINT GetNumberPms(PCHAR pszFolder, PCHAR pszFile)
  1296. {
  1297.    CHAR    szPMS[512], buf[256];
  1298.    UINT    uNum = 1;
  1299.    HFILE   hFile;
  1300.    APIRET  rc;
  1301.    ULONG   Action;
  1302.    FILESTATUS3 fs3;
  1303.  
  1304.    sprintf(szPMS, "%s%s", pszFolder, "number.pms");
  1305.    rc = DosOpen(szPMS, &hFile, &Action,  0L, FILE_NORMAL,
  1306.                 FILE_OPEN, OPEN_ACCESS_READWRITE | OPEN_SHARE_DENYNONE, 0L );
  1307.    if (rc == 0){ 
  1308.       DosQueryFileInfo(hFile, 1, &fs3, sizeof(FILESTATUS3));
  1309.       DosRead(hFile, buf, fs3.cbFile, &Action );
  1310.       DosClose(hFile);
  1311.       *(buf + fs3.cbFile) = 0;
  1312.       uNum = atoi(buf);
  1313.    }
  1314.    sprintf(pszFile, "%s%d", pszFolder, uNum);
  1315.  
  1316.    return uNum;
  1317. }
  1318.  
  1319. /**************************************/
  1320. /* number.pmsìXÉV                     */
  1321. /**************************************/
  1322. VOID PutNumberPms(PCHAR pszFolder, UINT uNum)
  1323. {
  1324.    HFILE   hFile;
  1325.    APIRET  rc;
  1326.    ULONG   Action, ulWrote;
  1327.    CHAR    szPMS[512], buf[256];
  1328.  
  1329.    sprintf(szPMS, "%s%s", pszFolder, "number.pms");
  1330.    rc = DosOpen(szPMS, &hFile, &Action,  0L, FILE_NORMAL,
  1331.                 OPEN_ACTION_CREATE_IF_NEW | OPEN_ACTION_REPLACE_IF_EXISTS,          
  1332.                 OPEN_FLAGS_FAIL_ON_ERROR  | OPEN_SHARE_DENYREADWRITE | OPEN_ACCESS_READWRITE,
  1333.                 0L);
  1334.    sprintf(buf, "%d", uNum);
  1335.    DosWrite(hFile, buf, strlen(buf), &ulWrote);   
  1336.    DosClose(hFile);                        /* âtâ@âCâïâNâìü[âY */
  1337. }
  1338.  
  1339. /**************************************/
  1340. /* first.pmsìXÉV                      */
  1341. /**************************************/
  1342. VOID PutFirstPms(PCHAR pszFolder, UINT uNum)
  1343. {
  1344.    HFILE   hFile;
  1345.    APIRET  rc;
  1346.    ULONG   Action, ulWrote;
  1347.    CHAR    szPMS[512], buf[256];
  1348.  
  1349.    sprintf(szPMS, "%s%s", pszFolder, "first.pms");
  1350.    rc = DosOpen(szPMS, &hFile, &Action,  0L, FILE_NORMAL,
  1351.                 OPEN_ACTION_CREATE_IF_NEW | OPEN_ACTION_REPLACE_IF_EXISTS,          
  1352.                 OPEN_FLAGS_FAIL_ON_ERROR  | OPEN_SHARE_DENYREADWRITE | OPEN_ACCESS_READWRITE,
  1353.                 0L);
  1354.    sprintf(buf, "%d", uNum);
  1355.    DosWrite(hFile, buf, strlen(buf), &ulWrote);   
  1356.    DosClose(hFile);                        /* âtâ@âCâïâNâìü[âY */
  1357. }
  1358.  
  1359. /**************************************/
  1360. /* Fromé⌐éτToé≡ì∞ɼé╖éΘ               */
  1361. /**************************************/
  1362. VOID ToMake(PCHAR pszFrom, PCHAR pszTo)
  1363. {
  1364.    PCHAR  pszF, pszFs, pszFe, pszT;
  1365.  
  1366.    strcpy(pszTo, pszFrom);
  1367.    pszF = pszFrom;
  1368.    while(*pszF != 0){
  1369.       if (*pszF == '@')
  1370.          break;
  1371.       pszF++;
  1372.    }
  1373.    if (*pszF == 0)              /* unknown */
  1374.       return;
  1375.  
  1376.    pszFe = pszF;
  1377.    while(*pszFe != 0){
  1378.       if (*pszFe == '>' || *pszFe == '"' || *pszFe == ' ')
  1379.          break;
  1380.       pszFe++;
  1381.    }
  1382.  
  1383.    pszFs = pszF;
  1384.    while(pszFs >= pszFrom){
  1385.       if (*pszFs == '<' || *pszFs == '"' || *pszFs == ' '){
  1386.          pszFs++;
  1387.          break;
  1388.       }
  1389.       pszFs--;
  1390.    }
  1391.    if (pszFs < pszFrom)
  1392.       pszFs++;
  1393.  
  1394.    pszT = pszTo;
  1395.    pszF = pszFs;
  1396.    while(pszF < pszFe){
  1397.       *(pszT++) = *(pszF++);
  1398.    }
  1399.    *pszT = 0;
  1400. }
  1401.  
  1402. /**************************************/
  1403. /* âGâfâBâ^âZâbâVâçâôé╠èJÄn           */
  1404. /**************************************/
  1405. BOOL StartEditor(PCHAR pszEditFile)
  1406. {
  1407.    STARTDATA   StartData;    /* èJÄnâZâbâVâçâôüEâfü[â^ì\æó */
  1408.    ULONG       SessID;       /* âZâbâVâçâôID(û▀éΦ) */
  1409.    PID         PID;          /* âvâìâZâXID(û▀éΦ) */
  1410.    UCHAR       ObjBuf[100];  /* âIâuâWâFâNâgüEâoâbâtâ@ü[ */
  1411.    APIRET      rc;           /* û▀éΦâRü[âh */
  1412.  
  1413.    /*  èeÄφé╠âZâbâVâçâôèJÄnâpâëâüü[â^ü[é≡ÄwÆΦé╖éΘ */
  1414.    StartData.Length        = sizeof(STARTDATA);        /* STARTDATAì\æóé╠Æ╖é│ */
  1415.    StartData.Related    = SSF_RELATED_INDEPENDENT;    /* ô╞ùºâZâbâVâçâô */
  1416.    StartData.FgBg        = SSF_FGBG_FORE;            /* æOîié┼èJÄn */
  1417.    StartData.TraceOpt    = SSF_TRACEOPT_NONE;        /* âgâîü[âXé╡é╚éó */
  1418.    StartData.PgmTitle    = "";                           /* â^âCâgâï */
  1419.    StartData.PgmName    = fd.szEditor;                /* âvâìâOâëâÇüEâpâXû╝ */
  1420.    StartData.PgmInputs    = pszEditFile;                /* ê°é½Éö */
  1421.    StartData.TermQ        = 0;                           /* ÅIù╣æ╥é┐ìsù±é╚é╡é╞æzÆΦ */
  1422.    StartData.Environment= 0;                        /* è┬ï½âXâgâèâôâOé╚é╡é╞æzÆΦ */
  1423.    StartData.InheritOpt = SSF_INHERTOPT_SHELL;        /* è┬ï½é≡Éeé⌐éτîpÅ│ */
  1424.    StartData.SessionType= SSF_TYPE_DEFAULT;         /* âZâbâVâçâôüEâ^âCâv */
  1425.    StartData.IconFile    = 0;                          /* âAâCâRâôüEâtâ@âCâïé═é╚éó */
  1426.    StartData.PgmHandle    = 0;                        /* ô▒ôⁿâtâ@âCâïé≡Ägùpé╡é╚éó */
  1427.    StartData.PgmControl = SSF_CONTROL_VISIBLE;        /* âvâìâOâëâÇé═ë┬Äï */
  1428.    StartData.InitXPos     = 30;
  1429.    StartData.InitYPos     = 40;
  1430.    StartData.InitXSize    = 200;
  1431.    StartData.InitYSize    = 140;
  1432.    StartData.Reserved    = 0;                           /* ù\û±ì╧é▌ */
  1433.    StartData.ObjectBuffer = ObjBuf;                    /* Object Buffer */
  1434.    StartData.ObjectBuffLen = 100;                    /* Object Buffer Size */
  1435.    rc = DosStartSession(&StartData, &SessID, &PID);
  1436.                                        /* É¼î≈é╡é─û▀éΘÅΩìçüAò╧ÉöSessIDé═ÉVé╡éó */
  1437.                                        /*   âZâbâVâçâôé╠IDé≡è▄é▌üAò╧ÉöPIDé═ÉVé╡*/
  1438.                                        /*   éóâvâìâZâXé╠âvâìâZâXIDé≡è▄é▐      */
  1439.    if (rc != 0)
  1440.       return FALSE;
  1441.    return TRUE;
  1442. }
  1443.  
  1444. /**************************************/
  1445. /* è┐ÄÜéPâoâCâgû┌é⌐â`âFâbâNé╖éΘ       */
  1446. /**************************************/
  1447. BOOL iskanji(UCHAR c)
  1448. {
  1449.    /*
  1450.      0x81-0x9f or 0xe0-0xff
  1451.    */
  1452.    if (c < 0x81 || (c > 0x9f && c < 0xe0)) {
  1453.       return FALSE;
  1454.    }
  1455.    return TRUE;
  1456. }
  1457.  
  1458. /**************************************/
  1459. /* è┐ÄÜéQâoâCâgû┌é⌐â`âFâbâNé╖éΘ       */
  1460. /**************************************/
  1461. BOOL iskanji2(UCHAR c)
  1462. {
  1463.    /*
  1464.      0x40-0xff
  1465.    */
  1466.    if (c < 0x40) {
  1467.       return FALSE;
  1468.    }
  1469. }
  1470.  
  1471. /**************************************/
  1472. /* âAü[âeâBâNâïé≡ô╟é▌é╛é╖             */
  1473. /**************************************/
  1474. BOOL GetArticle(PCHAR pszArticle, BOOL flgEA)
  1475. {
  1476.    APIRET  rc;
  1477.    HFILE   hFile;
  1478.    ULONG   Action;
  1479.  
  1480.    rc = DosOpen(pszArticle, &hFile, &Action,  0L, FILE_NORMAL,
  1481.                 FILE_OPEN, OPEN_ACCESS_READWRITE | OPEN_SHARE_DENYNONE, 0L );
  1482.    if (rc != 0) 
  1483.       return FALSE;
  1484.    memset((PCHAR)pvText, 0, TEXT_SIZE); /* âüâéâèü[âGâèâAé╠Åëè·ë╗ */
  1485.                                            /* âtâ@âCâïé╠ôαùeé≡êΩïCé╔ô╟é▌ì₧é▐ */
  1486.    DosQueryFileInfo(hFile, 1, &FileInfoBuf, sizeof(FILESTATUS3));
  1487.    ulTextLength = FileInfoBuf.cbFile;
  1488.    if (ulTextLength > TEXT_SIZE) {
  1489.       DosClose(hFile);
  1490.       return FALSE;
  1491.    }
  1492.    DosRead(hFile, pvText, ulTextLength, &Action );
  1493.    if (flgEA){ 
  1494.       FileInfoBuf.ftimeCreation.twosecs  = 0;
  1495.       FileInfoBuf.ftimeLastWrite.twosecs = 29;
  1496.       rc = DosSetFileInfo(hFile, 1, &FileInfoBuf, sizeof(FILESTATUS3));
  1497.    }
  1498.    DosClose(hFile);
  1499.    pszRead = (PCHAR)pvText;
  1500.  
  1501.    return TRUE;
  1502. }
  1503.  
  1504. /**************************************/
  1505. /* âAü[âeâBâNâïé≡1ìséµé▌é╛é╖          */
  1506. /**************************************/
  1507. BOOL ReadArticle(PCHAR pszArticle)
  1508. {
  1509.    BOOL   flg = FALSE;
  1510.  
  1511.    while ((PCHAR)(pvText + ulTextLength) > pszRead) {
  1512.       flg = TRUE;
  1513.       if (*pszRead == 0x0a) {                       /* ëⁿìsâRü[âh */
  1514.          *pszArticle = 0;
  1515.          pszRead++;
  1516.          break;
  1517.       }
  1518.       else {
  1519.          if (iskanji(*pszRead)) {
  1520.             *(pszArticle++) = *(pszRead++);
  1521.             *(pszArticle++) = *pszRead;
  1522.          }
  1523.          else if (*pszRead >= 0x20 || *pszRead == 0x09){
  1524.             *(pszArticle++) = *pszRead;
  1525.          }
  1526.       }
  1527.       pszRead++;
  1528.    } /* endwhile */
  1529.    *pszArticle = 0;
  1530.  
  1531.    return flg;
  1532. }
  1533.  
  1534. /**************************************/
  1535. /* âèâiâôâoü[Åêù¥                     */
  1536. /**************************************/
  1537. VOID Renumber()
  1538. {
  1539.    if (flgThread)
  1540.       return;
  1541.    DosCreateThread(&tidThread, ThreadRenumber, 0, 0, 65536);
  1542. }
  1543.  
  1544. /**************************************/
  1545. /* âèâiâôâoü[âXâîâbâh                 */
  1546. /**************************************/
  1547. VOID ThreadRenumber()
  1548. {
  1549.    HAB   hab;
  1550.    HMQ   hmq;
  1551.    APIRET rc;
  1552.    UINT     uFcnt, uIdx, uPms, uPar;
  1553.    INT   nTop;
  1554.    BOOL  flgSubj, flgFrom;
  1555.    CHAR  c;
  1556.    CHAR  szOldName[256], szNewName[256], szTitle[256], buf[1024];
  1557.  
  1558.    /* PMâAâvâèé╠Åëè·ë╗ */
  1559.    flgThread = TRUE;
  1560.    hab = WinInitialize(0);
  1561.    hmq = WinCreateMsgQueue(hab, 0);
  1562.  
  1563.    /* â^âCâgâïé╠ô╟é▌ì₧é▌Åêù¥ */
  1564.    uIdx   = 0;
  1565.    nTop   = -1;
  1566.    uPms   = GetNumberPms(szBaseFolder, buf);
  1567.    for (uIdx = 0; uIdx < uMaxItem; uIdx++) {
  1568.       WinSendMsg(hListWnd, LM_QUERYITEMTEXT, MPFROM2SHORT(uIdx, 256), (MPARAM)szTitle);
  1569.       strncpy(buf, szTitle + 1, 5);
  1570.       buf[5] = 0;
  1571.       uFcnt = atoi(buf);
  1572.       sprintf(szOldName, "%s%d", szBaseFolder, uFcnt);
  1573.       sprintf(szNewName, "%s%d", szBaseFolder, uIdx + 1);
  1574.       if (stricmp(szOldName, szNewName) != 0){
  1575.          rc = DosMove(szOldName, szNewName);
  1576.          sprintf(buf, "%5d", uIdx + 1);
  1577.          strncpy(szTitle + 1, buf, 5);
  1578.          WinSendMsg(hListWnd, LM_SETITEMTEXT, MPFROM2SHORT(uIdx, 0), (MPARAM)szTitle);
  1579.       }
  1580.       uPar = uIdx * 100 / uMaxItem;
  1581.       if ((uPar % 5) == 0) {
  1582.          sprintf(buf, "%s Renaming %d %%", szProvider,  uPar);
  1583.          WinSetWindowText(hFrameWnd, buf);
  1584.       }
  1585.    }
  1586.    PutNumberPms(szBaseFolder, uIdx + 1);
  1587.    PutFirstPms(szBaseFolder, 0);
  1588.    BaseTitle();
  1589.  
  1590.    /* ÅIù╣Åêù¥ */
  1591.    WinDestroyMsgQueue(hmq);
  1592.    WinTerminate(hab);
  1593.    flgThread = FALSE;
  1594.    DosExit(EXIT_THREAD, 0L);
  1595. }
  1596.  
  1597. /**************************************/
  1598. /* LinkAppé╠èJÄn                      */
  1599. /**************************************/
  1600. BOOL StartLinkApp()
  1601. {
  1602.    STARTDATA   StartData;    /* èJÄnâZâbâVâçâôüEâfü[â^ì\æó */
  1603.    ULONG       SessID;       /* âZâbâVâçâôID(û▀éΦ) */
  1604.    PID         PID;          /* âvâìâZâXID(û▀éΦ) */
  1605.    UCHAR       ObjBuf[100];  /* âIâuâWâFâNâgüEâoâbâtâ@ü[ */
  1606.    CHAR           szAppName[256], szAppParam[256], buf[64];
  1607.    PCHAR       pszLinkApp, pszAppName, pszAppParam;
  1608.    BOOL        flgParam = FALSE;
  1609.    APIRET      rc;           /* û▀éΦâRü[âh */
  1610.  
  1611.    pszLinkApp  = fd.szLinkApp;
  1612.    pszAppName  = szAppName;
  1613.    pszAppParam = szAppParam;
  1614.    while(*pszLinkApp != 0){
  1615.       if (*pszLinkApp == ' '){
  1616.          flgParam = TRUE;
  1617.       }
  1618.       else {
  1619.          if (flgParam)
  1620.             *(pszAppParam++) = *pszLinkApp;
  1621.          else
  1622.             *(pszAppName++)  = *pszLinkApp;
  1623.       }
  1624.       pszLinkApp++;
  1625.    }
  1626.    *pszAppName  = 0;
  1627.    *pszAppParam = 0;
  1628.    /* *.cmdé╚éτcmd.exeîoùRé┼âRü[âïé╖éΘ */
  1629.    strcpy(buf, szAppName + (strlen(szAppName) - 3));
  1630.    if (stricmp(buf, "CMD") == 0){
  1631.       strcpy(szAppName, "cmd.exe");
  1632.       sprintf(szAppParam, "/c %s", fd.szLinkApp);
  1633.    }
  1634.  
  1635.    /*  èeÄφé╠âZâbâVâçâôèJÄnâpâëâüü[â^ü[é≡ÄwÆΦé╖éΘ */
  1636.    StartData.Length        = sizeof(STARTDATA);        /* STARTDATAì\æóé╠Æ╖é│ */
  1637.    StartData.Related    = SSF_RELATED_INDEPENDENT;    /* ô╞ùºâZâbâVâçâô */
  1638.    StartData.FgBg        = SSF_FGBG_FORE;            /* æOîié┼èJÄn */
  1639.    StartData.TraceOpt    = SSF_TRACEOPT_NONE;        /* âgâîü[âXé╡é╚éó */
  1640.    StartData.PgmTitle    = "";                           /* â^âCâgâï */
  1641.    StartData.PgmName    = szAppName;                /* âvâìâOâëâÇüEâpâXû╝ */
  1642.    StartData.PgmInputs    = szAppParam;                /* ê°é½Éö */
  1643.    StartData.TermQ        = 0;                           /* ÅIù╣æ╥é┐ìsù±é╚é╡é╞æzÆΦ */
  1644.    StartData.Environment= 0;                        /* è┬ï½âXâgâèâôâOé╚é╡é╞æzÆΦ */
  1645.    StartData.InheritOpt = SSF_INHERTOPT_SHELL;        /* è┬ï½é≡Éeé⌐éτîpÅ│ */
  1646.    StartData.SessionType= SSF_TYPE_DEFAULT;         /* âZâbâVâçâôüEâ^âCâv */
  1647.    StartData.IconFile    = 0;                          /* âAâCâRâôüEâtâ@âCâïé═é╚éó */
  1648.    StartData.PgmHandle    = 0;                        /* ô▒ôⁿâtâ@âCâïé≡Ägùpé╡é╚éó */
  1649.    StartData.PgmControl = SSF_CONTROL_VISIBLE;        /* âvâìâOâëâÇé═ë┬Äï */
  1650.    StartData.InitXPos     = 30;
  1651.    StartData.InitYPos     = 40;
  1652.    StartData.InitXSize    = 200;
  1653.    StartData.InitYSize    = 140;
  1654.    StartData.Reserved    = 0;                           /* ù\û±ì╧é▌ */
  1655.    StartData.ObjectBuffer = ObjBuf;                    /* Object Buffer */
  1656.    StartData.ObjectBuffLen = 100;                    /* Object Buffer Size */
  1657.    rc = DosStartSession(&StartData, &SessID, &PID);
  1658.                                        /* É¼î≈é╡é─û▀éΘÅΩìçüAò╧ÉöSessIDé═ÉVé╡éó */
  1659.                                        /*   âZâbâVâçâôé╠IDé≡è▄é▌üAò╧ÉöPIDé═ÉVé╡*/
  1660.                                        /*   éóâvâìâZâXé╠âvâìâZâXIDé≡è▄é▐      */
  1661.    if (rc != 0)
  1662.       return FALSE;
  1663.    return TRUE;
  1664. }
  1665.  
  1666. /**************************************/
  1667. /* ÉUéΦò¬é»Åêù¥                       */
  1668. /**************************************/
  1669. VOID Extract(BOOL flgLoad)
  1670. {
  1671.    if (flgThread)
  1672.       return;
  1673.    if (flgLoad)
  1674.       ued = LoadED(ed);
  1675.    DosCreateThread(&tidThread, ThreadExtract, 0, 0, 65536);
  1676. }
  1677.  
  1678. /**************************************/
  1679. /* ÉUéΦò¬é»âXâîâbâh                   */
  1680. /**************************************/
  1681. VOID ThreadExtract()
  1682. {
  1683.    HAB   hab;
  1684.    HMQ   hmq;
  1685.    APIRET rc;
  1686.    UINT     uFcnt, uCnt, uIdx, uIdx2, uPar;
  1687.    BOOL  flgMove;
  1688.    CHAR  szOldName[256], szNewFolder[256], szTitle[256], buf[256], buf2[256];
  1689.  
  1690.    /* PMâAâvâèé╠Åëè·ë╗ */
  1691.    flgThread = TRUE;
  1692.    hab = WinInitialize(0);
  1693.    hmq = WinCreateMsgQueue(hab, 0);
  1694.  
  1695.    /* â^âCâgâïé╠ô╟é▌ì₧é▌Åêù¥ */
  1696.    uIdx   = 0;
  1697.    uCnt   = 0;
  1698.    while (uIdx < (UINT)WinSendMsg(hListWnd, LM_QUERYITEMCOUNT, 0, 0)) {
  1699.       flgMove = FALSE;
  1700.       WinSendMsg(hListWnd, LM_QUERYITEMTEXT, MPFROM2SHORT(uIdx, 256), (MPARAM)szTitle);
  1701.       strcpy(buf, szTitle + TITLE_POS);
  1702.       for (uIdx2 = 0; uIdx2 < ued; uIdx2++){
  1703.          if ((strnicmp(buf, ed[uIdx2].szJyoken, strlen(ed[uIdx2].szJyoken)) == 0
  1704.               || strcmp(ed[uIdx2].szJyoken, "*") == 0)
  1705.            && (stricmp(szCurFolder, ed[uIdx2].szFolder) != 0)){
  1706.             strcpy(buf2, szTitle + 1);
  1707.             buf2[5] = 0;
  1708.             uFcnt = atoi(buf2);
  1709.             sprintf(szOldName, "%s%d", szBaseFolder, uFcnt);
  1710.             sprintf(szNewFolder, "%s%s\\", fd.szKabeFolder, ed[uIdx2].szFolder);
  1711.             if (MoveArticle(szOldName, szNewFolder)){
  1712.                flgMove = TRUE;
  1713.             }
  1714.             break;
  1715.          }
  1716.       }
  1717.       uPar = (++uCnt) * 100 / uMaxItem;
  1718.       if ((uPar % 5) == 0) {
  1719.          sprintf(buf, "%s Moving %d %%", szProvider,  uPar);
  1720.          WinSetWindowText(hFrameWnd, buf);
  1721.       }
  1722.       if (flgMove) 
  1723.          WinSendMsg(hListWnd, LM_DELETEITEM, MPFROM2SHORT(uIdx, 0), 0);
  1724.       else
  1725.          uIdx++;
  1726.    }
  1727.    uMaxItem = (UINT)WinSendMsg(hListWnd, LM_QUERYITEMCOUNT, 0, 0);
  1728.    if (uMaxItem == 0){
  1729.       PutNumberPms(szBaseFolder, 1);
  1730.       PutFirstPms(szBaseFolder, 0);
  1731.       WinSetWindowText(hEntryWnd, "");
  1732.    }
  1733.    else {
  1734.       WinSendMsg(hListWnd, LM_QUERYITEMTEXT, MPFROM2SHORT(uMaxItem - 1, 256), (MPARAM)szTitle);
  1735.       szTitle[6] = 0;
  1736.       uFcnt = atoi(szTitle + 1);
  1737.       PutNumberPms(szBaseFolder, uFcnt + 1);
  1738.       SetSelectIndex(uIdx);
  1739.    }
  1740.    BaseTitle();
  1741.  
  1742.    /* ÅIù╣Åêù¥ */
  1743.    WinDestroyMsgQueue(hmq);
  1744.    WinTerminate(hab);
  1745.    flgThread = FALSE;
  1746.    DosExit(EXIT_THREAD, 0L);
  1747. }
  1748.  
  1749. /**************************************/
  1750. /* êΩèçæùÉM                           */
  1751. /**************************************/
  1752. VOID SendAll()
  1753. {
  1754.    APIRET rc;
  1755.    UINT      uIdx;
  1756.    CHAR   szOldName[256], buf[256];
  1757.  
  1758.    /* â^âCâgâïé╠ô╟é▌ì₧é▌Åêù¥ */
  1759.    uIdx   = 0;
  1760.    while (uIdx < (UINT)WinSendMsg(hListWnd, LM_QUERYITEMCOUNT, 0, 0)) {
  1761.       WinSendMsg(hListWnd, LM_QUERYITEMTEXT, MPFROM2SHORT(uIdx, 256), (MPARAM)buf);
  1762.       if (buf[0] != '#'){
  1763.          buf[6] = 0;
  1764.          sprintf(szOldName, "%s%d", szBaseFolder, atoi(buf + 1));
  1765.          if (MoveArticle(szOldName, fd.szMqueFolder))
  1766.             WinSendMsg(hListWnd, LM_DELETEITEM, MPFROM2SHORT(uIdx, 0), 0);
  1767.          else
  1768.             uIdx++;
  1769.       }
  1770.       else
  1771.          uIdx++;
  1772.    }
  1773.    uMaxItem = (UINT)WinSendMsg(hListWnd, LM_QUERYITEMCOUNT, 0, 0);
  1774.    if (uMaxItem == 0){
  1775.       PutNumberPms(szBaseFolder, 1);
  1776.       PutFirstPms(szBaseFolder, 0);
  1777.       WinSetWindowText(hEntryWnd, "");
  1778.    }
  1779.    else {
  1780.       WinSendMsg(hListWnd, LM_QUERYITEMTEXT, MPFROM2SHORT(uMaxItem - 1, 256), (MPARAM)buf);
  1781.       buf[6] = 0;
  1782.       PutNumberPms(szBaseFolder, atoi(buf + 1) + 1);
  1783.       SetSelectIndex(uIdx);
  1784.    }
  1785.    BaseTitle();
  1786. }
  1787.  
  1788. /**************************************/
  1789. /* âAü[âeâBâNâïé≡ê┌ô«é╖éΘ             */
  1790. /**************************************/
  1791. BOOL MoveArticle(PCHAR pszOldArticle, PCHAR pszNewFolder)
  1792. {
  1793.    UINT   uPms;
  1794.    APIRET rc;
  1795.    CHAR   buf[256], szNewArticle[256];
  1796.  
  1797.    PutNumberPms(pszNewFolder, GetNumberPms(pszNewFolder, szNewArticle) + 1);
  1798.    rc = DosMove(pszOldArticle, szNewArticle);
  1799.    if (rc != 0)
  1800.       return FALSE;
  1801.    return TRUE;
  1802.  
  1803. /**************************************/
  1804. /* âAü[âeâBâNâïé≡ò╥ÅWé╖éΘ             */
  1805. /**************************************/
  1806. VOID EditArticle()
  1807. {
  1808.    UINT   uIdx, uFcnt;
  1809.    CHAR   buf[256], szFName[256];
  1810.  
  1811.    uIdx = GetSelectIndex(0, &uFcnt);
  1812.    if (uIdx == LIT_NONE){
  1813.       AppMsg("No Select Article!");
  1814.       return;
  1815.    }
  1816.    if (stricmp(szCurFolder, RESERVE_FOLDER) == 0){
  1817.       WinSendMsg(hListWnd, LM_QUERYITEMTEXT, MPFROM2SHORT(uIdx, 256), (MPARAM)buf);
  1818.       buf[0] = ' ';
  1819.       WinSendMsg(hListWnd, LM_SETITEMTEXT, MPFROM2SHORT(uIdx, 0), (MPARAM)buf);
  1820.    }
  1821.    sprintf(szFName, "%s%d", szBaseFolder, uFcnt);
  1822.  
  1823.    if (!StartEditor(szFName)){
  1824.       AppMsg("Can't Execute Editor");
  1825.    }
  1826. }
  1827.  
  1828. /**************************************/
  1829. /* âAü[âeâBâNâïé≡ìφÅ£é╖éΘ             */
  1830. /**************************************/
  1831. VOID DeleteArticle()
  1832. {
  1833.    UINT   uIdx, uOldIdx, uFcnt;
  1834.    CHAR   szFName[256];
  1835.  
  1836.    uIdx = GetSelectIndex(0, &uFcnt);
  1837.    if (uIdx == LIT_NONE){
  1838.       AppMsg("No Select Article!");
  1839.       return;
  1840.    }
  1841.    if (WinMessageBox(HWND_DESKTOP, HWND_DESKTOP, "Delete OK?", APP_TITLE, 0, 
  1842.                      MB_OKCANCEL | MB_ICONQUESTION) == MBID_OK){
  1843.       flgSelect = FALSE;
  1844.       while (TRUE) {
  1845.          uOldIdx = uIdx;
  1846.          sprintf(szFName, "%s%d", szBaseFolder, uFcnt);
  1847.          if (DosDelete(szFName) == 0)
  1848.             WinSendMsg(hListWnd, LM_DELETEITEM, MPFROM2SHORT(uIdx, 0), 0);
  1849.          else
  1850.             AppMsg("Can't Delete");
  1851.          uIdx = GetSelectIndex(0, &uFcnt);
  1852.          if (uIdx == LIT_NONE)
  1853.             break;
  1854.       }
  1855.       flgSelect = TRUE;
  1856.       BaseTitle();
  1857.       if (!SetSelectIndex(uOldIdx)) 
  1858.          WinSetWindowText(hEntryWnd, "");
  1859.    }
  1860. }
  1861.  
  1862. /**************************************/
  1863. /* Titleé┼â\ü[âgé╖éΘ                  */
  1864. /**************************************/
  1865. BOOL TitleSort()
  1866. {
  1867.    CHAR     buf[256], buf2[256];
  1868.    APIRET   rc;
  1869.    PVOID    pvTbl;
  1870.    UINT     *puTbl, *puTbl2;
  1871.    UINT     uIdx, uIdx2, i, j, uFcnt, uPms, uPar;
  1872.    ULONG    ulSize;
  1873.    
  1874.    /* ì∞ï╞ùpâüâéâèü[é╠âAâìâPü[âVâçâô */
  1875.    ulSize = uMaxItem * sizeof(UINT);
  1876.    rc = DosAllocMem(&pvTbl, ulSize * 2, PAG_COMMIT | PAG_READ | PAG_WRITE); 
  1877.    if (rc != 0) {
  1878.       AppMsg("Can't Allocate Memory");
  1879.       return FALSE;
  1880.    }
  1881.    puTbl  = (UINT *)pvTbl;
  1882.    puTbl2 = (UINT *)(pvTbl + ulSize);
  1883.  
  1884.    /* â\ü[âg */
  1885.    for (uIdx = 0; uIdx < uMaxItem; uIdx++){
  1886.       *(puTbl + uIdx) = uIdx;
  1887.       WinSendMsg(hListWnd, LM_QUERYITEMTEXT, MPFROM2SHORT(uIdx,  256), (MPARAM)buf);
  1888.       buf[6] = 0;
  1889.       *(puTbl2 + uIdx) = atoi(buf + 1);
  1890.    }
  1891.    for (i = 0; i < uMaxItem - 1; i++){   
  1892.       for (j = i + 1; j < uMaxItem; j++){
  1893.          uIdx  = *(puTbl + i);
  1894.          uIdx2 = *(puTbl + j);
  1895.          WinSendMsg(hListWnd, LM_QUERYITEMTEXT, MPFROM2SHORT(uIdx,  256), (MPARAM)buf);
  1896.          WinSendMsg(hListWnd, LM_QUERYITEMTEXT, MPFROM2SHORT(uIdx2, 256), (MPARAM)buf2);
  1897.          if (stricmp(buf + TITLE_POS, buf2 + TITLE_POS) > 0){
  1898.             *(puTbl + i) = uIdx2;
  1899.             *(puTbl + j) = uIdx;
  1900.             uFcnt = *(puTbl2 + i);
  1901.             *(puTbl2 + i) = *(puTbl2 + j);
  1902.             *(puTbl2 + j) = uFcnt;
  1903.          }
  1904.       }
  1905.       uPar = i * 100 / uMaxItem;
  1906.       if ((uPar % 5) == 0) {
  1907.          sprintf(buf, "%s Sorting %d %%", szProvider,  uPar);
  1908.          WinSetWindowText(hFrameWnd, buf);
  1909.       }
  1910.    }
  1911.  
  1912.    /* âtâ@âCâïû╝é╠òté»æ╓骠*/
  1913.    uPms   = GetNumberPms(szBaseFolder, buf);
  1914.    for (uIdx = 0; uIdx < uMaxItem; uIdx++) {
  1915.       sprintf(buf,  "%s%d", szBaseFolder, *(puTbl2 + uIdx));
  1916.       sprintf(buf2, "%s%d", szBaseFolder, uPms);
  1917.       *(puTbl2 + uIdx) = uPms++;
  1918.       rc = DosMove(buf, buf2);
  1919.       uPar = uIdx * 100 / uMaxItem;
  1920.       if ((uPar % 5) == 0) {
  1921.          sprintf(buf, "%s Renaming Leve1 %d %%", szProvider,  uPar);
  1922.          WinSetWindowText(hFrameWnd, buf);
  1923.       }
  1924.    }
  1925.    PutNumberPms(szBaseFolder, uPms);
  1926.  
  1927.    /* âtâ@âCâïû╝é╠òté»æ╓骠*/
  1928.    for (uIdx = 0; uIdx < uMaxItem; uIdx++) {
  1929.       sprintf(buf,  "%s%d", szBaseFolder, *(puTbl2 + uIdx));
  1930.       sprintf(buf2, "%s%d", szBaseFolder, uIdx + 1);
  1931.       rc = DosMove(buf, buf2);
  1932.       uPar = uIdx * 100 / uMaxItem;
  1933.       if ((uPar % 5) == 0) {
  1934.          sprintf(buf, "%s Renaming Level2 %d %%", szProvider,  uPar);
  1935.          WinSetWindowText(hFrameWnd, buf);
  1936.       }
  1937.    }
  1938.    PutNumberPms(szBaseFolder, uIdx + 1);
  1939.    PutFirstPms(szBaseFolder, 0);
  1940.    DosFreeMem(pvTbl);
  1941.  
  1942.    return TRUE;   
  1943. }
  1944.  
  1945. /**************************************/
  1946. /* Decodeé≡èJÄné╖éΘ                   */
  1947. /**************************************/
  1948. BOOL StartDecoder(PCHAR pszProg)
  1949. {
  1950.    STARTDATA   StartData;    /* èJÄnâZâbâVâçâôüEâfü[â^ì\æó */
  1951.    ULONG       SessID;       /* âZâbâVâçâôID(û▀éΦ) */
  1952.    PID         PID;          /* âvâìâZâXID(û▀éΦ) */
  1953.    UCHAR       ObjBuf[100];  /* âIâuâWâFâNâgüEâoâbâtâ@ü[ */
  1954.    APIRET      rc;           /* û▀éΦâRü[âh */
  1955.    CHAR           szParam[1024], szOutDir[256], szOutDrv[4], buf[256];
  1956.    UINT        uIdx, uIdx2;
  1957.  
  1958.    uIdx = GetSelectIndex(0, &uIdx2);
  1959.    if (uIdx == LIT_NONE){
  1960.        AppMsg("No Select Article!");
  1961.        return;
  1962.    }
  1963.  
  1964.    /*  èeÄφé╠âZâbâVâçâôèJÄnâpâëâüü[â^ü[é≡ÄwÆΦé╖éΘ */
  1965.    StartData.Length        = sizeof(STARTDATA);        /* STARTDATAì\æóé╠Æ╖é│ */
  1966.    StartData.Related    = SSF_RELATED_INDEPENDENT;    /* ô╞ùºâZâbâVâçâô */
  1967.    StartData.FgBg        = SSF_FGBG_FORE;            /* æOîié┼èJÄn */
  1968.    StartData.TraceOpt    = SSF_TRACEOPT_NONE;        /* âgâîü[âXé╡é╚éó */
  1969.    StartData.PgmTitle    = "";                           /* â^âCâgâï */
  1970.    StartData.PgmName    = "cmd.exe";                /* âvâìâOâëâÇüEâpâXû╝ */
  1971.    strcpy(szOutDir, dec.szDecodeDir);
  1972.    if (strlen(szOutDir) > 3)
  1973.       szOutDir[strlen(szOutDir) - 1] = 0;
  1974.    strncpy(szOutDrv, dec.szDecodeDir, 2);
  1975.    szOutDrv[2] = 0;
  1976.    sprintf(szParam, "/c %s %s %s %s %s%d",
  1977.            szSubCmd, szOutDrv, szOutDir, pszProg, szBaseFolder, uIdx2);
  1978.    StartData.PgmInputs  = szParam;
  1979.    StartData.TermQ        = 0;                           /* ÅIù╣æ╥é┐ìsù±é╚é╡é╞æzÆΦ */
  1980.    StartData.Environment= 0;                        /* è┬ï½âXâgâèâôâOé╚é╡é╞æzÆΦ */
  1981.    StartData.InheritOpt = SSF_INHERTOPT_SHELL;        /* è┬ï½é≡Éeé⌐éτîpÅ│ */
  1982.    StartData.SessionType= SSF_TYPE_DEFAULT;         /* âZâbâVâçâôüEâ^âCâv */
  1983.    StartData.IconFile    = 0;                          /* âAâCâRâôüEâtâ@âCâïé═é╚éó */
  1984.    StartData.PgmHandle    = 0;                        /* ô▒ôⁿâtâ@âCâïé≡Ägùpé╡é╚éó */
  1985.    StartData.PgmControl = SSF_CONTROL_VISIBLE;        /* âvâìâOâëâÇé═ë┬Äï */
  1986.    StartData.InitXPos     = 30;
  1987.    StartData.InitYPos     = 40;
  1988.    StartData.InitXSize    = 200;
  1989.    StartData.InitYSize    = 140;
  1990.    StartData.Reserved    = 0;                           /* ù\û±ì╧é▌ */
  1991.    StartData.ObjectBuffer = ObjBuf;                    /* Object Buffer */
  1992.    StartData.ObjectBuffLen = 100;                    /* Object Buffer Size */
  1993.    rc = DosStartSession(&StartData, &SessID, &PID);
  1994.                                        /* É¼î≈é╡é─û▀éΘÅΩìçüAò╧ÉöSessIDé═ÉVé╡éó */
  1995.                                        /*   âZâbâVâçâôé╠IDé≡è▄é▌üAò╧ÉöPIDé═ÉVé╡*/
  1996.                                        /*   éóâvâìâZâXé╠âvâìâZâXIDé≡è▄é▐      */
  1997.    if (rc != 0){
  1998.       AppMsg("Can't Start Decode Program !");
  1999.       return FALSE;
  2000.    }
  2001.    
  2002.    return TRUE;
  2003. }
  2004.  
  2005. /**************************************/
  2006. /* aboutâ_âCâAâìâOé╠âRü[âïâoâbâNè╓Éö  */
  2007. /**************************************/
  2008. MRESULT EXPENTRY AboutDlg(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2)
  2009. {
  2010.    return WinDefDlgProc(hwnd, msg, mp1, mp2);
  2011. }
  2012.  
  2013. /**************************************/
  2014. /* Reserveâ_âCâAâìâOé╠âRü[âïâoâbâNè╓Éö*/
  2015. /**************************************/
  2016. MRESULT EXPENTRY ReserveDlg(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2)
  2017. {
  2018.    return WinDefDlgProc(hwnd, msg, mp1, mp2);
  2019. }
  2020.  
  2021. /**************************************/
  2022. /* optionâ_âCâAâìâOé╠âRü[âïâoâbâNè╓Éö */
  2023. /**************************************/
  2024. MRESULT EXPENTRY OptionDlg(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2)
  2025. {
  2026.    CHAR   buf[256];
  2027.    USHORT check, check2, check3, size, size2;
  2028.  
  2029.    switch (msg) {
  2030.    case WM_INITDLG:
  2031.       if (flgProfWin) {
  2032.          check  = (ws.flgVirt)? 1 : 0;
  2033.          check2 = (ws.flgPopup)? 1 : 0;
  2034.          check3 = (ws.flgReserve)? 1 : 0;
  2035.          size   = ws.uTitleSize;
  2036.          size2  = ws.uCurTitlePos;
  2037.       }
  2038.       else {
  2039.          check  = 0;
  2040.          check2 = 0;
  2041.          check3 = 0;
  2042.          size   = 35;
  2043.          size2  = 3;
  2044.       }
  2045.       WinSendMsg(WinWindowFromID(hwnd, IDC_OPT_BUTTON), BM_SETCHECK,
  2046.                  MPFROM2SHORT(check, 0), 0);
  2047.       WinSendMsg(WinWindowFromID(hwnd, IDC_OPT_BUTTON2), BM_SETCHECK,
  2048.                  MPFROM2SHORT(check2, 0), 0);
  2049.       WinSendMsg(WinWindowFromID(hwnd, IDC_OPT_BUTTON3), BM_SETCHECK,
  2050.                  MPFROM2SHORT(check3, 0), 0);
  2051.       sprintf(buf, "%d", size);
  2052.       WinSetDlgItemText(hwnd, IDC_OPT_ENTRY, buf);
  2053.       sprintf(buf, "%d", size2);
  2054.       WinSetDlgItemText(hwnd, IDC_OPT_ENTRY4, buf);
  2055. /*
  2056.       WinSendMsg(WinWindowFromID(hwnd, IDC_OPT_ENTRY1), MLM_SETBACKCOLOR, (MPARAM)co.TextColor, 0);
  2057.       WinSendMsg(WinWindowFromID(hwnd, IDC_OPT_ENTRY2), MLM_SETBACKCOLOR, (MPARAM)co.BackColor, 0);
  2058.       WinSendMsg(WinWindowFromID(hwnd, IDC_OPT_ENTRY3), MLM_SETFONT, &fattrsEntry, 0);
  2059. */
  2060.       break;
  2061.    case WM_CONTROL:
  2062.       switch (SHORT1FROMMP(mp1)) {
  2063.       case IDC_OPT_BUTTON:
  2064.          if (SHORT2FROMMP(mp1) == BN_CLICKED){
  2065.             check = SHORT1FROMMR(WinSendMsg(WinWindowFromID(hwnd, IDC_OPT_BUTTON),
  2066.                                             BM_QUERYCHECK, 0, 0));
  2067.             check = (check == 0)? 1: 0;
  2068.             WinSendMsg(WinWindowFromID(hwnd, IDC_OPT_BUTTON), BM_SETCHECK,
  2069.                        MPFROM2SHORT(check, 0), 0);
  2070.          }
  2071.          break;
  2072.       case IDC_OPT_BUTTON2:
  2073.          if (SHORT2FROMMP(mp1) == BN_CLICKED){
  2074.             check2 = SHORT1FROMMR(WinSendMsg(WinWindowFromID(hwnd, IDC_OPT_BUTTON2),
  2075.                                             BM_QUERYCHECK, 0, 0));
  2076.             check2 = (check2 == 0)? 1: 0;
  2077.             WinSendMsg(WinWindowFromID(hwnd, IDC_OPT_BUTTON2), BM_SETCHECK,
  2078.                        MPFROM2SHORT(check2, 0), 0);
  2079.          }
  2080.          break;
  2081.       case IDC_OPT_BUTTON3:
  2082.          if (SHORT2FROMMP(mp1) == BN_CLICKED){
  2083.             check3 = SHORT1FROMMR(WinSendMsg(WinWindowFromID(hwnd, IDC_OPT_BUTTON3),
  2084.                                             BM_QUERYCHECK, 0, 0));
  2085.             check3 = (check3 == 0)? 1: 0;
  2086.             WinSendMsg(WinWindowFromID(hwnd, IDC_OPT_BUTTON3), BM_SETCHECK,
  2087.                        MPFROM2SHORT(check3, 0), 0);
  2088.          }
  2089.          break;
  2090.       default :
  2091.          break;
  2092.       }
  2093.       break;
  2094.    case WM_COMMAND:
  2095.       switch (SHORT1FROMMP(mp1)) {
  2096.       case DID_OK:
  2097.           WinQueryDlgItemText(hwnd, IDC_OPT_ENTRY, 256, buf);
  2098.           size = atoi(buf);
  2099.           if (size < 10 || size > 90)
  2100.              return 0;
  2101.           ws.uTitleSize = size;
  2102.           WinQueryDlgItemText(hwnd, IDC_OPT_ENTRY4, 256, buf);
  2103.           ws.uCurTitlePos = atoi(buf);
  2104.           check = SHORT1FROMMR(WinSendMsg(WinWindowFromID(hwnd, IDC_OPT_BUTTON),
  2105.                                           BM_QUERYCHECK, 0, 0));
  2106.           ws.flgVirt  = (check == 0)? FALSE: TRUE;
  2107.           check2 = SHORT1FROMMR(WinSendMsg(WinWindowFromID(hwnd, IDC_OPT_BUTTON2),
  2108.                                           BM_QUERYCHECK, 0, 0));
  2109.           ws.flgPopup  = (check2 == 0)? FALSE: TRUE;
  2110.           check3 = SHORT1FROMMR(WinSendMsg(WinWindowFromID(hwnd, IDC_OPT_BUTTON3),
  2111.                                           BM_QUERYCHECK, 0, 0));
  2112.           ws.flgReserve = (check3 == 0)? FALSE: TRUE;
  2113. /*
  2114.           co.TextColor = (LONG)WinSendMsg(WinWindowFromID(hwnd, IDC_OPT_ENTRY1), MLM_QUERYBACKCOLOR, 0, 0);
  2115.           co.BackColor = (LONG)WinSendMsg(WinWindowFromID(hwnd, IDC_OPT_ENTRY2), MLM_QUERYBACKCOLOR, 0, 0);
  2116.           WinSendMsg(WinWindowFromID(hwnd, IDC_OPT_ENTRY3), MLM_QUERYFONT, &fattrsEntry, 0);
  2117. */
  2118.           break;
  2119.        default:
  2120.           break;
  2121.       }
  2122.       break;
  2123.    default: 
  2124.       break;
  2125.    }
  2126.    return WinDefDlgProc(hwnd, msg, mp1, mp2);
  2127. }
  2128.  
  2129. /**************************************/
  2130. /* Dirâ_âCâAâìâOé╠âRü[âïâoâbâNè╓Éö    */
  2131. /**************************************/
  2132. MRESULT EXPENTRY OptDirDlg(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2)
  2133. {
  2134.    FOLDIR wk;
  2135.    ULONG  ulLen1, ulLen2, ulLen3, ulLen4, ulLen5, ulLen6, ulLen7;
  2136.  
  2137.    switch (msg) {
  2138.    case WM_INITDLG:
  2139.       if (flgProfDir) {
  2140.          WinSendMsg(WinWindowFromID(hwnd, IDC_DIR_ENTRY1), EM_SETTEXTLIMIT, MPFROM2SHORT(256, 0), 0);
  2141.          WinSendMsg(WinWindowFromID(hwnd, IDC_DIR_ENTRY2), EM_SETTEXTLIMIT, MPFROM2SHORT(256, 0), 0);
  2142.          WinSendMsg(WinWindowFromID(hwnd, IDC_DIR_ENTRY3), EM_SETTEXTLIMIT, MPFROM2SHORT(256, 0), 0);
  2143.          WinSendMsg(WinWindowFromID(hwnd, IDC_DIR_ENTRY4), EM_SETTEXTLIMIT, MPFROM2SHORT(256, 0), 0);
  2144.          WinSendMsg(WinWindowFromID(hwnd, IDC_DIR_ENTRY5), EM_SETTEXTLIMIT, MPFROM2SHORT(256, 0), 0);
  2145.          WinSendMsg(WinWindowFromID(hwnd, IDC_DIR_ENTRY6), EM_SETTEXTLIMIT, MPFROM2SHORT(256, 0), 0);
  2146.          WinSendMsg(WinWindowFromID(hwnd, IDC_DIR_ENTRY7), EM_SETTEXTLIMIT, MPFROM2SHORT(256, 0), 0);
  2147.          WinSetDlgItemText(hwnd, IDC_DIR_ENTRY1, fd.szKabeFolder);
  2148.          WinSetDlgItemText(hwnd, IDC_DIR_ENTRY2, fd.szMqueFolder);
  2149.          WinSetDlgItemText(hwnd, IDC_DIR_ENTRY3, fd.szMyFrom);
  2150.          WinSetDlgItemText(hwnd, IDC_DIR_ENTRY4, fd.szPrefix);
  2151.          WinSetDlgItemText(hwnd, IDC_DIR_ENTRY5, fd.szSigFile);
  2152.          WinSetDlgItemText(hwnd, IDC_DIR_ENTRY6, fd.szEditor);
  2153.          WinSetDlgItemText(hwnd, IDC_DIR_ENTRY7, fd.szLinkApp);
  2154.       }
  2155.       break;
  2156.    case WM_COMMAND:
  2157.       switch (SHORT1FROMMP(mp1)) {
  2158.       case DID_OK:
  2159.           ulLen1 = WinQueryDlgItemText(hwnd, IDC_DIR_ENTRY1, 256, wk.szKabeFolder);
  2160.           ulLen2 = WinQueryDlgItemText(hwnd, IDC_DIR_ENTRY2, 256, wk.szMqueFolder);
  2161.           ulLen3 = WinQueryDlgItemText(hwnd, IDC_DIR_ENTRY3, 128, wk.szMyFrom);
  2162.           ulLen4 = WinQueryDlgItemText(hwnd, IDC_DIR_ENTRY4, 64 , wk.szPrefix);
  2163.           ulLen5 = WinQueryDlgItemText(hwnd, IDC_DIR_ENTRY5, 256, wk.szSigFile);
  2164.           ulLen6 = WinQueryDlgItemText(hwnd, IDC_DIR_ENTRY6, 256, wk.szEditor);
  2165.           ulLen7 = WinQueryDlgItemText(hwnd, IDC_DIR_ENTRY7, 256, wk.szLinkApp);
  2166.           if (ulLen1 == 0 || ulLen2 == 0 || ulLen3 == 0 ||
  2167.               ulLen4 == 0 || ulLen5 == 0 || ulLen6 == 0) {
  2168.              AppMsg("Invalid Data!!");
  2169.              return 0;
  2170.           }
  2171.           if (wk.szKabeFolder[ulLen1 - 1] != '\\')
  2172.              strcat(wk.szKabeFolder, "\\");
  2173.           if (wk.szMqueFolder[ulLen2 - 1] != '\\')
  2174.              strcat(wk.szMqueFolder, "\\");
  2175.           memcpy(&fd, &wk, sizeof(wk));
  2176.           break;
  2177.        default:
  2178.           break;
  2179.       }
  2180.       break;
  2181.    default: 
  2182.       break;
  2183.    }
  2184.    return WinDefDlgProc(hwnd, msg, mp1, mp2);
  2185. }
  2186.  
  2187. /**************************************/
  2188. /* Folderâ_âCâAâìâOé╠âRü[âïâoâbâNè╓Éö */
  2189. /**************************************/
  2190. MRESULT EXPENTRY FolderDlg(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2)
  2191. {
  2192.    UINT          uIdx;
  2193.  
  2194.    switch (msg) {
  2195.    case WM_INITDLG:
  2196.       Folder2Listbox(WinWindowFromID(hwnd, IDC_FOL_LIST));
  2197.       break;
  2198.    case WM_COMMAND:
  2199.       switch (SHORT1FROMMP(mp1)) {
  2200.       case DID_OK:
  2201.           uIdx = (UINT)WinSendMsg(WinWindowFromID(hwnd, IDC_FOL_LIST), LM_QUERYSELECTION, 0, 0);
  2202.           if (uIdx == LIT_NONE) {
  2203.              return 0;
  2204.           }
  2205.           WinSendMsg(WinWindowFromID(hwnd, IDC_FOL_LIST),
  2206.                      LM_QUERYITEMTEXT, MPFROM2SHORT(uIdx, 256), (MPARAM)szCurFolder);
  2207.           break;
  2208.        default:
  2209.           break;
  2210.       }
  2211.       break;
  2212.    case WM_BUTTON1DBLCLK:
  2213.       WinSendMsg(hwnd, WM_COMMAND, MPFROM2SHORT(DID_OK, 0), 0);
  2214.       break;
  2215.    default: 
  2216.       break;
  2217.    }
  2218.    return WinDefDlgProc(hwnd, msg, mp1, mp2);
  2219. }
  2220.  
  2221. /**************************************/
  2222. /* Extractâ_âCâAâìâOé╠âRü[âïâoâbâNè╓Éö*/
  2223. /**************************************/
  2224. MRESULT EXPENTRY ExtractDlg(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2)
  2225. {
  2226.    UINT        uIdx, uIdx2, uMax;
  2227.    ULONG       ulLen;
  2228.    CHAR        buf[256], szJyoken[256], szFolder[256];
  2229.    PCHAR       pszFormat = "%-30s %s";
  2230.    HINI           hini;
  2231.  
  2232.    switch (msg) {
  2233.    case WM_INITDLG:
  2234.       Folder2Listbox(WinWindowFromID(hwnd, IDC_EXT_LIST2));
  2235.       ued = LoadED(ed);
  2236.       for (uIdx = 0; uIdx < ued; uIdx++){
  2237.          sprintf(buf, pszFormat, ed[uIdx].szJyoken, ed[uIdx].szFolder);
  2238.          WinSendMsg(WinWindowFromID(hwnd, IDC_EXT_LIST1),
  2239.                      LM_INSERTITEM, MPFROM2SHORT(LIT_END, 0), (MPARAM)buf);
  2240.       }
  2241.       break;
  2242.    case WM_CONTROL:
  2243.       switch (SHORT1FROMMP(mp1)) {
  2244.       case IDC_EXT_LIST1:
  2245.          switch (SHORT2FROMMP(mp1)) {
  2246.          case LN_SELECT:
  2247.             uIdx2 = (UINT)WinSendMsg(WinWindowFromID(hwnd, IDC_EXT_LIST1),
  2248.                                        LM_QUERYSELECTION, 0, 0);
  2249.             uMax  = (UINT)WinSendMsg(WinWindowFromID(hwnd, IDC_EXT_LIST2),
  2250.                                        LM_QUERYITEMCOUNT, 0, 0);
  2251.             for (uIdx = 0; uIdx < uMax; uIdx++){ 
  2252.                WinSendMsg(WinWindowFromID(hwnd, IDC_EXT_LIST2),
  2253.                             LM_QUERYITEMTEXT, MPFROM2SHORT(uIdx, 256), (MPARAM)buf);
  2254.                if (stricmp(ed[uIdx2].szFolder, buf) == 0){
  2255.                   WinSendMsg(WinWindowFromID(hwnd, IDC_EXT_LIST2),
  2256.                                LM_SELECTITEM, MPFROM2SHORT(uIdx, 0), MPFROM2SHORT(TRUE, 0));
  2257.                   break;
  2258.                }
  2259.             }
  2260.             WinSetDlgItemText(hwnd, IDC_EXT_ENTRY, ed[uIdx2].szJyoken);
  2261.             return 0;
  2262.          default:
  2263.            break;
  2264.          } /* endswitch */
  2265.          break;
  2266.       default:
  2267.         break;
  2268.       } /* endswitch */
  2269.       break;
  2270.    case WM_COMMAND:
  2271.       switch (SHORT1FROMMP(mp1)) {
  2272.       case IDC_EXT_BUTTON1: /* add */
  2273.           if (ued == EDMAX){
  2274.              AppMsg("Over Flow");
  2275.              return 0;
  2276.           }
  2277.           ulLen = WinQueryDlgItemText(hwnd, IDC_EXT_ENTRY, 256, szJyoken);
  2278.           uIdx  = (UINT)WinSendMsg(WinWindowFromID(hwnd, IDC_EXT_LIST2),
  2279.                                      LM_QUERYSELECTION, 0, 0);
  2280.           if (ulLen == 0 || uIdx == LIT_NONE){
  2281.              AppMsg("Invalid Data");
  2282.              return 0;
  2283.           }
  2284.           WinSendMsg(WinWindowFromID(hwnd, IDC_EXT_LIST2),
  2285.                      LM_QUERYITEMTEXT, MPFROM2SHORT(uIdx, 256), (MPARAM)szFolder);
  2286.           sprintf(buf, pszFormat, szJyoken, szFolder);
  2287.           WinSendMsg(WinWindowFromID(hwnd, IDC_EXT_LIST1),
  2288.                        LM_INSERTITEM, MPFROM2SHORT(LIT_END, 0), (MPARAM)buf);
  2289.           WinSetDlgItemText(hwnd, IDC_EXT_ENTRY, "");
  2290.           strcpy(ed[ued].szJyoken, szJyoken);
  2291.           strcpy(ed[ued++].szFolder, szFolder);
  2292.           return 0;
  2293.       case IDC_EXT_BUTTON2: /* upd */
  2294.           uIdx2 = (UINT)WinSendMsg(WinWindowFromID(hwnd, IDC_EXT_LIST1),
  2295.                                      LM_QUERYSELECTION, 0, 0);
  2296.           if (uIdx2 == LIT_NONE){
  2297.              AppMsg("No Selected");
  2298.              return 0;
  2299.           }
  2300.           ulLen = WinQueryDlgItemText(hwnd, IDC_EXT_ENTRY, 256, szJyoken);
  2301.           uIdx  = (UINT)WinSendMsg(WinWindowFromID(hwnd, IDC_EXT_LIST2),
  2302.                                      LM_QUERYSELECTION, 0, 0);
  2303.           if (ulLen == 0 || uIdx == LIT_NONE){
  2304.              AppMsg("Invalid Data");
  2305.              return 0;
  2306.           }
  2307.           WinSendMsg(WinWindowFromID(hwnd, IDC_EXT_LIST2),
  2308.                      LM_QUERYITEMTEXT, MPFROM2SHORT(uIdx, 256), (MPARAM)szFolder);
  2309.           sprintf(buf, pszFormat, szJyoken, szFolder);
  2310.           WinSendMsg(WinWindowFromID(hwnd, IDC_EXT_LIST1),
  2311.                        LM_SETITEMTEXT, MPFROM2SHORT(uIdx2, 0), (MPARAM)buf);
  2312.           WinSetDlgItemText(hwnd, IDC_EXT_ENTRY, "");
  2313.           strcpy(ed[uIdx2].szJyoken, szJyoken);
  2314.           strcpy(ed[uIdx2].szFolder, szFolder);
  2315.           return 0;
  2316.       case IDC_EXT_BUTTON3: /* del */
  2317.           uIdx2 = (UINT)WinSendMsg(WinWindowFromID(hwnd, IDC_EXT_LIST1),
  2318.                                      LM_QUERYSELECTION, 0, 0);
  2319.           if (uIdx2 == LIT_NONE){
  2320.              AppMsg("No Selected");
  2321.              return 0;
  2322.           }
  2323.           WinSendMsg(WinWindowFromID(hwnd, IDC_EXT_LIST1),
  2324.                        LM_DELETEITEM, MPFROM2SHORT(uIdx2, 0), 0);
  2325.           WinSetDlgItemText(hwnd, IDC_EXT_ENTRY, "");
  2326.           for (uIdx = uIdx2 + 1; uIdx < ued; uIdx++){
  2327.              strcpy(ed[uIdx - 1].szJyoken, ed[uIdx].szJyoken);
  2328.              strcpy(ed[uIdx - 1].szFolder, ed[uIdx].szFolder);
  2329.           }
  2330.           ued--;
  2331.           return 0;
  2332.       case DID_OK:
  2333.           hini = PrfOpenProfile(hab, szIniName);
  2334.           if (hini != NULLHANDLE) {
  2335.                PrfWriteProfileData(hini, PRFAPP, PRFKEY_EXTCNT, (PVOID)&ued, sizeof(UINT));
  2336.                PrfWriteProfileData(hini, PRFAPP, PRFKEY_EXTDATA, (PVOID)ed, sizeof(EXTDATA) * ued);
  2337.              PrfCloseProfile(hini);
  2338.           }
  2339.           else {
  2340.              AppMsg("Save Error");
  2341.           }
  2342.           break;
  2343.        default:
  2344.           break;
  2345.       }
  2346.       break;
  2347.    default: 
  2348.       break;
  2349.    }
  2350.    return WinDefDlgProc(hwnd, msg, mp1, mp2);
  2351. }
  2352.  
  2353. /**************************************/
  2354. /* Folderé╠âèâXâgé≡Listboxé╓          */
  2355. /**************************************/
  2356. VOID Folder2Listbox(HWND hList)
  2357. {
  2358.    HDIR          FindHandle;
  2359.    FILEFINDBUF3  FindBuffer;
  2360.    ULONG         FindCount;
  2361.    CHAR             szSearch[512];
  2362.    APIRET        rc;           /* û▀éΦâRü[âh */
  2363.  
  2364.    FindHandle = 0x0001;
  2365.    FindCount = 1;
  2366.  
  2367.    sprintf(szSearch, "%s*.*", fd.szKabeFolder);
  2368.    rc = DosFindFirst(szSearch, &FindHandle, FILE_DIRECTORY, (PVOID) &FindBuffer, sizeof(FindBuffer),
  2369.                      &FindCount, FIL_STANDARD);
  2370.    while(rc == 0){
  2371.       if ((FindBuffer.attrFile & FILE_DIRECTORY)
  2372.             && !(strcmp(FindBuffer.achName, ".") == 0 || strcmp(FindBuffer.achName, "..") == 0)){
  2373.          WinSendMsg(hList, LM_INSERTITEM, MPFROM2SHORT(LIT_END, 0), (MPARAM)FindBuffer.achName);
  2374.       }
  2375.       rc = DosFindNext(FindHandle, (PVOID)&FindBuffer, sizeof(FindBuffer), &FindCount);
  2376.    }
  2377.    DosFindClose(FindHandle);
  2378. }
  2379.  
  2380. /**************************************/
  2381. /* ÉUéΦò¬é»âfü[â^é╠âìü[âh             */
  2382. /**************************************/
  2383. UINT LoadED(EXTDATA *ped)
  2384. {
  2385.    HINI  hini;
  2386.    UINT  uedcnt = 0;
  2387.    ULONG ulLen;
  2388.  
  2389.    /* Profileé╠ô╟é▌é╛é╡ */
  2390.    hini = PrfOpenProfile(hab, szIniName);
  2391.    if (hini != NULLHANDLE) {
  2392.       ulLen = (ULONG)sizeof(UINT);                    /* î┬Éöé╠ô╟é▌é╛é╡ */
  2393.       if (PrfQueryProfileData(hini, PRFAPP, PRFKEY_EXTCNT, (PVOID)&uedcnt, &ulLen)) {
  2394.          ulLen = (ULONG)sizeof(EXTDATA) * uedcnt;
  2395.          if (!PrfQueryProfileData(hini, PRFAPP, PRFKEY_EXTDATA, (PVOID)ped, &ulLen)) 
  2396.             uedcnt = 0;
  2397.       }
  2398.       else {
  2399.          uedcnt = 0;
  2400.       }
  2401.       PrfCloseProfile(hini);
  2402.    }
  2403.    return uedcnt;
  2404. }
  2405.  
  2406. /**************************************/
  2407. /* Moveâ_âCâAâìâOé╠âRü[âïâoâbâNè╓Éö */
  2408. /**************************************/
  2409. MRESULT EXPENTRY MoveDlg(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2)
  2410. {
  2411.    UINT          uIdx, uOldIdx, uFcnt;
  2412.    CHAR          buf[256], szNewFolder[256];
  2413.  
  2414.    switch (msg) {
  2415.    case WM_INITDLG:
  2416.       Folder2Listbox(WinWindowFromID(hwnd, IDC_MOV_LIST));
  2417.       break;
  2418.    case WM_COMMAND:
  2419.       switch (SHORT1FROMMP(mp1)) {
  2420.       case DID_OK:
  2421.           uIdx = (UINT)WinSendMsg(WinWindowFromID(hwnd, IDC_MOV_LIST), LM_QUERYSELECTION, 0, 0);
  2422.           if (uIdx == LIT_NONE) 
  2423.              return 0;
  2424.           WinSendMsg(WinWindowFromID(hwnd, IDC_MOV_LIST),
  2425.                      LM_QUERYITEMTEXT, MPFROM2SHORT(uIdx, 256), (MPARAM)buf);
  2426.           if (stricmp(szCurFolder, buf) == 0){
  2427.              AppMsg("Same Folder! Can't Move Article")
  2428.              return 0;
  2429.           }
  2430.           sprintf(szNewFolder, "%s%s\\", fd.szKabeFolder, buf);
  2431.           flgSelect = FALSE;
  2432.           while (TRUE) {
  2433.              uOldIdx  = uMoveArticleIdx;
  2434.              if (MoveArticle(szMoveArticleFile, szNewFolder))
  2435.                 WinSendMsg(hListWnd, LM_DELETEITEM, MPFROM2SHORT(uMoveArticleIdx, 0), 0);
  2436.              else
  2437.                 AppMsg("Can't Move Article");
  2438.              uMoveArticleIdx = GetSelectIndex(0, &uFcnt);
  2439.              if (uMoveArticleIdx == LIT_NONE)
  2440.                 break;
  2441.              sprintf(szMoveArticleFile, "%s%d", szBaseFolder, uFcnt);
  2442.           }
  2443.           flgSelect = TRUE;
  2444.           BaseTitle();
  2445.           if (!SetSelectIndex(uOldIdx)) 
  2446.              WinSetWindowText(hEntryWnd, "");
  2447.           break;
  2448.        default:
  2449.           break;
  2450.       }
  2451.       break;
  2452.    case WM_BUTTON1DBLCLK:
  2453.       WinSendMsg(hwnd, WM_COMMAND, MPFROM2SHORT(DID_OK, 0), 0);
  2454.       break;
  2455.    default: 
  2456.       break;
  2457.    }
  2458.    return WinDefDlgProc(hwnd, msg, mp1, mp2);
  2459. }
  2460.  
  2461. /**************************************/
  2462. /* Newâ_âCâAâìâOé╠âRü[âïâoâbâNè╓Éö    */
  2463. /**************************************/
  2464. MRESULT EXPENTRY NewfolderDlg(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2)
  2465. {
  2466.    APIRET        rc;
  2467.    PEAOP2         EABuf;
  2468.    ULONG         ulLen;
  2469.    CHAR          buf[256], szNewFolder[256];
  2470.  
  2471.    switch (msg) {
  2472.    case WM_COMMAND:
  2473.       switch (SHORT1FROMMP(mp1)) {
  2474.       case DID_OK:
  2475.           ulLen = WinQueryDlgItemText(hwnd, IDC_NEW_ENTRY, 256, buf);
  2476.           if (ulLen == 0)
  2477.              return 0;
  2478.           sprintf(szNewFolder, "%s%s", fd.szKabeFolder, buf);
  2479.           EABuf = 0;
  2480.           if (DosCreateDir(szNewFolder, EABuf) != 0)
  2481.              AppMsg("Can't Create New Folder");
  2482.           break;
  2483.        default:
  2484.           break;
  2485.       }
  2486.       break;
  2487.    default: 
  2488.       break;
  2489.    }
  2490.    return WinDefDlgProc(hwnd, msg, mp1, mp2);
  2491.  
  2492.  
  2493. }
  2494.  
  2495. /**************************************/
  2496. /* Delâ_âCâAâìâOé╠âRü[âïâoâbâNè╓Éö    */
  2497. /**************************************/
  2498. MRESULT EXPENTRY DelfolderDlg(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2)
  2499. {
  2500.    APIRET         rc;
  2501.    HDIR          FindHandle;
  2502.    FILEFINDBUF3  FindBuffer;
  2503.    ULONG         FindCount;
  2504.    UINT          uIdx;
  2505.    BOOL             flgDelFile;
  2506.    CHAR          buf[256], buf2[256], szDelFolder[256];
  2507.  
  2508.    switch (msg) {
  2509.    case WM_INITDLG:
  2510.       Folder2Listbox(WinWindowFromID(hwnd, IDC_DEL_LIST));
  2511.       break;
  2512.    case WM_COMMAND:
  2513.       switch (SHORT1FROMMP(mp1)) {
  2514.       case DID_OK:
  2515.           uIdx = (UINT)WinSendMsg(WinWindowFromID(hwnd, IDC_DEL_LIST), LM_QUERYSELECTION, 0, 0);
  2516.           if (uIdx == LIT_NONE) 
  2517.              return 0;
  2518.           WinSendMsg(WinWindowFromID(hwnd, IDC_DEL_LIST),
  2519.                      LM_QUERYITEMTEXT, MPFROM2SHORT(uIdx, 256), (MPARAM)buf);
  2520.           if (stricmp(szCurFolder, buf) == 0){
  2521.              AppMsg("Can't Delete Current Folder")
  2522.              return 0;
  2523.           }
  2524.           sprintf(buf2, "<%s> Delete OK?", buf);
  2525.           if (WinMessageBox(HWND_DESKTOP, HWND_DESKTOP, buf2, APP_TITLE, 0, 
  2526.                             MB_OKCANCEL | MB_ICONQUESTION) == MBID_OK){
  2527.              sprintf(szDelFolder, "%s%s", fd.szKabeFolder, buf);
  2528.              sprintf(buf2, "%s\\*.*", szDelFolder);
  2529.              flgDelFile = TRUE;
  2530.              FindHandle = 0x0001;
  2531.              FindCount = 1;
  2532.              rc = DosFindFirst(buf2, &FindHandle, FILE_DIRECTORY,
  2533.                                (PVOID)&FindBuffer, sizeof(FindBuffer),
  2534.                                &FindCount, FIL_STANDARD);
  2535.              if (rc != 0){
  2536.                 sprintf(buf2, "%d", rc); AppMsg(buf2);
  2537.              }
  2538.              while(rc == 0){
  2539.                 if (!(strcmp(FindBuffer.achName, ".") == 0 || strcmp(FindBuffer.achName, "..") == 0)){
  2540.                    if (FindBuffer.attrFile & FILE_DIRECTORY){
  2541.                       AppMsg("Exist Sub Directory. Can't Delete This Folder");
  2542.                       flgDelFile = FALSE;
  2543.                       break;
  2544.                    }
  2545.                    sprintf(buf2, "%s\\%s", szDelFolder, FindBuffer.achName);
  2546.                    if (DosDelete(buf2) != 0){
  2547.                       AppMsg("Can't Delete File. Folder Delete is Faild");
  2548.                       flgDelFile = FALSE;
  2549.                       break;
  2550.                    }
  2551.                 }
  2552.                 rc = DosFindNext(FindHandle, (PVOID)&FindBuffer,
  2553.                                  sizeof(FindBuffer), &FindCount);
  2554.              }
  2555.              DosFindClose(FindHandle);
  2556.              if (flgDelFile){
  2557.                 if (DosDeleteDir(szDelFolder) == 0){
  2558.                    AppMsg("Delete is Complete");
  2559.                 }
  2560.                 else {
  2561.                    AppMsg("Can't Delete This Folder");
  2562.                 }
  2563.              }
  2564.           }
  2565.           break;
  2566.        default:
  2567.           break;
  2568.       }
  2569.       break;
  2570.    case WM_BUTTON1DBLCLK:
  2571.       WinSendMsg(hwnd, WM_COMMAND, MPFROM2SHORT(DID_OK, 0), 0);
  2572.       break;
  2573.    default: 
  2574.       break;
  2575.    }
  2576.    return WinDefDlgProc(hwnd, msg, mp1, mp2);
  2577. }
  2578.  
  2579. /**************************************/
  2580. /* decodeâ_âCâAâìâOé╠âRü[âïâoâbâNè╓Éö */
  2581. /**************************************/
  2582. MRESULT EXPENTRY DecodeDlg(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2)
  2583. {
  2584.    ULONG     ulLen;
  2585.  
  2586.    switch (msg) {
  2587.    case WM_INITDLG:
  2588.       if (flgProfDir) {
  2589.          WinSendMsg(WinWindowFromID(hwnd, IDC_DEC_ENTRY1), EM_SETTEXTLIMIT, MPFROM2SHORT(256, 0), 0);
  2590.          WinSendMsg(WinWindowFromID(hwnd, IDC_DEC_ENTRY2), EM_SETTEXTLIMIT, MPFROM2SHORT(256, 0), 0);
  2591.          WinSendMsg(WinWindowFromID(hwnd, IDC_DEC_ENTRY3), EM_SETTEXTLIMIT, MPFROM2SHORT(256, 0), 0);
  2592.          WinSendMsg(WinWindowFromID(hwnd, IDC_DEC_ENTRY4), EM_SETTEXTLIMIT, MPFROM2SHORT(256, 0), 0);
  2593.          WinSendMsg(WinWindowFromID(hwnd, IDC_DEC_ENTRY5), EM_SETTEXTLIMIT, MPFROM2SHORT(256, 0), 0);
  2594.          WinSetDlgItemText(hwnd, IDC_DEC_ENTRY1, dec.szISH);
  2595.          WinSetDlgItemText(hwnd, IDC_DEC_ENTRY2, dec.szUUDECODE);
  2596.          WinSetDlgItemText(hwnd, IDC_DEC_ENTRY3, dec.szMIME);
  2597.          WinSetDlgItemText(hwnd, IDC_DEC_ENTRY4, dec.szDecodeDir);
  2598.          WinSetDlgItemText(hwnd, IDC_DEC_ENTRY5, dec.szBINHEX);
  2599.       }
  2600.       break;
  2601.    case WM_COMMAND:
  2602.       switch (SHORT1FROMMP(mp1)) {
  2603.       case DID_OK:
  2604.           WinQueryDlgItemText(hwnd, IDC_DEC_ENTRY1, 256, dec.szISH);
  2605.           WinQueryDlgItemText(hwnd, IDC_DEC_ENTRY2, 256, dec.szUUDECODE);
  2606.           WinQueryDlgItemText(hwnd, IDC_DEC_ENTRY3, 256, dec.szMIME);
  2607.           WinQueryDlgItemText(hwnd, IDC_DEC_ENTRY5, 256, dec.szBINHEX);
  2608.           ulLen = WinQueryDlgItemText(hwnd, IDC_DEC_ENTRY4, 256, dec.szDecodeDir);
  2609.           if (ulLen > 0){ 
  2610.              if (dec.szDecodeDir[ulLen - 1] != '\\')
  2611.                 strcat(dec.szDecodeDir, "\\");
  2612.           }
  2613.           break;
  2614.        default:
  2615.           break;
  2616.       }
  2617.       break;
  2618.    default: 
  2619.       break;
  2620.    }
  2621.    return WinDefDlgProc(hwnd, msg, mp1, mp2);
  2622. }
  2623.  
  2624. /**************************************/
  2625. /* Extractâ_âCâAâìâOé╠âRü[âïâoâbâNè╓Éö*/
  2626. /**************************************/
  2627. MRESULT EXPENTRY Extract2Dlg(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2)
  2628. {
  2629.    UINT        uIdx;
  2630.    ULONG       ulLen;
  2631.  
  2632.    switch (msg) {
  2633.    case WM_INITDLG:
  2634.       Folder2Listbox(WinWindowFromID(hwnd, IDC_EX2_LIST));
  2635.       break;
  2636.    case WM_COMMAND:
  2637.       switch (SHORT1FROMMP(mp1)) {
  2638.       case DID_OK:
  2639.           ulLen = WinQueryDlgItemText(hwnd, IDC_EX2_ENTRY, 256, ed[0].szJyoken);
  2640.           uIdx  = (UINT)WinSendMsg(WinWindowFromID(hwnd, IDC_EX2_LIST),
  2641.                                      LM_QUERYSELECTION, 0, 0);
  2642.           if (ulLen == 0 || uIdx == LIT_NONE){
  2643.              AppMsg("Invalid Data");
  2644.              return 0;
  2645.           }
  2646.           WinSendMsg(WinWindowFromID(hwnd, IDC_EX2_LIST),
  2647.                      LM_QUERYITEMTEXT, MPFROM2SHORT(uIdx, 256), (MPARAM)ed[0].szFolder);
  2648.           ued = 1;
  2649.           break;
  2650.        default:
  2651.           break;
  2652.       }
  2653.       break;
  2654.    default: 
  2655.       break;
  2656.    }
  2657.    return WinDefDlgProc(hwnd, msg, mp1, mp2);
  2658. }
  2659.  
  2660.  
  2661.