Hi Jeremy,
diff --git a/dlls/winemapi/Makefile.in b/dlls/winemapi/Makefile.in index 813ee42..d6f79b4 100644 --- a/dlls/winemapi/Makefile.in +++ b/dlls/winemapi/Makefile.in @@ -3,4 +3,5 @@ IMPORTS = shlwapi shell32 mapi32
C_SRCS = \ main.c \
- sendmail.c
- sendmail.c \
- xdg-email.c
I think it would be better to put this in sendmail.c. There’s not enough code to warrant a new file and I don’t expect it to grow.
+/**************************************************************************
- MAPISendMail
- Send a message using a native mail client.
- PARAMS
- session [I] Handle to a MAPI session.
- uiparam [I] Parent window handle.
- message [I] Pointer to a MAPIMessage structure.
- flags [I] Flags.
- reserved [I] Reserved, pass 0.
- RETURNS
- Success: SUCCESS_SUCCESS
- Failure: MAPI_E_FAILURE
- */
+ULONG WINAPI MAPISendMail(LHANDLE session, ULONG_PTR uiparam,
- lpMapiMessage message, FLAGS flags, ULONG reserved)
+{
- if (XDGMailAvailable())
return XDGSendMail(session, uiparam, message, flags, reserved);
- return BrowserSendMail(session, uiparam, message, flags, reserved);
+}
It’s hard to reliably check for availability of any given command, and even if you can there’s still a race. You should just call _spawnvp and fall back to the existing path if it fails.
+static void add_argument(char **argv, int *argc, const char *arg, const char *param) +{
- argv[(*argc)] = HeapAlloc(GetProcessHeap(), 0, strlen(arg) + 1);
- strcpy(argv[(*argc)++], arg);
- if (param)
- {
argv[(*argc)] = HeapAlloc(GetProcessHeap(), 0, strlen(param) + 1);
strcpy(argv[(*argc)++], param);
- }
+}
+static void add_target(char **argv, int *argc, ULONG class, const char *address) +{
- static const char smtp[] = "smtp:";
- if (!strncasecmp(address, smtp, sizeof(smtp) - 1))
address += sizeof(smtp) - 1;
- switch (class)
- {
case MAPI_ORIG:
TRACE("From: %s\n (unused)", debugstr_a(address));
break;
case MAPI_TO:
TRACE("To: %s\n", debugstr_a(address));
add_argument(argv, argc, address, NULL);
break;
case MAPI_CC:
TRACE("CC: %s\n", debugstr_a(address));
add_argument(argv, argc, "--cc", address);
break;
case MAPI_BCC:
TRACE("BCC: %s\n", debugstr_a(address));
add_argument(argv, argc, "--bcc", address);
break;
default:
TRACE("Unknown recipient class: %d\n", class);
- }
+}
+static void add_file(char **argv, int *argc, const char *path, const char *file) +{
- WCHAR *fullname, *p;
- char *unixpath;
- int namelen = 1;
- if (path)
namelen += strlen(path) + 1;
- if (file)
namelen += strlen(file);
- p = fullname = HeapAlloc(GetProcessHeap(), 0, namelen * sizeof(WCHAR));
- ZeroMemory(fullname, namelen * sizeof(WCHAR));
You should check for allocation failure. memset is preferred over ZeroMemory.