summaryrefslogtreecommitdiff
path: root/indra/newview/llappviewer.h
blob: 9a5dd6dca3a023d117a83e239a514b150e426524 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
/**
 * @mainpage
 * @mainpage
 *
 * This is the sources for the Second Life Viewer;
 * information on the open source project is at
 * https://wiki.secondlife.com/wiki/Open_Source_Portal
 *
 * The Mercurial repository for the trunk version is at
 * https://bitbucket.org/lindenlab/viewer-release
 *
 * @section source-license Source License
 * @verbinclude LICENSE-source.txt
 *
 * @section artwork-license Artwork License
 * @verbinclude LICENSE-logos.txt
 *
 * $LicenseInfo:firstyear=2007&license=viewerlgpl$
 * Second Life Viewer Source Code
 * Copyright (C) 2010, Linden Research, Inc.
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation;
 * version 2.1 of the License only.
 *
 * This library is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with this library; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
 *
 * Linden Research, Inc., 945 Battery Street, San Francisco, CA  94111  USA
 * $/LicenseInfo$
 *
 * @file llappviewer.h
 * @brief The LLAppViewer class declaration
 */

#ifndef LL_LLAPPVIEWER_H
#define LL_LLAPPVIEWER_H

#include "llapp.h"
#include "llapr.h"
#include "llcontrol.h"
#include "llsys.h"          // for LLOSInfo
#include "lltimer.h"
#include "llappcorehttp.h"
#include "threadpool_fwd.h"

#include <boost/signals2.hpp>

class LLCommandLineParser;
class LLFrameTimer;
class LLPumpIO;
class LLTextureCache;
class LLImageDecodeThread;
class LLTextureFetch;
class LLWatchdogTimeout;
class LLViewerJoystick;
class LLPurgeDiskCacheThread;
class LLViewerRegion;

extern LLTrace::BlockTimerStatHandle FTM_FRAME;

class LLAppViewer : public LLApp
{
public:
    LLAppViewer();
    virtual ~LLAppViewer();

    /**
     * @brief Access to the LLAppViewer singleton.
     *
     * The LLAppViewer singleton is created in main()/WinMain().
     * So don't use it in pre-entry (static initialization) code.
     */
    static LLAppViewer* instance() {return sInstance; }

    //
    // Main application logic
    //
    virtual bool init();            // Override to do application initialization
    virtual bool cleanup();         // Override to do application cleanup
    virtual bool frame(); // Override for application body logic

    // Application control
    void flushLFSIO(); // waits for lfs transfers to complete
    void forceQuit(); // Puts the viewer into 'shutting down without error' mode.
    void fastQuit(S32 error_code = 0); // Shuts down the viewer immediately after sending a logout message
    void requestQuit(); // Request a quit. A kinder, gentler quit.
    void userQuit(); // The users asks to quit. Confirm, then requestQuit()
    void earlyExit(const std::string& name,
                   const LLSD& substitutions = LLSD()); // Display an error dialog and forcibly quit.
    void earlyExitNoNotify(); // Do not display error dialog then forcibly quit.
    void abortQuit();  // Called to abort a quit request.

    bool quitRequested() { return mQuitRequested; }
    bool logoutRequestSent() { return mLogoutRequestSent; }
    bool isSecondInstance() { return mSecondInstance; }
    bool isUpdaterMissing(); // In use by tests
    bool waitForUpdater();

    void writeDebugInfo(bool isStatic=true);

    void setServerReleaseNotesURL(const std::string& url) { mServerReleaseNotesURL = url; }
    LLSD getViewerInfo() const;
    std::string getViewerInfoString(bool default_string = false) const;

    // Report true if under the control of a debugger. A null-op default.
    virtual bool beingDebugged() { return false; }

    virtual bool restoreErrorTrap() = 0; // Require platform specific override to reset error handling mechanism.
                                         // return false if the error trap needed restoration.
    void checkForCrash();

    // Thread accessors
    static LLTextureCache* getTextureCache() { return sTextureCache; }
    static LLImageDecodeThread* getImageDecodeThread() { return sImageDecodeThread; }
    static LLTextureFetch* getTextureFetch() { return sTextureFetch; }
    static LLPurgeDiskCacheThread* getPurgeDiskCacheThread() { return sPurgeDiskCacheThread; }

    static U32 getTextureCacheVersion() ;
    static U32 getObjectCacheVersion() ;
    static U32 getDiskCacheVersion() ;

    const std::string& getSerialNumber() { return mSerialNumber; }

    bool getPurgeCache() const { return mPurgeCache; }

    std::string getSecondLifeTitle() const; // The Second Life title.
    std::string getWindowTitle() const; // The window display name.

    void forceDisconnect(const std::string& msg); // Force disconnection, with a message to the user.
    void badNetworkHandler(); // Cause a crash state due to bad network packet.

    bool hasSavedFinalSnapshot() { return mSavedFinalSnapshot; }
    void saveFinalSnapshot();

    void loadNameCache();
    void saveNameCache();

    void loadExperienceCache();
    void saveExperienceCache();

    void removeMarkerFiles();

