f57bfa0351abd13f2324c1e9996495384fb6e38a
[situare] / src / situareservice / situareservice.h
1 /*
2    Situare - A location system for Facebook
3    Copyright (C) 2010  Ixonos Plc. Authors:
4
5       Henri Lampela - henri.lampela@ixonos.com
6
7    Situare is free software; you can redistribute it and/or
8    modify it under the terms of the GNU General Public License
9    version 2 as published by the Free Software Foundation.
10
11    Situare is distributed in the hope that it will be useful,
12    but WITHOUT ANY WARRANTY; without even the implied warranty of
13    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14    GNU General Public License for more details.
15
16    You should have received a copy of the GNU General Public License
17    along with Situare; if not, write to the Free Software
18    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301,
19    USA.
20 */
21
22
23 #ifndef SITUARESERVICE_H
24 #define SITUARESERVICE_H
25
26 #include <QObject>
27
28 #include "../user/user.h"
29 #include "imagefetcher.h"
30
31 class NetworkAccessManager;
32 class QNetworkReply;
33 class QNetworkRequest;
34 class GeoCoordinate;
35 class QUrl;
36
37 /**
38 * @brief SituareService class for communicating with Situare server
39 *
40 * @author Henri Lampela
41 * @class SituareService situareservice.h "situareservice/situareservice.h"
42 */
43 class SituareService : public QObject
44 {
45     Q_OBJECT
46
47 public:
48
49     /**
50     * @brief Default constructor
51     *
52     * @param parent instance of parent
53     */
54     SituareService(QObject *parent = 0);
55
56     /**
57     * @brief Destructor
58     *
59     */
60     ~SituareService();
61
62 /*******************************************************************************
63  * MEMBER FUNCTIONS AND SLOTS
64  ******************************************************************************/
65
66     /**
67     * @brief Retrieves location user and friends information from Situare server
68     *
69     */
70     void fetchLocations();
71
72     /**
73     * @brief Translates coordinates to street address via Situare server
74     *
75     * @param coordinates coordinates to be translated
76     */
77     void reverseGeo(const GeoCoordinate &coordinates);
78
79     /**
80     * @brief Updates location to the Situare server
81     *
82     * @param coordinates current cordinates
83     * @param status message
84     * @param publish publish location on Facebook wall
85     */
86     void updateLocation(const GeoCoordinate &coordinates, const QString &status, const bool &publish);
87
88 public slots:
89
90     /**
91     * @brief Public slot, to clear user data
92     *
93     */
94     void clearUserData();
95
96     /**
97     * @brief Public slot, which indicates when http request has been completed
98     *
99     * @param reply storage for http reply
100     */
101     void requestFinished(QNetworkReply *reply);
102
103     /**
104       * @brief Update session data
105       *
106       * @param session New session data
107       */
108     void updateSession(const QString &session);
109
110 private:
111
112     /**
113     * @brief Requests ImageFetcher if user/friend has a profile image
114     *        uses members: m_user and m_friendsList
115     *
116     * @param imageUrlList list of image urls
117     */
118     void addProfileImages(const QList<QUrl> &imageUrlList);
119
120     /**
121       * @brief Append access_token and other session data to the reques url
122       *
123       * @param[in,out] requestUrl Request URL with other request parameters and ending to &
124       */
125     void appendAccessToken(QString &requestUrl);
126
127     /**
128       * @brief Convert coordinate value in degrees (double) to string with enough precision
129       *
130       * @param degrees Coordinate value in degrees
131       * @returns Coordinate value as string
132       */
133     QString degreesToString(double degrees);
134
135     /**
136     * @brief Parses user and friend data from JSON string
137     *
138     * @param jsonReply JSON string
139     */
140     void parseUserData(const QByteArray &jsonReply);
141
142     /**
143       * @brief Build and send request
144       *
145       * Appends script pathname and parameters to the server base URL. Access token is appended and
146       * the request sent if the access token is available, otherwise the request is queued.
147       *
148       * @param script Requested script pathname
149       * @param parameters Hash containing parameter key/value pairs.
150       */
151     void buildRequest(const QString &script, const QHash<QString,QString> &parameters);
152
153     /**
154       * @brief Send request
155       *
156       * @param requestUrl Request URL containing also all parameters
157       */
158     void sendRequest(const QString &requestUrl);
159
160 private slots:
161     /**
162     * @brief Slot for received images
163     *
164     * @param url Image url
165     * @param image Received image
166     */
167     void imageReceived(const QUrl &url, const QPixmap &image);
168
169 /*******************************************************************************
170  * SIGNALS
171  ******************************************************************************/
172
173 signals:
174
175     /**
176     * @brief Signals error
177     *
178     * @param context error context
179     * @param error error code
180     */
181     void error(const int context, const int error);
182
183     /**
184     * @brief Signal for image fetching
185     *
186     * @param url Image url
187     */
188     void fetchImage(const QUrl &url);
189
190     /**
191     * @brief Signals when user's/friend's image is downloaded
192     *
193     * @param user Instance of user/friend
194     */
195     void imageReady(User *user);
196
197     /**
198     * @brief Signals when address data is retrieved
199     *
200     * @param address Street address
201     */
202     void reverseGeoReady(const QString &address);
203
204     /**
205     * @brief Signals when updateLocation request finished successfully
206     *
207     */
208     void updateWasSuccessful();
209
210     /**
211     * @brief Signals when user data is retrieved
212     *
213     * @param user instance of user
214     * @param friendList list of friends
215     */
216     void userDataChanged(User *user, QList<User *> &friendList);
217
218 /*******************************************************************************
219  * DATA MEMBERS
220  ******************************************************************************/
221
222 private:
223
224     bool m_defaultImage;    ///< Indicates if some of the friends/user doesn't have a image
225
226     QList<QNetworkReply *> m_currentRequests;       ///< List of current http requests
227     QList<QString> m_requestsWaitingAccessToken;    ///< Requests waiting for access_token
228     QList<User *> m_friendsList;                    ///< List of friends(User)
229
230     QString m_session;                          ///< Session data
231
232     NetworkAccessManager *m_networkManager;     ///< Pointer to QNetworkAccessManager
233
234     ImageFetcher *m_imageFetcher;               ///< Instance of the image fetcher
235     User *m_user;                               ///< Pointer to User
236 };
237
238 #endif // SITUARESERVICE_H