summaryrefslogtreecommitdiffstats
path: root/toolkit/xre/nsConsoleWriter.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'toolkit/xre/nsConsoleWriter.cpp')
-rw-r--r--toolkit/xre/nsConsoleWriter.cpp95
1 files changed, 95 insertions, 0 deletions
diff --git a/toolkit/xre/nsConsoleWriter.cpp b/toolkit/xre/nsConsoleWriter.cpp
new file mode 100644
index 000000000..952e88003
--- /dev/null
+++ b/toolkit/xre/nsConsoleWriter.cpp
@@ -0,0 +1,95 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#include "nsAppRunner.h"
+
+#include "prio.h"
+#include "prprf.h"
+#include "prenv.h"
+
+#include "nsCRT.h"
+#include "nsNativeCharsetUtils.h"
+#include "nsString.h"
+#include "nsXREDirProvider.h"
+#include "nsXULAppAPI.h"
+
+#include "nsIConsoleService.h"
+#include "nsIConsoleMessage.h"
+
+void
+WriteConsoleLog()
+{
+ nsresult rv;
+
+ nsCOMPtr<nsIFile> lfile;
+
+ char* logFileEnv = PR_GetEnv("XRE_CONSOLE_LOG");
+ if (logFileEnv && *logFileEnv) {
+ rv = XRE_GetFileFromPath(logFileEnv, getter_AddRefs(lfile));
+ if (NS_FAILED(rv))
+ return;
+ }
+ else {
+ if (!gLogConsoleErrors)
+ return;
+
+ rv = gDirServiceProvider->GetUserAppDataDirectory(getter_AddRefs(lfile));
+ if (NS_FAILED(rv))
+ return;
+
+ lfile->AppendNative(NS_LITERAL_CSTRING("console.log"));
+ }
+
+ PRFileDesc *file;
+ rv = lfile->OpenNSPRFileDesc(PR_WRONLY | PR_APPEND | PR_CREATE_FILE,
+ 0660, &file);
+ if (NS_FAILED(rv))
+ return;
+
+ nsCOMPtr<nsIConsoleService> csrv
+ (do_GetService(NS_CONSOLESERVICE_CONTRACTID));
+ if (!csrv) {
+ PR_Close(file);
+ return;
+ }
+
+ nsIConsoleMessage** messages;
+ uint32_t mcount;
+
+ rv = csrv->GetMessageArray(&mcount, &messages);
+ if (NS_FAILED(rv)) {
+ PR_Close(file);
+ return;
+ }
+
+ if (mcount) {
+ PRExplodedTime etime;
+ PR_ExplodeTime(PR_Now(), PR_LocalTimeParameters, &etime);
+ char datetime[512];
+ PR_FormatTimeUSEnglish(datetime, sizeof(datetime),
+ "%Y-%m-%d %H:%M:%S", &etime);
+
+ PR_fprintf(file, NS_LINEBREAK
+ "*** Console log: %s ***" NS_LINEBREAK,
+ datetime);
+ }
+
+ // From this point on, we have to release all the messages, and free
+ // the memory allocated for the messages array. XPCOM arrays suck.
+
+ nsXPIDLString msg;
+ nsAutoCString nativemsg;
+
+ for (uint32_t i = 0; i < mcount; ++i) {
+ rv = messages[i]->GetMessageMoz(getter_Copies(msg));
+ if (NS_SUCCEEDED(rv)) {
+ NS_CopyUnicodeToNative(msg, nativemsg);
+ PR_fprintf(file, "%s" NS_LINEBREAK, nativemsg.get());
+ }
+ NS_IF_RELEASE(messages[i]);
+ }
+
+ PR_Close(file);
+ free(messages);
+}