    void removeDumpDir();
    // LLAppViewer testing helpers.
    // *NOTE: These will potentially crash the viewer. Only for debugging.
    virtual void forceErrorLLError();
    virtual void forceErrorLLErrorMsg();
    virtual void forceErrorBreakpoint();
    virtual void forceErrorBadMemoryAccess();
    virtual void forceErrorInfiniteLoop();
    virtual void forceErrorSoftwareException();
    virtual void forceErrorOSSpecificException();
    virtual void forceErrorDriverCrash();
    virtual void forceErrorCoroutineCrash();
    virtual void forceErrorThreadCrash();

    // The list is found in app_settings/settings_files.xml
    // but since they are used explicitly in code,
    // the follow consts should also do the trick.
    static const std::string sGlobalSettingsName;

    LLCachedControl<bool> mRandomizeFramerate;
    LLCachedControl<bool> mPeriodicSlowFrame;

    // Load settings from the location specified by loction_key.
    // Key availale and rules for loading, are specified in
    // 'app_settings/settings_files.xml'
    bool loadSettingsFromDirectory(const std::string& location_key,
                       bool set_defaults = false);

    std::string getSettingsFilename(const std::string& location_key,
                    const std::string& file);
    void loadColorSettings();

    // For thread debugging.
    // llstartup needs to control init.
    // llworld, send_agent_pause() also controls pause/resume.
    void initMainloopTimeout(const std::string& state, F32 secs = -1.0f);
    void destroyMainloopTimeout();
    void pauseMainloopTimeout();
    void resumeMainloopTimeout(const std::string& state = "", F32 secs = -1.0f);
    void pingMainloopTimeout(const std::string& state, F32 secs = -1.0f);

    // Handle the 'login completed' event.
    // *NOTE:Mani Fix this for login abstraction!!
    void handleLoginComplete();

    // On LoginCompleted callback
    typedef boost::signals2::signal<void (void)> login_completed_signal_t;
    login_completed_signal_t mOnLoginCompleted;
    boost::signals2::connection setOnLoginCompletedCallback( const login_completed_signal_t::slot_type& cb )
    {
        return mOnLoginCompleted.connect(cb);
    }

    void addOnIdleCallback(const boost::function<void()>& cb); // add a callback to fire (once) when idle

    void initGeneralThread();
    void purgeUserDataOnExit() { mPurgeUserDataOnExit = true; }
    void purgeCache(); // Clear the local cache.
    void purgeCacheImmediate(); //clear local cache immediately.
    S32  updateTextureThreads(F32 max_time);

    void loadKeyBindings();

    // mute/unmute the system's master audio
    virtual void setMasterSystemAudioMute(bool mute);
    virtual bool getMasterSystemAudioMute();

    // Metrics policy helper statics.
    static void metricsUpdateRegion(U64 region_handle);
    static void metricsSend(bool enable_reporting);

    // llcorehttp init/shutdown/config information.
    LLAppCoreHttp & getAppCoreHttp()            { return mAppCoreHttp; }

    void updateNameLookupUrl(const LLViewerRegion* regionp);

    // post given work to the "mainloop" work queue for handling on the main thread
    void postToMainCoro(const LL::WorkQueue::Work& work);

    // Attempt a 'soft' quit with disconnect and saving of settings/cache.
    // Intended to be thread safe.
    // Good chance of viewer crashing either way, but better than alternatives.
    // Note: mQuitRequested can be aborted by user.
    void outOfMemorySoftQuit();

protected:
    virtual bool initWindow(); // Initialize the viewer's window.
    virtual void initLoggingAndGetLastDuration(); // Initialize log files, logging system
    virtual void initConsole() {}; // Initialize OS level debugging console.
    virtual bool initHardwareTest() { return true; } // A false result indicates the app should quit.
    virtual bool initSLURLHandler();
    virtual bool sendURLToOtherInstance(const std::string& url);

    virtual bool initParseCommandLine(LLCommandLineParser& clp)
        { return true; } // Allow platforms to specify the command line args.

    virtual std::string generateSerialNumber() = 0; // Platforms specific classes generate this.

    virtual bool meetsRequirementsForMaximizedStart(); // Used on first login to decide to launch maximized

    virtual void sendOutOfDiskSpaceNotification();

private:

    bool doFrame();

    void initMaxHeapSize();
    bool initThreads(); // Initialize viewer threads, return false on failure.
    bool initConfiguration(); // Initialize settings from the command line/config file.
    void initStrings();       // Initialize LLTrans machinery
    bool initCache(); // Initialize local client cache.

    // We have switched locations of both Mac and Windows cache, make sure
    // files migrate and old cache is cleared out.
    void migrateCacheDirectory();

    void cleanupSavedSettings(); // Sets some config data to current or default values during cleanup.
    void removeCacheFiles(const std::string& filemask); // Deletes cached files the match the given wildcard.

    void writeSystemInfo(); // Write system info to "debug_info.log"

    void processMarkerFiles();
    static void recordMarkerVersion(LLAPRFile& marker_file);
    bool markerIsSameVersion(const std::string& marker_name) const;

