summaryrefslogtreecommitdiff
path: root/indra/newview/llinventorymodelbackgroundfetch.h
blob: 038b6341805f2494208af569fd572a1a8ef4643d (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
/** 
 * @file llinventorymodelbackgroundfetch.h
 * @brief LLInventoryModelBackgroundFetch class header file
 *
 * $LicenseInfo:firstyear=2002&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$
 */

#ifndef LL_LLINVENTORYMODELBACKGROUNDFETCH_H
#define LL_LLINVENTORYMODELBACKGROUNDFETCH_H

#include "llsingleton.h"
#include "lluuid.h"
#include "httpcommon.h"
#include "httprequest.h"
#include "httpoptions.h"
#include "httpheaders.h"
#include "httphandler.h"

//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// Class LLInventoryModelBackgroundFetch
//
// This class handles background fetches, which are fetches of
// inventory folder.  Fetches can be recursive or not.
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
class LLInventoryModelBackgroundFetch : public LLSingleton<LLInventoryModelBackgroundFetch>
{
	LLSINGLETON(LLInventoryModelBackgroundFetch);
	~LLInventoryModelBackgroundFetch();
public:

	// Start and stop background breadth-first fetching of inventory contents.
	// This gets triggered when performing a filter-search.
	void start(const LLUUID& cat_id = LLUUID::null, bool recursive = true);

	BOOL folderFetchActive() const;
	bool isEverythingFetched() const; // completing the fetch once per session should be sufficient

	bool libraryFetchStarted() const;
	bool libraryFetchCompleted() const;
	bool libraryFetchInProgress() const;
	
	bool inventoryFetchStarted() const;
	bool inventoryFetchCompleted() const;
	bool inventoryFetchInProgress() const;

    void findLostItems();	
	void incrFetchCount(S32 fetching);

	bool isBulkFetchProcessingComplete() const;
	void setAllFoldersFetched();

    typedef boost::function<void()> folders_fetched_callback_t;
    boost::signals2::connection setAllFoldersFetchedCallback(folders_fetched_callback_t cb);

	void addRequestAtFront(const LLUUID & id, bool recursive, bool is_category);
	void addRequestAtBack(const LLUUID & id, bool recursive, bool is_category);

protected:

    typedef enum {
        RT_NONE = 0,
        RT_CONTENT, // request content recursively
        RT_RECURSIVE, // request everything recursively
    } ERecursionType;
    struct FetchQueueInfo
    {
        FetchQueueInfo(const LLUUID& id, ERecursionType recursive, bool is_category = true)
            : mUUID(id),
            mIsCategory(is_category),
            mRecursive(recursive)
        {}

        LLUUID mUUID;
        bool mIsCategory;
        ERecursionType mRecursive;
    };
    typedef std::deque<FetchQueueInfo> fetch_queue_t;

    void onAISCalback(const LLUUID &request_id, const LLUUID &response_id, ERecursionType recursion);
    void bulkFetchViaAis();
    void bulkFetchViaAis(const FetchQueueInfo& fetch_info);
	void bulkFetch();

	void backgroundFetch();
	static void backgroundFetchCB(void*); // background fetch idle function

	bool fetchQueueContainsNoDescendentsOf(const LLUUID& cat_id) const;

private:
 	bool mRecursiveInventoryFetchStarted;
	bool mRecursiveLibraryFetchStarted;
	bool mAllFoldersFetched;
    typedef boost::signals2::signal<void()> folders_fetched_signal_t;
    folders_fetched_signal_t mAllFoldersFetchedSignal;

    bool mBackgroundFetchActive;
	bool mFolderFetchActive;
	S32 mFetchCount;

	LLFrameTimer mFetchTimer;
	F32 mMinTimeBetweenFetches;
	fetch_queue_t mFetchQueue;

};

#endif // LL_LLINVENTORYMODELBACKGROUNDFETCH_H