1 /*
2  * ========================================================================
3  * Copyright 2006 University of Washington
4  *
5  * Licensed under the Apache License, Version 2.0 (the "License");
6  * you may not use this file except in compliance with the License.
7  * You may obtain a copy of the License at
8  *
9  *     http://www.apache.org/licenses/LICENSE-2.0
10  *
11  * ========================================================================
12  */
13 
14 #include "pmapi.h"
15 
MAPISendMail(LHANDLE lhSession,ULONG ulUIParam,lpMapiMessage lpMessage,FLAGS flFlags,ULONG ulReserved)16 ULONG FAR PASCAL MAPISendMail(
17     LHANDLE lhSession,
18     ULONG ulUIParam,
19     lpMapiMessage lpMessage,
20     FLAGS flFlags,
21     ULONG ulReserved)
22 {
23     ULONG i;
24     int ac = 0, rv = 0, can_suppress_dialog = 0, has_recips = 0;
25     char **av, *tmpfree, *url;
26 
27     if(MSDEBUG){
28       fprintf(ms_global->dfd, "\r\nIn MAPISendMail\r\n");
29       fprintf(ms_global->dfd, " MAPI_DIALOG is %s set\r\n",
30 	      flFlags & MAPI_DIALOG ? "" : "NOT");
31       fprintf(ms_global->dfd, " MAPI_LOGON_UI is %s set\r\n",
32 	      flFlags & MAPI_LOGON_UI ? "" : "NOT");
33       fprintf(ms_global->dfd, " MAPI_NEW_SESSION is %s set\r\n",
34 	      flFlags & MAPI_NEW_SESSION ? "" : "NOT");
35       fprintf(ms_global->dfd, " session number is %p\r\n", lhSession);
36       _flushall();
37     }
38     msprint_message_structure(lpMessage);
39 
40     url = message_structure_to_mailto_url(lpMessage);
41 
42     for(i = 0; i < lpMessage->nRecipCount; i++){
43 	if((&lpMessage->lpRecips[i])->ulRecipClass != MAPI_ORIG)
44 	  has_recips = 1;
45     }
46     if((flFlags & MAPI_DIALOG) && has_recips &&
47        (lpMessage->lpszSubject
48 	|| lpMessage->lpszNoteText
49 	|| lpMessage->nFileCount)){
50 	if(ms_global->pmapi_suppress_dialogs == PMSD_YES)
51 	  can_suppress_dialog = 1;
52 	else if(ms_global->pmapi_suppress_dialogs == PMSD_PROMPT){
53 	    if(MessageBox(NULL, "Edit Message Before Sending?", "pmapi32.dll", MB_YESNO|MB_ICONQUESTION) == IDNO)
54 	      can_suppress_dialog = 1;
55 	}
56     }
57     if(can_suppress_dialog ||
58        ((flFlags & MAPI_DIALOG) == 0)){
59 	rv = send_msg_nodlg(lhSession, ulUIParam, lpMessage, flFlags, ulReserved);
60 	return(rv);
61     }
62 
63     if (lpMessage == NULL){
64       /*        lpMessage->lpFiles == NULL ||
65 		lpMessage->lpFiles->lpszPathName == NULL) */
66       /* this old code checked to see that there were attachments */
67       /* I think it should be all right for there not to be attachments */
68 
69       ErrorBox("MAPISendMail: %s pointer in lpMessage argument", "NULL");
70       return 0;
71     }
72 
73     /*
74      * allocate space for spawn's argv array:
75      * 	2 for each of the nFileCount attachments
76      * +4 for the -p pinerc, and av[0] and trailing NULL
77      * +2 for the url
78      */
79     {
80     int avSize = (6+2*lpMessage->nFileCount)*sizeof(*av);
81     av = (char **)fs_get(avSize);
82     if (av == NULL) {
83 	ErrorBox("MAPISendMail: fs_get of %d bytes for av failed", (avSize));
84 	return MAPI_E_FAILURE;
85 	}
86     }
87 
88     /*
89      * establish a default path to the pine executable which will
90      * probably be replaced with a value from the registry
91      */
92     if(ms_global && ms_global->pineExe){
93       av[ac++] = quote(ms_global->pineExe);
94       if(!av[0]) {
95 	ErrorBox("Cannot fs_get for %s","pine");
96 	return MAPI_E_FAILURE;
97       }
98     }
99     else return MAPI_E_FAILURE;
100     if(ms_global->pinerc){
101       av[ac++] = mstrdup("-p");
102       if(tmpfree = TmpCopy(ms_global->pinerc, IS_PINERC)){
103 	av[ac++] = quote(tmpfree);
104 	fs_give((void **)&tmpfree);
105       }
106       else
107 	av[ac++] = quote(ms_global->pinerc);
108     }
109     if(url){
110 	av[ac++] = mstrdup("-url");
111 	av[ac++] = url;
112     }
113 
114     /*
115      * make a temporary copy of each attachment in attachDir,
116      * add the new filename (suitably quoted) to pine's argument list
117      */
118     for (i=0; i < lpMessage->nFileCount; ++i) {
119       char *oldPath = lpMessage->lpFiles[i].lpszPathName;
120       char *newCopy, *tmpfree;
121       tmpfree = TmpCopy(oldPath, NOT_PINERC);
122       if(tmpfree == NULL)
123 	return MAPI_E_ATTACHMENT_NOT_FOUND;
124       newCopy = quote(tmpfree);
125       fs_give((void **)&tmpfree);
126       if (newCopy) {
127 	av[ac++] = mstrdup("-attach_and_delete");
128 	av[ac++] = newCopy;
129       }
130       else{
131 	if(MSDEBUG)
132 	  fprintf(ms_global->dfd, "TmpCopy returned null\r\n");
133       }
134       if (MSDEBUG) {
135 	fprintf(ms_global->dfd,"Attachment %d: old path: %s\r\n--\r\n",
136 		i,oldPath);
137 	fprintf(ms_global->dfd,">>: %s\r\n--\r\n",ms_global->attachDir);
138 	fprintf(ms_global->dfd,">>: tmp path: %s\r\n--\r\n",
139 		(newCopy?newCopy:"NULL"));
140       }
141     }
142     av[ac++] = NULL;
143 
144     if(MSDEBUG) {
145 	fprintf(ms_global->dfd, "spawning %s (else %s):\r\n",
146 		ms_global->pineExe, ms_global->pineExeAlt);
147 	for (i=0; av[i]; ++i)
148 	    fprintf(ms_global->dfd, "av[%d] = %s\r\n", i, av[i]);
149     }
150 
151     _flushall();
152     if (_spawnvp(_P_NOWAIT, ms_global->pineExe, av) == -1 &&
153 	_spawnvp(_P_NOWAIT, ms_global->pineExeAlt, av) == -1)
154         {
155 	ErrorBox("MAPISendMail: _spawnvp of %s failed", ms_global->pineExe);
156 	if(MSDEBUG) fprintf(ms_global->dfd, "_spawnvp %s and %s failed\r\n",
157 			    ms_global->pineExe,ms_global->pineExeAlt);
158 	return(MAPI_E_FAILURE);
159 	}
160 
161     /*
162      * close and free allocated resources
163      */
164     if (av[0]) fs_give((void **)&av[0]);
165     for (i=1; av[i]; i++) {
166       if (av[i]) fs_give((void **)&av[i]);
167     }
168     fs_give((void **)&av);
169 
170     return SUCCESS_SUCCESS;
171 }
172 
173 
MAPILogon(ULONG ulUIParam,LPTSTR lpszProfileName,LPTSTR lpszPassword,FLAGS flFlags,ULONG ulReserved,LPLHANDLE lplhSession)174 ULONG FAR PASCAL MAPILogon(
175     ULONG ulUIParam,
176     LPTSTR lpszProfileName,
177     LPTSTR lpszPassword,
178     FLAGS flFlags,
179     ULONG ulReserved,
180     LPLHANDLE lplhSession)
181 {
182     mapi_global_s *nmg = ms_global;
183     sessionlist_s *cs;
184     sessionlist_s *ts;
185 
186     if(MSDEBUG){
187       fprintf(ms_global->dfd, "\r\nIn MAPILogon\r\n");
188       fprintf(ms_global->dfd, " MAPI_FORCE_DOWNLOAD is %s set\r\n",
189 	      flFlags & MAPI_FORCE_DOWNLOAD ? "" : "NOT");
190       fprintf(ms_global->dfd, " MAPI_NEW_SESSION is %s set\r\n",
191 	      flFlags & MAPI_NEW_SESSION ? "" : "NOT");
192       fprintf(ms_global->dfd, " MAPI_LOGON_UI is %s set\r\n",
193 	      flFlags & MAPI_LOGON_UI ? "" : "NOT");
194       fprintf(ms_global->dfd, " MAPI_PASSWORD_UI is %s set\r\n",
195 	      flFlags & MAPI_PASSWORD_UI ? "" : "NOT");
196       fprintf(ms_global->dfd, " ulUIParam is %p\r\n", ulUIParam);
197       if(lpszProfileName)
198 	fprintf(ms_global->dfd, " profile name is %s\r\n", lpszProfileName);
199       fprintf(ms_global->dfd, " lplhSession is %p\r\n", lplhSession);
200       if(lplhSession)
201 	fprintf(ms_global->dfd, " session number is %p\r\n", *lplhSession);
202       fclose(ms_global->dfd);
203       ms_global->dfd = fopen(ms_global->debugFile, "ab");
204       if(!ms_global->dfd){
205 	ms_global->debug = 0;
206 	ErrorBox("Problem with debug file %s! Debugging turned off",
207 		 ms_global->debugFile);
208 	fs_give((void **)&ms_global->debugFile);
209 	ms_global->debugFile = NULL;
210 
211       }
212     }
213     if(lplhSession == NULL){
214       if(MSDEBUG){
215 	fprintf(nmg->dfd,
216 		"lplhSession is a NULL pointer, returning MAPI_E_FAILURE\r\n");
217       }
218       return MAPI_E_FAILURE;
219     }
220     if((flFlags & MAPI_NEW_SESSION) || !nmg->sessionlist){
221 	cs = new_sessionlist();
222 	*lplhSession = cs->session_number;
223 
224 	if(nmg->sessionlist == NULL)
225 	  nmg->sessionlist = cs;
226 	else{
227 	    ts = nmg->sessionlist;
228 	    while(ts->next) ts = ts->next;
229 	    ts->next = cs;
230 	}
231     }
232     else{
233 	if(!*lplhSession) *lplhSession = nmg->sessionlist->session_number;
234 	else
235 	  cs = get_session(*lplhSession);
236 	if(!cs)
237 	  return MAPI_E_INVALID_SESSION;
238     }
239     cs->flags.mapi_logon_ui = ((flFlags & MAPI_LOGON_UI) || (flFlags & MAPI_PASSWORD_UI))
240       ? 1 : 0;
241     if((flFlags & MAPI_LOGON_UI) || (flFlags & MAPI_PASSWORD_UI))
242       if(InitPineSpecific(cs) == -1) return MAPI_E_FAILURE;
243 
244     if(MSDEBUG){
245 	fprintf(nmg->dfd,
246 		"lplhSession is returning %p for session handle\r\n", *lplhSession);
247 	_flushall();
248     }
249     return SUCCESS_SUCCESS;
250 }
251 
MAPILogoff(LHANDLE lhSession,ULONG ulUIParam,FLAGS flFlags,ULONG ulReserved)252 ULONG FAR PASCAL MAPILogoff (
253     LHANDLE lhSession,
254     ULONG ulUIParam,
255     FLAGS flFlags,
256     ULONG ulReserved)
257 {
258     sessionlist_s *cs;
259 
260     if(MSDEBUG){
261       fprintf(ms_global->dfd, "\r\nIn MAPILogoff\r\n");
262       fprintf(ms_global->dfd, " session number is %p\r\n", lhSession);
263       _flushall();
264     }
265 
266     cs = get_session(lhSession);
267     if(!cs) return MAPI_E_INVALID_SESSION;
268     if(!cs->open_stream) return SUCCESS_SUCCESS;
269     cs->open_stream = mail_close_full(cs->open_stream, 0);
270     cs->open_stream = NULL;
271     if(cs->currently_open){
272       fs_give((void **)&cs->currently_open);
273       cs->currently_open = NULL;
274     }
275     cs->dlge.edit1[0] = '\0';
276     cs->dlge.edit2[0] = '\0';
277     /*    ms_global->flags.passfile_checked = FALSE; */
278     return SUCCESS_SUCCESS;
279 }
280 
MAPIFindNext(LHANDLE lhSession,ULONG ulUIParam,LPSTR lpszMessageType,LPSTR lpszSeedMessageID,FLAGS flFlags,ULONG ulReserved,LPSTR lpszMessageID)281 ULONG FAR PASCAL MAPIFindNext (
282     LHANDLE lhSession,
283     ULONG ulUIParam,
284     LPSTR lpszMessageType,
285     LPSTR lpszSeedMessageID,
286     FLAGS flFlags,
287     ULONG ulReserved,
288     LPSTR lpszMessageID)
289 {
290     mapi_global_s *nmg = ms_global;
291     sessionlist_s *cs;
292     char tmp[1024], tmpseq[1024];
293     int msg_found;
294     unsigned long tmp_msgno, i, cur_msg = 0;
295     MESSAGECACHE *telt;
296 
297     if(MSDEBUG){
298       fprintf(nmg->dfd, "\r\nMAPIFindNext Called\r\n");
299       fprintf(ms_global->dfd, " MAPI_GUARANTEE_FIFO is %s set\r\n",
300 	      flFlags & MAPI_GUARANTEE_FIFO ? "" : "NOT");
301       fprintf(ms_global->dfd, " MAPI_LONG_MSGID is %s set\r\n",
302 	      flFlags & MAPI_LONG_MSGID ? "" : "NOT");
303       fprintf(ms_global->dfd, " MAPI_MAPI_UNREAD_ONLY is %s set\r\n",
304 	      flFlags & MAPI_UNREAD_ONLY ? "" : "NOT");
305       fprintf(ms_global->dfd, " session number is %p\r\n", lhSession);
306       fprintf(ms_global->dfd, " ulUIParam is %d\r\n", ulUIParam);
307       fprintf(ms_global->dfd, "message type is %s\r\n",
308 	      lpszMessageType ? lpszMessageType : "NOT SET");
309       fprintf(ms_global->dfd, "seed message id is %s\r\n",
310 	      lpszSeedMessageID ? lpszSeedMessageID : "NOT SET");
311       _flushall();
312     }
313 
314     cs = get_session(lhSession);
315     if(!cs){
316       if(MSDEBUG)
317 	fprintf(ms_global->dfd, "Session number %p is invalid\r\n", lhSession);
318       return MAPI_E_INVALID_SESSION;
319     }
320 
321     if(InitPineSpecific(cs) == -1) return MAPI_E_FAILURE;
322 
323     if(!check_mailstream(cs))
324       return MAPI_E_FAILURE;
325     if(lpszSeedMessageID == NULL || *lpszSeedMessageID == '\0')
326       cur_msg = 0;
327     else{
328       cur_msg = convert_to_msgno(lpszSeedMessageID);
329     }
330     if(flFlags & MAPI_UNREAD_ONLY){
331       if(cur_msg + 1 > cs->open_stream->nmsgs)
332 	return MAPI_E_NO_MESSAGES;
333       tmp_msgno = cur_msg+1;
334       msg_found = FALSE;
335       while(!msg_found && tmp_msgno <= cs->open_stream->nmsgs){
336 	sprintf(tmp, "%d", tmp_msgno);
337 	strcpy(tmpseq, tmp);
338 	if(tmp_msgno+1 <= cs->open_stream->nmsgs){
339 	  sprintf(tmp,":%d", min(cs->open_stream->nmsgs,tmp_msgno+100));
340 	  strcat(tmpseq, tmp);
341 	}
342 	mail_fetch_flags(cs->open_stream, tmpseq, NIL);
343 	for(i = tmp_msgno;
344 	    i <= (unsigned long)min(cs->open_stream->nmsgs,tmp_msgno+100);
345 	    i++){
346 	  telt = mail_elt(cs->open_stream, i);
347 	  if(telt->seen == 0){
348 	    msg_found = TRUE;
349 	    if(MSDEBUG)
350 	      fprintf(nmg->dfd, "msgno %d is the next UNREAD message after %d",
351 		      i, cur_msg);
352 	    break;
353 	  }
354 	}
355 	if(!msg_found){
356 	  if(i == cs->open_stream->nmsgs){
357 	    if(MSDEBUG)
358 	      fprintf(nmg->dfd,"No UNREAD messages found after %d\r\n",
359 		      cur_msg);
360 	    return MAPI_E_NO_MESSAGES;
361 	  }
362 	  tmp_msgno += 100;
363 	}
364       }
365       if(msg_found)
366 	cur_msg = i;
367       else return MAPI_E_NO_MESSAGES;
368     }
369     else{
370       if(cur_msg+1 > cs->open_stream->nmsgs)
371 	return MAPI_E_NO_MESSAGES;
372       cur_msg++;
373     }
374 
375     sprintf(lpszMessageID,"%d", cur_msg);
376 
377     if(MSDEBUG)
378       fprintf(nmg->dfd, " Next message found is %d\r\n", cur_msg);
379     return SUCCESS_SUCCESS;
380 }
381 
382 
MAPIReadMail(LHANDLE lhSession,ULONG ulUIParam,LPSTR lpszMessageID,FLAGS flFlags,ULONG ulReserved,lpMapiMessage FAR * lppMessage)383 ULONG FAR PASCAL MAPIReadMail(
384     LHANDLE lhSession,
385     ULONG ulUIParam,
386     LPSTR lpszMessageID,
387     FLAGS flFlags,
388     ULONG ulReserved,
389     lpMapiMessage FAR *lppMessage)
390 {
391     mapi_global_s *nmg = ms_global;
392     unsigned rv;
393     unsigned long msgno = 0, flags;
394     sessionlist_s *cs;
395 
396     if(MSDEBUG){
397       fprintf(nmg->dfd, "\r\nIn MAPIReadMail\r\n");
398       fprintf(nmg->dfd, "  MAPI_PEEK is %s\r\n",
399 	      flFlags & MAPI_PEEK ? "TRUE":"FALSE");
400       fprintf(nmg->dfd, "  MAPI_BODY_AS_FILE is %s\r\n",
401 	      flFlags & MAPI_BODY_AS_FILE ? "TRUE":"FALSE");
402       fprintf(nmg->dfd, "  MAPI_ENVELOPE_ONLY is %s\r\n",
403 	      flFlags & MAPI_ENVELOPE_ONLY ? "TRUE":"FALSE");
404       fprintf(nmg->dfd, "  MAPI_SUPPRESS_ATTACH is %s\r\n",
405 	      flFlags & MAPI_SUPPRESS_ATTACH ? "TRUE":"FALSE");
406       fprintf(ms_global->dfd, " session number is %p\r\n", lhSession);
407       _flushall();
408     }
409 
410     cs = get_session(lhSession);
411     if(!cs){
412       if(MSDEBUG)
413 	fprintf(ms_global->dfd, "Session number %p is invalid\r\n", lhSession);
414       return MAPI_E_INVALID_SESSION;
415     }
416 
417     if(InitPineSpecific(cs) == -1) return MAPI_E_FAILURE;
418 
419     if(!check_mailstream(cs))
420       return MAPI_E_FAILURE;
421 
422     msgno = convert_to_msgno(lpszMessageID);
423 
424     if(msgno == 0){
425       if(MSDEBUG)
426 	fprintf(nmg->dfd, "Invalid Message ID: %s\r\n", lpszMessageID);
427       return MAPI_E_INVALID_MESSAGE;
428     }
429 
430     if(MSDEBUG){
431       fprintf(nmg->dfd, "lpszMessageID: %s,  converted msgno: %d\r\n",
432 	      lpszMessageID, msgno);
433     }
434 
435     if(flFlags & MAPI_PEEK)
436       flags = FT_PEEK;
437     else flags = NIL;
438 
439     rv = fetch_structure_and_attachments(msgno, flags, flFlags, cs);
440     if(rv == MAPI_E_FAILURE)
441       return rv;
442     else if(rv == SUCCESS_SUCCESS){
443       *lppMessage = cs->lpm;
444       return rv;
445     }
446     else
447       return rv;
448 }
449 
MAPIAddress(LHANDLE lhSession,ULONG ulUIParam,LPTSTR lpszCaption,ULONG nEditFields,LPTSTR lpszLabels,ULONG nRecips,lpMapiRecipDesc lpRecips,FLAGS flFlags,ULONG ulReserved,LPULONG lpnNewRecips,lpMapiRecipDesc FAR * lppNewRecips)450 ULONG FAR PASCAL MAPIAddress(
451     LHANDLE lhSession,
452     ULONG ulUIParam,
453     LPTSTR lpszCaption,
454     ULONG nEditFields,
455     LPTSTR lpszLabels,
456     ULONG nRecips,
457     lpMapiRecipDesc lpRecips,
458     FLAGS flFlags,
459     ULONG ulReserved,
460     LPULONG lpnNewRecips,
461     lpMapiRecipDesc FAR * lppNewRecips)
462 {
463     if(MSDEBUG){
464       fprintf(ms_global->dfd, "\r\nIn MAPIAddress\r\n");
465       fprintf(ms_global->dfd, " MAPI_LOGON_UI is %s set\r\n",
466 	      flFlags & MAPI_LOGON_UI ? "" : "NOT");
467       fprintf(ms_global->dfd, " MAPI_NEW_SESSION is %s set\r\n",
468 	      flFlags & MAPI_NEW_SESSION ? "" : "NOT");
469       fprintf(ms_global->dfd, " session number is %p\r\n", lhSession);
470       _flushall();
471     }
472     return MAPI_E_NOT_SUPPORTED;
473 }
474 
MAPIDeleteMail(LHANDLE lhSession,ULONG ulUIParam,LPTSTR lpszMessageID,FLAGS flFlags,ULONG ulReserved)475 ULONG FAR PASCAL MAPIDeleteMail(
476     LHANDLE lhSession,
477     ULONG ulUIParam,
478     LPTSTR lpszMessageID,
479     FLAGS flFlags,
480     ULONG ulReserved)
481 {
482     if(MSDEBUG){
483       fprintf(ms_global->dfd, "\r\nIn MAPIDeleteMail\r\n");
484       fprintf(ms_global->dfd, " session number is %p\r\n", lhSession);
485       _flushall();
486     }
487     return MAPI_E_NOT_SUPPORTED;
488 }
489 
MAPIDetails(LHANDLE lhSession,ULONG ulUIParam,lpMapiRecipDesc lpRecip,FLAGS flFlags,ULONG ulReserved)490 ULONG FAR PASCAL MAPIDetails(
491   LHANDLE lhSession,
492   ULONG ulUIParam,
493   lpMapiRecipDesc lpRecip,
494   FLAGS flFlags,
495   ULONG ulReserved)
496 {
497     if(MSDEBUG){
498       fprintf(ms_global->dfd, "\r\nIn MAPIDetails\r\n");
499       fprintf(ms_global->dfd, " MAPI_NO_MODIFY is %s set\r\n",
500 	      flFlags & MAPI_AB_NOMODIFY ? "" : "NOT");
501       fprintf(ms_global->dfd, " MAPI_LOGON_UI is %s set\r\n",
502 	      flFlags & MAPI_LOGON_UI ? "" : "NOT");
503       fprintf(ms_global->dfd, " MAPI_NEW_SESSION is %s set\r\n",
504 	      flFlags & MAPI_NEW_SESSION ? "" : "NOT");
505       fprintf(ms_global->dfd, " session number is %p\r\n", lhSession);
506       _flushall();
507     }
508     return MAPI_E_NOT_SUPPORTED;
509 }
510 
MAPIFreeBuffer(LPVOID pv)511 ULONG FAR PASCAL MAPIFreeBuffer(
512   LPVOID pv)
513 {
514     mapi_global_s *nmg = ms_global;
515 
516     if(MSDEBUG){
517       fprintf(nmg->dfd, "\r\nMAPIFreeBuffer called, buffer is %p\r\n", pv);
518       _flushall();
519     }
520     free_mbuffer(pv);
521     return SUCCESS_SUCCESS;
522 }
523 
MAPIResolveName(LHANDLE lhSession,ULONG ulUIParam,LPTSTR lpszName,FLAGS flFlags,ULONG ulReserved,lpMapiRecipDesc FAR * lppRecip)524 ULONG FAR PASCAL MAPIResolveName(
525     LHANDLE lhSession,
526     ULONG ulUIParam,
527     LPTSTR lpszName,
528     FLAGS flFlags,
529     ULONG ulReserved,
530     lpMapiRecipDesc FAR * lppRecip)
531 {
532     mapi_global_s *nmg = ms_global;
533     sessionlist_s *cs, *tsession;
534     static char *fakedomain = "@";
535     ADDRESS *adrlist = NULL;
536     char *adrstr, *tadrstr, *tadrstrbuf;
537 
538     if(MSDEBUG){
539 	fprintf(ms_global->dfd, "\r\nIn MAPIResolveName\r\n");
540 	fprintf(ms_global->dfd, " MAPI_NO_MODIFY is %sset\r\n",
541 		flFlags & MAPI_AB_NOMODIFY ? "" : "NOT ");
542 	fprintf(ms_global->dfd, " MAPI_DIALOG is %sset\r\n",
543 		flFlags & MAPI_DIALOG ? "" : "NOT ");
544 	fprintf(ms_global->dfd, " MAPI_LOGON_UI is %sset\r\n",
545 		flFlags & MAPI_LOGON_UI ? "" : "NOT ");
546 	fprintf(ms_global->dfd, " MAPI_NEW_SESSION is %sset\r\n",
547 		flFlags & MAPI_NEW_SESSION ? "" : "NOT ");
548 	fprintf(ms_global->dfd, " session number is %p\r\n", lhSession);
549 	fprintf(ms_global->dfd, " String to Resolve is %s\r\n", lpszName);
550 	_flushall();
551     }
552 
553     if((flFlags & MAPI_NEW_SESSION) || lhSession == 0)
554       tsession = cs = new_sessionlist();
555     else {
556 	cs = get_session(lhSession);
557 	if(!cs){
558 	  if(MSDEBUG)
559 	    fprintf(ms_global->dfd, "Session number %p is invalid\r\n", lhSession);
560 	  return MAPI_E_INVALID_SESSION;
561 	}
562     }
563     cs->flags.mapi_logon_ui = (flFlags & MAPI_LOGON_UI) ? 1 : 0;
564     if(InitPineSpecific(cs) == -1) return MAPI_E_FAILURE;
565     tadrstrbuf = tadrstr = mstrdup(lpszName);
566     removing_leading_and_trailing_white_space(tadrstr);
567     if(_strnicmp(tadrstr, "SMTP:", 5) == 0){
568 	tadrstr += 5;
569 	if(tadrstr[0] == '(' && tadrstr[strlen(tadrstr) - 1] == ')'){
570 	    tadrstr[strlen(tadrstr)-1] = '\0';
571 	    tadrstr++;
572 	    removing_leading_and_trailing_white_space(tadrstr);
573 	}
574     }
575     rfc822_parse_adrlist(&adrlist, tadrstr,
576 			 nmg->prcvars[USER_DOMAIN]->val.p ? nmg->prcvars[USER_DOMAIN]->val.p
577 			 : fakedomain);
578     fs_give((void **)&tadrstrbuf);
579     if(!adrlist || adrlist->next){   /* I guess there aren't supposed to be multiple addresses, */
580 	                 /* which is pretty lame */
581 	mail_free_address(&adrlist);
582 	if(tsession)
583 	  fs_give((void **)&tsession);
584 	msprint("Returning MAPI_E_AMBIGUOUS_RECIPIENT\r\n");
585 	return MAPI_E_AMBIGUOUS_RECIPIENT;
586     }
587     if(!adrlist->host || *adrlist->host == '@'){
588 	mail_free_address(&adrlist);
589 	if(tsession)
590 	  fs_give((void **)&tsession);
591 	msprint("Returning MAPI_E_AMBIGUOUS_RECIPIENT\r\n");
592 	return MAPI_E_AMBIGUOUS_RECIPIENT;
593     }
594 
595     (*lppRecip) = new_MapiRecipDesc(1);
596     if(adrlist->personal){
597 	(*lppRecip)->lpszName = mstrdup(adrlist->personal);
598 	adrlist->personal = NULL;
599     }
600     adrstr = (char *)fs_get((8 + strlen(adrlist->mailbox) + strlen(adrlist->host)) * sizeof(char));
601     sprintf(adrstr, "SMTP:%s@%s", adrlist->mailbox, adrlist->host);
602     (*lppRecip)->lpszAddress = adrstr;
603 
604     /* The spec says it's a recipient, so set the thing to MAPI_TO */
605     (*lppRecip)->ulRecipClass = MAPI_TO;
606 
607     mail_free_address(&adrlist);
608     msprint1(" Returning with name: %s\r\n", (*lppRecip)->lpszName ? (*lppRecip)->lpszName : "(no name)");
609     msprint1("             address: %s\r\n", (*lppRecip)->lpszAddress ? (*lppRecip)->lpszAddress : "(no address)");
610     msprint("        ulRecipClass: MAPI_TO\r\n");
611     msprint("Returning SUCCESS_SUCCESS\r\n");
612     return SUCCESS_SUCCESS;
613 }
614 
MAPISaveMail(LHANDLE lhSession,ULONG ulUIParam,lpMapiMessage lpMessage,FLAGS flFlags,ULONG ulReserved,LPTSTR lpszMessageID)615 ULONG FAR PASCAL MAPISaveMail(
616     LHANDLE lhSession,
617     ULONG ulUIParam,
618     lpMapiMessage lpMessage,
619     FLAGS flFlags,
620     ULONG ulReserved,
621     LPTSTR lpszMessageID)
622 {
623     if(MSDEBUG){
624       fprintf(ms_global->dfd, "\r\nIn MAPISaveMail\r\n");
625       fprintf(ms_global->dfd, " MAPI_LOGON_UI is %s set\r\n",
626 	      flFlags & MAPI_LOGON_UI ? "" : "NOT");
627       fprintf(ms_global->dfd, " MAPI_LONG_MSGID is %s set\r\n",
628 	      flFlags & MAPI_LONG_MSGID ? "" : "NOT");
629       fprintf(ms_global->dfd, " MAPI_NEW_SESSION is %s set\r\n",
630 	      flFlags & MAPI_NEW_SESSION ? "" : "NOT");
631       fprintf(ms_global->dfd, " session number is %p\r\n", lhSession);
632       _flushall();
633     }
634     return MAPI_E_NOT_SUPPORTED;
635 }
636 
MAPISendDocuments(ULONG ulUIParam,LPTSTR lpszDelimChar,LPTSTR lpszFullPaths,LPTSTR lpszFileNames,ULONG ulReserved)637 ULONG FAR PASCAL MAPISendDocuments(
638     ULONG ulUIParam,
639     LPTSTR lpszDelimChar,
640     LPTSTR lpszFullPaths,
641     LPTSTR lpszFileNames,
642     ULONG ulReserved)
643 {
644     if(MSDEBUG){
645       fprintf(ms_global->dfd, "\r\nIn MAPISendDocuments\r\n");
646       fprintf(ms_global->dfd, " lpszDelimChar: %c\r\n", *lpszDelimChar);
647       fprintf(ms_global->dfd, " lpszFullPaths: %s\r\n", lpszFullPaths);
648       fprintf(ms_global->dfd, " lpszFileNames: %s\r\n", lpszFileNames);
649       _flushall();
650     }
651 
652     return send_documents(lpszFullPaths, *lpszDelimChar);
653 }
654