MODULE HostMail;
(**

   project   = "BlackBox"
   organization   = "www.oberon.ch"
   contributors   = "Oberon microsystems"
   version   = "System/Rsrc/About"
   copyright   = "System/Rsrc/About"
   license   = "Docu/BB-License"
   changes   = ""
   issues   = ""

**)

            
   IMPORT
      SYSTEM, WinCmc, WinApi,
      Files, Dialog, Converters, Views, Windows,
      TextModels, TextViews, TextControllers, HostFiles;
   
   CONST
      tempFile = "_mail_.odc";
   
   VAR
      tempLoc: HostFiles.Locator;
      checked: BOOLEAN;
      sendDocument: PROCEDURE(adr, subject, note: WinCmc.string; flgs: WinCmc.flags;
                  paths, names, delimiter: WinCmc.string; id: WinCmc.ui_id): WinCmc.return_code;
      

   
   PROCEDURE CheckDll*;
      VAR dll: WinApi.HINSTANCE;
   BEGIN
      IF ~checked THEN
         dll := WinApi.LoadLibraryW("MAPI32");
         IF dll # 0 THEN
            SYSTEM.PUT(SYSTEM.ADR(sendDocument), WinApi.GetProcAddress(dll, "cmc_send_documents"));
         END;
         checked := TRUE
      END
   END CheckDll;
   PROCEDURE SendNote*;

      VAR c: TextControllers.Controller; r: TextModels.Reader; res: WinCmc.return_code;
         s: POINTER TO ARRAY OF SHORTCHAR; ch: CHAR; beg, end, i: INTEGER; p: WinCmc.string;
   BEGIN
      CheckDll;
      IF sendDocument # NIL THEN
         c := TextControllers.Focus(); p := NIL;
         IF (c # NIL) & c.HasSelection() THEN
            c.GetSelection(beg, end);
            r := c.text.NewReader(NIL); r.SetPos(beg);
            NEW(s, (end - beg) * 2 + 1); r.ReadChar(ch); i := 0;
            WHILE ~r.eot & (r.Pos() <= end) DO
               IF (r.view = NIL) & (ch < 100X) THEN
                  s[i] := SHORT(ch); INC(i);
                  IF ch = 13X THEN s[i] := 10X; INC(i) END
               END;
               r.ReadChar(ch)
            END;
            s[i] := 0X; p := s^;
         END;
         res := sendDocument(NIL, NIL, p,
            WinCmc.ERROR_UI_ALLOWED + WinCmc.LOGON_UI_ALLOWED + WinCmc.SEND_UI_REQUESTED,
            NIL, NIL, ", ", 0)
      END
   END SendNote;
   
   PROCEDURE SendDocument*;
      VAR w: Windows.Window; res: WinCmc.return_code; name: HostFiles.FullName; title: Views.Title;
         ss: ARRAY 260 OF SHORTCHAR; st: ARRAY 64 OF SHORTCHAR;
   BEGIN
      CheckDll;
      IF sendDocument # NIL THEN
         w := Windows.dir.First();
         IF w # NIL THEN
            Converters.Export(tempLoc, tempFile, NIL, w.doc.ThisView());
            name := tempLoc.path + "\" + tempFile;
            IF w.name # "" THEN title := w.name$
            ELSE w.GetTitle(title); title := title + ".odc"
            END;
            ss := SHORT(name$); st := SHORT(title$);
            res := sendDocument(NIL, NIL, NIL,
               WinCmc.ERROR_UI_ALLOWED
               + WinCmc.LOGON_UI_ALLOWED
               + WinCmc.SEND_UI_REQUESTED,
               ss, st, ", ", 0);
            Files.dir.Delete(tempLoc, tempFile)
         END
      END
   END SendDocument;
   
   PROCEDURE SendNoteGuard* (VAR par: Dialog.Par);
   BEGIN
      IF checked & (sendDocument = NIL) THEN par.disabled := TRUE END
   END SendNoteGuard;
   
   PROCEDURE SendDocumentGuard* (VAR par: Dialog.Par);
   BEGIN
      IF checked & (sendDocument = NIL) OR (Windows.dir.First() = NIL) THEN par.disabled := TRUE END
   END SendDocumentGuard;
   
   PROCEDURE Init;
      VAR res: INTEGER; path: HostFiles.FullName;
   BEGIN
      res := WinApi.GetTempPathW(LEN(path), path);
      tempLoc := HostFiles.NewLocator(path);
   END Init;
   
BEGIN
   Init
END HostMail.