Attachment #9036164: 393302-v1.patch for bug #393302

View | Details | Raw Unified | Return to bug 393302
Collapse All | Expand All

(-)a/mailnews/mapi/mapiDll/MapiDll.cpp (-27 / +65 lines)
Line     Link Here 
 Lines 207-252   ULONG FAR PASCAL MAPISendMail (LHANDLE l Link Here 
207
        if (hr != SUCCESS_SUCCESS)
207
        if (hr != SUCCESS_SUCCESS)
208
            return MAPI_E_LOGIN_FAILURE ;
208
            return MAPI_E_LOGIN_FAILURE ;
209
        bTempSession = TRUE ;
209
        bTempSession = TRUE ;
210
    }
210
    }
211
211
212
    // we need to deal with null data passed in by MAPI clients, specially when MAPI_DIALOG is set.
212
    // we need to deal with null data passed in by MAPI clients, specially when MAPI_DIALOG is set.
213
    // The MS COM type lib code generated by MIDL for the MS COM interfaces checks for these parameters
213
    // The MS COM type lib code generated by MIDL for the MS COM interfaces checks for these parameters
214
    // to be non null, although null is a valid value for them here.
214
    // to be non null, although null is a valid value for them here.
215
    nsMapiRecipDesc * lpRecips ;
215
216
    nsMapiFileDesc * lpFiles ;
216
	nsMapiMessage *Message = (nsMapiMessage *)CoTaskMemAlloc(sizeof(nsMapiMessage));
217
	if (!Message) {
218
		return MAPI_E_INSUFFICIENT_MEMORY;
219
	}
217
220
218
    nsMapiMessage Message ;
221
	memset (Message, 0, sizeof (nsMapiMessage) ) ;
219
    memset (&Message, 0, sizeof (nsMapiMessage) ) ;
222
	if (lpMessage->lpszSubject) {
220
    nsMapiRecipDesc Recipient ;
223
		Message->lpszSubject = (LPSTR)CoTaskMemAlloc(1+strlen(lpMessage->lpszSubject));
221
    memset (&Recipient, 0, sizeof (nsMapiRecipDesc) );
224
		strcpy(Message->lpszSubject, lpMessage->lpszSubject);
222
    nsMapiFileDesc Files ;
225
	}
223
    memset (&Files, 0, sizeof (nsMapiFileDesc) ) ;
226
	if (lpMessage->lpszNoteText) {
227
		Message->lpszNoteText = (LPSTR)CoTaskMemAlloc(1+strlen(lpMessage->lpszNoteText));
228
		strcpy(Message->lpszNoteText, lpMessage->lpszNoteText);
229
	}
230
	if (lpMessage->lpszMessageType) {
231
		Message->lpszMessageType = (LPSTR)CoTaskMemAlloc(1+strlen(lpMessage->lpszMessageType));
232
		strcpy(Message->lpszMessageType, lpMessage->lpszMessageType);
233
	}
234
	if (lpMessage->lpszDateReceived) {
235
		Message->lpszDateReceived = (LPSTR)CoTaskMemAlloc(1+strlen(lpMessage->lpszDateReceived));
236
		strcpy(Message->lpszDateReceived, lpMessage->lpszDateReceived);
237
	}
224
238
225
    if(!lpMessage)
239
	nsMapiRecipDesc *Recipients;
226
    {
240
	if (lpMessage->nRecipCount == 0) {
227
       lpMessage = &Message ;
241
		Recipients = (nsMapiRecipDesc *)CoTaskMemAlloc(sizeof(nsMapiRecipDesc));
228
    }
242
		memset (Recipients, 0, sizeof (nsMapiRecipDesc) );
229
    if(!lpMessage->lpRecips)
243
	} else {
230
    {
244
		Recipients = (nsMapiRecipDesc *)CoTaskMemAlloc(lpMessage->nRecipCount * sizeof(nsMapiRecipDesc));
231
        lpRecips = &Recipient ;
245
		memset (Recipients, 0, lpMessage->nRecipCount * sizeof (nsMapiRecipDesc) );
232
    }
246
		for (int i = 0; i < lpMessage->nRecipCount; ++i) {
233
    else
247
			if (lpMessage->lpRecips[i].lpszName) {
234
        lpRecips = lpMessage->lpRecips ;
248
				size_t len = strlen(lpMessage->lpRecips[i].lpszName);
235
    if(!lpMessage->lpFiles)
249
				Recipients[i].lpszName = (LPSTR)CoTaskMemAlloc(1 + len);
236
    {
250
				strcpy(Recipients[i].lpszName, lpMessage->lpRecips[i].lpszName);
237
        lpFiles = &Files ;
251
			}
238
    }
252
			if (lpMessage->lpRecips[i].lpszAddress) {
239
    else
253
				size_t len = strlen(lpMessage->lpRecips[i].lpszAddress);
240
        lpFiles = lpMessage->lpFiles ;
254
				Recipients[i].lpszAddress = (LPSTR)CoTaskMemAlloc(1 + len);
255
				strcpy(Recipients[i].lpszAddress, lpMessage->lpRecips[i].lpszAddress);
256
			}
257
		}
258
	}
