home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 2 BBS / 02-BBS.zip / fsrc1241.zip / savemsg.c < prev    next >
Text File  |  1999-02-14  |  23KB  |  658 lines

  1. /*---------------------------------------------------------------------------+
  2.  | Titel: SAVEMSG.C                                                          |
  3.  +-----------------------------------------+---------------------------------+
  4.  | Erstellt von: Michael Hohner            | Am: 04.10.93                    |
  5.  +-----------------------------------------+---------------------------------+
  6.  | System: OS/2 2.x                                                          |
  7.  +---------------------------------------------------------------------------+
  8.  | Beschreibung:                                                             |
  9.  |                                                                           |
  10.  |   Message-Speicher-Funktionen von FleetStreet                             |
  11.  |                                                                           |
  12.  |                                                                           |
  13.  +---------------------------------------------------------------------------+
  14.  | Bemerkungen:                                                              |
  15.  +---------------------------------------------------------------------------*/
  16.  
  17. /*----------------------------- Header-Dateien ------------------------------*/
  18. #pragma strings(readonly)
  19.  
  20. #define INCL_PM
  21. #include <os2.h>
  22. #include <string.h>
  23. #include <stdlib.h>
  24. #include "main.h"
  25. #include "resids.h"
  26. #include "messages.h"
  27. #include "structs.h"
  28. #include "msgheader.h"
  29. #include "areaman\areaman.h"
  30. #include "savemsg.h"
  31. #include "handlemsg\handlemsg.h"
  32. #include "handlemsg\kludgeapi.h"
  33. #include "utility.h"
  34. #include "dialogids.h"
  35. #include "util\addrcnv.h"
  36.  
  37.  
  38. /*--------------------------------- Defines ---------------------------------*/
  39.  
  40. #define MIN_MSGLEN   200
  41. #define EXPORT_BUFFER 64001
  42.  
  43. /*---------------------------- Globale Variablen ----------------------------*/
  44.  
  45. extern char CurrentAddress[LEN_5DADDRESS+1];
  46. extern char CurrentArea[LEN_AREATAG+1];
  47. extern AREALIST arealiste;
  48. extern char *pchXPostList;
  49. extern BOOL MailEntered[3];
  50. extern int QuotedMsgNum;
  51. extern HAB anchor;
  52. extern HMODULE hmodLang;
  53. extern DRIVEREMAP driveremap;
  54.  
  55. /*--------------------------- Funktionsprototypen ---------------------------*/
  56.  
  57. static void CopyKludges(PFTNMESSAGE pDest, PFTNMESSAGE pSrc);
  58. static int CrosspostMessage(HWND hwndClient, FTNMESSAGE *OldMessage, MSGHEADER *OldHeader,
  59.                             char *pchAreaTag, char *pchAreaList);
  60. static int CarbonCopyMessage(HWND hwndClient, FTNMESSAGE *OldMessage, MSGHEADER *OldHeader,
  61.                              char *pchAreaTag, PCCLIST pCCList, PCCENTRY pEntry, BOOL bUseTemplate);
  62. static int AddNewMessage(HWND hwndClient, FTNMESSAGE *OldMessage, MSGHEADER *OldHeader, char *pchAreaTag);
  63.  
  64. /*------------------------------ GetMsgContents -----------------------------*/
  65. /* Holt den Message-Text und die Adressen aus den jeweiligen Feldern         */
  66. /* Rueckgabewerte: 0 OK                                                      */
  67. /*                 1 Fehlende Daten                                          */
  68. /*                 2 Fehlerhafte Adressen                                    */
  69. /*---------------------------------------------------------------------------*/
  70.  
  71. int GetMsgContents(HWND hwndClient, FTNMESSAGE *MsgInfo, MSGHEADER *MsgHeader,
  72.                    BOOL isEcho)
  73. {
  74.    char chBuffer[LEN_5DADDRESS+1];
  75.    ULONG ulTextLen=0;
  76.    HWND hwndMLE = WinWindowFromID(hwndClient, IDML_MAINEDIT);
  77.  
  78.    /* Messagedaten holen */
  79.    WinQueryDlgItemText(hwndClient, IDE_FROMNAME, LEN_USERNAME+1, MsgHeader->pchFromName);
  80.    WinQueryDlgItemText(hwndClient, IDE_TONAME, LEN_USERNAME+1, MsgHeader->pchToName);
  81.    WinQueryDlgItemText(hwndClient, IDE_SUBJTEXT, LEN_SUBJECT+1, MsgHeader->pchSubject);
  82.  
  83.    /* Adressen holen und umwandeln */
  84.    /* Absender-Adresse ermitteln */
  85.    WinQueryDlgItemText(hwndClient, IDE_FROMADDRESS, LEN_5DADDRESS+1, chBuffer);
  86.  
  87.    if (!chBuffer[0])
  88.       return 1;
  89.  
  90.    if (StringToNetAddr(chBuffer, &MsgHeader->FromAddress, CurrentAddress)==NULL)
  91.       return 2;
  92.  
  93.    /* Empfaenger-Adresse ermitteln */
  94.    if (isEcho)
  95.       memset(&MsgHeader->ToAddress, 0, sizeof(FTNADDRESS));
  96.    else
  97.    {
  98.       WinQueryDlgItemText(hwndClient, IDE_TOADDRESS, LEN_5DADDRESS+1, chBuffer);
  99.  
  100.       if (StringToNetAddr(chBuffer, &MsgHeader->ToAddress, CurrentAddress)==NULL)
  101.          return 2;
  102.    }
  103.  
  104.    /* MLE fuer Export vorbereiten */
  105.    SendMsg(hwndMLE, MLM_FORMAT, MPFROMSHORT(MLFIE_NOTRANS), NULL);
  106.    ulTextLen=(ULONG)SendMsg(hwndMLE, MLM_QUERYTEXTLENGTH, NULL, NULL);
  107.    ulTextLen=(ULONG)SendMsg(hwndMLE, MLM_QUERYFORMATTEXTLENGTH, NULL, MPFROMLONG(ulTextLen));
  108.  
  109.    if (ulTextLen) /* Text da, eportieren */
  110.    {
  111.       char *pchDest=NULL;
  112.       ULONG ulExport;
  113.       ULONG ipt=0;
  114.       ULONG ulTextExported=0;
  115.  
  116.       MsgInfo->pchMessageText=calloc(1, ulTextLen+1+MIN_MSGLEN);
  117.       DosAllocMem((PPVOID)&pchDest, EXPORT_BUFFER, PAG_COMMIT | OBJ_TILE | PAG_READ | PAG_WRITE);
  118.  
  119.       do
  120.       {
  121.          ulExport=EXPORT_BUFFER-1;
  122.          memset(pchDest, 0, EXPORT_BUFFER);
  123.  
  124.          SendMsg(hwndMLE, MLM_SETIMPORTEXPORT, MPFROMP(pchDest), MPFROMLONG(ulExport));
  125.          ulTextExported=(ULONG)SendMsg(hwndMLE, MLM_EXPORT,
  126.                                        MPFROMP(&ipt), MPFROMLONG(&ulExport));
  127.          if (ulTextExported)
  128.             strcat(MsgInfo->pchMessageText, pchDest);
  129.       } while (ulTextExported);
  130.       DosFreeMem(pchDest);
  131.    }
  132.    else
  133.    {
  134.       MsgInfo->pchMessageText=malloc(MIN_MSGLEN);
  135.       MsgInfo->pchMessageText[0]=0;
  136.    }
  137.  
  138.    return 0;
  139. }
  140.  
  141.  
  142.  
  143. /*----------------------------- AddNewMessage   -----------------------------*/
  144. /* Holt die Messagedaten aus den Feldern, prueft die Daten, holt den         */
  145. /* MessageText, speichert in der Messagebase.                                */
  146. /* Rueckgabewerte: 0  alles OK                                               */
  147. /*                 1  Fehlende Headerdaten                                   */
  148. /*                 2  Falsche Headerdaten                                    */
  149. /*                 3  Message-Text zu lang                                   */
  150. /*                 4  Fehler beim Speichern                                  */
  151. /*---------------------------------------------------------------------------*/
  152.  
  153. static int AddNewMessage(HWND hwndClient, FTNMESSAGE *OldMessage, MSGHEADER *OldHeader, char *pchAreaTag)
  154. {
  155.    FTNMESSAGE Message={NULL, NULL, NULL, NULL};
  156.    extern MISCOPTIONS miscoptions;
  157.    extern USERDATAOPT userdaten;
  158.    extern GENERALOPT generaloptions;
  159.    extern DRIVEREMAP driveremap;
  160.    extern TEMPLATELIST templatelist;
  161.    int rc;
  162.    PAREADEFLIST pAreaDef;
  163.  
  164.    /* Kludges kopieren */
  165.    CopyKludges(&Message, OldMessage);
  166.  
  167.    pAreaDef = AM_FindArea(&arealiste, pchAreaTag);
  168.  
  169.    if (rc=GetMsgContents(hwndClient, &Message, OldHeader,
  170.                          pAreaDef->areadata.areatype != AREATYPE_NET))
  171.       return rc;
  172.  
  173.    /* Ueberpruefen, ob alle Headerdaten vorhanden */
  174.    if (!OldHeader->pchToName[0] ||
  175.        !OldHeader->pchFromName[0])
  176.       return 1;
  177.  
  178.    if (stricmp(pchAreaTag, CurrentArea))
  179.       MSG_OpenArea(&arealiste, pchAreaTag, miscoptions.lastreadoffset, &driveremap);
  180.  
  181.    /* Message speichern */
  182.    switch(MSG_AddMessage(&Message, OldHeader, &arealiste, pchAreaTag,
  183.                          &userdaten, &generaloptions, &driveremap,
  184.                          generaloptions.lMaxMsgLen * 1024, &templatelist, 0, SendAddMessage))
  185.    {
  186.       case OK:
  187.          pAreaDef->mailentered=TRUE;
  188.          if (stricmp(pchAreaTag, CurrentArea))
  189.             MSG_CloseArea(&arealiste, pchAreaTag, TRUE, miscoptions.lastreadoffset, &driveremap);
  190.          else
  191.             MSG_LinkMessages(&arealiste, CurrentArea, OldHeader->ulMsgID, OldHeader->ulReplyTo, &driveremap);
  192.          MSG_ClearMessage(NULL, &Message);
  193.          MailEntered[pAreaDef->areadata.areatype]=TRUE;
  194.          return 0;
  195.  
  196.       default:
  197.          MSG_ClearMessage(NULL, &Message);
  198.          if (stricmp(pchAreaTag, CurrentArea))
  199.             MSG_CloseArea(&arealiste, pchAreaTag, TRUE, miscoptions.lastreadoffset, &driveremap);
  200.          return 4;
  201.    }
  202. }
  203.  
  204. /*----------------------------- ChangeMessage   -----------------------------*/
  205. /* Holt die Messagedaten aus den Feldern, prueft die Daten, holt den         */
  206. /* MessageText, speichert in der Messagebase.                                */
  207. /* Rueckgabewerte: 0  alles OK                                               */
  208. /*                 1  Fehlende Headerdaten                                   */
  209. /*                 2  Falsche Headerdaten                                    */
  210. /*                 3  Message-Text zu lang                                   */
  211. /*                 4  Fehler beim Speichern                                  */
  212. /*---------------------------------------------------------------------------*/
  213.  
  214. int ChangeMessage(HWND hwndClient, FTNMESSAGE *OldMessage, MSGHEADER *OldHeader, char *pchAreaTag, BOOL bChangeKludges)
  215. {
  216.    FTNMESSAGE Message = {NULL, NULL, NULL, NULL};
  217.    int rc;
  218.    extern USERDATAOPT userdaten;
  219.    extern GENERALOPT generaloptions;
  220.    extern TEMPLATELIST templatelist;
  221.    PAREADEFLIST pAreaDef;
  222.  
  223.    /* Kludges kopieren */
  224.    CopyKludges(&Message, OldMessage);
  225.  
  226.    pAreaDef = AM_FindArea(&arealiste, pchAreaTag);
  227.  
  228.    if (rc=GetMsgContents(hwndClient, &Message, OldHeader,
  229.                          pAreaDef->areadata.areatype != AREATYPE_NET))
  230.       return rc;
  231.  
  232.    /* Ueberpruefen, ob alle Headerdaten vorhanden */
  233.    if (!OldHeader->pchToName[0] ||
  234.        !OldHeader->pchFromName[0])
  235.       return 1;
  236.  
  237.    /* Messagetext zu lang? */
  238.    if (strlen(Message.pchMessageText) > generaloptions.lMaxMsgLen * 1024)
  239.       return 3;
  240.  
  241.    /* Message speichern */
  242.    switch(MSG_ChangeMessage(&Message, OldHeader, &arealiste, pchAreaTag,
  243.                             &userdaten, &generaloptions, bChangeKludges, &templatelist, SendChangeMessage))
  244.    {
  245.       case OK:
  246.          pAreaDef->mailentered=TRUE;
  247.          MSG_ClearMessage(NULL, &Message);
  248.          MailEntered[pAreaDef->areadata.areatype]=TRUE;
  249.          return 0;
  250.  
  251.       default:
  252.          MSG_ClearMessage(NULL, &Message);
  253.          return 4;
  254.    }
  255. }
  256.  
  257. /*----------------------------- CrosspostMessage ----------------------------*/
  258. /* Holt die Messagedaten aus den Feldern, prueft die Daten, holt den         */
  259. /* MessageText, speichert in der Messagebase.                                */
  260. /* Rueckgabewerte: 0  alles OK                                               */
  261. /*                 1  Fehlende Headerdaten                                   */
  262. /*                 2  Falsche Headerdaten                                    */
  263. /*                 3  Message-Text zu lang                                   */
  264. /*                 4  Fehler beim Speichern                                  */
  265. /*---------------------------------------------------------------------------*/
  266.  
  267. static int CrosspostMessage(HWND hwndClient, FTNMESSAGE *OldMessage, MSGHEADER *OldHeader,
  268.                             char *pchAreaTag, char *pchAreaList)
  269. {
  270.    FTNMESSAGE Message={NULL, NULL, NULL, NULL};
  271.    int rc;
  272.    char *pchTemp, *pchXList, *pchXArea, *pchHelp, *pchHelp2;
  273.    BOOL bEnd=FALSE;
  274.    extern USERDATAOPT userdaten;
  275.    extern GENERALOPT generaloptions;
  276.    extern MISCOPTIONS miscoptions;
  277.    extern DRIVEREMAP driveremap;
  278.    extern TEMPLATELIST templatelist;
  279.    AREADEFLIST *pAreaDef;
  280.  
  281.    pAreaDef = AM_FindArea(&arealiste, pchAreaTag);
  282.  
  283.    if (!pAreaDef)
  284.       return -1;
  285.  
  286.    /* Kludges kopieren */
  287.    CopyKludges(&Message, OldMessage);
  288.  
  289.    if (rc=GetMsgContents(hwndClient, &Message, OldHeader,
  290.                          pAreaDef->areadata.areatype != AREATYPE_NET))
  291.       return rc;
  292.  
  293.    StringToNetAddr(pAreaDef->areadata.address, &OldHeader->FromAddress, NULL);
  294.  
  295.    /* Ueberpruefen, ob alle Headerdaten vorhanden */
  296.    if (!OldHeader->pchToName[0] ||
  297.        !OldHeader->pchFromName[0])
  298.       return 1;
  299.  
  300.    /* Crosspost-Liste einfuegen */
  301.    pchTemp=malloc(strlen(Message.pchMessageText)+5000);
  302.    pchXList=malloc(strlen(pchAreaList)+1);
  303.    strcpy(pchXList, pchAreaList);
  304.    pchHelp=pchTemp;
  305.  
  306.    pchXArea=pchXList;
  307.    pchHelp2=pchXArea;
  308.    while (*pchHelp2 && *pchHelp2!=' ')
  309.       pchHelp2++;
  310.    if (*pchHelp2)
  311.       *pchHelp2='\0';
  312.    else
  313.       pchXArea=NULL;
  314.    while(pchXArea)
  315.    {
  316.       if (stricmp(pchXArea, pchAreaTag))
  317.          pchHelp=TplXPost(&templatelist, pchHelp, pchXArea, &arealiste, pchAreaTag);
  318.  
  319.       if (bEnd)
  320.          pchXArea=NULL;
  321.       else
  322.       {
  323.          pchHelp2++;
  324.          pchXArea=pchHelp2;
  325.          while (*pchHelp2 && *pchHelp2!=' ')
  326.             pchHelp2++;
  327.          if (*pchHelp2)
  328.             *pchHelp2='\0';
  329.          else
  330.             bEnd=TRUE;
  331.       }
  332.    }
  333.    if (pchHelp != pchTemp) /* nur wenn nicht leer */
  334.       *pchHelp++='\n';
  335.    strcpy(pchHelp, Message.pchMessageText);
  336.    free(Message.pchMessageText);
  337.    Message.pchMessageText=pchTemp;
  338.  
  339.    free(pchXList);
  340.  
  341.    if (stricmp(pchAreaTag, CurrentArea))
  342.       MSG_OpenArea(&arealiste, pchAreaTag, miscoptions.lastreadoffset, &driveremap);
  343.  
  344.    /* Message speichern */
  345.    switch(MSG_AddMessage(&Message, OldHeader, &arealiste, pchAreaTag,
  346.                          &userdaten, &generaloptions, &driveremap,
  347.                          generaloptions.lMaxMsgLen * 1024, &templatelist, ADDOPT_MATCHADDRESS,
  348.                          SendAddMessage))
  349.    {
  350.       case OK:
  351.          pAreaDef->mailentered=TRUE;
  352.          MSG_ClearMessage(NULL, &Message);
  353.          if (stricmp(pchAreaTag, CurrentArea))
  354.             MSG_CloseArea(&arealiste, pchAreaTag, TRUE, miscoptions.lastreadoffset, &driveremap);
  355.          MailEntered[pAreaDef->areadata.areatype]=TRUE;
  356.          return 0;
  357.  
  358.       default:
  359.          MSG_ClearMessage(NULL, &Message);
  360.          if (stricmp(pchAreaTag, CurrentArea))
  361.             MSG_CloseArea(&arealiste, pchAreaTag, TRUE, miscoptions.lastreadoffset, &driveremap);
  362.          return 4;
  363.    }
  364. }
  365.  
  366. /*---------------------------- CarbonCopyMessage ----------------------------*/
  367. /* Holt die Messagedaten aus den Feldern, prueft die Daten, holt den         */
  368. /* MessageText, speichert in der Messagebase.                                */
  369. /* Rueckgabewerte: 0  alles OK                                               */
  370. /*                 1  Fehlende Headerdaten                                   */
  371. /*                 2  Falsche Headerdaten                                    */
  372. /*                 3  Message-Text zu lang                                   */
  373. /*                 4  Fehler beim Speichern                                  */
  374. /*---------------------------------------------------------------------------*/
  375.  
  376. static int CarbonCopyMessage(HWND hwndClient, FTNMESSAGE *OldMessage, MSGHEADER *OldHeader,
  377.                              char *pchAreaTag, PCCLIST pCCList, PCCENTRY pEntry, BOOL bUseTemplate)
  378. {
  379.    FTNMESSAGE Message={NULL, NULL, NULL, NULL};
  380.    int rc;
  381.    char *pchTemp, *pchHelp;
  382.    BOOL bOpened=FALSE;
  383.    AREADEFLIST *zeiger=NULL;
  384.    extern USERDATAOPT userdaten;
  385.    extern GENERALOPT generaloptions;
  386.    extern MISCOPTIONS miscoptions;
  387.    extern DRIVEREMAP driveremap;
  388.    extern TEMPLATELIST templatelist;
  389.  
  390.    zeiger=AM_FindArea(&arealiste, pchAreaTag);
  391.  
  392.    if (!zeiger)
  393.       return 4;
  394.  
  395.    /* Kludges kopieren */
  396.    CopyKludges(&Message, OldMessage);
  397.  
  398.    if (rc=GetMsgContents(hwndClient, &Message, OldHeader,
  399.                          zeiger->areadata.areatype != AREATYPE_NET))
  400.       return rc;
  401.  
  402.    /* Ueberpruefen, ob alle Headerdaten vorhanden */
  403.    if (!OldHeader->pchFromName[0])
  404.       return 1;
  405.  
  406.    /* Empfaenger eintragen */
  407.    strcpy(OldHeader->pchToName, pEntry->pchName);
  408.    StringToNetAddr(pEntry->pchAddress, &OldHeader->ToAddress, NULL);
  409.  
  410.    /* CC-Liste einfuegen */
  411.    pchTemp=malloc(strlen(Message.pchMessageText)+5000);
  412.    if (pEntry->pchFirstLine[0])
  413.    {
  414.       strcpy(pchTemp, pEntry->pchFirstLine);
  415.       strcat(pchTemp, "\n\n");
  416.       pchHelp = strchr(pchTemp, 0);
  417.    }
  418.    else
  419.       pchHelp=pchTemp;
  420.    if (bUseTemplate)
  421.       pchHelp=TplCCopy(&templatelist, pchHelp, pCCList, pEntry, &arealiste, pchAreaTag);
  422.    strcpy(pchHelp, Message.pchMessageText);
  423.    free(Message.pchMessageText);
  424.    Message.pchMessageText=pchTemp;
  425.  
  426.    if (zeiger->areahandle == NULL)
  427.    {
  428.       MSG_OpenArea(&arealiste, pchAreaTag, miscoptions.lastreadoffset, &driveremap);
  429.       bOpened=TRUE;
  430.    }
  431.  
  432.    /* Message speichern */
  433.    switch(MSG_AddMessage(&Message, OldHeader, &arealiste, pchAreaTag,
  434.                           &userdaten, &generaloptions, &driveremap,
  435.                           generaloptions.lMaxMsgLen * 1024, &templatelist, ADDOPT_MATCHADDRESS,
  436.                           SendAddMessage))
  437.    {
  438.       case OK:
  439.          zeiger->mailentered=TRUE;
  440.          MSG_ClearMessage(NULL, &Message);
  441.          MailEntered[zeiger->areadata.areatype]=TRUE;
  442.          if (bOpened)
  443.             MSG_CloseArea(&arealiste, pchAreaTag, TRUE, miscoptions.lastreadoffset, &driveremap);
  444.          return 0;
  445.  
  446.       default:
  447.          MSG_ClearMessage(NULL, &Message);
  448.          if (bOpened)
  449.             MSG_CloseArea(&arealiste, pchAreaTag, TRUE, miscoptions.lastreadoffset, &driveremap);
  450.          return 4;
  451.    }
  452. }
  453.  
  454. /*-------------------------- SaveMessage ------------------------------------*/
  455. /* Speichert eine Message im Normal-Modus                                    */
  456. /* Rueckgabewerte: FALSE  OK, Status zurueck auf Lesen                       */
  457. /*                 TRUE   Fehler, Programmstatus belassen                    */
  458. /*---------------------------------------------------------------------------*/
  459.  
  460. BOOL SaveMessage(HWND hwndClient, FTNMESSAGE *MsgInfo, MSGHEADER *Header, PCHAR pAreaTag)
  461. {
  462.    int rc;
  463.  
  464.    switch(rc = AddNewMessage(hwndClient, MsgInfo, Header, pAreaTag))
  465.    {
  466.       /* Alles OK */
  467.       case 0:
  468.          return FALSE;
  469.  
  470.       default:
  471.          SaveErrorMessage(hwndClient, rc);
  472.          return TRUE;
  473.    }
  474. }
  475.  
  476. /*------------------------- SaveCrosspostMessage ----------------------------*/
  477. /* Speichert eine Message im Crosspost-Modus                                 */
  478. /* Rueckgabewerte: FALSE  OK, Status zurueck auf Lesen                       */
  479. /*                 TRUE   Fehler, Programmstatus belassen                    */
  480. /*---------------------------------------------------------------------------*/
  481.  
  482. BOOL SaveCrosspostMessage(HWND hwndClient, FTNMESSAGE *MsgInfo, MSGHEADER *Header,
  483.                           PCHAR pAreaTag, char **pchAreaList)
  484. {
  485.    char *AreaTag=NULL, *pchXTemp;
  486.    int rc;
  487.  
  488.    pchXTemp=malloc(strlen(*pchAreaList)+2+strlen(pAreaTag));
  489.  
  490.    /* Uberpruefen, ob pAreaTag schon vorhanden */
  491.    strcpy(pchXTemp, *pchAreaList);
  492.    AreaTag=strtok(pchXTemp, " ");
  493.    while(AreaTag)
  494.    {
  495.       if (!stricmp(AreaTag, pAreaTag))
  496.          break;
  497.       else
  498.          AreaTag=strtok(NULL, " ");
  499.    }
  500.    if (AreaTag)
  501.       strcpy(pchXTemp, *pchAreaList);
  502.    else
  503.    {
  504.       strcpy(pchXTemp, pAreaTag);
  505.       strcat(pchXTemp, " ");
  506.       strcat(pchXTemp, *pchAreaList);
  507.    }
  508.  
  509.    free(*pchAreaList);
  510.    *pchAreaList=strdup(pchXTemp);
  511.  
  512.    AreaTag=strtok(pchXTemp, " ");
  513.    while(AreaTag)
  514.    {
  515.       switch(rc = CrosspostMessage(hwndClient, MsgInfo, Header, AreaTag, *pchAreaList))
  516.       {
  517.          case 0:
  518.             break;
  519.  
  520.          default:
  521.             SaveErrorMessage(hwndClient, rc);
  522.             free(pchXTemp);
  523.             return TRUE;
  524.       }
  525.       AreaTag=strtok(NULL, " ");
  526.    }
  527.    free(pchXTemp);
  528.    return FALSE;
  529. }
  530.  
  531. /*----------------------------- SaveCCMessage -------------------------------*/
  532. /* Speichert eine Message im Carbon-Copy-Modus                               */
  533. /* Rueckgabewerte: FALSE  OK, Status zurueck auf Lesen                       */
  534. /*                 TRUE   Fehler, Programmstatus belassen                    */
  535. /*---------------------------------------------------------------------------*/
  536.  
  537. BOOL SaveCCMessage(HWND hwndClient, FTNMESSAGE *MsgInfo, MSGHEADER *Header, PCHAR pAreaTag,
  538.                    PCCLIST pCCList)
  539. {
  540.    PCCENTRY pEntry;
  541.    BOOL bUseTemplate=FALSE;
  542.    int rc;
  543.  
  544.    pEntry=pCCList->pEntries;
  545.    while (pEntry)
  546.    {
  547.       if (pEntry->ulFlags & CCENTRY_MENTION)
  548.       {
  549.          bUseTemplate = TRUE;
  550.          break;
  551.       }
  552.       pEntry = pEntry->next;
  553.    }
  554.  
  555.    pEntry=pCCList->pEntries;
  556.  
  557.    while(pEntry)
  558.    {
  559.       switch(rc = CarbonCopyMessage(hwndClient, MsgInfo, Header, pAreaTag,
  560.                                     pCCList, pEntry, bUseTemplate))
  561.       {
  562.          /* Alles OK */
  563.          case 0:
  564.             break;
  565.  
  566.          default:
  567.             SaveErrorMessage(hwndClient, rc);
  568.             return TRUE;
  569.       }
  570.       if (pCCList->ulFlags & CCLIST_KILLSENT)
  571.          Header->ulAttrib |= ATTRIB_KILLSENT;
  572.       pEntry=pEntry->next;
  573.    }
  574.    return FALSE;
  575. }
  576.  
  577.  
  578. void SaveErrorMessage(HWND hwndClient, ULONG ulMsg)
  579. {
  580.    switch(ulMsg)
  581.    {
  582.       case 0: /* kein Fehler */
  583.          return;
  584.  
  585.       /* Fehlende Headerdaten */
  586.       case 1:
  587.          MessageBox(hwndClient, IDST_MSG_INFOMISSING, 0,
  588.                     IDD_INFOMISSING, MB_OK | MB_ERROR);
  589.          return;
  590.  
  591.       /* Falsche Headerdaten */
  592.       case 2:
  593.          QuickMessage(hwndClient, "Falsche Headerdaten");
  594.          return;
  595.  
  596.       /* Text zu lang */
  597.       case 3:
  598.          MessageBox(hwndClient, IDST_MSG_TEXTTOOLONG, 0,
  599.                     IDD_TOOLONG, MB_OK | MB_ERROR);
  600.          return;
  601.  
  602.       /* Fehler in der MSGAPI */
  603.       case 4:
  604.          MessageBox(hwndClient, IDST_MSG_ERRORMSGSAVE, 0,
  605.                     IDD_ERRORMSGSAVE, MB_OK | MB_ERROR);
  606.          return;
  607.  
  608.       default:
  609.          WinAlarm(HWND_DESKTOP, WA_ERROR);
  610.          return;
  611.    }
  612. }
  613.  
  614. static void CopyKludges(PFTNMESSAGE pDest, PFTNMESSAGE pSrc)
  615. {
  616.    PKLUDGE pKludge=NULL;
  617.  
  618.    while (pKludge = MSG_FindKludge(pSrc, KLUDGE_ANY, pKludge))
  619.       MSG_SetKludge(pDest, pKludge->ulKludgeType, pKludge->pchKludgeText, SETKLUDGE_MULTIPLE);
  620.  
  621.    return;
  622. }
  623.  
  624. MRESULT SendAddMessage(AREADEFLIST *pAreaDef, ULONG ulMsgID, PMSGHEADER pHeader)
  625. {
  626.    MESSAGEID MessageID;
  627.    extern HWND client;
  628.  
  629.    strcpy(MessageID.pchAreaTag, pAreaDef->areadata.areatag);
  630.    MessageID.ulMsgID = ulMsgID;
  631.  
  632.    return SendMsg(client, WORKM_ADDED, &MessageID, pHeader);
  633. }
  634.  
  635. MRESULT SendChangeMessage(AREADEFLIST *pAreaDef, ULONG ulMsgID, PMSGHEADER pHeader)
  636. {
  637.    MESSAGEID MessageID;
  638.    extern HWND client;
  639.  
  640.    strcpy(MessageID.pchAreaTag, pAreaDef->areadata.areatag);
  641.    MessageID.ulMsgID = ulMsgID;
  642.  
  643.    return SendMsg(client, WORKM_CHANGED, &MessageID, pHeader);
  644. }
  645.  
  646. MRESULT SendKillMessage(AREADEFLIST *pAreaDef, ULONG ulMsgID, PMSGHEADER pHeader)
  647. {
  648.    MESSAGEID MessageID;
  649.    extern HWND client;
  650.  
  651.    strcpy(MessageID.pchAreaTag, pAreaDef->areadata.areatag);
  652.    MessageID.ulMsgID = ulMsgID;
  653.  
  654.    return SendMsg(client, WORKM_DELETED, &MessageID, pHeader);
  655. }
  656. /*-------------------------------- Modulende --------------------------------*/
  657.  
  658.