    void idle();
    void idleShutdown();
    // update avatar SLID and display name caches
    void idleNameCache();
    void idleNetwork();

    void sendLogoutRequest();
    void disconnectViewer();

    // *FIX: the app viewer class should be some sort of singleton, no?
    // Perhaps its child class is the singleton and this should be an abstract base.
    static LLAppViewer* sInstance;

    bool mSecondInstance; // Is this a second instance of the app?
    bool mUpdaterNotFound; // True when attempt to start updater failed

    std::string mMarkerFileName;
    LLAPRFile mMarkerFile; // A file created to indicate the app is running.

    std::string mLogoutMarkerFileName;
    LLAPRFile mLogoutMarkerFile; // A file created to indicate the app is running.

    bool mReportedCrash;

    std::string mServerReleaseNotesURL;

    // Thread objects.
    static LLTextureCache* sTextureCache;
    static LLImageDecodeThread* sImageDecodeThread;
    static LLTextureFetch* sTextureFetch;
    static LLPurgeDiskCacheThread* sPurgeDiskCacheThread;
    LL::ThreadPool* mGeneralThreadPool;

    S32 mNumSessions;

    std::string mSerialNumber;
    bool mPurgeCache;
    bool mPurgeCacheOnExit;
    bool mPurgeUserDataOnExit;
    LLViewerJoystick* joystick;

    bool mSavedFinalSnapshot;
    bool mSavePerAccountSettings;       // only save per account settings if login succeeded

    boost::optional<U32> mForceGraphicsLevel;

    bool mQuitRequested;                // User wants to quit, may have modified documents open.
    bool mClosingFloaters;
    bool mLogoutRequestSent;            // Disconnect message sent to simulator, no longer safe to send messages to the sim.
    U32 mLastAgentControlFlags;
    F32 mLastAgentForceUpdate;
    struct SettingsFiles* mSettingsLocationList;

    LLWatchdogTimeout* mMainloopTimeout;

    // For performance and metric gathering
    class LLThread* mFastTimerLogThread;

    // for tracking viewer<->region circuit death
    bool mAgentRegionLastAlive;
    LLUUID mAgentRegionLastID;

    // llcorehttp library init/shutdown helper
    LLAppCoreHttp mAppCoreHttp;

    bool mIsFirstRun;
};

// consts from viewer.h
const S32 AGENT_UPDATES_PER_SECOND  = 125; // Value derived experimentally to avoid Input Delays with latest PBR-Capable Viewers when viewer FPS is highly volatile.
const S32 AGENT_FORCE_UPDATES_PER_SECOND  = 1;

// Globals with external linkage. From viewer.h
// *NOTE:Mani - These will be removed as the Viewer App Cleanup project continues.
//
// "// llstartup" indicates that llstartup is the only client for this global.

extern LLSD gDebugInfo;
extern bool gShowObjectUpdates;

typedef enum
{
    LAST_EXEC_NORMAL = 0,
    LAST_EXEC_FROZE,
    LAST_EXEC_LLERROR_CRASH,
    LAST_EXEC_OTHER_CRASH,
    LAST_EXEC_LOGOUT_FROZE,
    LAST_EXEC_LOGOUT_CRASH
} eLastExecEvent;

extern eLastExecEvent gLastExecEvent; // llstartup
extern S32 gLastExecDuration; ///< the duration of the previous run in seconds (<0 indicates unknown)

extern const char* gPlatform;

extern U32 gFrameCount;
extern U32 gForegroundFrameCount;

extern LLPumpIO* gServicePump;

extern U64MicrosecondsImplicit  gStartTime;
extern U64MicrosecondsImplicit   gFrameTime;                    // The timestamp of the most-recently-processed frame
extern F32SecondsImplicit       gFrameTimeSeconds;          // Loses msec precision after ~4.5 hours...
extern F32SecondsImplicit       gFrameIntervalSeconds;      // Elapsed time between current and previous gFrameTimeSeconds
extern F32      gFPSClamped;                // Frames per second, smoothed, weighted toward last frame
extern F32      gFrameDTClamped;

extern LLTimer gRenderStartTime;
extern LLFrameTimer gForegroundTime;
extern LLFrameTimer gLoggedInTime;

extern F32 gLogoutMaxTime;
extern LLTimer gLogoutTimer;

extern S32 gPendingMetricsUploads;

extern F32 gSimLastTime;
extern F32 gSimFrames;

extern bool     gDisconnected;

extern LLFrameTimer gRestoreGLTimer;
extern bool         gRestoreGL;
extern bool     gUseWireframe;

extern LLMemoryInfo gSysMemory;
extern U64Bytes gMemoryAllocated;

extern std::string gLastVersionChannel;

extern LLVector3 gWindVec;
extern LLVector3 gRelativeWindVec;
extern U32  gPacketsIn;
extern bool gPrintMessagesThisFrame;

extern LLUUID gBlackSquareID;

extern bool gRandomizeFramerate;
extern bool gPeriodicSlowFrame;

extern bool gSimulateMemLeak;

#endif // LL_LLAPPVIEWER_H