Back to index

lightning-sunbird  0.9+nobinonly
nsConsoleWriter.cpp
Go to the documentation of this file.
00001 /* ***** BEGIN LICENSE BLOCK *****
00002  * Version: MPL 1.1/GPL 2.0/LGPL 2.1
00003  *
00004  * The contents of this file are subject to the Mozilla Public License Version
00005  * 1.1 (the "License"); you may not use this file except in compliance with
00006  * the License. You may obtain a copy of the License at
00007  * http://www.mozilla.org/MPL/
00008  *
00009  * Software distributed under the License is distributed on an "AS IS" basis,
00010  * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
00011  * for the specific language governing rights and limitations under the
00012  * License.
00013  *
00014  * The Original Code is the Mozilla Toolkit.
00015  *
00016  * The Initial Developer of the Original Code is
00017  * Benjamin Smedberg <benjamin@smedbergs.us>
00018  * Portions created by the Initial Developer are Copyright (C) 2005
00019  * the Initial Developer. All Rights Reserved.
00020  *
00021  * Contributor(s):
00022  *
00023  * Alternatively, the contents of this file may be used under the terms of
00024  * either the GNU General Public License Version 2 or later (the "GPL"), or
00025  * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
00026  * in which case the provisions of the GPL or the LGPL are applicable instead
00027  * of those above. If you wish to allow use of your version of this file only
00028  * under the terms of either the GPL or the LGPL, and not to allow others to
00029  * use your version of this file under the terms of the MPL, indicate your
00030  * decision by deleting the provisions above and replace them with the notice
00031  * and other provisions required by the GPL or the LGPL. If you do not delete
00032  * the provisions above, a recipient may use your version of this file under
00033  * the terms of any one of the MPL, the GPL or the LGPL.
00034  *
00035  * ***** END LICENSE BLOCK ***** */
00036 
00037 #include "nsAppRunner.h"
00038 
00039 #include "prio.h"
00040 #include "prprf.h"
00041 #include "prtime.h"
00042 #include "prenv.h"
00043 
00044 #include "nsCRT.h"
00045 #include "nsNativeCharsetUtils.h"
00046 #include "nsString.h"
00047 #include "nsXREDirProvider.h"
00048 #include "nsXULAppAPI.h"
00049 
00050 #include "nsIConsoleService.h"
00051 #include "nsIConsoleMessage.h"
00052 
00053 void
00054 WriteConsoleLog()
00055 {
00056   nsresult rv;
00057 
00058   nsCOMPtr<nsILocalFile> lfile;
00059 
00060   char* logFileEnv = PR_GetEnv("XRE_CONSOLE_LOG");
00061   if (logFileEnv && *logFileEnv) {
00062     rv = XRE_GetFileFromPath(logFileEnv, getter_AddRefs(lfile));
00063     if (NS_FAILED(rv))
00064       return;
00065   }
00066   else {
00067     if (!gLogConsoleErrors)
00068       return;
00069 
00070     rv = gDirServiceProvider->GetUserAppDataDirectory(getter_AddRefs(lfile));
00071     if (NS_FAILED(rv))
00072       return;
00073 
00074     lfile->AppendNative(NS_LITERAL_CSTRING("console.log"));
00075   }
00076 
00077   PRFileDesc *file;
00078   rv = lfile->OpenNSPRFileDesc(PR_WRONLY | PR_APPEND | PR_CREATE_FILE,
00079                                0660, &file);
00080   if (NS_FAILED(rv))
00081     return;
00082 
00083   nsCOMPtr<nsIConsoleService> csrv
00084     (do_GetService(NS_CONSOLESERVICE_CONTRACTID));
00085   if (!csrv) {
00086     PR_Close(file);
00087     return;
00088   }
00089 
00090   nsIConsoleMessage** messages;
00091   PRUint32 mcount;
00092 
00093   rv = csrv->GetMessageArray(&messages, &mcount);
00094   if (NS_FAILED(rv)) {
00095     PR_Close(file);
00096     return;
00097   }
00098 
00099   if (mcount) {
00100     PRExplodedTime etime;
00101     PR_ExplodeTime(PR_Now(), PR_LocalTimeParameters, &etime);
00102     char datetime[512];
00103     PR_FormatTimeUSEnglish(datetime, sizeof(datetime),
00104                            "%Y-%m-%d %H:%M:%S", &etime);
00105 
00106     PR_fprintf(file, NS_LINEBREAK
00107                      "*** Console log: %s ***" NS_LINEBREAK,
00108                datetime);
00109   }
00110 
00111   // From this point on, we have to release all the messages, and free
00112   // the memory allocated for the messages array. XPCOM arrays suck.
00113 
00114   nsXPIDLString msg;
00115   nsCAutoString nativemsg;
00116 
00117   for (PRUint32 i = 0; i < mcount; ++i) {
00118     rv = messages[i]->GetMessage(getter_Copies(msg));
00119     if (NS_SUCCEEDED(rv)) {
00120       NS_CopyUnicodeToNative(msg, nativemsg);
00121       PR_fprintf(file, "%s" NS_LINEBREAK, nativemsg.get());
00122     }
00123     NS_IF_RELEASE(messages[i]);
00124   }
00125 
00126   PR_Close(file);
00127   NS_Free(messages);
00128 }