259
	nsMapiFileDesc *Files;
260
	if (lpMessage->nFileCount == 0) {
261
		Files = (nsMapiFileDesc *)CoTaskMemAlloc(sizeof(nsMapiFileDesc));
262
		memset (Files, 0, sizeof (nsMapiFileDesc) );
263
	} else {
264
		Files = (nsMapiFileDesc *)CoTaskMemAlloc(lpMessage->nFileCount * sizeof(nsMapiFileDesc));
265
		memset (Files, 0, lpMessage->nFileCount * sizeof (nsMapiFileDesc) );
266
		for (int i = 0; i < lpMessage->nFileCount; ++i) {
267
			if (lpMessage->lpFiles[i].lpszPathName) {
268
				size_t len = strlen(lpMessage->lpFiles[i].lpszPathName);
269
				Files[i].lpszPathName = (LPSTR)CoTaskMemAlloc(1 + len);
270
				strcpy(Files[i].lpszPathName, lpMessage->lpFiles[i].lpszPathName);
271
			}
272
			if (lpMessage->lpFiles[i].lpszFileName) {
273
				size_t len = strlen(lpMessage->lpFiles[i].lpszFileName);
274
				Files[i].lpszFileName = (LPSTR)CoTaskMemAlloc(1 + len);
275
				strcpy(Files[i].lpszFileName, lpMessage->lpFiles[i].lpszFileName);
276
			}
277
		}
278
	}
241
279
242
    hr = pNsMapi->SendMail (lhSession, lpMessage,
280
    hr = pNsMapi->SendMail (lhSession, Message,
243
                            (short) lpMessage->nRecipCount, lpRecips,
281
                            (short) lpMessage->nRecipCount, Recipients,
244
                            (short) lpMessage->nFileCount, lpFiles,
282
                            (short) lpMessage->nFileCount, Files,
245
                            flFlags, ulReserved);
283
                            flFlags, ulReserved);
246
284
247
    // we are seeing a problem when using Word, although we return success from the MAPI support
285
    // we are seeing a problem when using Word, although we return success from the MAPI support
248
    // MS COM interface in mozilla, we are getting this error here. This is a temporary hack !!
286
    // MS COM interface in mozilla, we are getting this error here. This is a temporary hack !!
249
    if (hr == 0x800703e6)
287
    if (hr == 0x800703e6)
250
        hr = SUCCESS_SUCCESS;
288
        hr = SUCCESS_SUCCESS;
251
289
252
    if (bTempSession)
290
    if (bTempSession)
(-)a/mailnews/mapi/mapihook/build/msgMapi.idl (-2 / +2 lines)
Line     Link Here 
 Lines 9-26   import "unknwn.idl"; Link Here 
9
9
10
typedef wchar_t LOGIN_PW_TYPE[256];
10
typedef wchar_t LOGIN_PW_TYPE[256];
11
11
12
typedef struct
12
typedef struct
13
{
13
{
14
    unsigned long   ulReserved;
14
    unsigned long   ulReserved;
15
    unsigned long   flFlags;           /* Flags */
15
    unsigned long   flFlags;           /* Flags */
16
    unsigned long   nPosition_NotUsed; /* character in text to be replaced by attachment */
16
    unsigned long   nPosition_NotUsed; /* character in text to be replaced by attachment */
17
    LPTSTR          lpszPathName;      /* Full path name including file name */
17
    LPSTR           lpszPathName;      /* Full path name including file name */
18
    LPTSTR          lpszFileName;      /* Real (original) file name */
18
    LPSTR           lpszFileName;      /* Real (original) file name */
19
    unsigned char * lpFileType_NotUsed ;
19
    unsigned char * lpFileType_NotUsed ;
20
} nsMapiFileDesc, * lpnsMapiFileDesc;
20
} nsMapiFileDesc, * lpnsMapiFileDesc;
21
21
22
22
23
typedef struct
23
typedef struct
24
{
24
{
25
    unsigned long    ulReserved;
25
    unsigned long    ulReserved;
26
    unsigned long    ulRecipClass; /* MAPI_TO, MAPI_CC, MAPI_BCC, MAPI_ORIG    */
26
    unsigned long    ulRecipClass; /* MAPI_TO, MAPI_CC, MAPI_BCC, MAPI_ORIG    */
(-)a/mailnews/mapi/mapihook/src/msgMapiHook.cpp (-13 / +7 lines)
Line     Link Here 
 Lines 400-416   nsresult nsMapiHook::PopulateCompFields( Link Here 
400
  aCompFields->SetCc (Cc) ;
400
  aCompFields->SetCc (Cc) ;
401
  aCompFields->SetBcc (Bcc) ;
401
  aCompFields->SetBcc (Bcc) ;
402
402
403
  // set subject
403
  // set subject
404
  if (aMessage->lpszSubject)
404
  if (aMessage->lpszSubject)
405
    aCompFields->SetSubject(NS_ConvertASCIItoUTF16(aMessage->lpszSubject));
405
    aCompFields->SetSubject(NS_ConvertASCIItoUTF16(aMessage->lpszSubject));
406
406
407
  // handle attachments as File URL
407
  // handle attachments as File URL
408
  rv = HandleAttachments (aCompFields, aMessage->nFileCount, aMessage->lpFiles, true) ;
408
  rv = HandleAttachments (aCompFields, aMessage->nFileCount, aMessage->lpFiles) ;
409
  if (NS_FAILED(rv)) return rv ;
409
  if (NS_FAILED(rv)) return rv ;
410
410
411
  // set body
411
  // set body
412
  if (aMessage->lpszNoteText)
412
  if (aMessage->lpszNoteText)
413
  {
413
  {
414
      nsString Body;
414
      nsString Body;
415
      CopyASCIItoUTF16(mozilla::MakeStringSpan(aMessage->lpszNoteText), Body);
415
      CopyASCIItoUTF16(mozilla::MakeStringSpan(aMessage->lpszNoteText), Body);
416
      if (Body.IsEmpty() || Body.Last() != '\n')
416
      if (Body.IsEmpty() || Body.Last() != '\n')
 Lines 422-458   nsresult nsMapiHook::PopulateCompFields( Link Here 
422
        aCompFields->SetForcePlainText(true);
422
        aCompFields->SetForcePlainText(true);
423
423
424
      rv = aCompFields->SetBody(Body) ;
424
      rv = aCompFields->SetBody(Body) ;
425
  }
425
  }
426
  return rv ;
426
  return rv ;
427
}
427
}
428
428
429
nsresult nsMapiHook::HandleAttachments (nsIMsgCompFields * aCompFields, int32_t aFileCount,
429
nsresult nsMapiHook::HandleAttachments (nsIMsgCompFields * aCompFields, int32_t aFileCount,
430
                                        lpnsMapiFileDesc aFiles, BOOL aIsUnicode)
430
                                        lpnsMapiFileDesc aFiles)
431
{
431
{
432
    nsresult rv = NS_OK ;
432
    nsresult rv = NS_OK ;
433
433
434
    nsAutoCString Attachments ;
434
    nsAutoCString Attachments ;
435
    nsAutoCString TempFiles ;
435
    nsAutoCString TempFiles ;
436
436
437
    nsCOMPtr <nsIFile> pFile = do_CreateInstance (NS_LOCAL_FILE_CONTRACTID, &rv) ;
437
    nsCOMPtr <nsIFile> pFile = do_CreateInstance (NS_LOCAL_FILE_CONTRACTID, &rv) ;
438
    if (NS_FAILED(rv) || (!pFile) ) return rv ;
438
    if (NS_FAILED(rv) || (!pFile) ) return rv ;
439
    nsCOMPtr <nsIFile> pTempDir = do_CreateInstance (NS_LOCAL_FILE_CONTRACTID, &rv) ;
439
    nsCOMPtr <nsIFile> pTempDir = do_CreateInstance (NS_LOCAL_FILE_CONTRACTID, &rv) ;
440
    if (NS_FAILED(rv) || (!pTempDir) ) return rv ;
440
    if (NS_FAILED(rv) || (!pTempDir) ) return rv ;
441
441
442
    for (int i=0 ; i < aFileCount ; i++)
442
    for (int i=0 ; i < aFileCount ; i++)
443
    {
443
    {
444
        if (aFiles[i].lpszPathName)
444
        if (aFiles[i].lpszPathName)
445
        {
445
        {
446
            // check if attachment exists
446
            pFile->InitWithNativePath (nsDependentCString(aFiles[i].lpszPathName));
447
            if (aIsUnicode)
448
                pFile->InitWithPath (nsDependentString(aFiles[i].lpszPathName));
449
            else
450
                pFile->InitWithNativePath (nsDependentCString((const char*)aFiles[i].lpszPathName));
451
447
452
            bool bExist ;
448
            bool bExist ;
453
            rv = pFile->Exists(&bExist) ;
449
            rv = pFile->Exists(&bExist) ;
454
            MOZ_LOG(MAPI, mozilla::LogLevel::Debug, ("nsMapiHook::HandleAttachments: filename: %s path: %s exists = %s \n", (const char*)aFiles[i].lpszFileName, (const char*)aFiles[i].lpszPathName, bExist ? "true" : "false"));
450
            MOZ_LOG(MAPI, mozilla::LogLevel::Debug, ("nsMapiHook::HandleAttachments: filename: %s path: %s exists = %s \n", (const char*)aFiles[i].lpszFileName, (const char*)aFiles[i].lpszPathName, bExist ? "true" : "false"));
455
            if (NS_FAILED(rv) || (!bExist) ) return NS_ERROR_FILE_TARGET_DOES_NOT_EXIST ;
451
            if (NS_FAILED(rv) || (!bExist) ) return NS_ERROR_FILE_TARGET_DOES_NOT_EXIST ;
456
452
457
            //Temp Directory
453
            //Temp Directory
458
            nsCOMPtr <nsIFile> pTempDir;
454
            nsCOMPtr <nsIFile> pTempDir;
 Lines 471-491   nsresult nsMapiHook::HandleAttachments ( Link Here 
471
467
472
            nsAutoString leafName ;
468
            nsAutoString leafName ;
473
            // convert to Unicode using Platform charset
469
            // convert to Unicode using Platform charset
474
            // leafName already contains a unicode leafName from lpszPathName. If we were given
470
            // leafName already contains a unicode leafName from lpszPathName. If we were given
475
            // a value for lpszFileName, use it. Otherwise stick with leafName
471
            // a value for lpszFileName, use it. Otherwise stick with leafName
476
            if (aFiles[i].lpszFileName)
472
            if (aFiles[i].lpszFileName)
477
            {
473
            {
478
              nsAutoString wholeFileName;
474
              nsAutoString wholeFileName;
479
                if (aIsUnicode)
475
                NS_CopyNativeToUnicode(nsDependentCString(aFiles[i].lpszFileName),
480
                    wholeFileName.Assign(aFiles[i].lpszFileName);
476
                                       wholeFileName);
481
                else
477
482
                    NS_CopyNativeToUnicode(nsDependentCString((char *) aFiles[i].lpszFileName),
483
                                           wholeFileName);
484
                // need to find the last '\' and find the leafname from that.
478
                // need to find the last '\' and find the leafname from that.
485
                int32_t lastSlash = wholeFileName.RFindChar(char16_t('\\'));
479
                int32_t lastSlash = wholeFileName.RFindChar(char16_t('\\'));
486
                if (lastSlash != kNotFound)
480
                if (lastSlash != kNotFound)
487
                  leafName.Assign(Substring(wholeFileName, lastSlash + 1));
481
                  leafName.Assign(Substring(wholeFileName, lastSlash + 1));
488
                else
482
                else
489
                  leafName.Assign(wholeFileName);
483
                  leafName.Assign(wholeFileName);
490
            }
484
            }
491
            else
485
            else
 Lines 603-619   nsresult nsMapiHook::PopulateCompFieldsW Link Here 
603
    nsAutoString Subject ;
597
    nsAutoString Subject ;
604
    rv = NS_CopyNativeToUnicode(nsDependentCString((char *) aMessage->lpszSubject),
598
    rv = NS_CopyNativeToUnicode(nsDependentCString((char *) aMessage->lpszSubject),
605
                                Subject);
599
                                Subject);
606
    if (NS_FAILED(rv)) return rv;
600
    if (NS_FAILED(rv)) return rv;
607
    aCompFields->SetSubject(Subject);
601
    aCompFields->SetSubject(Subject);
608
  }
602
  }
609
603
610
  // handle attachments as File URL
604
  // handle attachments as File URL
611
  rv = HandleAttachments (aCompFields, aMessage->nFileCount, aMessage->lpFiles, false) ;
605
  rv = HandleAttachments (aCompFields, aMessage->nFileCount, aMessage->lpFiles) ;
612
  if (NS_FAILED(rv)) return rv ;
606
  if (NS_FAILED(rv)) return rv ;
613
607
614
  // set body
608
  // set body
615
  if (aMessage->lpszNoteText)
609
  if (aMessage->lpszNoteText)
616
  {
610
  {
617
    nsAutoString Body ;
611
    nsAutoString Body ;
618
    rv = NS_CopyNativeToUnicode(nsDependentCString((char *) aMessage->lpszNoteText),
612
    rv = NS_CopyNativeToUnicode(nsDependentCString((char *) aMessage->lpszNoteText),
619
                                Body);
613
                                Body);
(-)a/mailnews/mapi/mapihook/src/msgMapiHook.h (-1 / +1 lines)
Line     Link Here 
 Lines 19-33   class nsMapiHook Link Here 
19
        static nsresult BlindSendMail (unsigned long aSession, nsIMsgCompFields * aCompFields) ;
19
        static nsresult BlindSendMail (unsigned long aSession, nsIMsgCompFields * aCompFields) ;
20
        static nsresult ShowComposerWindow (unsigned long aSession, nsIMsgCompFields * aCompFields) ;
20
        static nsresult ShowComposerWindow (unsigned long aSession, nsIMsgCompFields * aCompFields) ;
21
        static nsresult PopulateCompFields(lpnsMapiMessage aMessage, nsIMsgCompFields * aCompFields) ;
21
        static nsresult PopulateCompFields(lpnsMapiMessage aMessage, nsIMsgCompFields * aCompFields) ;
22
        static nsresult PopulateCompFieldsWithConversion(lpnsMapiMessage aMessage,
22
        static nsresult PopulateCompFieldsWithConversion(lpnsMapiMessage aMessage,
23
                                        nsIMsgCompFields * aCompFields) ;
23
                                        nsIMsgCompFields * aCompFields) ;
24
        static nsresult PopulateCompFieldsForSendDocs(nsIMsgCompFields * aCompFields,
24
        static nsresult PopulateCompFieldsForSendDocs(nsIMsgCompFields * aCompFields,
25
                                        ULONG aFlags, LPTSTR aDelimChar, LPTSTR aFilePaths) ;
25
                                        ULONG aFlags, LPTSTR aDelimChar, LPTSTR aFilePaths) ;
26
        static nsresult HandleAttachments (nsIMsgCompFields * aCompFields, int32_t aFileCount,
26
        static nsresult HandleAttachments (nsIMsgCompFields * aCompFields, int32_t aFileCount,
27
                                        lpnsMapiFileDesc aFiles, BOOL aIsUnicode) ;
27
                                        lpnsMapiFileDesc aFiles) ;
28
        static void CleanUp();
28
        static void CleanUp();
29
29
30
        static bool isMapiService;
30
        static bool isMapiService;
31
};
31
};
32
32
33
#endif  // MSG_MAPI_HOOK_H_
33
#endif  // MSG_MAPI_HOOK_H_
(-)a/mailnews/mapi/mapihook/src/msgMapiImp.cpp (+8 lines)
Line     Link Here 
 Lines 201-217   STDMETHODIMP CMapiImp::SendMail( unsigne Link Here 
201
     short aRecipCount, lpnsMapiRecipDesc aRecips , short aFileCount, lpnsMapiFileDesc aFiles ,
201
     short aRecipCount, lpnsMapiRecipDesc aRecips , short aFileCount, lpnsMapiFileDesc aFiles ,
202
     unsigned long aFlags, unsigned long aReserved)
202
     unsigned long aFlags, unsigned long aReserved)
203
{
203
{
204
    nsresult rv = NS_OK ;
204
    nsresult rv = NS_OK ;
205
205
206
    MOZ_LOG(MAPI, mozilla::LogLevel::Debug, ("CMapiImp::SendMail using flags %d\n", aFlags));
206
    MOZ_LOG(MAPI, mozilla::LogLevel::Debug, ("CMapiImp::SendMail using flags %d\n", aFlags));
207
    // Assign the pointers in the aMessage struct to the array of Recips and Files
207
    // Assign the pointers in the aMessage struct to the array of Recips and Files
208
    // received here from MS COM. These are used in BlindSendMail and ShowCompWin fns
208
    // received here from MS COM. These are used in BlindSendMail and ShowCompWin fns
209
    aMessage->nRecipCount = aRecipCount;
209
    aMessage->lpRecips = aRecips ;
210
    aMessage->lpRecips = aRecips ;
211
    aMessage->nFileCount = aFileCount;
210
    aMessage->lpFiles = aFiles ;
212
    aMessage->lpFiles = aFiles ;
211
213
212
    MOZ_LOG(MAPI, mozilla::LogLevel::Debug, ("CMapiImp::SendMail flags=%x subject: %s sender: %s\n",
214
    MOZ_LOG(MAPI, mozilla::LogLevel::Debug, ("CMapiImp::SendMail flags=%x subject: %s sender: %s\n",
213
      aFlags, (char *) aMessage->lpszSubject, (aMessage->lpOriginator) ? aMessage->lpOriginator->lpszAddress : ""));
215
      aFlags, (char *) aMessage->lpszSubject, (aMessage->lpOriginator) ? aMessage->lpOriginator->lpszAddress : ""));
214
216
215
    /** create nsIMsgCompFields obj and populate it **/
217
    /** create nsIMsgCompFields obj and populate it **/
216
    nsCOMPtr<nsIMsgCompFields> pCompFields = do_CreateInstance(NS_MSGCOMPFIELDS_CONTRACTID, &rv) ;
218
    nsCOMPtr<nsIMsgCompFields> pCompFields = do_CreateInstance(NS_MSGCOMPFIELDS_CONTRACTID, &rv) ;
217
    if (NS_FAILED(rv) || (!pCompFields) ) return MAPI_E_INSUFFICIENT_MEMORY ;
219
    if (NS_FAILED(rv) || (!pCompFields) ) return MAPI_E_INSUFFICIENT_MEMORY ;
 Lines 229-244   STDMETHODIMP CMapiImp::SendMail( unsigne Link Here 
229
            rv = nsMapiHook::BlindSendMail(aSession, pCompFields);
231
            rv = nsMapiHook::BlindSendMail(aSession, pCompFields);
230
        }
232
        }
231
        else
233
        else
232
        {
234
        {
233
            rv = nsMapiHook::ShowComposerWindow(aSession, pCompFields);
235
            rv = nsMapiHook::ShowComposerWindow(aSession, pCompFields);
234
        }
236
        }
235
    }
237
    }
236
238
239
	// revert back to the original state at the start of this function
240
    aMessage->nRecipCount = 0;
241
    aMessage->lpRecips = NULL ;
242
    aMessage->nFileCount = 0;
243
    aMessage->lpFiles = NULL ;
244
237
    return nsMAPIConfiguration::GetMAPIErrorFromNSError (rv) ;
245
    return nsMAPIConfiguration::GetMAPIErrorFromNSError (rv) ;
238
}
246
}
239
247
240
248
241
STDMETHODIMP CMapiImp::SendDocuments( unsigned long aSession, LPTSTR aDelimChar,
249
STDMETHODIMP CMapiImp::SendDocuments( unsigned long aSession, LPTSTR aDelimChar,
242
                            LPTSTR aFilePaths, LPTSTR aFileNames, ULONG aFlags)
250
                            LPTSTR aFilePaths, LPTSTR aFileNames, ULONG aFlags)
243
{
251
{
244
    nsresult rv = NS_OK ;
252
    nsresult rv = NS_OK ;

Return to bug 393302