Closed Bug 100669 Opened 23 years ago Closed 23 years ago

MAPI call from MS word, EXCEL does not call send mail/send doc

Categories

(MailNews Core :: Simple MAPI, defect, P1)

x86
Windows 2000
defect

Tracking

(Not tracked)

VERIFIED FIXED

People

(Reporter: tiantian, Assigned: rdayal)

References

Details

(Whiteboard: [PDT], [ETA ?])

Attachments

(4 files, 7 obsolete files)

(deleted), patch
cavin
: review+
mscott
: superreview+
Details | Diff | Splinter Review
(deleted), patch
bugzilla
: review+
mscott
: superreview+
Details | Diff | Splinter Review
(deleted), patch
bugzilla
: review+
mscott
: superreview+
Details | Diff | Splinter Review
(deleted), patch
bugzilla
: review+
mscott
: superreview+
Details | Diff | Splinter Review
This is discovered in the integration testing. MAPI call from MS Word, EXCEL can get through to log on, but not to send mail/send doc yet. Krishna is working together with Rajiv on this blocker issue right now.
Blocks: 95113, 95116
Keywords: nsbranch+
Priority: -- → P1
QA Contact: sheelar → trix
Whiteboard: PDT
I have tracked down the problem seen when a MAPI send call is made from Excel. The call made from Excel is with null originator and recipients strings since it expects some kind of mail compose window to be displayed to do so. However the type library (proxy dll for MAPI support MS COM interface in Mozilla) generated by MIDL makes a check for the method parameters to be non null. Since this check in the MS MIDL generated proxy lib fails it does not call the mapi support dll in mozilla. I have hacked this down and have made a fix to make sure that a null value is not passed down to the MSCOM type lib. The send call from Excel to our mapi32.dll to mozilla/mailnews works fine now !
The send call from PowerPoint also seems to go through to the mailnews interface. However I saw there is some problem with the attachment that Powerpoint sends. When Powerpoint is used to send the currently open attachment it creates a temp file and sends the path name pointing to this temp file rather than the pathname for the file currently open. This could be to take care of the case if the currently open file is not saved and also maybe to avoid any file locking problem that the messaging app may face since the file is already open in Powerpoint. Whatever maybe the reason but when the file is sent the path points to a temp file and also the extension of the file is not correct, the mail compose component uses the extension to determine the mime type and doesnot take any inputs for the mime type of the attachments. I am looking into this to figure out what could be the solution.
I have a solution to take care of the temp file problem and the .tmp extension for the attachment pathnames passed for an open file by Powerpoint, for the MAPI send. I do get the real filename too along with the temporary pathname, i copy the temp file to a file with this real name and then send this new temp filename to the mailnews/compose function. This temp file i delete on send completion. However, i believe it will be good if the fix for this is put into the mailnews/compose component. There should be a way i can pass in the real filename to the compose interface. This way the compose interface can use the real filename to find the extension/mime type and then can read the data from the temporary file created by the calling application. Also the real filename can be sent to specify the attachment sent. At this moment though with the above solution of changing filenames and creating another temporary file the send with attachments from Excel and Powerpoint works fine !
hey rajiv, what does your code look like which copies the temp file to a file with the real file name? Are we opening ourselves up to some data loss if I already have a file with that name in the same directory? i.e. you rename myresume.tmp to myresume.doc in my temp directory which is where I'm currently storing the original myresume.doc file. Just wondering.
I know you want to get something working without waiting for JF to change the compose service, but making another temp file is less than ideal - you could run out of disk space, there's a performance hit, you make it more possible to leak a temp file (if we crash, for example) etc. So I'd really like to see us not create an extra temp file.
no i am not in a hurry to have the thing working .. i just put this quick solution to make sure that things will work if we deal with the temp file created by Excel/Powerpoint and use the real file name passed in to the MAPI call. I too have mentioned above that this is not the ideal solution. JF can u deal with this in ur compose code ..
The way compose fields store attachment is very limited as we store only the file path. We have been already beten by this problem (during reply, forward, intl, etc) and I had planed to do some work in the future but maybe I should do it sooner. The solution is to replace the list of file path in the compose field by an array of object. This object will let us store the following information: -the real attachment file name -the file path -the mime type -does the file must be deleted when done with it -maybe the character set! In order to implement that, I will have to modify nsMsgCompField, mime and msg compose front end and back end. This is not a small change and therefore is unlikely that will append for 0.9.4. Kind of risky
Well .. on second thoughts I think the solution of creating another temp file using the real file name will work quite ok for now. The problem of running out of disk space ... will the nsIFile/nsILocalFile not return me an error if there is no disk space ? Performance hit ..some ..but maybe not very noticeable .. And i check that this creation of new temp file business is done Only if the real file name passed is not same as the one in the full path name passed. Also i check that the dir path in the full path name is same as the WindowsTempPath before doing the new temp file creation. To answer Scott's Q i do check if a file with the new file name exists in the temp dir, if it does, currently i am just returning an error.
I have also observed that Excel and Powerpoint creates the temp file only for the send operation and after the MAPI send call is completed it deletes the file. Thus instead of copying the temp file to a new temp file with the real file name we can just rename the temp file with the real file name as far as Excel and Powerpoint is concerned. This will also take care of the performance and disk full issue with creation of another temp file. We will however need to do some more testing with some other apps too.
Another interesting thing i observed is that when send is called from Powerpoint it creates a temp file in temp dir which is removed once the send returns. We return the send call once we bring up the Compose Window since we donot want to hold up the calling application till the user hits the send button. So in case of Powerpoint it goes ahead and deletes the temp file as soon as send return and the send from Compose window will fail if we dont deal with the temp file. Thus it will become necessary that we either rename the temp file or make a copy (i guess rename is better, Powerpoint does not crash if it doesnot file this temp file to delete) even when we deal with this temp file situation in the mailnews/compose component.
The problem with Word is also fixed now ! Word calls Logon twice (as was also noticed during N4 release) and the second call made on another thread was blocking. We use a Mutex in Logon to handle multiple calls. In the second call it was blocking on this mutex since the mutex creation was done with bInitialOwner = TRUE, the second thread was not able to get the ownership of the mutex and the call to WaitForSingleObject was blocking. I have fixed this to create the mutex with this flag set to FALSE so that other threads using the mutex can get its ownership.
Rajiv - keep testin this and get it up somewhere where it can be tested.
I have noticed a similiar behaviour in Netscape 4.7 while dealing with MAPI send from Powerpoint / Excel which creates a temp file for the attachment to be sent. N4.7 creates a file with the real file name in the temp dir for it. This issue was discussed in PDT and a decision has been made to handle the temp file created for attachments during MAPI send from MS applications like Powerpoint / Excel in the MAPI support code itself rather than mailnews / compose for now.
This bug deals with 3 blockers we had : 1) Excel not able to call mozilla from mapi32.dll 2) Word not able to call MAPISend defined in mapi32.dll 3) Powerpoint (also Excel) MAPI Send not able to send attachments correctly. The third problem (3) above was because of the temp file that these apps create for sending the open document as an attachment. Below are the patches for each of these problems. Since the 3rd problem required the maximum code change, that is attached for review first.
Hi Rajiv, Can you attach your diffs using cvs diff -uw? (-u means unified). It makes the diffs much more legible and easier to understand. I can't read the regular old contextual diffs =).
Attached patch above patch recreated with -u option (obsolete) (deleted) — Splinter Review
The patch above to deal with the temp file creation done by Powerpoint and Excel to send currenlty open documents as attachments has changes done to the SendMail code. The original Send Mail code is attached as the latest patch to the bug # 95113.
Rajiv, I am so sorry! nsMsgIComposeFields already knows how to deal with temp file that need to be deleted when done with it. All you have to do is to set the the "temporaryFiles" field the same way you set the "attachment" field. When the nsMsgIComposeFields is destroyed, it will automatically delete any file specified into "temporaryFiles".
Oh !! ... but i still need to deal with the temp file creation using the real filename, right ?
Right. Another question is do you still have to delete the temp file if the send failed or is aborted? if no, you must clear the temporaryfiles field before the compose fields is destroyed.
Yes i still need to delete the temp files i renamed even if send failed or was aborted, since the calling MAPI app wouldn't know about it. So i will go ahead and remove the code dealing with deletion of temp file in the SendListener code, test it and put up the new patch. Meanwhile can u review the other parts of the code. The first 25-30 lines of the patch deal with the deletion of temp files and the remaining code deals with temp file creation, etc, can u please review that. Thanks, - rajiv.
Above is the patch updated to not delete the temp files in the send listener, it calls the nsICompFields::SetTemporaryFiles instead. I tested the code and i saw a problem in "nsMsgCompFields::CleanUpTempFiles()", the rv for 'urlFile->IsDirectory(&isDir)' fails, it displays : "the NS_ASSERTION(0, "IsDirectory() call failed!");" and goes into in an infinite loop. This is because strtok() on var 'rest' is not called in this case and the value of var 'token' does not change and hence it never gets out of the while loop. Surprising .. IsDirectory is returning a failure !! I guess it should return PR_FALSE for var 'isDir' and return NS_OK ! Anyway, if I comment out the check for the return value (below) for the 'urlFile->IsDirectory(&isDir)' call the code works perfectly fine and the temp files are cleaned up appropriately. /** commenting out if (NS_FAILED(rv)) { NS_ASSERTION(0, "IsDirectory() call failed!"); continue; } **/ Hi JF, Can u please take care of this in 'nsMsgCompFields.cpp' as well as review the above attached patch. thanks, - rajiv.
Please find below the code that fixes the problem seen with Excel, blocker (1) as mentioned in comments above (2001-09-24 11:24) MAPI Send call from Excel was reaching the exported MAPI function in mapi32.dll but not reaching the MAPI support MS COM interface exported from Mozilla. The fix is briefly described in above comments (2001-09-19 19:53).
I have rewrote nsMsgCompFields::CleanUpTempFiles, this time we should not loop in case an error occurs. Rajiv, can you check if this patch solve your problem. Thanks.
Comment on attachment 50673 [details] [diff] [review] patch for fix for blocker (1), Excel unable to call SendMail in Mozilla This fix seems wrong and could lead to a crash. Basically, if I correctly understand, you are passing the address of a structure allocated on the stack to a function. I see 2 major problems: 1) when you declare a struct on the stack, the structure is not initialized unless it has a constructor and therefore it could hold random value. Some compiler has the bad idea to always initialize the memory to 0 in debug mode! 2) You are passing the address of a variable that went out of scoop. Therefore you cannot count on it anymore
Comment on attachment 50707 [details] [diff] [review] Proposed fix for nsMsgCompFields::CleanUpTempFiles r=cavin.
Attachment #50707 - Flags: review+
We are passing the address of struct that is created on stack here to a function which is a blocking function. The struct goes out of scope only after the called function returns which returns only after either completing the usage of the struct or after copying the values in the struct to another memory location. As far as initializing the struct is concerned, it is initialized with the values passed to the calling function or is just ignored. The count variables passed to the function which also takes the struct pointer as a parameter is used to determine if the struct is used or not.
Comment on attachment 50670 [details] [diff] [review] patch dealing with temp file creation for Powerpoint/Excel attachments with CompFields::SetTemporaryFiles Couple comments: 1) instead of using GetTempPath, you can use the Mozilla way: nsSpecialSystemDirectory tmpFile(nsSpecialSystemDirectory::OS_TemporaryDirectory); 2) please, avoid duplicating code, especially when it's a big chunk. You should be able to create a function that set the native attachment into the compose fields. 3) Also, use nsILocalFile member function GetLeafName or GetUnicodeLeafName to extract the leaf name. NsILocalFile provide you all sort of function to manipulate files path.
Attachment #50670 - Flags: needs-work+
Attachment #50673 - Flags: needs-work+
1) i will change it to use nsSpecialSystemDirectory 2) both the chunks of code for setting comp fields native attachment are somewhat different, one is for Unicode data and another for non-Unicode data. However, i will try to see if it is still possible to merge them together without nearly having the same amount of code in the common function. 3) i am using GetLeafName and GetUnicodeLeafName for getting the filename from the file / path wherever possible, eg : // filename of the file attachment nsXPIDLString pLeafName ; pFile->GetUnicodeLeafName (getter_Copies(pLeafName)) ; nsAutoString LeafName ; LeafName.Assign (pLeafName.get());
Hi JF and Scott, Can u please review / super review the above updated patches (id=50815 and id=50816) for the blockers a) Excel unable to call send in mozilla and b) the attachment problem with Powerpoint and Excel. thanks, - Rajiv.
Comment on attachment 50815 [details] [diff] [review] Updated Patch (B1_v2) for blocker (1) : Excel unable to call send in mozilla You clearly fix the problem with variable getting used despite they were out of scope. About the initialization of Message, Recipient and Files, you said it does not matter as they are protected by a counter which should be zero. That's seems wrong for me when lpMessage = &Message. In that case, should you initialize all the member variable of Message to o or null!
Comment on attachment 50816 [details] [diff] [review] Updated Patch for blocker 3) : Powerpoint/Excel unable to send attachments correctly Good, no more code duplication. However, I am pretty sure you can reduce your code by using more Mozilla API (nsILocalFile, etc) when you manipulate path.
Please find below the updates patches for 1) Excel unable to call send in mozilla, and 3) Powerpoint/Excel unable to send attachments correctly. The changes are the following : 1) initialized the structs in MapiDll.cpp (although this was not necessary since MS apps donot pass lpMessage as null but it is a good idea just in case any unlikely custom apps that might). 2) changed msgMapiHook.cpp to use nsSpecialSystemDirectory instead of GetTempPath. 3) used LeafName instead of dir path Delim for path manipulation.
Comment on attachment 50909 [details] [diff] [review] updated patch for Powerpoint (Excel too) unable to send attachments correctly Looks good this time R=ducarroz
Attachment #50909 - Flags: review+
Comment on attachment 50910 [details] [diff] [review] updated patch for Excel unable to call send in mozilla R=ducarroz
Attachment #50910 - Flags: review+
Attachment #50816 - Attachment is obsolete: true
Attachment #50815 - Attachment is obsolete: true
Attachment #50673 - Attachment is obsolete: true
Attachment #50670 - Attachment is obsolete: true
Attachment #50553 - Attachment is obsolete: true
Attachment #50560 - Attachment is obsolete: true
Hi Scott, Can u please super review the latest two patches (attachment 50909 [details] [diff] [review]) and (attachment 50910 [details] [diff] [review]) for the two problems Powerpoint unable to send attachments correctly and Excel unable to call send in mozilla respectively. Both these patches have an r=. thanks. - rajiv.
Please find below the patch for the problem seen with Word, blocker 2) Word unable to call Send in mapi32.dll. This was happening because it calls Logon twice, the first time it calls on the same thread as Dllmain and the second time on another thread. Thus this resulted in the MS COM marshalling failure. Since CoInitialize was not called on the second thread as well as the interface object was not created on the second thread, the marshalling for the interface pointer on the second thread failed with an MS COM error for this. The fix in the patch is to call CoInitialize on each new thread appartment and another interface object is created for the new thread and released after its usage. This solves the marshalling failure and the send call succeeds.
Hi JF, Thanks for your r= (has review) for the patches for blocker 1) Excel problem and blocker 3) Powerpoint attachment problem. Can u please review the patch (id=50963) attached for the blocker 2) Word problem, described in comments just above the patch (id=50963). Thanks, - Rajiv.
Comment on attachment 50963 [details] [diff] [review] patch for blocker 2) Word unable to call send in mapi32.dll @@ -262,11 +345,18 @@ return MAPI_E_LOGIN_FAILURE ; HRESULT hr ; + nsIMapi *pNsMapi = NULL; + BOOL bComInitialized = FALSE; + hr = pNsMapi->SendDocuments(lhSession, (LPTSTR) lpszDelimChar, (LPTSTR) lpszFilePaths, (LPTSTR) lpszFileNames, ulReserved) ; MAPILogoff (lhSession, ulUIParam, 0,0) ; + pNsMapi->Release(); + if (bComInitialized) + ::CoUninitialize(); + return hr ; } You forget to call GetMozillaReference, therefore pNsMapi is NULL which will cause a crash!
Attachment #50963 - Flags: needs-work+
Please ignore the patch (attachment 50963 [details] [diff] [review]) it is a wrong patch. I had tested the code and it worked fine, with this null it would never. In fact the patch i created had lines for the Excel bug which i deleted from the patch so as not to confuse you and by mistake removed the other lines. Please use the patch attached below. Also we are in process of creating a separate branch for the MAPI feature which will help avoid these problems of creating patches (we ourselves presently maintian all versions which can cause all these mistakes) as well as help everyone to test the feature too.
Attachment #50963 - Attachment is obsolete: true
Comment on attachment 50983 [details] [diff] [review] patch for blocker 2) : Word unable to call mapi32.dll Remove bCoUnInit which is not used and you have my R=ducarroz
Attachment #50983 - Flags: review+
Comment on attachment 50963 [details] [diff] [review] patch for blocker 2) Word unable to call send in mapi32.dll wrong patch
Comment on attachment 50707 [details] [diff] [review] Proposed fix for nsMsgCompFields::CleanUpTempFiles sr=mscott
Attachment #50707 - Flags: superreview+
Comment on attachment 50909 [details] [diff] [review] updated patch for Powerpoint (Excel too) unable to send attachments correctly sr=mscott
Attachment #50909 - Flags: superreview+
Comment on attachment 50910 [details] [diff] [review] updated patch for Excel unable to call send in mozilla sr=mscott
Attachment #50910 - Flags: superreview+
Whiteboard: PDT → [PDT], [ETA ?]
Comment on attachment 50983 [details] [diff] [review] patch for blocker 2) : Word unable to call mapi32.dll sr=mscott
Attachment #50983 - Flags: superreview+
pls check it into branch and trunk - PDT+
Whiteboard: [PDT], [ETA ?] → [PDT+], [ETA ?]
removing the plus. Jaime just meant to plus the mailnews compose patch which is one of many in this bug report. JF and I are about to check that into the branch and the trunk right now.
Whiteboard: [PDT+], [ETA ?] → [PDT], [ETA ?]
doh! Thanks for the catch Scott. :-)
FYI, tiantian and Rajiv, I just checked in the compose patch into the branch and the trunk so you can admit that from your steps when you email those out.
Component: Composition → Simple MAPI
thanks Scott. - rajiv.
all the problems for Word, PP, Excel have been fixed, patches have r and sr.
Status: NEW → RESOLVED
Closed: 23 years ago
Resolution: --- → FIXED
verified on 2001-10-12-05-0.9.4
Status: RESOLVED → VERIFIED
Product: MailNews → Core
Product: Core → MailNews Core
You need to log in before you can comment on or make changes to this bug.

Attachment

General

Creator:
Created:
Updated:
Size: